Ejemplo n.º 1
0
 def update(self) -> None:
     log.MainLogger().debug("Start device reading " + str(self._components))
     if len(self._components) == 1:
         for component in self._components:
             if isinstance(self._components[component], inverter.PowerdogInverter):
                 with SingleComponentUpdateContext(self._components[component].component_info):
                     self._components[component].update()
             else:
                 raise Exception(
                     "Wenn ein EVU-Zähler konfiguriert wurde, muss immer auch ein WR konfiguriert sein.")
     elif len(self._components) == 2:
         with MultiComponentUpdateContext(self._components):
             for component in self._components:
                 if isinstance(self._components[component], counter.PowerdogCounter):
                     home_consumption = self._components[component].update()
                 elif isinstance(self._components[component], inverter.PowerdogInverter):
                     inverter_power = self._components[component].update()
                 else:
                     raise Exception(
                         "illegal component type " + self._components[component].component_config["type"] +
                         ". Allowed values: " + ','.join(COMPONENT_TYPE_TO_MODULE.keys()))
             counter_power = home_consumption + inverter_power
             for component in self._components:
                 if isinstance(self._components[component], counter.PowerdogCounter):
                     self._components[component].set_counter_state(counter_power)
     else:
         log.MainLogger().warning(
             self.device_config["name"] +
             ": Es konnten keine Werte gelesen werden, da noch keine oder zu viele Komponenten konfiguriert wurden."
         )
Ejemplo n.º 2
0
    def update(self) -> None:
        log.debug("Beginning update")
        with MultiComponentUpdateContext(self._components):
            if not self._components:
                raise FaultState.warning("Keine Komponenten konfiguriert")

            with SpeedwireListener(timeout_seconds) as speedwire:
                self.__read_speedwire(speedwire)

        log.debug("Update complete")
Ejemplo n.º 3
0
 def update(self) -> None:
     log.debug("Start device reading " + str(self.components))
     if self.components:
         with MultiComponentUpdateContext(self.components):
             for component in self.components:
                 self.components[component].update()
     else:
         log.warning(
             self.device_config.name +
             ": Es konnten keine Werte gelesen werden, da noch keine Komponenten konfiguriert wurden."
         )
Ejemplo n.º 4
0
 def update(self) -> None:
     log.MainLogger().debug("Start device reading " + str(self._components))
     if self._components:
         with MultiComponentUpdateContext(self._components):
             response = req.get_http_session().get(self.device_config["configuration"]["ip_address"], timeout=5)
             for component in self._components:
                 self._components[component].update(response.json())
     else:
         log.MainLogger().warning(
             self.device_config["name"] +
             ": Es konnten keine Werte gelesen werden, da noch keine Komponenten konfiguriert wurden."
         )
Ejemplo n.º 5
0
 def update(self) -> None:
     log.MainLogger().debug("Start device reading " + str(self._components))
     if self._components:
         with MultiComponentUpdateContext(self._components):
             # zuerst den WR auslesen
             for component in self._components:
                 if isinstance(self._components[component],
                               inverter.FroniusInverter):
                     power_inverter = self._components[component].update()
                     break
             else:
                 power_inverter = 0
             # dann Zähler auslesen und Werte verrechnen
             for component in self._components:
                 if isinstance(self._components[component],
                               counter_sm.FroniusSmCounter):
                     counter_state, meter_location = self._components[
                         component].update()
                     if meter_location == meter.MeterLocation.load:
                         # wenn SmartMeter im Verbrauchszweig sitzt sind folgende Annahmen getroffen:
                         # PV Leistung wird gleichmäßig auf alle Phasen verteilt
                         # Spannungen und Leistungsfaktoren sind am Verbrauchszweig == Einspeisepunkt
                         # Hier gehen wir mal davon aus, dass der Wechselrichter seine PV-Leistung gleichmäßig
                         # auf alle Phasen aufteilt.
                         powers = [
                             -1 * power - power_inverter / 3
                             for power in counter_state.powers
                         ]
                         # Wegen der geänderten Leistungen sind die Ströme erneut zu berechnen
                         currents = [
                             powers[i] / counter_state.voltages[i]
                             for i in range(0, 3)
                         ]
                         counter_state.powers = powers
                         counter_state.currents = currents
                     self._components[component].set_counter_state(
                         counter_state)
                     break
                 elif isinstance(self._components[component],
                                 counter_s0.FroniusS0Counter):
                     counter_state = self._components[component].update()
                     counter_state.power += power_inverter
                     self._components[component].set_counter_state(
                         counter_state)
                     break
             for component in self._components:
                 if isinstance(self._components[component], bat.FroniusBat):
                     self._components[component].update()
     else:
         log.MainLogger().warning(
             self.device_config["name"] +
             ": Es konnten keine Werte gelesen werden, da noch keine Komponenten konfiguriert wurden."
         )
Ejemplo n.º 6
0
 def update(self) -> None:
     log.debug("Start device reading " + str(self.components))
     if self.components:
         with MultiComponentUpdateContext(self.components):
             resp_json = req.get_http_session().get(
                 'http://' + self.device_config.configuration.ip_address + '/api.php?get=currentstate',
                 timeout=5).json()
             for component in self.components:
                 self.components[component].update(resp_json)
     else:
         log.warning(
             self.device_config.name +
             ": Es konnten keine Werte gelesen werden, da noch keine Komponenten konfiguriert wurden."
         )
Ejemplo n.º 7
0
    def update(self) -> None:
        log.debug("Start device reading " + str(self.components))
        if self.components:
            with MultiComponentUpdateContext(self.components):
                session = req.get_http_session()
                response = self._request_data(session)
                # missing "auth" in response indicates success
                if (response.get('auth') == "auth_key failed"
                        or response.get('auth') == "auth timeout"
                        or response.get('auth') == "not done"):
                    self._update_session_key(session)
                    response = self._request_data(session)

                for component in self.components:
                    self.components[component].update(response)
        else:
            log.warning(
                self.device_config.name +
                ": Es konnten keine Werte gelesen werden, da noch keine Komponenten konfiguriert wurden."
            )
Ejemplo n.º 8
0
 def update(self) -> None:
     log.debug("Start device reading " + str(self.components))
     if self.components:
         total_power = 0
         with MultiComponentUpdateContext(self.components):
             with self.client:
                 for component in self.components.values():
                     if isinstance(component, bat.SolaredgeBat):
                         parent = data.data.counter_data[
                             "all"].get_entry_of_parent(
                                 component.component_config.id)
                         if parent.get("type") != "inverter":
                             log.warning(
                                 "Solaredge-Speicher sollten als Hybrid-System konfiguriert werden, d.h. "
                                 +
                                 "die Speicher sind in der Hierarchie unter den Wechselrichtern "
                                 + "anzuordnen.")
                         state = component.read_state()
                         component.update(state)
                         if self.device_config.configuration.fix_only_bat_discharging:
                             total_power -= min(state.power, 0)
                         else:
                             total_power -= state.power
                 for component in self.components.values():
                     if (isinstance(component, inverter.SolaredgeInverter)
                             or isinstance(
                                 component, external_inverter.
                                 SolaredgeExternalInverter)):
                         state = component.read_state()
                         # In 1.9 wurde bisher die Summe der WR-Leistung um die Summe der Batterie-Leistung
                         # bereinigt. Zähler und Ströme wurden nicht bereinigt.
                         state.power = state.power - total_power / self.inverter_counter
                         component.update(state)
                 for component in self.components.values():
                     if isinstance(component, counter.SolaredgeCounter):
                         component.update()
     else:
         log.warning(
             self.device_config.name +
             ": Es konnten keine Werte gelesen werden, da noch keine Komponenten konfiguriert wurden."
         )
Ejemplo n.º 9
0
    def update(self) -> None:
        log.debug("Beginning update")
        cookies = None
        address = self.device_config.configuration.ip_address
        email = self.device_config.configuration.email
        password = self.device_config.configuration.password
        with MultiComponentUpdateContext(self.components):
            try:
                cookies = json.loads(COOKIE_FILE.read_text())
            except FileNotFoundError:
                log.debug(
                    "Cookie-File <%s> does not exist. It will be created.",
                    COOKIE_FILE)
            except JSONDecodeError:
                log.warning("Could not parse Cookie-File " + str(COOKIE_FILE) +
                            ". It will be re-created.",
                            exc_info=True)

            session = get_http_session()
            if cookies is None:
                self.__authenticate_and_update(session, address, email,
                                               password,
                                               self.__update_components)
                return
            try:
                self.__update_components(
                    PowerwallHttpClient(address, session, cookies))
                return
            except HTTPError as e:
                if e.response.status_code != 401 and e.response.status_code != 403:
                    raise e
                log.warning(
                    "Login to powerwall with existing cookie failed. Will retry with new cookie..."
                )
            self.__authenticate_and_update(session, address, email, password,
                                           self.__update_components)
            log.debug("Update completed successfully")