Hinweis: für dieses Skript steht ein Update zur Verfügung!
Es wird nun auch der Shelly 3EM unterstützt.
Was ist aber, wenn man diese Daten auch gerne Offline zur weiteren Verarbeitung speichern möchte?
Hier stößt man leider schnell auf ein Problem, das der Verbrauch des Shelly zwar abgelesen werden kann – jedoch nur der Verbrauch seit dem letzten Neustart.
Somit würde sich der Verbrauch immer verändern, wenn der Shelly aufgrund von Stromausfall oder Software-Update neugestartet wurde.
Hierzu habe ich mir lange Gedanken gemacht und ein Skript entwickelt, welches die Werte aus den einzelnen Shelly in einer einstellbaren Zeit abfragt und in eigene Datenpunkte speichert. Auch ist eine Korrektur von Reboot Werten vorhanden. Somit werden die Zähler der temporären Berechnung genullt, sobald festgestellt wurde, das der Shelly neu gestartet wurde. Dies hat keinen Einfluss auf die gesamte Berechnung des Verbrauchs – im Gegenteil: Die Berechnung des Verbrauchs wird genauer!
Übersicht der Funktionen
Folgende Verbrauchswerte stehen in der Historie für jeden der Shelly zur Verfügung:
Funktion | Beschreibung |
---|---|
Verbrauch heute | abgefragter Verbrauch heute |
Verbrauch gestern | abgefragter Verbrauch gestern |
Verbrauch diese Woche | abgefragter Verbrauch für die gesamte Woche |
Verbrauch letzte Woche | abgefragter Verbrauch für die gesamte letzte Woche |
Verbrauch dieser Monat | abgefragter Verbrauch für den gesamten Monat |
Verbrauch letzter Monat | abgefragter Verbrauch für den gesamten letzten Monat |
Verbrauch dieses Jahr | abgefragter Verbrauch für das gesamte Jahr |
Verbrauch letztes Jahr | abgefragter Verbrauch für das gesamte letzte Jahr |
Verbrauch Gesamt | abgefragter Verbrauch gesamt |
Name | Zugewiesener Name des Shelly zum einfachen Wiederfinden |
Screenshot der verfügbaren Variablen
Installation des Shelly Adapter
Nach kurzer Zeit stehen die Datenpunkte aller gefundenen Shellys unter shelly.0
zur Verfügung.
Skript
/* * @copyright 2021 Stephan Kreyenborg <stephan@kreyenborg.koeln> * * @author 2021 Stephan Kreyenborg <stephan@kreyenborg.koeln> * * Dieses Skript dient zur freien Verwendung in ioBroker zur Verbrauchserfassung der Shelly Geräte. * Jegliche Verantwortung liegt beim Benutzer. Das Skript wurde unter Berücksichtigung der bestmöglichen Nutzung * und Performance entwickelt. * Der Entwickler versichert, das keine böswilligen Systemeingriffe im originalen Skript vorhanden sind. * * Sollte das Skript wider Erwarten nicht korrekt funktionieren, so hast Du jederzeit die Möglichkeit, Dich auf * https://www.kreyenborg.koeln * für Unterstützung zu melden. Jedes Skript besitzt seine eigene Kommentarseite, auf der, * nach zeitlicher Möglichkeit des Autors, Hilfe angeboten wird. Ein Anrecht hierauf besteht nicht! * * Ansprüche gegenüber Dritten bestehen nicht. * * Skript Name: Shelly-Verbrauch * Skript Version: 1.60 * Erstell-Datum: 08. Oktober 2021 | Update: 20. Juli 2022 * */ // Datenpunkte neu erstellen var ueberschreiben = false; // Hauptdatenpunkt unterhalb javascript var datenpunkt = "ShellyVerbrauch."; // Abschließender Punkt !!! WICHTIG !!! // Verbrauchs Objekte der einzelnen Shelly var objekt = ["gesamt", "dieses_jahr", "letztes_jahr", "letzter_monat", "dieser_monat", "letzte_woche", "diese_woche", "gestern", "heute", "alter_wert", "aktueller_wert" ]; // Beschreibung der Objekte var beschreibung = ["Gesamter Vebrauch des Shelly", "Verbrauch aktuelles Jahr", "Verbrauch letztes Jahr", "Verbrauch letzten Monat", "Verbrauch aktueller Monat", "Verbrauch letzte Woche", "Verbrauch diese Woche", "Verbrauch gestern", "Verbrauch heute", "Messwert alt", "Messwert neu" ]; // Datenpunkt der Shelly (Standard: shelly.0) var shelly_dp = "shelly.0"; // Datenpunkte der Shelly (!!! Bitte nicht ändern !!!) var shellyDps = $('state[id=' + shelly_dp + '.*.*.Energy]'); // Datenpunkte der Shelly 3EM DP var shelly3EMDps = $('state[id=' + shelly_dp + '.*.*.Total]'); // Datenpunkte der Shelly 3EM DP - Total var shelly3EMTotalDps = $('state[id=' + shelly_dp + '.*.*.ConsumedPower]'); // Datenpunkte der Shelly 3EM DP - Total var shelly3EMTotalReturned = $('state[id=' + shelly_dp + '.*.*.Total_Returned]'); // Datenpunkte der Shelly Namen (!!! Bitte nicht ändern !!!) var shellyDpsName = $('state[id=' + shelly_dp + '.*.name]'); // Shelly Verbrauch aktualisieren - nachts um 00:00 Uhr function shelly_vebrauch_tag() { // Nochmals das Tagesupdate durchlaufen, damit die restlichen Werte gelesen werden shelly_verbrauch_update(); // Datumsvariable var heute = new Date(); // Heute zu Gestern verschieben. Täglich um 00:00 Uhr verschiebe_verbrauch_objekt("heute", "gestern"); log("Shelly Verbrauch: Werte für gestern und heute aktualisiert!"); // aktuelle Woche in letzte Woche verschieben. Am Montag um 00:00 Uhr if (heute.getDay() === 1) { verschiebe_verbrauch_objekt("diese_woche", "letzte_woche"); log("Shelly Verbrauch: Werte für diese und letzte Woche aktualisiert!"); } // aktueller Monat in letzten Monat verschieben. Am 1. des Monats um 00:00 Uhr if (heute.getDate() === 1) { verschiebe_verbrauch_objekt("dieser_monat", "letzter_monat"); log("Shelly Verbrauch: Werte für diesen und letzten Monat aktualisiert!"); } // aktuelles Jahr in letztes Jahr verschieben. Am 1. des Monats am 1. Monat um 00:00 Uhr if (heute.getDate() === 1 && heute.getMonth() === 0) { verschiebe_verbrauch_objekt("dieses_jahr", "letztes_jahr"); log("Shelly Verbrauch: Werte für dieses und letztes Jahr aktualisiert!"); } } // Tagesverbrauch alle 15 Min von der Original Variable des Shelly in eigene Variable kopieren function shelly_verbrauch_update() { var anzahl_updates = 0; var anzahl_reboots = 0; var anzahl_gleich = 0; shellyDps.each(function (id, i) { var shelly_verbrauch = getState(id).val; // Einige Shelly haben keine Verbrauchswerte (noch nicht) if (shelly_verbrauch != null) { // Hole aktuellen Wert, um zu kontrollieren, ob ein Reboot stattgefunden hat var aktueller_wert = getState(shelly_DP(id) + "aktueller_wert").val; var alter_wert = 0; // Prüfe alten und neuen Wert if (shelly_verbrauch > aktueller_wert) { // Verbrauchswert ist größer als alter Wert -> es wurde kein Reboot durchgeführt setState(shelly_DP(id) + "alter_wert", aktueller_wert, true); alter_wert = aktueller_wert; anzahl_updates++; } if (aktueller_wert > shelly_verbrauch) { // Verbrauchswert ist kleiner als alter Wert -> es wurde ein Reboot durchgeführt setState(shelly_DP(id) + "alter_wert", 0, true); alter_wert = 0; anzahl_reboots++; } if (shelly_verbrauch == aktueller_wert) { // Verbrauchswert ist gleich wie alter Wert -> kein Update notwendig alter_wert = aktueller_wert; anzahl_gleich++; } setState(shelly_DP(id) + "aktueller_wert", shelly_verbrauch, true); // Alter und neuer Wert -> aktuelle Differenz var verbrauch = parseFloat(shelly_verbrauch) - alter_wert; // Tagesverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "heute", verbrauch); // Wochenverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "diese_woche", verbrauch); // Monatsverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "dieser_monat", verbrauch); // Jahresverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "dieses_jahr", verbrauch); // Gesamten Vebrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "gesamt", verbrauch); } }); shelly3EMDps.each(function (id, i) { var shelly_verbrauch = getState(id).val; // Einige Shelly haben keine Verbrauchswerte (noch nicht) if (shelly_verbrauch != null) { // Hole aktuellen Wert, um zu kontrollieren, ob ein Reboot stattgefunden hat var aktueller_wert = getState(shelly_DP(id) + "aktueller_wert").val; var alter_wert = 0; // Prüfe alten und neuen Wert if (shelly_verbrauch > aktueller_wert) { // Verbrauchswert ist größer als alter Wert -> es wurde kein Reboot durchgeführt setState(shelly_DP(id) + "alter_wert", aktueller_wert, true); alter_wert = aktueller_wert; anzahl_updates++; } if (aktueller_wert > shelly_verbrauch) { // Verbrauchswert ist kleiner als alter Wert -> es wurde ein Reboot durchgeführt setState(shelly_DP(id) + "alter_wert", 0, true); alter_wert = 0; anzahl_reboots++; } if (shelly_verbrauch == aktueller_wert) { // Verbrauchswert ist gleich wie alter Wert -> kein Update notwendig alter_wert = aktueller_wert; anzahl_gleich++; } setState(shelly_DP(id) + "aktueller_wert", shelly_verbrauch, true); // Alter und neuer Wert -> aktuelle Differenz var verbrauch = parseFloat(shelly_verbrauch) - alter_wert; // Tagesverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "heute", verbrauch); // Wochenverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "diese_woche", verbrauch); // Monatsverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "dieser_monat", verbrauch); // Jahresverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "dieses_jahr", verbrauch); // Gesamten Vebrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "gesamt", verbrauch); } }); shelly3EMTotalDps.each(function (id, i) { var shelly_verbrauch = getState(id).val; // Einige Shelly haben keine Verbrauchswerte (noch nicht) if (shelly_verbrauch != null) { // Hole aktuellen Wert, um zu kontrollieren, ob ein Reboot stattgefunden hat var aktueller_wert = getState(shelly_DP(id) + "aktueller_wert").val; var alter_wert = 0; // Prüfe alten und neuen Wert if (shelly_verbrauch > aktueller_wert) { // Verbrauchswert ist größer als alter Wert -> es wurde kein Reboot durchgeführt setState(shelly_DP(id) + "alter_wert", aktueller_wert, true); alter_wert = aktueller_wert; anzahl_updates++; } if (aktueller_wert > shelly_verbrauch) { // Verbrauchswert ist kleiner als alter Wert -> es wurde ein Reboot durchgeführt setState(shelly_DP(id) + "alter_wert", 0, true); alter_wert = 0; anzahl_reboots++; } if (shelly_verbrauch == aktueller_wert) { // Verbrauchswert ist gleich wie alter Wert -> kein Update notwendig alter_wert = aktueller_wert; anzahl_gleich++; } setState(shelly_DP(id) + "aktueller_wert", shelly_verbrauch, true); // Alter und neuer Wert -> aktuelle Differenz var verbrauch = parseFloat(shelly_verbrauch) - alter_wert; // Tagesverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "heute", verbrauch); // Wochenverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "diese_woche", verbrauch); // Monatsverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "dieser_monat", verbrauch); // Jahresverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "dieses_jahr", verbrauch); // Gesamten Vebrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id), "gesamt", verbrauch); } }); shelly3EMTotalReturned.each(function (id, i) { var shelly_verbrauch = getState(id).val; // Einige Shelly haben keine Verbrauchswerte (noch nicht) if (shelly_verbrauch != null) { // Hole aktuellen Wert, um zu kontrollieren, ob ein Reboot stattgefunden hat var aktueller_wert = getState(shelly_DP(id, true) + "aktueller_wert").val; var alter_wert = 0; // Prüfe alten und neuen Wert if (shelly_verbrauch > aktueller_wert) { // Verbrauchswert ist größer als alter Wert -> es wurde kein Reboot durchgeführt setState(shelly_DP(id, true) + "alter_wert", aktueller_wert, true); alter_wert = aktueller_wert; anzahl_updates++; } if (aktueller_wert > shelly_verbrauch) { // Verbrauchswert ist kleiner als alter Wert -> es wurde ein Reboot durchgeführt setState(shelly_DP(id, true) + "alter_wert", 0, true); alter_wert = 0; anzahl_reboots++; } if (shelly_verbrauch == aktueller_wert) { // Verbrauchswert ist gleich wie alter Wert -> kein Update notwendig alter_wert = aktueller_wert; anzahl_gleich++; } setState(shelly_DP(id, true) + "aktueller_wert", shelly_verbrauch, true); // Alter und neuer Wert -> aktuelle Differenz var verbrauch = parseFloat(shelly_verbrauch) - alter_wert; // Tagesverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id, true), "heute", verbrauch); // Wochenverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id, true), "diese_woche", verbrauch); // Monatsverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id, true), "dieser_monat", verbrauch); // Jahresverbrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id, true), "dieses_jahr", verbrauch); // Gesamten Vebrauch aktualisieren aktualisiere_vebrauch_objekt(shelly_DP(id, true), "gesamt", verbrauch); } }); aktualisiere_namen(); log("Shelly Verbrauch: Verbrauchswerte aktualisiert: " + anzahl_updates + " | Reboots korrigiert: " + anzahl_reboots + " | Unveränderte Werte: " + anzahl_gleich); } // aktualisiert das jeweilige Verbrauchs-Objekt und addiert den Verbrauch dazu function aktualisiere_vebrauch_objekt(dp, objekt, wert) { // Hole alten Verbrauch let alter_verbrauch = getState(dp + objekt).val; let verbrauch = 0; // Kein Wert vorhanden - nutze den übermittelten Wert if (alter_verbrauch < 1 || alter_verbrauch == null) { verbrauch = parseFloat(wert) } else { verbrauch = parseFloat(alter_verbrauch) + parseFloat(wert); } setState(dp + objekt, parseFloat(verbrauch.toFixed(2)), true); } // Verschiebt das jeweilige Verbrauchs-Objekt und nullt den Ursprung (Tag, Woche, Monat, Jahr) function verschiebe_verbrauch_objekt(von, nach) { $('state[id=*.' + datenpunkt + '*.*.' + von + ']').each(function (id, i) { // Temporärer Gruppen-Datenpunkt var tmp_dp = id.slice(0, -(von.length)); var verbrauch = getState(id).val; if (verbrauch != null) { setState(tmp_dp + nach, verbrauch, true); } // Setze "von" zurück setState(id, 0, true); }); } // Funktion um die aktuellen Namen des Shelly abzuholen function aktualisiere_namen() { if (typeof extendObject === "function") { shellyDpsName.each(function (id, i) { if (existsState(id)) { setState(shelly_DP_Name(id), String(getState(id).val), true); extendObject("javascript.0." + shelly_DP_Name_Main(id), { common: { name: String(getState(id).val), desc: String(getState(id).val) }, type: "channel" }); } }); } } // Erstelle die benötigten Datenpunkte function datenpunkte_erstellen() { // Anzahl der gefundenen Shelly var anzahl = shellyDps.length; shellyDps.each(function (id, j) { var initial_wert = 0.0; for (var i = 0; i < objekt.length; i++) { // Startwerte werden nur bei alter_wert und aktueller_wert eingetragen if (i > 8) { initial_wert = getState(id).val; } createState(shelly_DP(id) + objekt[i], initial_wert, ueberschreiben, { name: beschreibung[i], desc: beschreibung[i], type: "number", role: "value.power", unit: "Wh" }); } }); // Anzahl der gefundenen Shelly 3EM var anzahl_3em = shelly3EMDps.length; shelly3EMDps.each(function (id, j) { var initial_wert = 0.0; for (var i = 0; i < objekt.length; i++) { // Startwerte werden nur bei alter_wert und aktueller_wert eingetragen if (i > 8) { initial_wert = getState(id).val; } createState(shelly_DP(id) + objekt[i], initial_wert, ueberschreiben, { name: beschreibung[i], desc: beschreibung[i], type: "number", role: "value.power", unit: "Wh" }); } }); // Anzahl der gefundenen Shelly 3EM - Total var anzahl_3em_total = shelly3EMTotalDps.length; shelly3EMTotalDps.each(function (id, j) { var initial_wert = 0.0; for (var i = 0; i < objekt.length; i++) { // Startwerte werden nur bei alter_wert und aktueller_wert eingetragen if (i > 8) { initial_wert = getState(id).val; } createState(shelly_DP(id) + objekt[i], initial_wert, ueberschreiben, { name: beschreibung[i], desc: beschreibung[i], type: "number", role: "value.power", unit: "Wh" }); } }); // Anzahl der gefundenen Shelly 3EM - Total var anzahl_3em_total_returned = shelly3EMTotalReturned.length; shelly3EMTotalReturned.each(function (id, j) { var initial_wert = 0.0; for (var i = 0; i < objekt.length; i++) { // Startwerte werden nur bei alter_wert und aktueller_wert eingetragen if (i > 8) { initial_wert = getState(id).val; } createState(shelly_DP(id, true) + objekt[i], initial_wert, ueberschreiben, { name: beschreibung[i], desc: beschreibung[i], type: "number", role: "value.power", unit: "Wh" }); } }); // Alle Datenpunkte erstellt. Frage ersten Verbrauch ab! log("Shelly Verbrauch: Datenpunkte erstellt! Erster Verbrauch steht nach 30 Sekunden zur Verfügung! Anzahl gefundener Shelly Datenpunkte: " + (anzahl_3em + anzahl + anzahl_3em_total + anzahl_3em_total_returned)); setTimeout(shelly_verbrauch_update, 30000); // Datenpunkte für die Namen der Shelly erstellen shellyDpsName.each(function (id, j) { createState(shelly_DP_Name(id), "", ueberschreiben, { name: "Name des Shelly", desc: "Name des Shelly", type: "string", role: "value", unit: "" }); }); } /** * Wenn 3EM DP, dann anderen Wert zurückgeben * @param {any} dp * @param {boolean} extended */ function shelly_DP(dp, extended = false) { dp = dp.split("."); dp = datenpunkt + dp[2] + "." + dp[3]; if (extended) { dp = dp + "_Returned."; } else { dp = dp + "."; } return dp; } function shelly_DP_Name(dp) { dp = dp.split("."); dp = datenpunkt + dp[2] + "." + dp[3]; return dp; } function shelly_DP_Name_Main(dp) { dp = dp.split("."); dp = datenpunkt + dp[2]; return dp; } function shelly_verbrauch_erster_start() { log("Shelly Verbrauch: Erster Start des Skriptes! Datenpunkte werden erstellt!"); // Datenpunkte werden erstellt datenpunkte_erstellen(); } // Erster Start und Initialisierung shelly_verbrauch_erster_start(); // Alle 15 Minuten das Skript für den Tagesverbrauch ausführen schedule('*/15 * * * *', shelly_verbrauch_update); // Nachts um 24 Uhr werden die Werte in andere Variablen gespeichert, um den Verlauf zu erstellen schedule('0 0 * * *', shelly_vebrauch_tag);
Datenpunkte
Nachdem das Skript angelaufen ist und regelmäßig die Verbräuche der Shelly abgefragt wurden, findest Du diese im Datenpunkt: javascript.0.ShellyVerbrauch
Fehlersuche
Fehlermeldung im Log
javascript.0 2022-01-25 17:41:56.234 error Function "extendObject" is not allowed. Use adapter settings to allow it.
Solltest Du diese Fehlermeldung erhalten, dann werden die Namen deiner Shelly dem Datenpunkt nicht zugewiesen. Hierzu musst Du im Javascript – Adapter die Funktion “setObject” erlauben. Dies bedeutet, das Skripte die Eigenschaften von Objekten verändern dürfen. Hier dient es dazu, dem Objekt den Namen des jeweiligen Shelly zu geben.
Neue Shelly eingebunden, das Skript liest die Daten nicht aus!
Solltest Du zur Laufzeit des Skripts neue Shelly eingebunden haben, so kannst du das Skript einmal stoppen und erneut starten. Dann werden auch die passenden Datenpunkte für die neuen Shelly gefunden und ausgelesen.
Hallo Stephan, erstmal danke für Deine Arbeit und dieses tolle Script. Ich habe jetzt die letzten 2 Monate versucht das mit Sourceanalytix hinzubekommen, was mir aber nicht wirklich zufriedenstellend gelungen ist. Ich möchte nun die Datenpunkte meiner 5 Shelly Plug S von Deinem Script mit Influxdb 2 loggen und dann mit Grafana visualisieren.
Hier habe ich allerdings ein kleines Verständnisproblem, da ich bei ioBroker auch noch nicht so lange dabei bin.
Um alle Daten zu visualisieren muss ich vn jedem Shell die Datenpunkte von Tag/Monat/Woche usw. per influx loggen und dann für jeden Verbrauhszyklus ein eigenes Dashboard anlegen, oder denke ich hier zu kompliziert?
Ich wäre Dir für einen kleinen Rat dankbar.
Gruß
Andy
Hallo Andy,
du müsstest für jeden Shelly, den du in Grafana auswerten möchtest, den Datenpunkt “heute” in Influx loggen.
Gruß,
Stephan
Okay, ich muss also nur heute loggen und wie ergeben sich dann die Daten für Woche, Quarta usw.?
Das ist das was ich noch nicht ganz verstehe.
Kann Du mir das bitte kurz erklären?
Danke
Hallo Andy,
dies kannst Du dann in Grafana darstellen. Dazu gibt es viele Tutorials im Netz.
Gruß,
Stephan
Hallo Stephan,
erstmal vielen Dank für deine tollen Skripte und dass du sie uns zur Verfügung stellst.
Eine Frage hätte ich…Kann man das Skript so anpassen, dass auch nur Datenpunkte der Shellys erstellt werden, die auch den Verbrauch ausgeben? Es gibt ja zum Beispiel den Shelly 1, der hat diese Funktion nicht. Dadurch würden keine unnötigen Datenpunkte erstellt werden.
Vielen Dank im Voraus für deine Unterstützung.
Viele Grüße
Sascha
Hallo Sascha,
das Skript fragt die Datenpunkte vom Shelly Adapter ab – somit kann hier leider nicht differenziert werden, welcher Shelly eine Power-Messung hat oder nicht.
Gruß,
Stephan
Ich habe dein Script diese Woche gefunden, gestern installiert.
Einfach Klasse.
Ich benutze einen Shelly Plug S um mein Balkonkraftwerk zu monitoren.
Leider ist die Shelly Cloud seit letzter Zeit total ungenau. D.h. auf der
Diagrammanzeige wird so Grottenschlecht gerundet, damit kann man nichts mehr anfangen.
Und immer die CSV runterladen, bearbeiten ect. ist auf Dauer ätzend.
Dein Script läuft Super. Macht genau was es soll.
Vielen Dank für deine Arbeit und Mühe.
Gruß
Detlef
Hallo Detlef,
das freut mich.
Vielen Dank für die Rückmeldung!
Gruß,
Stephan
Hallo Stephan,
ich würde das Script auch gerne nutzen, bekomme aber immer die Fehlermeldung:
error javascript.0 (548544) script.js.common.ShellyVerbrauch compile failed: at script.js.common.ShellyVerbrauch:31
Das Wort objekt in Zeile 31 ist rot unterstrichen mit folgender Fehlermeldung:
index1.js1 von 2 Problemen
Cannot redeclare block-scoped variable ‘objekt’.(2451)
Kannst Du mir sagen, was ich falsch mache?
Viele Grüße
Mattias
P.S.
Im Log gibt es folgende Info:
javascript.0
2022-05-31 20:54:25.218 error at processImmediate (internal/timers.js:463:21)
javascript.0
2022-05-31 20:54:25.218 error at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.javascript/main.js:1472:17)
javascript.0
2022-05-31 20:54:25.218 error at /opt/iobroker/node_modules/iobroker.javascript/main.js:2001:17
javascript.0
2022-05-31 20:54:25.218 error at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1900:37)
javascript.0
2022-05-31 20:54:25.218 error at createVM (/opt/iobroker/node_modules/iobroker.javascript/main.js:1647:28)
javascript.0
2022-05-31 20:54:25.218 error at Object.createScript (vm.js:261:10)
javascript.0
2022-05-31 20:54:25.218 error at new Script (vm.js:88:7)
javascript.0
2022-05-31 20:54:25.218 error SyntaxError: Identifier ‘objekt’ has already been declared
javascript.0
2022-05-31 20:54:25.218 error ^
javascript.0
2022-05-31 20:54:25.217 error var objekt = [“gesamt”, “dieses_jahr”, “letztes_jahr”, “letzter_monat”, “dieser_monat”, “letzte_woche”,
javascript.0
2022-05-31 20:54:25.217 error script.js.common.ShellyVerbrauch compile failed: at script.js.common.ShellyVerbrauch:31
javascript.0
2022-05-31 20:54:25.201 info Start javascript script.js.common.ShellyVerbrauch
javascript.0
2022-05-31 20:54:25.181 info Stop script script.js.common.ShellyVerbrauch
Hallo Mattias,
2022-05-31 20:54:25.218 error SyntaxError: Identifier ‘objekt’ has already been declared
Hier wird der Fehler beschrieben. Du hast in einem der Skripte schon den Namen “objekt” belegt. Somit muss entweder dieser Name oder der des anderen Skriptes umbenannt werden.
Gruß,
Stephan
Hallo, mein Shelly EM wird nicht aktualisiert woran kann es liegen.
es wird im moment nur der aktuelle wert angezeigt mehr nicht.
Hallo Thomas,
wurde der 3EM nach dem Skript-Start angemeldet?
Wenn ja, das Skript stoppen und erneut starten.
Gruß,
Stephan
Gibt es auch die Möglichkeit bei den Shelly 3EM auch die “Return” werte darzustellen. dann könnte man relativ einfach den Eigengebrauch berechnen.
Hallo Thomas,
die Werte befinden sich ebenfalls unterhalb des Datenpunktes des Shelly 3EM.
Hi Stephan, bei mir leider nicht. was müsste ich tun um die Return-Werte zu bekommen?
Danke dir 🙂
Hallo Lars,
welche Return Werte fehlen dir denn?
Das Skript fragt alles ab, was der Shelly Adapter zur Verfügung stellt.
Dies hat nichts mit der App auf dem Handy zu tun!
Gruß,
Stephan
Hi Stephan,
shelly.0.SHEM-3#8CAAB561EE25#1.Total.Total_Returned
gibt es in den Objekten des Adapters, aber dies fehlt in den DP des Scripts.
bzw. in den einzelnen Phasenpunkten heißt dieser:
shelly.0.SHEM-3#8CAAB561EE25#1.Emeter0.Total_Returned
Hallo Lars,
das stimmt. Bis heute scheint hier keine Aufsummierung stattzufinden.
Somit sind diese Werte irgdndwie nicht brauchbar.
Oder zeigt Dein 3EM richtige Werte an?
Gruß
Stephan
Ich denke schon, ich sehe in den Objekten zumindest einen validen Wert bei PhaseA (Emeter0), welcher sich auch im Total_Returned befindet.
Auch in Shelly.Cloud ist dieser Wert sichtbar.
Was wären dann brauchbare Werte?
Hallo Lars,
Wenn dem so ist, werde ich mir dies nach meinem Urlaub nochmals anschauen 🙂
Vielleicht kannst Du mir 1-2 Screenshots mit Werte von 2 Tagen per Mail an Stephan@Kreyenborg.koeln senden?
Danke im Voraus!
Gruß,
Stephan
Hi Stephan, ich habe dir dazu wie gewünscht eine Mail mit Screenshots geschickt.
Hi Lars,
dies hatten wir ja eroiert 🙂
Gruß,
Stephan
Hallo Stephan,
hast du hier eine Lösung zu dem Total_Returned erhalten ?
Würde dieses gerne auch für meine PV mit loggen.
Habe zwar keinen 3EM, aber mit dem normalen EM sollte es ja auch klappen.
Grüße
Kevin
wenn man diese Daten nun per Grafana visualisieren will muss man den Umweg über influxdb gehen? wenn ja, wie oft sollte man die Werte an influxdb schicken, bzw. was wären denn die Einstellungen hier in iobroker? Macht ja kein Sinn jede sekunde “alle beide” datenbanken zu füllen, oder?
Hi Sky80,
Ich habe bei mir die Standardeinstellungen der Optionen für die Objekte gelassen.
Allerdings lasse ich den Influx Adapter nur schreiben, wenn sich 50 Datenpunkte geändert haben. Auch liegt die influxDB selbst auf einem anderen Host, denn die Speicherkarte des Raspi sollte nicht zuviel beschrieben werden.
Gruß,
Stephan
Hallo Stefan!
Das Skript ist super und funktioniert auch bei mir! Aber was passiert mit den Werten, wenn der Raspberry neu gebootet wird? Bleiben die Werte auch dann erhalten noder nicht?
Ich möchte das jetzt nicht unbedingt ausprobieren!
Danke!
Hallo Hubert,
die Werte sind in der ioBroker Datenbank gespeichert. Sollte der Raspi einmal neustarten, so holt er nach dem nächsten Start die Wert wieder vom Shelly und aktualisiert die Werte in der Datenbank des ioBrokers.
Gruß,
Stephan
Hallo Stephan.
Dein Script hat mir sehr beim Auslesen der Daten meiner Voltaikanlage geholfen. Habe die Werte auch in iqontrol virtualisiert.
Leider werden die historischen Daten “Verbrauch gestern” “Verbrauch letzte Woche” nicht aktualisiert.
Ich habe keine Fehlermeldungen im Protokoll.
Es ist übrigens der erte Adapter, den ich konfiguriere, habe also Nachsicht!
Mit freundliche Grüßen.
Holger
Hallo Holger,
vielen Dank für die Rückmeldung.
Ich habe eine neue Version bereitgestellt, die diese Probleme beheben sollte.
Bitte teste diese einmal.
Gruß,
Stephan
Hallo Stephan.
Scheint jetzt alles zu funktionieren.
Habe jetzt einen 2. Shelly EM angeschlossen. Was muss ich am Script ändern, um die Daten das 2. Shellys zu schreiben?
Mit freundlichen Grüßen,
Holger
Hallo Holger,
Du müsstest nur das Skript stoppen und wieder starten. Dann wird der neue Shelly gefunden.
Gruß,
Stephan
hi.
shelly plus 1pm holt keine werte.
shellyplus1pm / shellyplus1pm-3083980a00a8 / shellyplus1pm#3083980a00a8#1) received pubrel for unknown messageId: 369
Hallo,
würdest Du mir die geöffneten Datenpunkte eines Shelly Plus einmal per Mail schicken?
Ich selbst habe selber keine – daher wäre dies sehr hilfreich.
Stephan@Kreyenborg.koeln
Vielen Dank!
Hallo Stephan, die Umrechnung in Euro hast Du nicht drin, oder ?
Wäre das nicht noch eine sinnvolle Ergänzung ?
VG Bernd
Hallo Bernd,
mein Skript berechnet nur die Verbräuche und kann eigenständig erweitert werden.
Gruß,
Stephan
Hallo Stephan,
ich noch mal.. 😉 . Ich habe eine kleines Problem mit dem Skript. Alle Daten werden zwar wie gewünscht ausgegeben, aber im Fehlerprotokoll der IO Brokers taucht regelmäßig folgender Fehler auf :
“javascript.0 2022-03-22 20:30:00.018 error Function “extendObject” is not allowed. Use adapter settings to allow it.”
Wenn ich das richtig gefunden habe, taucht dieser Befehl bzw. die Funktion in Zeile 257 des Scripts auf, in dem es um das Abholen von Namen des Shelly geht… Liegt der Fehler im Script und in den Adapter-Einstellungen eines IOBrokers? Leider sagt mir der Fehler wenig und ich weiß mangels Erfahrung mit dem IOB auch nicht, in welchen Adapter Settings ich was erlauben soll.. (welche Settings und welcher Adapter? der Java Adapter oder der Shelly Adapter?).
Vielleicht kannst du mir dazu was schreiben. Besten Dank!
Gruß Peter
Hallo Peter,
hier ist der JavaScript Adapter gemeint.
Zu finden hier: Link
Gruß,
Stephan
Hallo Stephan,
danke für die Rückmeldung und den Link. Hätte mir bei genauem Lesen natürlich auch selber auffallen müssen…. sorry..
VG Peter
Hallo Stephan,
ich habe seit gestern einen Shelly3EM installiert und bin beim Suchen nach weiteren Infos dazu in einem YT Video auf dwen Link zu deinen Seiten und zu deinem Script gestoßen. Die Installation im IOB, d.h. das Einfügen, Abspeichern und Starten, funktionierte problemlos und ich kann nur sagen, dass das Script absolute Spitze ist! Die Realisierung genau solche Funktionen / Auswertungen hatte ich grob im Kopf, wusste aber mangels Programmierkenntnisse für soche Scripte nicht, wie ich das bewerkstelligen sollte. Daher vielen, vielen Dank für deine Mühe und das Bereitstellen und die Pflege des Scipts!
Als nächstes werde ich nun versuchen, die ganzen Daten im IOB mit Vis zu visualisieren, was für mich als IOB-Neuling schon eine genügend große Herausforderung ist.. ;-).
Nochmals besten Dank und Grüße aus Nümbrecht,
Peter
p.s.: deine Homepage finde ich insgesamt sehr interessant, informativ und für mich auch lehrreich! Werde ich mir nach und nach mal durchlesen… 🙂
Hallo Peter,
vielen Dank für die tolle Rückmeldung 🙂
Die Daten in VIS bekommt man “eigentlich” problemlos über das Value Widget dargestellt. Hier den Datenpunkt angeben und schon erscheint der Wert in der Oberfläche.
Gruß,
Stephan
Guten Morgen Stephan,
auch von mir erstmal einen Dank für das tolle Skript.
Ich hatte vorher mit Tasmota geflashte Gosund Adapter und im Vergleich zu denen fehlt bei den Shellys die von dir gebaute Dokumentation der Verbrauchswerte.
Ich habe hierzu zwei Fragen.
1. Ich fand die Anpassung die Jan gemacht hat (Die Verschiebung in =_userdata.0.ShellyVerbrauch) gut habe dabei auch das Problem wie er das der Datenpunkt gestern nicht aktualisiert wird. Bei den anderen lässt sich das noch nicht sagen da der Adapter noch frisch läuft.
2. Lässt sich der Intervall der Datenübernahme aus dem Shelly Adapter anpassen? Wenn ich das richtig sehe läuft das mit über den cron Job am Ende des Skriptes.
Wenn ich den Shelly Adapter richtig verstanden habe löscht der nachdem der Schalter ausgeschaltet wird nach einer Minute der Wert Energy auf 0 Wh gesetzt.
Ich nutze 10 Shelly Plug S die Shelly Adapter Version ist die v5.1.2
Zum Punkt 2. habe ich noch vergessen zu fragen wenn ich den Wert unten Anpasse verfälscht das dann die Berechnung für den Verbrauch? Rechnet er wenn ich zum Beispiel von 15 Minuten auf 1 Minute umstelle den Wert 15 Fach?
… der Verbrauch wird nicht verfälscht, da die eigentliche Verbrauchsrechnung im Shelly selbst stattfindent.
Das Skript “kopiert” die Werte und legt sie entsprechend Tag, Monat, Jahr ab.
Hallo Stephan,
vielen Dank für die schnelle Antwort.
Gruß
Marko
Hallo Marko,
das Problem bei Jan war, das er im JavaScript Adapter noch “setObject” erlauben musste. Der “Fehler” ist hier beschrieben:
https://www.kreyenborg.koeln/shelly-verbrauchs-historie-fuer-tag-woche-monat-jahr/#Fehlermeldung_im_Log
Der Intervall kann am Ende des Skriptes an deine Bedürfnisse angepasst werden. Wenn Du Deine Daten schneller möchtest, kannst Du das Intervall verkürzen.
Der Shelly Adapter löscht die Werte “Energy” nicht – dieses wird gelöscht, wenn der Shelly neustartet oder ein Update durchführt.
Gruß,
Stephan
Hallo Stephan,
vielen Dank für die schnelle Antwort.
Die Einstellung im JavaScript Adapter habe ich so drin. Werde es mal ein paar Tage laufen lassen und beobachten.
Gruß
Marko
Hallo Stephan,
nachdem ich nun das Skript einige Tage im Einsatz habe fällt mir auf, dass der Datenpunkt “gestern” nicht aktualisiert wird.
Ich habe lediglich eine Zeile im Code angepasst:
// Hauptdatenpunkt unterhalb javascript
var datenpunkt = “0_userdata.0.ShellyVerbrauch.”; // Abschließender Punkt !!! WICHTIG !!!
Eine Mail mit Screenshot der DP ist unterwegs zu dir.
Danke vorab fürs Nachsehen… 🙂
Jan
Hallo mal wieder 🙂
Auch dieses Skript funktioniert auf Anhieb.
Danke für deine Bemühungen!
Hallo,
kann es sein, dass das Skript folgende Hinweise im Log verursacht?
2021-12-23 02:15:00.055 – [33mwarn[39m: javascript.0 (997) getState “shelly.0.SHDW-1#B88FC1#1.name” not found (3) states[id]=null
2021-12-23 02:15:00.059 – [33mwarn[39m: javascript.0 (997) at script.js.common.System.Shelly_Verbrauch_capturen2:256:45
2021-12-23 02:15:00.060 – [33mwarn[39m: javascript.0 (997) at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:819:29)
2021-12-23 02:15:00.060 – [33mwarn[39m: javascript.0 (997) at aktualisiere_namen (script.js.common.System.Shelly_Verbrauch_capturen2:255:19)
2021-12-23 02:15:00.061 – [33mwarn[39m: javascript.0 (997) at Object.shelly_verbrauch_update (script.js.common.System.Shelly_Verbrauch_capturen2:228:5)
2021-12-23 02:15:00.061 – [33mwarn[39m: javascript.0 (997) at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1313:34)
2021-12-23 02:15:00.061 – [33mwarn[39m: javascript.0 (997) at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/Job.js:168:15)
2021-12-23 02:15:00.062 – [33mwarn[39m: javascript.0 (997) at /opt/iobroker/node_modules/node-schedule/lib/Invocation.js:268:28
2021-12-23 02:15:00.062 – [33mwarn[39m: javascript.0 (997) at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/Invocation.js:228:7)
2021-12-23 02:15:00.062 – [33mwarn[39m: javascript.0 (997) at listOnTimeout (internal/timers.js:555:17)
2021-12-23 02:15:00.063 – [33mwarn[39m: javascript.0 (997) at processTimers (internal/timers.js:498:7)
2021-12-23 02:15:00.063 – [33mwarn[39m: javascript.0 (997) getState “shelly.0.SHDW-1#B88FC1#1.name” not found (3) states[id]=null
2021-12-23 02:15:00.066 – [33mwarn[39m: javascript.0 (997) at script.js.common.System.Shelly_Verbrauch_capturen2:259:30
2021-12-23 02:15:00.067 – [33mwarn[39m: javascript.0 (997) at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:819:29)
2021-12-23 02:15:00.067 – [33mwarn[39m: javascript.0 (997) at aktualisiere_namen (script.js.common.System.Shelly_Verbrauch_capturen2:255:19)
2021-12-23 02:15:00.067 – [33mwarn[39m: javascript.0 (997) at Object.shelly_verbrauch_update (script.js.common.System.Shelly_Verbrauch_capturen2:228:5)
2021-12-23 02:15:00.068 – [33mwarn[39m: javascript.0 (997) at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1313:34)
2021-12-23 02:15:00.068 – [33mwarn[39m: javascript.0 (997) at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/Job.js:168:15)
2021-12-23 02:15:00.069 – [33mwarn[39m: javascript.0 (997) at /opt/iobroker/node_modules/node-schedule/lib/Invocation.js:268:28
2021-12-23 02:15:00.069 – [33mwarn[39m: javascript.0 (997) at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/Invocation.js:228:7)
2021-12-23 02:15:00.069 – [33mwarn[39m: javascript.0 (997) at listOnTimeout (internal/timers.js:555:17)
2021-12-23 02:15:00.069 – [33mwarn[39m: javascript.0 (997) at processTimers (internal/timers.js:498:7)
2021-12-23 02:15:00.070 – [33mwarn[39m: javascript.0 (997) getState “shelly.0.SHDW-1#B88FC1#1.name” not found (3) states[id]=null
2021-12-23 02:15:00.072 – [33mwarn[39m: javascript.0 (997) at script.js.common.System.Shelly_Verbrauch_capturen2:260:30
2021-12-23 02:15:00.073 – [33mwarn[39m: javascript.0 (997) at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:819:29)
2021-12-23 02:15:00.073 – [33mwarn[39m: javascript.0 (997) at aktualisiere_namen (script.js.common.System.Shelly_Verbrauch_capturen2:255:19)
2021-12-23 02:15:00.073 – [33mwarn[39m: javascript.0 (997) at Object.shelly_verbrauch_update (script.js.common.System.Shelly_Verbrauch_capturen2:228:5)
2021-12-23 02:15:00.074 – [33mwarn[39m: javascript.0 (997) at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1313:34)
2021-12-23 02:15:00.074 – [33mwarn[39m: javascript.0 (997) at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/Job.js:168:15)
2021-12-23 02:15:00.074 – [33mwarn[39m: javascript.0 (997) at /opt/iobroker/node_modules/node-schedule/lib/Invocation.js:268:28
2021-12-23 02:15:00.074 – [33mwarn[39m: javascript.0 (997) at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/Invocation.js:228:7)
2021-12-23 02:15:00.075 – [33mwarn[39m: javascript.0 (997) at listOnTimeout (internal/timers.js:555:17)
2021-12-23 02:15:00.075 – [33mwarn[39m: javascript.0 (997) at processTimers (internal/timers.js:498:7)
2021-12-23 02:15:00.077 – [32minfo[39m: javascript.0 (997) script.js.common.System.Shelly_Verbrauch_capturen2: Shelly Verbrauch: Verbrauchswerte aktualisiert: 4 | Reboots korrigiert: 0 | Unveränderte Werte: 32
Hallo Thomas,
könntest Du mir bitte einen Screenshot der Log-Ausgabe per Email an Stephan@Kreyenborg.koeln senden?
Hier im Text ist dies schwer zu lesen und zu erkennen.
Gruß,
Stephan
Hallo Stephan,
erstmal vielen Dank für deine super arbeit.
Leider schreibt er bei mir keine Werte in die Datenpunkte.
Ich habe einen Shelly Plug S über MQTT eingebunden. Ich habe alerdinge gesehen das er im DAtenpunkt von dem Shelly Adapter “Energy” bei 0 bleibt egal was er Verbraucht hat.
Ich habe das Skript jetzt nur grob überflogen. Rechnest du mit dem aktuellen verbrauch (Power) oder mit dem Energy Wert ?
Gruß Marc
Hallo Marc,
so, wie ich das sehe, scheint hier der Shelly Adapter ein Problem zu haben, oder?
Das Skript fragt die Werte des Datenpunktes “Energy” bei 1-phasigen Shelly und “Total” bei den 3EM’s ab.
Zeigt denn das Web-Interface des Shelly Plug einen Verbrauch an?
Gruß,
Stephan
Hallo Stephan,
ja im Web-Interface zeigt er den aktuellen Verbrauch an, aber nicht den summierten Verbrauch. Also genau wie der Adapter.
Aber wie gesagt steht bei Energy leider immer eine 0.
Gruß Marc
Hi Marc,
entschuldige – ich meinte natürlich die Shelly App. Aber, wenn Du die Shelly per MQTT angbunden hast, wird hier wohl die Cloud deaktiviert sein.
Ist es zwingend notwendig, das Deine Shelly über MQTT statt über COAP laufen?
Hallo Stephan,
die Shelly App habe ich gar nicht. Ich habe den Plug über die Web Oberfläche eingestellt. Ich weiß nicht was ich gemacht habe, aber jetzt scheint es zu klappen. Dir vielen Dank für das super Skript.
Bald kommt die neue neue Serie von Shelly raus die PRO Serie für die Hutschiene. Wird man das Skript auch dafür nutzen können ?
Hallo Marc,
freut mich, wenn es läuft 🙂
Aktuell besitze ich noch keinen der Shelly PRO – somit kann ich zu der Verwendung noch nichts sagen. Ich denke jedoch, das Sie die Software nciht wirklich verändern und somit das Skript auch dort laufen wird.
Gruß,
Stephan
Hallo Stephan,
ich bin von Deinem Script begeistert. Nutze schon eine ganze Weile die Version 1.4. Wenn ich jetzt auf die 1.5 umsteigen würde, löscht er mir dann meine alten Daten die die Version 1.4 angelegt hat? Das wäre nicht so schön.
Danke und Gruß
Micha
Hallo Micha,
alle Versionen können über die andere Version “kopiert werden”. Alte Daten werden nicht gelöscht.
Gruß,
Stephan
Vielen Dank…einfach Klasse!
Hallo Stephan,
habe gerade deine Seite gefunden und den Skript bei mir eingefügt.
Ich bin total begeistert und möchte ein großes Dankeschön ansprechen, dass du deine Arbeit hier zur Verfügung stellst.
Das Script läuft bei mir einwandfrei. Also nochmals Danke dafür.
Gruß
Peter
Hallo Peter,
vielen Dank für die Blumen 😉
Gruß,
Stephan