Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 23 additions & 19 deletions packages/modules/devices/kostal/kostal_steca/inverter.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import xml.etree.ElementTree as ET
from math import isnan

from requests.adapters import HTTPAdapter

from modules.common import req
from modules.common.abstract_device import AbstractInverter
from modules.common.component_state import InverterState
Expand Down Expand Up @@ -47,26 +49,28 @@ def get_values(self) -> Tuple[float, Optional[float]]:
# DetMoerk 20210323: Anpassung für ein- und dreiphasige WR der Serie. Anstatt eine feste Zeile aus
# dem Ergebnis zu schneiden wird nach der Zeile mit AC_Power gesucht.

# call for XML file and parse it for current PV power
measurements = req.get_http_session().get("http://" + self.ip_address + "/measurements.xml", timeout=2).text
power_raw = ET.fromstring(measurements).find(".//Measurement[@Type='AC_Power']").get("Value")
power = 0 if power_raw is None else float(power_raw) * -1
power = 0 if isnan(power) else power
with req.get_http_session() as session:
session.default_timeout = 2
session.mount("http://", HTTPAdapter(max_retries=2))
# call for XML file and parse it for current PV power
measurements = session.get("http://" + self.ip_address + "/measurements.xml").text
power_raw = ET.fromstring(measurements).find(".//Measurement[@Type='AC_Power']").get("Value")
power = 0 if power_raw is None else float(power_raw) * -1
power = 0 if isnan(power) else power

if self.component_config.configuration.variant_steca:
# call for XML file and parse it for total produced kwh
yields = req.get_http_session().get("http://" + self.ip_address + "/yields.xml", timeout=2).text
exported = float(ET.fromstring(yields).find(".//Yield[@Type='Produced']/YieldValue").get("Value"))
else:
# call for .js file and parse it for total produced Wh
yields = req.get_http_session().get("http://" + self.ip_address + "/gen.yield.total.chart.js",
timeout=2).text
match = re.search(r'"data":\s*\[\s*([^\]]*)\s*]', yields)
try:
exported = sum(float(s) * 1e6 for s in match.group(1).split(','))
except AttributeError:
log.debug("PVkWh: Could not find 'data' in gen.yield.total.chart.js.")
exported = None
if self.component_config.configuration.variant_steca:
# call for XML file and parse it for total produced kwh
yields = session.get("http://" + self.ip_address + "/yields.xml").text
exported = float(ET.fromstring(yields).find(".//Yield[@Type='Produced']/YieldValue").get("Value"))
else:
# call for .js file and parse it for total produced Wh
yields = session.get("http://" + self.ip_address + "/gen.yield.total.chart.js").text
match = re.search(r'"data":\s*\[\s*([^\]]*)\s*]', yields)
try:
exported = sum(float(s) * 1e6 for s in match.group(1).split(','))
except AttributeError:
log.debug("PVkWh: Could not find 'data' in gen.yield.total.chart.js.")
exported = None
_, exported = self.peak_filter.check_values(power, None, exported)
return power, exported

Expand Down
Loading