14
14
ATTR_INPUT_EVENTS = "input_events"
15
15
ATTR_INPUTS = "inputs"
16
16
ATTR_LIGHT = "light"
17
+ ATTR_LIGHTS = "lights"
17
18
ATTR_MAC = "mac"
18
19
ATTR_MANUFACTURER = "Allterco Robotics"
19
20
ATTR_MIN_FIRMWARE_DATE = "min_firmware_date"
60
61
KEY_AUTOMATION_TYPE = "atype"
61
62
KEY_AVAILABILITY = "avty"
62
63
KEY_AVAILABILITY_MODE = "avty_mode"
64
+ KEY_BRIGHTNESS_TEMPLATE = "bri_tpl"
63
65
KEY_COMMAND_OFF_TEMPLATE = "cmd_off_tpl"
64
66
KEY_COMMAND_ON_TEMPLATE = "cmd_on_tpl"
65
67
KEY_COMMAND_TEMPLATE = "cmd_tpl"
124
126
MODEL_PLUS_HT = "shellyplusht"
125
127
MODEL_PLUS_I4 = "shellyplusi4"
126
128
MODEL_PLUS_PLUG_US = "shellyplugus"
129
+ MODEL_PLUS_WALL_DIMMER = "shellypluswdus"
127
130
MODEL_PRO_1 = "shellypro1"
128
131
MODEL_PRO_1PM = "shellypro1pm"
129
132
MODEL_PRO_2 = "shellypro2"
184
187
TOPIC_COVER = "~status/cover:{cover}"
185
188
TOPIC_HUMIDITY = "~status/humidity:0"
186
189
TOPIC_INPUT = "~status/input:{relay}"
190
+ TOPIC_LIGHT = "~status/light:{light}"
187
191
TOPIC_ONLINE = "~online"
188
192
TOPIC_RPC = "~rpc"
189
193
TOPIC_STATUS_CLOUD = "~status/cloud"
763
767
},
764
768
ATTR_MIN_FIRMWARE_DATE : 20220211 ,
765
769
},
770
+ MODEL_PLUS_WALL_DIMMER : {
771
+ ATTR_NAME : "Shelly Plus Wall Dimmer" ,
772
+ ATTR_MODEL_ID : "SNDM-0013US" ,
773
+ ATTR_BINARY_SENSORS : {SENSOR_CLOUD : DESCRIPTION_SENSOR_CLOUD },
774
+ ATTR_BUTTONS : {BUTTON_RESTART : DESCRIPTION_BUTTON_RESTART },
775
+ ATTR_LIGHTS : 1 ,
776
+ ATTR_SENSORS : {
777
+ SENSOR_LAST_RESTART : DESCRIPTION_SENSOR_LAST_RESTART ,
778
+ SENSOR_SSID : DESCRIPTION_SENSOR_SSID ,
779
+ SENSOR_WIFI_IP : DESCRIPTION_SENSOR_WIFI_IP ,
780
+ SENSOR_WIFI_SIGNAL : DESCRIPTION_SENSOR_WIFI_SIGNAL ,
781
+ },
782
+ ATTR_UPDATES : {
783
+ UPDATE_FIRMWARE : DESCRIPTION_UPDATE_FIRMWARE ,
784
+ UPDATE_FIRMWARE_BETA : DESCRIPTION_UPDATE_FIRMWARE_BETA ,
785
+ },
786
+ ATTR_MIN_FIRMWARE_DATE : 20221024 ,
787
+ },
766
788
MODEL_PRO_1 : {
767
789
ATTR_NAME : "Shelly Pro 1" ,
768
790
ATTR_MODEL_ID : "SPSW-001XE16EU" ,
@@ -1088,7 +1110,7 @@ def get_switch(relay_id, relay_type, profile):
1088
1110
return topic , payload
1089
1111
1090
1112
1091
- def get_light (relay_id , relay_type , profile ):
1113
+ def get_relay_light (relay_id , relay_type , profile ):
1092
1114
"""Create configuration for Shelly relay as light entity."""
1093
1115
topic = encode_config_topic (f"{ disc_prefix } /light/{ device_id } -{ relay_id } /config" )
1094
1116
@@ -1117,7 +1139,7 @@ def get_light(relay_id, relay_type, profile):
1117
1139
return topic , payload
1118
1140
1119
1141
1120
- def get_fan (relay_id , relay_type , profile ):
1142
+ def get_relay_fan (relay_id , relay_type , profile ):
1121
1143
"""Create configuration for Shelly relay as fan entity."""
1122
1144
topic = encode_config_topic (f"{ disc_prefix } /fan/{ device_id } -{ relay_id } /config" )
1123
1145
@@ -1144,6 +1166,32 @@ def get_fan(relay_id, relay_type, profile):
1144
1166
return topic , payload
1145
1167
1146
1168
1169
+ def get_light (light_id ):
1170
+ """Create configuration for Shelly light entity."""
1171
+ topic = encode_config_topic (f"{ disc_prefix } /light/{ device_id } -{ light_id } /config" )
1172
+
1173
+ light_name = (
1174
+ device_config [f"light:{ light_id } " ][ATTR_NAME ]
1175
+ or f"{ device_name } Light { light_id } "
1176
+ )
1177
+ payload = {
1178
+ KEY_SCHEMA : "template" ,
1179
+ KEY_NAME : light_name ,
1180
+ KEY_COMMAND_TOPIC : TOPIC_RPC ,
1181
+ KEY_COMMAND_OFF_TEMPLATE : f"{{^id^:1,^src^:^{ device_id } ^,^method^:^Light.Set^,^params^:{{^id^:{ light_id } ,^on^:false}}}}" ,
1182
+ KEY_COMMAND_ON_TEMPLATE : f"{{^id^:1,^src^:^{ device_id } ^,^method^:^Light.Set^,^params^:{{^id^:{ light_id } ,^on^:true{{%if brightness is defined%}},^brightness^:{{{{brightness|float|multiply(0.3922)|round}}}}{{%endif%}}}}}}" ,
1183
+ KEY_STATE_TOPIC : TOPIC_LIGHT .format (light = light_id ),
1184
+ KEY_STATE_TEMPLATE : "{%if value_json.output%}on{%else%}off{%endif%}" ,
1185
+ KEY_BRIGHTNESS_TEMPLATE : "{{value_json.brightness|float|multiply(2.55)|round}}" ,
1186
+ KEY_AVAILABILITY : availability ,
1187
+ KEY_UNIQUE_ID : f"{ device_id } -{ light_id } " .lower (),
1188
+ KEY_QOS : qos ,
1189
+ KEY_DEVICE : device_info ,
1190
+ KEY_DEFAULT_TOPIC : default_topic ,
1191
+ }
1192
+ return topic , payload
1193
+
1194
+
1147
1195
def get_sensor (sensor , description , profile = None , relay_id = None , cover_id = None ):
1148
1196
"""Create configuration for Shelly sensor entity."""
1149
1197
if cover_id is not None :
@@ -1407,6 +1455,10 @@ def configure_device():
1407
1455
)
1408
1456
config [topic ] = payload
1409
1457
1458
+ for light_id in range (lights ):
1459
+ topic , payload = get_light (light_id )
1460
+ config [topic ] = payload
1461
+
1410
1462
for relay_id in range (relays ):
1411
1463
consumption_types = [
1412
1464
item .lower ()
@@ -1417,10 +1469,10 @@ def configure_device():
1417
1469
topic , payload = get_switch (relay_id , relay_type , profile )
1418
1470
config [topic ] = payload
1419
1471
1420
- topic , payload = get_light (relay_id , relay_type , profile )
1472
+ topic , payload = get_relay_light (relay_id , relay_type , profile )
1421
1473
config [topic ] = payload
1422
1474
1423
- topic , payload = get_fan (relay_id , relay_type , profile )
1475
+ topic , payload = get_relay_fan (relay_id , relay_type , profile )
1424
1476
config [topic ] = payload
1425
1477
1426
1478
for sensor , description in relay_sensors .items ():
@@ -1643,6 +1695,8 @@ def remove_old_script_versions():
1643
1695
relay_sensors = SUPPORTED_MODELS [model ].get (ATTR_RELAY_SENSORS , {})
1644
1696
relay_binary_sensors = SUPPORTED_MODELS [model ].get (ATTR_RELAY_BINARY_SENSORS , {})
1645
1697
1698
+ lights = SUPPORTED_MODELS [model ].get (ATTR_LIGHTS , 0 )
1699
+
1646
1700
buttons = SUPPORTED_MODELS [model ].get (ATTR_BUTTONS , {})
1647
1701
sensors = SUPPORTED_MODELS [model ].get (ATTR_SENSORS , {})
1648
1702
binary_sensors = SUPPORTED_MODELS [model ].get (ATTR_BINARY_SENSORS , {})
0 commit comments