Lichtfarbe per tasten ändern

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
ChrisNRW1987
Beiträge: 4
Registriert: 28. Aug 2021 19:12
Answers: 0

Lichtfarbe per tasten ändern

Beitrag von ChrisNRW1987 »

Hallo ihr.
Ich bin absoluter oh3 Anfänger und die einfachen Sachen habe ich per Blockly hinbekommen. Jetzt wird es Komplexer und benötige eure Hilfe.

Ich habe 6 rgbw Strips die per dmx einzelnd angesteuert werden. Das einfache an aus per taster in einer Farbe geht ohne Probleme.
Heute wollte ich eine Testrule schreiben wo bei jeden tasten die Variabele auf eine andere Zahl geändert wird und die Variabele mit der Zahl eine bestimmt die programmierten Farben an gehen sollen. Per Langen Tastendruck soll er das Licht ausschalten.
Aber irgendwie ändert er die Zahl der Variabele beim tasten nicht. Was ist da falsch?

Code: Alles auswählen

var LichtStatus;


if (LichtStatus == '6') {
  LichtStatus = (typeof LichtStatus == 'number' ? LichtStatus : 0) + 0;
} else if (LichtStatus == '5') {
  LichtStatus = (typeof LichtStatus == 'number' ? LichtStatus : 0) + 6;
} else if (LichtStatus == '4') {
  LichtStatus = (typeof LichtStatus == 'number' ? LichtStatus : 0) + 5;
} else if (LichtStatus == '3') {
  LichtStatus = (typeof LichtStatus == 'number' ? LichtStatus : 0) + 4;
} else if (LichtStatus == '2') {
  LichtStatus = (typeof LichtStatus == 'number' ? LichtStatus : 0) + 3;
} else if (LichtStatus == '1') {
  LichtStatus = (typeof LichtStatus == 'number' ? LichtStatus : 0) + 2;
} else if (LichtStatus == '0') {
  LichtStatus = (typeof LichtStatus == 'number' ? LichtStatus : 0) + 1;
}
if (LichtStatus == '0') {
  events.sendCommand('IndirektJonasWWAll_Brightness', '0');
  events.sendCommand('IndirektJonasRGBAll_Color', '0,0,0');
} else if (LichtStatus == '1') {
  events.sendCommand('IndirektJonasRGBAll_Color', '0,0,0');
  events.sendCommand('IndirektJonasWWAll_Brightness', '50');
} else if (LichtStatus == '2') {
  events.sendCommand('IndirektJonasRGB1_Color', '119,100,50');
  events.sendCommand('IndirektJonasRGB2_Color', '0,0,50');
  events.sendCommand('IndirektJonasRGB5_Color', '119,100,50');
  events.sendCommand('IndirektJonasRGB6_Color', '0,0,50');
  events.sendCommand('IndirektJonasRGB3_Color', '119,100,50');
  events.sendCommand('IndirektJonasRGB4_Color', '0,0,50');
} else if (LichtStatus == '3') {
  events.sendCommand('IndirektJonasRGB1_Color', '0,100,50');
  events.sendCommand('IndirektJonasRGB2_Color', '100,100,100');
  events.sendCommand('IndirektJonasRGB3_Color', '130,100,50');
  events.sendCommand('IndirektJonasRGB4_Color', '150,100,50');
  events.sendCommand('IndirektJonasRGB5_Color', '170,100,50');
  events.sendCommand('IndirektJonasRGB6_Color', '140,100,50');
} else if (LichtStatus == '4') {
  events.sendCommand('IndirektJonasRGB1_Color', '180,100,50');
  events.sendCommand('IndirektJonasRGB2_Color', '190,100,50');
  events.sendCommand('IndirektJonasRGB3_Color', '200,100,50');
  events.sendCommand('IndirektJonasRGB4_Color', '210,100,50');
  events.sendCommand('IndirektJonasRGB5_Color', '220,100,50');
  events.sendCommand('IndirektJonasRGB6_Color', '230,100,50');
} else if (LichtStatus == '5') {
  events.sendCommand('IndirektJonasRGBAll_Color', '0,0,0');
  events.sendCommand('IndirektJonasWWAll_Brightness', '30');
} else if (LichtStatus == '6') {
  events.sendCommand('IndirektJonasRGBAll_Color', '0,0,0');
  events.sendCommand('IndirektJonasWWAll_Brightness', '100');
}
if (itemRegistry.getItem('MyItem').getState() == 'LONG_PRESSED') {
  events.sendCommand('IndirektJonasRGBAll_Color', '0,0,0');
  events.sendCommand('IndirektJonasWWAll_Brightness', '0');
}
Euch schonmal vielen Dank

Benutzeravatar
udo1toni
Beiträge: 15265
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Lichtfarbe per tasten ändern

Beitrag von udo1toni »

Du kannst nicht vor der Definition der lokalen Variablen den Wert abfragen. Die Zeile

Code: Alles auswählen

LichtStatus = (typeof LichtStatus == 'number' ? LichtStatus : 0);
sorgt dafür, dass die Variable LichtStatus den alten Wert erhält, falls es einen alten Wert gibt. Existiert kein alter Wert, so wird 0 als Wert gesetzt.
Diese Zeile muss unmittelbar nach der Definition der Variablen kommen und darf nicht mit irgendwelchen if-Anweisungen gekoppelt sein.
Stattdessen zählst Du einfach anschließend hoch:

Code: Alles auswählen

var LichtStatus;
LichtStatus = (typeof LichtStatus == 'number' ? LichtStatus : 0);
LichtStatus = LichtStatus + 1;
if(LichtStatus > '6') LichtStatus = 0;

if (LichtStatus == '0') {
  events.sendCommand('IndirektJonasWWAll_Brightness', '0');
  events.sendCommand('IndirektJonasRGBAll_Color', '0,0,0');
} else if (LichtStatus == '1') {
  events.sendCommand('IndirektJonasRGBAll_Color', '0,0,0');
  events.sendCommand('IndirektJonasWWAll_Brightness', '50');
} else if (LichtStatus == '2') {
  events.sendCommand('IndirektJonasRGB1_Color', '119,100,50');
  events.sendCommand('IndirektJonasRGB2_Color', '0,0,50');
  events.sendCommand('IndirektJonasRGB5_Color', '119,100,50');
  events.sendCommand('IndirektJonasRGB6_Color', '0,0,50');
  events.sendCommand('IndirektJonasRGB3_Color', '119,100,50');
  events.sendCommand('IndirektJonasRGB4_Color', '0,0,50');
} else if (LichtStatus == '3') {
  events.sendCommand('IndirektJonasRGB1_Color', '0,100,50');
  events.sendCommand('IndirektJonasRGB2_Color', '100,100,100');
  events.sendCommand('IndirektJonasRGB3_Color', '130,100,50');
  events.sendCommand('IndirektJonasRGB4_Color', '150,100,50');
  events.sendCommand('IndirektJonasRGB5_Color', '170,100,50');
  events.sendCommand('IndirektJonasRGB6_Color', '140,100,50');
} else if (LichtStatus == '4') {
  events.sendCommand('IndirektJonasRGB1_Color', '180,100,50');
  events.sendCommand('IndirektJonasRGB2_Color', '190,100,50');
  events.sendCommand('IndirektJonasRGB3_Color', '200,100,50');
  events.sendCommand('IndirektJonasRGB4_Color', '210,100,50');
  events.sendCommand('IndirektJonasRGB5_Color', '220,100,50');
  events.sendCommand('IndirektJonasRGB6_Color', '230,100,50');
} else if (LichtStatus == '5') {
  events.sendCommand('IndirektJonasRGBAll_Color', '0,0,0');
  events.sendCommand('IndirektJonasWWAll_Brightness', '30');
} else if (LichtStatus == '6') {
  events.sendCommand('IndirektJonasRGBAll_Color', '0,0,0');
  events.sendCommand('IndirektJonasWWAll_Brightness', '100');
}
if (itemRegistry.getItem('MyItem').getState() == 'LONG_PRESSED') {
  events.sendCommand('IndirektJonasRGBAll_Color', '0,0,0');
  events.sendCommand('IndirektJonasWWAll_Brightness', '0');
}
Eventuell kannst Du auch statt

Code: Alles auswählen

LichtStatus = LichtStatus + 1;

Code: Alles auswählen

LichtStatus += 1;
schreiben.
Weiterhin könnte es sein, dass es eine switch-case-Anweisung gibt (ich hab das noch nicht getestet...)

Code: Alles auswählen

switch(LichtStatus){
  case '0' : 
    events.sendCommand('IndirektJonasWWAll_Brightness', '0');
    events.sendCommand('IndirektJonasRGBAll_Color', '0,0,0');
    break;
  case '1' : 
    events.sendCommand('IndirektJonasRGBAll_Color', '0,0,0');
    events.sendCommand('IndirektJonasWWAll_Brightness', '50');
    break;
...
}
das sieht etwas hübscher aus als das else if()

Eventuell wäre es sinnvoll, vor der Wertbestimmung auf LONG_PRESSED zu prüfen (also nach var und Wertzuweisung, aber vor dem + 1) und die Rule abzubrechen, falls LONG_PRESSED detektiert wurde (mit return;), also einfach den untersten if-Block nach oben und noch das return; ergänzen.

Ach so... Falls die Rule das erste Mal läuft, wird natürlich die Variable LichtStatus keinen gültigen Wert enthalten. Vielleicht ist es sinnvoll, den Wert dann auf -1 zu setzen, damit als erste Szene die Szene 0 geladen wird. also so:

Code: Alles auswählen

LichtStatus = (typeof LichtStatus == 'number' ? LichtStatus : -1);
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

ChrisNRW1987
Beiträge: 4
Registriert: 28. Aug 2021 19:12
Answers: 0

Re: Lichtfarbe per tasten ändern

Beitrag von ChrisNRW1987 »

Vielen lieben Dank. Es funktioniert wunderbar. Danke

Antworten