Skip to main

everHome Community

Willkommen in der everHome Community!

Die Community besteht aus verschiedenen Bereichen in denen sich everHome-Benutzer untereinander austauschen können. Hier findest du sicher den ein oder anderen nützlichen Hinweis. Auch das everHome-Team schaut hier gerne vorbei, klärt Fragen und nimmt eure Anregungen auf.

Shelly Plus Plug S - Steuerung LED-Licht

MR

Mitglied
Beiträge: 9
Registriert: 23.07.2024 um 15:58

MR (38102)

am 17.08.2024 um 23:35

Hallo alle,

anbei findet ihr die Version 3 meines Scripts zur

"Leistungsabhängigen LED-Anzeige der Shelly Plus Plug S"

Dieses Script ist eine Granate! Einfach nur cool!

Was tut es:

Standardmäßig kennt die Steckdose nur zwei Zustände: ON und OFF. Und man kann kann für jeden Zustand eine Lichtfarbe setzen ... öde ...

Mein Script kann viel mehr:

Es unterscheidet zwischen drei Zuständen: ON, OFF und POWER. Der Zustand POWER ist ON + Stromverbrauch > Schwellwertvorgabe. Wozu braucht man das?

Ich habe eine Tauchpumpe zur Entwässerung der Hausdrainage an der Shelly angeschlossen und so programmiert, dass ich eine Nachricht erhalte wenn die Pumpe angeht. Das ist nötig, weil ich die Pumpe weder sehe noch höre. Springt sie nicht an droht Ungemach und mein Keller steht unter Wasser – so wie an Weihnachten, als meine alte Pumpe den Geist aufgab. Jetzt leuchtet zusätzlich zu einer Warnnachricht über Everhome der LED-Ring in einer Warnfarbe wenn die Pumpe läuft.

Was man noch mit diesem Script machen könnte:

An eine Plug wird z.B. das Ladegerät eines E-Bike-Akkus angeschlossen. Der Plug ist normalerweise OFF (egal, von mir aus blau leuchtend). Bei Stromüberschuss der PV-Anlage schaltet die Dose über Everhome ON (grün). Ist das Ladegerät angeschlossen und lädt (>130 Watt bei mir) pulsiert das grüne Licht und ihr wisst: die Sonne lädt meinen Fahrradakku - Juhuuu!

Das Script hat drei (selbsterklärende) Arrays namens: 

- offanimation,
- onanimation und 
- poweranimation. 

Ihr könnt ein einzelnes Lichtelement reinlegen – dann leuchtet die LED in der Farbe – oder eine richtige Animation programmieren, die aus vielen Lichtelementen besteht. Diese Animation wird so lange gezeigt bis sich der Zustand der Dose ändert. Dann wird auf die dem Zustand entsprechende Animation gewechselt.

Dazu könnt ihr einen grundlegenden Timer-Takt setzen. Größere Zahl bedeutet langsamer! Unter 100 (ms) wird es kritisch, dann werden die Animationen unrhythmisch, denn der Microcontroller zum Schalten der LED's kommt nicht mehr hinterher. Da müsst ihr halt probieren.

Wenn ihr bisher nur Bahnhof verstanden habt, dann legt auf der Benutzeroberfläche der Shell Plus Plug S (IP-Adresse aufrufen) unter "Scripte" ein neues Script an und kopiert den Text da rein. Speichern und aktivieren - dann seht ihr schon was passiert ... :-)

// Javascript zur Darstellung von Lichtanimationen auf der
// Shelly Plus Plug S entsprechend der Schaltzustände
//
// Version 3
//
// Hinweise:
// Die Lichtelemente bestehen aus den Teilen
// [r, g, b, Helligkeit, Leuchtdauer]
// dabei gehen die Farben und die Helligkeit von 0-100.
// Wenn ihr r/g/b Werte in 0-255 habt müsst ihr halt jeden
// Wert durch 2,55 teilen um den Wert zu erhalten den ihr
// hier eintragen müsst. Ich kann da auch nix für ...
// das API der Steckdose möchte das so haben!
// Die Leuchtdauer gibt an, wieviele Zeiteinheiten das
// Element leuchtet - dabei heißt 0=1x leuchten,
// 1=1x wiederholen, 99=100x leuchten!
// Die Zeiteinheit setzt ihr in der Variablen "timeinveral"
// in Millisekunden.
//
// Autor: MR / Co-Autor: ChatGPT - 11.09.2024

// --- Beginn der Definitionen

const offanimation = [
    [0, 0, 100, 10, 0],  // Blau - 10% Helligkeit - 1 Zeiteinheit
    [0, 0, 100, 100, 0]  // Blau - 100% Helligkeit - 1 Zeiteinheit
];
// Also ein blaues blinken

const onanimation = [
    [0, 100, 0, 100, 0]  // Grün - 100% Helligkeit - Dauerlicht
];
// Grünes Dauerlicht 100%

const poweranimation = [
    [100, 0, 0, 10, 19],  // Rot - 10% Helligkeit - 20 Zeiteinheiten
    [100, 0, 0, 50, 4],   // Rot - 50% Helligkeit - 5 Zeiteinheiten
    [100, 0, 0, 100, 9]   // Rot - 100% Helligkeit - 10 Zeiteinheiten
];
// Anschwellendes rot 

const threshold = 5;  // Schwellenwert für den POWER-Zustand in Watt

const timerinterval = 100;  // Zeitintervall für ein Lichtelement in ms
// --- Ende der Definitionen - von hier an Finger weg!

let currentStatus = "";
let animation = []; 
let currentElementIndex = 0;
let currentElementIteration = 0;
let apiCallInProgress = false;

function setAnimation(status) {
    if (status === "OFF") {
        animation = offanimation;
    } else if (status === "ON") {
        animation = onanimation;
    } else if (status === "POWER") {
        animation = poweranimation;
    }
    currentElementIndex = 0;
    currentElementIteration = 0;
}

function setLedColor(color) {
    if (apiCallInProgress) {
        return;
    }

    apiCallInProgress = true;

    let r = color[0];
    let g = color[1];
    let b = color[2];
    let brightness = color[3];

    Shelly.call("PLUGS_UI.SetConfig", {
        id: 0,
        config: {
            leds: {
                mode: "switch",
                colors: {
                    "switch:0": {
                        on: {
                            rgb: [r, g, b],
                            brightness: brightness
                        },
                        off: {
                            rgb: [r, g, b],
                            brightness: brightness
                        }
                    }
                }
            }
        }
    }, function() {
        apiCallInProgress = false;
    });
}

function checkStatus(callback) {
    Shelly.call("Switch.GetStatus", { id: 0 }, function(result) {
        let power = result && result.hasOwnProperty('apower') ? result.apower : 0;
        let newStatus = result && result.output ? (power > threshold ? "POWER" : "ON") : "OFF";

        if (newStatus !== currentStatus) {
            currentStatus = newStatus;
            setAnimation(currentStatus);
        }

        callback();
    });
}

function updateAnimation() {
    checkStatus(function() {
        const currentElement = animation[currentElementIndex];

        if (currentElement) {
            const durationFactor = currentElement[4];

            setLedColor(currentElement);

            if (currentElementIteration < durationFactor) {
                currentElementIteration++;
            } else {
                currentElementIndex = (currentElementIndex + 1) % animation.length;
                currentElementIteration = 0;
            }

            Timer.set(timerinterval, false, updateAnimation);
        } else {
            let errorMessage = "Fehler: currentElement ist undefiniert oder fehlerhaft.";
            print(errorMessage);
        }
    });
}

updateAnimation();

// Ende des Scripts

... und ihr habt sicher noch andere tolle Ideen. Postet sie hier ebenso wie schöne Animationen die ihr entwickelt habt.

*** Im Kopf weit voraus …

MR

Mitglied
Beiträge: 9
Registriert: 23.07.2024 um 15:58

MR (38102)

am 27.08.2024 um 23:08

Lass das Einhorn über den Regenbogen reiten ...

const onanimation = [
    [50, 0, 0, 100, 1], 
    [51, 16, 16, 100, 1], 
    [55, 33, 23, 100, 1], 
    [60, 40, 46, 100, 1], 
    [60, 40, 66, 100, 1], 
    [50, 0, 50, 100, 1], 
    [40, 0, 61, 100, 1], 
    [28, 0, 88, 100, 1], 
    [2, 0, 82, 100, 1], 
    [0, 27, 86, 100, 1], 
    [0, 45, 89, 100, 1], 
    [0, 62, 91, 100, 1], 
    [4, 69, 64, 100, 1], 
    [9, 70, 30, 100, 1], 
    [0, 83, 11, 100, 1], 
    [0, 100, 0, 100, 1], 
    [50, 100, 0, 100, 1], 
    [78, 100, 0, 100, 1], 
    [100, 100, 0, 100, 1], 
    [100, 86, 0, 100, 1], 
    [100, 71, 0, 100, 1], 
    [100, 57, 0, 100, 1], 
    [100, 43, 0, 100, 1], 
    [100, 29, 0, 100, 1], 
    [100, 0, 0, 100, 1], 
    [100, 0, 50, 100, 1], 
    [100, 41, 71, 100, 1], 
    [100, 0, 100, 100, 1], 
    [66, 0, 73, 100, 1], 
    [0, 0, 0, 0, 100]
];

*** Im Kopf weit voraus …

MR

Mitglied
Beiträge: 9
Registriert: 23.07.2024 um 15:58

MR (38102)

am 12.09.2024 um 00:20

Diese Animationen nutze ich für das Laden des Fahrradakkus:

const offanimation = [
    [0, 0, 100, 10, 99],  // Blau - 10% Helligkeit - 100 Zeiteinheiten
    [0, 0, 100, 100, 0]  // Blau - 100% Helligkeit - 1 Zeiteinheit
];

const onanimation = [
    [0, 100, 0, 100, 0]  // Grün - 100% Helligkeit - Dauerlicht
];

const poweranimation = [
    [0, 100, 0, 10, 0],  // Grün - 10% Helligkeit - 1 Zeiteinheit
    [0, 100, 0, 30, 0],  // Grün - 30% Helligkeit - 1 Zeiteinheit
    [0, 100, 0, 50, 0],  // Grün - 50% Helligkeit - 1 Zeiteinheit
    [0, 100, 0, 80, 0],  // Grün - 80% Helligkeit - 1 Zeiteinheit
    [0, 100, 0, 100, 0]   // Grün - 100% Helligkeit - 1 Zeiteinheit
];

Ich mache fast nie ein reines Dauerlicht, sondern lasse es gerne alle 10 Sekunden 1x aufblitzen. Dann weiß man, dass das Script läuft.
*** Im Kopf weit voraus …