HI,
ich habe ein kleines Javaskript geschrieben, um zu erkennen, ob ein Rollo manuell (z. B. über die App oder Wandtaster) oder automatisch (z. B. durch ein Skript oder Node-RED ALexa) gefahren wurde. Für jedes Rollo wird dabei eine eigene Variable gesetzt, die für weitere Automatisierungen genutzt werden kann.
Der Code beobachtet mehrere Rollos, prüft den Absender der Änderung (from) und setzt dann die entsprechende manuell-Variable auf true oder false. Zusätzlich wird ein Timeout genutzt, damit die Variable nicht mehrfach getriggert wird, wenn der Status kurz hintereinander aktualisiert wird.
Den Pfad wo ihr dann eure jeweilige Variable erstellt habt, müsst ihr sowie wie die Geräte ID anpassen
const rollos = [
{ level: 'GERÄTE_ID_1', manuellVar: 'VARIABLE_1' },
{ level: 'GERÄTE_ID_2', manuellVar: 'VARIABLE_2' },
{ level: 'GERÄTE_ID_3', manuellVar: 'VARIABLE_3' },
{ level: 'GERÄTE_ID_4', manuellVar: 'VARIABLE_4' },
{ level: 'GERÄTE_ID_5', manuellVar: 'VARIABLE_5' },
{ level: 'GERÄTE_ID_6', manuellVar: 'VARIABLE_6' },
{ level: 'GERÄTE_ID_7', manuellVar: 'VARIABLE_7' }
];
const timeoutMap = {}; // Timeouts für jedes Rollo separat
rollos.forEach(rollo => {
on({ id: rollo.level, change: 'ne' }, dp => {
const from = dp.state.from;
if (!timeoutMap[rollo.level]) {
let manuell = true;
// Prüfen ob Änderung aus JavaScript oder Node-RED kam
if (from === 'system.adapter.javascript.0' || from === 'system.adapter.node-red.0') {
manuell = false;
}
// Variable setzen
setState(rollo.manuellVar, manuell, true);
// Timeout starten (20 Sekunden)
timeoutMap[rollo.level] = setTimeout(() => {
timeoutMap[rollo.level] = null;
}, 20000);
}
});
});