
    |e@                        d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 dd	lmZmZmZ dd
lmZmZmZ ddlmZ ddlmZmZmZ ddlmZmZmZmZ ddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZB eefefefeefeefeefdZCddeDdeEdeFfdZG eGe=dd          ZH eGe=dd          ZI eGe=dd          ZJ eGe=dd          ZK eGe3dd           ZL eGe3d!"          ZM eGe?d#d$d%&          ZN eGe3d'd%(          ZO eGe?d)d%(          ZP eGe+d*d%(          ZQe<eNeOePeQgZReHeNeOgZSeHeIeNeOgZTeHeIeJeNeOgZUeHeIeJeKeNeOgZV eGeLd+d,-          ZW eGeLd.d/-          ZX eGeLd0d1-          ZY eGeLd2d3-          ZZ eGeLd4d5-          Z[ eGeLd6d7-          Z\ eGeLd8d9-          Z] eGeLd:d;-          Z^ eGeLd<d=-          Z_ eGeLd>d?-          Z` eGeLd@dA-          Za eGeLdBdC-          Zb eGe/dDdEdFdGiH          Zci deRdeTdeUdIeVdJe<eNeO eGe3dK"          ecgdLeRdMeTdNeUdOeVdPeeNeOgdQeRdRe>ee5e0eNeOgdS eGe3dT"           eGe3dU"           eGe3dV"           eGe3dW"           eGe3dX"          gdYe#eOgdZeeeO eGed[d\-          gd]e-eNeOgd^eTi d_eUd`eVdae<eNeO eGe3db"           eGe3dK"           eGe3dc"          ecgdde(eOgdeee!eNeOgdfe eOgdge&eOgdhe"eOgdie(eOgdjeOeN eGedkd%(          gdleSdmeSdneSdoeTdpeUdqeVdree7eOgi dse$eOgdte%eOgdueSdveHeIeOeWeXe[e\e_e` eGe8dwdxdydiH           eGe8dzd{d|diH          gd}egd~eNgdeHeIeJeKeWeXeYeZe[e\e]e^e_e`eaeb eGe8dwdxdydiH           eGe8dzd{d|diH           eGe8dzdddiH           eGe8dzdddiH          gdeHeIee4e1gde$eOgd eGe%dd          eOgde(eOgdeHeNeOeBgdeeMeOgdeUdeHeIeOgdeOgde)eOgi de2gde2gde>e5e0eNeOgdeHeNeO eGe3db"           eGe3dK"           eGe3dc"          ecgdeAeNeO eGeLdb"           eGeLdK"           eGeLdc"           eGe:dddd           eGe:dddd           eGe9ddEddddiH          g	de5gde2eMgd eGe<dW          gd eGe&dW          gde eGe3d!d          gd eGeLdT"           eGeLdU"          eMgd eGeLdT"           eGeLdU"          eMgdeeMgd eGedd\d          eMgd eGed[d\d          eMgd eGe@dd           eGe@dd           eGe@dd           eGe@dd          gde2eMgd eGeLdT"           eGeLdU"          eMgiZddeedeffdZgdeffdZhdeffdZideDfdZjg dg dg dg dg dg dg dg dg dg dg d¢dÜZkdeede
fdĄZldS )a  
Each device has a specification - list of classes (XEntity childs). Platform
will setup entity if it isinstance() of platform entity class.

User can override SwitchEntity of any device via YAML (device_class option).

XEntity properties:
- params - required, set of parameters that this entity can read
- param - optional, entity main parameter (useful for sensors)
- uid - optional, entity unique_id tail

Developer can change global properties of existing classes via spec function.
    )BinarySensorEntity)LightEntity)SensorEntity)SwitchEntity   )XDevice   )XBinarySensor	XWiFiDoorXZigbeeMotion)
XClimateNS
XClimateTHXThermostat)XEntity)XCoverXCoverDualR3XZigbeeCover)XDiffuserFanXFan
XToggleFan
XFanDualR3)XDiffuserLightXDimmer	XFanLightXLight57XLightB1	XLightB02
XLightB05BXLightD1XLightGroupXLightL1XLightL3)XPulseWidth)XRemote)XEnergySensorXHumidityTHXOutdoorTempNSXRemoteButtonXSensorXTemperatureNSXTemperatureTHXUnknownXWiFiDoorBatteryXEnergySensorDualR3XEnergySensorPOWR3XEnergyTotal)XSwitch	XSwitches	XSwitchTHXToggleXZigbeeSwitchesXSwitchPOWR3XDetach)binary_sensorfandualfanlightsensorswitchNbaseenabledreturnc                    |||d<   |rY| j         t          t          j                    dd         }d |D             }t          | j        t
          |         i ||          S t          | j        | fi | j        |          S )zMake duplicate for cls class with changes in kwargs params.

    If `base` param provided - can change Entity base class for cls. So it can
    be added to different Hass domain.
    N%_attr_entity_registry_enabled_defaultc                 R    i | ]$}|j                                         D ]\  }}||	%S  )__dict__items).0bkvs       0/config/custom_components/sonoff/core/devices.py
<dictcomp>zspec.<locals>.<dictcomp>V   s9    DDD!1A1A1C1CDDAADDDD    )__mro__lenr1   type__name__DEVICE_CLASSrF   )clsr>   r?   kwargsbasess        rL   specrW   L   s     :A67 KS1117R78DDuDDDCL,t"46I6I&6IJJJsf&@&@&@AAArN   1)channeluid23   4g{Gz?)multiplyroundbatteryparam
sledOnlineledF)rc   rZ   r?   rssi)rc   r?   pulse
pulseWidth
current_00	current_1rc   rZ   
current_01	current_2
current_02	current_3
current_03	current_4
voltage_00	voltage_1
voltage_01	voltage_2
voltage_02	voltage_3
voltage_03	voltage_4	actPow_00power_1	actPow_01power_2	actPow_02power_3	actPow_03power_4hundredDaysKwhDataenergyhundredDaysKwhget)rc   rZ   
get_params      power         	               temperaturehumiditydustyr;   noise      water                 currentvoltage!   "   $   ,   9   ;   B   zledM   N   Q   R   S   T   f   g   h   k   ~   kwhHistories_00energy_1	getKwh_00kwhHistories_01energy_2	getKwh_01         energy_3	getKwh_02energy_4	getKwh_03         d   )min_ctmax_ct                                    dayKwh
energy_day)rc   rZ   r_   r`   monthKwhenergy_monthhoursKwhDatagetHoursKwhi  )startend   i  i  r>   i  i  )rc   r_   i  i  i  i  lockdoor)rc   rZ   default_classi  moisturei  iX  if  devicec                    | d         d         }|t           v rt           |         }n,d| d         v rt          }nd| d         v rt          }nt          g}|dv rF| d                             d          dk    r'd	 |D             }|                    d
t                     |dv r'| d                             d          sd |D             }d| v rt          || d                   }|S )Nextrauiidr=   paramsswitches)r   r   workModer	   c                 .    g | ]}t           |j        v|S rE   )r2   	__bases__rH   rT   s     rL   
<listcomp>zget_spec.<locals>.<listcomp>  s$    LLL3Ycm-K-K3-K-K-KrN   r   )r   HMI_ATCDevicec                 .    g | ]}t           |j        v|S rE   )r   r   r   s     rL   r   zget_spec.<locals>.<listcomp>  s$    MMM3Zs}-L-L3-L-L-LrN   device_class)DEVICESSPEC_SWITCHSPEC_4CHr,   r   insertr   get_custom_spec)r   r   classess      rL   get_specr   ~  s   '?6"Dw$-	VH%	%	%	vh'	'	'* zfX.22:>>!CCLL'LLLq,''' u}}VH-11/BB}MM'MMM!'6.+ABBNrN   r   c                    t          |t                    r.|t          v r#t          | d         |          g| dd         z   } nt          |t                    r| d         j        fd| D             } t          |          D ]U\  }}t          |t                    r7|                     t          |t          |dz             |                     Rt          |t                    rt          t          |                                                    \  }}t          |t                    r]|dk    rWd |D             }d	                    d
 |D                       }|                     t          t          ||                     
t          |t                    r6|                     t          |dz
  t          |          |                     W| S )a`  Supported device_class formats:
    1. Single channel:
       device_class: light
    2. Multiple channels:
       device_class: [light, fan, switch]
    3. Light with brightness control
       device_class:
         - switch  # entity 1 (channel 1)
         - light: [2, 3]  # entity 2 (channels 2 and 3)
         - fan: 4  # entity 3 (channel 4)
    r   r   r   Nc                 &    g | ]}|j         v|S rE   )r   )rH   rT   r>   s     rL   r   z#get_custom_spec.<locals>.<listcomp>  s%    GGG3T-F-F3-F-F-FrN   )rY   rZ   r>   r;   c                     g | ]}|d z
  S )r   rE   rH   xs     rL   r   z#get_custom_spec.<locals>.<listcomp>  s    ,,,Q1q5,,,rN   r   c              3   4   K   | ]}t          |          V  d S N)strr   s     rL   	<genexpr>z"get_custom_spec.<locals>.<genexpr>  s(      !4!4Q#a&&!4!4!4!4!4!4rN   )channelsrZ   )
isinstancer   rS   rW   list__base__	enumerateappenddictnextiterrG   joinr    int)r   r   i	sub_classchsrZ   r>   s         @rL   r   r     s    ,$$ <''GAJ\:::;gabbkIG	L$	'	' qz"GGGG'GGG%l33 	 	LAy)S)) tD!QU)TTTUUUUIt,, #D):):$;$;<<	1 a&& 	9+?+?,,!,,,C''!4!4!!4!4!444CNN4cs#K#K#KLLLL  3'' NNTAEAYOOO   NrN   sensorsc                 4     dt           dt          f fd}|S )Nr   r@   c                      |           }D ]V| d         v sdk    rDt          fd|D                       r)|                    t          t                               W|S )Nr   hostc              3   D   K   | ]}|j         k    o
|j        k    V  d S r   rk   )rH   rT   rZ   s     rL   r   z4get_spec_wrapper.<locals>.wrapped.<locals>.<genexpr>  sN       B B8;	S 3SW^B B B B B BrN   rb   )allr  rW   r)   )r   r   rZ   funcr  s     @rL   wrappedz!get_spec_wrapper.<locals>.wrapped  s    $v,, 	9 	9Cvh'''3&==c B B B B?FB B B ? ?= tG3777888rN   )r  r  )r  r  r  s   `` rL   get_spec_wrapperr    s<             NrN   r   c                 h    t           | dk    rt          nt          fxt          _        t
          _        d S )Nr;   )r   r   r   r1   r   r2   )r   s    rL   set_default_classr    s0    #w..L/ G	+++rN   )r   NzSingle Channel DIY)r   NzMulti Channel DIY)r   SONOFFzMINI DIY)r   r  zPOW DIY)r   r  zTH DIY)r   r  zRFBridge DIY)r   r  ziFan DIY)r   r  zD1 DIY)r   r  z	Micro DIY)r   r  z
DualR3 DIY)plugstripdiy_plugenhanced_plugth_plugrf	fan_lightr;   diylightswitch_radarmultifun_switchc                     | d         }	 t           |         \  }}}|dk    rd| d         v rd}d}|| d<   || d<   d	|i| d
<   || d<   n!# t          $ r d| d<   d	di| d
<   || d<   Y nw xY w| S )N	localtyper  r   r   r   zMINI R3 DIYname	brandNamer   r   productModelzUnknown DIYr   )DIY	Exception)r   ltyper   brandmodels        rL   	setup_diyr-    s    ;E' ZeU J:1A#A#AD!Ev#{!4.w!&~ ' ' '&v!1+w!&~'
 Ms   ;A A$#A$)NN)m__doc__&homeassistant.components.binary_sensorr   homeassistant.components.lightr   homeassistant.components.sensorr   homeassistant.components.switchr   ewelinkr   r8   r
   r   r   climater   r   r   core.entityr   coverr   r   r   r9   r   r   r   r   r;   r   r   r   r   r   r   r   r   r    r!   r"   numberr#   remoter$   r<   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r=   r1   r2   r3   r4   r5   r6   r7   rS   r   boolrQ   rW   Switch1Switch2Switch3Switch4
XSensor100BatteryLEDRSSIPULSE
PULSEWIDTHr   SPEC_1CHSPEC_2CHSPEC_3CHr   Current1Current2Current3Current4Voltage1Voltage2Voltage3Voltage4Power1Power2Power3Power4	EnergyPOWr   r  r  r   r   r  r  r(  r-  rE   rN   rL   <module>rT     s    F E E E E E 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8       C C C C C C C C C C 9 9 9 9 9 9 9 9 9 9 ! ! ! ! ! ! 6 6 6 6 6 6 6 6 6 6 < < < < < < < < < < < <                          !                                                             12=}{#%% B BC B B4 B B B B $y!
-
-
-
$y!
-
-
-
$y!
-
-
-
$y!
-
-
-T'D222

$wi
(
(
(
d7,E5AAAtG65111WGU333T+\5AAA
T5*5S$Wc4(WgsD1WgwT:4
,K@@@4
,K@@@4
,K@@@4
,K@@@4
,K@@@4
,K@@@4
,K@@@4
,K@@@	j	;	;	;	j	;	;	;	j	;	;	;	j	;	;	;D
 %(	  	x{xxx xx x	x
 WG$$$x {x xx xx xx  d!x" #x$ 	%x4 WM***WJ'''WG$$$WG$$$WG$$$	5xB 4CxF ]'r222		GxR #tSxT Ux xV WxX YxZ WI&&&WG$$$WI&&&	[xl 4mxn 		oxz ${x| 4}x~ 4x@ 4AxB sDDfeDDDECxD ExF GxH IxJ KxL MxN OxP )%t	,Qx x xR )T	SxT *d	UxV WxX ##Q'		
 	
 	
 	##Q'		
 	
 	
!
YxF +GxH #IxJ ##Q'		
 	
 	
 	##Q'		
 	
 	
 	##Q'		
 	
 	
 	##Q'		
 	
 	
G)
Kx^  	
_xr )T	sx| $$z!C
0
0
0$	7}x~ (D	xB '3g	&CxF )Wd	#GxH IxJ '7D	!KxN $OxP (D	Qx x xR -SxT -UxV 
Wxd WI&&&WG$$$WI&&&
exv Zy)))Zw'''Zy)))\|dRSTTT
UV	
 	
 	
 	 %;'G'GH		
 	
 	

wx\ .	]x^ 	='
"_x` 	44g&&&
'axb 	44w'''
(cxf 	<gYCCC
Dgxh 	Z}---Zz***ixr 	Z}---Zz***sx| 	='
"}x@ 	]&bGGGAxJ 	]'rLLLKxR 	_aS111_aS111_aS111_aS111	Sx^ 	_x xf 	Z}---Zz***gx xvT d    6*T * * * *Z
D 
 
 
 
C     ,+++++)))---'''
(
(
(+++%%%(((///444  d w      rN   