diff --git a/custom_components/ferroamp/sensor.py b/custom_components/ferroamp/sensor.py index 2959bfb..2ffdf5e 100644 --- a/custom_components/ferroamp/sensor.py +++ b/custom_components/ferroamp/sensor.py @@ -161,8 +161,8 @@ def sso_event_received(msg): if new: sensors = sso_sensors[sso_id] = [ VoltageFerroampSensor( - f"{device_name} PV String Voltage", - slug, + "PV String Voltage", + device_id, "upv", "mdi:current-dc", device_id, @@ -173,8 +173,8 @@ def sso_event_received(msg): model=model ), CurrentFerroampSensor( - f"{device_name} PV String Current", - slug, + "PV String Current", + device_id, "ipv", "mdi:current-dc", device_id, @@ -185,8 +185,8 @@ def sso_event_received(msg): model=model ), CalculatedPowerFerroampSensor( - f"{device_name} PV String Power", - slug, + "PV String Power", + device_id, "upv", "ipv", "mdi:solar-power", @@ -197,8 +197,8 @@ def sso_event_received(msg): model=model ), EnergyFerroampSensor( - f"{device_name} Total Energy", - slug, + "Total Energy", + device_id, "wpv", "mdi:solar-power", device_id, @@ -210,8 +210,8 @@ def sso_event_received(msg): state_class=SensorStateClass.TOTAL_INCREASING ), FaultcodeFerroampSensor( - f"{device_name} Faultcode", - slug, + "Faultcode", + device_id, "faultcode", device_id, device_name, @@ -221,8 +221,8 @@ def sso_event_received(msg): model=model ), RelayStatusFerroampSensor( - f"{device_name} Relay Status", - slug, + "Relay Status", + device_id, "relaystatus", device_id, device_name, @@ -231,8 +231,8 @@ def sso_event_received(msg): model=model ), TemperatureFerroampSensor( - f"{device_name} PCB Temperature", - slug, + "PCB Temperature", + device_id, "temp", device_id, device_name, @@ -258,8 +258,8 @@ def eso_event_received(msg): if new: sensors = eso_sensors[eso_id] = [ VoltageFerroampSensor( - f"{device_name} Battery Voltage", - slug, + "Battery Voltage", + device_id, "ubat", "mdi:battery", device_id, @@ -269,8 +269,8 @@ def eso_event_received(msg): config_id, ), CurrentFerroampSensor( - f"{device_name} Battery Current", - slug, + "Battery Current", + device_id, "ibat", "mdi:battery", device_id, @@ -280,8 +280,8 @@ def eso_event_received(msg): config_id ), CalculatedPowerFerroampSensor( - f"{device_name} Battery Power", - slug, + "Battery Power", + device_id, "ubat", "ibat", "mdi:battery", @@ -291,8 +291,8 @@ def eso_event_received(msg): config_id, ), EnergyFerroampSensor( - f"{device_name} Total Energy Produced", - slug, + "Total Energy Produced", + device_id, "wbatprod", "mdi:battery-plus", device_id, @@ -303,8 +303,8 @@ def eso_event_received(msg): state_class=SensorStateClass.TOTAL_INCREASING, ), EnergyFerroampSensor( - f"{device_name} Total Energy Consumed", - slug, + "Total Energy Consumed", + device_id, "wbatcons", "mdi:battery-minus", device_id, @@ -315,8 +315,8 @@ def eso_event_received(msg): state_class=SensorStateClass.TOTAL_INCREASING, ), BatteryFerroampSensor( - f"{device_name} State of Charge", - slug, + "State of Charge", + device_id, "soc", device_id, device_name, @@ -325,8 +325,8 @@ def eso_event_received(msg): config_id, ), FaultcodeFerroampSensor( - f"{device_name} Faultcode", - slug, + "Faultcode", + device_id, "faultcode", device_id, device_name, @@ -335,8 +335,8 @@ def eso_event_received(msg): config_id, ), RelayStatusFerroampSensor( - f"{device_name} Relay Status", - slug, + "Relay Status", + device_id, "relaystatus", device_id, device_name, @@ -344,8 +344,8 @@ def eso_event_received(msg): config_id, ), TemperatureFerroampSensor( - f"{device_name} PCB Temperature", - slug, + "PCB Temperature", + device_id, "temp", device_id, device_name, @@ -362,6 +362,8 @@ def esm_event_received(msg): event = json.loads(msg.payload) esm_id = event["id"]["val"] model = None + device_id = f"{slug}_esm_{esm_id}" + device_name = f"ESM {esm_id}" match = REGEX_ESM_ID.match(esm_id) if match is not None and match.group(2) is not None and match.group(1) is not None: migrate_entities( @@ -374,15 +376,15 @@ def esm_event_received(msg): ) esm_id = match.group(2) model = match.group(1) - device_id = f"{slug}_esm_{esm_id}" - device_name = f"ESM {esm_id}" + device_id = f"{slug}_esm_{esm_id}" + device_name = f"ESM {esm_id}" store, new = get_store(device_id) sensors = esm_sensors.get(esm_id) if new: sensors = esm_sensors[esm_id] = [ StringValFerroampSensor( - f"{device_name} Status", - slug, + "Status", + device_id, "status", "", "mdi:traffic-light", @@ -393,8 +395,8 @@ def esm_event_received(msg): model=model ), PercentageFerroampSensor( - f"{device_name} State of Health", - slug, + "State of Health", + device_id, "soh", device_id, device_name, @@ -404,8 +406,8 @@ def esm_event_received(msg): model=model ), BatteryFerroampSensor( - f"{device_name} State of Charge", - slug, + "State of Charge", + device_id, "soc", device_id, device_name, @@ -415,8 +417,8 @@ def esm_event_received(msg): model=model ), IntValFerroampSensor( - f"{device_name} Rated Capacity", - slug, + "Rated Capacity", + device_id, "ratedCapacity", ENERGY_WATT_HOUR, "mdi:battery", @@ -427,8 +429,8 @@ def esm_event_received(msg): model=model ), PowerFerroampSensor( - f"{device_name} Rated Power", - slug, + "Rated Power", + device_id, "ratedPower", "mdi:battery", device_id, @@ -564,6 +566,7 @@ class FerroampSensor(SensorEntity, RestoreEntity): def __init__(self, name, entity_prefix, unit: str | None, icon, device_id, device_name, interval, config_id, **kwargs): """Initialize the sensor.""" self._attr_name = name + self._attr_has_entity_name = True self._attr_unit_of_measurement = unit self._attr_native_unit_of_measurement = unit self._attr_icon = icon diff --git a/hacs.json b/hacs.json index 4adf99a..6885db7 100644 --- a/hacs.json +++ b/hacs.json @@ -1,4 +1,4 @@ { "name": "Ferroamp Sensors", - "homeassistant": "2021.12.0b1" + "homeassistant": "2022.8.0b0" } diff --git a/requirements.test.txt b/requirements.test.txt index 1db774b..2fdfaa6 100644 --- a/requirements.test.txt +++ b/requirements.test.txt @@ -1,6 +1,5 @@ # Strictly for tests -# TODO: Replace master-branch version when a new release is available -pytest-homeassistant-custom-component==0.9.4 +pytest-homeassistant-custom-component==0.10.2 # From our manifest.json for our custom component aiohttp_cors==0.7.0 paho-mqtt==1.6.1 diff --git a/tests/test_sensor.py b/tests/test_sensor.py index 06504b2..a30fd7a 100644 --- a/tests/test_sensor.py +++ b/tests/test_sensor.py @@ -140,7 +140,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 233.81, 'L3': 231.18, 'device_class': 'voltage', - 'friendly_name': 'External Voltage', + 'friendly_name': 'EnergyHub External Voltage', 'icon': 'mdi:current-ac', 'state_class': 'measurement', 'unit_of_measurement': 'V' @@ -153,7 +153,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 9.85, 'L3': 9.85, 'device_class': 'current', - 'friendly_name': 'Inverter RMS current', + 'friendly_name': 'EnergyHub Inverter RMS current', 'icon': 'mdi:current-dc', 'state_class': 'measurement', 'unit_of_measurement': 'A' @@ -166,7 +166,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 2.65, 'L3': 2.72, 'device_class': 'current', - 'friendly_name': 'Inverter reactive current', + 'friendly_name': 'EnergyHub Inverter reactive current', 'icon': 'mdi:current-dc', 'state_class': 'measurement', 'unit_of_measurement': 'A' @@ -179,7 +179,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 8.9, 'L3': 7.49, 'device_class': 'current', - 'friendly_name': 'Grid Current', + 'friendly_name': 'EnergyHub Grid Current', 'icon': 'mdi:current-ac', 'state_class': 'measurement', 'unit_of_measurement': 'A' @@ -188,7 +188,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): state = hass.states.get("sensor.ferroamp_estimated_grid_frequency") assert state.state == "50" assert state.attributes == { - 'friendly_name': 'Estimated Grid Frequency', + 'friendly_name': 'EnergyHub Estimated Grid Frequency', 'icon': 'mdi:sine-wave', 'unit_of_measurement': 'Hz' } @@ -200,7 +200,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 1.98, 'L3': 3.28, 'device_class': 'current', - 'friendly_name': 'Grid Reactive Current', + 'friendly_name': 'EnergyHub Grid Reactive Current', 'icon': 'mdi:current-ac', 'state_class': 'measurement', 'unit_of_measurement': 'A' @@ -213,7 +213,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': -12.53, 'L3': -10.06, 'device_class': 'current', - 'friendly_name': 'External Active Current', + 'friendly_name': 'EnergyHub External Active Current', 'icon': 'mdi:current-ac', 'state_class': 'measurement', 'unit_of_measurement': 'A' @@ -226,7 +226,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 0, 'L3': 0, 'device_class': 'current', - 'friendly_name': 'Adaptive Current Equalization', + 'friendly_name': 'EnergyHub Adaptive Current Equalization', 'icon': 'mdi:current-ac', 'state_class': 'measurement', 'unit_of_measurement': 'A' @@ -239,7 +239,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': -2071.57, 'L3': -1644.5, 'device_class': 'power', - 'friendly_name': 'Grid Power', + 'friendly_name': 'EnergyHub Grid Power', 'icon': 'mdi:transmission-tower', 'state_class': 'measurement', 'unit_of_measurement': 'W' @@ -252,7 +252,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 327.35, 'L3': 536.18, 'device_class': 'power', - 'friendly_name': 'Grid Power Reactive', + 'friendly_name': 'EnergyHub Grid Power Reactive', 'icon': 'mdi:transmission-tower', 'state_class': 'measurement', 'unit_of_measurement': 'W' @@ -265,7 +265,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': -2263.35, 'L3': -2234.62, 'device_class': 'power', - 'friendly_name': 'Inverter Power, active', + 'friendly_name': 'EnergyHub Inverter Power, active', 'icon': 'mdi:solar-power', 'state_class': 'measurement', 'unit_of_measurement': 'W' @@ -278,7 +278,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 438.12, 'L3': 444.64, 'device_class': 'power', - 'friendly_name': 'Inverter Power, reactive', + 'friendly_name': 'EnergyHub Inverter Power, reactive', 'icon': 'mdi:solar-power', 'state_class': 'measurement', 'unit_of_measurement': 'W' @@ -291,7 +291,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 191.78, 'L3': 590.12, 'device_class': 'power', - 'friendly_name': 'Consumption Power', + 'friendly_name': 'EnergyHub Consumption Power', 'icon': 'mdi:power-plug', 'state_class': 'measurement', 'unit_of_measurement': 'W' @@ -304,7 +304,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': -110.77, 'L3': 91.54, 'device_class': 'power', - 'friendly_name': 'Consumption Power Reactive', + 'friendly_name': 'EnergyHub Consumption Power Reactive', 'icon': 'mdi:power-plug', 'state_class': 'measurement', 'unit_of_measurement': 'W' @@ -317,7 +317,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 310.57, 'L3': 167.93, 'device_class': 'energy', - 'friendly_name': 'External Energy Produced', + 'friendly_name': 'EnergyHub External Energy Produced', 'icon': 'mdi:power-plug', 'state_class': 'total_increasing', 'unit_of_measurement': 'kWh' @@ -330,7 +330,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 1490.26, 'L3': 2810.7, 'device_class': 'energy', - 'friendly_name': 'External Energy Consumed', + 'friendly_name': 'EnergyHub External Energy Consumed', 'icon': 'mdi:power-plug', 'state_class': 'total_increasing', 'unit_of_measurement': 'kWh' @@ -343,7 +343,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 725.23, 'L3': 714.16, 'device_class': 'energy', - 'friendly_name': 'Inverter Energy Produced', + 'friendly_name': 'EnergyHub Inverter Energy Produced', 'icon': 'mdi:power-plug', 'state_class': 'total_increasing', 'unit_of_measurement': 'kWh' @@ -356,7 +356,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 409.75, 'L3': 403.32, 'device_class': 'energy', - 'friendly_name': 'Inverter Energy Consumed', + 'friendly_name': 'EnergyHub Inverter Energy Consumed', 'icon': 'mdi:power-plug', 'state_class': 'total_increasing', 'unit_of_measurement': 'kWh' @@ -369,7 +369,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 5.01, 'L3': 0.0, 'device_class': 'energy', - 'friendly_name': 'Load Energy Produced', + 'friendly_name': 'EnergyHub Load Energy Produced', 'icon': 'mdi:power-plug', 'state_class': 'total_increasing', 'unit_of_measurement': 'kWh' @@ -382,7 +382,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 1530.34, 'L3': 3014.51, 'device_class': 'energy', - 'friendly_name': 'Load Energy Consumed', + 'friendly_name': 'EnergyHub Load Energy Consumed', 'icon': 'mdi:power-plug', 'state_class': 'total_increasing', 'unit_of_measurement': 'kWh' @@ -392,7 +392,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): assert state.state == "1228" assert state.attributes == { 'device_class': 'energy', - 'friendly_name': 'Total Solar Energy', + 'friendly_name': 'EnergyHub Total Solar Energy', 'icon': 'mdi:solar-power', 'state_class': 'total_increasing', 'unit_of_measurement': 'kWh' @@ -402,7 +402,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): assert state.state == "1366" assert state.attributes == { 'device_class': 'energy', - 'friendly_name': 'Battery Energy Produced', + 'friendly_name': 'EnergyHub Battery Energy Produced', 'icon': 'mdi:battery-plus', 'state_class': 'total_increasing', 'unit_of_measurement': 'kWh' @@ -412,7 +412,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): assert state.state == "1242" assert state.attributes == { 'device_class': 'energy', - 'friendly_name': 'Battery Energy Consumed', + 'friendly_name': 'EnergyHub Battery Energy Consumed', 'icon': 'mdi:battery-minus', 'state_class': 'total_increasing', 'unit_of_measurement': 'kWh' @@ -421,7 +421,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): state = hass.states.get("sensor.ferroamp_system_state") assert state.state == "4097" assert state.attributes == { - 'friendly_name': 'System State', + 'friendly_name': 'EnergyHub System State', 'icon': 'mdi:traffic-light', 'unit_of_measurement': '' } @@ -430,7 +430,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): assert state.state == "0" assert state.attributes == { 'device_class': 'voltage', - 'friendly_name': 'DC Link Voltage', + 'friendly_name': 'EnergyHub DC Link Voltage', 'icon': 'mdi:current-ac', 'neg': -383.96, 'pos': 384.31, @@ -442,7 +442,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): assert state.state == "80" assert state.attributes == { 'device_class': 'battery', - 'friendly_name': 'System State of Charge', + 'friendly_name': 'EnergyHub System State of Charge', 'icon': 'mdi:battery-80', 'state_class': 'measurement', 'unit_of_measurement': '%' @@ -451,7 +451,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): state = hass.states.get("sensor.ferroamp_system_state_of_health") assert state.state == "99" assert state.attributes == { - 'friendly_name': 'System State of Health', + 'friendly_name': 'EnergyHub System State of Health', 'icon': 'mdi:battery-90', 'state_class': 'measurement', 'unit_of_measurement': '%' @@ -460,7 +460,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): state = hass.states.get("sensor.ferroamp_apparent_power") assert state.state == "5549" assert state.attributes == { - 'friendly_name': 'Apparent power', + 'friendly_name': 'EnergyHub Apparent power', 'icon': 'mdi:transmission-tower', 'unit_of_measurement': 'VA' } @@ -469,7 +469,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): assert state.state == "10108" assert state.attributes == { 'device_class': 'power', - 'friendly_name': 'Solar Power', + 'friendly_name': 'EnergyHub Solar Power', 'icon': 'mdi:solar-power', 'state_class': 'measurement', 'unit_of_measurement': 'W' @@ -479,7 +479,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): assert state.state == "-3219" assert state.attributes == { 'device_class': 'power', - 'friendly_name': 'Battery Power', + 'friendly_name': 'EnergyHub Battery Power', 'icon': 'mdi:battery', 'state_class': 'measurement', 'unit_of_measurement': 'W' @@ -488,7 +488,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): state = hass.states.get("sensor.ferroamp_total_rated_capacity_of_all_batteries") assert state.state == "15300" assert state.attributes == { - 'friendly_name': 'Total rated capacity of all batteries', + 'friendly_name': 'EnergyHub Total rated capacity of all batteries', 'icon': 'mdi:battery', 'unit_of_measurement': 'Wh' } @@ -500,7 +500,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 29.05, 'L3': 33.93, 'device_class': 'current', - 'friendly_name': 'Available active current for load balancing', + 'friendly_name': 'EnergyHub Available active current for load balancing', 'icon': 'mdi:current-ac', 'state_class': 'measurement', 'unit_of_measurement': 'A' @@ -513,7 +513,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): 'L2': 26.31, 'L3': 29.69, 'device_class': 'current', - 'friendly_name': 'Available RMS current for load balancing', + 'friendly_name': 'EnergyHub Available RMS current for load balancing', 'icon': 'mdi:current-ac', 'state_class': 'measurement', 'unit_of_measurement': 'A' @@ -523,7 +523,7 @@ async def test_setting_ehub_sensor_values_via_mqtt_message(hass, mqtt_mock): assert state.state == "29" assert state.attributes == { 'device_class': 'current', - 'friendly_name': 'Available three phase active current for load balancing', + 'friendly_name': 'EnergyHub Available three phase active current for load balancing', 'icon': 'mdi:current-ac', 'state_class': 'measurement', 'unit_of_measurement': 'A' @@ -1458,7 +1458,7 @@ async def test_control_command(hass, mqtt_mock): state = hass.states.get("sensor.ferroamp_control_status") assert state.state == "charge (5000)" assert state.attributes == { - 'friendly_name': 'Control Status', + 'friendly_name': 'EnergyHub Control Status', 'icon': 'mdi:cog-transfer-outline', 'transId': 'abc-123', 'status': None, @@ -1479,7 +1479,7 @@ async def test_control_command(hass, mqtt_mock): state = hass.states.get("sensor.ferroamp_control_status") assert state.state == "charge (5000)" assert state.attributes == { - 'friendly_name': 'Control Status', + 'friendly_name': 'EnergyHub Control Status', 'icon': 'mdi:cog-transfer-outline', 'transId': 'abc-123', 'status': None, @@ -1497,7 +1497,7 @@ async def test_control_command(hass, mqtt_mock): state = hass.states.get("sensor.ferroamp_control_status") assert state.state == "charge (5000)" assert state.attributes == { - 'friendly_name': 'Control Status', + 'friendly_name': 'EnergyHub Control Status', 'icon': 'mdi:cog-transfer-outline', 'transId': 'abc-123', 'status': "ack", @@ -1515,7 +1515,7 @@ async def test_control_command(hass, mqtt_mock): state = hass.states.get("sensor.ferroamp_control_status") assert state.state == "charge (5000)" assert state.attributes == { - 'friendly_name': 'Control Status', + 'friendly_name': 'EnergyHub Control Status', 'icon': 'mdi:cog-transfer-outline', 'transId': 'abc-123', 'status': "nack", @@ -1548,7 +1548,7 @@ async def test_control_command_restore_state(hass, mqtt_mock): state = hass.states.get("sensor.ferroamp_control_status") assert state.state == "charge (5000)" assert state.attributes == { - 'friendly_name': 'Control Status', + 'friendly_name': 'EnergyHub Control Status', 'icon': 'mdi:cog-transfer-outline', 'transId': 'abc-123', 'status': None, @@ -1708,7 +1708,7 @@ def msg(l1, l2, l3) -> str: 'L2': 310.57, 'L3': 167.93, 'device_class': 'energy', - 'friendly_name': 'External Energy Produced', + 'friendly_name': 'EnergyHub External Energy Produced', 'icon': 'mdi:power-plug', 'state_class': 'total_increasing', 'unit_of_measurement': 'kWh' @@ -1752,6 +1752,6 @@ async def test_extapi_version_response(hass, mqtt_mock): state = hass.states.get("sensor.ferroamp_extapi_version") assert state.state == "1.2.3" assert state.attributes == { - 'friendly_name': 'Extapi Version', + 'friendly_name': 'EnergyHub Extapi Version', 'icon': 'mdi:counter' }