Summe von 2 WR in Influx DB schreiben

Wenn mehr als ein Gerät an den Raspberry angeschlossen werden sollen. Z.B. ein Regler und ein Wechselrichter oder mehrere Wechselrichter. Das Maximum sind 6 Geräte pro Raspberry Pi.

Moderator: Ulrich

Linsenpago
Beiträge: 42
Registriert: Di 9. Feb 2021, 17:49
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Summe von 2 WR in Influx DB schreiben

Beitrag von Linsenpago »

Hallo!

Ich versuche schon seit Tagen schlau zu werden wie man innerhalb von der Solaranzeige werte addieren kann und als eigenen Wert in die Influx DB schreibt.

Den passendsten Thread den ich dazu gefunden habe ist dieser hier:
viewtopic.php?t=4592

Darin wird auf "etliche" andere Threads verwiesen wo es Beispiele geben sollte, aber die finde ich einfach nicht, bzw. suche ich wohl falsch.

Ich würde einfach nur mal gerne die Summe meiner beiden Fronius WR addieren und als Summenwert in die DB schreiben, damit ich ihn mir dann in Grafana grafisch oder tabelarisch darstellen lassen kann.
Einzeln werden sie schon seit langem ausgelesen, in die DB geschrieben und auch einzeln in Grafana dargestellt.
Mit der math expression in Grafana konnte ich mir auch eine Kurve anzeigen lassen, welche auch halbwegs korrekt ist (leider immer wieder Lücken in der Anzeige). Ich denke mit einem schon vorher berechneten Wert in der DB wäre das viel eleganter und genauer.

Leider habe ich so gut wie keine PHP Kenntnisse, sodass ich mir das selber erstellen könnte und wäre auf code snipplets angewiesen, welche ich mir zurechtbasteln könnte.

Hat da vielleicht jemand schon so eine Herausforderung gehabt und könnte mir hier weiterhelfen?
Ich werde ja nicht der einzige sein, der 2 WR summieren möchte?

Danke u. LG
Alex

Ruhz69
Beiträge: 94
Registriert: Fr 28. Jan 2022, 19:41
Hat sich bedankt: 12 Mal
Danksagung erhalten: 4 Mal

Re: Summe von 2 WR in Influx DB schreiben

Beitrag von Ruhz69 »


Linsenpago
Beiträge: 42
Registriert: Di 9. Feb 2021, 17:49
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Summe von 2 WR in Influx DB schreiben

Beitrag von Linsenpago »

Hallo!

Vielen Dank für die Threads!!

Hat etwas gedauert, aber ich habe mal versucht aus den Codezeilen was für mich zusammen zu reimen... aber wie erwartet, war ich nicht erfolgreich... Ich verstehe es noch nicht wirklich.

Ich habe mir mal eine "fronius_symo_serie_math.php" gebastelt und konnte auch erfolgreich die Raspi Temperatur in die Datenbank schreiben und auch im Grafana anzeigen lassen. Soweit so gut.

Dann wollte ich mithilfe der Infos aus dem Thread die Daten aus der DB lesen und dann verrechnen. Dazu habe ich einfach mal den Code des Beispieles in einem der Threads genommen um zu sehen, ob es überhaupt einmal klappt oder nicht - egal ob das jetzt dann Werte sind die ich überhaupt jetzt brauche...
Das curl funktioniert schon mal nicht..

Code: Alles auswählen

<?php
/*****************************************************************************
//  Raspberry Temperatur in die Infux Datenbank speichern //  Die Temperatur steckt in der Variable $RaspiTemp 
*****************************************************************************/ 

//  So wird die Zusatz Query zusammengestellt. 
//  Alle Daten werden in die aktuelle Datenbank des Gerätes in das Measurement "Service" geschrieben 
//  Der Zeitstempel ist der 'zentrale Timestempel' 
//  Damit ist die Visualisierung in Grafana sehr einfach. 

$aktuelleDaten["ZusatzQuery"]  = "Service  RaspiTemp=".round($RaspiTemp,1); 
$aktuelleDaten["ZusatzQuery"] .= "   ".$aktuelleDaten["zentralerTimestamp"]; 


//  Wenn der Wert auch in die LOG Datei geschrieben werden soll. 

$funktionen->log_schreiben("Rasperry Temperatur: ".round($RaspiTemp,1)." °C",">  ",5);
//$funktionen->log_schreiben(print_r($aktuelleDaten,1),"    ",1); 



/*****************************************************************************
//  Berechnung einzelner Werte um sie in einem Dashboard anzeigen zu können
//
*****************************************************************************/

//  $DB1 = Datenbank des Wechselrichters   Measurement: PV
//  Hier wird der neueste Eintrag der Datenbank ausgelesen und im Array $DB1 gespeichert.
$Datenbank1 = "solaranzeige";
$Measurement = "PV";
$ch = curl_init('http://10.0.0.110/query?db='.$Datenbank1.'&precision=s&q='.urlencode('select * from '.$Measurement.' order by time desc limit 1'));

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_TIMEOUT, 15);           //timeout in second s
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 12);
curl_setopt($ch, CURLOPT_PORT, 8086);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$Ergebnis["result"] = curl_exec($ch);
$Ergebnis["rc_info"] = curl_getinfo ($ch);
$Ergebnis["JSON_Ausgabe"] = json_decode($Ergebnis["result"],true,10);
$Ergebnis["errorno"] = curl_errno($ch);

if ($Ergebnis["rc_info"]["http_code"] == 200 or $Ergebnis["rc_info"]["http_code"] == 204) {
  $Ergebnis["Ausgabe"] = true;
}


curl_close($ch);
unset($ch);


if (!isset($Ergebnis["JSON_Ausgabe"]["results"][0]["series"])) {
  $funktionen->log_schreiben("Es fehlt die Datenbank solaranzeige mit dem Measurement PV oder sie ist leer.","|- ",3);
  $funktionen->log_schreiben("Fehler: ".$Ergebnis["JSON_Ausgabe"]["results"][0]["error"],"|- ",4);
}
else {
  for ($h = 1; $h < count($Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["columns"]); $h++) {
    $DB1[$Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["columns"][$h]] = $Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["values"][0][$h];
  }
  $funktionen->log_schreiben("Datenbank: solaranzeige DB1 ".print_r($DB1,1),"  ",10);
}

$Datenbank2 = "Fronius_Symo";
$Measurement2 = "PV";
$ch = curl_init('http://10.0.0.110/query?db='.$Datenbank2.'&precision=s&q='.urlencode('select * from '.$Measurement.' order by time desc limit 1'));

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_TIMEOUT, 15);           //timeout in second s
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 12);
curl_setopt($ch, CURLOPT_PORT, 8086);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$Ergebnis2["result"] = curl_exec($ch);
$Ergebnis2["rc_info"] = curl_getinfo ($ch);
$Ergebnis2["JSON_Ausgabe"] = json_decode($Ergebnis["result"],true,10);
$Ergebnis2["errorno"] = curl_errno($ch);

if ($Ergebnis2["rc_info"]["http_code"] == 200 or $Ergebnis2["rc_info"]["http_code"] == 204) {
  $Ergebnis2["Ausgabe"] = true;
}


curl_close($ch);
unset($ch);


if (!isset($Ergebnis2["JSON_Ausgabe"]["results"][0]["series"])) {
  $funktionen->log_schreiben("Es fehlt die Datenbank Fronius_Symo mit dem Measurement PV oder sie ist leer.","|- ",3);
  $funktionen->log_schreiben("Fehler: ".$Ergebnis2["JSON_Ausgabe"]["results"][0]["error"],"|- ",4);
}
else {
  for ($h = 1; $h < count($Ergebnis2["JSON_Ausgabe"]["results"][0]["series"][0]["columns"]); $h++) {
    $DB2[$Ergebnis2["JSON_Ausgabe"]["results"][0]["series"][0]["columns"][$h]] = $Ergebnis2["JSON_Ausgabe"]["results"][0]["series"][0]["values"][0][$h];
  }
  $funktionen->log_schreiben("Datenbank: solaranzeige DB2 ".print_r($DB2,1),"  ",10);
}

//  Hier wurde die Datenbank "solaranzeige" und Measurement "PV" ausgelesen. 
//  Die Daten sind jetzt im Array $DB1 und $DB2[]
//  Alle Daten der Fronius WR sind im Array $aktuelleDaten[]

/*****************************************************************************/
//  Jetzt wird die Berechnung gestartet
//  Zur Überprüfung werden die Werte bei Tracelevel = 8 in die LOG Datei geschrieben.
/*****************************************************************************/

$funktionen->log_schreiben(" PV-Leistung: ".$DB1["Leistung"],"",8);
$funktionen->log_schreiben(" Bezug: ".$aktuelleDaten["Bezug"],"",8);
$funktionen->log_schreiben(" Einspeisung: ".$aktuelleDaten["Einspeisung"],"",8);
$funktionen->log_schreiben(" Eigenverbrauch: ".($DB1["Leistung"]-$aktuelleDaten["Einspeisung"]+$aktuelleDaten["Bezug"]),"",8);

//  So wird die Zusatz Query zusammengestellt.
//  Alle Daten werden in die Datenbank des HomeManager in ein neues Measurement "Dashboard" geschrieben.
//  Der Zeitstempel ist der 'zentrale Timestempel'
//  Damit ist die Visualisierung in Grafana sehr einfach.
$aktuelleDaten["ZusatzQuery"]  = "Dashboard  Erzeugung=".$DB1["Leistung"].",Bezug=".$aktuelleDaten["Bezug"];
$aktuelleDaten["ZusatzQuery"] .= ",Einspeisung=".$aktuelleDaten["Einspeisung"].",Eigenverbrauch=".($DB1["Leistung"]-$aktuelleDaten["Einspeisung"]+$aktuelleDaten["Bezug"]);
$aktuelleDaten["ZusatzQuery"] .= "   ".$aktuelleDaten["zentralerTimestamp"];



return;
?>
Folgende Einträge bekomme ich dann in den logs php.log und solaranzeige.log

Code: Alles auswählen

17.03. 08:00:02    -Multi Regler Auslesen [Start].
17.03. 08:00:02    -Verarbeitung von: '1.user.config.php'   Regler: 12
17.03. 08:00:02 |----------------   Start  fronius_symo_serie.php    --------------- 
17.03. 08:00:02    -API Version: 1 CompatibilityRange: 1.8-0
17.03. 08:00:02    -Modell = Fronius GEN 24
17.03. 08:00:02 >  -Rasperry Temperatur: 43 °C
17.03. 08:00:02    -MQTT Daten zum [ localhost ] senden.
17.03. 08:00:03 MQT-MQTT Daten zum Broker gesendet: localhost Port: 1883
17.03. 08:00:04    -Alle 10 Minuten werden die Statistikdaten remote übertragen.
17.03. 08:00:04 *  -Daten zur entfernten InfluxDB [ solaranzeige ] gesendet. 
17.03. 08:00:04    -Multi-Regler-Ausgang. 5
17.03. 08:00:09    -Daten zur HomeMatic gesendet. 
17.03. 08:00:09    -OK. Datenübertragung erfolgreich.
17.03. 08:00:09 |----------------   Stop   fronius_symo_serie.php    --------------- 
17.03. 08:00:09    -Verarbeitung von: '2.user.config.php'   Regler: 12
17.03. 08:00:09 |----------------   Start  fronius_symo_serie.php    --------------- 
17.03. 08:00:09    -API Version: 1 CompatibilityRange: 1.8-1
17.03. 08:00:12 >  -Rasperry Temperatur: 43 °C

==> php.log <==
[17-Mar-2025 08:00:12 Europe/Berlin] PHP Warning:  It is not yet possible to assign complex types to attributes in /var/www/html/fronius_symo_serie_math.php on line 40
[17-Mar-2025 08:00:12 Europe/Berlin] PHP Warning:  It is not yet possible to assign complex types to attributes in /var/www/html/fronius_symo_serie_math.php on line 41

==> solaranzeige.log <==
17.03. 08:00:12 |- -Es fehlt die Datenbank solaranzeige mit dem Measurement PV oder sie ist leer.
17.03. 08:00:12 |- -Fehler: 
17.03. 08:00:12    -MQTT Daten zum [ localhost ] senden.
17.03. 08:00:13 MQT-MQTT Daten zum Broker gesendet: localhost Port: 1883
17.03. 08:00:13    -Alle 10 Minuten werden die Statistikdaten remote übertragen.
17.03. 08:00:14 *  -Daten zur entfernten InfluxDB [ Fronius_Symo ] gesendet. 
17.03. 08:00:14    -Multi-Regler-Ausgang. 2
17.03. 08:00:16    -OK. Datenübertragung erfolgreich.
17.03. 08:00:16 |----------------   Stop   fronius_symo_serie.php    --------------- 
17.03. 08:00:16    -Multi Regler Auslesen [Stop].
Die Zeilen 40 und 41 welche hier im php.log aufgeworfen werden sind:

Code: Alles auswählen

$Ergebnis["rc_info"] = curl_getinfo ($ch);
$Ergebnis["JSON_Ausgabe"] = json_decode($Ergebnis["result"],true,10);
Die Frage welche ich mir stelle ist, muss ich denn eigentlich die Datenbanken auslesen oder könnte ich direkt mit den Werten arbeiten die die Scripte sowieso aus den beiden WR holen?
Und wenn ja, wie mache ich das? Vorallem funktioniert das abholen der Daten aus der externen InfluxDB ohnehin nicht.

Linsenpago
Beiträge: 42
Registriert: Di 9. Feb 2021, 17:49
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Summe von 2 WR in Influx DB schreiben

Beitrag von Linsenpago »

Ich kriegs einfach nicht hin..mein Wissen über php ist da leider viel zu gering...

Alles was ich hier im Forum gefunden habe, klappt nicht wirklich... schon die Abfrage der externen influx ist ein problem.

Wenn vielleicht jemand eine Idee hätte, was ich anders machen könnte wäre ich sehr dankbar! :prayer:

Benutzeravatar
mr.big
Beiträge: 590
Registriert: Mi 7. Sep 2022, 12:12
Wohnort: tief im Osten...
Hat sich bedankt: 18 Mal
Danksagung erhalten: 126 Mal

Re: Summe von 2 WR in Influx DB schreiben

Beitrag von mr.big »

https://github.com/Deepintheeast/Ulanzi ... main/Tools

Da habe ich mal was dazu gebastelt, eventuell kommst du ja damit klar! :D

Ruhz69
Beiträge: 94
Registriert: Fr 28. Jan 2022, 19:41
Hat sich bedankt: 12 Mal
Danksagung erhalten: 4 Mal

Re: Summe von 2 WR in Influx DB schreiben

Beitrag von Ruhz69 »

Hallo,
ich finde zwar den thread nicht mehr, aber das war die Basis für meine Math.php und ich hatte es noch auf dem Rechner.
Der Trick ist vor allem, das nur bei einem WR die math php durchlaufen wird.

Ich hab leider nur so ein ungesundes Halbwissen, was Programmieren angeht (bin damit weit gekommen, aber Fehle finde ich nicht so schnell.

Viele Grüsse

Rüdiger

Code: Alles auswählen

#!/usr/bin/php
<?php

/*****************************************************************************
//  Solaranzeige Projekt             Copyright (C) [2015-2020]  [Ulrich Kunz]
//
//  Dieses Programm ist freie Software. Sie können es unter den Bedingungen
//  der GNU General Public License, wie von der Free Software Foundation
//  veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß
//  Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version.
//
//  Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es
//  Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne
//  die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN
//  BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
//
//  Ein original Exemplar der GNU General Public License finden Sie hier:
//  http://www.gnu.org/licenses/
//
//  Dies ist ein Programmteil des Programms "Solaranzeige"
//
//  Es dient dem Berechnen von Summenwerten von 2 KOSTAL Plenticore Wechselrichtern
//
 *****************************************************************************/
 
$TLevelSave = $Tracelevel;
$now = time();

$Tracelevel = 7;
/****************************************************************************
//  InfluxDB  Zugangsdaten ...stehen in der user.config.php
 ****************************************************************************/

$WR1 = "WR1";
$WR2 = "WR2";

if ($InfluxDBName == $WR1) {
    $funktionen->log_schreiben("WR1 ohne Berechnung der Summen...", "   ", 7);
    goto Ausgang;
}

$aktuelleDaten["Query"] = "db=" . $WR1 . "&q=" . urlencode("select last(Gesamtleistung) from PV");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["Gesamtleistung"] = $rc["results"][0]["series"][0]["values"][0][1] + $aktuelleDaten["PV_Leistung"];

$aktuelleDaten["Query"] = "db=" . $WR1 . "&q=" . urlencode("select last(Solarleistung) from AC");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["Solarleistung"] = $rc["results"][0]["series"][0]["values"][0][1] + $aktuelleDaten["AC_Solarleistung"];


$funktionen->log_schreiben("WR2 Gesamtberechnungen der Summen durchgeführt", "   ", 7);

//****************************************************************************/
// Aufbereiten Query für Speichern der Daten
// ***************************************************************************
$aktuelleDaten["ZusatzQuery"]  = "Gesamt ";
$aktuelleDaten["ZusatzQuery"] .= "Gesamtleistung=".$aktuelleDaten["Gesamtleistung"];
$aktuelleDaten["ZusatzQuery"] .= ",Solarleistung=".$aktuelleDaten["Solarleistung"];
$aktuelleDaten["ZusatzQuery"] .= "  ".$aktuelleDaten["zentralerTimestamp"];

$Tracelevel = $TLevelSave;

Ausgang:;

return;

?>

Linsenpago
Beiträge: 42
Registriert: Di 9. Feb 2021, 17:49
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Summe von 2 WR in Influx DB schreiben

Beitrag von Linsenpago »

Fronius GEN24 + Symo/Primo Werte zusammenführen und als Gesamtanlage in InfluxDB schreiben

Hallo zusammen,

ich habe ja eine PV-Anlage mit zwei Fronius-Wechselrichtern und wollte die Werte für Grafana/Solaranzeige zusätzlich als „Gesamtanlage“ in eine eigene InfluxDB schreiben. Ich habe nun endlich die Zeit gefunden und habe es endlich realisiert und zum laufen gebracht. Zusätzlich habe ich noch den Fronius Wattpiloten eingebunden und frage ihn auch ab. Ich möchte hier gerne meinen Lösungsweg zu Verfügung stellen. Vielleicht hat ja jemand auch so ein Setup und steht vor der gleichen Herausforderung!

Mein Setup:

- 1x Fronius GEN24
- 1x Fronius Symo
- InfluxDB 1.8
- Grafana
- Script läuft per Cronjob auf einem Raspberry Pi / Linux-System

Das Problem:
Die Werte der beiden Wechselrichter liegen getrennt vor. Für Grafana wollte ich aber zusätzlich gemeinsame Werte haben:

- aktuelle Gesamtleistung
- Tagesproduktion gesamt
- Monatsproduktion gesamt
- Jahresproduktion gesamt
- getrennte Werte für GEN24 und Symo
- eine gemeinsame Measurement für einfache Grafana-Abfragen

Besonderheit beim GEN24:
Bei meinem GEN24 liefert GetPowerFlowRealtimeData.fcgi zwar die aktuelle Leistung sauber, aber E_Day und E_Year sind dort null. Außerdem wurde E_Total dort nicht zuverlässig laufend aktualisiert.

Deshalb verwendet das Script für den GEN24:

- Leistung aus GetPowerFlowRealtimeData.fcgi
- Energiezähler aus GetInverterRealtimeData.cgi?DataCollection=CommonInverterData

Beim Symo werden die Werte direkt aus GetPowerFlowRealtimeData.fcgi gelesen.

Die Werte werden in Wh geschrieben. In Grafana kann man sie einfach durch 1000 teilen, um kWh zu erhalten.

InfluxDB vorbereiten

Falls die Datenbank noch nicht existiert:

Code: Alles auswählen

CREATE DATABASE fronius_gesamtwerte
Datei erstellen

Beispiel:

Code: Alles auswählen

nano /var/www/html/combine_fronius_two_inverters.php
Folgende Werte müssen im Script angepasst werden

Code: Alles auswählen

$gen24BaseUrl = 'http://xxx.xxx.xxx.xxx';
$gen24DeviceId = 1;
$symoBaseUrl = 'http://xxx.xxx.xxx.xxx';
$influxdbUrl = 'http://xxx.xxx.xxx.xxx:8086/write?db=fronius_gesamtwerte';
$statusFile = '/home/pi/fronius_combine_status.json';
$logFile = '/home/pi/fronius_combine.log';
Komplettes PHP-Script

Code: Alles auswählen

<?php
/**
 * combine_fronius_two_inverters.php
 *
 * Zweck:
 * Dieses Script liest Leistungs- und Energiewerte von zwei Fronius-Wechselrichtern aus,
 * addiert die Werte und schreibt sie in eine InfluxDB 1.x.
 *
 * Typisches Setup:
 * - Wechselrichter 1: Fronius GEN24
 * - Wechselrichter 2: Fronius Symo / Primo / klassischer Fronius Wechselrichter
 * - InfluxDB 1.x
 * - Grafana zur Visualisierung
 *
 * Besonderheit beim GEN24:
 * Der GEN24 liefert über GetPowerFlowRealtimeData.fcgi zwar die aktuelle PV-Leistung,
 * aber E_Day und E_Year können dort null sein.
 * Deshalb wird für den GEN24 der Energiezähler TOTAL_ENERGY aus
 * GetInverterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=CommonInverterData verwendet.
 *
 * Der klassische Symo / Primo liefert E_Day und E_Year normalerweise direkt über
 * GetPowerFlowRealtimeData.fcgi.
 *
 * Einheit:
 * Fronius liefert Energiewerte in Wh.
 * Für Grafana daher in Queries meist durch 1000 teilen, um kWh zu erhalten.
 */


/* =============================================================================
   1. KONFIGURATION
   =============================================================================
   Hier müssen andere Nutzer ihre Umgebung anpassen.
   ========================================================================== */

/**
 * IP-Adresse oder Hostname des GEN24.
 *
 * Beispiel:
 * http://192.168.1.50
 */
$gen24BaseUrl = 'http://xxx.xxx.xxx.xxx';

/**
 * DeviceId des GEN24.
 *
 * Meist ist das "1".
 * Prüfen kann man das mit:
 *
 * curl -s "http://GEN24-IP/solar_api/v1/GetInverterRealtimeData.cgi?Scope=System" | jq
 *
 * In der Ausgabe sieht man unter Values meistens:
 * "1": ...
 */
$gen24DeviceId = 1;

/**
 * IP-Adresse oder Hostname des zweiten Fronius-Wechselrichters.
 *
 * Beispiel:
 * http://192.168.1.51
 */
$symoBaseUrl = 'http://xxx.xxx.xxx.xxxxxx.xxx.xxx.xxx';

/**
 * InfluxDB Write-URL.
 *
 * Format:
 * http://INFLUXDB-IP:8086/write?db=DATENBANKNAME
 *
 * Die Datenbank muss bereits existieren.
 */
$influxdbUrl = 'http://xxx.xxx.xxx.xxx:8086/write?db=fronius_gesamtwerte';

/**
 * Statusdatei.
 *
 * Diese Datei merkt sich Startwerte für Tag, Monat und Jahr.
 * Der Benutzer, unter dem der Cronjob läuft, muss diese Datei schreiben dürfen.
 */
$statusFile = '/home/pi/fronius_combine_status.json';

/**
 * Logdatei.
 */
$logFile = '/home/pi/fronius_combine.log';

/**
 * InfluxDB Measurements.
 */
$measurementPower = 'gesamtanlage_pv_dach';
$measurementTotal = 'gesamtanlage';
$measurementDaily = 'gesamtanlage_tageswerte';

/**
 * Timeout für HTTP-Abfragen in Sekunden.
 */
$httpTimeout = 10;

/**
 * Sicherheitsoption:
 *
 * true:
 * Script bricht ab, wenn GEN24 TOTAL_ENERGY nicht gelesen werden kann.
 * Empfehlung: true
 */
$abortIfGen24EnergyInvalid = true;


/* =============================================================================
   2. HILFSFUNKTIONEN
   ============================================================================= */

/**
 * Schreibt eine Zeile in die Logdatei.
 */
function logMsg($msg)
{
    global $logFile;

    $date = date('Y-m-d H:i:s');
    file_put_contents($logFile, "[$date] $msg\n", FILE_APPEND | LOCK_EX);
}

/**
 * Holt JSON von einer URL und dekodiert es als Array.
 *
 * Rückgabe:
 * - Array bei Erfolg
 * - null bei Fehler
 */
function getJsonFromUrl($url, $name)
{
    global $httpTimeout;

    $context = stream_context_create([
        'http' => [
            'timeout' => $httpTimeout
        ]
    ]);

    $json = @file_get_contents($url, false, $context);

    if ($json === false) {
        logMsg("Fehler: Konnte Daten von '$name' nicht abrufen. URL: $url");
        return null;
    }

    $data = json_decode($json, true);

    if (!is_array($data)) {
        logMsg("Fehler: Ungültige JSON-Antwort von '$name'.");
        return null;
    }

    return $data;
}

/**
 * Liest einen Float-Wert aus einem verschachtelten Array.
 *
 * Beispiel:
 * getFloatValue($data, ['Body', 'Data', 'Site', 'P_PV'], 0)
 *
 * Gibt $default zurück, wenn der Pfad nicht existiert oder der Wert null ist.
 */
function getFloatValue($array, $path, $default = 0.0)
{
    $current = $array;

    foreach ($path as $key) {
        if (!isset($current[$key]) || $current[$key] === null) {
            return (float)$default;
        }

        $current = $current[$key];
    }

    return (float)$current;
}

/**
 * Macht Tag-Werte für InfluxDB Line Protocol sicherer.
 */
function influxEscapeTagValue($value)
{
    return str_replace(
        [' ', ',', '='],
        ['\ ', '\,', '\='],
        (string)$value
    );
}

/**
 * Lädt die Statusdatei.
 */
function loadStatus($statusFile)
{
    $defaultStatus = [
        'last_day' => null,
        'last_month' => null,
        'last_year' => null,

        'gen24_e_total_day_start' => null,
        'gen24_e_total_month_start' => null,
        'gen24_e_total_year_start' => null,

        'symo_e_year_month_start' => null,
    ];

    if (!file_exists($statusFile)) {
        return $defaultStatus;
    }

    $content = file_get_contents($statusFile);
    $loadedStatus = json_decode($content, true);

    if (!is_array($loadedStatus)) {
        logMsg("Warnung: Statusdatei konnte nicht gelesen werden. Verwende Default-Status.");
        return $defaultStatus;
    }

    return array_merge($defaultStatus, $loadedStatus);
}

/**
 * Speichert die Statusdatei.
 */
function saveStatus($statusFile, $status)
{
    file_put_contents($statusFile, json_encode($status, JSON_PRETTY_PRINT), LOCK_EX);
}

/**
 * Sendet Line Protocol an InfluxDB.
 */
function writeToInflux($influxdbUrl, $data)
{
    $options = [
        'http' => [
            'method'  => 'POST',
            'header'  => "Content-Type: text/plain\n",
            'content' => $data,
            'timeout' => 10
        ]
    ];

    $context = stream_context_create($options);
    $result = @file_get_contents($influxdbUrl, false, $context);

    if ($result === false) {
        logMsg("Fehler beim Schreiben in InfluxDB.");
        logMsg("[DEBUG] Gesendete Daten:\n" . $data);
        return false;
    }

    return true;
}


/* =============================================================================
   3. URLS AUFBAUEN
   ============================================================================= */

$gen24PowerFlowUrl =
    $gen24BaseUrl . '/solar_api/v1/GetPowerFlowRealtimeData.fcgi';

$gen24InverterRealtimeUrl =
    $gen24BaseUrl
    . '/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId='
    . urlencode((string)$gen24DeviceId)
    . '&DataCollection=CommonInverterData';

$symoPowerFlowUrl =
    $symoBaseUrl . '/solar_api/v1/GetPowerFlowRealtimeData.fcgi';


/* =============================================================================
   4. DATUM UND STATUS LADEN
   ============================================================================= */

$today = date('Y-m-d');
$month = date('Y-m');
$year  = date('Y');

$status = loadStatus($statusFile);


/* =============================================================================
   5. FRONIUS DATEN ABFRAGEN
   ============================================================================= */

$gen24PowerFlowData = getJsonFromUrl($gen24PowerFlowUrl, 'GEN24 PowerFlow');
if ($gen24PowerFlowData === null) {
    exit;
}

$gen24InverterData = getJsonFromUrl($gen24InverterRealtimeUrl, 'GEN24 InverterRealtimeData');
if ($gen24InverterData === null) {
    exit;
}

$symoPowerFlowData = getJsonFromUrl($symoPowerFlowUrl, 'Symo PowerFlow');
if ($symoPowerFlowData === null) {
    exit;
}


/* =============================================================================
   6. WERTE AUS DEN API-ANTWORTEN LESEN
   ============================================================================= */

$leistungGen24 = getFloatValue(
    $gen24PowerFlowData,
    ['Body', 'Data', 'Site', 'P_PV'],
    0
);

$akkuLeistungGen24 = getFloatValue(
    $gen24PowerFlowData,
    ['Body', 'Data', 'Site', 'P_Akku'],
    0
);

$wrLeistungGen24 = getFloatValue(
    $gen24InverterData,
    ['Body', 'Data', 'PAC', 'Value'],
    0
);

$gen24TotalEnergy = getFloatValue(
    $gen24InverterData,
    ['Body', 'Data', 'TOTAL_ENERGY', 'Value'],
    0
);

if ($abortIfGen24EnergyInvalid && $gen24TotalEnergy <= 0) {
    logMsg("Fehler: GEN24 TOTAL_ENERGY ist 0 oder ungültig. Script wird abgebrochen.");
    exit;
}

/**
 * Symo / Primo:
 * Klassische Fronius-Wechselrichter liefern E_Day und E_Year meist direkt im PowerFlow.
 */
$leistungSymo = getFloatValue(
    $symoPowerFlowData,
    ['Body', 'Data', 'Site', 'P_PV'],
    0
);

$wrLeistungSymo = getFloatValue(
    $symoPowerFlowData,
    ['Body', 'Data', 'Inverters', '1', 'P'],
    0
);

$symoEDay = getFloatValue(
    $symoPowerFlowData,
    ['Body', 'Data', 'Inverters', '1', 'E_Day'],
    0
);

$symoEYear = getFloatValue(
    $symoPowerFlowData,
    ['Body', 'Data', 'Inverters', '1', 'E_Year'],
    0
);

$leistungGesamt = $leistungGen24 + $leistungSymo;


/* =============================================================================
   7. STARTWERTE FÜR TAG / MONAT / JAHR SETZEN
   ============================================================================= */

if ($status['last_day'] !== $today || $status['gen24_e_total_day_start'] === null) {
    logMsg("Tageswechsel erkannt: {$status['last_day']} -> $today");
    $status['last_day'] = $today;
    $status['gen24_e_total_day_start'] = $gen24TotalEnergy;
}

if (
    $status['last_month'] !== $month ||
    $status['gen24_e_total_month_start'] === null ||
    $status['symo_e_year_month_start'] === null
) {
    logMsg("Monatswechsel erkannt: {$status['last_month']} -> $month");
    $status['last_month'] = $month;
    $status['gen24_e_total_month_start'] = $gen24TotalEnergy;
    $status['symo_e_year_month_start'] = $symoEYear;
}

if ($status['last_year'] !== $year || $status['gen24_e_total_year_start'] === null) {
    logMsg("Jahreswechsel erkannt: {$status['last_year']} -> $year");
    $status['last_year'] = $year;
    $status['gen24_e_total_year_start'] = $gen24TotalEnergy;
}


/* =============================================================================
   8. ENERGIEWERTE BERECHNEN
   ============================================================================= */

$gen24EDay = $gen24TotalEnergy - $status['gen24_e_total_day_start'];
$gen24EMonth = $gen24TotalEnergy - $status['gen24_e_total_month_start'];
$gen24EYear = $gen24TotalEnergy - $status['gen24_e_total_year_start'];

if ($gen24EDay < 0) {
    logMsg("Warnung: GEN24 Tageswert negativ. Tagesstart wird neu gesetzt.");
    $status['gen24_e_total_day_start'] = $gen24TotalEnergy;
    $gen24EDay = 0;
}

if ($gen24EMonth < 0) {
    logMsg("Warnung: GEN24 Monatswert negativ. Monatsstart wird neu gesetzt.");
    $status['gen24_e_total_month_start'] = $gen24TotalEnergy;
    $gen24EMonth = 0;
}

if ($gen24EYear < 0) {
    logMsg("Warnung: GEN24 Jahreswert negativ. Jahresstart wird neu gesetzt.");
    $status['gen24_e_total_year_start'] = $gen24TotalEnergy;
    $gen24EYear = 0;
}

/**
 * Symo Monatswert:
 *
 * Symo Monatswert = aktueller E_Year - E_Year am Monatsbeginn
 */
$symoEMonth = $symoEYear - $status['symo_e_year_month_start'];

if ($symoEMonth < 0) {
    logMsg("Warnung: Symo Monatswert negativ. Monatsstart wird neu gesetzt.");
    $status['symo_e_year_month_start'] = $symoEYear;
    $symoEMonth = 0;
}

/**
 * Gesamtwerte beider Wechselrichter.
 */
$gesamtEDay = $gen24EDay + $symoEDay;
$gesamtEMonth = $gen24EMonth + $symoEMonth;
$gesamtEYear = $gen24EYear + $symoEYear;


/* =============================================================================
   9. LOGAUSGABE
   ============================================================================= */

logMsg("GEN24: P_PV={$leistungGen24} W, WR-P={$wrLeistungGen24} W, P_Akku={$akkuLeistungGen24} W, TOTAL_ENERGY={$gen24TotalEnergy}");
logMsg("Symo : P_PV={$leistungSymo} W, WR-P={$wrLeistungSymo} W, E_Day={$symoEDay}, E_Year={$symoEYear}");
logMsg("Gesamtleistung: {$leistungGesamt} W");

logMsg("GEN24 E-Day={$gen24EDay}, E-Month={$gen24EMonth}, E-Year={$gen24EYear}");
logMsg("Symo  E-Day={$symoEDay}, E-Month={$symoEMonth}, E-Year={$symoEYear}");
logMsg("Gesamt E-Day={$gesamtEDay}, E-Month={$gesamtEMonth}, E-Year={$gesamtEYear}");


/* =============================================================================
   10. INFLUXDB LINE PROTOCOL AUFBAUEN
   ============================================================================= */

$tagDay = influxEscapeTagValue($today);
$tagMonth = influxEscapeTagValue($month);
$tagYear = influxEscapeTagValue($year);

$linePower =
    "{$measurementPower} "
    . "gen24={$leistungGen24},"
    . "symo={$leistungSymo},"
    . "gesamt={$leistungGesamt}";

$lineTotal =
    "{$measurementTotal} "
    . "gen24_e_day={$gen24EDay},"
    . "gen24_e_month={$gen24EMonth},"
    . "gen24_e_year={$gen24EYear},"
    . "symo_e_day={$symoEDay},"
    . "symo_e_month={$symoEMonth},"
    . "symo_e_year={$symoEYear},"
    . "gesamt_e_day={$gesamtEDay},"
    . "gesamt_e_month={$gesamtEMonth},"
    . "gesamt_e_year={$gesamtEYear},"
    . "leistung={$leistungGesamt},"
    . "leistung_dach={$leistungGesamt},"
    . "leistung_gen24={$leistungGen24},"
    . "leistung_symo={$leistungSymo}";

$lineDaily =
    "{$measurementDaily},day={$tagDay},month={$tagMonth},year={$tagYear} "
    . "gen24_e_day={$gen24EDay},"
    . "gen24_e_month={$gen24EMonth},"
    . "gen24_e_year={$gen24EYear},"
    . "symo_e_day={$symoEDay},"
    . "symo_e_month={$symoEMonth},"
    . "symo_e_year={$symoEYear},"
    . "gesamt_e_day={$gesamtEDay},"
    . "gesamt_e_month={$gesamtEMonth},"
    . "gesamt_e_year={$gesamtEYear}";

$data = $linePower . "\n" . $lineTotal . "\n" . $lineDaily;


/* =============================================================================
   11. INFLUXDB SCHREIBEN UND STATUS SPEICHERN
   ============================================================================= */

if (writeToInflux($influxdbUrl, $data)) {
    logMsg("✔ Erfolgreich in InfluxDB geschrieben.");
} else {
    exit;
}

saveStatus($statusFile, $status);

?>
Manueller Test

Code: Alles auswählen

/usr/bin/php /var/www/html/combine_fronius_two_inverters.php
Log prüfen

Code: Alles auswählen

tail -n 80 /home/pi/fronius_combine.log
Cronjob einrichten

Crontab öffnen:

Code: Alles auswählen

crontab -e
Dann folgende Zeile eintragen, damit das Script jede Minute läuft:

Code: Alles auswählen

* * * * * /usr/bin/php /var/www/html/combine_fronius_two_inverters.php >> /home/pi/fronius_combine_cron.log 2>&1
Die fünf Sterne bedeuten:

Code: Alles auswählen

Minute Stunde Tag-des-Monats Monat Wochentag
*      *      *              *     *
Also: jede Minute, jede Stunde, jeden Tag.

InfluxDB prüfen

Code: Alles auswählen

USE fronius_gesamtwerte

Code: Alles auswählen

SELECT "gen24_e_month","symo_e_month","gesamt_e_month","leistung_gen24","leistung_symo" FROM "gesamtanlage" ORDER BY time DESC LIMIT 10
Wenn alles passt, sollten gen24_e_month, symo_e_month und gesamt_e_month steigen, sobald produziert wird.

Grafana Beispiele

Aktueller Monatswert in kWh:

Code: Alles auswählen

SELECT last("gesamt_e_month") / 1000 FROM "gesamtanlage" WHERE $timeFilter
Aktueller Tageswert in kWh:

Code: Alles auswählen

SELECT last("gesamt_e_day") / 1000 FROM "gesamtanlage" WHERE $timeFilter
Aktueller Jahreswert in kWh:

Code: Alles auswählen

SELECT last("gesamt_e_year") / 1000 FROM "gesamtanlage" WHERE $timeFilter
Aktuelle Gesamtleistung in W:

Code: Alles auswählen

SELECT last("leistung") FROM "gesamtanlage" WHERE $timeFilter
Monatsbalken, bei InfluxDB 1.x nur näherungsweise mit 30 Tagen:

Code: Alles auswählen

SELECT max("gesamt_e_month") / 1000 FROM "gesamtanlage" WHERE $timeFilter GROUP BY time(30d) fill(null)
Hinweise

- Die Rohwerte sind Wh.
- In Grafana für kWh `/ 1000` verwenden.
- Die Monatswerte sind erst ab Scriptstart bzw. ab dem nächsten Monatswechsel vollständig korrekt.
- Bei InfluxDB 1.x funktioniert `GROUP BY time(1mo)` je nach Version nicht. Dann kann man für einfache Balkendiagramme `GROUP BY time(30d)` verwenden.
- Die Datei `fronius_combine_status.json` nicht einfach löschen, außer man möchte die Startwerte neu setzen.
- Wenn der GEN24 eine andere DeviceId hat, muss `$gen24DeviceId` angepasst werden.
- Der Benutzer, unter dem der Cronjob läuft, muss Schreibrechte auf Logdatei und Statusdatei haben.

Linsenpago
Beiträge: 42
Registriert: Di 9. Feb 2021, 17:49
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Summe von 2 WR in Influx DB schreiben

Beitrag von Linsenpago »

## Ergänzung: Fronius Wattpilot per WebSocket auslesen und in InfluxDB schreiben

Zusätzlich zu den Wechselrichterwerten wollte ich auch meinen **Fronius Wattpilot** sauber in Grafana darstellen. Ziel war es, die Wallbox getrennt vom Wechselrichter-Script auszulesen und eigene Werte für Ladeleistung, Tagesladung, Monatsladung und Jahresladung in InfluxDB zu schreiben.

Wichtig: Der Wattpilot stellt **keine normale HTTP-REST-API** über `/api/status` oder `/status` bereit. Diese Abfragen lieferten nur:

Code: Alles auswählen

HTTP/1.1 404 Not Found
Nothing matches the given URI
Funktioniert hat stattdessen der lokale WebSocket-Endpunkt:

Code: Alles auswählen

ws://IP_DER_WALLBOX/ws
Der Wattpilot verlangt dabei eine Authentifizierung. Eine erste Antwort kann zum Beispiel so aussehen:

Code: Alles auswählen

{
"type": "hello",
"serial": "XXXXXXXX",
"hostname": "Wattpilot_XXXXXXXX",
"friendly_name": "Wattpilot",
"manufacturer": "fronius",
"devicefamily": "wattpilot",
"devicetype": "wattpilot_V2",
"version": "XX.X",
"protocol": 2,
"proto": 3,
"secured": true
}
Danach kommt eine Authentifizierungsanforderung:

Code: Alles auswählen

{
"type": "authRequired",
"token1": "...",
"token2": "...",
"hash": "pbkdf2"
}
Das Script authentifiziert sich dann per PBKDF2/SHA-Verfahren am Wattpilot, liest den vollständigen Status aus und schreibt die Werte in InfluxDB.

---

## Welche Werte werden ausgelesen?

Das Script liest unter anderem folgende Werte aus:

Code: Alles auswählen

leistung              aktuelle Ladeleistung gesamt in W
leistung_l1           Ladeleistung Phase L1 in W
leistung_l2           Ladeleistung Phase L2 in W
leistung_l3           Ladeleistung Phase L3 in W

spannung_l1           Spannung L1
spannung_l2           Spannung L2
spannung_l3           Spannung L3

strom_l1              Strom L1
strom_l2              Strom L2
strom_l3              Strom L3

energy_total_kwh      Gesamtzähler der Wallbox
energy_session_kwh    aktuelle Ladesession
energy_day_kwh        Tagesladung
energy_month_kwh      Monatsladung
energy_year_kwh       Jahresladung

car_state             Fahrzeugstatus numerisch
car_state_text        Fahrzeugstatus als Text, z. B. charging
allowed_current_a     aktuell erlaubter Ladestrom
requested_current_a   eingestellter Ladestrom
cable_limit_a         Kabel-Limit
error_code            Fehlercode
Bei meinem Wattpilot steigt der Gesamtzähler `eto` während der laufenden Ladung bereits mit. Deshalb darf man **nicht `eto + wh` verwenden**, sonst würde die aktuelle Ladesession doppelt gezählt werden.

Im Script ist daher gesetzt:

Code: Alles auswählen

USE_SESSION_FOR_LIVE_COUNTERS = False
Falls bei einem anderen Setup `eto` während der laufenden Ladung nicht mitsteigt, müsste man diesen Punkt prüfen und gegebenenfalls anders behandeln.

---

## InfluxDB Measurements

Das Script schreibt in folgende Measurements:

Code: Alles auswählen

wattpilot
wattpilot_tageswerte
wattpilot_monatswerte
wattpilot_jahreswerte
`wattpilot` enthält die Live-Werte mit aktuellem Timestamp.

`wattpilot_tageswerte` bekommt pro Tag einen festen Datenpunkt mit Timestamp um 00:00:00.

`wattpilot_monatswerte` bekommt pro Monat einen festen Datenpunkt am Monatsersten um 00:00:00.

`wattpilot_jahreswerte` bekommt pro Jahr einen festen Datenpunkt am 1. Jänner um 00:00:00.

Dadurch lassen sich Tages-, Monats- und Jahreswerte in Grafana deutlich einfacher darstellen.

---

## Beispielwerte aus InfluxDB

Eine Beispielabfrage:

Code: Alles auswählen

SELECT "leistung","energy_day_kwh","energy_month_kwh","energy_session_kwh"
FROM "wattpilot"
ORDER BY time DESC
LIMIT 10
Beispielausgabe mit anonymisierten bzw. gerundeten Werten:

Code: Alles auswählen

leistung     energy_day_kwh  energy_month_kwh  energy_session_kwh
15225.59     2.810           2.810             32.372
15198.70     2.551           2.551             32.111
15210.16     2.304           2.304             31.864
15249.51     2.049           2.049             31.607
---

## Benötigtes Python-Modul

Auf dem Raspberry musste zuerst das WebSocket-Modul installiert werden:

Code: Alles auswählen

python3 -m pip install --user websocket-client
Falls `pip` noch fehlt:

Code: Alles auswählen

sudo apt-get install -y python3-pip
---

## Testlauf

Das Script kann man manuell testen mit:

Code: Alles auswählen

python3 /home/pi/wattpilot_to_influx.py
Log prüfen:

Code: Alles auswählen

tail -n 80 /home/pi/wattpilot_to_influx.log
Eine erfolgreiche Ausgabe sieht zum Beispiel so aus:

Code: Alles auswählen

[YYYY-MM-DD HH:MM:SS] Wattpilot Auth erfolgreich.
[YYYY-MM-DD HH:MM:SS] ✔ Influx geschrieben. Leistung=15000 W, Session=30.000 kWh, Tag=0.500 kWh, Monat=0.500 kWh, Jahr=0.500 kWh, Car=2 charging
---

## Cronjob

Damit das Script jede Minute läuft:

Code: Alles auswählen

crontab -e
Eintrag:

Code: Alles auswählen


* * * * * /usr/bin/python3 /home/pi/wattpilot_to_influx.py >> /home/pi/wattpilot_cron.log 2>&1
          
Prüfen:

Code: Alles auswählen

crontab -l
---

## Grafana-Beispiele

### Aktuelle Ladeleistung

Code: Alles auswählen

SELECT mean("leistung")
FROM "wattpilot"
WHERE $timeFilter
GROUP BY time($__interval)
fill(null)
Einheit: W oder kW

---

### Aktuelle Ladesession

Code: Alles auswählen

SELECT last("energy_session_kwh")
FROM "wattpilot"
WHERE $timeFilter
Einheit: kWh

---

### Tagesladung

Code: Alles auswählen

SELECT last("energy_kwh")
FROM "wattpilot_tageswerte"
WHERE $timeFilter
Einheit: kWh

---

### Monatsladung

Code: Alles auswählen

SELECT max("energy_kwh")
FROM "wattpilot_monatswerte"
WHERE $timeFilter
Einheit: kWh

---

### Jahresladung

Code: Alles auswählen

SELECT last("energy_kwh")
FROM "wattpilot_jahreswerte"
WHERE $timeFilter
Einheit: kWh

---

## Hinweis zum ersten Start

Beim ersten erfolgreichen Lauf setzt das Script die Startwerte für Tag, Monat und Jahr. Daher stehen Tages-/Monats-/Jahreswerte beim allerersten Lauf zunächst auf 0.

Ab dem nächsten Lauf steigen die Werte korrekt weiter. Ab dem nächsten Tages-, Monats- oder Jahreswechsel laufen die jeweiligen Werte dann sauber ab Beginn des Zeitraums.

---

## Wichtiger Sicherheitshinweis

Das Wattpilot-Passwort steht im Script als Variable. Daher sollte das Script niemals öffentlich mit echtem Passwort gepostet werden.

Im Script unbedingt nur einen Platzhalter verwenden:

Code: Alles auswählen

WATTPILOT_PASSWORD = "HIER_DEIN_WATTPILOT_PASSWORT_EINTRAGEN"
Auch folgende Werte sollten vor dem Posten anonymisiert werden:

Code: Alles auswählen

WATTPILOT_IP
Seriennummer
Hostname
Friendly Name
InfluxDB-IP
interne Hostnamen
echte Log-Zeitpunkte, falls gewünscht
Beispiel:

Code: Alles auswählen

WATTPILOT_IP = "192.168.1.100"
INFLUXDB_URL = "http://192.168.1.10:8086/write?db=fronius_gesamtwerte"
Die IP-Adressen müssen natürlich an das eigene Netzwerk angepasst werden.

Zurück zu „Multi-Regler-Version [ bis zu 6 Geräten an einem Raspberry Pi ]“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast