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.
hi,
hat jemand das schon für den Shelly 3em Pro umgeschrieben?
Das mit der Zeile kopieren von 47 – 54 hat bei mir einen Fehler verursacht,
error javascript.0 (575) script.js.common.shelly_auslesen compile failed: at script.js.common.shelly_auslesen:48
Eine Frage zur Fehlersuche.
Ich habe eine Shelly herausgenommen und bekomme jetzt für den Fehlenden immer eine Logmeldung
getState “shelly.1.shellypro1pm#LWP#1.Relay0.Power” not found
Ein Neustart des Scripts hat leider keinen Erfolg gebracht. In der Shelly Instanz habe ich die Objekte von dem Fehlenden schon gelöscht.
Merkt sich das Script an andere Stelle welche Shellys bekannt sind, damit ich es dort löschen kann?
Grüße
Hallo Jürgen,
unterhalb Javascript existieren die jeweiligen Objekte der Shelly-Geräte.
Hier muss das entsprechende Element entfernt werden.
Gruß,
Stephan
Die habe ich schon entfernt. Dennoch kommt immer noch die Fehlermeldung (nach Neustart des Scripts).
Dann kann es ja nur noch an meiner Installation liegen …
Was gibt das Log denn an, welche Zeile betroffen ist?
Hallo zusammen,
ich habe gestern meinen Shelly3EM gegen den ShellyPro3EM getauscht – leider erkennt das Script den nicht 🙁
Mache ich irgendetwas falsch? Hat jemand eine Idee, was im Script angepasst werden muss, damit der Pro3EM auch wieder die Gesamtverbrauchswerte anzeigt?
Hallo Dave,
der Shelly Pro 3EM wird vom Skript nicht unterstützt, da ich diesen nicht habe.
Gruß,
Stephan
Hallo Stephan,
Ich finde dein Skript super!
Weil ich einen Shelly Pro 3EM habe, habe ich mal interessenshalber geschaut, was verändert werden müsste, wenn man diesen integrieren würde.
long story short… Ich bekomme Werte, wenn ich die Datenpunkte anpasst. Vielleicht kann in einer zukünftigen Version zum Beispiel eine Abfrage auf
>>var shellyclass = $(‘state[id=’ + shelly_dp + ‘.*.class]’); entscheiden, ob ein Pro oder Standard 3em vorliegt und die Datenpunktnamen switchen.
Der hinterlegte String für Pro3EM in ‘class’ und ‘type’ ist jeweils ‘shellypro3em’.
Für Leute, die das vor einer möglichen neuen Version ausprobieren wollen, kopiert euch den folgenden Code in die Zeilen 47 bis 54. Ich habe dabei nur die Namen der Datenpunkte und die Kommentare ausgetauscht und in den Kommentar gepackt. Die Wariablennamen bleiben gleich, sodass das Skript wie das Original laufen sollte:
// Datenpunkte der Shelly Pro3EM DP
var shelly3EMDps = $(‘state[id=’ + shelly_dp + ‘.*.*.TotalActiveEnergy]’); // Total
// Datenpunkte der Shelly Pro3EM DP – Total
var shelly3EMTotalDps = $(‘state[id=’ + shelly_dp + ‘.*.*.TotalActivePower]’); //ConsumedPower
// Datenpunkte der Shelly Pro3EM DP – Total
var shelly3EMTotalReturned = $(‘state[id=’ + shelly_dp + ‘.*.*.TotalActiveReturnEnergy]’); //Total_Returned
Danke für das Script. Oben steht neues Update auch für 3EM. der Shelly wird angelegt aber es erscheint nur ein Datenpunkt NAME. Die restlichen Datenpunkte werden nicht angelegt. Ich verwende den 3EM Pro. Wird dieser nicht unterstützt ?
Hallo Rene,
es wird aktuell nur der 3EM (ohne Pro) unterstützt, da ich diesen nicht habe und somit keine Datenpunkte einlesen kann.
Gruß,
Stephan
Danke dir für die schnelle Antwort. Gruss Rene
Hallo Stephan,
erstmal vielen Dank für das Script!
Wie müsste ich das Script “umbauen”, um die Einspeisungswerte zu bekommen?
Vielen Dank
Gruß Daniel
Hallo Daniel,
es werden die Werte der Shelly geloggt.
Somit kann z.B. ein 1PM zur Einspeisung beim Balkonkraftwerk genutzt werden – dieser zeigt dann eben die Einspeisung statt Verbrauch an.
Sollte ich Deine Frage anders verstanden haben, erläutere sie gerne.
Gruß,
Stephan
Hallo Stephan, habe Dein Skript zwei Monate am Laufen. Habe zwei Shelly Geräte angeschlossen. Die Werte für heute und gestern stimmen immer mit den Werten in der Shelly Cloud überein. Die Werte der Wochen bzw. Monate aber nicht. Woran kann das liegen?
Gruß
Peter
Hallo Peter,
ich vermute, das dies Rundungstoleranzen sind. Da ich nicht weiss, wie Shelly selbst rundet, kann ich dies nicht übernehmen.
Gruß,
Stephan
Hallo Stephan,
Ich benutze dein Skript für zwei Shellys die das Ladegerät und den Wechselrichter eines PV-Akkus steuern, und es läuft super.
Wäre es aber auch möglich, die Verbrauchswerte vom Tag und Vortag nicht um 0.00uhr zu starten, sondern zu einer festgelegten Zeit oder bei Sonnenaufgang?
Mein nachtverbrauch setzt sich ja immer zusammen aus ein paar Stunden vom Vortag und ein paar Stunden vom heutigen Tag…
Hallo Oliver,
ja, Du kannst die Zeit in der letzten Zeile des Skriptes bei ‘schedule’ anpassen
Gruß,
Stephan
Danke Stephan.
Zwei Sachen wundern mich aber in dieser letzten Zeile:
1. Es sind nur 5 Zahlen und Sternchen. Müssen es bei CRON- Ausdrücken nicht immer sechs Stellen sein?
2. Ist da nicht ein Schreibfehler bei shelly_vebrauch_tag, ohne das “R” von veRbrauch ?
Aber es funktioniert ja, zumindest bei der 0 Uhr-Umschaltung 🙂
Ich probiere jetzt mal die zweite null durch 9 zu ersetzen und schaue morgen ob’s geklappt hat.
Beste Grüße
Oliver
Hallo Oliver,
hier kannst Du dir ansehen, wie cron funktioniert – https://crontab.guru/
Mit dem Tippfehler hast Du natürlich Recht.
Ändere ich ab.
Gruß,
Stephan
Danke Stephan, es hat perfekt funktioniert, mit Umschaltung 90min nach Sonnenaufgang 🙂
schedule({astro: “sunrise”, shift: 90}, shelly_vebrauch_tag);
LG
Oliver
Hallo Stephan,
was war deine Intention mit der Reboot Prüfung?
bei plugable Shellys, wie den Shelly Plus Plug S, wird nach dem dieser keinen Strom mehr hatte die ganze Messung auf 0 gesetzt.
Viel häufiger wird doch das Szenario sein, dass nach einem Stromverlust die Messung mit dem altem Wert fortgesetzt werden soll, um einen fortlaufenden Gesamtverbrauch zu erreichen.
Wäre eine Anpassung des Scriptes, vielleicht mit einem Schalter möglich?
Danke
VG
Hi Andreas,
wie Du richtig erkannt hast, steht der Verbrauch des Shelly nach einem Reboot auf 0.
Wenn man nun neue Werte abholt, wären diese ja auch 0 – demnach stimmt der Gesamtverbrauch nicht. Somit habe ich die Reboot Prüfung eingebaut, damit dies nicht passiert und eine fortlaufende Verbrauchswerte stattfindet.
Gruß,
Stephan
Das passiert m.E. (zumindest mit der neuesten Firmware) nicht mehr. Selbst nach Reboot, bleibt der interne Zähler stehen. Beim “stromlos” habe ich jedoch keine Erfahrung.
Hallo Stephan,
was wäre denn der einfachste Weg die Daten in kWh umrechnen zu lassen in deinem Skript? Gibts ne Stelle wo man nur 1x durch 1000 teilen muss, oder muss das öfter gemacht werden?
Hab keine Lust jetzt noch zig zusätzliche Variablen anzulegen und ein extra Skript alle Werte durch 1000 teilen zu lassen. Denke das sollte in deinem JS-Script einfach gehen oder?
Viele Grüße und herzlichen Dank für das Skript 🙂
Christian
Hallo Christian,
am Einfachsten ist es, das Skript so zu lassen und in der Weiterverarbeitung die Werte umzurechnen.
Gruß,
Stephan
Na gut, dann muss ich wohl leider noch mehr ‘unnötige’ Skripts hinzufügen.
Noch eine kleine Rückmeldung, ich hab die Uhrzeit auf 23:59 Uhr fürs automatische schreiben geändert. So haben die Werte auch den richtigen Zeitstempel von dem Tag, an dem sie auch angefallen sind.
Hallo, habe das Script für 2 Instanzen im Einsatz (Coap und Mqtt), die Verbrauchswerte Gestern/Letzte Woche/Letzer Monat/Letztes Jahr bleiben aber auf 0 stehen. Wie müsste ich das Script anpassen, um diese Werte zu füllen.
Bitte Rücksicht nehmen auf meine Java-Script-Kenntnisse, diese haben den gleichen Wert wie die Verbrauchswerte von gestern 😉
Bin für jeden Tipp dankbar, für das tolle Script selbstverständlich auch.
Danke! Gruß, Frank
Hallo Frank,
bei 2 Instanzen müssen auch 2 Unterordner benutzt werden, da sich die Skripte sonst überschreiben.
Gruß,
Stephan
Moin Moin
Vielen Dank für dieses geniale Script. Der läuft perfekt.
Besteht die Möglichkeit in deiner knappen Freizeit eine Funktion einzubauen
die den negativen Gesamtverbrauch mit aufzeichnet?
Dann wüsste man gleich wieviel Strom man verschenkt hat, zum Beispiel. (Balkonkraftwerk)
Vielen Dank
Ingo
Hallo Info,
die Skripte sind zum Messen vom Verbrauch konzipiert und nicht als Einspeise-Meter.
Gruß,Stephan
Hallo Stephan,
ich habe das Skript installiert und bekomme leider keine Werte angezeigt. Bei mir sind nur 2 Variablem belegt:
– aktuelle_Wert und alter_Wert mit 139,2 Wh. Alle anderen Variablen sind mit 0 Wh belegt.
Bei Protokollen bekomme ich folgende Fehlermeldung:
Shelly.0
04.08.2023 07:47:25.882 Fehler [httpIoBrokerState] HTTP-Anfragefehler für 192.168.178.23 (shellyem3 /
shellyem3-485519DAD018 / SHEM-3#485519DAD018#1) „/status“: Falscher http-Benutzername oder falsches
http-Passwort! Bitte geben Sie Benutzeranmeldeinformationen für eine eingeschränkte Anmeldung ein.
Ich weiß nicht wo ich die Benutzerinformationen eintragen soll. Gib es eine Stelle in dem Skript?
Ich finde das Skript super. Kann mir jemand helfen es zum Laufen zu bringen.
Gruß
Peter
Hallo Peter,
es ist nicht notwendig, mehrere Kommentare zu verfassen.
Ich antworte, wenn ich Zeit finde.
Dieser Fehler sieht nach einer Meldung des Shelly Adapter aus.
Das Skript gibt solche Fehler nicht aus.
Gruß,
Stephan
Hallo Stephan,
im Verbrauch gibt es bei mir keine Instanzen! Ich habe keine Änderungen an der Datenpunkt-Erstellung vorgenommen.
Das Script ist bei mir seit über 1 Monat (mit o.g. Änderungen) im Praxiseinsatz. Zur Darstellung von Tagesverläufen habe ich ich einen DP ‘Stundenwert’ hinzugefügt und in die History übernommen.
Funktioniert top.
Gruß
Erwin
Hallo Stepahn,
Auch ich habe das Script versucht mit einem Shelly3EMpro und wie du schon sagtest, geht es damit nicht.
Was hältst du davon, wenn ich dir ein iobroker fertige mache + einer Windows VM oder LINUX VM mir egal wo du dein Script mit der Shelly3EM anpassen kannst?
Ist nur ein Vorschlag, weil ich habe 2 davon und der oben eingebaut ist…. ist nicht so wichtig. Würde mich freuen von dir zu hören, ob das eine Idee wäre, weil ich denke da werden sich sicher mehr FREUEN 🙂 weil STROM ist teuer.
Gruß
Rene aus Isenbüttel
Hallo Rene,
ich entwickelt diese Dinge in meiner privaten Zeit und diese ist gerade im Sommer relativ knapp 😉
Gerne kannst Du diese Maschine zur Verfügung stellen und mir per Mail senden.
Allerdings kann dies auch einige Zeit dauern, bis ich dies erledigen kann.
Gruß,
Stephan
Hallo,
läuft das Script auch mit der Shelly3EMpro ?
Falls ja würde ich mich nochmal melden weil bei mir läuft es nicht 🙂
Hallo Sascha,
ich habe aktuell keine Pro Geräte. Somit kann ich dies nicht gegentesten. Wenn Du sagst, es geht nicht, dann scheint es offensichtlich nicht zu gehen 😉
Gruß,
Stephan
Hallo, vllt. könnt ihr mir helfen.
Shelly 3EM
Bei mir gibt es urplötzlich eine Aufschlag in den aktuellen “Wert” von 3387391.1 und dann werden alle aktuell betreffenden daten hoch gerechnet… und ich hab dies Wh mehr drauf. Wenn ich den aktuellen Wert auf 1 setze, kommt nach nicht einer Minute die 3387391.1 Wh drauf.
Irgend wie scheint das skript den Wert falsch zu errechnen oder den Wert falsch abzuholen beim 3EM.
Hallo Luigi,
dann scheint der Wert im Shelly Adapter einen Fehler zu haben.
Das Skript holt die Werte nur ab.
Schau Mal unter:
Shelly.0.ID-Des-Shelly
unter Power, wie der Wert dort aussieht.Gruß,
Stephan
Ich hab die Verbrauchsdaten, die auf dem Shelly gespeichert werden zurück gesetzt. In der Blaoud ist alles o.k.
Die Gloud Werte manuell in die JavaScript Rückschreibwerte eingetragen. Script neu gestartet. Es läuft.
Scheinbar gibt oder gab es Problem mit den im schell selbst gespeicherten Werten. Und da die FW vom 3EM vom 10.Mai 2023 ist, kann es auch mit einem FW Upgrade und zusammen gehangen haben….
Aber nach dem Löschen den Werte auf dem 3EM läuft es wieder.
Hallo Stephan,
vielen Dank erst einmal für das tolle Script!
Dann eine Frage: Ich habe es immer wieder mal, dass die Berechnung komplett falsch ist. Beispiel:
Total.dieser_monat
2023-06-04T08:12:00.020Z 21336 true javascript.0
2023-06-04T08:14:00.018Z 21343 true javascript.0
2023-06-04T08:16:00.017Z 21347 true javascript.0
2023-06-04T08:18:00.048Z 21350.1 true javascript.0
2023-06-04T08:20:00.020Z 21347.1 true javascript.0
2023-06-04T08:22:00.016Z 1149387.1 true javascript.0
2023-06-04T08:24:00.020Z 1149390.1 true javascript.0
2023-06-04T08:26:00.031Z 1149394.1 true javascript.0
2023-06-04T08:28:00.020Z 1149397.2 true javascript.0
Die Messung erfolgt über eine Shelly 3EM. Bisher habe ich das mühsam in der SQL korrigiert.
Gibt es da ggf. eine bessere Möglichkeit, oder bessser, hast Du eine Idee, was das verursachen kann?
Vielen Dank und beste Grüße
Hallo Rainer,
dies kann ich leider nicht beurteilen.
Da das Skript die Werte nur vom Shelly Adapter abholt.
Gruß,
Stephan
Hallo Stephan,
dein Coding Zeile 28 sagt, dass alle zu erstellenden Datenpunkte in ‘ShellyVerbrauch’ angelegt werden. Das gilt auch für die 2. Instanz. D.h. wie bereits beschrieben sind alle DPs (3 von ‘shelly.0’ und 1 von ‘shelly.1’).
Meine Änderung funktioniert zu meiner vollen Zufriedenheit.
Danke für das basis-Script.
Erwin
Hallo Stephan,
die Datenpunkte im ‘ShellyVerbrauch’ enthalten keine Instanz-Unterscheidung. Aus jeder Instanz wird der ‘shelly_verbrauch_tag’ aufgerufen und jedesmal werden alle ‘ShellyVerbrauch’-DPs verschoben. Im ersten Durchlauf werden die Werte richtig verschoben und die ‘von’-DPs auf ‘0’ gesetzt. Beim zweiten Durchlauf werden damit die im ersten Durchlauf ‘0’ gesetzen DPs (wieder) verschoben.
Ich habe nur im Script bei der 2. Instanz den Mitternachtsaufruf ‘shelly_verbrauch_tag’ entfernt.
Ssiehe da, es läuft alles perfekt und richtig.
Gruß
Erwin
Hallo Erwin,
dazu brauchst Du keine Funktionen entfernen – einfach in Zeile 28 den Unterdatenpunkt für die 2. Instanz anpassen.
Also ShellyVerbrauch2. oder ShellyVerbrauchMQTT o.ä.
Gruß,
Stephan
Verbrauch ‘gestern’ zeigt immer ‘0’ – Ursache gefunden
Hallo Stephan,
bei der Verwendung von 2 Instanzen ‘Verbrauch’ (Shelly Typ1 und -Typ2) wird in beiden scripts der ‘Tageswechsel’ aufgerufen. Dieser bearbeitet – im Gegensatz zum ‘Tages-Update’ – alle ‘Verbrauch’-DPs. Im ‘Verbrauch’ gibt es keine Unterteilung in ‘.0’ und ‘.1’. Der ‘Tageswechsel’ darf nur 1-mal aktiviert werden.
Damit nicht ‘Tages-Update’ und ‘Tageswechsel’ (- hat auch ‘Tages-Update’) zu gleicher Zeit abgerufen werden, habe den ‘Tageswechsel’ auf 3 Sekunden nach Mitternacht eingestellt. Damit wird der ‘Tages-Update’ im ‘Tageswechsel’ nicht benötigt.
Gruß
Erwin
Hallo Erwin,
das ist so nicht korrekt.
Da oben die Instanz angegeben wird, steht sie dem Skript als Variable zur Verfügung.
Somit wird dies auch für jede Instanz durchgeführt.
Gruß,
Stephan