Danke für den Impuls und das Script, wusste nicht, dass sowas so einfach möglich ist.
Habe auch gleich mal etwas herumgespielt und jetzt für meinen Gefrierschrank die optische Info, ob er komplett aus ist oder sich im Stand-by-, Betriebs- oder Überlast-Zustand befindet.
Code
// JavaScript zur leistungsabhängigen LED-Beleuchtung einer Shelly PlugS
//
// Version 1.2
//
// Autor: [Markus] - Co-Autor: ChatGPT
const standbyAnimation = [
[0, 100, 0, 10, 10] // Grün - 10% Helligkeit - 10 Zeiteinheiten (Standby)
];
const activeAnimation = [
[0, 100, 100, 10, 10] // Cyan - 10% Helligkeit - 10 Zeiteinheiten (Leistung 90 W bis 100 W)
];
const errorAnimation = [
[100, 0, 0, 100, 10], // Rot - 100% Helligkeit - 10 Zeiteinheiten (Error: Leistung 0 W oder > 110 W)
[100, 0, 0, 50, 10] // Rot - 50% Helligkeit - 10 Zeiteinheiten
];
const timerinterval = 100; // Intervall der Schleifendurchläufe
let currentStatus = "";
let animation = [];
let currentElementIndex = 0;
let currentElementIteration = 0;
function setAnimation(status) {
if (status === "STANDBY") {
animation = standbyAnimation;
} else if (status === "ACTIVE") {
animation = activeAnimation;
} else if (status === "ERROR") {
animation = errorAnimation;
}
currentElementIndex = 0;
currentElementIteration = 0;
}
function setLedColor(color) {
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 checkStatus(callback) {
Shelly.call("Switch.GetStatus", { id: 0 }, function(result) {
let power = result && result.hasOwnProperty('apower') ? result.apower : 0;
let newStatus;
if (power === 0) {
newStatus = "ERROR"; // Error bei Leistung 0 W
} else if (power > 1 && power <= 10) {
newStatus = "STANDBY"; // Standby bei Leistung zwischen 2 W und 10 W
} else if (power > 110) {
newStatus = "ERROR"; // Error bei Leistung über 110 W
} else if (power >= 90 && power <= 100) {
newStatus = "ACTIVE"; // Active bei Leistung zwischen 90 W und 100 W
}
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);
}
});
}
updateAnimation();
Alles anzeigen