Motivation/Information
Die Fronius HA Integration kann nicht die Events (aka “Service Messages”) auslesen – will man also Inverter von der Cloud befreien verliert man die Informationen über Fehler oder sonstige Events am Inverter (die Fronius/SolarWeb sonst per Mail weiterleitet, inklusive XLSX Zusammenfassung pro Tag).
Lösung: Custom component welche vom Inverter die Events ausliest, filtert (aktueller Tag) und die Anzahl an Events als Sensor zur Verfügung stellt – man muss dann zwar noch immer am Inverter nachschauen gehen (Customer Login notwendig obwohl die API/URL ohne Auth verfügbar ist). Trotzdem kann man so auf Events aufmerksam machen und Automations an die Zahl hängen.
Die URL hinter den Events ist http://meininverter/status/events (für den oberen Bereich im GUI (“Current Messages”) gilt wohl die URL http://meininverter/status/activeEvents?sync=true) – liefert JSON array mit folgenden Inhalten:
Im Inverter GUI sieht der Event so aus:
viewer | nur die mit “1” scheinen im Web GUI vom Inverter auf mögliche andere Werte: 1,3 |
prefix+eventID | ergibt zusammengefügt die zweite Spalte (“Code”) |
sourceID | ergibt die erste Spalte (“Source”) |
timestamp | Unix FILETIME wann der Event aufgetreten ist (=vierte Spalte im GUI “Time”) |
activeUntil | Unix FILETIME fünfte Spalte im GUI (“Active until”) |
Der Text in der dritten Spalte kann je nach Sprache über eine JSON query in http://meininverter/app/assets/i18n/StateCodeTranslations/en.json erfragt werden (LG2 wäre GEN24 im obigen Beispiel):
Einrichtung
Im Home Assistant unter homeassistant/custom_components einen Ordner “FroniusEvents” erzeugen und folgende Dateien erzeugen:
__init__.py
"""Fronius event sensor"""
manifest.json
{
"domain": "FroniusEvents",
"name": "Fronius event sensor",
"codeowners": [],
"dependencies": [],
"documentation": "https://roman.gallauner.at/home-assistant-fronius-event-sensor/",
"iot_class": "local_polling",
"requirements": [],
"version": "1.0.0"
}
sensor.py
"""Platform for Fronius event sensor."""
from __future__ import annotations
import logging
import json
import requests
import time
from datetime import datetime
import voluptuous as vol
# Import the device class from the component that you want to support
import homeassistant.helpers.config_validation as cv
from homeassistant.const import CONF_HOST
from homeassistant.core import HomeAssistant
from homeassistant.components.sensor import (PLATFORM_SCHEMA,SensorEntity)
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
_LOGGER = logging.getLogger(__name__)
# Validation of the user's configuration
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_HOST): cv.string,
})
def setup_platform(
hass: HomeAssistant,
config: ConfigType,
add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None
) -> None:
_LOGGER.debug("setup_platform with host "+config[CONF_HOST])
# Add devices
add_entities([FroniusEventsSensor(config[CONF_HOST])])
class FroniusEventsSensor(SensorEntity):
"""Representation of the Fronius events sensor."""
_host = ""
_include = ""
_attr_name = "Fronius events today"
def __init__(self, host) -> None:
"""Initialize FroniusEventsSensor"""
_LOGGER.debug("__init__ with host "+host)
self._host=host
def update(self) -> None:
"""Fetch new state data for the sensor.
This is the only method that should fetch new data for Home Assistant.
"""
def getEvents(url) -> int:
_LOGGER.debug("FroniusEventsSensor::getEvents - fetching data from "+url)
response=requests.get(url)
data=response.json()
_LOGGER.debug("FroniusEventsSensor::getEvents - got "+str(len(data))+" events")
now=datetime.now()
timestamp_threshold=int(now.replace(hour=0,minute=0,second=0,microsecond=0).timestamp())
filtered_data=[item for item in data if item['timestamp'] > timestamp_threshold and item['viewer'] == 1]
_LOGGER.debug("FroniusEventsSensor::getEvents - filtered events: "+str(len(filtered_data)))
return int(len(filtered_data))
events=0
events += getEvents("http://"+self._host+"/status/events")
events += getEvents("http://"+self._host+"/status/activeEvents?sync=true")
self._attr_native_value = events
Im configuration.yaml noch aktivieren:
sensor:
- platform: FroniusEvents
host: meininverter
Home Assistant restarten und schon sollte eine neue Integration mit einer Entity (ID sensor.fronius_events_today) auftauchen. Darauf aufbauend kann man dann Automations bauen (z.B. Notify wenn > 0).
Um das DEBUG Logging zu sehen muss man im configuration.yaml für diese Komponente Level entsprechend anpassen, Beispiel:
logger:
default: info
logs:
custom_components.FroniusEvents.sensor: debug