LW IT Solutions logo LW IT Solutions logo LW IT Solutions
« Blog-Übersicht /Smart Home / Integration des Fronius Symo Wechselrichters in Smart...
Diesen Artikel in anderen Sprachen lesen:

Integration des Fronius Symo Wechselrichters in Smart Home Systeme

Integration des Fronius Symo Wechselrichters in Smart Home SystemeIntegration des Fronius Symo Wechselrichters in Smart Home Systeme

Management Summary

Der Fronius Symo wandelt Strom aus Solarmodulen in nutzbaren Haushaltsstrom um. Die Produktionswerte lassen sich zusätzlich auf einer lokalen Anzeige oder in Home Assistant, einer Steuerung für das vernetzte Zuhause, darstellen. So werden die aktuelle Leistung und die im Tagesverlauf erzeugte Energie ohne Cloud-Verbindung für den Abruf sichtbar. Das erleichtert den Überblick über die Solaranlage. Automatisches Laden oder Heizen braucht zusätzlich den Hausverbrauch, denn hohe Erzeugung bedeutet nicht automatisch freien Überschuss.

Inhalt
  1. Leistung und Energie auseinanderhalten
  2. Kleine PHP-Anzeige mit Fehlerbehandlung
  3. Home Assistant und Überschussnutzung
  4. Fragen und Antworten
  5. Quellen

Der Fronius Symo kann Messwerte über die lokale Solar API bereitstellen. Damit lässt sich die PV-Produktion auf einer kleinen Webseite anzeigen oder in Home Assistant auswerten. Voraussetzungen sind eine passende Kommunikationsausstattung, eine erreichbare lokale Adresse und verfügbare API-Daten. Eine Cloud-Verbindung ist für diese lokale Abfrage nicht erforderlich.

Leistung und Energie auseinanderhalten

PAC beschreibt die aktuelle AC-Leistung in Watt. DAY_ENERGY ist die erzeugte Tagesenergie in Wattstunden. Watt beschreibt die Leistung in diesem Moment. Bleibt die Erzeugung eine Stunde lang bei 2.000 W, kommen 2.000 Wh beziehungsweise 2 kWh Energie hinzu. Verfügbare Felder und Genauigkeit hängen von Gerät und Firmware ab; insbesondere lassen sich Angaben zum klassischen Symo nicht ungeprüft auf Symo GEN24 übertragen.

Der Beispielendpunkt verwendet GetInverterRealtimeData.cgi, Scope=Device, DeviceId=1 und DataCollection=CommonInverterData. IP-Adresse und Gerätekennung müssen zur Anlage passen. Die Platzhalteradresse ist kein allgemeiner Fronius-Standard.

Kleine PHP-Anzeige mit Fehlerbehandlung

Das folgende Beispiel benötigt PHP 8 mit cURL und einen lokalen Webserver mit Zugriff auf den Wechselrichter. Eine Netzwerk- oder VPN-Verbindung zum lokalen Server ist auch für die Smartphone-Anzeige erforderlich. Die Seite lädt nach fünf Minuten erneut; Browser und Widget-Apps können Aktualisierungen im Hintergrund verzögern. Das Intervall eignet sich zur Übersicht, nicht für schnelle Regelung.

Die Anzeige prüft HTTP-Antwort, JSON und API-Status. Fehlende Werte erhalten den Zustand „unavailable“, also „nicht verfügbar“. Eine gemeldete Null bleibt dagegen eine gültige Null. Der API-Zeitstempel erscheint separat, damit ein älterer Datenstand erkennbar bleibt. Das Beispiel speichert bewusst keine Ersatzwerte und führt keine Schaltbefehle aus.

PHP
<?php
declare(strict_types=1);
header('Cache-Control: no-store');
// Local inverter address and device ID are installation-specific.
$url = 'http://192.168.1.50/solar_api/v1/GetInverterRealtimeData.cgi?'
     . 'Scope=Device&DeviceId=1&DataCollection=CommonInverterData';

function measurement(array $data, string $key, string $unit): ?float {
    $entry = $data[$key] ?? null;
    if (!is_array($entry) || ($entry['Unit'] ?? null) !== $unit) {
        return null;
    }
    $value = $entry['Value'] ?? null;
    return (is_int($value) || is_float($value)) && is_finite((float)$value)
        ? (float)$value : null;
}

$power = $energy = null;
$sampleTime = null;
$state = 'unavailable';
try {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CONNECTTIMEOUT => 2,
        CURLOPT_TIMEOUT => 5,
        CURLOPT_FOLLOWLOCATION => false,
    ]);
    $raw = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    curl_close($ch);
    if (!is_string($raw) || $status !== 200) {
        throw new RuntimeException('HTTP request failed');
    }
    $reply = json_decode($raw, true, 64, JSON_THROW_ON_ERROR);
    if (!is_array($reply) || ($reply['Head']['Status']['Code'] ?? null) !== 0
        || !is_array($reply['Body']['Data'] ?? null)) {
        throw new RuntimeException('Invalid API response');
    }
    $power = measurement($reply['Body']['Data'], 'PAC', 'W');
    $energy = measurement($reply['Body']['Data'], 'DAY_ENERGY', 'Wh');
    $sampleTime = $reply['Head']['Timestamp'] ?? null;
    $state = ($power === null && $energy === null) ? 'unavailable' : 'response received';
} catch (Throwable $e) {
    error_log('PV display: request or response unavailable');
}
function esc(string $text): string {
    return htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>
<!doctype html>
<html lang="en"><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="refresh" content="300">
<title>PV measurements</title>
<style>body{font:20px sans-serif;margin:2rem;background:#f5f7fa;color:#17202a}</style>
<h1>PV</h1>
<p>PAC: <?= $power === null ? 'unavailable' : esc((string)$power) . ' W' ?></p>
<p>DAY_ENERGY: <?= $energy === null ? 'unavailable' : esc((string)$energy) . ' Wh' ?></p>
<p>Status: <?= esc($state) ?></p>
<p>API timestamp: <?= is_string($sampleTime) ? esc($sampleTime) : 'unavailable' ?></p>
</html>

Die Beispieladresse muss vor dem Einsatz angepasst werden. Der Webserver sollte die Anzeige nur im vorgesehenen lokalen Netz oder über einen geschützten Fernzugang bereitstellen. Ein zentraler Abfragedienst liest den Wechselrichter regelmäßig aus und gibt das Ergebnis an alle Ansichten weiter. So fragt nicht jede geöffnete Anzeige einzeln beim Wechselrichter an. Ein zusätzliches Widget, etwa über eine dafür geeignete App, ist nur eine Darstellungsschicht; die Verfügbarkeit hängt von App und Betriebssystem ab.

Die lokale API-Antwort wird geprüft; Leistung und Tagesenergie werden getrennt ausgewertet. Fehlende Werte bleiben ausdrücklich nicht verfügbar.
Die lokale API-Antwort wird geprüft; Leistung und Tagesenergie werden getrennt ausgewertet. Fehlende Werte bleiben ausdrücklich nicht verfügbar.

Home Assistant und Überschussnutzung

Die Fronius-Integration bietet die Alternative zum eigenen PHP-Skript. Nach der Einrichtung stehen je nach Anlage unterschiedliche Sensoren bereit. Für Energiestatistiken sind passende Energiezähler mit korrekter Einheit und Zustandsklasse nötig. Die Zustandsklasse legt fest, wie Home Assistant die Werte einordnet, etwa als einzelne Messwerte oder aufsummierte Zählerstände. Die Leistungsanzeige in Watt ersetzt keinen Energiezähler. Netzbezug, Einspeisung und Kosten benötigen zusätzliche Messwerte beziehungsweise Tarifangaben.

Eine hohe PV-Leistung allein beweist keinen Überschuss: Hausverbrauch und gegebenenfalls Batteriespeicher beeinflussen die verfügbare Energie. Automatisierungen für Wärmepumpe oder Ladepunkt sollten deshalb den gemessenen Netzfluss berücksichtigen. Mindestlaufzeiten, getrennte Ein- und Ausschaltschwellen sowie ein Abbruch bei fehlenden oder veralteten Messwerten helfen, ständiges Ein- und Ausschalten sowie Entscheidungen auf Grundlage alter Daten zu vermeiden.

Fragen und Antworten

Ist ein fehlender Nachtwert gleich null?

Nein. Eine fehlende Antwort liefert keinen Messwert. Eine Anzeige kann den letzten Tagesertrag zusätzlich mit Datum und Messzeit darstellen; die letzte Leistung darf dabei nicht als aktuelle Leistung erscheinen. Ein Tageswert vom Vortag ist kein heutiger Ertrag.

Kann ein täglich zurückgesetzter Zähler im Energie-Dashboard funktionieren?

Ja, bei passender Sensorkonfiguration und korrekt behandeltem Reset. Die pauschale Forderung nach einem ausschließlich steigenden Gesamtzähler ist zu eng. Für eigene Sensoren sind Zustandsklasse, Einheit und Statistikfehler zu prüfen; die native Integration ist der sinnvolle Ausgangspunkt.

Lukas Wojcik

Lukas Wojcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Kontakt

Eine Frage oder eine Idee für ein Webprojekt? Schreib mir kurz, worum es geht. Das Formular nutzt reCAPTCHA und formconfirmed zum Schutz vor Spam.

Kommentar schreiben

Erfahrungen mit anderen Geräten oder Integrationen und Rückfragen zur Einrichtung sind hier willkommen.

Die E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind mit einem Stern versehen.

LUKASWOJCIK.COM · NEWSLETTER

Neue Ideen im Postfach

Neue Blogartikel, praktische Tools und Einblicke in die Projekte.

Themen auswählen (optional)
Ohne Auswahl: alle Themen.

Erst nach Bestätigung per E-Mail. · Datenschutz

Datenschutz · Newsletter

E-Mail-Adresse, Sprache, Themenauswahl sowie Anmelde- und Bestätigungszeit werden für den Newsletter gespeichert. Versand nur nach Double-Opt-in. Jede Ausgabe enthält eine sofortige Abmeldung. Formconfirmed prüft die Anmeldung auf Spam; dafür werden Formularsignale und die E-Mail-Adresse verarbeitet. Keine Öffnungs- oder Klicktracking-Pixel im Newsletter.

Vollständige Datenschutzerklärung öffnen ↗