Seite 1 von 1

Wie mit Hue Binding per JS faden? (Doku nur für DSL)

Verfasst: 12. Okt 2021 22:04
von Motoko
Ich würde gerne eine Hue Birne langsam ausfaden lassen. Das sollte laut Doku des Hue Bindings ja gehen. Leider ist die Doku nur für DSL geschrieben, ich würde das aber gerne in meinem JS/ECMA-Script in OH 3.1.0 nutzen. Wahrscheinlich verstehe ich nur das Umwandlungskonzept nicht (was ist das "getActions" Pendant?), daher die simple Frage: Wie kriege ich das folgende Beispiel-DSL-Script in JS umgewandelt?

Code: Alles auswählen

val hueActions = getActions("hue","hue:0210:00178810d0dc:1")
hueActions.fadingLightCommand("color", new PercentType(100), new DecimalType(1000))

Re: Wie mit Hue Binding per JS faden? (Doku nur für DSL)

Verfasst: 26. Okt 2021 11:03
von Motoko
Entschuldigt bitte, aber ist meine Frage zu plump oder zu kompliziert?
Vielleicht war meine Überschrift falsch gewählt, denn in erster Linie geht es ja nichtmal um Hue, sondern darum, wie ein DSL-Codebeispiel in JS umgewandelt werden kann.
Ich würde mich sehr freuen, eine Antwort dazu zu erhalten!

Re: Wie mit Hue Binding per JS faden? (Doku nur für DSL)

Verfasst: 26. Okt 2021 16:03
von udo1toni
Nein, das Problem dürfte eher darin begründet sein, dass Niemand JS/ECMA nutzt...

Die Zeile

Code: Alles auswählen

val hueActions = getActions("hue","hue:0210:00178810d0dc:1")
erzeugt einen Handle auf die nutzbaren Actions aus dem hue Binding, bezogen auf die UID hue:0210:00178810d0dc:1. Man muss also pro Lampe ein Handle erzeugen.

Anschließend kann man mit dem Handle den fade-Befehl senden, also fadingLightCommand(Kanal,Befehl,Dauer), wobei Kanal angibt, welcher Kanal gefadet werden soll, die Helligkeit, die Farbe, die Farbtemperatur oder der Schaltkanal, wobei Letzterer irgendwie sinnlos ist (hat ja nur zwei Zustände).
Der Befehl ergibt sich aus dem verwendeten Kanal, die Dauer ist in Millisekunden anzugeben, wobei der Wert in Zehntelsekunden genutzt wird (die letzten zwei Stellen sollten also immer 0 sein)

Der Fade-Befehl ist in der Lampe selbst eingebaut, das ist auch der Grund, warum man den Handle pro Lampe erzeugen muss.

Wie Du dieActions aus JavaScript heraus nutzen kannst, kann ich nur raten... im englischen Forum hat rlkoshak hier shcon eine MAnge zusammengetragen, hier ein kleiner Ausschnitt:

Code: Alles auswählen

(function(context) {
  'use strict';

  /**
   * Sends the message to email and notifications based on time of day.
   * @param {string} message string to send out as an alert message
   */
  context.sendAlert = function(message) {
    var log = (context.logger === undefined) ? Java.type("org.slf4j.LoggerFactory").getLogger("org.openhab.model.script.Rules.sendAlert") : context.logger;
    log.warn("ALERT: " + message);

    var night = context.items["TimeOfDay"] == "NIGHT" || context.items["TimeOfDay"] == "BED";
    if(!night){
      // TODO add push notification
      context.actions.get("mail", "mail:smtp:gmail").sendMail("rlkoshak@gmail.com", "openHAB 3 Alert", message);
    }
    else {
      // TODO Only send emails at night
      context.actions.get("mail", "mail:smtp:gmail").sendMail("rlkoshak@gmail.com", "openHAB 3 Night Alert", message);
    }
  }
Das verleitet mich zu der Annahme, dass der Handle ungefähr so zu verwenden ist:

Code: Alles auswählen

context.actions.get("hue","hue:0210:00178810d0dc:1").fadingLightCommand("color", new PercentType(100), new DecimalType(1000));
Was aber in diesem Zusammenhang context ist, ist mir auch nicht ganz klar. Also, außer dass es der Parameter der Funktion ist...

Re: Wie mit Hue Binding per JS faden? (Doku nur für DSL)

Verfasst: 27. Okt 2021 16:11
von Motoko
Danke! "actions.get" statt "getActions" war wohl der Hinweis, den ich gebraucht habe. So gehts:

Code: Alles auswählen

var hueActions = actions.get("hue","hue:0210:00178810d0dc:1")
hueActions.fadingLightCommand("brightness", new PercentType(100), new DecimalType(1000));
Warum nutzt niemand JS/ECMA? Historisch bedingt? Ich bin jetzt mit OH3 eingestiegen und irgendwie erschien es mir sinnvoller mit JS zu arbeiten und bislang hat ja auch alles problemlos funktioniert (mal abgesehen von diversen Dokumentationslücken).

Re: Wie mit Hue Binding per JS faden? (Doku nur für DSL)

Verfasst: 27. Okt 2021 23:56
von udo1toni
Ein Stück weit ist das sicherlich historisch bedingt.

Allerdings ist es auch so, dass die DSL halt, nun ja, eine DSL (DomainSpecificLanguage) ist. Sie ist also exakt auf die openHAB Bedürfnisse zugeschnitten.

Es gibt einige Dinge, die in der DSL nicht möglich oder vorgesehen sind, z.B. Funktionen (auch wenn man mit Lambdas zumindest teilweise Ersatz hat). Allerdings muss man auch feststellen, dass es oftmals sehr elegante Möglichkeiten gibt, die die fehlenden Funktionen unnötig machen.

Will ich auf ein Item zugreifen, dann schreibe ich einfach den Itemnamen hin. Will ich auf einen Member einer Group zugreifen, schreibe ich MyGroup.members.filter[|<Eigenschaft, die das ITem eindeutig identifiziert>].head
Will ich eine Gruppe Items gleichartig steuern, so nutze ich ebenfalls einfach die Group (mit forEach), ob nun gefiltert oder nicht.

Die DSL ist extrem mächtig und wenn man mal ein paar Regeln damit geschrieben hat, ist es auch eine sehr einfach zu erlernende Sprache.

Re: Wie mit Hue Binding per JS faden? (Doku nur für DSL)

Verfasst: 2. Jan 2022 20:22
von Stefbert
Hallo Motoko,

ich versuche gerade ein ähnliches Problem zu lösen, allerdings mit Blockly, wo ich versuche mir eine Komponente zu bauen, um das fadingLightCommand grafisch nutzen zu können. Jetzt bin ich gerade über Deinen Code gestolpert und dachte mir ... genau das, was ich brauche. Allerdings wirft der Code bei mir den Fehler:

Code: Alles auswählen

==> openhab.log <==
2022-01-02 20:14:08.220 [ERROR] [e.automation.internal.RuleEngineImpl] - Failed to execute rule 'aaaa': Fail to execute action: 2
Action 2 ist nach meiner Vermutung die eigentliche fadingLightCommand Action.

Ich habe auch schon verschiede Varianten ausprobiert ...

Code: Alles auswählen

var hueActions = actions.get("hue",'hue:group:02648f68d9:14') hueActions.fadingLightCommand("brightness", 100, dimTime);
var hueActions = actions.get("hue",'hue:group:02648f68d9:14'); hueActions.fadingLightCommand("brightness", 100, dimTime);
var hueActions = actions.get("hue",'hue:group:02648f68d9:14').fadingLightCommand("brightness", 100, dimTime);
Aber alles führt zum gleichen Fehler. Hättest Du u.U. noch eine Idee, was die Ursache dafür sein könnte?

Vielen Dank und freundliche Grüße
Stef

Re: Wie mit Hue Binding per JS faden? (Doku nur für DSL)

Verfasst: 4. Jan 2022 10:07
von Motoko
Der Unterschied zwischen der ersten und der zweiten Zeile ist der Strichpunkt in der Mitte nach der Klammer.