From 02ccec9b254ba1c7e1dc8439abd03001e8dd1ee2 Mon Sep 17 00:00:00 2001 From: trizmark Date: Fri, 15 Sep 2023 11:09:41 +0100 Subject: [PATCH 1/9] Added a couple of sensors --- custom_components/myenergi/manifest.json | 4 +- custom_components/myenergi/sensor.py | 49 ++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/custom_components/myenergi/manifest.json b/custom_components/myenergi/manifest.json index 5f3936f..85a4f04 100644 --- a/custom_components/myenergi/manifest.json +++ b/custom_components/myenergi/manifest.json @@ -7,6 +7,6 @@ "documentation": "https://github.com/cjne/ha-myenergi", "iot_class": "cloud_polling", "issue_tracker": "https://github.com/cjne/ha-myenergi/issues", - "requirements": ["pymyenergi==0.0.27"], - "version": "0.0.23" + "requirements": ["pymyenergi==0.0.28"], + "version": "0.0.24" } diff --git a/custom_components/myenergi/sensor.py b/custom_components/myenergi/sensor.py index 18766d2..11d05f2 100644 --- a/custom_components/myenergi/sensor.py +++ b/custom_components/myenergi/sensor.py @@ -8,6 +8,7 @@ from homeassistant.const import DEVICE_CLASS_POWER from homeassistant.const import DEVICE_CLASS_TEMPERATURE from homeassistant.const import DEVICE_CLASS_VOLTAGE +from homeassistant.const import DEVICE_CLASS_BATTERY from homeassistant.const import ELECTRIC_POTENTIAL_VOLT from homeassistant.const import ENERGY_KILO_WATT_HOUR from homeassistant.const import FREQUENCY_HERTZ @@ -20,6 +21,7 @@ from pymyenergi import EDDI from pymyenergi import HARVI from pymyenergi import ZAPPI +from pymyenergi import LIBBI from .const import DOMAIN from .entity import MyenergiEntity @@ -486,6 +488,53 @@ async def async_setup_entry(hass, entry, async_add_devices): ), ) ) + elif device.kind == LIBBI: + sensors.append( + MyenergiSensor( + coordinator, + device, + entry, + create_meta( + f"SoC", + "state_of_charge", + DEVICE_CLASS_BATTERY, + PERCENTAGE, + ENTITY_CATEGORY_DIAGNOSTIC, + ), + ) + ) + sensors.append( + MyenergiSensor( + coordinator, + device, + entry, + create_meta( + f"Voltage", + "supply_voltage", + DEVICE_CLASS_VOLTAGE, + ELECTRIC_POTENTIAL_VOLT, + ENTITY_CATEGORY_DIAGNOSTIC, + ICON_VOLT, + STATE_CLASS_MEASUREMENT, + ), + ) + ) + sensors.append( + MyenergiSensor( + coordinator, + device, + entry, + create_meta( + f"Frequency", + "supply_frequency", + None, + FREQUENCY_HERTZ, + ENTITY_CATEGORY_DIAGNOSTIC, + ICON_FREQ, + STATE_CLASS_MEASUREMENT, + ), + ) + ) async_add_devices(sensors) From ea7fe2c72dd37d5d7299b3d5f6d91112a296a640 Mon Sep 17 00:00:00 2001 From: trizmark Date: Fri, 15 Sep 2023 13:34:56 +0100 Subject: [PATCH 2/9] Added device priority configuration --- custom_components/myenergi/number.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/custom_components/myenergi/number.py b/custom_components/myenergi/number.py index 6856111..a91cff0 100644 --- a/custom_components/myenergi/number.py +++ b/custom_components/myenergi/number.py @@ -22,6 +22,8 @@ async def async_setup_entry(hass, entry, async_add_devices): elif device.kind == "eddi": devices.append(HeaterPriorityNumber(coordinator, device, entry)) devices.append(DevicePriorityNumber(coordinator, device, entry)) + elif device.kind == "libbi": + devices.append(DevicePriorityNumber(coordinator, device, entry)) async_add_devices(devices) From 16b62feee1455d5d68bfe0beaebb13a7c7d30336 Mon Sep 17 00:00:00 2001 From: trizmark Date: Fri, 15 Sep 2023 14:50:07 +0100 Subject: [PATCH 3/9] More controls and entities --- custom_components/myenergi/select.py | 38 ++++++++++++++++++++++++++++ custom_components/myenergi/sensor.py | 31 +++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/custom_components/myenergi/select.py b/custom_components/myenergi/select.py index 7fb9741..9f1fe25 100644 --- a/custom_components/myenergi/select.py +++ b/custom_components/myenergi/select.py @@ -4,6 +4,7 @@ from homeassistant.helpers import entity_platform from pymyenergi.eddi import EDDI_MODES from pymyenergi.zappi import CHARGE_MODES +from pymyenergi.libbi import LIBBI_MODES from .const import DOMAIN from .entity import MyenergiEntity @@ -60,6 +61,8 @@ async def async_setup_entry(hass, entry, async_add_devices): "start_eddi_boost", ) devices.append(EddiOperatingModeSelect(coordinator, device, entry)) + elif device.kind == "libbi": + devices.append(LibbiOperatingModeSelect(coordinator, device, entry)) async_add_devices(devices) @@ -132,3 +135,38 @@ async def async_select_option(self, option: str) -> None: @property def options(self): return CHARGE_MODES[1:] + + +class LibbiOperatingModeSelect(MyenergiEntity, SelectEntity): + """myenergi Sensor class.""" + + def __init__(self, coordinator, device, config_entry): + super().__init__(coordinator, device, config_entry) + + @property + def unique_id(self): + """Return a unique ID to use for this entity.""" + return ( + f"{self.config_entry.entry_id}-{self.device.serial_number}-operating_mode" + ) + + @property + def name(self): + """Return the name of the sensor.""" + return f"myenergi {self.device.name} Operating Mode" + + @property + def current_option(self): + """Return the state of the sensor.""" + if self.device.status == "Stopped": + return "Stopped" + return "Normal" + + async def async_select_option(self, option: str) -> None: + """Change the selected option.""" + await self.device.set_operating_mode(option) + self.async_schedule_update_ha_state() + + @property + def options(self): + return LIBBI_MODES diff --git a/custom_components/myenergi/sensor.py b/custom_components/myenergi/sensor.py index 11d05f2..2f66300 100644 --- a/custom_components/myenergi/sensor.py +++ b/custom_components/myenergi/sensor.py @@ -31,6 +31,7 @@ ICON_VOLT = "mdi:lightning-bolt" ICON_FREQ = "mdi:sine-wave" +ICON_POWER = "mdi:flash" def create_meta( @@ -535,6 +536,36 @@ async def async_setup_entry(hass, entry, async_add_devices): ), ) ) + sensors.append( + MyenergiSensor( + coordinator, + device, + entry, + create_meta( + f"Inverter size", + "inverter_size", + None, + ENERGY_KILO_WATT_HOUR, + ENTITY_CATEGORY_DIAGNOSTIC, + ICON_POWER, + ), + ) + ) + sensors.append( + MyenergiSensor( + coordinator, + device, + entry, + create_meta( + f"Battery size", + "battery_size", + None, + ENERGY_KILO_WATT_HOUR, + ENTITY_CATEGORY_DIAGNOSTIC, + ICON_POWER, + ) + ) + ) async_add_devices(sensors) From 21e7a1e37753720e15a818bc2d863c8818f54010 Mon Sep 17 00:00:00 2001 From: trizmark Date: Sun, 17 Sep 2023 19:01:09 +0100 Subject: [PATCH 4/9] Updated mode select; added sensors --- custom_components/myenergi/select.py | 9 ++++++--- custom_components/myenergi/sensor.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/custom_components/myenergi/select.py b/custom_components/myenergi/select.py index 9f1fe25..3d5ad2c 100644 --- a/custom_components/myenergi/select.py +++ b/custom_components/myenergi/select.py @@ -5,6 +5,9 @@ from pymyenergi.eddi import EDDI_MODES from pymyenergi.zappi import CHARGE_MODES from pymyenergi.libbi import LIBBI_MODES +from pymyenergi.libbi import LIBBI_MODE_NAMES +from pymyenergi.libbi import MODE_STOPPED +from pymyenergi.libbi import MODE_NORMAL from .const import DOMAIN from .entity import MyenergiEntity @@ -158,9 +161,9 @@ def name(self): @property def current_option(self): """Return the state of the sensor.""" - if self.device.status == "Stopped": - return "Stopped" - return "Normal" + if self.device.local_mode == LIBBI_MODE_NAMES[MODE_STOPPED]: + return LIBBI_MODES[MODE_STOPPED] + return LIBBI_MODES[MODE_NORMAL] async def async_select_option(self, option: str) -> None: """Change the selected option.""" diff --git a/custom_components/myenergi/sensor.py b/custom_components/myenergi/sensor.py index 2f66300..ad08f59 100644 --- a/custom_components/myenergi/sensor.py +++ b/custom_components/myenergi/sensor.py @@ -32,6 +32,7 @@ ICON_VOLT = "mdi:lightning-bolt" ICON_FREQ = "mdi:sine-wave" ICON_POWER = "mdi:flash" +ICON_HOME_BATTERY = "mdi:home-battery" def create_meta( @@ -566,6 +567,33 @@ async def async_setup_entry(hass, entry, async_add_devices): ) ) ) + """ expose this temporarily (it's mapped to operating mode)""" + sensors.append( + MyenergiSensor( + coordinator, + device, + entry, + create_meta( + f"Local mode", + "local_mode", + ) + ) + ) + sensors.append( + MyenergiSensor( + coordinator, + device, + entry, + create_meta( + f"Status", + "status", + None, + None, + None, + ICON_HOME_BATTERY, + ) + ) + ) async_add_devices(sensors) From d311fd327cf663807d3900fc875563994ae80a03 Mon Sep 17 00:00:00 2001 From: trizmark Date: Sun, 17 Sep 2023 22:11:14 +0100 Subject: [PATCH 5/9] Add enegy sensors --- custom_components/myenergi/sensor.py | 40 ++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/custom_components/myenergi/sensor.py b/custom_components/myenergi/sensor.py index ad08f59..87a3802 100644 --- a/custom_components/myenergi/sensor.py +++ b/custom_components/myenergi/sensor.py @@ -594,6 +594,46 @@ async def async_setup_entry(hass, entry, async_add_devices): ) ) ) + sensors.append( + MyenergiCTEnergySensor( + coordinator, + device, + entry, + "grid_import" + ) + ) + sensors.append( + MyenergiCTEnergySensor( + coordinator, + device, + entry, + "grid_export" + ) + ) + sensors.append( + MyenergiCTEnergySensor( + coordinator, + device, + entry, + "battery_charge" + ) + ) + sensors.append( + MyenergiCTEnergySensor( + coordinator, + device, + entry, + "battery_discharge" + ) + ) + sensors.append( + MyenergiCTEnergySensor( + coordinator, + device, + entry, + "generated" + ) + ) async_add_devices(sensors) From d7d77c554bc8963e166d16a2bf0fe60b14202617 Mon Sep 17 00:00:00 2001 From: trizmark Date: Mon, 18 Sep 2023 11:04:40 +0100 Subject: [PATCH 6/9] Moved energy stats from diagnostic to sensors --- custom_components/myenergi/sensor.py | 61 +++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/custom_components/myenergi/sensor.py b/custom_components/myenergi/sensor.py index 87a3802..637a143 100644 --- a/custom_components/myenergi/sensor.py +++ b/custom_components/myenergi/sensor.py @@ -501,7 +501,6 @@ async def async_setup_entry(hass, entry, async_add_devices): "state_of_charge", DEVICE_CLASS_BATTERY, PERCENTAGE, - ENTITY_CATEGORY_DIAGNOSTIC, ), ) ) @@ -595,43 +594,83 @@ async def async_setup_entry(hass, entry, async_add_devices): ) ) sensors.append( - MyenergiCTEnergySensor( + MyenergiSensor( coordinator, device, entry, - "grid_import" + create_meta( + f"Grid import today", + "grid_import", + DEVICE_CLASS_ENERGY, + ENERGY_KILO_WATT_HOUR, + None, + None, + STATE_CLASS_TOTAL_INCREASING, + ) ) ) sensors.append( - MyenergiCTEnergySensor( + MyenergiSensor( coordinator, device, entry, - "grid_export" + create_meta( + f"Grid export today", + "grid_export", + DEVICE_CLASS_ENERGY, + ENERGY_KILO_WATT_HOUR, + None, + None, + STATE_CLASS_TOTAL_INCREASING, + ) ) ) sensors.append( - MyenergiCTEnergySensor( + MyenergiSensor( coordinator, device, entry, - "battery_charge" + create_meta( + f"Battery charge today", + "battery_charge", + DEVICE_CLASS_ENERGY, + ENERGY_KILO_WATT_HOUR, + None, + None, + STATE_CLASS_TOTAL_INCREASING, + ) ) ) sensors.append( - MyenergiCTEnergySensor( + MyenergiSensor( coordinator, device, entry, - "battery_discharge" + create_meta( + f"Battery discharge today", + "battery_discharge", + DEVICE_CLASS_ENERGY, + ENERGY_KILO_WATT_HOUR, + None, + None, + STATE_CLASS_TOTAL_INCREASING, + ) ) ) sensors.append( - MyenergiCTEnergySensor( + MyenergiSensor( coordinator, device, entry, - "generated" + create_meta( + f"Solar generation today", + "generated", + DEVICE_CLASS_ENERGY, + ENERGY_KILO_WATT_HOUR, + None, + None, + STATE_CLASS_TOTAL_INCREASING, + ) ) ) async_add_devices(sensors) From 5729c5174c3358d6eae1f8a65cbf52c64f3bd988 Mon Sep 17 00:00:00 2001 From: trizmark Date: Mon, 18 Sep 2023 11:10:51 +0100 Subject: [PATCH 7/9] Remove exposed local mode --- custom_components/myenergi/sensor.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/custom_components/myenergi/sensor.py b/custom_components/myenergi/sensor.py index 637a143..536206e 100644 --- a/custom_components/myenergi/sensor.py +++ b/custom_components/myenergi/sensor.py @@ -566,18 +566,6 @@ async def async_setup_entry(hass, entry, async_add_devices): ) ) ) - """ expose this temporarily (it's mapped to operating mode)""" - sensors.append( - MyenergiSensor( - coordinator, - device, - entry, - create_meta( - f"Local mode", - "local_mode", - ) - ) - ) sensors.append( MyenergiSensor( coordinator, From cdfee31fc135d08d5f951b9193b4ffb67a9699ef Mon Sep 17 00:00:00 2001 From: trizmark Date: Mon, 18 Sep 2023 12:04:44 +0100 Subject: [PATCH 8/9] Fix uid generation error --- custom_components/myenergi/sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/myenergi/sensor.py b/custom_components/myenergi/sensor.py index 536206e..dc5c909 100644 --- a/custom_components/myenergi/sensor.py +++ b/custom_components/myenergi/sensor.py @@ -673,7 +673,7 @@ def __init__(self, coordinator, config_entry, meta): @property def unique_id(self): """Return a unique ID to use for this entity.""" - return f"{self.config_entry.entry_id}-{self.coordinator.client.serial_number}-{self.meta['prop_name']}" + return f"{self.config_entry.entry_id}-hub-{self.coordinator.client.serial_number}-{self.meta['prop_name']}" @property def name(self): From 6b94b985600d1acdca6a1550d3235237c2285eb4 Mon Sep 17 00:00:00 2001 From: trizmark Date: Fri, 22 Sep 2023 09:43:47 +0100 Subject: [PATCH 9/9] Update reqs and bump version --- custom_components/myenergi/const.py | 2 +- custom_components/myenergi/manifest.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/custom_components/myenergi/const.py b/custom_components/myenergi/const.py index a57e08e..297be6c 100644 --- a/custom_components/myenergi/const.py +++ b/custom_components/myenergi/const.py @@ -3,7 +3,7 @@ NAME = "myenergi" DOMAIN = "myenergi" DOMAIN_DATA = f"{DOMAIN}_data" -VERSION = "0.0.23" +VERSION = "0.0.24" ATTRIBUTION = "Data provided by myenergi" ISSUE_URL = "https://github.com/CJNE/ha-myenergi/issues" diff --git a/custom_components/myenergi/manifest.json b/custom_components/myenergi/manifest.json index 85a4f04..796d802 100644 --- a/custom_components/myenergi/manifest.json +++ b/custom_components/myenergi/manifest.json @@ -7,6 +7,6 @@ "documentation": "https://github.com/cjne/ha-myenergi", "iot_class": "cloud_polling", "issue_tracker": "https://github.com/cjne/ha-myenergi/issues", - "requirements": ["pymyenergi==0.0.28"], + "requirements": ["pymyenergi==0.0.29"], "version": "0.0.24" }