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: 41
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: 76
Registriert: Fr 28. Jan 2022, 19:41
Hat sich bedankt: 11 Mal
Danksagung erhalten: 4 Mal

Re: Summe von 2 WR in Influx DB schreiben

Beitrag von Ruhz69 »


Linsenpago
Beiträge: 41
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: 41
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: 596
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: 76
Registriert: Fr 28. Jan 2022, 19:41
Hat sich bedankt: 11 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;

?>

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 0 Gäste