diff --git a/misc/render_rrd.py b/misc/render_rrd.py index 20d3553..aebf051 100644 --- a/misc/render_rrd.py +++ b/misc/render_rrd.py @@ -20,7 +20,7 @@ HISTORICAL_KEYS = { DataName.BATTERY_VOLTAGE_MIN, DataName.BATTERY_VOLTAGE_MAX, DataName.CHARGE_MAX_CURRENT, - DataName._DISCHARGE_MAX_CURRENT, + DataName.DISCHARGE_MAX_CURRENT, DataName.CHARGE_MAX_POWER, DataName.DISCHARGE_MAX_POWER, DataName.CHARGE_AMP_HOUR, @@ -58,7 +58,7 @@ KNOWN_KEYS = HISTORICAL_KEYS.union(INSTANT_KEYS) MAP = { "_internal_temperature?": "internal_temp", "unknown1": "charge_max_current", - "unknown2": "_discharge_max_current?", + "unknown2": "discharge_max_current", "internal_temperature": "internal_temp", "battery_temperature": "battery_temp", } diff --git a/srnemqtt/__main__.py b/srnemqtt/__main__.py index 339bd0e..9fc1c3b 100755 --- a/srnemqtt/__main__.py +++ b/srnemqtt/__main__.py @@ -2,15 +2,12 @@ # -*- coding: utf-8 -*- import time -from decimal import Decimal -from typing import cast from bluepy.btle import BTLEDisconnectError # type: ignore from serial import SerialException # type: ignore from .config import get_config, get_consumers, get_interface -from .protocol import parse_battery_state, parse_historical_entry, try_read_parse -from .solar_types import DataName +from .protocol import ChargeController from .util import Periodical, log @@ -35,67 +32,51 @@ def main(): with get_interface() as dev: log("Connected.") + cc = ChargeController(dev) + # write(dev, construct_request(0, 32)) # Memory dump # for address in range(0, 0x10000, 16): # log(f"Reading 0x{address:04X}...") # write(wd, construct_request(address, 16)) - days = 7 - res = try_read_parse(dev, 0x010B, 21, parse_historical_entry) - if res: - log(res) - for consumer in consumers: - consumer.write(res) - days = cast(int, res.get("run_days", 7)) + extra = cc.extra + days = extra.run_days + + res = cc.today.as_dict() + res.update(extra.as_dict()) + for consumer in consumers: + consumer.write(res) + del extra for i in range(days): - res = try_read_parse( - dev, 0xF000 + i, 10, parse_historical_entry - ) - if res: - log({i: res}) - for consumer in consumers: - consumer.write({str(i): res}) + hist = cc.get_historical(i) + res = hist.as_dict() + log({i: res}) + for consumer in consumers: + consumer.write({str(i): res}) while True: now = time.time() if per_voltages(now): - data = try_read_parse(dev, 0x0100, 11, parse_battery_state) - if data: - data[DataName.CALCULATED_BATTERY_POWER] = float( - Decimal(str(data.get(DataName.BATTERY_VOLTAGE, 0))) - * Decimal( - str(data.get(DataName.BATTERY_CURRENT, 0)) - ) - ) - data[DataName.CALCULATED_PANEL_POWER] = float( - Decimal(str(data.get(DataName.PANEL_VOLTAGE, 0))) - * Decimal(str(data.get(DataName.PANEL_CURRENT, 0))) - ) - data[DataName.CALCULATED_LOAD_POWER] = float( - Decimal(str(data.get(DataName.LOAD_VOLTAGE, 0))) - * Decimal(str(data.get(DataName.LOAD_CURRENT, 0))) - ) - log(data) - for consumer in consumers: - consumer.write(data) + data = cc.state.as_dict() + log(data) + for consumer in consumers: + consumer.write(data) if per_current_hist(now): - data = try_read_parse( - dev, 0x010B, 21, parse_historical_entry - ) - if data: - log(data) - for consumer in consumers: - consumer.write(data) + data = cc.today.as_dict() + data.update(cc.extra.as_dict()) + log(data) + for consumer in consumers: + consumer.write(data) # print(".") for consumer in consumers: consumer.poll() - time.sleep(max(0, 1 - time.time() - now)) + time.sleep(max(0, 1 - (time.time() - now))) # if STATUS.get('load_enabled'): # write(wd, CMD_DISABLE_LOAD) diff --git a/srnemqtt/consumers/mqtt.py b/srnemqtt/consumers/mqtt.py index 21a29a2..51d26b1 100644 --- a/srnemqtt/consumers/mqtt.py +++ b/srnemqtt/consumers/mqtt.py @@ -13,7 +13,7 @@ MAP_VALUES: Dict[DataName, Dict[str, Any]] = { # DataName.BATTERY_VOLTAGE_MIN: {}, # DataName.BATTERY_VOLTAGE_MAX: {}, # DataName.CHARGE_MAX_CURRENT: {}, - # DataName._DISCHARGE_MAX_CURRENT: {}, + # DataName.DISCHARGE_MAX_CURRENT: {}, # DataName.CHARGE_MAX_POWER: {}, # DataName.DISCHARGE_MAX_POWER: {}, # DataName.CHARGE_AMP_HOUR: {}, diff --git a/srnemqtt/solar_types.py b/srnemqtt/solar_types.py index daf62bc..94c387f 100644 --- a/srnemqtt/solar_types.py +++ b/srnemqtt/solar_types.py @@ -22,7 +22,7 @@ class DataName(str, Enum): BATTERY_VOLTAGE_MIN = "battery_voltage_min" BATTERY_VOLTAGE_MAX = "battery_voltage_max" CHARGE_MAX_CURRENT = "charge_max_current" - _DISCHARGE_MAX_CURRENT = "_discharge_max_current?" + DISCHARGE_MAX_CURRENT = "discharge_max_current" CHARGE_MAX_POWER = "charge_max_power" DISCHARGE_MAX_POWER = "discharge_max_power" CHARGE_AMP_HOUR = "charge_amp_hour" @@ -105,7 +105,7 @@ HISTORICAL_DATA = [ DataItem(DataName.BATTERY_VOLTAGE_MIN, "H", "V", lambda n: n / 10), DataItem(DataName.BATTERY_VOLTAGE_MAX, "H", "V", lambda n: n / 10), DataItem(DataName.CHARGE_MAX_CURRENT, "H", "A", lambda n: n / 100), - DataItem(DataName._DISCHARGE_MAX_CURRENT, "H", "A", lambda n: n / 100), + DataItem(DataName.DISCHARGE_MAX_CURRENT, "H", "A", lambda n: n / 100), DataItem(DataName.CHARGE_MAX_POWER, "H", "W"), DataItem(DataName.DISCHARGE_MAX_POWER, "H", "W"), DataItem(DataName.CHARGE_AMP_HOUR, "H", "Ah"), @@ -161,7 +161,7 @@ class ChargerState(DecodedData): _panel_current, _panel_power, _load_enabled, - ) = struct.unpack("HHHBBHHHHHHx?", data) + ) = struct.unpack("!HHHBBHHHHHHx?", data) self.battery_charge = _battery_charge self.battery_voltage = _battery_voltage / 10 @@ -212,7 +212,7 @@ class HistoricalData(DecodedData): battery_voltage_min: float battery_voltage_max: float charge_max_current: float - _discharge_max_current: float + discharge_max_current: float charge_max_power: int discharge_max_power: int charge_amp_hour: int @@ -225,19 +225,19 @@ class HistoricalData(DecodedData): _battery_voltage_min, _battery_voltage_max, _charge_max_current, - __discharge_max_current, + _discharge_max_current, _charge_max_power, _discharge_max_power, _charge_amp_hour, _discharge_amp_hour, _production_energy, _consumption_energy, - ) = struct.unpack("HHHHHHHHHH", data) + ) = struct.unpack("!HHHHHHHHHH", data) self.battery_voltage_min = _battery_voltage_min / 10 self.battery_voltage_max = _battery_voltage_max / 10 self.charge_max_current = _charge_max_current / 100 - self._discharge_max_current = __discharge_max_current / 100 + self.discharge_max_current = _discharge_max_current / 100 self.charge_max_power = _charge_max_power self.discharge_max_power = _discharge_max_power self.charge_amp_hour = _charge_amp_hour @@ -250,7 +250,7 @@ class HistoricalData(DecodedData): DataName.BATTERY_VOLTAGE_MIN: self.battery_voltage_min, DataName.BATTERY_VOLTAGE_MAX: self.battery_voltage_max, DataName.CHARGE_MAX_CURRENT: self.charge_max_current, - DataName._DISCHARGE_MAX_CURRENT: self._discharge_max_current, + DataName.DISCHARGE_MAX_CURRENT: self.discharge_max_current, DataName.CHARGE_MAX_POWER: self.charge_max_power, DataName.DISCHARGE_MAX_POWER: self.discharge_max_power, DataName.CHARGE_AMP_HOUR: self.charge_amp_hour, @@ -278,7 +278,7 @@ class HistoricalExtraInfo(DecodedData): _total_discharge_amp_hours, _total_production_energy, _total_consumption_energy, - ) = struct.unpack("HHHLLLL", data) + ) = struct.unpack("!HHHLLLL", data) self.run_days = _run_days self.discharge_count = _discharge_count