Shelly Verbrauchs-Historie für Tag, Woche, Monat, Jahr

Lesedauer: 9 Minuten

Hinweis: für dieses Skript steht ein Update zur Verfügung!
Es wird nun auch der Shelly 3EM unterstützt.

In der Shelly Cloud App für iOS oder Android sieht man natürlich immer auf einen Blick, wie der Verbrauch der einzelnen oder aller Shelly ist.
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:

FunktionBeschreibung
Verbrauch heuteabgefragter Verbrauch heute
Verbrauch gesternabgefragter Verbrauch gestern
Verbrauch diese Wocheabgefragter Verbrauch für die gesamte Woche
Verbrauch letzte Wocheabgefragter Verbrauch für die gesamte letzte Woche
Verbrauch dieser Monatabgefragter Verbrauch für den gesamten Monat
Verbrauch letzter Monatabgefragter Verbrauch für den gesamten letzten Monat
Verbrauch dieses Jahrabgefragter Verbrauch für das gesamte Jahr
Verbrauch letztes Jahrabgefragter Verbrauch für das gesamte letzte Jahr
Verbrauch Gesamtabgefragter Verbrauch gesamt
NameZugewiesener Name des Shelly zum einfachen Wiederfinden
Übersicht über die einzelnen Datenpunkte

Screenshot der verfügbaren Variablen

Screenshot der verfügbaren Variablen
Screenshot der verfügbaren Variablen

Installation des Shelly Adapter

Installation des Shelly Adapter
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.

Wie hat Dir der Beitrag gefallen?
Bewertung: 4.9/5 - abgegebene Bewertungen: 17

461 Gedanken zu „Shelly Verbrauchs-Historie für Tag, Woche, Monat, Jahr

  1. Alero Antworten

    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

  2. Jürgen Schmölzer Antworten

    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

    • Stephan Autor des BeitragsAntworten

      Hallo Jürgen,
      unterhalb Javascript existieren die jeweiligen Objekte der Shelly-Geräte.
      Hier muss das entsprechende Element entfernt werden.

      Gruß,
      Stephan

      • Jürgen Schmölzer Antworten

        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 …

  3. Dave Antworten

    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?

    • Stephan Autor des BeitragsAntworten

      Hallo Dave,
      der Shelly Pro 3EM wird vom Skript nicht unterstützt, da ich diesen nicht habe.

      Gruß,
      Stephan

      • Fabian Antworten

        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

  4. Rene K. Antworten

    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 ?

    • Stephan Autor des BeitragsAntworten

      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

  5. Daniel Antworten

    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

    • Stephan Autor des BeitragsAntworten

      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

  6. Peter Antworten

    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

    • Stephan Autor des BeitragsAntworten

      Hallo Peter,
      ich vermute, das dies Rundungstoleranzen sind. Da ich nicht weiss, wie Shelly selbst rundet, kann ich dies nicht übernehmen.

      Gruß,
      Stephan

  7. oliver seidel Antworten

    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…

      • Oliver Seidel Antworten

        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

          • Oliver Seidel

            Danke Stephan, es hat perfekt funktioniert, mit Umschaltung 90min nach Sonnenaufgang 🙂
            schedule({astro: “sunrise”, shift: 90}, shelly_vebrauch_tag);
            LG
            Oliver

  8. Andreas Antworten

    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

    • Stephan Autor des BeitragsAntworten

      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

      • Timo Antworten

        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.

  9. Christian Gh Antworten

    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

    • Stephan Autor des BeitragsAntworten

      Hallo Christian,
      am Einfachsten ist es, das Skript so zu lassen und in der Weiterverarbeitung die Werte umzurechnen.

      Gruß,
      Stephan

      • Christian Gh Antworten

        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.

  10. Frank L. Antworten

    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

    • Stephan Autor des BeitragsAntworten

      Hallo Frank,
      bei 2 Instanzen müssen auch 2 Unterordner benutzt werden, da sich die Skripte sonst überschreiben.

      Gruß,
      Stephan

  11. Ingo Antworten

    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

  12. Peter Masseli Antworten

    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

    • Stephan Autor des BeitragsAntworten

      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

  13. Erwin Schmidtlein Antworten

    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

  14. Rene Antworten

    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

    • Stephan Autor des BeitragsAntworten

      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

  15. Sacha Antworten

    Hallo,
    läuft das Script auch mit der Shelly3EMpro ?
    Falls ja würde ich mich nochmal melden weil bei mir läuft es nicht 🙂

    • Stephan Autor des BeitragsAntworten

      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

  16. Luigi Antworten

    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.

    • Stephan Autor des BeitragsAntworten

      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

      • Luigi Antworten

        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.

  17. Rainer Antworten

    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

    • Stephan Autor des BeitragsAntworten

      Hallo Rainer,
      dies kann ich leider nicht beurteilen.

      Da das Skript die Werte nur vom Shelly Adapter abholt.

      Gruß,
      Stephan

  18. Erwin Schmidtlein Antworten

    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

  19. Erwin Schmidtlein Antworten

    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

    • Stephan Autor des BeitragsAntworten

      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

  20. Erwin Schmidtlein Antworten

    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

    • Stephan Autor des BeitragsAntworten

      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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert