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. Helmut Kurcz Antworten

    Hallo Stephan!
    Ich bin seit kurzem auch Besitzer eines Shelly plus 1PM, mit dem ich mein PV-Kleinkraftwerk “monitore”.
    Leider habe ich nun auch festgestellt, dass die Daten aus der Shelly cloud nicht ohne weiteres “exportiert” werden können, worauf ich bei der Suche auf dich gestossen bin.

    Nun meine Frage zu deinem Script, Shelly Adapter etc.:
    In welchem Programm unter Windows läuft dein Script?
    Was ist dieser “Shelly Adapter” und wo installiert man diesen?
    In welcher Form liegen die historischen Daten dann vor?

    Ich muss gestehen, dass ich hier irgendwie wissenstechnisch anscheinend rel. weit am Anfang stehe…. na ja, ich komm halt eher von der HW Seite 🙂

    Danke schon vorab für deine RM dazu!

    LG Helmut

    • Stephan Autor des BeitragsAntworten

      Hallo Helmut,
      alle meine Skripte laufen unter ioBroker auf einem Windows oder Linux System.

      Gruß,
      Stephan

  2. Nico Antworten

    Hallo Stephan,
    auch von mir ein herzliches Dankeschön für das veröffentlichen des Skriptes. Ich versuche mich seit ein paar Tagen an der Einrichtung, Überwachung und Abrechnng von 2 Ladepunkten in einem Mehrfamilienhaus unter Berücksichtigung der maximalen Gesamtstromstärke des Hausanschlußes, der dynamischen Lastverteilung zwischen Ladestation und Hausverbrauch und dem sich stündlich änderndem Strompreis bei Tibber, aWattar und Co. Dein Skript hilft mir sehr dabei den Überblick zu bewahren und die Daten für die Grafana Oberfläche aufzubereiten. Ich bin dabei über ein paar Ideen gestolpert die bei PV-Einspeisern mit Deinem Skript evtl. zu falschen Werten führen könnten. Wenn Du Interessen an einem Ideen Austuasch hast, einfach melden.
    Viele Grüße
    Nico

    • Stephan Autor des BeitragsAntworten

      Hallo Nico,
      ich denke, das dein beschriebener Fall eher ein Einzelfall ist.
      Gerne kannst Du mir aber deine Ideen mitteilen.

      Gruß,
      Stephan

  3. MamoEF Antworten

    Hallo, wollte mich auch mal für das Script bedanken.
    Bin durch einen Hinweis eines Users aus dem ioBroker Forum zu dem Script gekommen.
    Läuft seit einem Tag und bis jetzt sieht es gut aus, falls ich Fragen habe werde ich mich Melden….

  4. Andreas Hausotter Antworten

    Guten Morgen,

    leider erscheinen unter Relay0 nicht die dokumentierten Datenpunkte, sodass die vom Skript berechneten Werte auch nicht abgelegt werden.

    Ich verwende den Shelly-Adapter v6.0.0 und JavaScript v6.1.4. Die Instanzen sind im Grünen Bereich (Lebenszeichen, Verbunden mit Host, verbunden mit Gerät). Der Shelly 3EM liefert die Basisdaten für alle drei Phasen.

    Die integration des Skripts in den ioBroker hat problemlos funktioniert. Das Skript läuft ohne Fehler durch, das Protokoll weist keine Fehler aus.

    Vermutlich habe ich nur etwas übersehen … ?

    Vielen Dank im Voraus
    Grüße

    A. Hausotter

    • Stephan Autor des BeitragsAntworten

      Hallo Markus,
      Wie – wo?
      Na, auf der Seite, wo Du diesen Kommentar abgesetzt hast 😉

      Gruß,
      Stephan

  5. Marcel Antworten

    An deinem Skript ist mir noch aufgefallen, dass wenn man Stromverbräuche von Geräten die weniger als 1Wh pro 15 Minuten verbrauchen zu loggen versucht der folgende Abschnitt mit if (alter_verbrauch < 1 || alter_verbrauch == null) dazu führt, dass die Verbräuche nicht aufaddiert werden. Vllt. muss da anstatt einer 1 z.B. eine 0.1 hin oder wie siehst du das? Das z.B. eine Lampe ggf. nur 3-4 Watt verbraucht ist ja keine Seltenheit und will ja auch geloggt werden 😉

    • Stephan Autor des BeitragsAntworten

      Hallo Marcel,
      Du kannst die Empfindlichkeit gerne modifizieren. Meine Skripte sind global gehalten und anpassbar – somit kann die Empfindlichkeit nach eigenem Ermessen angepasst werden, wenn dies jemand wünscht.

      Gruß,
      Stephan

  6. Florian Antworten

    Hallo Stephan,

    vielen Dank für das Skript.
    Läuft bei mir seit längerer Zeit problemlos.

    Ich hab neuerdings an meinem Balkonsolar einen
    Shelly EM verbaut der mir den Ertrag auch als
    negativen Wert ausgibt. Wie es scheint kann dein Skript
    das nicht verarbeiten. Alle Werte beim EM stehen auf null.
    Kann man das anpassen?

    Grüße Florian

  7. ronald Antworten

    Super Script Danke.
    Gibt es eine Möglichkeit auch die Shellys unter mqtt einzubinden?
    Kann ich das Script so anpassen das er die Shellys dort findet?
    Lieben Gruß und schöne Weihnachten

    • Stephan Autor des BeitragsAntworten

      Hallo Ronald,
      wenn die Shelly im Shelly Adapter erscheinen, kann das Skript diese Datenpunkte nutzen.
      Einfach die passende Instanz eingeben.

      Schöne Weihnachtstage!

      Gruß,
      Stephan

  8. Oliver B Antworten

    Hallo Stephan,
    ich bekomme von dem Script folgende Fehlermeldungen:
    2022-12-21 10:00:00.069 – warn: javascript.0 (32238) getState “shelly.0.SHSW-PM#B915D3#2.Relay0.Energy” not found (3) states[id]=null
    2022-12-21 10:00:00.070 – warn: javascript.0 (32238) at script.js.common.Shelly_Verbrauchs-Historie:96:24
    2022-12-21 10:00:00.070 – warn: javascript.0 (32238) at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:915:29)
    2022-12-21 10:00:00.070 – warn: javascript.0 (32238) at Object.shelly_verbrauch_update (script.js.common.Shelly_Verbrauchs-Historie:95:11)
    2022-12-21 10:00:00.070 – warn: javascript.0 (32238) at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1595:34)
    2022-12-21 10:00:00.070 – warn: javascript.0 (32238) at Job.invoke (/opt/iobroker/node_modules/iobroker.javascript/node_modules/node-schedule/lib/Job.js:171:15)
    2022-12-21 10:00:00.070 – warn: javascript.0 (32238) at /opt/iobroker/node_modules/iobroker.javascript/node_modules/node-schedule/lib/Invocation.js:268:28
    2022-12-21 10:00:00.070 – warn: javascript.0 (32238) at Timeout._onTimeout (/opt/iobroker/node_modules/iobroker.javascript/node_modules/node-schedule/lib/Invocation.js:228:7)
    2022-12-21 10:00:00.070 – warn: javascript.0 (32238) at listOnTimeout (node:internal/timers:559:17)
    2022-12-21 10:00:00.070 – warn: javascript.0 (32238) at processTimers (node:internal/timers:502:7)
    2022-12-21 10:00:00.081 – info: javascript.0 (32238) script.js.common.Shelly_Verbrauchs-Historie: Shelly Verbrauch: Verbrauchswerte aktualisiert: 4 | Reboots korrigiert: 0 | Unveränderte Werte: 32
    Das betrifft die shelly.0 Datenpunkte. Ich habe das Script auch für shelly.1 am laufen. In der shelly.1 sind 2 1PM Plus und die laufen ohne Probleme.

    Hier shelly.0.SHSW-25#68C63AF92F40#2.Relay0.Energy” not found (3) states[id]=null handelt es sich um ein Shelly2.5 eingestellt für einen Rolladen. Ich denke das dadurch das #2 nicht gefüllt wird. Kann ich die Warnungen deaktivieren? Alle 30 sec kommen ~99 Einträge ins Log

    Schöne Grüße
    Oliver

    • Stephan Autor des BeitragsAntworten

      Hallo Oliver,
      in diesem Falle sollte es helfen, das Skript einmal zu stoppen und dann wieder zu starten.
      Es wird ein Shelly “Energy” nicht gefunden – das sollte durch Start-/Stopp behoben werden.

      Gruß,
      Stephan

      • Oliver B Antworten

        Hallo Stephan,
        ein Stop/Start hat leider keine Veränderung gebracht.

        Schöne Grüße
        Oliver

  9. Leo Kroschewski Antworten

    Hallo,
    das Skript läuft bei mir jetzt ca. 5 Wochen. Bisher waren alle Werte ok.
    Hatte bisher einen Verbrauch pro Tag von 10 – 15 kWh. Um Mitternacht hat das Skript dann den Tagesverbrauch auf Verbrauch gestern, letzte Woche, letzter Monat und letztes Jahr verteilt und den aktuellen Tageswert neu angefangen.
    Jetzt steht plötzlich der Wert von Verbrauch gestern bei 500 kWh und alle folgenden Werte wie Woche, Monat und Jahr sind auch um 500 kWh höher.
    Kann ich den erhöhten Wert von Verbrauch gestern von Hand korrigieren? Wenn ja, wie?

    Gruß
    Leo

    • Stephan Autor des BeitragsAntworten

      Hallo,
      den Wert kannst Du manuell wieder abziehen. Skript stoppen, Datenpunkte editieren und Skript wieder starten.

    • Luigi Bernandes Antworten

      Hallo, ich hatt schon 2 mal ein ähnliches Problem. Bei mir wurden die beim 3EM die Werte um ca. 2400kwh erhöht. Und zwar für Vormonat und aktueller Monat.

      Das editieren funktioniert.

      Aber es muss doch dafür einen Grund geben.

      • Stephan Autor des BeitragsAntworten

        Hallo Luigi,
        Dazu kann ich leider keinen vergleichbaren Fehler finden. Das Skript holt nur die Werte vom Shelly Adapter und berechnet sie.

        Gruß,
        Stephan

  10. Tim Antworten

    Hallo Stephan,

    seit kurzen habe ich den Fall, das sporadisch der Wert (Total/heute) um 120kwh nach oben korrigiert wird. Bei den einzelnen Phasen sind allerdings keine Auffälligkeiten festzustellen. Ich habe den 3EM, im Verdacht habe ich die Zwangstrennung des Internets, da dies bisher zwischen 1-2Uhr passiert ist. Wie kann ich das verhindern?

    Lg Tim

    • Stephan Autor des BeitragsAntworten

      Hallo Tim,
      das Skript korrigiert keine Werte – es korrigiert nur Reboots, da diese vom Shelly nicht gespeichert werden.

  11. Jürgen Schmölzer Antworten

    Hallo Stephan,

    ich habe zwei Shelly Instanzen laufen (0+1).
    In der 1 sind alle “messenden” Shellys zusammengefasst, dementsprechend habe ich im Script natürlich auch die 1 eingetragen.
    Die Tages, Wochen, Monats und Jahressumme wird richtig erfasst.
    Allerdings sind die Gestern, letzte Woche usw. immer auf 0 stehen geblieben.
    Woran könnte das liegen?

    Gruß
    Jürgen

    • Stephan Autor des BeitragsAntworten

      Hallo,
      Wenn die Werte nicht kommen, scheint etwas mit der Verbindung zu dem Shelly Adapter nicht richtig zu sein.

      Bitte hier einmal schauen.

      • Christoph Eißing Antworten

        Hallo,
        geht mir genauso mit dem kleinen Unterschied, das ich in beiden Instanzen Shelly mit PM habe. .0 ist COAP und .1 MQTT.
        Also in die aktuellen Datenpunkte wird alles aufaddiert. Allerdings beim Wechsel von z.B. heute auf gestern bleibt gestern auf “0”. Das gleiche bei den Datenpunkten mit “letzte…”. Laut Log sollte es passiert sein. Wo er sich wohl verschluckt.

        2022-12-01 00:00:00.033 – info: javascript.0 (30194) script.js.common.Shelly1.Shelly1_Verbrauch: Shelly Verbrauch: Verbrauchswerte aktualisiert: 2 | Reboots korrigiert: 0 | Unveränderte Werte: 0
        2022-12-01 00:00:00.061 – info: javascript.0 (30194) script.js.common.Shelly0.Shelly0_Verbrauch: Shelly Verbrauch: Verbrauchswerte aktualisiert: 7 | Reboots korrigiert: 0 | Unveränderte Werte: 14
        2022-12-01 00:00:00.086 – info: javascript.0 (30194) script.js.common.Shelly1.Shelly1_Verbrauch: Shelly Verbrauch: Verbrauchswerte aktualisiert: 0 | Reboots korrigiert: 0 | Unveränderte Werte: 2
        2022-12-01 00:00:00.142 – info: javascript.0 (30194) script.js.common.Shelly1.Shelly1_Verbrauch: Shelly Verbrauch: Werte für gestern und heute aktualisiert!
        2022-12-01 00:00:00.194 – info: javascript.0 (30194) script.js.common.Shelly1.Shelly1_Verbrauch: Shelly Verbrauch: Werte für diesen und letzten Monat aktualisiert!
        2022-12-01 00:00:00.261 – info: javascript.0 (30194) script.js.common.Shelly0.Shelly0_Verbrauch: Shelly Verbrauch: Verbrauchswerte aktualisiert: 0 | Reboots korrigiert: 0 | Unveränderte Werte: 21
        2022-12-01 00:00:00.349 – info: javascript.0 (30194) script.js.common.Shelly0.Shelly0_Verbrauch: Shelly Verbrauch: Werte für gestern und heute aktualisiert!
        2022-12-01 00:00:00.400 – info: javascript.0 (30194) script.js.common.Shelly0.Shelly0_Verbrauch: Shelly Verbrauch: Werte für diesen und letzten Monat aktualisiert!

        • Stephan Autor des BeitragsAntworten

          Hallo Christoph,
          das kann ich leider aus der Ferne nicht sagen. Die Werte, die vorher Null sind, bleiben auch danach Null – wie man in deinem Posting sieht, sind auch 21 unveränderte Verbräuche zu sehen.

      • Jürgen Schmölzer Antworten

        Hallo,

        nachdem eine Woche rum war, gingen auch die Werte “von Gestern”.
        Hat sich also gelöst.

        Danke

  12. René Antworten

    Guten Morgen,

    ich stehe etwas auf dem Schlauch. Vielleicht kannst du mir Klarheit verschaffen.

    Im obigen Screenshot, in dem die verfügbaren Variablen als Beispiel gezeigt werden, “Verbrauch Gesamt” heißt für mich, dass es hier den gesamten Wert seit dem Start der Protokollierung/des Skripts zusammengerechnet hat. Darin ist der gesamte Verbrauch seit eben Beginn. Egal ob in diesem oder letzten Jahr, weil eben seit Start die Gesamtrechnung. Soweit verstehe ich das zumindest.

    “Aktueller Wert (Messwert neu)” verstehe ich nicht so ganz. Jegliche andere Unterteilungen auf Tag, Woche, Monat, Jahr (jeweils diese/letzte) ergeben Sinn und die Werte sind plausibel.

    Ich werde nur nicht schlau zwischen “Aktueller Wert (Messwert neu), das 2390.23 Wh stehen hat und bei “Gesamt” der Wert 2280.26 Wh steht. Der Gesamtwert müsste doch immer und überall der höchste Wert vor allen anderen haben, eben, weil ja alles ununterbrochen summiert wurde/wird. Bei “Aktueller Wert” ist die Summe jedoch höher, was sich für mich widerspricht. Ich verstehe “Aktueller Wert” so, dass wenn der Shelly (aus welchen Gründen auch immer) wieder einmal bei Null aufzeichnet in seiner “Energy”, dass dieser Wert von deinem Script genommen wird. Somit könnte und dürfte es ja niemals dort einen generell höheren Wert ausspucken, wenn der Shelly immer wieder Mal mit Null anfängt.

    Habe ich hier eine Denkfehler?

    Grüße
    René

    • Stephan Autor des BeitragsAntworten

      Hallo Rene,
      anscheinend stehst Du wirklich auf dem Schlauch 😉

      Der Wert innerhalb der Shelly Ebene shelly.0.* ist generell höher, wenn das Skript alle x Minuten läuft – ist ja logisch.

      Sobald das Skript erneut Werte abholt, wird aktueller_Wert in alter_Wert verschoben und der neue Wert vom Shelly abgeholt und in aktueller_Wert gespeichert.
      Die Differenz ist der neue Verbrauch, der dann zu den Verbräuchen addiert wird.
      Sobald die das Skript erneut Daten abholt, wird die vorher beschriebene Aktion wiederholt.

      Gruß,
      Stephan

      • René Antworten

        Hallo Stephan,

        Danke noch für die damalige Antwort hier. Ja, da stand ich echt auf dem Schlauch. Mittlerweile funktionierte auch alles reibungslos. (Einige Tage nach dem Kommentar gestartet.) Nun habe ich jedoch nur bei einem einzigen Shelly aktuell ein Problem. Vor einigen Tage habe ich den Shelly-Adapter geupdatet, auf die neuste Version 6.3.1. Seither spuckt das Log ununterbrochen für nur einen einzigen Shelly eine Javascript-Fehlermeldung aus. Betroffen ist einzig nur der Shelly Plus 2 PM. Das ist auch generell der einzigste, dessen Modell ich nutze.

        Liegt das am Script-(Code) oder am Shelly-Adapter selbst, dass dort irgendwas durch den Entwickler verändert wurde, wo das Script von dir nicht mehr mitspielen will?

        Grüße
        René

        Hier ein Auszug: (Bis auf “Unveränderte Werte”, ändert sich ansonsten in der immer wiederkehrenden Fehlermeldung nichts.)
        ———
        javascript.0 2023-02-02 23:15:00.004 info script.js.Shelly_Messwerte_Gesamtverbrauch: Shelly Verbrauch: Verbrauchswerte aktualisiert: 2 | Reboots korrigiert: 0 | Unveränderte Werte: 19

        javascript.0 2023-02-02 23:15:00.002 warn at processTimers (internal/timers.js:500:7)

        javascript.0 2023-02-02 23:15:00.002 warn at listOnTimeout (internal/timers.js:557:17)

        javascript.0 2023-02-02 23:15:00.002 warn at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/Invocation.js:228:7)

        javascript.0 2023-02-02 23:15:00.002 warn at /opt/iobroker/node_modules/node-schedule/lib/Invocation.js:268:28

        javascript.0 2023-02-02 23:15:00.002 warn at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/Job.js:171:15)

        javascript.0 2023-02-02 23:15:00.002 warn at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1595:34)

        javascript.0 2023-02-02 23:15:00.002 warn at Object.shelly_verbrauch_update (script.js.Shelly_Messwerte_Gesamtverbrauch:95:15)

        javascript.0 2023-02-02 23:15:00.002 warn at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:915:29)

        javascript.0 2023-02-02 23:15:00.002 warn at script.js.Shelly_Messwerte_Gesamtverbrauch:96:32

        javascript.0 2023-02-02 23:15:00.002 warn getState “shelly.0.shellyplus2pm#441793ad4580#1.Cover0.Energy” not found (3)

        javascript.0 2023-02-02 23:00:00.005 info script.js.Shelly_Messwerte_Gesamtverbrauch: Shelly Verbrauch: Verbrauchswerte aktualisiert: 0 | Reboots korrigiert: 0 | Unveränderte Werte: 21

        javascript.0 2023-02-02 23:00:00.003 warn at processTimers (internal/timers.js:500:7)

        javascript.0 2023-02-02 23:00:00.003 warn at listOnTimeout (internal/timers.js:557:17)

        javascript.0 2023-02-02 23:00:00.003 warn at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/Invocation.js:228:7)

        javascript.0 2023-02-02 23:00:00.003 warn at /opt/iobroker/node_modules/node-schedule/lib/Invocation.js:268:28

        javascript.0 2023-02-02 23:00:00.003 warn at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/Job.js:171:15)

        javascript.0 2023-02-02 23:00:00.003 warn at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1595:34)

        javascript.0 2023-02-02 23:00:00.003 warn at Object.shelly_verbrauch_update (script.js.Shelly_Messwerte_Gesamtverbrauch:95:15)

        javascript.0 2023-02-02 23:00:00.003 warn at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:915:29)

        javascript.0 2023-02-02 23:00:00.003 warn at script.js.Shelly_Messwerte_Gesamtverbrauch:96:32

        javascript.0 2023-02-02 23:00:00.002 warn getState “shelly.0.shellyplus2pm#441793ad4580#1.Cover0.Energy” not found (3)

        javascript.0 2023-02-02 22:45:00.004 info script.js.Shelly_Messwerte_Gesamtverbrauch: Shelly Verbrauch: Verbrauchswerte aktualisiert: 0 | Reboots korrigiert: 0 | Unveränderte Werte: 21

  13. Heinz Bachert Antworten

    Hallo Stefan, erst mal Danke für das Script !!!!

    Bin noch ziemlich am Anfang ……..ich abe das Script eingebunden und es läuft auch, jedoch finde ich keine Datenpunkte ???
    Sorry bin schon noch Newbie

    Eventuell kannst Du mir ja helfen…

    Danke Heinz

    • Stephan Autor des BeitragsAntworten

      Hallo Heinz,
      die Datenpunkte befinden sich unter: javascript.0.ShellyVerbrauch in den Objekten von ioBroker.

      Gruß,
      Stephan

      • Heinz Antworten

        Hallo Stephan,
        vielen Dank hab#s jetzt auch gefunden(Tomaten auf den Augen ….)

        Jetzt hätte ich noch eine Frage: wo werden denn Deine berechneten Werte gespeichert ?? hab den “Messwert aktuell” in der Influxdb gespeichert um ein Balkendiagramm zu erstellen……..klappt alles einwandfrei, jedoch wenn der Shelly neu bootet ist der Wert natürlich auf 0….klar……wenn ich nun den Wert “Gesamter Vebrauch des Shelly” nehmen würde, dann würde es auch funktionieren, doch bleibt dieser Wert erhalten wenn ich zum Beispiel das Script stoppe oder wenn der Raspberry neu bootet ?????

        Vielen Dank und Grüße
        Heinz

        • Stephan Autor des BeitragsAntworten

          Hallo Heinz,
          das Skript erkennt, wenn ein Shelly neu startet und berechnet den Wert dann neu. Somit ist der Wert “heute” immer genau – wie es der Shelly erlaubt.

          Gruß,
          Stephan

  14. Bernd Antworten

    Hallo, erstmal Danke für Dein spitzen Script!
    Ich bekomme es einfach nicht hin, in Dein Script noch eine stündliche Auswertung einzubauen…
    Könnte mir hier jemand bitte helfen, bzw. die passenden Codeschnipsel bereitstellen?
    Danke!
    Bernd

  15. Thomas Antworten

    Hallo Stephan,

    das mit der Änderung scheint nur auf den ersten Blick geklappt zu haben, denn die aufsummierten Verbrauchs- bzw. Erzeugerwerte sind zu hoch.

    Weißt Du, mit welchen shelly-Geräten das Skript zusammenspielt, weil sie Verbrauchswerte liefern? Der 1PM scheinbar nicht, weil da ja die Variable Energie 0 ist und bleibt….

    Im Skript schreibst Du ja:

    // Einige Shelly haben keine Verbrauchswerte (noch nicht)

    Die Frage ist jetzt, welche denn Verbrauchswerte liefern …. Weißt Du evtl., ob das beim Pro 1PM der Fall ist?

    Gruß
    Thomas

    • Thomas Antworten

      Hallo Stephan,

      das mit der Änderung scheint nur auf den ersten Blick geklappt zu haben, denn die aufsummierten Verbrauchs- bzw. Erzeugerwerte sind zu hoch.

      Weißt Du, mit welchen shelly-Geräten das Skript zusammenspielt, weil sie Verbrauchswerte liefern? Der 1PM scheinbar nicht, weil da ja die Variable Energie 0 ist und bleibt….

      Im Skript schreibst Du ja:

      // Einige Shelly haben keine Verbrauchswerte (noch nicht)

      Die Frage ist jetzt, welche denn Verbrauchswerte liefern …. Weißt Du evtl., ob das beim Pro 1PM der Fall ist?

      Gruß
      Thomas

    • Stephan Autor des BeitragsAntworten

      Hallo Thomas,
      alle Shelly mit einem PM (PowerMeter) im Namen haben die Leistungsmessung. Des Weiteren die Plugs und einige mehr.

      • Thomas Antworten

        Hallo Stephan,

        das hätte ich auch gedacht, aber in einer Leihstellung einer Balkonanlage wurde ein shelly 1PM eingebaut, und der liefert definitiv nur die aktuelle Erzeugung, was mich fast zur Verzweifelung gebracht hat.

        In der festen Installation der Balkonanlage wird ein shelly Pro 1PM eingebaut, mit dem klappt das auch mit Deinem Skript (habe ich schon getestet), weil der auch unter Energie Werte liefert.

        Damit hat sich mein Problem geklärt.

        Auch von mir vielen Dank für das Skript, das ist sehr hilfreich.

        Gruß
        Thomas

  16. Thomas Antworten

    Hallo Stephan,

    in den Zeilen 44+ 45 finde ich diese Befehle:

    // Datenpunkte der Shelly (!!! Bitte nicht ändern !!!)
    var shellyDps = $(‘state[id=’ + shelly_dp + ‘.*.*.Energy]’);

    Die Variable

    shelly.0.SHSW-PM#C45BBE77FBD8#1.Relay0.Energy

    ist aber immer 0, das würde Deine Antwort bestätigen, warum keine Werte übernommen werden.

    Die aktuelle Erzeugung steht bei mir aber in der Variable Power

    shelly.0.SHSW-PM#C45BBE77FBD8#1.Relay0.Power

    Daraufhin habe ich das Script in Zeile 45 geändert (auch wenn man das nicht machen sollte 🙂 ), nun werden auch Änderungen erkannt und die Variablen unter javascript.0.ShellyVerbrauch gefüllt 🙂

    Verbaut wurde ein shelly 1PM und mich wundert, das bei keinem anderen bisher dieses Problem aufgetaucht ist, das Teil ist doch bei vielen im Einsatz.

    Was mich noch irritiert sind solche Meldungen (die Ausgabe der Variableninhalte wurde im Script eingefügt)::

    12:33:00.015 info javascript.0 (734) script.js.Shelly_Verbrauchs-Historie_für_Tag_Woche: shelly_verbrauch: 80.56
    12:33:00.016 info javascript.0 (734) script.js.Shelly_Verbrauchs-Historie_für_Tag_Woche: aktueller_wert: 77.5
    12:33:00.018 info javascript.0 (734) script.js.Shelly_Verbrauchs-Historie_für_Tag_Woche: Shelly Verbrauch: Verbrauchswerte aktualisiert: 1 | Reboots korrigiert: 0 | Unveränderte Werte: 0

    12:34:00.015 info javascript.0 (734) script.js.Shelly_Verbrauchs-Historie_für_Tag_Woche: shelly_verbrauch: 78.55
    12:34:00.015 info javascript.0 (734) script.js.Shelly_Verbrauchs-Historie_für_Tag_Woche: aktueller_wert: 80.56
    12:34:00.026 info javascript.0 (734) script.js.Shelly_Verbrauchs-Historie_für_Tag_Woche: Shelly Verbrauch: Verbrauchswerte aktualisiert: 0 | Reboots korrigiert: 1 | Unveränderte Werte: 0

    Es hat kein Reboot stattgefunden und der Wert der aktuellen Erzeugung ist sauber mit Werten gefüllt und die Summen werden auch korrekt berechnet…
    Hast Du dazu noch eine Idee?

    Ansonsten freue ich mich jetzt einfach über ein tolles Script, was meine Anforderungen zur Datensammlung erfüllt, vielen Dank für das Script. Leider sind die Mikrowechselrichter von Balkon-PV-Anlagen nicht sehr kommunikativ …..

    Vielleicht hilft meine Analyse auch anderen.

    Viele Grüße
    Thomas

  17. Thomas Antworten

    Hallo Stephan,

    Dein Script hat mein Interesse geweckt, um die Erzeugung einer Balkon-PV-Anlage zu monitoren.

    Nachdem der shelly-Adapter eingerichtet ist erhalte ich auch Daten vom shelly unter shelly.0.SHSW-PM#C45BBE77FBD8#1.Relay0.Power.

    Das Script wurde angelegt und gestartet, die Datenpunkte wurden angelegt und das Script läuft ohne Fehler, aber die Datenpunkte wie z. B. javascript.0.ShellyVerbrauch.SHSW-PM#C45BBE77FBD8#1.Relay0.aktueller_wert bleiben auf 0

    Der shelly wurde anscheinend erkannt, darauf deutet ja der Name der Datenpunkte hin.

    Im Protokoll findet sich die Meldung:

    script.js.Shelly_Verbrauchs-Historie_für_Tag_Woche: Shelly Verbrauch: Verbrauchswerte aktualisiert: 0 | Reboots korrigiert: 0 | Unveränderte Werte: 1

    Da alles sauber läuft und keine Fehler/Warnungen protokolliert werden habe ich keine Idee, warum die Werte nicht aktualisiert werden.

    iobroker wurde frisch installiert, daher ist die Umgebung sowie alle Adapter auf dem neuesten Stand.

    Hast Du eine Idee, was ich noch prüfen/ändern soll?

    Vielen Dank im Voraus

    Gruß
    Thomas

    • Stephan Autor des BeitragsAntworten

      Hallo Thomas,
      wenn die Werte sich noch nicht ändern, kommen auch keine neuen Werte rein. Somit kann das Skript keine anderen Werte darstellen.

      Gruß,
      Stephan

      • Franziska Antworten

        Hallo, vielen Dank für dieses Skript!
        Eine frage: Ich hätte die Datenpunkte gerne unter 0_userdata.
        Wenn ich im Skript die Zeile:
        extendObject(“javascript.0.” + shelly_DP_Name_Main(id), {
        abändere in:
        extendObject(“0_userdata.0.” + shelly_DP_Name_Main(id), {

        dann legt er mir nur die Shelly Ordner an, aber in den Ordnern keinen einzigen Unterordner / Datenpunkt.

        Woran liegt das? Kannst du da helfen?

        LG

        • Stephan Autor des BeitragsAntworten

          Hallo,
          Dazu müsste man viele Funktionen des Skriptes umbauen. Meine Skripte legen die Punkte unter JavaScript an – da gehören sie hin.

  18. Frieder Antworten

    Hallo Stephan,
    erst einmal vielen Dank für das Bereitstellen dieses tollen Scripts!
    Ich habe ein kleines Problem… und zwar hatte ich ursprünglich nur eine Shelly Instanz laufen (CoAP), nun sind noch zwei neue Shelly plus dazugekommen, wofür ich eine weitere Instanz laufen habe(MQTT).
    Dementsprechend habe ich jetzt auch zwei mal das Skript laufen, einmal mit DP “shelly.0” und einmal mit “shelly.1”.
    Allerdings werden mir, wahrscheinlich seit dem beide Instanzen protokolliert werden, keine Werte mehr für “gestern” angezeigt, diese stehen immer auf “0”.

    Hast du evtl. eine Idee woran das liegen könnte?

    Gruß
    Frieder

      • Frieder Antworten

        Hi Stephan,
        danke für den Hinweis, habe für das zweite Skript den Ordernamen geändert, sodass die Shellys aus der zweiten Instanz jetzt ihren eigenen Ordner haben.
        Ich dachte das funktioniert gesammelt in einem Ordner, da jeder Shelly ja wieder seinen eigenen Unterordner hat.
        Nun funktioniert es jedenfalls wieder, besten Dank!!!
        Gruß
        Frieder

  19. DerJan Antworten

    Hallo Stephan,

    ich möchte mich an der Stelle recht herzlich für das Script bedanken. – Das Script wurde direkt in den ioBroker eingebunden und läuft ohne Probleme.

    Danke Gruß
    Jan

Schreibe einen Kommentar

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