Integracja falownika Fronius Symo z systemami Smart Home

Management Summary
Falownik Fronius Symo przekształca energię z paneli słonecznych w prąd użyteczny w domu. Odczyty produkcji mogą trafiać do lokalnego wyświetlacza lub Home Assistanta, systemu zarządzania inteligentnym domem. Pozwala to zobaczyć bieżącą moc i ilość energii wytworzonej w ciągu dnia bez połączenia z chmurą dla tego odczytu. Dane ułatwiają ocenę pracy instalacji. Automatyczne ładowanie lub ogrzewanie wymaga dodatkowo pomiaru zużycia domu, ponieważ wysoka produkcja nie musi oznaczać wolnej nadwyżki.
Spis treści
Fronius Symo może udostępniać pomiary przez lokalne Solar API. Niewielka strona internetowa pozwala wyświetlać produkcję PV, a Home Assistant wykorzystuje dane do monitorowania i automatyzacji. Potrzebne są zgodne wyposażenie komunikacyjne, dostępny adres lokalny i dostępne odczyty API. Takie zapytanie lokalne nie wymaga połączenia z chmurą.
Moc i energia to różne wielkości
PAC oznacza bieżącą moc AC w watach. DAY_ENERGY to energia wyprodukowana w danym dniu, wyrażona w watogodzinach. Waty opisują moc w danej chwili. Stała produkcja 2000 W przez godzinę daje 2000 Wh, czyli 2 kWh energii. Dostępność pól i dokładność zależą od urządzenia oraz oprogramowania. Informacje o klasycznym Symo nie muszą obowiązywać w przypadku Symo GEN24.
Przykład korzysta z GetInverterRealtimeData.cgi oraz parametrów Scope=Device, DeviceId=1 i DataCollection=CommonInverterData. Adres IP i identyfikator urządzenia muszą odpowiadać instalacji. Przykładowy adres nie jest uniwersalnym adresem fabrycznym Froniusa.
Prosty widok PHP z obsługą błędów
Przykład wymaga PHP 8 z rozszerzeniem cURL oraz lokalnego serwera WWW z dostępem do falownika. Smartfon również potrzebuje połączenia sieciowego lub VPN z serwerem. Strona wczytuje się ponownie po pięciu minutach; przeglądarka lub aplikacja widżetu może opóźniać aktualizacje w tle. Taki interwał służy do podglądu, a nie do szybkiego sterowania.
Widok sprawdza odpowiedź HTTP, JSON i status API. Brakujące wartości mają oznaczenie „unavailable”, czyli „niedostępne”. Zgłoszone zero pozostaje prawidłową wartością. Znacznik czasu API jest widoczny osobno, co pozwala rozpoznać starszy odczyt. Przykład nie zapisuje wartości zastępczych i nie wysyła poleceń sterujących.
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');
}
<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>Przed uruchomieniem konieczne jest dopasowanie przykładowego adresu. Dostęp do widoku powinien być ograniczony do właściwej sieci lokalnej lub chronionego dostępu zdalnego. Centralny mechanizm regularnie odczytuje falownik i udostępnia wynik wszystkim widokom. Dzięki temu każdy otwarty widok nie wysyła osobnego zapytania do falownika. Zgodna aplikacja widżetu na smartfonie stanowi opcjonalną warstwę prezentacji; obsługa zależy od aplikacji i systemu operacyjnego.

Home Assistant i wykorzystanie nadwyżek
Integracja Fronius stanowi alternatywę dla własnego skryptu PHP. Dostępne sensory zależą od instalacji. Statystyki energii wymagają odpowiednich liczników, jednostek i klas stanu. Klasa stanu określa sposób interpretacji danych, na przykład jako pojedynczych pomiarów albo narastających sum. Odczyt mocy w watach nie zastępuje licznika energii. Obliczanie poboru z sieci, oddawania energii i kosztów wymaga dodatkowych pomiarów lub danych taryfowych.
Wysoka moc PV nie dowodzi nadwyżki: zużycie domowe oraz praca magazynu energii również wpływają na dostępną moc. Automatyzacja pompy ciepła lub ładowania powinna uwzględniać zmierzony przepływ energii na przyłączu. Minimalny czas pracy, osobne progi włączenia i wyłączenia oraz blokada przy brakujących lub nieaktualnych danych ograniczają częste przełączanie i decyzje oparte na starych odczytach.
Pytania i odpowiedzi
Czy brak nocnego odczytu oznacza zero?
Nie. Brak odpowiedzi nie dostarcza pomiaru. Ostatni dzienny uzysk może pojawić się osobno z datą i godziną pomiaru, ale ostatnia moc nie powinna wyglądać jak moc bieżąca. Wczorajszy uzysk nie jest dzisiejszą produkcją.
Czy licznik zerowany codziennie może działać w panelu Energia?
Tak, przy odpowiedniej konfiguracji sensora i obsłudze resetu. Wymaganie wyłącznie stale rosnącego licznika całkowitego jest zbyt wąskie. Własne sensory wymagają właściwych klas stanu, jednostek i poprawnych statystyk; punktem wyjścia jest integracja natywna.


