NEWS
[gelöst]Lichtersteuerung auf Smartphone
-
Hi,
ich baue gerade im VIS-Editor (Standard) eine Visualisierung für mein Handy.
Da ich allerdings viele Lichter habe und wenig Platz auf einem Display habe ich mir folgendes überlegt.Ich mache eine zentrale Steuerung für meine Lichter. Sprich ein Schieberegler für RGBW für White-Color und für an/aus.
Jetzt dachte ich mir, dass ich alle Lichter als Buttons integriere und als Quelle auf eine eigene Variable (bool) verweise, sprich für jedes Licht eine eigene Variable (vielleicht in einem Array). Jetzt wähle ich quasi durch klick auf die Buttons ein oder mehrere Lichter aus und möchte nur die Ausgewählten mit der zentralen Steuerung steuern.
Ich habe mir im Kopf auch schon ein Workaround überlegt mit eigenen Variablen für jedes Licht / Steuerzentrale und mit Blockly.
Gibt es hierfür auch eine schönere Art mit Skripten zu arbeiten? Davon habe ich aktuell noch keine Ahnung.Vielen Dank für Eure Hilfe.
PS: ich habe auch schon so eine Visualisierung für Rollladen hier im Forum gefunden, finde es allerdings nicht mehr. Habe mir zum Glück damals das Skript gespeichert, aber ich verstehe kein Wort davon.
Hier das Skript:/** * CreationDate: 20.12.2018 * Descriptin: Rolladensteuerung im VIS Modul **/ //enable Logging logMode = true; //EG const rolladen_Kueche = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Kueche" /*IOT-Shelly2-Rolladen-Kueche*/; const rolladen_Wz_Holzterrasse = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Holzterrasse" /*IOT-Shelly2-Rolladen-WZ-Holzterrasse*/; const rolladen_Wz_Terrasse_Links = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Terrasse-Links" /*IOT-Shelly2-Rolladen-WZ-Terrasse-Links*/; const rolladen_Wz_Terrasse_Mitte = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Terrasse-Mitte" /*IOT-Shelly2-Rolladen-WZ-Terrasse-Mitte*/; const rolladen_Wz_Terrasse_Rechts = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Terrasse-Rechts" /*IOT-Shelly2-Rolladen-WZ-Terrasse-Rechts*/; const rolladen_HWR = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-HWR"; const rolladen_Buero = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Buero"; const rolladen_Gaestebad = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Gaestebad"; //OG const rolladen_Fitnessraum = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Fitnessraum"; const rolladen_Gaestezimmer = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Gaestezimmer"; const rolladen_Ankleide = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Ankleide"; const rolladen_Schlafzimmer = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Schlafzimmer"; const rolladen_Bad = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Bad"; const rolladen_Gaube = "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Gaube"; //Group buttons const grp_All = 'javascript.0.Rolladensteuerung.VIS.Group_All'/*Group All*/; const grp_EG = 'javascript.0.Rolladensteuerung.VIS.Group_EG'/*Group EG*/; const grp_OG = 'javascript.0.Rolladensteuerung.VIS.Group_OG'/*Group OG*/; const grp_Wohnzimmer = 'javascript.0.Rolladensteuerung.VIS.Group_Wohnzimmer'/*Group Wohnzimmer*/; const grp_Doors = 'javascript.0.Rolladensteuerung.VIS.Group_Doors'/*Group Doors*/; const grp_NoDoors = 'javascript.0.Rolladensteuerung.VIS.Group_No_Doors'/*Group No Doors*/; const grp_Sun_Protection_Front = 'grp_Sun_Protection_Front'/*No State/Button */; const grp_NoSelection = 'javascript.0.Rolladensteuerung.VIS.Group_No_Selection'; const groupButtons = [grp_All, grp_EG, grp_OG, grp_Wohnzimmer, grp_Doors, grp_NoDoors, grp_NoSelection]; const activeShutterState = 'javascript.0.Rolladensteuerung.VIS.Active_Shutters'; const shutterMapping = { "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Kueche": 'shelly.0.SHSW-21#134AD8#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Holzterrasse": 'shelly.0.SHSW-25#68C63AFA1E5C#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Terrasse-Links": 'shelly.0.SHSW-21#559F06#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Terrasse-Mitte": 'shelly.0.SHSW-21#134A12#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-WZ-Terrasse-Rechts": 'shelly.0.SHSW-25#483FDA762941#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-HWR": 'shelly.0.SHSW-21#5596AC#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Buero": 'shelly.0.SHSW-21#135908#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Gaestebad": 'shelly.0.SHSW-21#134BD8#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Fitnessraum": 'shelly.0.SHSW-21#559883#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly2-Rolladen-Gaestezimmer": 'shelly.0.SHSW-21#559ED1#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Ankleide": 'shelly.0.SHSW-25#691CB5#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Schlafzimmer": 'shelly.0.SHSW-25#5DBBA3#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Bad": 'shelly.0.SHSW-25#BA7E7D#1', "javascript.0.Rolladensteuerung.VIS.IOT-Shelly25-Rolladen-Gaube": 'shelly.0.SHSW-25#744E55#1' }; const fnct_allUp = "javascript.0.Rolladensteuerung.VIS.Function_All_Up"; const fnct_allDown = "javascript.0.Rolladensteuerung.VIS.Function_All_Down"; const fnct_50Percent = "javascript.0.Rolladensteuerung.VIS.Function_50Percent"; const fnct_SunProtection = "javascript.0.Rolladensteuerung.VIS.Function_Sun_Protection"; const fnct_SunProtectionFront = "javascript.0.Rolladensteuerung.VIS.Function_Sun_Protection_Front"; const functionButtons = [fnct_allUp, fnct_allDown, fnct_50Percent, fnct_SunProtection, fnct_SunProtectionFront]; //Groups const groups = { [grp_All]: [ rolladen_Kueche, rolladen_Wz_Holzterrasse, rolladen_Wz_Terrasse_Links, rolladen_Wz_Terrasse_Mitte, rolladen_Wz_Terrasse_Rechts, rolladen_HWR, rolladen_Buero, rolladen_Gaestebad, rolladen_Fitnessraum, rolladen_Gaestezimmer, rolladen_Ankleide, rolladen_Schlafzimmer, rolladen_Bad, rolladen_Gaube], [grp_EG]: [ rolladen_Kueche, rolladen_Wz_Holzterrasse, rolladen_Wz_Terrasse_Links, rolladen_Wz_Terrasse_Mitte, rolladen_Wz_Terrasse_Rechts, rolladen_HWR, rolladen_Buero, rolladen_Gaestebad], [grp_OG]: [ rolladen_Fitnessraum, rolladen_Gaestezimmer, rolladen_Ankleide, rolladen_Schlafzimmer, rolladen_Bad, rolladen_Gaube], [grp_Wohnzimmer]: [ rolladen_Wz_Holzterrasse, rolladen_Wz_Terrasse_Links, rolladen_Wz_Terrasse_Mitte, rolladen_Wz_Terrasse_Rechts], [grp_Doors]: [ rolladen_Wz_Holzterrasse, rolladen_Wz_Terrasse_Mitte], [grp_NoDoors]: [ rolladen_Kueche, rolladen_Wz_Terrasse_Links, rolladen_Wz_Terrasse_Rechts, rolladen_HWR, rolladen_Buero, rolladen_Gaestebad, rolladen_Fitnessraum, rolladen_Gaestezimmer, rolladen_Ankleide, rolladen_Schlafzimmer, rolladen_Bad, rolladen_Gaube], [grp_Sun_Protection_Front]: [ rolladen_Kueche, rolladen_HWR, rolladen_Buero, rolladen_Gaestebad, rolladen_Gaube], [grp_NoSelection]: [ "blank", ], }; let activeGroupButton; let activeFunctionButton; let activeShutters = {}; /**######################### ### VIS-Steuerung ### ############################*/ //deselektiert alle group button bis auf den einen aktiven function deselectAllGroupButtons(activeGroupButton){ groupButtons.forEach(function (button) { if (button != activeGroupButton) { setState(button, false); log(button); } }); }; //deselektiert alle function buttons bis auf den einen aktiven function deselectAllFunctionButtons(functionButtonActive){ functionButtons.forEach(function (button) { if (button != activeFunctionButton) setState(button, false); }); }; //deselektiert alle group button bis auf den einen aktiven function deselectGroupButtons(shutter, state){ if(activeGroupButton === undefined){ }else{ //check if shutter deactivated shutter is in active group //if so deactivate group button if(state === false){ let groupShutters = groups[activeGroupButton]; if(groupShutters.includes(shutter)){ setState(activeGroupButton, false); activeGroupButton = undefined; } } //check if activated shutter is not in active group //if so deactivate group button else if(state == true){ let groupShutters = groups[activeGroupButton]; if(!groupShutters.includes(shutter)){ setState(activeGroupButton, false); activeGroupButton = undefined; } } } }; //set active shutter buttons according to group function setShutterButtons(activeShutters){ let allShutters = groups[grp_All]; if(activeShutters === undefined){ allShutters.forEach(function (shutter) { setState(shutter, false); }); }else{ allShutters.forEach(function (shutter) { if (activeShutters.includes(shutter) === true) setState(shutter, true); else setState(shutter, false); }); } }; function deselectAllShuttersAndGroups(){ deselectAllGroupButtons(undefined); setShutterButtons(undefined); activeGroupButton = undefined; activeShutters = {}; } /**######################### ### Listener ### ############################*/ //Group Button Listener on(groupButtons, function (obj) { var state = obj.newState.val; if(state === true){ activeGroupButton = obj.id; log("activeButton " + obj.id); deselectAllGroupButtons(obj.id); setShutterButtons(groups[obj.id]); deselectAllFunctionButtons(undefined); }else if (state === false){ //setShutterButtons(undefined); deselectAllFunctionButtons(undefined); } }); //Shutter Button Listener on(groups[grp_All], function (obj) { var state = obj.newState.val; deselectGroupButtons(obj.id, state); if(state === true){ deselectAllFunctionButtons(undefined); activeShutters[shutterMapping[obj.id]] = obj.id; }else if(state === false){ delete activeShutters[shutterMapping[obj.id]] } //setState(activeShutterState, JSON.stringify(activeShutters)); }); /**######################### ### Shelly Steuerung ### ############################*/ // hoch / runter / pause function shutterAction(action, shutterList){ let shutterToConsider = {}; if(shutterList === undefined)shutterToConsider = activeShutters; else{ //Convert Array with Names to Object with Shelly IDs shutterList.forEach(function(shutterId){ shutterToConsider[shutterMapping[shutterId]] = shutterId; }) } log(JSON.stringify((shutterToConsider))); Object.keys(shutterToConsider).forEach(function(key){ switch (action){ case "open": log(key); setState(key + '.Shutter.state', "open"); break; case "stop": setState(key + '.Shutter.state', "stop"); break; case "close": setState(key + '.Shutter.state', "close"); break; } }); } //Fährt aktive Rolladen in entsprechende Position function shuttersTo(position, shutterList){ let shutterToConsider = {}; //consider active shutter if no shutter list available //convert shutterList to JSON structure if available if(shutterList === undefined)shutterToConsider = activeShutters; else{ //Convert Array with Names to Object with Shelly IDs shutterList.forEach(function(shutterId){ shutterToConsider[shutterMapping[shutterId]] = shutterId; }) } log(JSON.stringify(activeShutters)); log(JSON.stringify(shutterList)); log(JSON.stringify(shutterToConsider)); let currentState; Object.keys(shutterToConsider).forEach(function(key){ currentState = key + '.Shutter.Position'; log(currentState); log(getState(currentState).val); if ( shutterMapping[rolladen_Gaube] == key) setState('javascript.0.Rolladensteuerung.Gaubensteuerung.ValuePercentage', +position); else if (getState(currentState).val != position)setState(currentState, +position); }); } /**######################### ### Steuerungsbuttons ### ############################*/ // hoch / runter / pause Button on("javascript.0.Rolladensteuerung.VIS.Steuerung", function (obj) { // 1/-1 --> pause // 2/-2 --> öffnen // 3/-3 --> schließen let state = obj.newState.val; switch (state){ case 1: shutterAction("stop"); break; case 2: shutterAction("open"); break; case 3: shutterAction("close"); break; } }); on("javascript.0.Rolladensteuerung.VIS.Position", function (obj) { let state = obj.newState.val; shuttersTo(state, undefined); }); /**######################### ### Functions ### ############################*/ //all up on("javascript.0.Rolladensteuerung.VIS.Function_All_Up", function (obj) { var state = obj.newState.val; if(state === true){ deselectAllShuttersAndGroups; setState('javascript.0.Rolladensteuerung.alleHoch', true); } }); //all down on("javascript.0.Rolladensteuerung.VIS.Function_All_Down", function (obj) { var state = obj.newState.val; if(state === true){ deselectAllShuttersAndGroups; setState('javascript.0.Rolladensteuerung.alleRunter', true); } }); //50 Prozent on("javascript.0.Rolladensteuerung.VIS.Function_50Percent", function (obj) { var state = obj.newState.val; if(state === true){ deselectAllShuttersAndGroups; shuttersTo(50, groups[grp_All]); } }); //Sonnenschutz komplett on("javascript.0.Rolladensteuerung.VIS.Function_Sun_Protection", function (obj) { var state = obj.newState.val; if(state === true){ deselectAllShuttersAndGroups; shuttersTo(getState('javascript.0.Rolladensteuerung.Sonnenschutz.RolladenProzent').val, groups[grp_All]); } }); //Sonnenschutz Front on("javascript.0.Rolladensteuerung.VIS.Function_Sun_Protection_Front", function (obj) { var state = obj.newState.val; if(state === true){ deselectAllShuttersAndGroups; shuttersTo(getState('javascript.0.Rolladensteuerung.Sonnenschutz.RolladenProzent').val, groups[grp_Sun_Protection_Front]); } });Mit freundlichen Grüßen
Michael -
Also so etwas in der Art?

Jepp, habe ich genau so gemacht wie du das schon gedacht hast, jeder Button / Schieber hat seine eigenen Datenpunkte,
in meinem Beispiel noch mal einen extra für die Farbe (damit ich darstellen kann wo gerade eine Ansage läuft).Ich programmiere zwar auch in JavaScript wie dein Beispiel, dafür habe ich aber z.B. einfach Blockly genommen.
Fang einfach mit 2 Buttons an, erstelle die Datenpunkte unterhalb von
0_userdata-0dafür, baue die Widgets in die VIS und verknüpfe diese mit den Datenpunkten.Dann fängst du mit Blockly an und baust die Funktion hinter die beiden Buttons.
Und dann baust du Button für Button, Schieber für Schieber etc. dazu.Irgendwann kommst du an Grenzen wie "Verdammt, echt jetzt, für jeden Button einen eigenen Event-Trigger?" und dann wirst du wieder im Forum suchen und das auf einen ID-Selector umbauen.
Oder es bleibt bei den einzelnen Triggern, aber du baust die Dinge die sich ständig wiederholen in eine Funktion um die dann dann immer aufrufst.
Das ist genau die Art von Projekt bei der man so etwas prima lernt. Wenn ich dir jetzt mein XL Blockly um die Ohren haue schreib ich mir die Finger Wund es dir zu erklären und du verstehst trotzdem nur Bahnhof weil der Berg im ersten Moment echt riesig ist.
-
Also so etwas in der Art?

Jepp, habe ich genau so gemacht wie du das schon gedacht hast, jeder Button / Schieber hat seine eigenen Datenpunkte,
in meinem Beispiel noch mal einen extra für die Farbe (damit ich darstellen kann wo gerade eine Ansage läuft).Ich programmiere zwar auch in JavaScript wie dein Beispiel, dafür habe ich aber z.B. einfach Blockly genommen.
Fang einfach mit 2 Buttons an, erstelle die Datenpunkte unterhalb von
0_userdata-0dafür, baue die Widgets in die VIS und verknüpfe diese mit den Datenpunkten.Dann fängst du mit Blockly an und baust die Funktion hinter die beiden Buttons.
Und dann baust du Button für Button, Schieber für Schieber etc. dazu.Irgendwann kommst du an Grenzen wie "Verdammt, echt jetzt, für jeden Button einen eigenen Event-Trigger?" und dann wirst du wieder im Forum suchen und das auf einen ID-Selector umbauen.
Oder es bleibt bei den einzelnen Triggern, aber du baust die Dinge die sich ständig wiederholen in eine Funktion um die dann dann immer aufrufst.
Das ist genau die Art von Projekt bei der man so etwas prima lernt. Wenn ich dir jetzt mein XL Blockly um die Ohren haue schreib ich mir die Finger Wund es dir zu erklären und du verstehst trotzdem nur Bahnhof weil der Berg im ersten Moment echt riesig ist.
@bananajoe Vielen Dank dafür. Also bin ich mit meinen Gedanken und dem Workaround garnicht einmal so falsch.
Nur würde ich es mir gleich ein wenig vereinfachen und zumindest auf den ID selektiert oder eine Variable (Array) zurückgreifen um an einem Zentralen Ort alle Lichter einzubauen, die dann im Nachgang in einem Blockly abgefragt werden.
Wie kann ich das umsetzen?
Benötige ich für RGBW / An-Aus / Brightness jeweils ein extra Blockly oder kann ich das auch in einem Blockly überschaubar unterbringen?Vielen Dank.
Meikie -
@bananajoe Vielen Dank dafür. Also bin ich mit meinen Gedanken und dem Workaround garnicht einmal so falsch.
Nur würde ich es mir gleich ein wenig vereinfachen und zumindest auf den ID selektiert oder eine Variable (Array) zurückgreifen um an einem Zentralen Ort alle Lichter einzubauen, die dann im Nachgang in einem Blockly abgefragt werden.
Wie kann ich das umsetzen?
Benötige ich für RGBW / An-Aus / Brightness jeweils ein extra Blockly oder kann ich das auch in einem Blockly überschaubar unterbringen?Vielen Dank.
Meikie@meikie sagte in Lichtersteuerung auf Smartphone:
Wie kann ich das umsetzen?
Öhm? Wie sind denn deine Blockly Grundlagen? Einfach anfangen?
Benötige ich für RGBW / An-Aus / Brightness jeweils ein extra Blockly oder kann ich das auch in einem Blockly überschaubar unterbringen?
Du kannst das alles in einen Block packen, überschaubar ist Relativ. Zum einen kannst Blöcke kommentieren (nicht nur mit dem Kommentarblock) und zum anderen einklappen.
Du kannst auch jederzeit auf JavaScript pur wechseln falls dir das lieber ist. Ein Blockly kann umgewandelt werden oder aber du kopierst dir aus der Quelltextansicht eben diesen heraus.
Ich nehme auch oft kleine Blocklys um zu sehen wie etwas gemacht wird und baue das dann in mein großes JavaScript ein. -
@meikie sagte in Lichtersteuerung auf Smartphone:
Wie kann ich das umsetzen?
Öhm? Wie sind denn deine Blockly Grundlagen? Einfach anfangen?
Benötige ich für RGBW / An-Aus / Brightness jeweils ein extra Blockly oder kann ich das auch in einem Blockly überschaubar unterbringen?
Du kannst das alles in einen Block packen, überschaubar ist Relativ. Zum einen kannst Blöcke kommentieren (nicht nur mit dem Kommentarblock) und zum anderen einklappen.
Du kannst auch jederzeit auf JavaScript pur wechseln falls dir das lieber ist. Ein Blockly kann umgewandelt werden oder aber du kopierst dir aus der Quelltextansicht eben diesen heraus.
Ich nehme auch oft kleine Blocklys um zu sehen wie etwas gemacht wird und baue das dann in mein großes JavaScript ein.@bananajoe Ganz so fit bin ich noch nicht. Habe erst dieses Jahr damit angefangen.
// RGB wurde geändert on({id: "0_userdata.0.Lights.controll-rgb"/*controll-rgb*/, change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; // Kamin Licht if (getState("0_userdata.0.Lights.WZ-Kaminlicht").val == true) { setState("zigbee.0.04cd15fffedb3087.color"/*Color*/, getState("0_userdata.0.Lights.controll-rgb").val); } // Wohn-Stehlampe if (getState("0_userdata.0.Lights.WZ-Stehlampe").val == true) { setState("zigbee.0.9035eafffe04994d.color"/*Color*/, getState("0_userdata.0.Lights.controll-rgb").val); } });Ich stelle mir halt vor, dass ich nicht für jedes Gerät, welches neu hinzukommt einen neue Wenn/Dann/Else Schleife hinzufügen muss.
Ich hätte quasi gerne ein Array, welches das Skript durchgeht und bei jedem Datenpunkt, welcher auf True sitzt soll er das dementsprechende Licht steuern. Dann müsste ich quasi nur meine Variable füttern, wenn ein neues Gerät hinzukommt.Gibt es hierfür eine Möglichkeit?
Vielen Dank.
Meikie -
@bananajoe Ganz so fit bin ich noch nicht. Habe erst dieses Jahr damit angefangen.
// RGB wurde geändert on({id: "0_userdata.0.Lights.controll-rgb"/*controll-rgb*/, change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; // Kamin Licht if (getState("0_userdata.0.Lights.WZ-Kaminlicht").val == true) { setState("zigbee.0.04cd15fffedb3087.color"/*Color*/, getState("0_userdata.0.Lights.controll-rgb").val); } // Wohn-Stehlampe if (getState("0_userdata.0.Lights.WZ-Stehlampe").val == true) { setState("zigbee.0.9035eafffe04994d.color"/*Color*/, getState("0_userdata.0.Lights.controll-rgb").val); } });Ich stelle mir halt vor, dass ich nicht für jedes Gerät, welches neu hinzukommt einen neue Wenn/Dann/Else Schleife hinzufügen muss.
Ich hätte quasi gerne ein Array, welches das Skript durchgeht und bei jedem Datenpunkt, welcher auf True sitzt soll er das dementsprechende Licht steuern. Dann müsste ich quasi nur meine Variable füttern, wenn ein neues Gerät hinzukommt.Gibt es hierfür eine Möglichkeit?
Vielen Dank.
Meikie@meikie sagte in Lichtersteuerung auf Smartphone:
Gibt es hierfür eine Möglichkeit?
z.B. mit einer Funktion die du mit dem Datenpunkten aufrufst oder ja, einem Array welches du in einer Schleife abarbeitest.
Ich bin meine Skriptsammlung mal durchgegangen, ein einfaches Beispiel ist da jetzt aber auch nicht bei
Hier ein mehrdimensionales Array was dann in einer Schleife abgearbeitet wird:let a_SourceDatapoints = [ [ "Stromzähler<br>3EM", "3EM", "L1", "sourceanalytix.0.0_userdata__0__shellies__3EM-Stromzaehler__Total-kWh" ], [ "Stromzähler<br>3EM Real", "Real3EM", "L1", "sourceanalytix.0.0_userdata__0__shellies__3EM-Stromzaehler__Total-kWh-with-Feed" ], [ "Stromzähler", "Stadtwerke", "L1", "sourceanalytix.0.mqtt__0__esp32__esp32strom__zaehlerstand" ], [ "Solaranlage", "Solaranlage", "L1", "sourceanalytix.0.0_userdata__0__Solaranlage__Total__Energy-Total" ] ]; for (var i = 0; i < a_SourceDatapoints.length; i++) { let s_currentName = a_SourceDatapoints[i][0]; let s_currentDevice = a_SourceDatapoints[i][1]; let s_currentPhase = a_SourceDatapoints[i][2]; let s_currentSourceAnalytix = a_SourceDatapoints[i][3];; /* hier etwas mit den Variablen tun /* } -
@meikie sagte in Lichtersteuerung auf Smartphone:
Gibt es hierfür eine Möglichkeit?
z.B. mit einer Funktion die du mit dem Datenpunkten aufrufst oder ja, einem Array welches du in einer Schleife abarbeitest.
Ich bin meine Skriptsammlung mal durchgegangen, ein einfaches Beispiel ist da jetzt aber auch nicht bei
Hier ein mehrdimensionales Array was dann in einer Schleife abgearbeitet wird:let a_SourceDatapoints = [ [ "Stromzähler<br>3EM", "3EM", "L1", "sourceanalytix.0.0_userdata__0__shellies__3EM-Stromzaehler__Total-kWh" ], [ "Stromzähler<br>3EM Real", "Real3EM", "L1", "sourceanalytix.0.0_userdata__0__shellies__3EM-Stromzaehler__Total-kWh-with-Feed" ], [ "Stromzähler", "Stadtwerke", "L1", "sourceanalytix.0.mqtt__0__esp32__esp32strom__zaehlerstand" ], [ "Solaranlage", "Solaranlage", "L1", "sourceanalytix.0.0_userdata__0__Solaranlage__Total__Energy-Total" ] ]; for (var i = 0; i < a_SourceDatapoints.length; i++) { let s_currentName = a_SourceDatapoints[i][0]; let s_currentDevice = a_SourceDatapoints[i][1]; let s_currentPhase = a_SourceDatapoints[i][2]; let s_currentSourceAnalytix = a_SourceDatapoints[i][3];; /* hier etwas mit den Variablen tun /* }@bananajoe Hi, danke dir. Kannst du mir kurz erklären wie das Array aufgebaut ist?
Ist das ein Array mit 4 Werten pro Reihe? Wie kann ich hier meine Datenpunkte einfügen? Einfach den Pfad kopieren und zwischen "" einfügen?Beispiel:
let a_SourceDatapoints = ["Eigener Datenpunkt von Lampe", "Echter Datenpunkt von Lampe"], ["0_userdata.0.Lights.WZ-Kaminlicht", "zigbee.0.04cd15fffedb3087.color"] ];Wäre das so richtig?
Vielen Dank.
Meikie -
@bananajoe Hi, danke dir. Kannst du mir kurz erklären wie das Array aufgebaut ist?
Ist das ein Array mit 4 Werten pro Reihe? Wie kann ich hier meine Datenpunkte einfügen? Einfach den Pfad kopieren und zwischen "" einfügen?Beispiel:
let a_SourceDatapoints = ["Eigener Datenpunkt von Lampe", "Echter Datenpunkt von Lampe"], ["0_userdata.0.Lights.WZ-Kaminlicht", "zigbee.0.04cd15fffedb3087.color"] ];Wäre das so richtig?
Vielen Dank.
MeikieJa, wäre so richtig (wenn du die im Anschluss richtig ansprichst)
Wie viele Dimensionen brauchst du?
Einfaches Array:
a_meinArray = [ "Wert1", "Wert2", "Wert3" ]; // Abruf der Werte in einer Schleife: for (var i = 0; i < a_meinArray .length; i++) { let s_currentValue = a_meinArray[i]; // etwas mit den Werten machen }Mit mehreren Dimensionen
a_meinArrayMD = [ [ "Wert1 A", "Wert1 B", 21 ], [ "Wert2 A", "Wert2 B", 42 ], [ "Wert3 A", "Wert3 B", 63 ] ]; // Abruf der Werte in einer Schleife: for (var i = 0; i < a_meinArrayMD .length; i++) { let s_WertA = a_meinArrayMD [i][0]; let s_WertB = a_meinArrayMD [i][1]; let s_WertZahl = a_meinArrayMD [i][2]; // etwas mit den Werten machen } -
Ja, wäre so richtig (wenn du die im Anschluss richtig ansprichst)
Wie viele Dimensionen brauchst du?
Einfaches Array:
a_meinArray = [ "Wert1", "Wert2", "Wert3" ]; // Abruf der Werte in einer Schleife: for (var i = 0; i < a_meinArray .length; i++) { let s_currentValue = a_meinArray[i]; // etwas mit den Werten machen }Mit mehreren Dimensionen
a_meinArrayMD = [ [ "Wert1 A", "Wert1 B", 21 ], [ "Wert2 A", "Wert2 B", 42 ], [ "Wert3 A", "Wert3 B", 63 ] ]; // Abruf der Werte in einer Schleife: for (var i = 0; i < a_meinArrayMD .length; i++) { let s_WertA = a_meinArrayMD [i][0]; let s_WertB = a_meinArrayMD [i][1]; let s_WertZahl = a_meinArrayMD [i][2]; // etwas mit den Werten machen }@bananajoe Hi, ich habe jetzt mal ein JS Skript erstellt und den folgenden Code eingeben. Leider bringt er mir schon Ober bei der Variable sehr viele Fehler. (siehe Bild.)!
// 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"], ["KZ-Ambiente", "0_userdata.0.Lights.KZ-Ambiente"], ["Bad-Ambiente", "0_userdata.0.Lights.Bad-Ambiente", "zigbee.0.04cd15fffedb28e3.state", "zigbee.0.04cd15fffedb28e3.color"], ]; // 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]; let s_currentColor = a_lightcontrol[i][3]; } // 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; setState(s_currentState/*Switch state*/, getState("0_userdata.0.Lights.control-onoff").val); setStateDelayed("0_userdata.0.Lights.control-onoff"/*control-onoff*/, '', 1000, true); }); // RGB wurde geändert on({id: "0_userdata.0.Lights.controll-rgb"/*controll-rgb*/, change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; // Kamin Licht if (getState(s_currentData).val == true) { setState(s_currentColor/*Color*/, getState("0_userdata.0.Lights.controll-rgb").val); });
Danke für deine/eure Hilfe.
-
@bananajoe Hi, ich habe jetzt mal ein JS Skript erstellt und den folgenden Code eingeben. Leider bringt er mir schon Ober bei der Variable sehr viele Fehler. (siehe Bild.)!
// 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"], ["KZ-Ambiente", "0_userdata.0.Lights.KZ-Ambiente"], ["Bad-Ambiente", "0_userdata.0.Lights.Bad-Ambiente", "zigbee.0.04cd15fffedb28e3.state", "zigbee.0.04cd15fffedb28e3.color"], ]; // 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]; let s_currentColor = a_lightcontrol[i][3]; } // 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; setState(s_currentState/*Switch state*/, getState("0_userdata.0.Lights.control-onoff").val); setStateDelayed("0_userdata.0.Lights.control-onoff"/*control-onoff*/, '', 1000, true); }); // RGB wurde geändert on({id: "0_userdata.0.Lights.controll-rgb"/*controll-rgb*/, change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; // Kamin Licht if (getState(s_currentData).val == true) { setState(s_currentColor/*Color*/, getState("0_userdata.0.Lights.controll-rgb").val); });
Danke für deine/eure Hilfe.
-
@bananajoe Hi, ich habe jetzt mal ein JS Skript erstellt und den folgenden Code eingeben. Leider bringt er mir schon Ober bei der Variable sehr viele Fehler. (siehe Bild.)!
// 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"], ["KZ-Ambiente", "0_userdata.0.Lights.KZ-Ambiente"], ["Bad-Ambiente", "0_userdata.0.Lights.Bad-Ambiente", "zigbee.0.04cd15fffedb28e3.state", "zigbee.0.04cd15fffedb28e3.color"], ]; // 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]; let s_currentColor = a_lightcontrol[i][3]; } // 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; setState(s_currentState/*Switch state*/, getState("0_userdata.0.Lights.control-onoff").val); setStateDelayed("0_userdata.0.Lights.control-onoff"/*control-onoff*/, '', 1000, true); }); // RGB wurde geändert on({id: "0_userdata.0.Lights.controll-rgb"/*controll-rgb*/, change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; // Kamin Licht if (getState(s_currentData).val == true) { setState(s_currentColor/*Color*/, getState("0_userdata.0.Lights.controll-rgb").val); });
Danke für deine/eure Hilfe.
@meikie Und Du greifst nachher auf s_currentState und andere Variablen zu, die da nicht mehr existieren. Diese existieren nur innerhalb der for-Schleife.
Du musst dementsprechend die for-Schleife in Deine Trigger ziehen und überlegen, welche der Elemente Du schalten möchtest. -
@meikie Und Du greifst nachher auf s_currentState und andere Variablen zu, die da nicht mehr existieren. Diese existieren nur innerhalb der for-Schleife.
Du musst dementsprechend die for-Schleife in Deine Trigger ziehen und überlegen, welche der Elemente Du schalten möchtest.@zarello Vielen Dank. Ja die kleine Fehler mit Kommas, Klammern usw.
Kann ich dann in der for-Schleife die Trigger mit einbauen? Also einfach das, was ich unten habe mit in die for-schleife bauen? Oder geht es einfacher in dem ich die Variable Global erstelle. Geht das?Vielen Dank.
-
@zarello Vielen Dank. Ja die kleine Fehler mit Kommas, Klammern usw.
Kann ich dann in der for-Schleife die Trigger mit einbauen? Also einfach das, was ich unten habe mit in die for-schleife bauen? Oder geht es einfacher in dem ich die Variable Global erstelle. Geht das?Vielen Dank.
@meikie Die Trigger in die For-Schleife zu ziehen ist in dem Fall keine gute Idee, das verbraucht nur unnötig Resourcen.
Die Variablen global erstellen bringt Dir auch nichts. Die For-Schleife wird dann am Anfang einmal durchlaufen und dann stehen die Werte auf dem letzten Eintrag und bleiben dort. Wenn ein Trigger ausgelöst wird, wird er dementsprechend nur den letzten Eintrag verwenden.
-
@meikie Die Trigger in die For-Schleife zu ziehen ist in dem Fall keine gute Idee, das verbraucht nur unnötig Resourcen.
Die Variablen global erstellen bringt Dir auch nichts. Die For-Schleife wird dann am Anfang einmal durchlaufen und dann stehen die Werte auf dem letzten Eintrag und bleiben dort. Wenn ein Trigger ausgelöst wird, wird er dementsprechend nur den letzten Eintrag verwenden.
-
@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. -
@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