
    j*                     p    d Z ddlZddlZddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZ d Zd Zd	 Zd
 Zy)a4  
 Python module to interface with Tuya WiFi smart devices

 Author: Jason A. Cox
 For more information see https://github.com/jasonacox/tinytuya

 Run TinyTuya Setup Wizard:
    python -m tinytuya wizard
 This network scan will run if calling this module via command line:
    python -m tinytuya <max_time>

    N   )scanner
DEVICEFILE)Device)load_devicefilec                 d  
 t        | dt              }t        |      }|sQt        j                  j                  |      st        d|z         nt        d|z         t        j                  d       d}g }|D ]  }t        |t              s|j                  |j                  dd      |j                  dd      |j                  d	d      |j                  d
      xs |j                  dd      t        |j                  dd            d        | j                  r!t        t        j                  |d             y|D ci c]  }|t!        |       c}
|D ]0  |D ])  }t#        
|   t!        t        |                     
|<   + 2 ddj%                  
fd|D              z   dz   }ddj%                  
fd|D              z   dz   }t        |       t        |       t        |       |D ].  ddj%                  
fd|D              z   dz   }	t        |	       0 t        |       yc c}w )zHandle the list command.device_filez"Error: device file "%s" not found.zQError: device file "%s" contains no valid devices (check JSON syntax and format).r   )nameidkeyipversionr
    r   r   last_ipr   r      )indentN+c              3   4   K   | ]  }d |   dz   z    yw)-r   N .0fcol_ws     9/DATA/.local/lib/python3.12/site-packages/tinytuya/cli.py	<genexpr>z$_run_list_command.<locals>.<genexpr>A   s     >v!a1-vs   |c              3   N   K   | ]  }d |   |j                         fz    ywz %-*s N)upperr   s     r   r   z$_run_list_command.<locals>.<genexpr>B   s&     MfHa!'')'<<fs   "%c              3   8   K   | ]  }d |   |   fz    ywr   r   )r   r   r   rows     r   r   z$_run_list_command.<locals>.<genexpr>G   s$     LVh%(CF);;Vs   )getattrr   r   ospathexistsprintsysexit
isinstancedictappendgetstrjsondumpslenmaxjoin)argsr	   tuyadevicesFIELDSrowsdevr   sepheaderliner   r"   s             @@r   _run_list_commandr<      s   $z:K!+.Kww~~k*6DEehsst3F D#t$wwvr*wwtR(wwub)wwy)>SWWT2->3779b12
 	  yydjja() !''1QAY'EA58SSV%56E!H   >v>>
>
DC388MfMMMPSSF	#J	&M	#JSXXLVLLLsRd  
#J (s   H-c                 |   | j                   | j                  }| j                  }| j                  }t	        | dt
              }t	        | dd      t        |      }rQsOt        fd|D        d      }|s't        dd|d       t        j                  d       |j                  d	      d}rt        fd
|D        d      }|re|s|j                  d      xs d}|s(|j                  d      xs |j                  d      xs d}|"|j                  d      }|r	 t        |      }nd}s t        d       t        j                  d       |r|j                         }|st        j                   j#                         s#t        d|z         t        j                  d       	 t%        j$                  d      j                         }|s#t        d|z         t        j                  d       t+        |      dk7  rt        dt+        |      z         t        d       t        d       t        d       t        d       t        d       t        d        t        d!       t        d"       t        j                  d       |r#|j-                         j                         d#k(  s|st/        j0                  t3        | j4                  xs | j6                        | j8                  | j:                   d$| j<                  d%| j>                   f| j@                  |&
      }	|	r|	v r|	   d   }|	   d   }|sd'}	 tC        |||(      }
|
S # t        t        f$ rA t        d|d|j                  d	      xs |j                  d      xs dd|d       d}Y gw xY w# t&        t(        f$ r# t                t        j                  d       Y w xY w# tD        $ r.}t        d)|z         t        j                  d       Y d}~
S d}~wtF        $ r.}t        d*|z         t        j                  d       Y d}~
S d}~ww xY w)+z?Build a Device() object from args, using device file if needed.r	   r
   Nc              3      K   | ]G  }t        |t              r5|j                  d d      j                         j                         k(  r| I yw)r
   r   N)r*   r+   r-   lower)r   r8   dev_names     r   r   z _build_device.<locals>.<genexpr>[   sD      [KS3%#''&"*=*C*C*EIY*Y Ks   AAzError: no device named "z" found in .r   r   c              3   j   K   | ]*  }t        |t              r|j                  d       k(  r| , yw)r   N)r*   r+   r-   )r   r8   dev_ids     r   r   z _build_device.<locals>.<genexpr>h   s1      CKS3%#''$-6*A Ks   03r   r   r   r   r   z"Warning: invalid "version" value (z) for device z	<unknown>z in z!; using default protocol version.z"Error: --id or --name is required.zIError: device local key not found. Provide --key or add the device to %s.z1Enter device local key (16 chars, input hidden): zbError: device local key not found. Provide --key, add the device to %s, or enter it when prompted.   z9Error: device key must be exactly 16 characters (got %d).z<  This is often a shell-escaping issue when the key containsz1  special characters such as $, #, =, :, ', or !.z  Tips:zB    Linux/Mac - wrap the key in single quotes:  --key '$y123c5...'z@    Windows CMD - wrap in double quotes and escape ^ before eachz:                  special char, e.g.  --key "$y123^=c5..."zA    Any platform - omit --key entirely and enter it at the promptz3                   (safest option for tricky keys).autoFT)
verbosescantimecolorpoll	forcescanbyIDdiscoverwantids
assume_yesr5   gffffff
@)address	local_keyr   z	Error: %szError creating device: %s)$r   r   r   dev_versionr#   r   r   nextr'   r(   r)   r-   float	TypeError
ValueErrorstripstdinisattygetpassKeyboardInterruptEOFErrorr1   r?   r   devicesbooldebugdebug2max_timenocolorforceno_broadcastsyesr   RuntimeError	Exception)r4   dev_keydev_iprQ   r	   r5   matchdevinforaw_verall_resultsderC   r@   s               @@r   _build_devicero   L   s   ''F((G''F""K$z:K$-H "+.K [K [

 +VWHHQK4 GCK C
 kk%(.BG[[+Hw{{4/@HDFkk),G'"'.K # 23 --/
 yy!&' HHQK	oo&YZ``bG -/:; HHQK
 7|rG#g,V	
 	LMABiRSPQJKQRCD,,.&8+oo2t{{3dmmX\XdXdTdlqjjt4;M;M7MY_Xanrnvnv#% 6[0 (.F%f-i8K66WkR Ho ":. 	' $#KK-SV1DSS'	 #'K	'H "8, 	GHHQK	X  kAo
 H	  )A-.H	sI   !M '#N 6O ANN.OO	P;#PP;#P66P;c                 Z   t        |       }| j                  dk(  r|j                  | j                        }ns| j                  dk(  r|j	                  | j                        }nF| j                  dk(  r=	 t        j                  | j                        }|j                  | j                  |      }n| j                  dk(  r|j                         }|rd|vr| j                  t        t        j                  |             yt        | j                        }d|v r,||d   v r%t        t        j                  |d   |                yt        |j!                  di       j#                               }t        d	| j                  z         t        d
|       t%        j&                  d       nd}|r0d|v r,t        d|d   d|d          t%        j&                  d       |rt        t        j                  |             yt        d       y# t        t        f$ r | j                  }Y w xY w)z4Handle on / off / set / get device control commands.on)switchoffsetr-   ErrNdpsz+Error: DPS %d not found in device response.zAvailable DPS keys:r   zError z: ErrorOK)ro   commandturn_onrv   turn_offr/   loadsvaluerU   rT   	set_valuestatusr'   r0   r.   listr-   keysr(   r)   )r4   rm   resulttyped_valuedps_str	availables         r   _run_device_commandr      s   dA ||t$((+		488,			%**TZZ0K TXX{3		e6)xxdjj()$((mG7fUm#;djjw!789 E2!6!;!;!=>	CdhhNO+Y7  %6/uvg?@djj !dA I& 	%**K	%s   6H H*)H*c                 ^   t        |       }|j                  d       t        | j                  xs | j                        }d}d}t        d       t        d|j                         z         t        d       t        j                         |z   }t        j                         |z   }	 	 |rct        j                         |k\  rL|rt        d       |j                         }t        j                         |z   }t        j                         |z   }nQt        j                         |k\  r*|j                  d      }t        j                         |z   }n|j                         }|s|rt        d	|z         |r$d
|v r t        d       t        j                  d       # t        $ r t        d       Y yw xY w)z=Connect to device, get status, and monitor for async updates.T      z > Send Request for Status < zInitial Status: %rz- > Beginning Monitor Loop, <CTRL>-c To Exit <F)nowaitzReceived Payload: %rru   z*Received error!  Sleeping for 5 seconds...   z#
 > Keyboard Interrupt, Exiting! < N)ro   set_socketPersistentr]   r^   r_   r'   r   time	heartbeatreceivesleeprZ   )r4   rm   r^   STATUS_TIMERKEEPALIVE_TIMERheartbeat_timestatus_timedatas           r   _monitor_devicer     s\   dA4  *t{{+ELO	
)*	

+,	
9:YY[?2N))+,K6tyy{k99:xxz"iikL8!%!>.{{%{0!%!> yy{u,t34BC

1- .  6456s   %C0F F,+F,)__doc__rY   r/   r$   r(   r   r   r   r   corer   core.XenonDevicer   r<   ro   r   r   r       r   <module>r      s<      	 
  !  -,^CJ.b*6r   