Skip to content

Commit 1d65bc0

Browse files
authored
Add support for Wall Dimmer (#127)
* Add Plus Wall Dimmer model info * Add light configuration * Update docs
1 parent 40100ee commit 1d65bc0

File tree

3 files changed

+60
-4
lines changed

3 files changed

+60
-4
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Shellies Discovery Gen2 will automatically install/update the script on your She
3030
- Shelly Plus 2PM
3131
- Shelly Plus H&T
3232
- Shelly Plus I4
33+
- Shelly Plus Wall Dimmer
3334
- Shelly Pro 1
3435
- Shelly Pro 1PM
3536
- Shelly Pro 2

info.md

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ Shellies Discovery Gen2 will automatically install/update the script on your She
2323
- Shelly Plus 2PM
2424
- Shelly Plus H&T
2525
- Shelly Plus I4
26+
- Shelly Plus Wall Dimmer
2627
- Shelly Pro 1
2728
- Shelly Pro 1PM
2829
- Shelly Pro 2

python_scripts/shellies_discovery_gen2.py

+58-4
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
ATTR_INPUT_EVENTS = "input_events"
1515
ATTR_INPUTS = "inputs"
1616
ATTR_LIGHT = "light"
17+
ATTR_LIGHTS = "lights"
1718
ATTR_MAC = "mac"
1819
ATTR_MANUFACTURER = "Allterco Robotics"
1920
ATTR_MIN_FIRMWARE_DATE = "min_firmware_date"
@@ -60,6 +61,7 @@
6061
KEY_AUTOMATION_TYPE = "atype"
6162
KEY_AVAILABILITY = "avty"
6263
KEY_AVAILABILITY_MODE = "avty_mode"
64+
KEY_BRIGHTNESS_TEMPLATE = "bri_tpl"
6365
KEY_COMMAND_OFF_TEMPLATE = "cmd_off_tpl"
6466
KEY_COMMAND_ON_TEMPLATE = "cmd_on_tpl"
6567
KEY_COMMAND_TEMPLATE = "cmd_tpl"
@@ -124,6 +126,7 @@
124126
MODEL_PLUS_HT = "shellyplusht"
125127
MODEL_PLUS_I4 = "shellyplusi4"
126128
MODEL_PLUS_PLUG_US = "shellyplugus"
129+
MODEL_PLUS_WALL_DIMMER = "shellypluswdus"
127130
MODEL_PRO_1 = "shellypro1"
128131
MODEL_PRO_1PM = "shellypro1pm"
129132
MODEL_PRO_2 = "shellypro2"
@@ -184,6 +187,7 @@
184187
TOPIC_COVER = "~status/cover:{cover}"
185188
TOPIC_HUMIDITY = "~status/humidity:0"
186189
TOPIC_INPUT = "~status/input:{relay}"
190+
TOPIC_LIGHT = "~status/light:{light}"
187191
TOPIC_ONLINE = "~online"
188192
TOPIC_RPC = "~rpc"
189193
TOPIC_STATUS_CLOUD = "~status/cloud"
@@ -763,6 +767,24 @@
763767
},
764768
ATTR_MIN_FIRMWARE_DATE: 20220211,
765769
},
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+
},
766788
MODEL_PRO_1: {
767789
ATTR_NAME: "Shelly Pro 1",
768790
ATTR_MODEL_ID: "SPSW-001XE16EU",
@@ -1088,7 +1110,7 @@ def get_switch(relay_id, relay_type, profile):
10881110
return topic, payload
10891111

10901112

1091-
def get_light(relay_id, relay_type, profile):
1113+
def get_relay_light(relay_id, relay_type, profile):
10921114
"""Create configuration for Shelly relay as light entity."""
10931115
topic = encode_config_topic(f"{disc_prefix}/light/{device_id}-{relay_id}/config")
10941116

@@ -1117,7 +1139,7 @@ def get_light(relay_id, relay_type, profile):
11171139
return topic, payload
11181140

11191141

1120-
def get_fan(relay_id, relay_type, profile):
1142+
def get_relay_fan(relay_id, relay_type, profile):
11211143
"""Create configuration for Shelly relay as fan entity."""
11221144
topic = encode_config_topic(f"{disc_prefix}/fan/{device_id}-{relay_id}/config")
11231145

@@ -1144,6 +1166,32 @@ def get_fan(relay_id, relay_type, profile):
11441166
return topic, payload
11451167

11461168

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+
11471195
def get_sensor(sensor, description, profile=None, relay_id=None, cover_id=None):
11481196
"""Create configuration for Shelly sensor entity."""
11491197
if cover_id is not None:
@@ -1407,6 +1455,10 @@ def configure_device():
14071455
)
14081456
config[topic] = payload
14091457

1458+
for light_id in range(lights):
1459+
topic, payload = get_light(light_id)
1460+
config[topic] = payload
1461+
14101462
for relay_id in range(relays):
14111463
consumption_types = [
14121464
item.lower()
@@ -1417,10 +1469,10 @@ def configure_device():
14171469
topic, payload = get_switch(relay_id, relay_type, profile)
14181470
config[topic] = payload
14191471

1420-
topic, payload = get_light(relay_id, relay_type, profile)
1472+
topic, payload = get_relay_light(relay_id, relay_type, profile)
14211473
config[topic] = payload
14221474

1423-
topic, payload = get_fan(relay_id, relay_type, profile)
1475+
topic, payload = get_relay_fan(relay_id, relay_type, profile)
14241476
config[topic] = payload
14251477

14261478
for sensor, description in relay_sensors.items():
@@ -1643,6 +1695,8 @@ def remove_old_script_versions():
16431695
relay_sensors = SUPPORTED_MODELS[model].get(ATTR_RELAY_SENSORS, {})
16441696
relay_binary_sensors = SUPPORTED_MODELS[model].get(ATTR_RELAY_BINARY_SENSORS, {})
16451697

1698+
lights = SUPPORTED_MODELS[model].get(ATTR_LIGHTS, 0)
1699+
16461700
buttons = SUPPORTED_MODELS[model].get(ATTR_BUTTONS, {})
16471701
sensors = SUPPORTED_MODELS[model].get(ATTR_SENSORS, {})
16481702
binary_sensors = SUPPORTED_MODELS[model].get(ATTR_BINARY_SENSORS, {})

0 commit comments

Comments
 (0)