Hat man im Smarthome Verbrauchswerte, wie z.B. Stromzählerstand, Gasverbrauch, integriert, ist es sinnvoll die Daten regelmäßig aufzubereiten bzw. zu protokollieren. Interessant sind beispielsweise Stunden- und Tagesverbräuche, um einfach und schnell eine optische Auswertung über Diagramme erstellen zu können. Die Berechnung basiert auf dem Momentanzählerstand, der in ioBroker in einem Objekt aktualisiert und gespeichert wird.
Stromverbrauch stündlich und täglich protokollieren
Das Script ermittelt dann zu jeder vollen Stunde, nach jedem Tag, nach jedem Monat und nach jedem Jahr die Differenz zum Vorwert und speichert dieses als Verbrauch für diesen Zeitraum in einer Variablen bzw. einem Objekt in ioBroker ab. Um die Historie zu speichern, müssen wir lediglich für dieses Objekt die Historisierung einschalten.
Historie Stromverbrauch Tag
Hier das entsprechende Script für ioBroker:
var cronH = "0 * * * *"; var cronD = "59 23 * * *"; var cronW = "0 0 * * 1"; var cronM = "0 0 1 * *"; var idHAGTotH = "javascript.0.Stromzähler.tmp.Total-h"; var idHAGTotD = "javascript.0.Stromzähler.tmp.Total-d"; var idHAGTotW = "javascript.0.Stromzähler.tmp.Total-w"; var idHAGTotM = "javascript.0.Stromzähler.tmp.Total-m"; var idHAGTotal = "smartmeter.0.1-0:1_8_0__255.value"; /*Stromverbrauch insgesammt*/ var idHAGZielH = "javascript.0.Stromzähler.Hour"; var idHAGZielD = "javascript.0.Stromzähler.Day"; var idHAGZielW = "javascript.0.Stromzähler.Week"; var idHAGZielM = "javascript.0.Stromzähler.Month"; var debug = false; var DPArray = [idHAGTotH, idHAGTotD , idHAGTotW, idHAGTotM, idHAGZielH, idHAGZielD, idHAGZielW, idHAGZielM]; var DPUnit = "kWh"; DPArray.forEach(function(wert, index, array) { var DPType = wert.split("."); var DPDescr = "Power consumption of " + (DPType[DPType.length - 1]); if(index > 3) DPUnit = "Wh"; createState(wert, 0, { name: DPDescr, desc: DPDescr, type: 'number', unit: DPUnit, role: 'value' }); }); function haupt (VorId, ZielId) { var nVorwert = getState(VorId).val; var nAktuell = getState(idHAGTotal).val; var nDiff = ((nAktuell * 10) - (nVorwert * 10)) * 100; setState(ZielId, nDiff, true); if(debug) log("Aus: " + nAktuell +" - "+ nVorwert + " = " + nDiff); var shandler = on ({id: ZielId, change: 'any'}, function(data) { setState(VorId, (nAktuell*10)/10, true); unsubscribe(shandler); }); } // regelmässige Wiederholungen // ----------------------------------------------------------------------------- schedule(cronH, function () { haupt(idHAGTotH, idHAGZielH); }); schedule(cronD, function () { haupt(idHAGTotD, idHAGZielD); }); schedule(cronW, function () { haupt(idHAGTotW, idHAGZielW); }); schedule(cronM, function () { haupt(idHAGTotM, idHAGZielM); });
Hallo, was muss ich denn für Werte anpassen im Script ? Ich habe einen Wert über einen Lesekopf mit absoluten Zählerstand unter smartmeter.0.1-0:1_8_0.value , diesen anpassen und müssen noch Variablen angelegt werden ?
In Zeile 9 muss dann der Wert durch smartmeter.0.1-0:1_8_0.value ersetzt werden.
Hallo Florian, leider ohne Erfolg, habe auch noch Objekte tmp.Total-D etc. angelegt. Jedoch kein Erfolg.
Welche Fehlermeldung erscheint denn?
Hallo Florian,
folgende Fehlermeldungen
javascript.0 2020-07-11 22:06:24.335 error (2462) at processTicksAndRejections (internal/process/task_queues.js:97:5)
javascript.0 2020-07-11 22:06:24.335 error (2462) at runMicrotasks ()
javascript.0 2020-07-11 22:06:24.335 error (2462) at /opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49
javascript.0 2020-07-11 22:06:24.334 error (2462) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23)
javascript.0 2020-07-11 22:06:24.334 error (2462) at /opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:616:17
javascript.0 2020-07-11 22:06:24.334 error (2462) at /opt/iobroker/node_modules/iobroker.javascript/main.js:1112:17
javascript.0 2020-07-11 22:06:24.333 error (2462) at /opt/iobroker/node_modules/iobroker.javascript/main.js:1521:17
javascript.0 2020-07-11 22:06:24.333 error (2462) at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1468:37)
javascript.0 2020-07-11 22:06:24.333 error (2462) at compile (/opt/iobroker/node_modules/iobroker.javascript/main.js:1245:28)
javascript.0 2020-07-11 22:06:24.332 error (2462) at Object.createScript (vm.js:263:10)
javascript.0 2020-07-11 22:06:24.332 error (2462) at new Script (vm.js:88:7)
javascript.0 2020-07-11 22:06:24.332 error (2462) SyntaxError: missing ) after argument list
javascript.0 2020-07-11 22:06:24.331 error (2462) ^^^^^
javascript.0 2020-07-11 22:06:24.331 error (2462) var DPType = wert.split(„.'{„time“:{„start“:“00:00″,“end“:“23:59″,“mode“:“minutes“,“interval“:2},“period“:{„days“:1}}'“);
javascript.0 2020-07-11 22:06:24.330 error at script.js.Stromzähler:39
javascript.0 2020-07-11 22:06:24.330 error (2462) script.js.Stromzähler compile failed:
javascript.0 2020-07-11 22:06:24.327 info (2462) Start javascript script.js.Stromzähler
javascript.0 2020-07-11 22:06:19.902 info (2462) Stop script script.js.Stromzähler
Der Fehler „SyntaxError: missing )“ sieht evt. nach unvollständigem Code aus, ich habe den Code in einem neuen Script problemlos aktivieren können.
Hey,
erstmal danke für das Script.
Hatte jedoch auch permanent Fehlermeldungen. Nachdem ich testweise den unteren teil (regelmässige Wiederholungen) rausgenommen habe konnte ich das Script problemlos starten und die Datenpunkte wurden angelegt.
Weiter habe ich mich bisher noch nicht drum gekümmert, nur mal als Rückmeldung
in dem Script oben fehlt im letzten Abschnitt (Zeile 53 /54 ) die „});“
Somit ist das Script nicht beendet und wirft Fehler raus.
Läuft nun, aber hatte einen Fehler bei Smartmeter Variable, daher noch keine gespeicherten Werte. Muss bei der SQL Protokollierung etwas beachtet werden? Also als was der Wert gespeichert werden soll?
Perfekt, danke für den Hinweis. Script ist jetzt korrigiert.
Bei der Speicherung ist eigentlich nichts Besonderes zu beachten. Interessant ist lediglich die Einstellung „Minimale Differenz zum letzten Wert“, das verindert z.B. dass zu viele Werte durch Änderungen im Dezimalbereich des Wertes aufgezeichnet werden.
Werte werden nun gespeichert, jedoch hat er nun natürlich als Tageswert den Gesamtzählerstand von „23177.xxx“ KW Stunden Demnach wird keiner der Werte stimmen. Gibts dafür eine Lösung? Also quasi einen Startwert eingeben? :)
Die „Vorwerte“ oder Startwerte können in den Objekten javascript.0.Stromzähler.tmp.Total-* eingetragen werden, dann stimmt auch der aktuelle Wert. Bei dem Wert Total-h sollte spätestens nach einer Stunde Laufzeit des Scripts der richtige Wert gespeichert werden.
Hallo
Erstmal danke für das script. Sowas suche ich schon lange. anscheinend habe ich ein Brett vorm Kopf.
Ich bekomme im Log folgende Fehler!
javascript.0 2020-12-28 08:00:00.017 error (26221) at processTimers (internal/timers.js:497:7)
javascript.0 2020-12-28 08:00:00.016 error (26221) at listOnTimeout (internal/timers.js:554:17)
javascript.0 2020-12-28 08:00:00.016 error (26221) at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/schedule.js:510:7)
javascript.0 2020-12-28 08:00:00.016 error (26221) at /opt/iobroker/node_modules/node-schedule/lib/schedule.js:552:11
javascript.0 2020-12-28 08:00:00.015 error (26221) at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/schedule.js:173:10)
javascript.0 2020-12-28 08:00:00.015 error (26221) at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1273:34)
javascript.0 2020-12-28 08:00:00.015 error (26221) at Object. (script.js.Strom_berechnen:44:5)
javascript.0 2020-12-28 08:00:00.014 error (26221) at haupt (script.js.Strom_berechnen:31:35)
javascript.0 2020-12-28 08:00:00.013 error (26221) Error in callback: TypeError: Cannot read property ‚val‘ of undefined
javascript.0 2020-12-28 08:00:00.008 error (26221) script.js.Strom_berechnen: Please disable that setting or use „getState“ with a callback, e.g.: getState(„javascript.0.Stromzähler.tmp.Total-h“, (err, state) => { … });
javascript.0 2020-12-28 08:00:00.007 error (26221) script.js.Strom_berechnen: The „getState“ method cannot be used synchronously, because the adapter setting „Do not subscribe to all states on start“ is enabled.
Ich lese den aktuellen Verbrauch mit einem Script über Volkszähler ein. Habe dazu in Zeile 9 deines Scriptes folgendes eingesetzt.
var idHAGTotal = „javascript.0.Volkszaehler.AKTUELLER_VERBRAUCH.value“;
Diesen Wert schreibe ich mit der Instanz History. die wird auch gefüllt jedoch steht bei bestätigt „false“
könntest du mir evtl. mit den einstellungen helfen?
Hallo Florian,
vielen Dank für dein super Script. Habe mir die Werte umständlich über Blockly gebaut, da ich kein Javascript kann. Dank deiner Vorlage konnte ich auch den fehlenden Jahreswert in deinem Script ergänzen.
Kurze Verständnisfrage: Warum nimmst du 23:59 Uhr statt 00:00 Uhr?
In Vergangenheit hatten wir mit 00:00 Uhr das Problem, dass die Werte dann dem Folgetage zugeordnet werden. Deswegen der pragmatische Weg mit 23:59 Uhr.
Hallo
Danke für das super Script. Ich nutze es schon länger für meinen Stromverbrauch.
Jetzt wollte ich es für meine Mini-PV Anlage, die bringt maximal 550 Watt/Stunde.
In dem Script wird alles in kWh gezählt, hab mal den Wert auf Wh geändert, aber irgendwie passt das nicht so recht.
Es hat z.B. die letzte Stunde 43200 Wh gezählt.
Was mache ich falsch, hast dir evtl. Einen Tip für mich?
Gruß
Stephan
Hallo Florian,
Vielen Dank funktioniert einwandfrei.
Vielen Dank dafür
:-)