diff --git a/src/akkudoktoreos/devices/inverter.py b/src/akkudoktoreos/devices/inverter.py index 11b02b1..708a688 100644 --- a/src/akkudoktoreos/devices/inverter.py +++ b/src/akkudoktoreos/devices/inverter.py @@ -25,6 +25,22 @@ class Inverter(DeviceBase): self.parameters: Optional[InverterParameters] = None super().__init__(parameters) + self.scr_lookup: dict = {} + + def _calculate_scr(self, consumption: float, generation: float) -> float: + """Check if the consumption and production is in the lookup table. If not, calculate and store the value.""" + if consumption not in self.scr_lookup: + self.scr_lookup[consumption] = {} + + if generation not in self.scr_lookup[consumption]: + scr = self.self_consumption_predictor.calculate_self_consumption( + consumption, generation + ) + self.scr_lookup[consumption][generation] = scr + return scr + + return self.scr_lookup[consumption][generation] + def _setup(self) -> None: if self.parameters is None: raise ValueError(f"Parameters not set: {self.parameters}") @@ -60,9 +76,8 @@ class Inverter(DeviceBase): grid_import = -remaining_power # Negative indicates feeding into the grid self_consumption = self.max_power_wh else: - scr = self.self_consumption_predictor.calculate_self_consumption( - consumption, generation - ) + # Calculate scr with lookup table + scr = self._calculate_scr(consumption, generation) # Remaining power after consumption remaining_power = (generation - consumption) * scr # EVQ