Sonoff POW R2 mit Tasmota Firmware als Messstelle
Moderator: Ulrich
-
- Beiträge: 1178
- Registriert: Mi 13. Mai 2020, 10:04
- Hat sich bedankt: 27 Mal
- Danksagung erhalten: 163 Mal
Re: Sonoff POW R2 mit Tasmota Firmware als Messstelle
Wie erwartet ist ein Datenfeld nicht versorgt: "TasmotaWZTotal=,"
Wenn ein Datenfeld gar keinen Wert hat, dann schlägt das Schreiben fehl. Du musst sehen, warum der Wert nicht ausgelesen wird, evtl. kann man ihn auch vorinitialisieren mit 0.
Welches Tasmota-Gerät willst Du denn auslesen und welche Werte liefert dieses? Es scheint so als hättest Du die Beispiel_PHP 1 zu 1 kopiert, das muss schon auf Deine Bedürfnisse angepasst werden...
Wenn ein Datenfeld gar keinen Wert hat, dann schlägt das Schreiben fehl. Du musst sehen, warum der Wert nicht ausgelesen wird, evtl. kann man ihn auch vorinitialisieren mit 0.
Welches Tasmota-Gerät willst Du denn auslesen und welche Werte liefert dieses? Es scheint so als hättest Du die Beispiel_PHP 1 zu 1 kopiert, das muss schon auf Deine Bedürfnisse angepasst werden...
Re: Sonoff POW R2 mit Tasmota Firmware als Messstelle
Hi,
ja hab nur die IP angepasst - dachte das reicht erst einmal.
Tasmota Gerät ist ein NOUS A1 = Gosund kompatibel.
MQTT entsprechend konfiguriert.
In Home Assistant ist das Gerät normal verfübar.
ja hab nur die IP angepasst - dachte das reicht erst einmal.
Tasmota Gerät ist ein NOUS A1 = Gosund kompatibel.
MQTT entsprechend konfiguriert.
In Home Assistant ist das Gerät normal verfübar.
-
- Beiträge: 1178
- Registriert: Mi 13. Mai 2020, 10:04
- Hat sich bedankt: 27 Mal
- Danksagung erhalten: 163 Mal
Re: Sonoff POW R2 mit Tasmota Firmware als Messstelle
Gib mal bitte im Webbrowser folgendes mit der passenden IP des Nous ein:
Als Antwort erhältst Du ein JSON im Browser in etwa wie:
Hänge doch bitte diese Ausgabe mal hier an...
Code: Alles auswählen
http://192.168.xxx.xxx/cm?cmnd=Status%208
Code: Alles auswählen
{"StatusSNS":{"Time":"2024-02-26T11:27:34","ENERGY":{"TotalStartTime":"2022-01-24T07:20:18","Total":2.422,"Yesterday":0.011,"Today":0.000,"Power": 0,"ApparentPower": 0,"ReactivePower": 0,"Factor":0.00,"Voltage":228,"Current":0.000}}}
Re: Sonoff POW R2 mit Tasmota Firmware als Messstelle
sieht so aus:
{"StatusSNS":{"Time":"2024-02-26T11:55:49","ENERGY":{"TotalStartTime":"2023-01-16T16:18:43","Total":52.883,"Yesterday":1.136,"Today":0.229,"Power": 2,"ApparentPower":22,"ReactivePower":22,"Factor":0.09,"Voltage":297,"Current":0.074}}}
{"StatusSNS":{"Time":"2024-02-26T11:55:49","ENERGY":{"TotalStartTime":"2023-01-16T16:18:43","Total":52.883,"Yesterday":1.136,"Today":0.229,"Power": 2,"ApparentPower":22,"ReactivePower":22,"Factor":0.09,"Voltage":297,"Current":0.074}}}
-
- Beiträge: 1178
- Registriert: Mi 13. Mai 2020, 10:04
- Hat sich bedankt: 27 Mal
- Danksagung erhalten: 163 Mal
Re: Sonoff POW R2 mit Tasmota Firmware als Messstelle
Dann bitte noch die verwendete _math.php. Es müsste dann eigentlich ein Fehler darin sein, denn laut Deinem LOG sind alle ausgelesenen Werte 0 oder eben nicht vorhanden. Es verwendet aber diese Statusabfrage und würde diese JSON auswerten...
Re: Sonoff POW R2 mit Tasmota Firmware als Messstelle
Hi,
hier:
<?php
/******************************************************************************
// Hie können eigene Berechnungen gemacht werden, wenn das nötig ist.
******************************************************************************/
$ch = curl_init("http://192.168.1.191/cm?"); // cURL initialisieren
curl_setopt($ch, CURLOPT_HEADER, 0); // Header soll nicht in Ausgabe enthalten sein
curl_setopt($ch, CURLOPT_POST, 1); // POST-Request wird abgesetzt
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'cmnd=Status%208'); // POST-Felder festlegen, die gesendet werden sollen
$EnergyStr = curl_exec($ch); // Ausfuehren
curl_close($ch); // Objekt schliessen und Ressourcen freigeben
if (empty($EnergyStr)) {
$aktuelleDaten["Query"] = "db=" . $INFLUXDB_STORAGE . "&q=" . urlencode("select last(TasmotaWZTotal) from Energy");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["TasmotaWZTotal"] = $rc["results"][0]["series"][0]["values"][0][1];
$aktuelleDaten["TasmotaWZToday"] = 0;
//$aktuelleDaten["TasmotaWZTotal"] = 0;
$aktuelleDaten["TasmotaWZCur"] = 0;
} else {
$EnergyA = json_decode($EnergyStr, true);
$aktuelleDaten["TasmotaWZToday"] = $EnergyA["StatusSNS"]["ENERGY"]["Today"] * 1000;
$aktuelleDaten["TasmotaWZTotal"] = $EnergyA["StatusSNS"]["ENERGY"]["Total"] * 1000;
$aktuelleDaten["TasmotaWZCur"] = $EnergyA["StatusSNS"]["ENERGY"]["Power"];
}
// Erstellen der Zusatzquery, damit die Werte in die Datenbank geschrieben werden
$aktuelleDaten["ZusatzQuery"] = "Energy ";
$aktuelleDaten["ZusatzQuery"] .= "TasmotaWZToday=" . $aktuelleDaten["TasmotaWZToday"];
$aktuelleDaten["ZusatzQuery"] .= ",TasmotaWZTotal=" . $aktuelleDaten["TasmotaWZTotal"];
$aktuelleDaten["ZusatzQuery"] .= ",TasmotaWZCur=" . $aktuelleDaten["TasmotaWZCur"];
$aktuelleDaten["ZusatzQuery"] .= " ".$aktuelleDaten["zentralerTimestamp"];
return;
?>
Liegt es an dem /cm? hinter der IP ?
hier:
<?php
/******************************************************************************
// Hie können eigene Berechnungen gemacht werden, wenn das nötig ist.
******************************************************************************/
$ch = curl_init("http://192.168.1.191/cm?"); // cURL initialisieren
curl_setopt($ch, CURLOPT_HEADER, 0); // Header soll nicht in Ausgabe enthalten sein
curl_setopt($ch, CURLOPT_POST, 1); // POST-Request wird abgesetzt
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'cmnd=Status%208'); // POST-Felder festlegen, die gesendet werden sollen
$EnergyStr = curl_exec($ch); // Ausfuehren
curl_close($ch); // Objekt schliessen und Ressourcen freigeben
if (empty($EnergyStr)) {
$aktuelleDaten["Query"] = "db=" . $INFLUXDB_STORAGE . "&q=" . urlencode("select last(TasmotaWZTotal) from Energy");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["TasmotaWZTotal"] = $rc["results"][0]["series"][0]["values"][0][1];
$aktuelleDaten["TasmotaWZToday"] = 0;
//$aktuelleDaten["TasmotaWZTotal"] = 0;
$aktuelleDaten["TasmotaWZCur"] = 0;
} else {
$EnergyA = json_decode($EnergyStr, true);
$aktuelleDaten["TasmotaWZToday"] = $EnergyA["StatusSNS"]["ENERGY"]["Today"] * 1000;
$aktuelleDaten["TasmotaWZTotal"] = $EnergyA["StatusSNS"]["ENERGY"]["Total"] * 1000;
$aktuelleDaten["TasmotaWZCur"] = $EnergyA["StatusSNS"]["ENERGY"]["Power"];
}
// Erstellen der Zusatzquery, damit die Werte in die Datenbank geschrieben werden
$aktuelleDaten["ZusatzQuery"] = "Energy ";
$aktuelleDaten["ZusatzQuery"] .= "TasmotaWZToday=" . $aktuelleDaten["TasmotaWZToday"];
$aktuelleDaten["ZusatzQuery"] .= ",TasmotaWZTotal=" . $aktuelleDaten["TasmotaWZTotal"];
$aktuelleDaten["ZusatzQuery"] .= ",TasmotaWZCur=" . $aktuelleDaten["TasmotaWZCur"];
$aktuelleDaten["ZusatzQuery"] .= " ".$aktuelleDaten["zentralerTimestamp"];
return;
?>
Liegt es an dem /cm? hinter der IP ?
-
- Beiträge: 1178
- Registriert: Mi 13. Mai 2020, 10:04
- Hat sich bedankt: 27 Mal
- Danksagung erhalten: 163 Mal
Re: Sonoff POW R2 mit Tasmota Firmware als Messstelle
Als erstes, wo kommt die Variable $INFLUXDB_STORAGE her? Diesen Zugriff nutzt das Skript zum Lesen des Total, wenn es keine verwertbare Antwort erhält. Da diese Variable nicht definiert ist (oder steht die in der x.user.config.php?), kann er das alte Total nicht einlesen und hat dann keinen Wert. Das erklärt, warum das Schreiben fehlschlägt, weil "TasmotaWZTotal=," ist.
Warum er allerdings keine Werte bekommt (deshalb sind alle Wert 0 und eben TasmotaWZTotal leer, ist dadurch natürlich nicht klar. Eigentlich sollte er nicht in diesen if(empty...) hineinlaufen, wenn er eine verwertbare Antwort bekommt.
Ist wirklich sicher, dass die IP stimmt? Ist evtl. der Zeichensatz falsch und nach dem Kopieren ist auf LINUX Seite ein Sonderzeichen drin oder ähnliches?
Warum er allerdings keine Werte bekommt (deshalb sind alle Wert 0 und eben TasmotaWZTotal leer, ist dadurch natürlich nicht klar. Eigentlich sollte er nicht in diesen if(empty...) hineinlaufen, wenn er eine verwertbare Antwort bekommt.
Ist wirklich sicher, dass die IP stimmt? Ist evtl. der Zeichensatz falsch und nach dem Kopieren ist auf LINUX Seite ein Sonderzeichen drin oder ähnliches?
Re: Sonoff POW R2 mit Tasmota Firmware als Messstelle
Hi,
erst einmal vielen Dank für Deine Mühe und Zeit.
$INFLUXDB_STORAGE war noch ein Überbleibes von den Versuchen das anzupassen. Dacht der Docker nutzt eventuell andere Pfade und das war aus der Docker Beschreibung.
Hab das mal wieder zurück geändert, aber nach Neustart immer noch keine Änderung.
Jetzt mal eine Grundsätzliche Frage und um sicher zu gehen:
Hab ich das wirklich richtig Verstanden, ich brauche in der unser.config.php keine Änderung (Regler) vornehme, da ja das Script die Json seite des Tasmota Gerätes direkt pollt und auswertet und immer in die Database schreibt ?
Nicht das wir an der falschen Stelle suchen.
erst einmal vielen Dank für Deine Mühe und Zeit.
$INFLUXDB_STORAGE war noch ein Überbleibes von den Versuchen das anzupassen. Dacht der Docker nutzt eventuell andere Pfade und das war aus der Docker Beschreibung.
Hab das mal wieder zurück geändert, aber nach Neustart immer noch keine Änderung.
Jetzt mal eine Grundsätzliche Frage und um sicher zu gehen:
Hab ich das wirklich richtig Verstanden, ich brauche in der unser.config.php keine Änderung (Regler) vornehme, da ja das Script die Json seite des Tasmota Gerätes direkt pollt und auswertet und immer in die Database schreibt ?
Nicht das wir an der falschen Stelle suchen.
-
- Beiträge: 1178
- Registriert: Mi 13. Mai 2020, 10:04
- Hat sich bedankt: 27 Mal
- Danksagung erhalten: 163 Mal
Re: Sonoff POW R2 mit Tasmota Firmware als Messstelle
Korrekt. In der x.user.config.php ist keine Änderung nötig, da die xxx_math.php ja beim Aufruf des bereits vorhandenen Gerätes durchlaufen wird.
Diese sollte dann per HTTP-Request (curl-Befehl) die Statusantwort des Nous auswerten und die gefundenen Daten werden in einer Variablen $ZusatzQuery gespeichert. Diese Variable wird von der Solaranzeige automatisch mit weggeschrieben, falls Inhalt vorhanden.
Wir suchen also an der richtigen Stelle.
Es funktioniert ja auch wie Dein Log zeigt, denn Du hast den zusätzlichen String "Energy TasmotaWZToday=0,TasmotaWZTotal=,TasmotaWZCur=0 1708939691" im Log, dieser wird von der xxx_math.php generiert und von Solaranzeige versucht zu speichern. Leider ist dort der Wert für TasmotaWZTotal nicht befüllt und deswegen schlägt das Schreiben fehl.
Warum dieser Wert nicht befüllt ist liegt auch an der falschen Variable $INFLUXDB_STORAGE, aber auch nur weil anscheinend der HTTP-Request keine Antwort liefert und daher der Zweig mit dem Lesen des alten Wertes durchlaufen wird (Kann man erkennen, weil alle Werte 0 und der eine leer ist, das passiert bei Dir in diesem Zweig). Im Normalfall sollte er aber hier gar nicht durchlaufen, sondern danach die Werte aus der JSON-Antwort auslesen.
Diese Antwort bekommt er aber nicht.
Zum Test kannst Du noch einen Log-Eintrag erzeugen mit der JSON-Antwort, vielleicht wird dann klarer, was eigentlich passiert:
Füge einfach nach dem curl_close die obige Zeile mit log_schreiben ein. Danach bitte wieder ins LOG schauen und die Antwort hier posten...
Diese sollte dann per HTTP-Request (curl-Befehl) die Statusantwort des Nous auswerten und die gefundenen Daten werden in einer Variablen $ZusatzQuery gespeichert. Diese Variable wird von der Solaranzeige automatisch mit weggeschrieben, falls Inhalt vorhanden.
Wir suchen also an der richtigen Stelle.
Es funktioniert ja auch wie Dein Log zeigt, denn Du hast den zusätzlichen String "Energy TasmotaWZToday=0,TasmotaWZTotal=,TasmotaWZCur=0 1708939691" im Log, dieser wird von der xxx_math.php generiert und von Solaranzeige versucht zu speichern. Leider ist dort der Wert für TasmotaWZTotal nicht befüllt und deswegen schlägt das Schreiben fehl.
Warum dieser Wert nicht befüllt ist liegt auch an der falschen Variable $INFLUXDB_STORAGE, aber auch nur weil anscheinend der HTTP-Request keine Antwort liefert und daher der Zweig mit dem Lesen des alten Wertes durchlaufen wird (Kann man erkennen, weil alle Werte 0 und der eine leer ist, das passiert bei Dir in diesem Zweig). Im Normalfall sollte er aber hier gar nicht durchlaufen, sondern danach die Werte aus der JSON-Antwort auslesen.
Diese Antwort bekommt er aber nicht.
Zum Test kannst Du noch einen Log-Eintrag erzeugen mit der JSON-Antwort, vielleicht wird dann klarer, was eigentlich passiert:
Code: Alles auswählen
...
$EnergyStr = curl_exec($ch); // Ausfuehren
curl_close($ch); // Objekt schliessen und Ressourcen freigeben
$funktionen->log_schreiben("Antwort Nous: " . $EnergyStr, " ", 6 );
Re: Sonoff POW R2 mit Tasmota Firmware als Messstelle
Hi,
nach Ändern und Neustart kommt das im Log:
26.02. 12:57:01 -Antwort Nous: {"WARNING":"Benötige user=<Benutzername>&password=<Passwort>"}
Hatte ich aber im MQTT rausgelöscht ??
Oder ist damit das Password für die Web-Oberfläche gemeint ?
Das würde ich gerne lassen,damit die Kinder da nicht rumfummeln können
$ch = curl_init("http://192.168.1.191/cm?user=admin&password=password"); // cURL initialisieren
würde das dann so funktionieren ?
Edit: Mist so funktionert es, oh Mann
nach Ändern und Neustart kommt das im Log:
26.02. 12:57:01 -Antwort Nous: {"WARNING":"Benötige user=<Benutzername>&password=<Passwort>"}
Hatte ich aber im MQTT rausgelöscht ??
Oder ist damit das Password für die Web-Oberfläche gemeint ?
Das würde ich gerne lassen,damit die Kinder da nicht rumfummeln können

$ch = curl_init("http://192.168.1.191/cm?user=admin&password=password"); // cURL initialisieren
würde das dann so funktionieren ?
Edit: Mist so funktionert es, oh Mann
Wer ist online?
Mitglieder in diesem Forum: Sonstige [Bot] und 0 Gäste