NEWS
Javascript und MQTT
-
Hallo, ich hoffe, ich bin hier im richtigen Unterforum gelandet.
Ich möchte gern meinen Stromverbrauch und das, was das Balkonkraftwerk liefert, grafisch darstellen.
Dafür habe ich mir einen IR-Lesekopf gekauft und IO-Broker installiert.
Ich bin nun so weit, dass mir die Stromdaten auf dem Handy angezeigt werden und auch als JSON im IO-Broker landen.
Der String sieht so aus:{ "Time": "2023-05-26T23:26:34", "": { "Total": 11652.444, "Supply": 94.6405, "Aktuell": 69, "strom_l1": 0.18, "spannung_l1": 234.5, "strom_l2": 0.48, "spannung_l2": 235.2, "strom_l3": 0.17, "spannung_l3": 235.2, "Freq": 50, "0A-01-45-46-52-20-02-CE-Server-ID": "0a014546522002ceeaa4" } }
Ich habe nun mit verschiedenen Vorlagen von Javascript herumexperimentiert (ohne allerdings recht zu wissen, was ich da tue).
Mein letzter Versuch:on({id: 'mqtt.0.Stromkasten/tele/SENSOR', change: "any"}, function (obj) { var Zeit var Supply var Aktuell var strom_l1 var spannung_l1 var strom_l2 var spannung_l2 var strom_l3 var spannung_l3 var Freq try {obj = JSON.parse(getState('mqtt.0.Stromkasten/tele/SENSOR').val); } catch (e) { console.error('Cannot parse: ' + getState('mqtt.0.Stromkasten/tele/SENSOR').val); return; } Zeit = obj.Time; Supply = obj.Supply; Aktuell = obj.Aktuell; setState('javascript.0.Time', (Zeit)); setState('javascript.0.Supply', (Supply)); setState('javascript.0.Aktuell', (Aktuell)); });
Es passiert genau gar nichts. Immerhin gibt es auch keine Fehlermeldung beim Kompilieren.
Meine Vermutung ist, dass ich die Datenquelle nicht richtig addressiert habe und deswegen kein Change entsteht, der das Verfahren anstoßen könnte. Für freundliche Hilfestellung wäre ich echt dankbar.PS: Hier mal ein Screenshot der Quelle
-
@theophilus Ich bin auch nur ein Rookie in Javascript im ioBroker, aber versuche doch einmal, im kompletten Pfad Punkte als Trennzeichen zu verwenden...
also statt 'mqtt.0.Stromkasten/tele/SENSOR'
'mqtt.0.Stromkasten.tele.SENSOR'
-
@martinp Ja, danke.
Witzigerweise war ich auch gerade auf diesem Weg, weil bei Blockly die Quelle so angegeben wird: "mqtt.0.Stromkasten.tele.SENSOR"
Leider bringt aber weder diese Schreibweise Erfolg, noch die mit Hochkommata 'mqtt. ... -
@theophilus
Versuche es mal so:on('mqtt.0.Stromkasten.tele.SENSOR', function(dp) { const obj = JSON.parse(dp.state.val); log('Time: ' + obj.Time); log('Aktuell: ' + obj[''].Aktuell); });
-
@paul53 said in Javascript und MQTT:
on('mqtt.0.Stromkasten.tele.SENSOR', function(dp) {
22:54:43.754 error javascript.0 (61247) script.js.Skript_3 compile failed: at script.js.Skript_3:7
-
@theophilus sagte: compile failed: at script.js.Skript_3:7
Sorry, es fehlte die schließende Klammer hinter .Aktuell.
-
@paul53 Hallo, danke für deine Hilfe.
Das Skript läuft jetzt durch, aber was sollte passieren? -
@theophilus sagte: aber was sollte passieren?
Es sollten Logausgaben mit den Werten von "Time" und "Aktuell" erfolgen, wenn sich das JSON im Datenpunkt ändert.
-
@paul53 Ja, da kommt was!
-
@theophilus sagte: da kommt was!
Dann können die Logs durch setState() ersetzt und das Skript um weitere Werte ergänzt werden.
-
@theophilus sagte in Javascript und MQTT:
Dafür habe ich mir einen IR-Lesekopf gekauft und IO-Broker installiert.
Dem folgenden entnehme ich, dass es nicht nur ein einfacher IR Lesekopf ist, der an den ioBroker-Server angeschlossen ist, sondern ein Gerät, das irgendwie schon die Daten des Zählers bearbeitet. Ansonsten wüdre der Smartmeter Adapter dir die Arbeit abnehmen können.
-
@homoran Ich verwende den hier: https://www.ebay.de/itm/275501110235
(Tasmota Wifi ESP01S Lesekopf für Stromzähler / Smart Meter) -
@paul53 Ich habe das Skript jetzt so ergänzt:
on('mqtt.0.Stromkasten.tele.SENSOR', function(dp) { const obj = JSON.parse(dp.state.val); Zeit = obj.Time; Supply = obj.Supply; Aktuell = obj.Aktuell; Total = obj.Total setState('0_userdata.0.Zeit', (Zeit)); setState('0_userdata.0.Supply', (Supply)); setState('0_userdata.0.Aktuell', (Aktuell)); setState('0_userdata.0.Total', (Total)); log('Time: ' + obj.Time); log('Aktuell: ' + obj[''].Aktuell); });
Merkwürdigerweise wird aber nur die Variable "Zeit" befüllt. Die anderen bleiben auf Null. Ich habe mal versuchsweise eine davon von "Number" auf "String" gesetzt, aber das hat auch nichts gebracht. Wo liegt der Fehler?
Eine dumme Frage: Die Variable wird ja jetzt alle 100 Sekunden überschrieben. Ich will die Werte aber ja dauerhaft speichern. Wie mache ich das? Kann ich die irgendwie in eine Tabelle schreiben oder so?
-
@theophilus sagte: wird aber nur die Variable "Zeit" befüllt.
Versuche es mal so:
let Zeit = obj.Time; let Supply = obj[''].Supply; let Aktuell = obj[''].Aktuell; let Total = obj[''].Total;
-
@paul53 said in Javascript und MQTT:
Danke, so funktioniert es.
Wo kann ich nachlesen, warum das so funktioniert? Was bewirkt dieses "obj[' ']"? -
@theophilus sagte: Was bewirkt dieses "obj[' ']"?
Schau mal Zeile 3 des JSON an.
-
@theophilus sagte in Javascript und MQTT:
Wo kann ich nachlesen, warum das so funktioniert? Was bewirkt dieses "obj[' ']"?
Zusätzlich zu @paul53 Info solltest du dir die Adresse im Screenshot merk3n.
Da siehst du es möglicherweise deutlicher
-
Aber wie geht es jetzt weiter? Wie kann ich den Inhalt der Variablen in eine Tabelle oder so schreiben?
Bringt mich der History-Adapter weiter? -
@theophilus sagte in Javascript und MQTT:
Wie kann ich den Inhalt der Variablen in eine Tabelle oder so schreiben?
was genau willst du denn eigentlich schlussendlich erreichen?
@theophilus sagte in Javascript und MQTT:
Bringt mich der History-Adapter weiter?
sehr wahrscheinlich, falls du einen Verlauf wie auch immer visualisieren willst.
Das wäre dann eher oder so. Eine Tabelle ist für mich für eine Momentaufnahme. -
@homoran Ich will erreichen, dass ich eine Übersicht über meinen Stromverbrauch und die Produktion des Balkonkraftwerks über den Tag verteilt habe. Gern auch grafisch aufbereitet. Momentan schreibe ich von Hand jeden Morgen die Zählerstände in eine Excel-Tabelle, was zum einen ziemlich mühsam ist und zum anderen fahre ich demnächst für ein paar Tage weg, was bei diesem manuellen Weg eine Datenlücke zur Folge hätte.
Derzeit experimentiere ich auf meinem Laptop, aber wenn ich endlich mal durchblicke, soll mein Raspberry zum Einsatz kommen.
Danke für eure Unterstützung! ioBroker ist ein echter Dschungel ...