Seite 1 von 1

DSL Rule vs. JavaScript

Verfasst: 26. Aug 2023 14:07
von Willi Brumm
Moin Leute!

ich steh mal wieder auf dem Schlauch.

Ich habe folgendes Script (DSL), was tadellos funktioniert:

Code: Alles auswählen

if (IKEA_Dimmer_Button_Regal_IKEA_Dimmer_Button_Regal.getState == "on")
        IKEA_TRADFRI_Regal_IKEA_Regal_switch.sendCommand(ON)
if (IKEA_Dimmer_Button_Regal_IKEA_Dimmer_Button_Regal.getState == "off")
        IKEA_TRADFRI_Regal_IKEA_Regal_switch.sendCommand(OFF)
Ist nur zu Testzwecken, also bitte nicht auf die Labels achten :D

Zur Info:
"IKEA_Dimmer_Button_Regal_IKEA_Dimmer_Button_Regal" ist ein String-Item mit dem Inhalt "on" oder "off"
"IKEA_TRADFRI_Regal_IKEA_Regal_switch" ist ein switch-Item

Möchte das Ganze nun in Javascript umsetzten. Hier habe ich folgendes Script:

Code: Alles auswählen

var regal = items.getItem("IKEA_TRADFRI_Regal_IKEA_Regal_switch");
var button = items.getItem("IKEA_Dimmer_Button_Regal_IKEA_Dimmer_Button_Regal");
if (button == "on"){
  regal.sendCommand("ON");
}
f (button == "off"){
  regal.sendCommand("OFF");
}


Die "sendCommand- Funktion" funktioniert, wenn ich sie einzeln aufrufe.
Es scheitert an dem Vergleich auf "on" bzw. "off". Ich bin davon ausgegangen, dass die Variable Button einen String enthält, auf den ich dann direkt Vergleichen kann?!
Da liege ich wohl falsch.....

Vorab vielen Dank für die Hilfe ;-)
ikea2.png
ikea1.png

Re: DSL Rule vs. JavaScript

Verfasst: 26. Aug 2023 14:39
von udo1toni
Erste Frage: Warum?
Vermutlich ist schon das String Item unnötig. Die Rule ist es mit hoher Wahrscheinlichkeit ebenfalls.
Warum willst Du unbedingt JavaScript verwenden?

Wenn Du auf den Status eines Items zugreifen willst, musst Du das auch tun, und nicht auf das Item selbst zugreifen. Das hier:

Code: Alles auswählen

items.getItem("IKEA_TRADFRI_Regal_IKEA_Regal_switch");
entspricht exakt diesem hier:

Code: Alles auswählen

IKEA_Dimmer_Button_Regal_IKEA_Dimmer_Button_Regal
In der DSL greifst Du auf den Status mit .state zu, in JavaScript evtl. mit .getState, aber in beiden Fällen muss das explizit erfolgen, denn ein Item hat noch mehr Eigenschaften außer dem Status.

Bezüglich meiner Ersten Anmerkung (das unnötige String Item): Du kannst einfach einen switch Channel definieren, dort gibt es die beiden Parameter onValue und offValue, dort trägst Du dann on und off ein und das Addon macht daraus automatisch ON und OFF.

Re: DSL Rule vs. JavaScript

Verfasst: 26. Aug 2023 15:28
von Willi Brumm
Danke für deine schelle Antwort.

Ich versuche mal meine Gedanken zusamen zu fassen :-)
Warum willst Du unbedingt JavaScript verwenden?
Es gibt dafür keinen wirklichen Grund. Ich hatte immer den Eindruck, dass JS ein wenig übersichtlicher ist (zumindest im OH Editor) und einfach öfter verwendet wird.

In "meiner Welt" denke ich mir das so:
- ich schaue, was mir der Button als String liefert (on/off)
- liefert der Button "on" --> Lampe an
- liefert der Button "off" -- > Lampe aus
(später, abhängig vom String, weitere Aktionen ausführen)

Von mir aus bleibe ich auch beim DSL, :lol: jedoch verstehe nicht ganz, warum...

Code: Alles auswählen

items.getItem("IKEA_TRADFRI_Regal_IKEA_Regal_switch");
exakt das Gleiche ist wie:

Code: Alles auswählen

IKEA_Dimmer_Button_Regal_IKEA_Dimmer_Button_Regal
Es handelt sich doch um zwei Verschiedene Geräte (Things)
- IKEA Tradfri LED Treiber
- IKEA On/off Button

Hier ist die Namenswahl etwas verwirrend, glaube ich :-)

Beide Things sind über zigbee2mqtt eingebunden, entsprechende Channels sind erstellt und mit Items verlinkt.

Den LED Treiber steuere ich (auch dank deiner Hilfe) über Alexa (on/off und Dimmer). Was ich nun erreichen möchte, ist ein zusätzlicher Taster, (der IKEA-Button) der den LED-Treiber steuert.
Im DSL Script klappt das mit on/off ja ohne Probleme. Später soll da noch der Staus vom Button auf "brightnes_move_up" usw. verglichen werden, zwecks Dimm-Funktion.

Re: DSL Rule vs. JavaScript

Verfasst: 26. Aug 2023 15:55
von Willi Brumm
Kleine Ergänzung noch:

Ich glaube, ich habe verstanden, was du meinst. ☺️

Ich verstehe das so:
Ich kann den Channel (on/off) des LED Treibers direkt mit dem item des Buttons verlinken, und mir so das komplette Script sparen?!
Dann könnte ich das gleiche mit dem Dimmer Channel des LED Treibers machen, um so „brightness_move_up“ etc. weiterzugeben.

Re: DSL Rule vs. JavaScript

Verfasst: 26. Aug 2023 22:43
von udo1toni
Ah, ich habe gar nicht drauf geachtet, dass es sich um zwei unterschiedliche Items handelt...
Mein Punkt war: In der DSL schreibst Du z.B. meinItem, wenn es um das Item meinItem geht. In JavaScript musst Du stattdessen items.getitem("meinItem") schreiben.
Wenn Du auf den Status zugreifst, musst Du das aber so oder so explizit tun, also in der DSL meinItem.state und in JavaScript items.getitem("meinItem").getState

Und alleine schon wegen des umständlichen Zugriffs auf das Item (und das ist quasi 99% dessen, was Rules machen) mag ich die DSL lieber :)
Die DSL muss nicht zusätzlich installiert werden und sie ist echt einfach. Ich kann Rules bequem über VS Code in Textdateien erstellen und bekomme Syntax Highlighting, autocompletion und was weiß ich nicht noch alles. VS Code zeigt mir Inline den aktuellen Status jedes verwendeten Items an, bei Group Items zeigt es mir die Member an - samt Status - und es gibt noch weitere Komfortfunktionen.
JavaScript hat durchaus Vorteile gegenüber der DSL, allerdings geht es oftmals auch darum, dass die DSL Dinge anders löst (bzw. der Anwender sollte Probleme auf eine bestimmte Art lösen, die er z.B. in JavaScript auf andere Weise lösen würde).
Willi Brumm hat geschrieben: 26. Aug 2023 15:55 Ich kann den Channel (on/off) des LED Treibers direkt mit dem item des Buttons verlinken, und mir so das komplette Script sparen?!
Dann könnte ich das gleiche mit dem Dimmer Channel des LED Treibers machen, um so „brightness_move_up“ etc. weiterzugeben.
Sofern die Itemtypen passen, ja.
Beim Dimmen wird es vermutlich etwas schwierig, es sei denn, der Taster sendet zyklisch solange er gedrückt ist.
Gewöhnlich wird man ja zwei Taster nutzen, einer für ON/heller, der andere für OFF/Dunkler, kurzer Druck schaltet, langer Druck dimmt. Oftmals werden solche Taster dann z.B. SHORT_PRESSED bei kurzem Druck senden, LONG_PRESSED beim langen Drücken und RELEASED beim Loslassen nach langem Druck. Ein/Aus ist noch simpel realisierbar, für das eigentliche Dimmen wirst Du aber um eine Rule nicht herum kommen, insofern kann man dann auch ON/OFF über die Rule erledigen.

Re: DSL Rule vs. JavaScript

Verfasst: 27. Aug 2023 09:35
von Harka
udo1toni hat geschrieben: 26. Aug 2023 22:43 ...Mein Punkt war: In der DSL schreibst Du z.B. meinItem, wenn es um das Item meinItem geht. In JavaScript musst Du stattdessen items.getitem("meinItem") schreiben.
Wenn Du auf den Status zugreifst, musst Du das aber so oder so explizit tun, also in der DSL meinItem.state und in JavaScript items.getitem("meinItem").getState...
kleine Anmerkung: im aktuellem JavaScript reicht items.meinItem.state
https://www.openhab.org/addons/automati ... ing/#items

Re: DSL Rule vs. JavaScript

Verfasst: 27. Aug 2023 10:17
von udo1toni
Ah, gut, ein Fortschritt :)

Re: DSL Rule vs. JavaScript

Verfasst: 27. Aug 2023 12:58
von Willi Brumm
Vielen Dank,

dank udo1toni und Harka, konnte ich mein Problem lösen: Mein licht leuchtet nun auch mit Javascript.....

ob ich jetzt mit DSL oder Javscript weitermache, weiß ich noch nicht ;-)

Jedenfalls kann ich jetzt auf euren Antworten und Lösungen aufbauen. Manchmal ist es so einfach..... man braucht nur einen kleinen Schubser in die richtige Richtung.

DANKE

Re: DSL Rule vs. JavaScript

Verfasst: 27. Aug 2023 20:44
von Willi Brumm
Zur Info hier nochmal das fertige Script (in Javascript ;-))

Getriggert wird die Rule durch Update des Buttons.

Code: Alles auswählen

var button = items.getItem("IKEA_Dimmer_Button");
var regalSwitch = items.getItem("IKEA_TRADFRI_Regal_IKEA_Regal_switch");  // LED Treiber IKEA = IKEA ICPSHC24-10EU-IL-1 via MQTT
var regalDimmer = items.getItem("IKEA_TRADFRI_Regal_Dimmer_String");	// Button IKEA on/off switch = IKEA E1743 via MQTT

if (button.state == "on"){
    regalSwitch.sendCommand("ON");  // LED on with last brightness value
}
if (button.state == "off"){
    regalSwitch.sendCommand("OFF"); // LED off
}
if (button.state == "brightness_move_up"){
    regalDimmer.sendCommand('{"brightness_move": 80 }'); // increase brightness 80 units per second
}
if (button.state == "brightness_move_down"){
    regalDimmer.sendCommand('{"brightness_move": -80 }'); // decrease brightness 80 units per second
}
if (button.state == "brightness_stop"){
    regalDimmer.sendCommand('{"brightness_move": 0 }'); // stop fading
}
Mega viel dazugelernt und endlich funktioniert es! So macht das Rumbasteln mit Openhab Spaß :-)