diff --git a/app/src/gen3plus/infos_g3p.py b/app/src/gen3plus/infos_g3p.py index 987378c..470c695 100644 --- a/app/src/gen3plus/infos_g3p.py +++ b/app/src/gen3plus/infos_g3p.py @@ -149,8 +149,8 @@ class RegisterMap: 0x42010034: {'reg': Register.BATT_PV2_VOLT, 'fmt': '!H', 'ratio': 0.01}, # noqa: E501, DC Voltage PV2 0x42010036: {'reg': Register.BATT_PV2_CUR, 'fmt': '!H', 'ratio': 0.01}, # noqa: E501, DC Current PV2 0x42010038: {'reg': Register.BATT_TOTAL_CHARG, 'fmt': '!L', 'ratio': 0.01}, # noqa: E501 - 0x4201003c: {'reg': Register.BATT_PV1_STATUS, 'fmt': '!H'}, # noqa: E501 MPTT-1 Operating Status: 0(Standby), 1(Work) - 0x4201003e: {'reg': Register.BATT_PV2_STATUS, 'fmt': '!H'}, # noqa: E501 MPTT-2 Operating Status: 0(Standby), 1(Work) + 0x4201003c: {'reg': Register.BATT_PV1_STATUS, 'fmt': '!H'}, # noqa: E501 MPTT-1 Operating Status: 0(Standby), 1(Work) + 0x4201003e: {'reg': Register.BATT_PV2_STATUS, 'fmt': '!H'}, # noqa: E501 MPTT-2 Operating Status: 0(Standby), 1(Work) 0x42010040: {'reg': Register.BATT_VOLT, 'fmt': '!h', 'ratio': 0.01}, # noqa: E501 0x42010042: {'reg': Register.BATT_CUR, 'fmt': '!h', 'ratio': 0.01}, # noqa: E501 => Batterie Status: <0(Discharging), 0(Static), 0>(Loading) 0x42010044: {'reg': Register.BATT_SOC, 'fmt': '!H', 'ratio': 0.01}, # noqa: E501, state of charge (SOC) in percent @@ -177,7 +177,7 @@ class RegisterMap: 0x4201006e: {'reg': Register.BATT_OUT_CUR, 'fmt': '!H', 'ratio': 0.01}, # noqa: E501 Output Current 0x42010070: {'reg': Register.BATT_OUT_STATUS, 'fmt': '!H'}, # noqa: E501 Output Working Status: 0(Standby), 1(Work) 0x42010072: {'reg': Register.BATT_TEMP_4, 'fmt': '!h'}, # noqa: E50, Environment temp - 0x42010074: {'reg': Register.BATT_74, 'fmt': '!H'}, # noqa: E501 Warning Alarmcode 1, Bit 0..15 + 0x42010074: {'reg': Register.BATT_ALARM, 'fmt': '!H'}, # noqa: E501 Warning Alarmcode 1, Bit 0..15 0x42010076: {'reg': Register.BATT_HW_VERS, 'fmt': '!h'}, # noqa: E501 hardware version 0x42010078: {'reg': Register.BATT_SW_VERS, 'fmt': '!h'}, # noqa: E501 software main version 'calc': { diff --git a/app/src/infos.py b/app/src/infos.py index e7477a3..e0d4226 100644 --- a/app/src/infos.py +++ b/app/src/infos.py @@ -154,7 +154,7 @@ class Register(Enum): BATT_OUT_CUR = 1033 BATT_OUT_STATUS = 1034 BATT_TEMP_4 = 1035 - BATT_74 = 1036 + BATT_ALARM = 1036 BATT_HW_VERS = 1037 BATT_SW_VERS = 1038 BATT_PV_PWR = 1040 @@ -326,6 +326,7 @@ class Infos: SOLAR_POWER_VAR = 'mdi:solar-power-variant' SOLAR_POWER = 'mdi:solar-power' WIFI = 'mdi:wifi' + ALARM_LIGHT = 'mdi:alarm-light' UPDATE = 'mdi:update' DAILY_GEN = 'Daily Generation' TOTAL_GEN = 'Total Generation' @@ -403,52 +404,52 @@ class Infos: {% set result = 'noAlarm'%} {%else%} {% set result = '' %} - {% if val_int | bitwise_and(1)%} + {% if val_int | bitwise_and(0x0001)%} {% set result = result + 'HBridgeFault, '%} {% endif %} - {% if val_int | bitwise_and(2)%} + {% if val_int | bitwise_and(0x0002)%} {% set result = result + 'DriVoltageFault, '%} {% endif %} - {% if val_int | bitwise_and(3)%} + {% if val_int | bitwise_and(0x0004)%} {% set result = result + 'GFDI-Fault, '%} {% endif %} - {% if val_int | bitwise_and(4)%} + {% if val_int | bitwise_and(0x0008)%} {% set result = result + 'OverTemp, '%} {% endif %} - {% if val_int | bitwise_and(5)%} + {% if val_int | bitwise_and(0x0010)%} {% set result = result + 'CommLose, '%} {% endif %} - {% if val_int | bitwise_and(6)%} + {% if val_int | bitwise_and(0x0020)%} {% set result = result + 'Bit6, '%} {% endif %} - {% if val_int | bitwise_and(7)%} + {% if val_int | bitwise_and(0x0040)%} {% set result = result + 'Bit7, '%} {% endif %} - {% if val_int | bitwise_and(8)%} + {% if val_int | bitwise_and(0x0080)%} {% set result = result + 'EEPROM-Fault, '%} {% endif %} - {% if val_int | bitwise_and(9)%} + {% if val_int | bitwise_and(0x0100)%} {% set result = result + 'NoUtility, '%} {% endif %} - {% if val_int | bitwise_and(10)%} + {% if val_int | bitwise_and(0x0200)%} {% set result = result + 'VG_Offset, '%} {% endif %} - {% if val_int | bitwise_and(11)%} + {% if val_int | bitwise_and(0x0400)%} {% set result = result + 'Relais_Open, '%} {% endif %} - {% if val_int | bitwise_and(12)%} + {% if val_int | bitwise_and(0x0800)%} {% set result = result + 'Relais_Short, '%} {% endif %} - {% if val_int | bitwise_and(13)%} + {% if val_int | bitwise_and(0x1000)%} {% set result = result + 'GridVoltOverRating, '%} {% endif %} - {% if val_int | bitwise_and(14)%} + {% if val_int | bitwise_and(0x2000)%} {% set result = result + 'GridVoltUnderRating, '%} {% endif %} - {% if val_int | bitwise_and(15)%} + {% if val_int | bitwise_and(0x4000)%} {% set result = result + 'GridFreqOverRating, '%} {% endif %} - {% if val_int | bitwise_and(16)%} + {% if val_int | bitwise_and(0x8000)%} {% set result = result + 'GridFreqUnderRating, '%} {% endif %} {% endif %} @@ -465,42 +466,104 @@ class Infos: {% set result = 'noFault'%} {%else%} {% set result = '' %} - {% if val_int | bitwise_and(1)%} + {% if val_int | bitwise_and(0x0001)%} {% set result = result + 'PVOV-Fault (PV OverVolt), '%} {% endif %} - {% if val_int | bitwise_and(2)%} + {% if val_int | bitwise_and(0x0002)%} {% set result = result + 'PVLV-Fault (PV LowVolt), '%} {% endif %} - {% if val_int | bitwise_and(3)%} + {% if val_int | bitwise_and(0x0004)%} {% set result = result + 'PV OI-Fault (PV OverCurrent), '%} {% endif %} - {% if val_int | bitwise_and(4)%} + {% if val_int | bitwise_and(0x0008)%} {% set result = result + 'PV OFV-Fault, '%} {% endif %} - {% if val_int | bitwise_and(5)%} + {% if val_int | bitwise_and(0x0010)%} {% set result = result + 'DC ShortCircuitFault, '%} {% endif %} - {% if val_int | bitwise_and(6)%}{% set result = result + 'Bit6, '%} + {% if val_int | bitwise_and(0x0020)%}{% set result = result + 'Bit6, '%} {% endif %} - {% if val_int | bitwise_and(7)%}{% set result = result + 'Bit7, '%} + {% if val_int | bitwise_and(0x0040)%}{% set result = result + 'Bit7, '%} {% endif %} - {% if val_int | bitwise_and(8)%}{% set result = result + 'Bit8, '%} + {% if val_int | bitwise_and(0x0080)%}{% set result = result + 'Bit8, '%} {% endif %} - {% if val_int | bitwise_and(9)%}{% set result = result + 'Bit9, '%} + {% if val_int | bitwise_and(0x0100)%}{% set result = result + 'Bit9, '%} {% endif %} - {% if val_int | bitwise_and(10)%}{% set result = result + 'Bit10, '%} + {% if val_int | bitwise_and(0x0200)%}{% set result = result + 'Bit10, '%} {% endif %} - {% if val_int | bitwise_and(11)%}{% set result = result + 'Bit11, '%} + {% if val_int | bitwise_and(0x0400)%}{% set result = result + 'Bit11, '%} {% endif %} - {% if val_int | bitwise_and(12)%}{% set result = result + 'Bit12, '%} + {% if val_int | bitwise_and(0x0800)%}{% set result = result + 'Bit12, '%} {% endif %} - {% if val_int | bitwise_and(13)%}{% set result = result + 'Bit13, '%} + {% if val_int | bitwise_and(0x1000)%}{% set result = result + 'Bit13, '%} {% endif %} - {% if val_int | bitwise_and(14)%}{% set result = result + 'Bit14, '%} + {% if val_int | bitwise_and(0x2000)%}{% set result = result + 'Bit14, '%} {% endif %} - {% if val_int | bitwise_and(15)%}{% set result = result + 'Bit15, '%} + {% if val_int | bitwise_and(0x4000)%}{% set result = result + 'Bit15, '%} {% endif %} - {% if val_int | bitwise_and(16)%}{% set result = result + 'Bit16, '%} + {% if val_int | bitwise_and(0x8000)%}{% set result = result + 'Bit16, '%} + {% endif %} + {% endif %} + {{ result }} +{% else %} + {{ this.state }} +{% endif %} +''' + __batt_alarm_val_tpl = ''' +{% if 'Batterie_Alarm' in value_json and + value_json['Batterie_Alarm'] != None %} + {% set val_int = value_json['Batterie_Alarm'] | int %} + {% if val_int == 0 %} + {% set result = 'noAlarm'%} + {%else%} + {% set result = '' %} + {% if val_int | bitwise_and(0x0001)%} + {% set result = result + 'PV1-OverVoltage, '%} + {% endif %} + {% if val_int | bitwise_and(0x0002)%} + {% set result = result + 'PV2-OverVoltage, '%} + {% endif %} + {% if val_int | bitwise_and(0x0004)%} + {% set result = result + 'EquipmentOverheating, '%} + {% endif %} + {% if val_int | bitwise_and(0x0008)%} + {% set result = result + 'EquipmentLowTemp, '%} + {% endif %} + {% if val_int | bitwise_and(0x0010)%} + {% set result = result + 'BMS-CommFailed, '%} + {% endif %} + {% if val_int | bitwise_and(0x0020)%} + {% set result = result + 'UnderVoltageProt, '%} + {% endif %} + {% if val_int | bitwise_and(0x0040)%} + {% set result = result + 'ChargingHighTemp, '%} + {% endif %} + {% if val_int | bitwise_and(0x0080)%} + {% set result = result + 'ChargingLowTemp, '%} + {% endif %} + {% if val_int | bitwise_and(0x0100)%} + {% set result = result + 'DischargeHighTemp, '%} + {% endif %} + {% if val_int | bitwise_and(0x0200)%} + {% set result = result + 'DischargeLowTemp, '%} + {% endif %} + {% if val_int | bitwise_and(0x0400)%} + {% set result = result + 'BatterieOverVoltage, '%} + {% endif %} + {% if val_int | bitwise_and(0x0800)%} + {% set result = result + 'SingleCorePressureDifferenceIsTooLarge, '%} + {% endif %} + {% if val_int | bitwise_and(0x1000)%} + {% set result = result + 'Bit-12, '%} + {% endif %} + {% if val_int | bitwise_and(0x2000)%} + {% set result = result + 'Bit-13, '%} + {% endif %} + {% if val_int | bitwise_and(0x4000)%} + {% set result = result + 'Bit-14, '%} + {% endif %} + {% if val_int | bitwise_and(0x8000)%} + {% set result = result + 'Bit-15, '%} {% endif %} {% endif %} {{ result }} @@ -566,8 +629,8 @@ class Infos: # 0xffffff03: {'name':['proxy', 'Voltage'], 'level': logging.DEBUG, 'unit': 'V', 'ha':{'dev':'proxy', 'dev_cla': 'voltage', 'stat_cla': 'measurement', 'id':'proxy_volt_', 'fmt':FMT_FLOAT,'name': 'Grid Voltage'}}, # noqa: E501 # events - Register.EVENT_ALARM: {'name': ['events', 'Inverter_Alarm'], 'level': logging.INFO, 'unit': '', 'ha': {'dev': 'inverter', 'comp': 'sensor', 'dev_cla': None, 'stat_cla': None, 'id': 'inv_alarm_', 'name': 'Inverter Alarm', 'val_tpl': __inv_alarm_val_tpl, 'icon': 'mdi:alarm-light'}}, # noqa: E501 - Register.EVENT_FAULT: {'name': ['events', 'Inverter_Fault'], 'level': logging.INFO, 'unit': '', 'ha': {'dev': 'inverter', 'comp': 'sensor', 'dev_cla': None, 'stat_cla': None, 'id': 'inv_fault_', 'name': 'Inverter Fault', 'val_tpl': __inv_fault_val_tpl, 'icon': 'mdi:alarm-light'}}, # noqa: E501 + Register.EVENT_ALARM: {'name': ['events', 'Inverter_Alarm'], 'level': logging.INFO, 'unit': '', 'ha': {'dev': 'inverter', 'comp': 'sensor', 'dev_cla': None, 'stat_cla': None, 'id': 'inv_alarm_', 'name': 'Inverter Alarm', 'val_tpl': __inv_alarm_val_tpl, 'icon': ALARM_LIGHT}}, # noqa: E501 + Register.EVENT_FAULT: {'name': ['events', 'Inverter_Fault'], 'level': logging.INFO, 'unit': '', 'ha': {'dev': 'inverter', 'comp': 'sensor', 'dev_cla': None, 'stat_cla': None, 'id': 'inv_fault_', 'name': 'Inverter Fault', 'val_tpl': __inv_fault_val_tpl, 'icon': ALARM_LIGHT}}, # noqa: E501 Register.EVENT_BF1: {'name': ['events', 'Inverter_Bitfield_1'], 'level': logging.INFO, 'unit': ''}, # noqa: E501 Register.EVENT_BF2: {'name': ['events', 'Inverter_bitfield_2'], 'level': logging.INFO, 'unit': ''}, # noqa: E501 # Register.EVENT_409: {'name': ['events', '409_No_Utility'], 'level': logging.DEBUG, 'unit': ''}, # noqa: E501 @@ -684,7 +747,7 @@ class Infos: Register.BATT_TEMP_2: {'name': ['batterie', 'cell', 'Temp_2'], 'level': logging.INFO, 'unit': '°C', 'ha': {'dev': 'batterie', 'dev_cla': 'temperature', 'stat_cla': 'measurement', 'id': 'temp_2_', 'val_tpl': "{{ (value_json['cell']['Temp_2'] | int)}}", 'name': 'Cell Temp-2', 'ent_cat': 'diagnostic'}}, # noqa: E501 Register.BATT_TEMP_3: {'name': ['batterie', 'cell', 'Temp_3'], 'level': logging.INFO, 'unit': '°C', 'ha': {'dev': 'batterie', 'dev_cla': 'temperature', 'stat_cla': 'measurement', 'id': 'temp_3_', 'val_tpl': "{{ (value_json['cell']['Temp_3'] | int)}}", 'name': 'Cell Temp-3', 'ent_cat': 'diagnostic'}}, # noqa: E501 Register.BATT_TEMP_4: {'name': ['batterie', 'Controller_Temp'], 'level': logging.INFO, 'unit': '°C', 'ha': {'dev': 'batterie', 'dev_cla': 'temperature', 'stat_cla': 'measurement', 'id': 'temp_4_', 'fmt': FMT_INT, 'name': 'Temperature'}}, # noqa: E501 - Register.BATT_74: {'name': ['batterie', 'Reg_74'], 'level': logging.INFO, 'unit': '', 'ha': {'dev': 'batterie', 'dev_cla': 'power', 'stat_cla': 'measurement', 'id': 'batt_74_', 'fmt': FMT_INT, 'ent_cat': 'diagnostic'}}, # noqa: E501 + Register.BATT_ALARM: {'name': ['batterie', 'Batterie_Alarm'], 'level': logging.INFO, 'unit': '', 'ha': {'dev': 'batterie', 'comp': 'sensor', 'dev_cla': None, 'stat_cla': None, 'id': 'batt_alarm_', 'name': 'Batterie Alarm', 'val_tpl': __batt_alarm_val_tpl, 'icon': ALARM_LIGHT}}, # noqa: E501 Register.BATT_HW_VERS: {'name': ['batterie', 'Hardware_Version'], 'level': logging.INFO, 'unit': ''}, # noqa: E501 Register.BATT_SW_VERS: {'name': ['batterie', 'Software_Version'], 'level': logging.INFO, 'unit': ''}, # noqa: E501 diff --git a/app/src/modbus.py b/app/src/modbus.py index 8991621..23ae92d 100644 --- a/app/src/modbus.py +++ b/app/src/modbus.py @@ -43,8 +43,8 @@ class Modbus(): 0x000a: {'reg': Register.BATT_PV2_VOLT, 'fmt': '!H', 'ratio': 0.01}, # noqa: E501, PV2 voltage 0x000b: {'reg': Register.BATT_PV2_CUR, 'fmt': '!H', 'ratio': 0.01}, # noqa: E501, PV2 current 0x000c: {'reg': Register.BATT_TOTAL_CHARG, 'fmt': '!L', 'ratio': 0.01}, # noqa: E501 - 0x000e: {'reg': Register.BATT_PV1_STATUS, 'fmt': '!H'}, # noqa: E501 - 0x000f: {'reg': Register.BATT_PV2_STATUS, 'fmt': '!H'}, # noqa: E501 + 0x000e: {'reg': Register.BATT_PV1_STATUS, 'fmt': '!H'}, # noqa: E501 + 0x000f: {'reg': Register.BATT_PV2_STATUS, 'fmt': '!H'}, # noqa: E501 0x0010: {'reg': Register.BATT_VOLT, 'fmt': '!h', 'ratio': 0.01}, # noqa: E501 0x0011: {'reg': Register.BATT_CUR, 'fmt': '!h', 'ratio': 0.01}, # noqa: E501 0x0012: {'reg': Register.BATT_SOC, 'fmt': '!H', 'ratio': 0.01}, # noqa: E501, state of charge (SOC) in percent @@ -71,7 +71,7 @@ class Modbus(): 0x0027: {'reg': Register.BATT_OUT_CUR, 'fmt': '!H', 'ratio': 0.01}, # noqa: E501 0x0028: {'reg': Register.BATT_OUT_STATUS, 'fmt': '!H'}, # noqa: E501 0x0029: {'reg': Register.BATT_TEMP_4, 'fmt': '!h'}, # noqa: E501 - 0x002a: {'reg': Register.BATT_74, 'fmt': '!h'}, # noqa: E501 + 0x002a: {'reg': Register.BATT_ALARM, 'fmt': '!h'}, # noqa: E501 0x002b: {'reg': Register.BATT_HW_VERS, 'fmt': '!h'}, # noqa: E501 0x002c: {'reg': Register.BATT_SW_VERS, 'fmt': '!h'}, # noqa: E501 diff --git a/app/tests/test_infos_g3.py b/app/tests/test_infos_g3.py index d0425e8..f786cc9 100644 --- a/app/tests/test_infos_g3.py +++ b/app/tests/test_infos_g3.py @@ -221,7 +221,7 @@ def inv_data_seq2(): # Data indication from the controller return msg @pytest.fixture -def inv_data_seq3(): # Inverter indication from MS-2000 +def inv_data_seq3(): # Inverter indication from MS-3000 msg = b'\x00\x00\x01\x2c\x00\x00\x00\x64\x53\x00\x00' # | ..^.....,...dS.. msg += b'\x00\x00\x00\xc8\x53\x44\x00\x00\x00\x01\x2c\x53\x00\x00\x00\x00' # | ....SD....,S.... diff --git a/app/tests/test_infos_g3p.py b/app/tests/test_infos_g3p.py index a45d623..0596044 100644 --- a/app/tests/test_infos_g3p.py +++ b/app/tests/test_infos_g3p.py @@ -172,7 +172,7 @@ def test_parse_4210_3026(batterie_data: bytes): "batt": {"Total_Charging": 20.8, "Voltage": 51.34, "Current": -0.02, "SOC": 10.0, "Power": -1.0268000000000002, 'Batt_State': 0}, "cell": {"Volt1": 3.21, "Volt2": 3.21, "Volt3": 3.21, "Volt4": 3.21, "Volt5": 3.21, "Volt6": 3.21, "Volt7": 3.21, "Volt8": 3.21, "Volt9": 3.21, "Volt10": 3.21, "Volt11": 3.21, "Volt12": 3.21, "Volt13": 3.21, "Volt14": 3.21, "Volt15": 3.21, "Volt16": 3.21, "Temp_1": 15, "Temp_2": 15, "Temp_3": 15}, "out": {"Voltage": 0.14, "Current": 0.0, "Out_Status": 0, "Power": 0.0, "Suppl_State": 0}, - "Controller_Temp": 15, "Reg_74": 0, "Hardware_Version": 517, "Software_Version": 513, + "Controller_Temp": 15, "Batterie_Alarm": 0, "Hardware_Version": 517, "Software_Version": 513, "PV_Power": 37.9232}, }) @@ -191,7 +191,7 @@ def test_parse_4210_3026_prod(batterie_data1: bytes): "batt": {"Total_Charging": 20.8, "Voltage": 2.56, "Current": 0.0, "SOC": 10.0, "Power": 0.0, 'Batt_State': 1}, "cell": {"Volt1": 3.21, "Volt2": 3.21, "Volt3": 3.21, "Volt4": 3.21, "Volt5": 3.21, "Volt6": 3.21, "Volt7": 3.21, "Volt8": 3.21, "Volt9": 3.21, "Volt10": 3.21, "Volt11": 3.21, "Volt12": 3.21, "Volt13": 3.21, "Volt14": 3.21, "Volt15": 3.21, "Volt16": 3.21, "Temp_1": 15, "Temp_2": 15, "Temp_3": 15}, "out": {"Voltage": 30.86, "Current": 2.56, "Out_Status": 0, "Power": 79.0016, "Suppl_State": 1}, - "Controller_Temp": 15, "Reg_74": 0, "Hardware_Version": 517, "Software_Version": 513, + "Controller_Temp": 15, "Batterie_Alarm": 0, "Hardware_Version": 517, "Software_Version": 513, "PV_Power": 37.9232}, }) @@ -210,7 +210,7 @@ def test_parse_4210_3026_incomplete(batterie_data2: bytes): "batt": {"Total_Charging": 20.8, "Voltage": 51.34, "Current": 7.66, "SOC": 10.0, "Power": 393.2644, 'Batt_State': 2}, "cell": {"Volt1": 3.21, "Volt2": 3.21, "Volt3": 3.21, "Volt4": 3.21, "Volt5": 3.21, "Volt6": 3.21, "Volt7": 3.21, "Volt8": 3.21, "Volt9": 3.21, "Volt10": 3.21, "Volt11": 3.21, "Volt12": 3.21, "Volt13": 3.21, "Volt14": 3.21, "Volt15": 3.21, "Volt16": 3.21, "Temp_1": 15, "Temp_2": 15, "Temp_3": 15}, "out": {"Voltage": 0.14, "Current": None, "Out_Status": None, "Power": None, "Suppl_State": None}, - "Controller_Temp": None, "Reg_74": None, "Hardware_Version": None, "Software_Version": None, + "Controller_Temp": None, "Batterie_Alarm": None, "Hardware_Version": None, "Software_Version": None, "PV_Power": 37.9232}, })