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:

viewernur die mit “1” scheinen im Web GUI vom Inverter auf mögliche andere Werte: 1,3
prefix+eventIDergibt zusammengefügt die zweite Spalte (“Code”)
sourceIDergibt die erste Spalte (“Source”)
timestampUnix FILETIME wann der Event aufgetreten ist (=vierte Spalte im GUI “Time”)
activeUntilUnix 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