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

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Motoko
Beiträge: 8
Registriert: 12. Okt 2021 21:50

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

Beitrag 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))

Motoko
Beiträge: 8
Registriert: 12. Okt 2021 21:50

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

Beitrag 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!

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

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

Beitrag 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...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Motoko
Beiträge: 8
Registriert: 12. Okt 2021 21:50

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

Beitrag 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).

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

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

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Stefbert
Beiträge: 3
Registriert: 29. Dez 2021 00:23

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

Beitrag 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

Motoko
Beiträge: 8
Registriert: 12. Okt 2021 21:50

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

Beitrag von Motoko »

Der Unterschied zwischen der ersten und der zweiten Zeile ist der Strichpunkt in der Mitte nach der Klammer.

Antworten