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.
Hall Stephna,
danke für das Script. Nutze es selber. Habe es jetzt bei einem Bekannten installiert (Pi4), alles gut.
Jetzt habe ich eine 2. Shelly (Shelly 1PM Plus) installiert. Laut Anleitung…..
‘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…..
muss man das Sfript nur neu starten. Leider werden keine neuen Datenpunkte erzugt, die neue Shelly wird nicht erkannt!? Kann ich das irgendwie debuggen was da los ist? Vorhanden ist sie im iobroker und Daten kommen auch, nur das Script scheint diese nicht zu scannen/erkennen…?
Für einen Tipp wo ich suchen kann äre ich dankbar.
Christian
Hallo Christian,
2. Instanz heißt ja anderer Pfad des Shelly Adapter. Bitte den Pfad anpassen.
Gruß,
Stephan
Hallo Stephan
Dein Skript hat sauber funktioniert. Leider musste ich den Shelly durch einen neuen austauschen und habe mir den Shelly Pro3EM geholt.
Hast du für den neuen Pro3EM schon ein neues Skript zur Verfügung?
Gruss Stefan
Vielen Dank für diesen Mega Script!
Wäre es evtl. noch mglich um den Durschnittwert der letzten 15min zu ergänzen?
Insbesondere für Shelly3EM Nutzer, könnte bei erhöhtem Verbrauch oder konstanter Einspeisung eine Aktion getriggert werden.
Mit dem Durschnittverbrauch / Einspeisung wäre somit möglich einen Heizstab oder Klimaanlage zu schalten.
Hallo
Sry wenn Doppel Post sehen meine Post nicht.
Ich habe das Problem das es mir keine Werte bei gestern letzte woche etc. einträgt?
Jmd einen Tipp?
Danke
Super Script
Leider werden bei mir nur die Heute Werte aufgezeichnet die anderen bleiben leer (gestern,letze woche….)
jmd einen Tip?
danke
Hallo Stephan,
danke für das klasse Script.
Nach deinen FAQs läuft es ohne Fehlermeldung bei mir.
Wo finde ich die Variablen im IObroker?
Unter Shelly finde ich sie nicht.
Danke & Grüße
Alex
Hallo Alex,
steht doch auch in der Anleitung:
https://www.kreyenborg.koeln/shelly-verbrauchs-historie-fuer-tag-woche-monat-jahr/#datenpunkte
Gruß,
Stephan
Für alle die den 3EM Pro haben, mir hat der Hinweis von Erik geholfen. alle die auch noch EInspeisewerte aus PV benötigen, kann die Zeile 53f angepasst werden:
// Datenpunkte der Shelly 3EM DP – Total
var shelly3EMTotalReturned = $(‘state[id=’ + shelly_dp + ‘.*.*.TotalActiveReturnEnergy]’);
Hallo Moritz
Kannst du mir sagen, welche Anpassungen gemacht werden müssen im Skript, das es auch mit dem 3Pro EM funktioniert?
hi!
nachdem im ioB forum wieder mal das script zur sprachen kam…
was mich von anfang an gestört hat, es gibt keine abfrage nach relay0.
somit werden alle shelly abgegrast und eingetragen, auch die, die keine strommessung haben.
Hi Simon,
es gibt ja auch welche mit Switch, die eine Messung haben. Somit kann man nicht alle Eventualitäten einbauen, damit das Skript noch übersichtlich bleibt.
Gruß,
Stephan
Hallo Stephan,
ich habe offenbar auch (neue) Probleme mit dem Script.
Bei einem Shelly1PM (Gen.1) scheinen die Werte für “Messwert neu” bzw. “Messwert alt” plausible zu sein und liegen bei dem vom Gerät gemeldeten Wert. Der Wert für “Gesamt” (Gesamter Vebrauch des Shelly) passt aber nicht zu den o.g. Werten. Er wurde auch nicht bei Scriptstart mit dem Verbrauchswert laut Gerät befüllt. “Verbrauch heute” und “Verbrauch Gesamt” sind identisch, was eigentlich auch nicht stimmen kann.
Nach einem reboot ist zwar der (viel zu kleine) Gesamtverbrauch beibehalten worden, dafür sind aber die einstigen, realen und höheren Verbrauchswerte
weg. Das heißt, eine Sicherung der ehemaligen Verbrauchswerte hat nicht stattgefunden.
Ob das mit der Admin-Version (bei mir jetzt 6.13.16) zusammenhängt, kann ich nicht mehr nachvollziehen.
Mache ich hier einen Denkfehler oder wo könnte ich nach Fehlern suchen?
Ich habe das Skript sehr lange benutzt. Bin mit dem System umgezogen und jetzt aktualisiert sich leider gar nichts mehr unter admin 6.13.15.
Skript von hier neu kopiert, Objektbaum gelöscht, Skript eingefügt und gestartet. Objektbaum wird brav erstellt, aber der aktuelle Wert ändert sich nicht, obwohl Strom verbraucht wird.
Die Messung erfolgt per Shelly Plug S
Hallo Tommy,
auch mit der Version 6.13.15 läuft das Skript problemlos.
Gruß,
Stephan
Stimmt, lag nicht am Skript. Die Shellys brauchen Cloud Zugang um den Energy Wert auszuwerfen. Nach dem öffnen wird das wieder aktualisiert.
Hallo!
erstmal vielen Dank für das Script!
Da der 3EMpro bisher nicht funktioniert, habe ich mal auf die schnelle einen der Datenpunkte geändert (Zeile 44f).
Vorher wurde der 3EMpro zwar gefunden, aber keine Werte angelegt – jetzt ist der Gesamtverbrauch drin (hoffentlich korrekt).
// Datenpunkte der Shelly (!!! Bitte nicht ändern !!!)
var shellyDps = $(‘state[id=’ + shelly_dp + ‘.*.*.TotalActiveEnergy]’);
angelegt wurde dann:
javascript.0.ShellyVerbrauch.shellypro3em#xxx#1.EMData0
Falls Interesse besteht kann ich die Struktur des 3EMpro mal bereitstellen, damit die Datenpunkte sauber angepasst werden können.
Hallo…habe durchaus Interesse an der Struktur des 3empro und wenn es geht, mit dem dazu gehörigen und angepassten Script.
Hallo Erik,
vielen Dank für deinen Hinweis. Ich hätte Interesse an der für den Shelly 3EMpro angepassten Struktur.
Beste Grüße Nils
Hallo Erik,
hätte auch Interesse an einem angepassten Script für den 3EMpro…beste Grüße
Hallo Erik, kannst du die angepasste Version für den 3EMPro bitte als Beitrag hier zur Verfügung stellen.
Danke und Grüsse
Marco
Hallo
Wie änder ich das Script um einen Shelly pro3EM darin einzubinden?
Die Datenpunkte aus deinem Script gibt es ja bei dem Modell nicht. Nur diese.
shelly.0.shellypro3em#34987a465700#1.EMData0
shelly.0.shellypro3em#34987a465700#1.EMData0.TotalActiveEnergy
shelly.0.shellypro3em#34987a465700#1.EMData0.TotalActiveEnergyA
shelly.0.shellypro3em#34987a465700#1.EMData0.TotalActiveEnergyB
shelly.0.shellypro3em#34987a465700#1.EMData0.TotalActiveEnergyC
shelly.0.shellypro3em#34987a465700#1.EMData0.TotalActiveReturnEnergy
shelly.0.shellypro3em#34987a465700#1.EMData0.TotalActiveReturnEnergyA
shelly.0.shellypro3em#34987a465700#1.EMData0.TotalActiveReturnEnergyB
shelly.0.shellypro3em#34987a465700#1.EMData0.TotalActiveReturnEnergyC
Sowie einige Datenfelder wiediese hier:
shelly.0.shellypro3em#34987a465700#1.EM0
shelly.0.shellypro3em#34987a465700#1.EM0.ActivePowerA
shelly.0.shellypro3em#34987a465700#1.EM0.ActivePowerB
shelly.0.shellypro3em#34987a465700#1.EM0.ActivePowerC
shelly.0.shellypro3em#34987a465700#1.EM0.CurrentA
shelly.0.shellypro3em#34987a465700#1.EM0.CurrentB
shelly.0.shellypro3em#34987a465700#1.EM0.CurrentC
shelly.0.shellypro3em#34987a465700#1.EM0.VoltageA
shelly.0.shellypro3em#34987a465700#1.EM0.VoltageB
shelly.0.shellypro3em#34987a465700#1.EM0.VoltageC
Hallo Werner,
ich selbst habe keinen 3EM pro. Somit kann ich diesen leider nicht einbauen.
Gruß,
Stephan
Hi Stephan,
reicht Dir ein kompletter Objektbaum eines Pro3EM?
Freundliche Grüße
Harald
Moin Stephan,
Wollte mal nachfragen ob das Script jetzt auch mit dem pro3 em funktioniert.
Vor längerer Zeit wo wir mal Kontakt hatten ging es noch nicht.
Frage weil: hier ein Post von RALF THOMAS 29. DEZEMBER 2023ANTWORTEN drin steht der nach dem pro 3em gefragt hat und du geschrieben hast das er es einfach installieren kann.
Wäre natürlich klasse wenn das jetzt gehen würde, weil dann würde ich den iobroker mal wieder anmachen
Grüße Christian
Hallo Christian,
ich habe den 3EM pro selbst nicht. Daher habe ich ihn im Skript auch nicht eingebaut.
Gruß,
Stephan
Hallo Stephan,
ich habe eine Frage zu deinem Skript.
An dieser Stelle:
// 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), {
extendObject(“0_userdata.0.” + shelly_DP_Name_Main(id), {
common: {
wird scheinbar der Datenpunkt definiert, der dann unter javasript.0. erscheint.
Ich wollte diesen Punkt gerne wo anders hinhaben.
Im iobroker sollten Benutzerdefinierte Datenpunkte unter 0_userdata.0 eingehängt werden.
Das habe ich versucht, wie du oben sehen kannst.
Leider ohne erfolg. Selbst wenn ich die Zeile extendObject auskommentiere wird er unter javascript.0 wieder erzeugt und gefüllt.
Was mache ich falsch?
Wie bekomme ich die oberste Ebene des DP definiert?
LG Ralf Thomas
Hallo Thomas,
meine Skripte erstellen die Datenpunkte unterhalb javascript, da es Javascripte sind.
Wenn du andere Strukturen haben möchtest, musst du das Skript für dich anpassen.
Es gibt auch im Forum jemanden, der dies unterhalb ‘userdata’ wollte.
Einfach mal googlen.
Gruß,
Stephan
Hallo Stephan,
ich bin auf der Suche nach einer Möglichkeit die Werte eines ShellyPro3EM mit iobroker zu sichern auf dein Skript gestoßen. Leider bin ich der DAU schlecht hin, was das Skripting angeht. Wie kann ich dein Skript in den iobroker einbinden?
Einfach im iobroker ganz unten unter Skripte ein neues anlegen und dein Skript via c+p einfügen und speichern?
Wie kann ich es dann konfigurieren?
Magst du einem DAU einen Installationshilfe geben?
Danke.
Hallo Ralf,
das Skript wird in den oberen Zeilen konfiguriert – bis zur Zeile ‘nicht mehr ändern’.
Gruß,
Stephan
Hallo,
erst einmal vielen Lieben Dank für den Code! Es ist genau das wonach ich gesucht habe und hat mir wirklich sehr geholfen!
Habe eine kleine Änderung vorgenommen nachdem es bei mir zu einem Fehler bei nur einem Shelly gekommen ist.
Es handelte sich um einen Shelly an dem ein iPad angeschlossen ist und es machmal zu einem geringen Verbrauch kommt.
Jedes Mal wenn innerhalb der 15min. weniger als 1Wh verbraucht wurde, ist der Zählerstand gleich geblieben (also wenn der Verbrauch unter 4W ist).
Habe in Code-Zeile 289 entdeckt, dass Verbräuche unter 1 Wh als “0” interpretiert werden.
Dies habe ich geändert auf kleiner als 0,1Wh.
Gerade bei Verbraucher mit geringen Verbrauch bzw. geringen Standby Verbrauchen würde es zu einem Fehler kommen.
Vielleicht hilft das ja jemand anderen auch. Hier die geänderte Code-Zeile 289:
if (alter_verbrauch < 0.1 || alter_verbrauch == null) {
Liebe Grüße
Mathias
Freut mich, ja, das kann man so einstellen.
Hi,
ich habe für die GEN2 Shelly Plugs eine eigene Instanz, in dem Fall Instanz Nr. 1, die sehe ich natürlich nicht im Verbrauch. Kann/soll ich hier das Script einfach nochmals rein nehmen und im Script alle “shelly.0” Einträge durch “shelly.1” ersetzen oder gibts eine andere Variante!?
danke und lg
Markus Huber
Hallo Markus,
ja, so kannst du das machen!
Hallo, ich habe den Shelly 3EM und das Skript funktioniert perfekt, nur mein Shelly hat eine Eigenheit, die meine Verbrauchswerte verfälscht.
Mein Shelly liefert mir gelegentlich für einen Zyklus -3Wh in Cosumed Power.
Dieser Wert wird dann in die Variable im Skript für alter_Wert geschrieben und dementsprechend
wird der Tageswert falsch angezeigt. Ich weiß nicht warum der Shelly dies sendet, habe auch schon unterschiedliche Firmwares
durchgetestet. Kann man diesen Wert irgendwie abfangen?
Vielen Dank
Hallo Stefan,
dann scheint der Wert falsch vom Shelly zu kommen. Das Skript funktioniert einwandfrei.
Gruß,
Stephan
Hallo Stefan,
ich hatte nach Austausch meiner Access Points gegen Unifi System das selbige Problem und habe nun Tagelang gesucht warum sporadisch der -3Wh übertragen wurde, obwohl es vorher ohne Probleme Monate lang funktioniert hat.
Letztendlich haben beide Shelly 3EM sporadisch die Verbindung kurz verloren oder wieder aufgenommen & weshalb auch immer den -3Wh Stunden Return Übertragen, was dazu geführt hat, dass ich an einem Tag manchmal 5,8 Megawatt verbraucht haben soll, seltsamerweise wird der aktuelle Wert in diesem Moment nochmals aufsummiert.
Im Endeffekt habe ich die Tür der Unterverteilung mal offen stehen lassen und den Access Point etwas näher gebracht, dann ist es nicht mehr passiert.
Viele Grüße
Christopher
Moin,
ich habe genau das gleiche Problem, mindestens einmal im Monat setzt sich der alter_Wert, sowie aktueller_Wert auf -3Wh. Router steht jetzt 2m vom Shelly 3EM entfernt und Backup Wlan ist auch aktiviert. Problem bleibt bestehen. Den online Status logge ich ebenfalls, Shelly geht nicht offline, es wird eine Übermittlung ausgelassen und die nächste Übermittlung ist ein -3Wh Wert.
Behelfe mich mit einer Push-Benachrichtigung, wenn Wert mehr als X.
Lösche dann die falschen Werte in der InfluxDB.
Das es nicht am Skript sondern am Shelly liegt ist mir bewusst, würde mir wünschen, dass das Skript kleiner werdende Werte ignoriert.
LG
Hallo Stephan,
gab es schon Nachfragen und/oder Hinweise dieses Script in andere Hausautomatisierungssysteme einzubinden?
Ich selbst habe keinen ioBroker am laufen. Ich nutze seit über 10 Jahren FHEM und habe z.Z 11 Shelly’s.
Leider verlieren diese bei einem Reset oder Stromausfall ihre aktuellen Werte, so dass ich schon lange nach einer entsprechenden Lösung zum Speichern der Verbrauchshistorie suche.
Hallo,
ich schreibe nur Skripte für ioBroker.
Gruß,
Stephan
Hi,
seitdem ich einen zweiten Shlly 3EM in der Instanz habe, habe ich nur ein Bruchteil einer Sekunde die korrekten Werte für “gestern” (alles Phasen und total)
Was kann ich ändern, dami der Wert bis zum Überschreiben erhalten bleibt?
Bsp:
timestamp;value;acknowledged;from;
30.11.2023 00:00:03.333;2021.2;true;javascript.0
30.11.2023 00:00:04.336;0;true;javascript.0
Grüße
Thomas Klein
Hallo Thomas,
ich verstehe die Frage und das Log dazu nicht.
Gruß,
Stephan