diff --git a/packages/modules/devices/shelly/shelly/bat.py b/packages/modules/devices/shelly/shelly/bat.py index 994f7a7208..c340d0a370 100644 --- a/packages/modules/devices/shelly/shelly/bat.py +++ b/packages/modules/devices/shelly/shelly/bat.py @@ -34,13 +34,14 @@ def initialize(self) -> None: self.store = get_bat_value_store(self.component_config.id) self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) - def total_power_from_shelly(self) -> int: - total = 0 + def update(self) -> None: + power = 0 if self.generation == 1: status_url = "http://" + self.address + "/status" else: status_url = "http://" + self.address + "/rpc/Shelly.GetStatus" status = req.get_http_session().get(status_url, timeout=3).json() + try: if self.generation == 1: if 'meters' in status: @@ -49,28 +50,33 @@ def total_power_from_shelly(self) -> int: meters = status['emeters'] # shellyEM & shelly3EM # shellyEM has one meter, shelly3EM has three meters: for meter in meters: - total = total + meter['power'] + power = power + meter['power'] + currents = [0, 0, 0] else: - if 'switch:0' in status: - total = status['switch:0']['apower'] + if 'switch:0' in status and 'apower' in status['switch:0']: + power = status['switch:0']['apower'] + currents = [status['switch:0']['current'], 0, 0] + elif 'em1:0' in status: + power = status['em1:0']['act_power'] # shelly Pro EM Gen 2 + currents = [status['em1:0']['current'], 0, 0] elif 'pm1:0' in status: - total = status['pm1:0']['apower'] # shelly PM Mini Gen 3 + power = status['pm1:0']['apower'] # shelly PM Mini Gen 3 + currents = [status['pm1:0']['current'], 0, 0] else: - total = status['em:0']['total_act_power'] # shelly Pro3EM - except KeyError: - log.exception("unsupported shelly device?") - finally: - return int(total) + power = status['em:0']['total_act_power'] # shelly Pro3EM + currents = [meter[f'{i}_current'] for i in 'abc'] - def update(self) -> None: - bat = self.total_power_from_shelly() * self.factor - imported, exported = self.sim_counter.sim_count(bat) - bat_state = BatState( - power=bat, - imported=imported, - exported=exported - ) - self.store.set(bat_state) + power = power * self.factor + imported, exported = self.sim_counter.sim_count(power) + bat_state = BatState( + power=power, + imported=imported, + exported=exported, + currents=currents + ) + self.store.set(bat_state) + except KeyError: + log.exception("unsupported shelly device.") component_descriptor = ComponentDescriptor(configuration_factory=ShellyBatSetup) diff --git a/packages/modules/devices/shelly/shelly/counter.py b/packages/modules/devices/shelly/shelly/counter.py index 995bda7df0..3c4ebadf41 100644 --- a/packages/modules/devices/shelly/shelly/counter.py +++ b/packages/modules/devices/shelly/shelly/counter.py @@ -63,13 +63,32 @@ def update(self) -> None: power_factors = [meter[f'{i}_pf'] for i in 'abc'] power = meter['total_act_power'] * self.factor # Shelly MiniPM G3 - else: - meter = status['pm1:0'] + elif "pm1:0" in status: log.debug("single phase shelly") + meter = status['pm1:0'] voltages = [meter['voltage'], 0, 0] currents = [meter['current'], 0, 0] power = meter['apower'] frequency = meter['freq'] + powers = [meter['apower'], 0, 0] + elif 'switch:0' in status and 'apower' in status['switch:0']: + log.debug("single phase shelly") + meter = status['switch:0'] + power = meter['apower'] + voltages = [meter['voltage'], 0, 0] + currents = [meter['current'], 0, 0] + frequency = meter['freq'] + power_factors = [meter['pf'], 0, 0] + powers = [meter['apower'], 0, 0] + else: + log.debug("single phase shelly") + meter = status['em1:0'] + power = meter['act_power'] # shelly Pro EM Gen 2 + voltages = [meter['voltage'], 0, 0] + currents = [meter['current'], 0, 0] + frequency = meter['freq'] + power_factors = [meter['pf'], 0, 0] + powers = [meter['act_power'], 0, 0] imported, exported = self.sim_counter.sim_count(power) diff --git a/packages/modules/devices/shelly/shelly/inverter.py b/packages/modules/devices/shelly/shelly/inverter.py index d8a1285d38..7ef7818914 100644 --- a/packages/modules/devices/shelly/shelly/inverter.py +++ b/packages/modules/devices/shelly/shelly/inverter.py @@ -34,8 +34,8 @@ def initialize(self) -> None: self.store = get_inverter_value_store(self.component_config.id) self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) - def total_power_from_shelly(self) -> int: - total = 0 + def update(self) -> None: + power = 0 if self.generation == 1: status_url = "http://" + self.address + "/status" else: @@ -49,27 +49,31 @@ def total_power_from_shelly(self) -> int: meters = status['emeters'] # shellyEM & shelly3EM # shellyEM has one meter, shelly3EM has three meters: for meter in meters: - total = total + meter['power'] + power = power + meter['power'] else: - if 'switch:0' in status: - total = status['switch:0']['apower'] + if 'switch:0' in status and 'apower' in status['switch:0']: + power = status['switch:0']['apower'] + currents = [status['switch:0']['current'], 0, 0] + elif 'em1:0' in status: + power = status['em1:0']['act_power'] # shelly Pro EM Gen 2 + currents = [status['em1:0']['current'], 0, 0] elif 'pm1:0' in status: - total = status['pm1:0']['apower'] # shelly PM Mini Gen 3 + power = status['pm1:0']['apower'] # shelly PM Mini Gen 3 + currents = [status['pm1:0']['current'], 0, 0] else: - total = status['em:0']['total_act_power'] # shelly Pro3EM - except KeyError: - log.exception("unsupported shelly device?") - finally: - return int(total) + power = status['em:0']['total_act_power'] # shelly Pro3EM + currents = [meter[f'{i}_current'] for i in 'abc'] - def update(self) -> None: - pv = self.total_power_from_shelly() * self.factor - _, pv_exported = self.sim_counter.sim_count(pv) - inverter_state = InverterState( - power=pv, - exported=pv_exported - ) - self.store.set(inverter_state) + pv = self.total_power_from_shelly() * self.factor + _, exported = self.sim_counter.sim_count(pv) + inverter_state = InverterState( + power=pv, + exported=exported, + currents=currents + ) + self.store.set(inverter_state) + except KeyError: + log.exception("unsupported shelly device.") component_descriptor = ComponentDescriptor(configuration_factory=ShellyInverterSetup) diff --git a/packages/modules/devices/shelly/shelly/shelly_test.py b/packages/modules/devices/shelly/shelly/shelly_test.py index 7825623a5f..8be2aa50e5 100644 --- a/packages/modules/devices/shelly/shelly/shelly_test.py +++ b/packages/modules/devices/shelly/shelly/shelly_test.py @@ -56,4 +56,4 @@ def test_counter_shelly_minipm_g3(monkeypatch, requests_mock: requests_mock.mock SAMPLE_COUNTER_STATE = CounterState(voltages=[230.9, 0, 0], power=230, currents=[ - 1, 0, 0], frequency=51, imported=100, exported=200) + 1, 0, 0], frequency=51, imported=100, exported=200, powers=[230, 0, 0])