NEWS
[gelöst]Lichtersteuerung auf Smartphone
-
@meikie Sowas wie:
// Hier werden alle Lampen, die mit der Zentralen Steuerung geschalten werden aufgelistet. // Variable [ "Name", "Eigener Datenpunkt", "Datenpunkt Lampe ONOFF", "Datenpunkt Lampe RGB" ] let a_lightcontrol = [ ["WZ-Kaminlicht", "0_userdata.0.Lights.WZ-Kaminlicht", "zigbee.0.04cd15fffedb3087.state", "zigbee.0.04cd15fffedb3087.color"], ["WZ-Couch", "0_userdata.0.Lights.WZ-Couch", "zigbee.0.842e14fffe36885f.state"], ["WZ-Stehlampe", "0_userdata.0.Lights.WZ-Stehlampe", "zigbee.0.9035eafffe04994d.state", "zigbee.0.9035eafffe04994d.color"], ["Kü-Ambiente", "0_userdata.0.Lights.Kü-Ambiente", "hier fehlt noch eine ID"], ["KZ-Ambiente", "0_userdata.0.Lights.KZ-Ambiente", "hier fehlt noch eine ID"], ["Bad-Ambiente", "0_userdata.0.Lights.Bad-Ambiente", "zigbee.0.04cd15fffedb28e3.state", "zigbee.0.04cd15fffedb28e3.color"] ]; // OnOff wurde geändert on({id: "0_userdata.0.Lights.control-onoff"/*control-onoff*/, change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; // Abruf der Werte in einer Schleife: for (var i = 0; i < a_lightcontrol.length; i++) { let s_currentName = a_lightcontrol[i][0]; let s_currentData = a_lightcontrol[i][1]; let s_currentState = a_lightcontrol[i][2]; // Ich bin mir nicht sicher, was Du hier erreichen wolltest. Ich habe mal geraten: if (getState (s_currentData).val) { setState(s_currentState/*Switch state*/, value); if (!value) { setStateDelayed("0_userdata.0.Lights.control-onoff"/*control-onoff*/, '', 1000, true); } } } });Ich habe gerade keine Möglichkeit das zu testen, es könnten also noch Fehler vorhanden sein.
Versuch mal herauszufinden, was da dann wann und wie passiert. Tipp: if (!value) bedeutet: Wenn in value der Wert false steht. -
@zarello Hi, danke für den Code. Leider kann ich ihn selbst auch noch nicht testen. Er sagt nämlich die ganze Zeit, dass in Zeile 3
let a_lightcontrol = [Ein Fehler wäre.
Ich finde dieses aber nicht. -
@zarello Jetzt habe ich es einmal bei mir laufen lassen: Das funktioniert, egal ob mit oder ohne Komma am Ende der neunten Zeile.
Gibt es evtl. eine zweite Variable a_lightcontrol in Deinem Skript, also eine zweite Zeile, die mit let a_lightcontrol anfängt?
Um was sinnvolles dazu sagen zu können müsstest Du nochmals Dein Skript in der aktuellen Fassung komplett hier einstellen inklusive der Fehlermeldungen die Du bekommst.
-
@zarello Jetzt habe ich es einmal bei mir laufen lassen: Das funktioniert, egal ob mit oder ohne Komma am Ende der neunten Zeile.
Gibt es evtl. eine zweite Variable a_lightcontrol in Deinem Skript, also eine zweite Zeile, die mit let a_lightcontrol anfängt?
Um was sinnvolles dazu sagen zu können müsstest Du nochmals Dein Skript in der aktuellen Fassung komplett hier einstellen inklusive der Fehlermeldungen die Du bekommst.
@zarello Hey, vielen Dank für deine Hilfe. Jetzt habe ich es soweit hinbekommen. Nur folgender Code bekomme ich nicht zum laufen.
let a_lightcontrol = [ [/*"WZ-Kaminlicht"*/ "WZ", "0_userdata.0.Lights.WZ-Kaminlicht", "zigbee.0.04cd15fffedb3087.state", "zigbee.0.04cd15fffedb3087.color"], [/*"WZ-Couch"*/ "WZ", "0_userdata.0.Lights.WZ-Couch", "zigbee.0.842e14fffe36885f.state"], [/*"WZ-Stehlampe"*/ "WZ", "0_userdata.0.Lights.WZ-Stehlampe", "zigbee.0.9035eafffe04994d.state", "zigbee.0.9035eafffe04994d.color"], [/*"Bad-Ambiente"*/ "Bad", "0_userdata.0.Lights.Bad-Ambiente", "zigbee.0.04cd15fffedb28e3.state", "zigbee.0.04cd15fffedb28e3.color"] ]; // Wohnzimmer komplett selektieren / deselektieren on({id: "0_userdata.0.Lights.control-wz"/*control-wz*/, change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; // Abruf der Werte in einer Schleife: for (var i = 0; i < a_lightcontrol.length; i++) { let s_currentRoom = a_lightcontrol[i][0]; let s_currentData = a_lightcontrol[i][1]; // Alle Lampen im Wohnzimmer auswählen console.log(s_currentRoom); if (getState (s_currentRoom).val == "WZ") { setState(s_currentData/*Switch state*/, getState("0_userdata.0.Lights.control-wz").val); } } /*Kaminlicht*/ //setState("0_userdata.0.Lights.WZ-Kaminlicht", value); /*Stehlampe*/ //setState("0_userdata.0.Lights.WZ-Stehlampe", value); /*Couch*/ //setState("0_userdata.0.Lights.WZ-Couch", value); });Folgende Fehlermeldung steht im Protokoll.
javascript.0 782 2023-02-24 14:18:16.917 warn at processImmediate (node:internal/timers:466:21) javascript.0 782 2023-02-24 14:18:16.917 warn at Immediate._onImmediate (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/src/lib/adapter/adapter.js:5916:56) javascript.0 782 2023-02-24 14:18:16.917 warn at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:593:29) javascript.0 782 2023-02-24 14:18:16.917 warn at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1244:38) javascript.0 782 2023-02-24 14:18:16.917 warn at Object.<anonymous> (script.js.Ambiente.LichtsteuerungJS:66:13) javascript.0 782 2023-02-24 14:18:16.916 warn getState "WZ" not found (3) javascript.0 782 2023-02-24 14:18:16.915 info script.js.Ambiente.LichtsteuerungJS: WZWas habe ich hier falsch? Vielen Dank für deine Hilfe.
Liebe Grüße
Michael -
@zarello Hey, vielen Dank für deine Hilfe. Jetzt habe ich es soweit hinbekommen. Nur folgender Code bekomme ich nicht zum laufen.
let a_lightcontrol = [ [/*"WZ-Kaminlicht"*/ "WZ", "0_userdata.0.Lights.WZ-Kaminlicht", "zigbee.0.04cd15fffedb3087.state", "zigbee.0.04cd15fffedb3087.color"], [/*"WZ-Couch"*/ "WZ", "0_userdata.0.Lights.WZ-Couch", "zigbee.0.842e14fffe36885f.state"], [/*"WZ-Stehlampe"*/ "WZ", "0_userdata.0.Lights.WZ-Stehlampe", "zigbee.0.9035eafffe04994d.state", "zigbee.0.9035eafffe04994d.color"], [/*"Bad-Ambiente"*/ "Bad", "0_userdata.0.Lights.Bad-Ambiente", "zigbee.0.04cd15fffedb28e3.state", "zigbee.0.04cd15fffedb28e3.color"] ]; // Wohnzimmer komplett selektieren / deselektieren on({id: "0_userdata.0.Lights.control-wz"/*control-wz*/, change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; // Abruf der Werte in einer Schleife: for (var i = 0; i < a_lightcontrol.length; i++) { let s_currentRoom = a_lightcontrol[i][0]; let s_currentData = a_lightcontrol[i][1]; // Alle Lampen im Wohnzimmer auswählen console.log(s_currentRoom); if (getState (s_currentRoom).val == "WZ") { setState(s_currentData/*Switch state*/, getState("0_userdata.0.Lights.control-wz").val); } } /*Kaminlicht*/ //setState("0_userdata.0.Lights.WZ-Kaminlicht", value); /*Stehlampe*/ //setState("0_userdata.0.Lights.WZ-Stehlampe", value); /*Couch*/ //setState("0_userdata.0.Lights.WZ-Couch", value); });Folgende Fehlermeldung steht im Protokoll.
javascript.0 782 2023-02-24 14:18:16.917 warn at processImmediate (node:internal/timers:466:21) javascript.0 782 2023-02-24 14:18:16.917 warn at Immediate._onImmediate (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/src/lib/adapter/adapter.js:5916:56) javascript.0 782 2023-02-24 14:18:16.917 warn at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:593:29) javascript.0 782 2023-02-24 14:18:16.917 warn at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1244:38) javascript.0 782 2023-02-24 14:18:16.917 warn at Object.<anonymous> (script.js.Ambiente.LichtsteuerungJS:66:13) javascript.0 782 2023-02-24 14:18:16.916 warn getState "WZ" not found (3) javascript.0 782 2023-02-24 14:18:16.915 info script.js.Ambiente.LichtsteuerungJS: WZWas habe ich hier falsch? Vielen Dank für deine Hilfe.
Liebe Grüße
Michael@meikie sagte in [gelöst]Lichtersteuerung auf Smartphone:
let s_currentRoom = a_lightcontrol[i][0];0 ist
WZ, 1 wäre0_userdata.0.Lights.WZ-KaminlichtUnd ich mag es ja mit vielen Kommentaren ... aber warum musst du die auch immer unbedingt da mitten in den Text schreiben. Bei deinem Array - das packe doch in 0 die Beschreibung die du als Kommentar nutzt, und wenn es dann ein Feld mehr ist. Ist dann auch beim Debuggen praktisch weil man dann die Beschreibung mit ausgeben könnte
-
@meikie sagte in [gelöst]Lichtersteuerung auf Smartphone:
let s_currentRoom = a_lightcontrol[i][0];0 ist
WZ, 1 wäre0_userdata.0.Lights.WZ-KaminlichtUnd ich mag es ja mit vielen Kommentaren ... aber warum musst du die auch immer unbedingt da mitten in den Text schreiben. Bei deinem Array - das packe doch in 0 die Beschreibung die du als Kommentar nutzt, und wenn es dann ein Feld mehr ist. Ist dann auch beim Debuggen praktisch weil man dann die Beschreibung mit ausgeben könnte
-
Hey,
sehe es mir nach. Ich bin ganz neu in diesem Metier :-)0 ist WZ, 1 wäre 0_userdata.0.Lights.WZ-Kaminlicht
Genau so sollte es sein. Kannst du einen Fehler finden und mir sagen?
Vielen Dank. -
@meikie War jetzt noch eine Frage offen? Denn der Titel dieser Diskussion ist ja inzwischen auf gelöst gesetzt.
-
@zarello Hey, vielen Dank für deine Hilfe. Jetzt habe ich es soweit hinbekommen. Nur folgender Code bekomme ich nicht zum laufen.
let a_lightcontrol = [ [/*"WZ-Kaminlicht"*/ "WZ", "0_userdata.0.Lights.WZ-Kaminlicht", "zigbee.0.04cd15fffedb3087.state", "zigbee.0.04cd15fffedb3087.color"], [/*"WZ-Couch"*/ "WZ", "0_userdata.0.Lights.WZ-Couch", "zigbee.0.842e14fffe36885f.state"], [/*"WZ-Stehlampe"*/ "WZ", "0_userdata.0.Lights.WZ-Stehlampe", "zigbee.0.9035eafffe04994d.state", "zigbee.0.9035eafffe04994d.color"], [/*"Bad-Ambiente"*/ "Bad", "0_userdata.0.Lights.Bad-Ambiente", "zigbee.0.04cd15fffedb28e3.state", "zigbee.0.04cd15fffedb28e3.color"] ]; // Wohnzimmer komplett selektieren / deselektieren on({id: "0_userdata.0.Lights.control-wz"/*control-wz*/, change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; // Abruf der Werte in einer Schleife: for (var i = 0; i < a_lightcontrol.length; i++) { let s_currentRoom = a_lightcontrol[i][0]; let s_currentData = a_lightcontrol[i][1]; // Alle Lampen im Wohnzimmer auswählen console.log(s_currentRoom); if (getState (s_currentRoom).val == "WZ") { setState(s_currentData/*Switch state*/, getState("0_userdata.0.Lights.control-wz").val); } } /*Kaminlicht*/ //setState("0_userdata.0.Lights.WZ-Kaminlicht", value); /*Stehlampe*/ //setState("0_userdata.0.Lights.WZ-Stehlampe", value); /*Couch*/ //setState("0_userdata.0.Lights.WZ-Couch", value); });Folgende Fehlermeldung steht im Protokoll.
javascript.0 782 2023-02-24 14:18:16.917 warn at processImmediate (node:internal/timers:466:21) javascript.0 782 2023-02-24 14:18:16.917 warn at Immediate._onImmediate (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/src/lib/adapter/adapter.js:5916:56) javascript.0 782 2023-02-24 14:18:16.917 warn at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:593:29) javascript.0 782 2023-02-24 14:18:16.917 warn at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1244:38) javascript.0 782 2023-02-24 14:18:16.917 warn at Object.<anonymous> (script.js.Ambiente.LichtsteuerungJS:66:13) javascript.0 782 2023-02-24 14:18:16.916 warn getState "WZ" not found (3) javascript.0 782 2023-02-24 14:18:16.915 info script.js.Ambiente.LichtsteuerungJS: WZWas habe ich hier falsch? Vielen Dank für deine Hilfe.
Liebe Grüße
Michael@meikie sagte in [gelöst]Lichtersteuerung auf Smartphone:
let s_currentRoom = a_lightcontrol[i][0]; let s_currentData = a_lightcontrol[i][1]; // Alle Lampen im Wohnzimmer auswählen console.log(s_currentRoom); if (getState (s_currentRoom).val == "WZ") { setState(s_currentData/*Switch state*/, getState("0_userdata.0.Lights.control-wz").val); }Folgende Fehlermeldung steht im Protokoll.
javascript.0 782 2023-02-24 14:18:16.917 warn at Object.<anonymous> (script.js.Ambiente.LichtsteuerungJS:66:13) javascript.0 782 2023-02-24 14:18:16.916 warn getState "WZ" not found (3) javascript.0 782 2023-02-24 14:18:16.915 info script.js.Ambiente.LichtsteuerungJS: WZCode und Log habe ich hier mal auf die wesentlichen Stellen gekürzt, die man benötigt um das Problem zu verstehen. Die folgenden Zeilennummern beziehen sich auf meinen gekürzten Ausschnitt:
In Zeile 4 gibst Du s_currentRoom im Log aus. Das ist auch zu sehen in Zeile 3 des Logs.
Der Wert von s_currentRoom is "WZ".
Dann versuchst Du in Zeile 5 getState aufzurufen. Das System gibt Dir dazu völlig richtig die Antwort in Zeile 2 im Log: Ein Datenpunkt mit Namen "WZ" existiert nicht, denn getState versucht ja immer Werte aus einem Datenpunkt zu lesen.
In Zeile 1 des Logs findest Du dann übrigens den Hinweis, wo die entsprechende Stelle zu suchen ist: Im Script Ambiente.LichtsteuerungJS, Zeile 66, Spalte 13.
Eigentlich wolltest Du vermutlich einfach überprüfen ob Dein Tabelleneintrag zum Wohnzimmer gehört.
Das wäre dann:if (s_currentRoom == "WZ") {Ich hoffe, das hilft Dir etwas weiter.
Edit: Logzeile mit Hinweis auf Position ergänzt und beschrieben.
-
@meikie sagte in [gelöst]Lichtersteuerung auf Smartphone:
let s_currentRoom = a_lightcontrol[i][0]; let s_currentData = a_lightcontrol[i][1]; // Alle Lampen im Wohnzimmer auswählen console.log(s_currentRoom); if (getState (s_currentRoom).val == "WZ") { setState(s_currentData/*Switch state*/, getState("0_userdata.0.Lights.control-wz").val); }Folgende Fehlermeldung steht im Protokoll.
javascript.0 782 2023-02-24 14:18:16.917 warn at Object.<anonymous> (script.js.Ambiente.LichtsteuerungJS:66:13) javascript.0 782 2023-02-24 14:18:16.916 warn getState "WZ" not found (3) javascript.0 782 2023-02-24 14:18:16.915 info script.js.Ambiente.LichtsteuerungJS: WZCode und Log habe ich hier mal auf die wesentlichen Stellen gekürzt, die man benötigt um das Problem zu verstehen. Die folgenden Zeilennummern beziehen sich auf meinen gekürzten Ausschnitt:
In Zeile 4 gibst Du s_currentRoom im Log aus. Das ist auch zu sehen in Zeile 3 des Logs.
Der Wert von s_currentRoom is "WZ".
Dann versuchst Du in Zeile 5 getState aufzurufen. Das System gibt Dir dazu völlig richtig die Antwort in Zeile 2 im Log: Ein Datenpunkt mit Namen "WZ" existiert nicht, denn getState versucht ja immer Werte aus einem Datenpunkt zu lesen.
In Zeile 1 des Logs findest Du dann übrigens den Hinweis, wo die entsprechende Stelle zu suchen ist: Im Script Ambiente.LichtsteuerungJS, Zeile 66, Spalte 13.
Eigentlich wolltest Du vermutlich einfach überprüfen ob Dein Tabelleneintrag zum Wohnzimmer gehört.
Das wäre dann:if (s_currentRoom == "WZ") {Ich hoffe, das hilft Dir etwas weiter.
Edit: Logzeile mit Hinweis auf Position ergänzt und beschrieben.