diff --git a/python_scripts/shellies_discovery_gen2.py b/python_scripts/shellies_discovery_gen2.py index ebb5899..570208e 100644 --- a/python_scripts/shellies_discovery_gen2.py +++ b/python_scripts/shellies_discovery_gen2.py @@ -1,5 +1,5 @@ """This script adds MQTT discovery support for Shellies Gen2 devices.""" -VERSION = "2.18.0" +VERSION = "2.19.0" ATTR_BATTERY_POWERED = "battery_powered" ATTR_BINARY_SENSORS = "binary_sensors" @@ -229,7 +229,9 @@ TOPIC_COVER = "~status/cover:{cover}" TOPIC_EMDATA = "~status/emdata:{emeter_id}" +TOPIC_EMDATA1 = "~status/em1data:{emeter_id}" TOPIC_EMETER = "~status/em:{emeter_id}" +TOPIC_EMETER1 = "~status/em1:{emeter_id}" TOPIC_EVENTS_RPC = "~events/rpc" TOPIC_HUMIDITY = "~status/humidity:{sensor}" TOPIC_INPUT = "~status/input:{relay}" @@ -252,22 +254,27 @@ TPL_CLOUD = "{%if value_json.cloud.connected%}ON{%else%}OFF{%endif%}" TPL_CLOUD_INDEPENDENT = "{%if value_json.connected%}ON{%else%}OFF{%endif%}" TPL_CURRENT = "{{value_json.current}}" -TPL_EMETER_ACTIVE_POWER = "{{{{value_json.{phase}_act_power}}}}" -TPL_EMETER_APPARENT_POWER = "{{{{value_json.{phase}_aprt_power}}}}" -TPL_EMETER_CURRENT = "{{{{value_json.{phase}_current}}}}" -TPL_EMETER_FREQUENCY = "{{{{value_json.{phase}_freq}}}}" +TPL_EMETER_ACTIVE_POWER = "{{value_json.act_power}}" +TPL_EMETER_PHASE_ACTIVE_POWER = "{{{{value_json.{phase}_act_power}}}}" +TPL_EMETER_APPARENT_POWER = "{{value_json.aprt_power}}" +TPL_EMETER_PHASE_APPARENT_POWER = "{{{{value_json.{phase}_aprt_power}}}}" +TPL_EMETER_PHASE_CURRENT = "{{{{value_json.{phase}_current}}}}" +TPL_EMETER_PHASE_FREQUENCY = "{{{{value_json.{phase}_freq}}}}" TPL_EMETER_N_CURRENT = "{{value_json.n_current}}" TPL_EMETER_PHASE_TOTAL_ACTIVE_ENERGY = "{{{{value_json.{phase}_total_act_energy}}}}" TPL_EMETER_PHASE_TOTAL_ACTIVE_RETURNED_ENERGY = ( "{{{{value_json.{phase}_total_act_ret_energy}}}}" ) -TPL_EMETER_POWER_FACTOR = "{{{{value_json.{phase}_pf}}}}" +TPL_EMETER_POWER_FACTOR = "{{value_json.pf}}" +TPL_EMETER_PHASE_POWER_FACTOR = "{{{{value_json.{phase}_pf}}}}" TPL_EMETER_TOTAL_ACTIVE_ENERGY = "{{value_json.total_act}}" +TPL_EMETER1_TOTAL_ACTIVE_ENERGY = "{{value_json.total_act_energy}}" TPL_EMETER_TOTAL_ACTIVE_POWER = "{{value_json.total_act_power}}" TPL_EMETER_TOTAL_ACTIVE_RETURNED_ENERGY = "{{value_json.total_act_ret}}" +TPL_EMETER1_TOTAL_ACTIVE_RETURNED_ENERGY = "{{value_json.total_act_ret_energy}}" TPL_EMETER_TOTAL_APPARENT_POWER = "{{value_json.total_aprt_power}}" TPL_EMETER_TOTAL_CURRENT = "{{value_json.total_current}}" -TPL_EMETER_VOLTAGE = "{{{{value_json.{phase}_voltage}}}}" +TPL_EMETER_PHASE_VOLTAGE = "{{{{value_json.{phase}_voltage}}}}" TPL_EVENT = "{{%if value_json.params.events.0.id=={input_id}%}}{{{{{{^event_type^:value_json.params.events.0.event}}|to_json}}}}{{%endif%}}" TPL_FREQUENCY = "{{value_json.freq}}" TPL_ENERGY = "{{value_json.aenergy.total}}" @@ -394,17 +401,27 @@ } DESCRIPTION_SENSOR_EMETER_CURRENT = { KEY_DEVICE_CLASS: DEVICE_CLASS_CURRENT, - KEY_ENABLED_BY_DEFAULT: True, + KEY_ENABLED_BY_DEFAULT: False, + KEY_NAME: "EM{emeter_id} current", + KEY_STATE_CLASS: STATE_CLASS_MEASUREMENT, + KEY_STATE_TOPIC: TOPIC_EMETER1, + KEY_SUGGESTED_DISPLAY_PRECISION: 1, + KEY_UNIT: UNIT_AMPERE, + KEY_VALUE_TEMPLATE: TPL_CURRENT, +} +DESCRIPTION_SENSOR_EMETER_PHASE_CURRENT = { + KEY_DEVICE_CLASS: DEVICE_CLASS_CURRENT, + KEY_ENABLED_BY_DEFAULT: False, KEY_NAME: "Phase {phase} current", KEY_STATE_CLASS: STATE_CLASS_MEASUREMENT, KEY_STATE_TOPIC: TOPIC_EMETER, KEY_SUGGESTED_DISPLAY_PRECISION: 1, KEY_UNIT: UNIT_AMPERE, - KEY_VALUE_TEMPLATE: TPL_EMETER_CURRENT, + KEY_VALUE_TEMPLATE: TPL_EMETER_PHASE_CURRENT, } DESCRIPTION_SENSOR_N_CURRENT = { KEY_DEVICE_CLASS: DEVICE_CLASS_CURRENT, - KEY_ENABLED_BY_DEFAULT: True, + KEY_ENABLED_BY_DEFAULT: False, KEY_NAME: "N current", KEY_STATE_CLASS: STATE_CLASS_MEASUREMENT, KEY_STATE_TOPIC: TOPIC_EMETER.format(emeter_id=0), @@ -414,7 +431,7 @@ } DESCRIPTION_SENSOR_TOTAL_CURRENT = { KEY_DEVICE_CLASS: DEVICE_CLASS_CURRENT, - KEY_ENABLED_BY_DEFAULT: True, + KEY_ENABLED_BY_DEFAULT: False, KEY_NAME: "Total current", KEY_STATE_CLASS: STATE_CLASS_MEASUREMENT, KEY_STATE_TOPIC: TOPIC_EMETER.format(emeter_id=0), @@ -538,6 +555,16 @@ KEY_VALUE_TEMPLATE: TPL_POWER, } DESCRIPTION_SENSOR_EMETER_ACTIVE_POWER = { + KEY_DEVICE_CLASS: DEVICE_CLASS_POWER, + KEY_ENABLED_BY_DEFAULT: True, + KEY_NAME: "EM{emeter_id} active power", + KEY_STATE_CLASS: STATE_CLASS_MEASUREMENT, + KEY_STATE_TOPIC: TOPIC_EMETER1, + KEY_SUGGESTED_DISPLAY_PRECISION: 1, + KEY_UNIT: UNIT_WATT, + KEY_VALUE_TEMPLATE: TPL_EMETER_ACTIVE_POWER, +} +DESCRIPTION_SENSOR_EMETER_PHASE_ACTIVE_POWER = { KEY_DEVICE_CLASS: DEVICE_CLASS_POWER, KEY_ENABLED_BY_DEFAULT: True, KEY_NAME: "Phase {phase} active power", @@ -545,7 +572,7 @@ KEY_STATE_TOPIC: TOPIC_EMETER, KEY_SUGGESTED_DISPLAY_PRECISION: 1, KEY_UNIT: UNIT_WATT, - KEY_VALUE_TEMPLATE: TPL_EMETER_ACTIVE_POWER, + KEY_VALUE_TEMPLATE: TPL_EMETER_PHASE_ACTIVE_POWER, } DESCRIPTION_SENSOR_EMETER_PHASE_TOTAL_ACTIVE_ENERGY = { KEY_DEVICE_CLASS: DEVICE_CLASS_ENERGY, @@ -568,6 +595,16 @@ KEY_VALUE_TEMPLATE: TPL_EMETER_PHASE_TOTAL_ACTIVE_RETURNED_ENERGY, } DESCRIPTION_SENSOR_EMETER_TOTAL_ACTIVE_ENERGY = { + KEY_DEVICE_CLASS: DEVICE_CLASS_ENERGY, + KEY_ENABLED_BY_DEFAULT: True, + KEY_NAME: "EM{emeter_id} total active energy", + KEY_STATE_CLASS: STATE_CLASS_TOTAL_INCREASING, + KEY_STATE_TOPIC: TOPIC_EMDATA1, + KEY_SUGGESTED_DISPLAY_PRECISION: 1, + KEY_UNIT: UNIT_WATTH, + KEY_VALUE_TEMPLATE: TPL_EMETER1_TOTAL_ACTIVE_ENERGY, +} +DESCRIPTION_SENSOR_EMETER0_TOTAL_ACTIVE_ENERGY = { KEY_DEVICE_CLASS: DEVICE_CLASS_ENERGY, KEY_ENABLED_BY_DEFAULT: True, KEY_NAME: "Total active energy", @@ -578,6 +615,16 @@ KEY_VALUE_TEMPLATE: TPL_EMETER_TOTAL_ACTIVE_ENERGY, } DESCRIPTION_SENSOR_EMETER_TOTAL_ACTIVE_RETURNED_ENERGY = { + KEY_DEVICE_CLASS: DEVICE_CLASS_ENERGY, + KEY_ENABLED_BY_DEFAULT: True, + KEY_NAME: "EM{emeter_id} total active returned energy", + KEY_STATE_CLASS: STATE_CLASS_TOTAL_INCREASING, + KEY_STATE_TOPIC: TOPIC_EMDATA1, + KEY_SUGGESTED_DISPLAY_PRECISION: 1, + KEY_UNIT: UNIT_WATTH, + KEY_VALUE_TEMPLATE: TPL_EMETER1_TOTAL_ACTIVE_RETURNED_ENERGY, +} +DESCRIPTION_SENSOR_EMETER0_TOTAL_ACTIVE_RETURNED_ENERGY = { KEY_DEVICE_CLASS: DEVICE_CLASS_ENERGY, KEY_ENABLED_BY_DEFAULT: True, KEY_NAME: "Total active returned energy", @@ -598,6 +645,16 @@ KEY_VALUE_TEMPLATE: TPL_EMETER_TOTAL_ACTIVE_POWER, } DESCRIPTION_SENSOR_EMETER_APPARENT_POWER = { + KEY_DEVICE_CLASS: DEVICE_CLASS_APPARENT_POWER, + KEY_ENABLED_BY_DEFAULT: True, + KEY_NAME: "EM{emeter_id} apparent power", + KEY_STATE_CLASS: STATE_CLASS_MEASUREMENT, + KEY_STATE_TOPIC: TOPIC_EMETER1, + KEY_SUGGESTED_DISPLAY_PRECISION: 1, + KEY_UNIT: UNIT_VA, + KEY_VALUE_TEMPLATE: TPL_EMETER_APPARENT_POWER, +} +DESCRIPTION_SENSOR_EMETER_PHASE_APPARENT_POWER = { KEY_DEVICE_CLASS: DEVICE_CLASS_APPARENT_POWER, KEY_ENABLED_BY_DEFAULT: True, KEY_NAME: "Phase {phase} apparent power", @@ -605,7 +662,7 @@ KEY_STATE_TOPIC: TOPIC_EMETER, KEY_SUGGESTED_DISPLAY_PRECISION: 1, KEY_UNIT: UNIT_VA, - KEY_VALUE_TEMPLATE: TPL_EMETER_APPARENT_POWER, + KEY_VALUE_TEMPLATE: TPL_EMETER_PHASE_APPARENT_POWER, } DESCRIPTION_SENSOR_EMETER_TOTAL_APPARENT_POWER = { KEY_DEVICE_CLASS: DEVICE_CLASS_APPARENT_POWER, @@ -639,11 +696,19 @@ } DESCRIPTION_SENSOR_EMETER_POWER_FACTOR = { KEY_DEVICE_CLASS: DEVICE_CLASS_POWER_FACTOR, - KEY_ENABLED_BY_DEFAULT: True, + KEY_ENABLED_BY_DEFAULT: False, + KEY_NAME: "EM{emeter_id} power factor", + KEY_STATE_CLASS: STATE_CLASS_MEASUREMENT, + KEY_STATE_TOPIC: TOPIC_EMETER1, + KEY_VALUE_TEMPLATE: TPL_EMETER_POWER_FACTOR, +} +DESCRIPTION_SENSOR_EMETER_PHASE_POWER_FACTOR = { + KEY_DEVICE_CLASS: DEVICE_CLASS_POWER_FACTOR, + KEY_ENABLED_BY_DEFAULT: False, KEY_NAME: "Phase {phase} power factor", KEY_STATE_CLASS: STATE_CLASS_MEASUREMENT, KEY_STATE_TOPIC: TOPIC_EMETER, - KEY_VALUE_TEMPLATE: TPL_EMETER_POWER_FACTOR, + KEY_VALUE_TEMPLATE: TPL_EMETER_PHASE_POWER_FACTOR, } DESCRIPTION_SENSOR_POWER_FACTOR_COVER = { KEY_DEVICE_CLASS: DEVICE_CLASS_POWER_FACTOR, @@ -737,6 +802,16 @@ KEY_VALUE_TEMPLATE: TPL_FREQUENCY, } DESCRIPTION_SENSOR_EMETER_FREQUENCY = { + KEY_DEVICE_CLASS: DEVICE_CLASS_FREQUENCY, + KEY_ENABLED_BY_DEFAULT: False, + KEY_NAME: "EM{emeter_id} frequency", + KEY_STATE_CLASS: STATE_CLASS_MEASUREMENT, + KEY_STATE_TOPIC: TOPIC_EMETER1, + KEY_SUGGESTED_DISPLAY_PRECISION: 0, + KEY_UNIT: UNIT_HERTZ, + KEY_VALUE_TEMPLATE: TPL_FREQUENCY, +} +DESCRIPTION_SENSOR_EMETER_PHASE_FREQUENCY = { KEY_DEVICE_CLASS: DEVICE_CLASS_FREQUENCY, KEY_ENABLED_BY_DEFAULT: False, KEY_NAME: "Phase {phase} frequency", @@ -744,17 +819,27 @@ KEY_STATE_TOPIC: TOPIC_EMETER, KEY_SUGGESTED_DISPLAY_PRECISION: 0, KEY_UNIT: UNIT_HERTZ, - KEY_VALUE_TEMPLATE: TPL_EMETER_FREQUENCY, + KEY_VALUE_TEMPLATE: TPL_EMETER_PHASE_FREQUENCY, } DESCRIPTION_SENSOR_EMETER_VOLTAGE = { KEY_DEVICE_CLASS: DEVICE_CLASS_VOLTAGE, - KEY_ENABLED_BY_DEFAULT: True, + KEY_ENABLED_BY_DEFAULT: False, + KEY_NAME: "EM{emeter_id} voltage", + KEY_STATE_CLASS: STATE_CLASS_MEASUREMENT, + KEY_STATE_TOPIC: TOPIC_EMETER1, + KEY_SUGGESTED_DISPLAY_PRECISION: 1, + KEY_UNIT: UNIT_VOLT, + KEY_VALUE_TEMPLATE: TPL_VOLTAGE, +} +DESCRIPTION_SENSOR_EMETER_PHASE_VOLTAGE = { + KEY_DEVICE_CLASS: DEVICE_CLASS_VOLTAGE, + KEY_ENABLED_BY_DEFAULT: False, KEY_NAME: "Phase {phase} voltage", KEY_STATE_CLASS: STATE_CLASS_MEASUREMENT, KEY_STATE_TOPIC: TOPIC_EMETER, KEY_SUGGESTED_DISPLAY_PRECISION: 1, KEY_UNIT: UNIT_VOLT, - KEY_VALUE_TEMPLATE: TPL_EMETER_VOLTAGE, + KEY_VALUE_TEMPLATE: TPL_EMETER_PHASE_VOLTAGE, } DESCRIPTION_SENSOR_VOLTAGE_COVER = { KEY_DEVICE_CLASS: DEVICE_CLASS_VOLTAGE, @@ -1566,10 +1651,10 @@ MODEL_PRO_EM: { ATTR_NAME: "Shelly Pro EM", ATTR_MODEL_ID: "SPEM-002CEBEU50", - ATTR_EMETERS: 1, - ATTR_EMETER_PHASES: ["a", "b"], + ATTR_EMETERS: 2, ATTR_BINARY_SENSORS: {SENSOR_CLOUD: DESCRIPTION_SENSOR_CLOUD}, ATTR_BUTTONS: {BUTTON_RESTART: DESCRIPTION_BUTTON_RESTART}, + ATTR_RELAYS: 1, ATTR_SENSORS: { SENSOR_ETH_IP: DESCRIPTION_SENSOR_ETH_IP, SENSOR_LAST_RESTART: DESCRIPTION_SENSOR_LAST_RESTART, @@ -1577,20 +1662,16 @@ SENSOR_WIFI_IP: DESCRIPTION_SENSOR_WIFI_IP, SENSOR_WIFI_SIGNAL: DESCRIPTION_SENSOR_WIFI_SIGNAL, SENSOR_DEVICE_TEMPERATURE: DESCRIPTION_SENSOR_DEVICE_TEMPERATURE, - SENSOR_TOTAL_CURRENT: DESCRIPTION_SENSOR_TOTAL_CURRENT, - SENSOR_TOTAL_ACTIVE_POWER: DESCRIPTION_SENSOR_EMETER_TOTAL_ACTIVE_POWER, - SENSOR_TOTAL_APPARENT_POWER: DESCRIPTION_SENSOR_EMETER_TOTAL_APPARENT_POWER, - SENSOR_TOTAL_ACTIVE_ENERGY: DESCRIPTION_SENSOR_EMETER_TOTAL_ACTIVE_ENERGY, - SENSOR_TOTAT_ACTIVE_RETURNED_ENERGY: DESCRIPTION_SENSOR_EMETER_TOTAL_ACTIVE_RETURNED_ENERGY, }, ATTR_EMETER_SENSORS: { SENSOR_ACTIVE_POWER: DESCRIPTION_SENSOR_EMETER_ACTIVE_POWER, SENSOR_APPARENT_POWER: DESCRIPTION_SENSOR_EMETER_APPARENT_POWER, SENSOR_CURRENT: DESCRIPTION_SENSOR_EMETER_CURRENT, SENSOR_POWER_FACTOR: DESCRIPTION_SENSOR_EMETER_POWER_FACTOR, - SENSOR_TOTAL_ACTIVE_ENERGY: DESCRIPTION_SENSOR_EMETER_PHASE_TOTAL_ACTIVE_ENERGY, - SENSOR_TOTAT_ACTIVE_RETURNED_ENERGY: DESCRIPTION_SENSOR_EMETER_PHASE_TOTAL_ACTIVE_RETURNED_ENERGY, + SENSOR_TOTAL_ACTIVE_ENERGY: DESCRIPTION_SENSOR_EMETER_TOTAL_ACTIVE_ENERGY, + SENSOR_TOTAT_ACTIVE_RETURNED_ENERGY: DESCRIPTION_SENSOR_EMETER_TOTAL_ACTIVE_RETURNED_ENERGY, SENSOR_VOLTAGE: DESCRIPTION_SENSOR_EMETER_VOLTAGE, + SENSOR_FREQUENCY: DESCRIPTION_SENSOR_EMETER_FREQUENCY, }, ATTR_UPDATES: { UPDATE_FIRMWARE: DESCRIPTION_UPDATE_FIRMWARE, @@ -1616,18 +1697,18 @@ SENSOR_TOTAL_CURRENT: DESCRIPTION_SENSOR_TOTAL_CURRENT, SENSOR_TOTAL_ACTIVE_POWER: DESCRIPTION_SENSOR_EMETER_TOTAL_ACTIVE_POWER, SENSOR_TOTAL_APPARENT_POWER: DESCRIPTION_SENSOR_EMETER_TOTAL_APPARENT_POWER, - SENSOR_TOTAL_ACTIVE_ENERGY: DESCRIPTION_SENSOR_EMETER_TOTAL_ACTIVE_ENERGY, - SENSOR_TOTAT_ACTIVE_RETURNED_ENERGY: DESCRIPTION_SENSOR_EMETER_TOTAL_ACTIVE_RETURNED_ENERGY, + SENSOR_TOTAL_ACTIVE_ENERGY: DESCRIPTION_SENSOR_EMETER0_TOTAL_ACTIVE_ENERGY, + SENSOR_TOTAT_ACTIVE_RETURNED_ENERGY: DESCRIPTION_SENSOR_EMETER0_TOTAL_ACTIVE_RETURNED_ENERGY, }, ATTR_EMETER_SENSORS: { - SENSOR_ACTIVE_POWER: DESCRIPTION_SENSOR_EMETER_ACTIVE_POWER, - SENSOR_APPARENT_POWER: DESCRIPTION_SENSOR_EMETER_APPARENT_POWER, - SENSOR_CURRENT: DESCRIPTION_SENSOR_EMETER_CURRENT, - SENSOR_POWER_FACTOR: DESCRIPTION_SENSOR_EMETER_POWER_FACTOR, + SENSOR_ACTIVE_POWER: DESCRIPTION_SENSOR_EMETER_PHASE_ACTIVE_POWER, + SENSOR_APPARENT_POWER: DESCRIPTION_SENSOR_EMETER_PHASE_APPARENT_POWER, + SENSOR_CURRENT: DESCRIPTION_SENSOR_EMETER_PHASE_CURRENT, + SENSOR_POWER_FACTOR: DESCRIPTION_SENSOR_EMETER_PHASE_POWER_FACTOR, SENSOR_TOTAL_ACTIVE_ENERGY: DESCRIPTION_SENSOR_EMETER_PHASE_TOTAL_ACTIVE_ENERGY, SENSOR_TOTAT_ACTIVE_RETURNED_ENERGY: DESCRIPTION_SENSOR_EMETER_PHASE_TOTAL_ACTIVE_RETURNED_ENERGY, - SENSOR_VOLTAGE: DESCRIPTION_SENSOR_EMETER_VOLTAGE, - SENSOR_FREQUENCY: DESCRIPTION_SENSOR_EMETER_FREQUENCY, + SENSOR_VOLTAGE: DESCRIPTION_SENSOR_EMETER_PHASE_VOLTAGE, + SENSOR_FREQUENCY: DESCRIPTION_SENSOR_EMETER_PHASE_FREQUENCY, }, ATTR_UPDATES: { UPDATE_FIRMWARE: DESCRIPTION_UPDATE_FIRMWARE, @@ -1772,7 +1853,8 @@ def get_switch(relay_id, relay_type, profile): return topic, payload relay_name = ( - device_config[f"switch:{relay_id}"].get(ATTR_NAME) or f"Relay {relay_id}" + device_config.get(f"switch:{relay_id}", {}).get(ATTR_NAME) + or f"Relay {relay_id}" ) payload = { KEY_NAME: relay_name, @@ -1880,10 +1962,14 @@ def get_sensor( sensor_id=None, ): """Create configuration for Shelly sensor entity.""" - if emeter_id is not None: + if emeter_id is not None and emeter_phase is not None: topic = encode_config_topic( f"{disc_prefix}/sensor/{device_id}-{emeter_id}-{emeter_phase}-{sensor}/config" ) + elif emeter_id is not None and emeter_phase is None: + topic = encode_config_topic( + f"{disc_prefix}/sensor/{device_id}-{emeter_id}-{sensor}/config" + ) elif cover_id is not None: topic = encode_config_topic( f"{disc_prefix}/sensor/{device_id}-cover-{cover_id}-{sensor}/config" @@ -1920,9 +2006,12 @@ def get_sensor( ) unique_id = f"{device_id}-{relay_id}-{sensor}".lower() sensor_name = f"{switch_name} {description[KEY_NAME]}" - elif emeter_id is not None: + elif emeter_id is not None and emeter_phase is not None: unique_id = f"{device_id}-{emeter_id}-{emeter_phase}-{sensor}".lower() sensor_name = description[KEY_NAME].format(phase=emeter_phase.upper()) + elif emeter_id is not None and emeter_phase is None: + unique_id = f"{device_id}-{emeter_id}-{sensor}".lower() + sensor_name = description[KEY_NAME].format(emeter_id=emeter_id) elif sensor_id is not None: unique_id = f"{device_id}-{sensor_id}-{sensor}".lower() sensor_name = device_config[f"{sensor}:{sensor_id}"][ATTR_NAME] or description[ @@ -1948,7 +2037,7 @@ def get_sensor( if expire_after: payload[KEY_EXPIRE_AFTER] = expire_after - if emeter_id is not None: + if emeter_id is not None and emeter_phase is not None: payload[KEY_VALUE_TEMPLATE] = description[KEY_VALUE_TEMPLATE].format( phase=emeter_phase ) @@ -2208,11 +2297,16 @@ def configure_device(): config[topic] = payload for emeter_id in range(emeters): - for phase in emeter_phases: + if emeter_phases: + for phase in emeter_phases: + for sensor, description in emeter_sensors.items(): + topic, payload = get_sensor( + sensor, description, emeter_id=emeter_id, emeter_phase=phase + ) + config[topic] = payload + else: for sensor, description in emeter_sensors.items(): - topic, payload = get_sensor( - sensor, description, emeter_id=emeter_id, emeter_phase=phase - ) + topic, payload = get_sensor(sensor, description, emeter_id=emeter_id) config[topic] = payload for relay_id in range(relays):