NEWS
[gelöst] mit einem Schalter mehr schalten
-
hallo ich steh gerade voll am schlauch.
ich habe 2 schalter, die getrennt voneinander geschalten werden können.
sobald aber einer/beide geschaltet sind, soll ein übergeordneter schalter auch auf eingeschaltet springen.
schalte ich allerdings den übergeordneten auf ein oder aus, sollen beide lampen geschaltet werden.
teilweise funktioniert es, aber irgendwie komm ich dann in eine loop und es schaltet wild hin und her.
irgendwelche ideen oder ansätze?
6704_overview.jpg -
Erstelle eine Szene und hänge den obeten schalter an diese Szene
Gruß
Rainer
-
Das kann nur in einem Loop enden.
Warum soll der alles Schalter ein sein wenn nur eine Lampe ein ist?
Sehe da eher denn Sinn in einem Taster, aber die eigentliche Frage ist was wann passiert.
Der Hauptscalter wird betätigt bei
Deckelicht Nachtlicht
Aus. Aus
Ein. Aus
Ein. Ein
Aus. Ein
-
Das kann nur in einem Loop enden.
Warum soll der alles Schalter ein sein wenn nur eine Lampe ein ist?
Sehe da eher denn Sinn in einem Taster, aber die eigentliche Frage ist was wann passiert.
Der Hauptscalter wird betätigt bei
Deckelicht Nachtlicht
Aus. Aus
Ein. Aus
Ein. Ein
Aus. Ein `
der schalter soll deshalb ein sein, weil ich das so wünsche, und weils ein übergeordneter schalter ist, der ein ist, wenn eine oder mehrere ein sind
-
irgendwelche ideen oder ansätze? `
Vorschlag für Skript:const idAlles = '...'; // Datenpunkt-ID für Schalter "Alles" const idDecke = '...'; const idBett = '...'; const js = 'system.adapter.javascript.' + instance; var decke = getState(idDecke).val; var bett = getState(idBett).val; function oder() { var alles = false; if(decke || bett) alles = true; setState(idAlles, alles, true); } oder(); // Skriptstart on({id: idAlles, change: 'ne', fromNe: js}, function(dp) { setState(idDecke, dp.state.val); setState(idBett, dp.state.val); }); on(idDecke, function(dp) { decke = dp.state.val; oder(); }); on(idBett, function(dp) { bett = dp.state.val; oder(); });
-
Wenn ich jetzt böse wäre dann wünsche es Dir weiter. Bin ein gutmütiger Mensch, aber der Ton verärgert mich.
Aber könntest Du mir trotzdem sagen was der übergeordnete Schalter bewirken soll.
-
Genau das ist der Punkt!
wenn er nur eine Statusanzeige ist - kann es funktionieren.
Wenn er auch etwas von den unteren Lichtern schaltet klappt es aber nicht
Gruß
Rainer
-
Wenn ich jetzt böse wäre dann wünsche es Dir weiter. Bin ein gutmütiger Mensch, aber der Ton verärgert mich.
Aber könntest Du mir trotzdem sagen was der übergeordnete Schalter bewirken soll. `
sorry, ich habs nicht böse gemeint.
ich würde nur gern entweder alles einzeln schalten oder gemeinsam schalten können
-
irgendwelche ideen oder ansätze? `
Vorschlag für Skript:const idAlles = '...'; // Datenpunkt-ID für Schalter "Alles" const idDecke = '...'; const idBett = '...'; const js = 'system.adapter.javascript.' + instance; var decke = getState(idDecke).val; var bett = getState(idBett).val; function oder() { var alles = false; if(decke || bett) alles = true; setState(idAlles, alles, true); } oder(); // Skriptstart on({id: idAlles, change: 'ne', fromNe: js}, function(dp) { setState(idDecke, dp.state.val); setState(idBett, dp.state.val); }); on(idDecke, function(dp) { decke = dp.state.val; oder(); }); on(idBett, function(dp) { bett = dp.state.val; oder(); }); ```` `
danke, das hab ich gerade versucht, endet aber auch in einer loop
-
ich würde nur gern entweder alles einzeln schalten oder gemeinsam schalten können `
Dann ergibt dein "Wunsch" aber keinen Sinn.Da dieser aber anscheinend Bedingung ist, gibt es keine Lösung
Gruß
Rainer
-
endet aber auch in einer loop `
Die Loop soll durchfromNe: js
verhindert werden. Bau mal ein Log ein.
on({id: idAlles, change: 'ne', fromNe: js}, function(dp) { log('Quelle: ' + dp.state.from); setState(idDecke, dp.state.val); setState(idBett, dp.state.val); });
Du hast nicht noch ein anderes Skript oder eine Szene mit Zugriff auf die beiden Lampen-Datenpunkte laufen ?
-
ich würde nur gern entweder alles einzeln schalten oder gemeinsam schalten können `
Dann ergibt dein "Wunsch" aber keinen Sinn.Da dieser aber anscheinend Bedingung ist, gibt es keine Lösung
Gruß
Rainer `
warum nicht?
- kein licht ist geschalten:
a) ich kann die lichter einzeln schalten
b) über den "alles" schalter eben alle ein/ausschalten
- 1 licht oder alle sind geschalten
a) man kann sie einzeln schalten
b) alle auf einmal
ist eigentlich sogar ein sehr valider anwendungsfall
-
endet aber auch in einer loop `
Die Loop soll durchfromNe: js
verhindert werden. Bau mal ein Log ein.
on({id: idAlles, change: 'ne', fromNe: js}, function(dp) { log('Quelle: ' + dp.state.from); setState(idDecke, dp.state.val); setState(idBett, dp.state.val); });
Du hast nicht noch ein anderes Skript oder eine Szene mit Zugriff auf die beiden Lampen-Datenpunkte laufen ? `
nein es läuft nur dieses 1 skript…sonst läuft da gar nix.....
bzw nodeRed, aber das simuliert mir ja nur quasi die schalter für alexa und setzt dann nur true oder false in einen der beiden datenpunkte (wie wenn der schalter betätigt werden würde)
-
ist eigentlich sogar ein sehr valider anwendungsfall `
Natürlich ist es das, aber so nicht realisierbar, da der Alles-Schalter sobald er verstellt wird, weil eine Lampe an ist sofort alle Lampen anstellt.(wie wenn der schalter betätigt werden würde) `
und genau das passiert, wenn es so konfiguriert istGruß
Rainer
-
ist eigentlich sogar ein sehr valider anwendungsfall `
Natürlich ist es das, aber so nicht realisierbar, da der Alles-Schalter sobald er verstellt wird, weil eine Lampe an ist sofort alle Lampen anstellt.(wie wenn der schalter betätigt werden würde) `
und genau das passiert, wenn es so konfiguriert istGruß
Rainer `
jaja, ich versteh ja das problem und ich sitz ja nicht erst seit 10 minuten bei dem problem.
ich dachte nur, vielleicht hätte jemand schon sowas ähnliches gemacht
-
so nicht realisierbar, da der Alles-Schalter sobald er verstellt wird, weil eine Lampe an ist sofort alle Lampen anstellt. `
Wenn als Quelle für die Umstellung des Alles-Schalters die Javascript-Instanz ausgeschlossen wird, passiert dies nicht (sollte zumndest so sein). -
endet aber auch in einer loop `
Die Loop soll durchfromNe: js
verhindert werden. Bau mal ein Log ein.
on({id: idAlles, change: 'ne', fromNe: js}, function(dp) { log('Quelle: ' + dp.state.from); setState(idDecke, dp.state.val); setState(idBett, dp.state.val); });
Du hast nicht noch ein anderes Skript oder eine Szene mit Zugriff auf die beiden Lampen-Datenpunkte laufen ? `
nein es läuft nur dieses 1 skript…sonst läuft da gar nix.....
bzw nodeRed, aber das simuliert mir ja nur quasi die schalter für alexa und setzt dann nur true oder false in einen der beiden datenpunkte (wie wenn der schalter betätigt werden würde) `
also schalte ich den "alles" schalter ein….funktioniert es und der log gibt folgendes aus:Quelle: system.adapter.web.1
schalte ich danach den alles schalter wieder aus ... bricht chaos aus und folgende logs:
Quelle: system.adapter.web.1
Quelle: system.adapter.javascript.0 (dann nur nocht diese)
-
so nicht realisierbar, da der Alles-Schalter sobald er verstellt wird, weil eine Lampe an ist sofort alle Lampen anstellt.
Wenn als Quelle für die Umstellung des Alles-Schalters die Javascript-Instanz ausgeschlossen wird, passiert dies nicht (sollte zumndest so sein).
genau da liegt wahrscheinlich das problem weil initial kommt es vom web
-
Quelle: system.adapter.javascript.0 (dann nur nocht diese) `
Das ist ein Fehler, denn es widerspricht fromNe: js. Ändere mal die 4. Zeile inconst js = 'system.adapter.javascript.0';
Welche Version hat der JS-Adapter ?
-
Falls auch das nicht hilft, ändere die Funktion
on(idAlles, function(dp) { if(dp.state.from != js) { setState(idDecke, dp.state.val); setState(idBett, dp.state.val); } });