28
28
ATTR_SWITCH = "switch"
29
29
ATTR_UPDATES = "updates"
30
30
31
+ BUTTON_MUTE_ALARM = "mute_alarm"
31
32
BUTTON_RESTART = "restart"
32
33
BUTTON_UPDATE_FIRMWARE = "update_firmware"
33
34
59
60
EVENT_LONG_PUSH = "long_push"
60
61
EVENT_SINGLE_PUSH = "single_push"
61
62
63
+ HOME_ASSISTANT = "home-assistant"
64
+
62
65
KEY_AUTOMATION_TYPE = "atype"
63
66
KEY_AVAILABILITY = "avty"
64
67
KEY_AVAILABILITY_MODE = "avty_mode"
68
+ KEY_AVAILABILITY_TEMPLATE = "avty_tpl"
69
+ KEY_AVAILABILITY_TOPIC = "avty_t"
65
70
KEY_BRIGHTNESS_TEMPLATE = "bri_tpl"
66
71
KEY_COMMAND_OFF_TEMPLATE = "cmd_off_tpl"
67
72
KEY_COMMAND_ON_TEMPLATE = "cmd_on_tpl"
269
274
EVENT_SINGLE_PUSH : TRIGGER_BUTTON_SHORT_PRESS ,
270
275
}
271
276
277
+ DESCRIPTION_BUTTON_MUTE_ALARM = {
278
+ KEY_ICON : "mdi:volume-mute" ,
279
+ KEY_ENABLED_BY_DEFAULT : True ,
280
+ KEY_ENTITY_CATEGORY : ENTITY_CATEGORY_CONFIG ,
281
+ KEY_NAME : "Mute Alarm" ,
282
+ KEY_PAYLOAD_PRESS : "{{^id^:1,^src^:^{source}^,^method^:^Smoke.Mute^}}" ,
283
+ KEY_AVAILABILITY_TOPIC : TOPIC_STATUS_SMOKE ,
284
+ KEY_AVAILABILITY_TEMPLATE : "{%if value_json.alarm%}online{%else%}offline{%endif%}" ,
285
+ }
272
286
DESCRIPTION_BUTTON_RESTART = {
273
287
KEY_DEVICE_CLASS : DEVICE_CLASS_RESTART ,
274
288
KEY_ENABLED_BY_DEFAULT : True ,
275
289
KEY_ENTITY_CATEGORY : ENTITY_CATEGORY_CONFIG ,
276
290
KEY_NAME : "Restart" ,
277
- KEY_PAYLOAD_PRESS : "{{^id^:1,^src^:^{device_id }^,^method^:^Shelly.Reboot^}}" ,
291
+ KEY_PAYLOAD_PRESS : "{{^id^:1,^src^:^{source }^,^method^:^Shelly.Reboot^}}" ,
278
292
}
279
293
DESCRIPTION_BATTERY = {
280
294
KEY_DEVICE_CLASS : DEVICE_CLASS_BATTERY ,
564
578
KEY_LATEST_VERSION_TEMPLATE : TPL_FIRMWARE_STABLE ,
565
579
KEY_LATEST_VERSION_TOPIC : TOPIC_STATUS_RPC ,
566
580
KEY_NAME : "Firmware" ,
567
- KEY_PAYLOAD_INSTALL : "{{^id^:1,^src^:^{device_id }^,^method^:^Shelly.Update^,^params^:{{^stage^:^stable^}}}}" ,
581
+ KEY_PAYLOAD_INSTALL : "{{^id^:1,^src^:^{source }^,^method^:^Shelly.Update^,^params^:{{^stage^:^stable^}}}}" ,
568
582
KEY_STATE_TOPIC : TOPIC_STATUS_RPC ,
569
583
KEY_VALUE_TEMPLATE : TPL_INSTALLED_FIRMWARE ,
570
584
}
575
589
KEY_LATEST_VERSION_TEMPLATE : TPL_FIRMWARE_BETA ,
576
590
KEY_LATEST_VERSION_TOPIC : TOPIC_STATUS_RPC ,
577
591
KEY_NAME : "Firmware beta" ,
578
- KEY_PAYLOAD_INSTALL : "{{^id^:1,^src^:^{device_id }^,^method^:^Shelly.Update^,^params^:{{^stage^:^beta^}}}}" ,
592
+ KEY_PAYLOAD_INSTALL : "{{^id^:1,^src^:^{source }^,^method^:^Shelly.Update^,^params^:{{^stage^:^beta^}}}}" ,
579
593
KEY_STATE_TOPIC : TOPIC_STATUS_RPC ,
580
594
KEY_VALUE_TEMPLATE : TPL_INSTALLED_FIRMWARE ,
581
595
}
825
839
SENSOR_FIRMWARE : DESCRIPTION_SLEEPING_SENSOR_FIRMWARE ,
826
840
SENSOR_SMOKE : DESCRIPTION_SENSOR_SMOKE ,
827
841
},
842
+ ATTR_BUTTONS : {BUTTON_MUTE_ALARM : DESCRIPTION_BUTTON_MUTE_ALARM },
828
843
ATTR_SENSORS : {
829
844
SENSOR_BATTERY : DESCRIPTION_BATTERY ,
830
845
SENSOR_LAST_RESTART : DESCRIPTION_SLEEPING_SENSOR_LAST_RESTART ,
@@ -1134,10 +1149,10 @@ def get_cover(cover_id, profile):
1134
1149
KEY_VALUE_TEMPLATE : "{%if value_json.state!=^calibrating^%}{{value_json.state}}{%endif%}" ,
1135
1150
KEY_POSITION_TEMPLATE : "{%if is_number(value_json.get(^current_pos^))%}{{value_json.current_pos}}{%endif%}" ,
1136
1151
KEY_SET_POSITION_TOPIC : TOPIC_RPC ,
1137
- KEY_SET_POSITION_TEMPLATE : f"{{^id^:1,^src^:^{ device_id } ^,^method^:^Cover.GoToPosition^,^params^:{{^id^:{ cover_id } ,^pos^:{{{{position}}}}}}}}" ,
1138
- KEY_PAYLOAD_OPEN : f"{{^id^:1,^src^:^{ device_id } ^,^method^:^Cover.Open^,^params^:{{^id^:{ cover_id } }}}}" ,
1139
- KEY_PAYLOAD_CLOSE : f"{{^id^:1,^src^:^{ device_id } ^,^method^:^Cover.Close^,^params^:{{^id^:{ cover_id } }}}}" ,
1140
- KEY_PAYLOAD_STOP : f"{{^id^:1,^src^:^{ device_id } ^,^method^:^Cover.Stop^,^params^:{{^id^:{ cover_id } }}}}" ,
1152
+ KEY_SET_POSITION_TEMPLATE : f"{{^id^:1,^src^:^{ HOME_ASSISTANT } ^,^method^:^Cover.GoToPosition^,^params^:{{^id^:{ cover_id } ,^pos^:{{{{position}}}}}}}}" ,
1153
+ KEY_PAYLOAD_OPEN : f"{{^id^:1,^src^:^{ HOME_ASSISTANT } ^,^method^:^Cover.Open^,^params^:{{^id^:{ cover_id } }}}}" ,
1154
+ KEY_PAYLOAD_CLOSE : f"{{^id^:1,^src^:^{ HOME_ASSISTANT } ^,^method^:^Cover.Close^,^params^:{{^id^:{ cover_id } }}}}" ,
1155
+ KEY_PAYLOAD_STOP : f"{{^id^:1,^src^:^{ HOME_ASSISTANT } ^,^method^:^Cover.Stop^,^params^:{{^id^:{ cover_id } }}}}" ,
1141
1156
KEY_AVAILABILITY : availability ,
1142
1157
KEY_UNIQUE_ID : f"{ device_id } -{ cover_id } " .lower (),
1143
1158
KEY_QOS : qos ,
@@ -1162,8 +1177,8 @@ def get_switch(relay_id, relay_type, profile):
1162
1177
payload = {
1163
1178
KEY_NAME : relay_name ,
1164
1179
KEY_COMMAND_TOPIC : TOPIC_RPC ,
1165
- KEY_PAYLOAD_OFF : f"{{^id^:1,^src^:^{ device_id } ^,^method^:^Switch.Set^,^params^:{{^id^:{ relay_id } ,^on^:false}}}}" ,
1166
- KEY_PAYLOAD_ON : f"{{^id^:1,^src^:^{ device_id } ^,^method^:^Switch.Set^,^params^:{{^id^:{ relay_id } ,^on^:true}}}}" ,
1180
+ KEY_PAYLOAD_OFF : f"{{^id^:1,^src^:^{ HOME_ASSISTANT } ^,^method^:^Switch.Set^,^params^:{{^id^:{ relay_id } ,^on^:false}}}}" ,
1181
+ KEY_PAYLOAD_ON : f"{{^id^:1,^src^:^{ HOME_ASSISTANT } ^,^method^:^Switch.Set^,^params^:{{^id^:{ relay_id } ,^on^:true}}}}" ,
1167
1182
KEY_STATE_TOPIC : TOPIC_SWITCH_RELAY .format (relay = relay_id ),
1168
1183
KEY_VALUE_TEMPLATE : "{%if value_json.output%}on{%else%}off{%endif%}" ,
1169
1184
KEY_STATE_OFF : VALUE_OFF ,
@@ -1193,8 +1208,8 @@ def get_relay_light(relay_id, relay_type, profile):
1193
1208
KEY_SCHEMA : "template" ,
1194
1209
KEY_NAME : relay_name ,
1195
1210
KEY_COMMAND_TOPIC : TOPIC_RPC ,
1196
- KEY_COMMAND_OFF_TEMPLATE : f"{{^id^:1,^src^:^{ device_id } ^,^method^:^Switch.Set^,^params^:{{^id^:{ relay_id } ,^on^:false}}}}" ,
1197
- KEY_COMMAND_ON_TEMPLATE : f"{{^id^:1,^src^:^{ device_id } ^,^method^:^Switch.Set^,^params^:{{^id^:{ relay_id } ,^on^:true}}}}" ,
1211
+ KEY_COMMAND_OFF_TEMPLATE : f"{{^id^:1,^src^:^{ HOME_ASSISTANT } ^,^method^:^Switch.Set^,^params^:{{^id^:{ relay_id } ,^on^:false}}}}" ,
1212
+ KEY_COMMAND_ON_TEMPLATE : f"{{^id^:1,^src^:^{ HOME_ASSISTANT } ^,^method^:^Switch.Set^,^params^:{{^id^:{ relay_id } ,^on^:true}}}}" ,
1198
1213
KEY_STATE_TOPIC : TOPIC_SWITCH_RELAY .format (relay = relay_id ),
1199
1214
KEY_STATE_TEMPLATE : "{%if value_json.output%}on{%else%}off{%endif%}" ,
1200
1215
KEY_AVAILABILITY : availability ,
@@ -1221,7 +1236,7 @@ def get_relay_fan(relay_id, relay_type, profile):
1221
1236
payload = {
1222
1237
KEY_NAME : relay_name ,
1223
1238
KEY_COMMAND_TOPIC : TOPIC_RPC ,
1224
- KEY_COMMAND_TEMPLATE : f"{{%if value==^ON^%}}{{^id^:1,^src^:^{ device_id } ^,^method^:^Switch.Set^,^params^:{{^id^:{ relay_id } ,^on^:true}}}}{{%else%}}{{^id^:1,^src^:^{ device_id } ^,^method^:^Switch.Set^,^params^:{{^id^:{ relay_id } ,^on^:false}}}}{{%endif%}}" ,
1239
+ KEY_COMMAND_TEMPLATE : f"{{%if value==^ON^%}}{{^id^:1,^src^:^{ HOME_ASSISTANT } ^,^method^:^Switch.Set^,^params^:{{^id^:{ relay_id } ,^on^:true}}}}{{%else%}}{{^id^:1,^src^:^{ HOME_ASSISTANT } ^,^method^:^Switch.Set^,^params^:{{^id^:{ relay_id } ,^on^:false}}}}{{%endif%}}" ,
1225
1240
KEY_STATE_TOPIC : TOPIC_SWITCH_RELAY .format (relay = relay_id ),
1226
1241
KEY_STATE_VALUE_TEMPLATE : "{%if value_json.output%}ON{%else%}OFF{%endif%}" ,
1227
1242
KEY_AVAILABILITY : availability ,
@@ -1245,8 +1260,8 @@ def get_light(light_id):
1245
1260
KEY_SCHEMA : "template" ,
1246
1261
KEY_NAME : light_name ,
1247
1262
KEY_COMMAND_TOPIC : TOPIC_RPC ,
1248
- KEY_COMMAND_OFF_TEMPLATE : f"{{^id^:1,^src^:^{ device_id } ^,^method^:^Light.Set^,^params^:{{^id^:{ light_id } ,^on^:false}}}}" ,
1249
- 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%}}}}}}" ,
1263
+ KEY_COMMAND_OFF_TEMPLATE : f"{{^id^:1,^src^:^{ HOME_ASSISTANT } ^,^method^:^Light.Set^,^params^:{{^id^:{ light_id } ,^on^:false}}}}" ,
1264
+ KEY_COMMAND_ON_TEMPLATE : f"{{^id^:1,^src^:^{ HOME_ASSISTANT } ^,^method^:^Light.Set^,^params^:{{^id^:{ light_id } ,^on^:true{{%if brightness is defined%}},^brightness^:{{{{brightness|float|multiply(0.3922)|round}}}}{{%endif%}}}}}}" ,
1250
1265
KEY_STATE_TOPIC : TOPIC_LIGHT .format (light = light_id ),
1251
1266
KEY_STATE_TEMPLATE : "{%if value_json.output%}on{%else%}off{%endif%}" ,
1252
1267
KEY_BRIGHTNESS_TEMPLATE : "{{value_json.brightness|float|multiply(2.55)|round}}" ,
@@ -1452,15 +1467,19 @@ def get_button(button, description):
1452
1467
payload = {
1453
1468
KEY_NAME : f"{ device_name } { description [KEY_NAME ]} " ,
1454
1469
KEY_COMMAND_TOPIC : TOPIC_RPC ,
1455
- KEY_PAYLOAD_PRESS : description [KEY_PAYLOAD_PRESS ].format (device_id = device_id ),
1470
+ KEY_PAYLOAD_PRESS : description [KEY_PAYLOAD_PRESS ].format (source = HOME_ASSISTANT ),
1456
1471
KEY_ENABLED_BY_DEFAULT : str (description [KEY_ENABLED_BY_DEFAULT ]).lower (),
1457
1472
KEY_UNIQUE_ID : f"{ device_id } -{ button } " .lower (),
1458
1473
KEY_QOS : qos ,
1459
- KEY_AVAILABILITY : availability ,
1460
1474
KEY_DEVICE : device_info ,
1461
1475
KEY_DEFAULT_TOPIC : default_topic ,
1462
1476
}
1463
1477
1478
+ if description .get (KEY_AVAILABILITY_TOPIC ):
1479
+ payload [KEY_AVAILABILITY_TOPIC ] = description [KEY_AVAILABILITY_TOPIC ]
1480
+ payload [KEY_AVAILABILITY_TEMPLATE ] = description [KEY_AVAILABILITY_TEMPLATE ]
1481
+ elif availability :
1482
+ payload [KEY_AVAILABILITY ] = availability
1464
1483
if description .get (KEY_DEVICE_CLASS ):
1465
1484
payload [KEY_DEVICE_CLASS ] = description [KEY_DEVICE_CLASS ]
1466
1485
if description .get (KEY_ENTITY_CATEGORY ):
@@ -1494,7 +1513,7 @@ def get_update(update, description):
1494
1513
if description .get (KEY_PAYLOAD_INSTALL ):
1495
1514
payload [KEY_COMMAND_TOPIC ] = TOPIC_RPC
1496
1515
payload [KEY_PAYLOAD_INSTALL ] = description [KEY_PAYLOAD_INSTALL ].format (
1497
- device_id = device_id
1516
+ source = HOME_ASSISTANT
1498
1517
)
1499
1518
if description .get (KEY_DEVICE_CLASS ):
1500
1519
payload [KEY_DEVICE_CLASS ] = description [KEY_DEVICE_CLASS ]
0 commit comments