_math Berechungen mit MQTT versenden

Überwachung der Solaranlage per eMail oder Pushover und Steuerung von Geräten mit Smart Home Zentralen. PV-Überschuss Steuerung verbunden mit Geräten und Tasmota Firmware. Wallbox Steuerungen und API Schnittstelle, über die Daten in die Solaranzeigen Datenbanken geschrieben und gelesen werden können. Alles, was man für Steuerungsaufgaben benötigt.

Moderator: Ulrich

Antworten
HipHopSanta
Beiträge: 2
Registriert: Fr 11. Mär 2022, 18:21
Hat sich bedankt: 1 Mal

_math Berechungen mit MQTT versenden

Beitrag von HipHopSanta »

Hallo,
Ich habe mir eine _math.php auf Basis einer von einem anderen User geteilten Datei konfiguriert. Diese addiert die selben Datenfelder meiner 4 Effekta WR + 1 Growatt WR (z.B. PV-Leistung, Ladestom etc.) um so einen gesamt Wert heraus zu bekommen, dann werden diese Werte in die Datenbank bzw. in ein Neues Measurement von einem der WR geschrieben (Gesamt). Das Funktioniert auch soweit gut (in Grafana problemlos verwendbar), nun weiß ich allerdings nicht wie die in der _math berechneten Daten über MQTT versendet werden können um sie dann in Homeassistant weiter zu verarbeiten (power-flow-card-plus). Mir ist bewusst das ich die Daten aller WR auch einzeln per MQTT an Homeassistant senden könnte um sie dann dort zu addieren aber mir wäre es lieber wenn die Berechnungen auf dem RPi direkt stattfinden würden, statt diese erst an den Homeserver zu senden. Wahrscheinlich ist die Lösung sogar Simple aber ich komme nicht drauf.

ax_wechselrichter_math.php:

Code: Alles auswählen

<?php
//  Das Auslesen wird hier mit einer Schleife durchgefuehrt. Wie oft die Daten
//  ausgelesen und gespeichert werden steht in der user.config.php
//
//
// *****************************************************************************/
$TLevelSave = $Tracelevel;
$Tracelevel = 8;
// ------------ Zus�tzlich zum berechnen der Gesamtsummen --------
$WR1 = "Schuppen";
$WR2 = "solaranzeige";
$WR3 = "solaranzeige2";
$WR4 = "solaranzeige3";
$WR5 = "solaranzeige4";
// ---------------------------------------------------------------------------

// -------------- Namen des LOG-Eintrags leichtg ge�ndert ------------
$funktionen->log_schreiben("-------------   Start  ax_wechselrichter_math.php    --------------- ","|--",6);
$funktionen->log_schreiben("Zentraler Timestamp: ".$zentralerTimestamp,"   ",9);


// ------------ Zus�tzlich zum berechnen der Gesamtsummen --------
$aktuelleDaten["ladestrom"] = 0;
$aktuelleDaten["entladestrom"] = 0;
$aktuelleDaten["solarleistung"] = 0;
$aktuelleDaten["ACscheinleistung"] = 0;
$aktuelleDaten["ACwirkleistung"] = 0;
$aktuelleDaten["ACWhHeute"] = 0;
if ($InfluxDBLokal == $WR1 or $InfluxDBLokal == $WR2) {
    $funktionen->log_schreiben("WR1 und WR2 ohne Berechnung der Summen...", "   ", 7);
    goto Ausgang;
}

$aktuelleDaten["Query"] = "db=" . $WR2 . "&q=" . urlencode("select last(Ladestrom) from Batterie");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ladestrom"] = $rc["results"][0]["series"][0]["values"][0][1] + $aktuelleDaten["Batterie_Ladestrom"];
$aktuelleDaten["Query"] = "db=" . $WR3 . "&q=" . urlencode("select last(Ladestrom) from Batterie");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ladestrom"] = $aktuelleDaten["ladestrom"] + $rc["results"][0]["series"][0]["values"][0][1];
$aktuelleDaten["Query"] = "db=" . $WR4 . "&q=" . urlencode("select last(Ladestrom) from Batterie");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ladestrom"] = $aktuelleDaten["ladestrom"] + $rc["results"][0]["series"][0]["values"][0][1];
$aktuelleDaten["Query"] = "db=" . $WR5 . "&q=" . urlencode("select last(Ladestrom) from Batterie");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ladestrom"] = $aktuelleDaten["ladestrom"] + $rc["results"][0]["series"][0]["values"][0][1];

$aktuelleDaten["Query"] = "db=" . $WR2 . "&q=" . urlencode("select last(Entladestrom) from Batterie");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["entladestrom"] = $rc["results"][0]["series"][0]["values"][0][1] + $aktuelleDaten["Batterie_Entladestrom"];
$aktuelleDaten["Query"] = "db=" . $WR3 . "&q=" . urlencode("select last(Entladestrom) from Batterie");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["entladestrom"] = $aktuelleDaten["entladestrom"] + $rc["results"][0]["series"][0]["values"][0][1];
$aktuelleDaten["Query"] = "db=" . $WR4 . "&q=" . urlencode("select last(Entladestrom) from Batterie");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["entladestrom"] = $aktuelleDaten["entladestrom"] + $rc["results"][0]["series"][0]["values"][0][1];
$aktuelleDaten["Query"] = "db=" . $WR5 . "&q=" . urlencode("select last(Entladestrom) from Batterie");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["entladestrom"] = $aktuelleDaten["entladestrom"] + $rc["results"][0]["series"][0]["values"][0][1];

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

$aktuelleDaten["Query"] = "db=" . $WR2 . "&q=" . urlencode("select last(Scheinleistung) from AC");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ACscheinleistung"] = $rc["results"][0]["series"][0]["values"][0][1] + $aktuelleDaten["AC_Scheinleistung"];
$aktuelleDaten["Query"] = "db=" . $WR3 . "&q=" . urlencode("select last(Scheinleistung) from AC");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ACscheinleistung"] = $aktuelleDaten["ACscheinleistung"] + $rc["results"][0]["series"][0]["values"][0][1];
$aktuelleDaten["Query"] = "db=" . $WR4 . "&q=" . urlencode("select last(Scheinleistung) from AC");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ACscheinleistung"] = $aktuelleDaten["ACscheinleistung"] + $rc["results"][0]["series"][0]["values"][0][1];
$aktuelleDaten["Query"] = "db=" . $WR5 . "&q=" . urlencode("select last(Scheinleistung) from AC");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ACscheinleistung"] = $aktuelleDaten["ACscheinleistung"] + $rc["results"][0]["series"][0]["values"][0][1];

$aktuelleDaten["Query"] = "db=" . $WR2 . "&q=" . urlencode("select last(Wirkleistung) from AC");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ACwirkleistung"] = $rc["results"][0]["series"][0]["values"][0][1] + $aktuelleDaten["AC_Wirkleistung"];
$aktuelleDaten["Query"] = "db=" . $WR3 . "&q=" . urlencode("select last(Wirkleistung) from AC");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ACwirkleistung"] = $aktuelleDaten["ACwirkleistung"] + $rc["results"][0]["series"][0]["values"][0][1];
$aktuelleDaten["Query"] = "db=" . $WR4 . "&q=" . urlencode("select last(Wirkleistung) from AC");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ACwirkleistung"] = $aktuelleDaten["ACwirkleistung"] + $rc["results"][0]["series"][0]["values"][0][1];
$aktuelleDaten["Query"] = "db=" . $WR5 . "&q=" . urlencode("select last(Wirkleistung) from AC");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ACwirkleistung"] = $aktuelleDaten["ACwirkleistung"] + $rc["results"][0]["series"][0]["values"][0][1];

$aktuelleDaten["Query"] = "db=" . $WR1 . "&q=" . urlencode("select last(Wh_Heute) from Summen");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ACWhHeute"] = $rc["results"][0]["series"][0]["values"][0][1] + $aktuelleDaten["Summen_Wh_Heute"];
$aktuelleDaten["Query"] = "db=" . $WR2 . "&q=" . urlencode("select last(Wh_Heute) from Summen");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ACWhHeute"] = $aktuelleDaten["ACWhHeute"] + $rc["results"][0]["series"][0]["values"][0][1];
$aktuelleDaten["Query"] = "db=" . $WR3 . "&q=" . urlencode("select last(Wh_Heute) from Summen");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ACWhHeute"] = $aktuelleDaten["ACWhHeute"] + $rc["results"][0]["series"][0]["values"][0][1];
$aktuelleDaten["Query"] = "db=" . $WR4 . "&q=" . urlencode("select last(Wh_Heute) from Summen");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ACWhHeute"] = $aktuelleDaten["ACWhHeute"] + $rc["results"][0]["series"][0]["values"][0][1];
$aktuelleDaten["Query"] = "db=" . $WR5 . "&q=" . urlencode("select last(Wh_Heute) from Summen");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["ACWhHeute"] = $aktuelleDaten["ACWhHeute"] + $rc["results"][0]["series"][0]["values"][0][1];

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

//****************************************************************************/
// Aufbereiten Query zum Speichern der Daten
// ***************************************************************************


if ($InfluxDBName == $WR5) {
    $aktuelleDaten["ZusatzQuery"] = "Gesamt ";
    $aktuelleDaten["ZusatzQuery"] .= "Batterie_ladestrom=".$aktuelleDaten["ladestrom"];
    $aktuelleDaten["ZusatzQuery"] .= ",Batterie_entladestrom=".$aktuelleDaten["entladestrom"];
    $aktuelleDaten["ZusatzQuery"] .= ",PV_Leistung=".$aktuelleDaten["solarleistung"];
    $aktuelleDaten["ZusatzQuery"] .= ",AC_Scheinleistung=".$aktuelleDaten["ACscheinleistung"];
    $aktuelleDaten["ZusatzQuery"] .= ",AC_Wirkleistung=".$aktuelleDaten["ACwirkleistung"];
    $aktuelleDaten["ZusatzQuery"] .= ",Summen_Wh_Heute=".$aktuelleDaten["ACWhHeute"];
    $aktuelleDaten["ZusatzQuery"] .= "  ".$aktuelleDaten["zentralerTimestamp"];
}

Ausgang:;

$Tracelevel = $TLevelSave;

return;

?>
Log:

Code: Alles auswählen

07.08. 19:16:02    -Multi Regler Auslesen [Start].
07.08. 19:16:02    -Verarbeitung von: '1.user.config.php'   Regler: 7
07.08. 19:16:02 |--------------   Start  ax_wechselrichter.php   ----------------- 
07.08. 19:16:03    -226.8 50.0 226.8 50.0 0997 0988 019 402 49.80 006 056 0034 0005 102.3 49.69 00000 00110110 00 00 00293 010  i: 52
07.08. 19:16:03    -MQTT Daten zum [ 192.168.178.194 ] senden.
07.08. 19:16:03 |----------------   Start  ax_wechselrichter_math.php    --------------- 
07.08. 19:16:03    -WR1 und WR2 ohne Berechnung der Summen...
07.08. 19:16:03 *  -Daten zur lokalen InfluxDB [ solaranzeige ] gesendet. 
07.08. 19:16:03    -Multi-Regler-Ausgang. 6
07.08. 19:16:04 MQT-MQTT Daten zum Broker gesendet bzw. vom Broker empfangen. Adresse: localhost Port: 1883
07.08. 19:16:09    -OK. Datenübertragung erfolgreich.
07.08. 19:16:09    -Solarleistung: 293 Watt -  WattstundenGesamtHeute: 20734.35
07.08. 19:16:09 |------------   Stop   ax_wechselrichter.php    ------------------ 
07.08. 19:16:10    -Verarbeitung von: '2.user.config.php'   Regler: 7
07.08. 19:16:10 |--------------   Start  ax_wechselrichter.php   ----------------- 
07.08. 19:16:11    -227.4 50.0 227.4 50.0 1035 1035 020 405 49.90 004 057 0034 0004 082.8 49.84 00000 00110110 00 00 00214 010  i: 53
07.08. 19:16:11 |----------------   Start  ax_wechselrichter_math.php    --------------- 
07.08. 19:16:11    -Gesamtberechnungen der Summen wurden durchgeführt
07.08. 19:16:11 *  -Daten zur lokalen InfluxDB [ solaranzeige2 ] gesendet. 
07.08. 19:16:12    -Multi-Regler-Ausgang. 5
07.08. 19:16:17    -OK. Datenübertragung erfolgreich.
07.08. 19:16:17    -Solarleistung: 214 Watt -  WattstundenGesamtHeute: 14021.07
07.08. 19:16:17 |------------   Stop   ax_wechselrichter.php    ------------------ 
07.08. 19:16:17    -Verarbeitung von: '3.user.config.php'   Regler: 7
07.08. 19:16:17 |--------------   Start  ax_wechselrichter.php   ----------------- 
07.08. 19:16:17    -Datenübertragung vom Wechselrichter war erfolglos! Continue..

07.08. 19:16:19    -225.5 50.0 225.5 50.0 1736 1711 034 407 50.00 005 058 0038 0005 075.5 49.99 00000 00110110 00 00 00254 010  i: 53
07.08. 19:16:19 |----------------   Start  ax_wechselrichter_math.php    --------------- 
07.08. 19:16:19    -Gesamtberechnungen der Summen wurden durchgeführt
07.08. 19:16:19 *  -Daten zur lokalen InfluxDB [ solaranzeige3 ] gesendet. 
07.08. 19:16:19    -Multi-Regler-Ausgang. 5
07.08. 19:16:24    -OK. Datenübertragung erfolgreich.
07.08. 19:16:24    -Solarleistung: 254 Watt -  WattstundenGesamtHeute: 12179.48
07.08. 19:16:24 |------------   Stop   ax_wechselrichter.php    ------------------ 
07.08. 19:16:25    -Verarbeitung von: '4.user.config.php'   Regler: 7
07.08. 19:16:25 |--------------   Start  ax_wechselrichter.php   ----------------- 
07.08. 19:16:26    -226.4 50.0 226.4 50.0 1472 1472 029 407 50.00 023 058 0038 0023 088.3 49.99 00000 00110110 00 00 01174 010  i: 51
07.08. 19:16:26    -MQTT Daten zum [ 192.168.178.194 ] senden.
07.08. 19:16:26 |----------------   Start  ax_wechselrichter_math.php    --------------- 
07.08. 19:16:26    -Gesamtberechnungen der Summen wurden durchgeführt
07.08. 19:16:27 *  -Daten zur lokalen InfluxDB [ solaranzeige4 ] gesendet. 
07.08. 19:16:27    -Multi-Regler-Ausgang. 5
07.08. 19:16:27 MQT-MQTT Daten zum Broker gesendet bzw. vom Broker empfangen. Adresse: localhost Port: 1883
07.08. 19:16:32    -OK. Datenübertragung erfolgreich.
07.08. 19:16:32    -Solarleistung: 1174 Watt -  WattstundenGesamtHeute: 12465.92
07.08. 19:16:32 |------------   Stop   ax_wechselrichter.php    ------------------ 
07.08. 19:16:32    -Verarbeitung von: '5.user.config.php'   Regler: 50
07.08. 19:16:32 |------------   Start  SDM230_meter.php  ------------------------- 
07.08. 19:16:33    -AC Leistung: 5617.83 Watt
07.08. 19:16:33 *  -Daten zur lokalen InfluxDB [ Zaehler ] gesendet. 
07.08. 19:16:33    -Multi-Regler-Ausgang. 8
07.08. 19:16:41    -OK. Datenübertragung erfolgreich.
07.08. 19:16:41 |------------   Stop   SDM230_meter.php    ----------------------- 
07.08. 19:16:42    -Multi Regler Auslesen [Stop].
Danke Vorab
HipHopSanta

Benutzeravatar
Ulrich
Administrator
Beiträge: 6084
Registriert: Sa 7. Nov 2015, 10:33
Wohnort: Essen
Hat sich bedankt: 153 Mal
Danksagung erhalten: 822 Mal
Kontaktdaten:

Re: _math Berechungen mit MQTT versenden

Beitrag von Ulrich »

Das musst du in der _math Datei selber programmieren. Die MQTT Daten werden schon vorher versendet und danach erst die _math Datei aufgerufen.

Im Prinzip müssen die Daten nur in die aktive Pipe geschrieben werden. Wie das geht, kannst du in dem Script "mqtt_senden.php" abschauen.
-----------------------------------------------------
Ulrich . . . . . . . . [ Admin ]

Benutzeravatar
mdkeil
Beiträge: 438
Registriert: So 12. Sep 2021, 20:40
Hat sich bedankt: 11 Mal
Danksagung erhalten: 24 Mal

Re: _math Berechungen mit MQTT versenden

Beitrag von mdkeil »

Du könntest auch in Homeassistent ein/mehrere influxdb-Sensoren anlegen, sie sich immer den aktuellen Wert aus der Datenbank holen. Das Datenintervall ist eh durch die Solaranzeige vorgegeben.
IBN: 07/2021
Fronius Symo : 13.2kWp S 45° + 3.96 kWp S 15°
Fronius Primo : 2.97 kWp N 15°
Speicher: 14,3 kWh LiFePO4 (EEL) + Seplos BMS @ Victron MP-II 48/5000
Wallbox: 11kW echarge Hardy Barth Cpμ2 Pro
######
Tibber-Invite (100% Öko-Strom + 50€ Bonus)

Antworten

Zurück zu „Überschuss Steuerung, Anlagenüberwachung, Anbindung an die Heizung, API Schnittstelle und vieles Andere mehr.“