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

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

  1. Peter Antworten

    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?

  2. Tommy Antworten

    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

      • Tommy Stelzer Antworten

        Stimmt, lag nicht am Skript. Die Shellys brauchen Cloud Zugang um den Energy Wert auszuwerfen. Nach dem öffnen wird das wieder aktualisiert.

  3. Erik Antworten

    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.

    • Karsten Antworten

      Hallo…habe durchaus Interesse an der Struktur des 3empro und wenn es geht, mit dem dazu gehörigen und angepassten Script.

  4. Werner Antworten

    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

    • Stephan Autor des BeitragsAntworten

      Hallo Werner,
      ich selbst habe keinen 3EM pro. Somit kann ich diesen leider nicht einbauen.

      Gruß,
      Stephan

  5. Christian Antworten

    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

    • Stephan Autor des BeitragsAntworten

      Hallo Christian,
      ich habe den 3EM pro selbst nicht. Daher habe ich ihn im Skript auch nicht eingebaut.

      Gruß,
      Stephan

  6. Ralf Thomas Antworten

    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

    • Stephan Autor des BeitragsAntworten

      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

  7. Ralf Thomas Antworten

    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.

    • Stephan Autor des BeitragsAntworten

      Hallo Ralf,
      das Skript wird in den oberen Zeilen konfiguriert – bis zur Zeile ‘nicht mehr ändern’.

      Gruß,
      Stephan

  8. Mathias Antworten

    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

  9. Markus Antworten

    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

  10. Stefan Antworten

    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

    • Stephan Autor des BeitragsAntworten

      Hallo Stefan,
      dann scheint der Wert falsch vom Shelly zu kommen. Das Skript funktioniert einwandfrei.

      Gruß,
      Stephan

    • Christopher Antworten

      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

    • Tim Antworten

      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

  11. de eb Antworten

    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.

  12. Thomas K Antworten

    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

Schreibe einen Kommentar

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