Skip to content

Commit

Permalink
Fix #23: Alarm registers use 32 bit, not 16 bit
Browse files Browse the repository at this point in the history
  • Loading branch information
Breina committed Jun 22, 2024
1 parent 6699710 commit 34d428d
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 5 deletions.
2 changes: 1 addition & 1 deletion custom_components/powertag_gateway/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from . import CONF_CLIENT, DOMAIN
from .entity_base import WirelessDeviceEntity, GatewayEntity, setup_entities, gateway_device_info
from .device_features import FeatureClass
from .entity_base import WirelessDeviceEntity, GatewayEntity, setup_entities, gateway_device_info
from .schneider_modbus import SchneiderModbus, LinkStatus, PanelHealth, TypeOfGateway

_LOGGER = logging.getLogger(__name__)
Expand Down
12 changes: 8 additions & 4 deletions custom_components/powertag_gateway/schneider_modbus.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ class PanelHealth(enum.Enum):

class AlarmDetails:
def __init__(self, bitmask: int):
self.has_alarm = bitmask != 0
self.bitmask = bitmask
self.has_alarm = bitmask & (0b1 << 14) - 1 != 0

self.voltage_loss = 0b1 & bitmask != 0
self.current_overload_when_voltage_loss = 0b1 << 1 & bitmask != 0
Expand All @@ -67,6 +68,9 @@ def __init__(self, bitmask: int):
self.current_50_percent = 0b1 << 12 & bitmask != 0
self.current_80_percent = 0b1 << 13 & bitmask != 0

def __str__(self):
return bin(self.bitmask)


class DeviceUsage(enum.Enum):
main_incomer = 1
Expand Down Expand Up @@ -498,13 +502,13 @@ def tag_power_active_demand_total_maximum_timestamp(self, tag_index: int) -> dat
def tag_is_alarm_valid(self, tag_index: int) -> AlarmDetails | bool | None:
"""Validity of the alarm bitmap"""
if self.type_of_gateway is TypeOfGateway.PANEL_SERVER:
return AlarmDetails(self.__read_int_16(0xCE1, tag_index))
return AlarmDetails(self.__read_int_32(0xCE1, tag_index))
else:
return (self.__read_int_16(0xCE1, tag_index) & 0b1) != 0
return (self.__read_int_32(0xCE1, tag_index) & 0b1) != 0

def tag_get_alarm(self, tag_index: int) -> AlarmDetails:
"""Alarms"""
return AlarmDetails(self.__read_int_16(0xCE3, tag_index))
return AlarmDetails(self.__read_int_32(0xCE3, tag_index))

def tag_current_at_voltage_loss(self, tag_index: int, phase: Phase) -> float | None:
"""RMS current on phase at voltage loss (last RMS current measured when voltage loss occurred)"""
Expand Down

0 comments on commit 34d428d

Please sign in to comment.