diff --git a/packages/control/consumer/consumer.py b/packages/control/consumer/consumer.py index fa5f5e0343..e3ee79e115 100644 --- a/packages/control/consumer/consumer.py +++ b/packages/control/consumer/consumer.py @@ -45,22 +45,24 @@ def setup_values_at_start(self): def update(self): try: self.setup_values_at_start() + if self.data.get.voltages == [230.0]*3: + self.data.get.voltages = [230 if i < self.data.config.connected_phases else 0 + for i in range(0, 3)] + if self.data.get.currents == [0.0]*3: + for i in range(0, self.data.config.connected_phases): + voltage = self.data.get.voltages[i] + if voltage != 0: + self.data.get.currents[i] = (self.data.get.power / + self.data.config.connected_phases / + voltage) + self.data.get.phases_in_use = self.data.config.connected_phases + self.data.set.phases_to_use = self.data.config.connected_phases + self.data.get.charge_state = max(self.data.get.currents) > self.STANDBY_THRESHOLD + self.process_on_time() + if self.data.usage.type in NOT_CONTROLLED: return else: - # Gegen den Default statt auf None prüfen, sonst bleibt ein Array mit der alten Phasenzahl stehen, - # wenn connected_phases nachträglich geändert wird (zB 3 auf 1 Phase). - if self.data.get.voltages == [230.0]*3: - self.data.get.voltages = [230 if i < self.data.config.connected_phases else 0 - for i in range(0, 3)] - if self.data.get.currents == [0.0]*3: - for i in range(0, self.data.config.connected_phases): - self.data.get.currents[i] = (self.data.get.power / - self.data.config.connected_phases / - self.data.get.voltages[i]) - self.data.get.phases_in_use = self.data.config.connected_phases - self.data.set.phases_to_use = self.data.config.connected_phases - self.data.get.charge_state = max(self.data.get.currents) > self.STANDBY_THRESHOLD self.reset_chargemode_at_time() self.is_switch_interval_elapsed() required_current, message, mode, submode = self.get_parameter() @@ -70,7 +72,6 @@ def update(self): self.set_control_parameter(required_current, self.data.config.connected_phases, submode, mode) self.set_state_and_log(message) - self.process_on_time() log.debug(f"Verbraucher {self.num}: Sollstrom {required_current}, " f"min. Ist-Strom {max(self.data.get.currents)}," f" Modus {mode}, Submodus {submode}, {message}") diff --git a/packages/modules/loadvars.py b/packages/modules/loadvars.py index a51c14c2e9..a2dfab43bd 100644 --- a/packages/modules/loadvars.py +++ b/packages/modules/loadvars.py @@ -27,6 +27,7 @@ def get_values(self) -> None: try: not_finished_threads = self._set_values() levels = data.data.counter_all_data.get_list_of_elements_per_level() + self._add_extra_meter_counters_to_levels(levels) levels.reverse() for level in levels: self._update_values_of_level_buttom_top(level, not_finished_threads) @@ -46,6 +47,33 @@ def get_values(self) -> None: except Exception: log.exception("Fehler im loadvars-Modul") + def _add_extra_meter_counters_to_levels(self, levels: List[List[dict]]) -> None: + """Ergänzt Zähler, die als separate Leistungsmessung einem Verbraucher zugeordnet sind. + + Diese Zähler werden aus der Hierarchie entfernt, damit sie nicht zusätzlich in die + Summenbildung eingehen. Ihre Werte müssen aber trotzdem veröffentlicht werden, bevor + der zugehörige Verbraucher seine Werte aus dem Zähler übernimmt. + """ + known_counter_ids = { + element["id"] + for level in levels + for element in level + if element["type"] == ComponentType.COUNTER.value + } + extra_meter_level = [] + for consumer in data.data.consumer_data.values(): + extra_meter_id = consumer.data.extra_meter + if extra_meter_id is None: + continue + if f"counter{extra_meter_id}" not in data.data.counter_data: + continue + if extra_meter_id in known_counter_ids: + continue + extra_meter_level.append({"type": ComponentType.COUNTER.value, "id": extra_meter_id}) + known_counter_ids.add(extra_meter_id) + if extra_meter_level: + levels.append(extra_meter_level) + def _set_values(self) -> List[str]: """Threads, um Werte von Geräten abzufragen""" modules_threads: List[Thread] = []