diff --git a/solax/inverters/qvolt_hyb_g3_3p.py b/solax/inverters/qvolt_hyb_g3_3p.py index baf0f3b..c5c785c 100644 --- a/solax/inverters/qvolt_hyb_g3_3p.py +++ b/solax/inverters/qvolt_hyb_g3_3p.py @@ -1,7 +1,7 @@ import voluptuous as vol from solax.inverter import Inverter, InverterHttpClient -from solax.units import Total, Units +from solax.units import DailyTotal, Measurement, Total, Units from solax.utils import div10, div100, pack_u16, to_signed, twoway_div10, twoway_div100 @@ -122,22 +122,26 @@ def response_decoder(cls): Total(Units.KWH), div10, ), - "Today's Battery Discharge Energy": (78, Units.KWH, div10), - "Today's Battery Charge Energy": (79, Units.KWH, div10), + "Today's Battery Discharge Energy": (78, DailyTotal(Units.KWH), div10), + "Today's Battery Charge Energy": (79, DailyTotal(Units.KWH), div10), "Total PV Energy": (pack_u16(80, 81), Total(Units.KWH), div10), - "Today's Energy": (82, Units.KWH, div10), + "Today's Energy": (82, DailyTotal(Units.KWH), div10), # 83-85: always 0 "Total Feed-in Energy": (pack_u16(86, 87), Total(Units.KWH), div100), "Total Consumption": (pack_u16(88, 89), Total(Units.KWH), div100), - "Today's Feed-in Energy": (90, Units.KWH, div100), + "Today's Feed-in Energy": (90, DailyTotal(Units.KWH), div100), # 91: always 0 - "Today's Consumption": (92, Units.KWH, div100), + "Today's Consumption": (92, DailyTotal(Units.KWH), div100), # 93-101: always 0 # 102: always 1 "Battery Remaining Capacity": (103, Units.PERCENT), # 104: always 1 "Battery Temperature": (105, Units.C), - "Battery Remaining Energy": (106, Units.KWH, div10), + "Battery Remaining Energy": ( + 106, + Measurement(Units.KWH, storage=True), + div10, + ), # 107: always 256 or 0 # 108: always 3504 # 109: always 2400 diff --git a/solax/inverters/x1.py b/solax/inverters/x1.py index 5abf23d..0b34e72 100644 --- a/solax/inverters/x1.py +++ b/solax/inverters/x1.py @@ -1,7 +1,7 @@ import voluptuous as vol from solax.inverter import Inverter -from solax.units import Total, Units +from solax.units import DailyTotal, Total, Units from solax.utils import startswith @@ -38,7 +38,7 @@ def response_decoder(cls): "Network Voltage": (5, Units.V), "AC Power": (6, Units.W), "Inverter Temperature": (7, Units.C), - "Today's Energy": (8, Units.KWH), + "Today's Energy": (8, DailyTotal(Units.KWH)), "Total Energy": (9, Total(Units.KWH)), "Exported Power": (10, Units.W), "PV1 Power": (11, Units.W), diff --git a/solax/inverters/x1_boost.py b/solax/inverters/x1_boost.py index 4975166..4285d29 100644 --- a/solax/inverters/x1_boost.py +++ b/solax/inverters/x1_boost.py @@ -1,7 +1,7 @@ import voluptuous as vol from solax.inverter import Inverter -from solax.units import Total, Units +from solax.units import DailyTotal, Total, Units from solax.utils import div10, div100, pack_u16, to_signed @@ -46,7 +46,7 @@ def response_decoder(cls): "PV2 Power": (8, Units.W), "AC Frequency": (9, Units.HZ, div100), "Total Generated Energy": (pack_u16(11, 12), Total(Units.KWH), div10), - "Today's Generated Energy": (13, Total(Units.KWH), div10), + "Today's Generated Energy": (13, DailyTotal(Units.KWH), div10), "Inverter Temperature": (39, Units.C), "Exported Power": (48, Units.W, to_signed), "Total Export Energy": (pack_u16(50, 51), Total(Units.KWH), div100), diff --git a/solax/inverters/x1_hybrid_gen4.py b/solax/inverters/x1_hybrid_gen4.py index 5c30333..1acc54c 100644 --- a/solax/inverters/x1_hybrid_gen4.py +++ b/solax/inverters/x1_hybrid_gen4.py @@ -1,7 +1,7 @@ import voluptuous as vol from solax.inverter import Inverter -from solax.units import Total, Units +from solax.units import DailyTotal, Total, Units from solax.utils import div10, div100, pack_u16, to_signed @@ -44,7 +44,7 @@ def response_decoder(cls): "PV1 power": (8, Units.W), "PV2 power": (9, Units.W), "On-grid total yield": (pack_u16(11, 12), Total(Units.KWH), div10), - "On-grid daily yield": (13, Units.KWH, div10), + "On-grid daily yield": (13, DailyTotal(Units.KWH), div10), "Battery voltage": (14, Units.V, div100), "Battery current": (15, Units.A, div100), "Battery power": (16, Units.W), diff --git a/solax/inverters/x1_mini.py b/solax/inverters/x1_mini.py index 7d0cb1a..874aa90 100644 --- a/solax/inverters/x1_mini.py +++ b/solax/inverters/x1_mini.py @@ -1,7 +1,7 @@ import voluptuous as vol from solax.inverter import Inverter -from solax.units import Total, Units +from solax.units import DailyTotal, Total, Units from solax.utils import startswith @@ -34,7 +34,7 @@ def response_decoder(cls): "Network Voltage": (5, Units.V), "AC Power": (6, Units.W), "Inverter Temperature": (7, Units.C), - "Today's Energy": (8, Units.KWH), + "Today's Energy": (8, DailyTotal(Units.KWH)), "Total Energy": (9, Total(Units.KWH)), "Exported Power": (10, Units.W), "PV1 Power": (11, Units.W), diff --git a/solax/inverters/x1_mini_v34.py b/solax/inverters/x1_mini_v34.py index 90906ed..9a3f159 100644 --- a/solax/inverters/x1_mini_v34.py +++ b/solax/inverters/x1_mini_v34.py @@ -1,7 +1,7 @@ import voluptuous as vol from solax.inverter import Inverter -from solax.units import Total, Units +from solax.units import DailyTotal, Total, Units from solax.utils import div10, div100 @@ -53,7 +53,7 @@ def response_decoder(cls): "PV2 Power": (8, Units.W), "Grid Frequency": (9, Units.HZ, div100), "Total Energy": (11, Total(Units.KWH), div10), - "Today's Energy": (13, Units.KWH, div10), + "Today's Energy": (13, DailyTotal(Units.KWH), div10), "Total Feed-in Energy": (41, Total(Units.KWH), div10), "Total Consumption": (42, Total(Units.KWH), div10), "Power Now": (43, Units.W, div10), diff --git a/solax/inverters/x1_smart.py b/solax/inverters/x1_smart.py index 39c6424..c98d9e6 100644 --- a/solax/inverters/x1_smart.py +++ b/solax/inverters/x1_smart.py @@ -1,7 +1,7 @@ import voluptuous as vol from solax.inverter import Inverter -from solax.units import Total, Units +from solax.units import DailyTotal, Total, Units from solax.utils import div10, div100, to_signed @@ -44,7 +44,7 @@ def response_decoder(cls): "PV2 Power": (8, Units.W), "Grid Frequency": (9, Units.HZ, div100), "Total Energy": (11, Total(Units.KWH), div10), - "Today's Energy": (13, Units.KWH, div10), + "Today's Energy": (13, DailyTotal(Units.KWH), div10), "Inverter Temperature": (39, Units.C), "Exported Power": (48, Units.W, to_signed), "Total Feed-in Energy": (50, Total(Units.KWH), div100), diff --git a/solax/inverters/x3.py b/solax/inverters/x3.py index f69c7ad..8c1bff9 100644 --- a/solax/inverters/x3.py +++ b/solax/inverters/x3.py @@ -1,7 +1,7 @@ import voluptuous as vol from solax.inverter import Inverter -from solax.units import Total, Units +from solax.units import DailyTotal, Total, Units from solax.utils import startswith @@ -34,7 +34,7 @@ def response_decoder(cls): "Network Voltage Phase 1": (5, Units.V), "AC Power": (6, Units.W), "Inverter Temperature": (7, Units.C), - "Today's Energy": (8, Units.KWH), + "Today's Energy": (8, DailyTotal(Units.KWH)), "Total Energy": (9, Total(Units.KWH)), "Exported Power": (10, Units.W), "PV1 Power": (11, Units.W), diff --git a/solax/inverters/x3_hybrid_g4.py b/solax/inverters/x3_hybrid_g4.py index 34048da..ecd4d54 100644 --- a/solax/inverters/x3_hybrid_g4.py +++ b/solax/inverters/x3_hybrid_g4.py @@ -1,7 +1,7 @@ import voluptuous as vol from solax.inverter import Inverter -from solax.units import Total, Units +from solax.units import DailyTotal, Measurement, Total, Units from solax.utils import ( div10, div100, @@ -104,25 +104,29 @@ def response_decoder(cls): "Load/Generator Power": (47, Units.W, to_signed), "Radiator Temperature": (54, Units.C, to_signed), "Yield total": (pack_u16(68, 69), Total(Units.KWH), div10), - "Yield today": (70, Units.KWH, div10), + "Yield today": (70, DailyTotal(Units.KWH), div10), "Battery Discharge Energy total": ( pack_u16(74, 75), Total(Units.KWH), div10, ), "Battery Charge Energy total": (pack_u16(76, 77), Total(Units.KWH), div10), - "Battery Discharge Energy today": (78, Units.KWH, div10), - "Battery Charge Energy today": (79, Units.KWH, div10), + "Battery Discharge Energy today": (78, DailyTotal(Units.KWH), div10), + "Battery Charge Energy today": (79, DailyTotal(Units.KWH), div10), "PV Energy total": (pack_u16(80, 81), Total(Units.KWH), div10), "EPS Energy total": (pack_u16(83, 84), Total(Units.KWH), div10), - "EPS Energy today": (85, Units.KWH, div10), + "EPS Energy today": (85, DailyTotal(Units.KWH), div10), "Feed-in Energy": (pack_u16(86, 87), Total(Units.KWH), div100), "Consumed Energy": (pack_u16(88, 89), Total(Units.KWH), div100), "Feed-in Energy total": (pack_u16(90, 91), Total(Units.KWH), div100), "Consumed Energy total": (pack_u16(92, 93), Total(Units.KWH), div100), "Battery Remaining Capacity": (103, Units.PERCENT), "Battery Temperature": (105, Units.C, to_signed), - "Battery Remaining Energy": (106, Units.KWH, div10), + "Battery Remaining Energy": ( + 106, + Measurement(Units.KWH, storage=True), + div10, + ), "Battery mode": (168, Units.NONE), "Battery mode text": (168, Units.NONE, X3HybridG4._decode_battery_mode), "Battery Voltage": (pack_u16(169, 170), Units.V, div100), diff --git a/solax/inverters/x3_mic_pro_g2.py b/solax/inverters/x3_mic_pro_g2.py index 76df85f..8190e14 100644 --- a/solax/inverters/x3_mic_pro_g2.py +++ b/solax/inverters/x3_mic_pro_g2.py @@ -1,7 +1,7 @@ import voluptuous as vol from solax.inverter import Inverter -from solax.units import Total, Units +from solax.units import DailyTotal, Total, Units from solax.utils import div10, div100, pack_u16, to_signed, to_signed32, twoway_div10 @@ -69,7 +69,7 @@ def response_decoder(cls): # "Run Mode": (21, Units.NONE), "Run Mode": (21, Units.NONE, X3MicProG2._decode_run_mode), "Total Yield": (pack_u16(22, 23), Total(Units.KWH), div10), - "Daily Yield": (24, Units.KWH, div10), + "Daily Yield": (24, DailyTotal(Units.KWH), div10), "Feed-in Power ": (pack_u16(72, 73), Units.W, to_signed32), "Total Feed-in Energy": (pack_u16(74, 75), Total(Units.KWH), div100), "Total Consumption": (pack_u16(76, 77), Total(Units.KWH), div100), diff --git a/solax/inverters/x3_v34.py b/solax/inverters/x3_v34.py index 029f912..57cb611 100644 --- a/solax/inverters/x3_v34.py +++ b/solax/inverters/x3_v34.py @@ -1,7 +1,7 @@ import voluptuous as vol from solax.inverter import Inverter -from solax.units import Total, Units +from solax.units import DailyTotal, Measurement, Total, Units from solax.utils import div10, div100, pack_u16, to_signed, twoway_div10, twoway_div100 @@ -46,12 +46,12 @@ def response_decoder(cls): "PV1 Power": (13, Units.W), "PV2 Power": (14, Units.W), "Total PV Energy": (pack_u16(89, 90), Total(Units.KWH), div10), - "Today's PV Energy": (112, Units.KWH, div10), + "Today's PV Energy": (112, DailyTotal(Units.KWH), div10), "Grid Frequency Phase 1": (15, Units.HZ, div100), "Grid Frequency Phase 2": (16, Units.HZ, div100), "Grid Frequency Phase 3": (17, Units.HZ, div100), "Total Energy": (pack_u16(19, 20), Total(Units.KWH), div10), - "Today's Energy": (21, Units.KWH, div10), + "Today's Energy": (21, DailyTotal(Units.KWH), div10), "Battery Voltage": (24, Units.V, div100), "Battery Current": (25, Units.A, twoway_div100), "Battery Power": (26, Units.W, to_signed), @@ -62,20 +62,28 @@ def response_decoder(cls): Total(Units.KWH), div10, ), - "Today's Battery Discharge Energy": (113, Units.KWH, div10), - "Battery Remaining Energy": (32, Units.KWH, div10), + "Today's Battery Discharge Energy": (113, DailyTotal(Units.KWH), div10), + "Battery Remaining Energy": ( + 32, + Measurement(Units.KWH, storage=True), + div10, + ), "Total Battery Charge Energy": ( pack_u16(87, 88), Total(Units.KWH), div10, ), - "Today's Battery Charge Energy": (114, Units.KWH, div10), + "Today's Battery Charge Energy": (114, DailyTotal(Units.KWH), div10), "Exported Power": (65, Units.W, to_signed), "Total Feed-in Energy": (pack_u16(67, 68), Total(Units.KWH), div100), "Total Consumption": (pack_u16(69, 70), Total(Units.KWH), div100), "AC Power": (181, Units.W, to_signed), "EPS Frequency": (63, Units.HZ, div100), - "EPS Total Energy": (pack_u16(110, 111), Units.KWH, div10), + "EPS Total Energy": ( + pack_u16(110, 111), + Measurement(Units.KWH, storage=False), + div10, + ), } # pylint: enable=duplicate-code diff --git a/solax/inverters/x_hybrid.py b/solax/inverters/x_hybrid.py index f6afeaf..205c375 100644 --- a/solax/inverters/x_hybrid.py +++ b/solax/inverters/x_hybrid.py @@ -1,7 +1,7 @@ import voluptuous as vol from solax.inverter import Inverter, InverterHttpClient, Method -from solax.units import Total, Units +from solax.units import DailyTotal, Total, Units class XHybrid(Inverter): @@ -55,7 +55,7 @@ def response_decoder(cls): "Network Voltage": (5, Units.V), "Power Now": (6, Units.W), "Inverter Temperature": (7, Units.C), - "Today's Energy": (8, Units.KWH), + "Today's Energy": (8, DailyTotal(Units.KWH)), "Total Energy": (9, Total(Units.KWH)), "Exported Power": (10, Units.W), "PV1 Power": (11, Units.W), diff --git a/solax/units.py b/solax/units.py index f8ca1c3..eab9cbf 100644 --- a/solax/units.py +++ b/solax/units.py @@ -22,6 +22,8 @@ class Measurement(NamedTuple): unit: Units is_monotonic: bool = False + resets_daily: bool = False + storage: bool = False class Total(Measurement): @@ -30,4 +32,10 @@ class Total(Measurement): is_monotonic: bool = True +class DailyTotal(Measurement): + """A Measurement where the values are reset daily.""" + + resets_daily: bool = True + + SensorUnit = Union[Measurement, Total]