diff --git a/README.md b/README.md index 0be335a..e39bf62 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,4 @@ Based on [bluetti_mqtt](https://github.com/warhammerkid/bluetti_mqtt). ### Available sensors: All sensors which are available in bluetti_mqtt (Based on [this file](https://github.com/warhammerkid/bluetti_mqtt/blob/main/bluetti_mqtt/mqtt_client.py)) +excluding battery pack fields. diff --git a/custom_components/bluetti_bt/binary_sensor.py b/custom_components/bluetti_bt/binary_sensor.py index 58e5622..b03f6fe 100644 --- a/custom_components/bluetti_bt/binary_sensor.py +++ b/custom_components/bluetti_bt/binary_sensor.py @@ -20,10 +20,14 @@ from homeassistant.helpers.update_coordinator import ( ) from bluetti_mqtt.bluetooth import build_device -from bluetti_mqtt.mqtt_client import NORMAL_DEVICE_FIELDS, MqttFieldType +from bluetti_mqtt.mqtt_client import ( + NORMAL_DEVICE_FIELDS, + DC_INPUT_FIELDS, + MqttFieldType, +) from . import device_info as dev_info, get_unique_id -from .const import DOMAIN +from .const import DOMAIN, ADDITIONAL_DEVICE_FIELDS from .coordinator import PollingCoordinator _LOGGER = logging.getLogger(__name__) @@ -47,7 +51,10 @@ async def async_setup_entry( bluetti_device = build_device(address, device_name) sensors_to_add = [] - for field_key, field_config in NORMAL_DEVICE_FIELDS.items(): + all_fields = NORMAL_DEVICE_FIELDS + all_fields.update(DC_INPUT_FIELDS) + all_fields.update(ADDITIONAL_DEVICE_FIELDS) + for field_key, field_config in all_fields.items(): if bluetti_device.has_field(field_key): if field_config.type == MqttFieldType.BOOL: category = None diff --git a/custom_components/bluetti_bt/const.py b/custom_components/bluetti_bt/const.py index f25090c..008cc6d 100644 --- a/custom_components/bluetti_bt/const.py +++ b/custom_components/bluetti_bt/const.py @@ -1,6 +1,28 @@ """Constants for the Bluetti BT integration.""" +from bluetti_mqtt.mqtt_client import MqttFieldConfig, MqttFieldType + DOMAIN = "bluetti_bt" MANUFACTURER = "Bluetti" CONF_OPTIONS = "options" + +DIAGNOSTIC_FIELDS = [ + "bcu_version", + "safety_module_version", +] + +ADDITIONAL_DEVICE_FIELDS = { + "bcu_version": MqttFieldConfig( + type=MqttFieldType.NUMERIC, + setter=False, + advanced=False, + home_assistant_extra={"name": "BCU Version"}, + ), + "safety_module_version": MqttFieldConfig( + type=MqttFieldType.NUMERIC, + setter=False, + advanced=False, + home_assistant_extra={"name": "Safety Module Version"}, + ), +} diff --git a/custom_components/bluetti_bt/coordinator.py b/custom_components/bluetti_bt/coordinator.py index c743ecd..d90d02e 100644 --- a/custom_components/bluetti_bt/coordinator.py +++ b/custom_components/bluetti_bt/coordinator.py @@ -31,7 +31,7 @@ _LOGGER = logging.getLogger(__name__) class DummyDevice(BluettiDevice): - """Dummy device. + """Dummy device used to add more fields to existing devices. Changes made here are only temporary and should also be contributed to https://github.com/warhammerkid/bluetti_mqtt @@ -45,6 +45,15 @@ class DummyDevice(BluettiDevice): @property def polling_commands(self) -> List[ReadHoldingRegisters]: + if self.type == "EP600": + return [ + ReadHoldingRegisters(100, 62), + ReadHoldingRegisters(2022, 6), + ReadHoldingRegisters(6101, 7), + ReadHoldingRegisters(6175, 2), + ReadHoldingRegisters(6181, 2), + ] + return self._parent.polling_commands @property diff --git a/custom_components/bluetti_bt/sensor.py b/custom_components/bluetti_bt/sensor.py index e72dcde..8fb2d8e 100644 --- a/custom_components/bluetti_bt/sensor.py +++ b/custom_components/bluetti_bt/sensor.py @@ -23,10 +23,14 @@ from homeassistant.helpers.update_coordinator import ( ) from bluetti_mqtt.bluetooth import build_device -from bluetti_mqtt.mqtt_client import NORMAL_DEVICE_FIELDS, MqttFieldType +from bluetti_mqtt.mqtt_client import ( + NORMAL_DEVICE_FIELDS, + DC_INPUT_FIELDS, + MqttFieldType, +) from . import device_info as dev_info, get_unique_id -from .const import DOMAIN, CONF_OPTIONS +from .const import DOMAIN, CONF_OPTIONS, DIAGNOSTIC_FIELDS, ADDITIONAL_DEVICE_FIELDS from .coordinator import PollingCoordinator _LOGGER = logging.getLogger(__name__) @@ -50,10 +54,13 @@ async def async_setup_entry( bluetti_device = build_device(address, device_name) sensors_to_add = [] - for field_key, field_config in NORMAL_DEVICE_FIELDS.items(): + all_fields = NORMAL_DEVICE_FIELDS + all_fields.update(DC_INPUT_FIELDS) + all_fields.update(ADDITIONAL_DEVICE_FIELDS) + for field_key, field_config in all_fields.items(): if bluetti_device.has_field(field_key): category = None - if field_config.setter is True: + if field_config.setter is True or field_key in DIAGNOSTIC_FIELDS: category = EntityCategory.DIAGNOSTIC if field_config.type == MqttFieldType.NUMERIC: sensors_to_add.append( @@ -63,11 +70,9 @@ async def async_setup_entry( address, field_key, field_config.home_assistant_extra.get(CONF_NAME, ""), - field_config.home_assistant_extra.get( - CONF_UNIT_OF_MEASUREMENT, "" - ), - field_config.home_assistant_extra.get(CONF_DEVICE_CLASS, ""), - field_config.home_assistant_extra.get(CONF_STATE_CLASS, ""), + field_config.home_assistant_extra.get(CONF_UNIT_OF_MEASUREMENT), + field_config.home_assistant_extra.get(CONF_DEVICE_CLASS), + field_config.home_assistant_extra.get(CONF_STATE_CLASS), category=category, ) )