fix pack polling

This commit is contained in:
Patrick762 committed 2024-05-31 14:23:07 +02:00
1 parent c3bfad0ea6
commit 6be2abaaf2
10 files changed
+13 -38

No files matched your search

@@ -45,7 +45,7 @@ class BluettiDevice:
@property @property
def pack_num_field(self) -> List[ReadHoldingRegisters]: def pack_num_field(self) -> List[ReadHoldingRegisters]:
"""The address 'range' of the pack num""" """The address 'range' of the pack num result. Matches pack_num_result"""
return [] return []
def has_field(self, field: str): def has_field(self, field: str):
@@ -60,5 +60,5 @@ class ProtocolV1Device(BluettiDevice):
@property @property
def pack_num_field(self) -> List[ReadHoldingRegisters]: def pack_num_field(self) -> List[ReadHoldingRegisters]:
return [ return [
ReadHoldingRegisters(3006, 1), ReadHoldingRegisters(96, 1),
] ]
@@ -106,36 +106,11 @@ class DeviceReader:
command = self.bluetti_device.build_setter_command( command = self.bluetti_device.build_setter_command(
"pack_num", pack "pack_num", pack
) )
await self._async_send_command(command)
try:
# Read pack_num field
command = self.bluetti_device.pack_num_field[0]
body = command.parse_response( body = command.parse_response(
await self._async_send_command(command) await self._async_send_command(command)
) )
_LOGGER.debug("Raw data: %s", body) _LOGGER.debug("Raw data set: %s", body)
parsed = self.bluetti_device.parse( # b'\x00\x02' b'\x00\x03' here (seems like result)
command.starting_address, body
)
_LOGGER.debug("Parsed data: %s", parsed)
# Check pack number
pack_number = parsed.get("pack_num")
if (
not isinstance(pack_number, int)
or pack_number != pack
):
_LOGGER.debug(
"Parsed pack_num(%s) does not match expected '%s', Skipping pack (maybe you don't have this connected)",
pack_number,
pack,
)
continue
except ParseError:
_LOGGER.warning("Got a pack parse exception, Skipping pack")
continue
for command in pack_commands: for command in pack_commands:
# Request & parse result for each pack # Request & parse result for each pack
@@ -198,9 +173,9 @@ class DeviceReader:
return cast(bytes, res) return cast(bytes, res)
except TimeoutError: except TimeoutError:
_LOGGER.warning("Polling single command timed out") _LOGGER.debug("Polling single command timed out")
except ModbusError as err: except ModbusError as err:
_LOGGER.warning( _LOGGER.debug(
"Got an invalid request error for %s: %s", "Got an invalid request error for %s: %s",
command, command,
err, err,
@@ -24,7 +24,7 @@ class AC200L(ProtocolV1Device):
# Battery packs # Battery packs
self.struct.add_uint_field("pack_num_max", 91) # internal self.struct.add_uint_field("pack_num_max", 91) # internal
self.struct.add_decimal_field("total_battery_voltage", 92, 1) self.struct.add_decimal_field("total_battery_voltage", 92, 1)
self.struct.add_uint_field("pack_num", 96) # internal self.struct.add_uint_field("pack_num_result", 96) # internal
self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage
self.struct.add_uint_field("pack_battery_percent", 99) self.struct.add_uint_field("pack_battery_percent", 99)
self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal
@@ -24,7 +24,7 @@ class AC200M(ProtocolV1Device):
# Battery packs # Battery packs
self.struct.add_uint_field("pack_num_max", 91) # internal self.struct.add_uint_field("pack_num_max", 91) # internal
self.struct.add_decimal_field("total_battery_voltage", 92, 1) self.struct.add_decimal_field("total_battery_voltage", 92, 1)
self.struct.add_uint_field("pack_num", 96) # internal self.struct.add_uint_field("pack_num_result", 96) # internal
self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage
self.struct.add_uint_field("pack_battery_percent", 99) self.struct.add_uint_field("pack_battery_percent", 99)
self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal
@@ -30,7 +30,7 @@ class AC300(ProtocolV1Device):
# Battery packs # Battery packs
self.struct.add_uint_field("pack_num_max", 91) # internal self.struct.add_uint_field("pack_num_max", 91) # internal
self.struct.add_decimal_field("total_battery_voltage", 92, 1) self.struct.add_decimal_field("total_battery_voltage", 92, 1)
self.struct.add_uint_field("pack_num", 96) # internal self.struct.add_uint_field("pack_num_result", 96) # internal
self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage
self.struct.add_uint_field("pack_battery_percent", 99) self.struct.add_uint_field("pack_battery_percent", 99)
self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal
@@ -30,7 +30,7 @@ class AC500(ProtocolV1Device):
# Battery packs # Battery packs
self.struct.add_uint_field("pack_num_max", 91) # internal self.struct.add_uint_field("pack_num_max", 91) # internal
self.struct.add_decimal_field("total_battery_voltage", 92, 1) self.struct.add_decimal_field("total_battery_voltage", 92, 1)
self.struct.add_uint_field("pack_num", 96) # internal self.struct.add_uint_field("pack_num_result", 96) # internal
self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage
self.struct.add_uint_field("pack_battery_percent", 99) self.struct.add_uint_field("pack_battery_percent", 99)
self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal
@@ -30,7 +30,7 @@ class EP500(ProtocolV1Device):
# Battery packs # Battery packs
self.struct.add_uint_field("pack_num_max", 91) # internal self.struct.add_uint_field("pack_num_max", 91) # internal
self.struct.add_decimal_field("total_battery_voltage", 92, 1) self.struct.add_decimal_field("total_battery_voltage", 92, 1)
self.struct.add_uint_field("pack_num", 96) # internal self.struct.add_uint_field("pack_num_result", 96) # internal
self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage
self.struct.add_uint_field("pack_battery_percent", 99) self.struct.add_uint_field("pack_battery_percent", 99)
self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal
@@ -30,7 +30,7 @@ class EP500P(ProtocolV1Device):
# Battery packs # Battery packs
self.struct.add_uint_field("pack_num_max", 91) # internal self.struct.add_uint_field("pack_num_max", 91) # internal
self.struct.add_decimal_field("total_battery_voltage", 92, 1) self.struct.add_decimal_field("total_battery_voltage", 92, 1)
self.struct.add_uint_field("pack_num", 96) # internal self.struct.add_uint_field("pack_num_result", 96) # internal
self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage
self.struct.add_uint_field("pack_battery_percent", 99) self.struct.add_uint_field("pack_battery_percent", 99)
self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal
+1 -1
View File
@@ -156,7 +156,7 @@ class BluettiSensor(CoordinatorEntity, SensorEntity):
response_data = self.coordinator.data.get(self._response_key) response_data = self.coordinator.data.get(self._response_key)
if response_data is None: if response_data is None:
_LOGGER.warning("No data for available for (%s)", self._response_key) _LOGGER.debug("No data for available for (%s)", self._response_key)
self._attr_available = False self._attr_available = False
self.async_write_ha_state() self.async_write_ha_state()
return return