Wie globale Variable speichern oder Script Global verfügbar machen?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Wie globale Variable speichern oder Script Global verfügbar machen?

Beitrag von udo1toni »

Jensemann_P hat geschrieben: 5. Aug 2021 19:17Genau diese Berechnung ist der Punkt an dem ich hänge (nicht die Berechnung, sondern wo/wie die Implementiert wird).
Ich bin soweit, dass ich schon einiges an Gateways und things habe. Aus den vorhandenen Things hab ich mir dann auch über den Assistenten Items erstellt. So z.B. für meine EnOcean h/t Sensoren. Ich müsste jetzt also als Globales Objekt ein eigenes Item kreieren (vermute dann Textbasiert?)
Kann ich nun meine Taupunktberechnung in diesem Item direkt einbinden mit Channels aus den vorhandenen things, oder muss ich die Änderungen von h/t in den Items welche die Sensoren repräsentieren als Event abfangen, meinen Taupunkt außen in einer Rule berechnen und dass dann in mein "ItemTaupunktAussen" speichern?
Es gibt verschiedene Möglichkeiten, das Problem gescheit umzusetzen, aber keine davon beinhaltet Blockly. Der einfache Grund: Blockly erlaubt es nicht, frei Funktionen zu programmieren (meines Wissens)

Ungebundene Items kannst Du ganz einfach über die Main UI erstellen wie jedes andere Item auch (natürlich vorausgesetzt, Du legst ein Item überhaupt selbst an… Ich mutmaße, dass all Deine bisherigen Items halbautomatisch von openHAB erzeugt wurden. Schau mal unter Einstellungen -> Items. Da gibt es genau wie bei den Things das weiße Plus in blauem Kreis. Man muss keinen Text eingeben (also außer den, den man in die Felder einträgt, wie auch beim automatischen Erzeugen von Items)
Jensemann_P hat geschrieben: 5. Aug 2021 15:07hier geht es mir z.B. darum, wie ich meine halbe Stunde Sperrzeit (Intervalllüftung) hinbekomme. Wenn ich das z.B. im Script als Wait/Sleep (Sofern es hier sowas gibt), würde das ja im Prinzip schon reichen, auch ohne Timer. Dann erneute Abfrage der Randparameter (die sich ja zwischenzeitlich auch hätten ändern können) und somit Loop bis eben irgendein Parameter die Randbedinung False werden lässt. Da in OH3 scheinbar jedes Script seinen eigenen Thread hat, müsste dieses Vorgehen ja funktioniere. Oder gibt es so toll implementierte Timer, dass die sich auch schon für solch ganz einfache Aufgaben eignen? Wie dann vorgehen wenn so ein Timer laufen würde und durch wertänderung würde das Event auslösen und das Script neu starten? Im Script einfach abfragen ob dann "TimerLueftungsIntervallHeizraum" noch aktiv ist?
Ein Thread::sleep() ist die schlechteste aller Möglichkeiten. Ich vermisse meinen Threadpool schon jetzt.

Ein Item mit expire-Option ist die bequemste Variante. Du setzt das Item in Deiner Rule z.B. auf ON. Wenn die Rule aufgerufen wird, prüfst Du, od das Item auf OFF steht. Ist das der Fall, läuft die Rule wie geplant weiter, ansonsten bricht sie ab. Der über expire eingestellte Timer setzt das Item nach Ablauf wieder auf OFF, so dass die Rule umgehend wieder aktiv ist. Wenn die Rule bei jedem changed Ereignis der beiden Messwerte triggert, musst Du Dic um sonst gar nichts mehr kümmern, denn die Rule macht alles alleine.
Jensemann_P hat geschrieben: 5. Aug 2021 15:07mein Handy-Autocorrect hatte da aus Timern Zimemrn gemacht.
:)
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

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

Re: Wie globale Variable speichern oder Script Global verfügbar machen?

Beitrag von udo1toni »

Jensemann_P hat geschrieben: 5. Aug 2021 19:28 Es gibt so viele Varianten/Sprachen. Soweit ich das sehe ist Blockly also sehr neu dazugekommen. Was ist denn die verbreitetste Variante?
Dieses ECMA? Das ist im Prinzip Javascript, oder? Blockly generiert im Prinzip ECMA-Gerüste im Hintergrund?

Was ist dieses DSL? Lohnt sich das, oder ist das ein totes Gleis oder gar abgekündigt?

Dann habe ich noch gelesen, das man wohl auch irgendwie mit Java und Python dran kommt.
Im Moment fühle ich mich ein wenig wie bei meinen Versuchen mit Linux Warm zu werden (Jaaaaa, das geht gaaanz einfach in diesen 12 Dateien hier im hinterletzten Ordner, aber bei der Distri ist das dann trotzdem alles anders. Aber sobald du mal den Kernel auswendig kennst, ist es überhaupt kein Problem mehr eine Webseite zu öffnen). Jetzt sehr übertrieben dargestellt.

Aktuell scheint es keine Lektrüe/Schulungen zu OH3 zu geben, oder? Ich schätze, dass das Buch zu OH2 auch schon Hoffnungslos hintendran ist?
Könnt ihr mir vl brauchbare Tutorials empfehlen?
Ich schwöre nach wie vor auf die DSL (Domain Specific Language), die auch weiterhin aktuell ist. Aber das ist ja Geschmacksache :) deshalb gibt es auch so viele mögliche Alternativen.
Die DSL ist auf XTend aufgesetzt, damit kann man seine eigene DSL programmieren. XTend wiederum ist in Java programmiert, so dass gewisse Ähnlichkeiten nicht zu leugnen sind.

Das Buch von Marianne Spiller ist nach wie vor eine gute Lektüre, hat aber naturgemäß viele Informationen, die ob der UI nicht mehr stimmen (OH2->Paper UI, OH3->Main UI)
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Jensemann_P
Beiträge: 162
Registriert: 26. Jul 2021 20:14
Answers: 0

Re: Wie globale Variable speichern oder Script Global verfügbar machen?

Beitrag von Jensemann_P »

udo1toni hat geschrieben: 5. Aug 2021 19:33
Jensemann_P hat geschrieben: 5. Aug 2021 19:17Genau diese Berechnung ist der Punkt an dem ich hänge (nicht die Berechnung, sondern wo/wie die Implementiert wird).
Ich bin soweit, dass ich schon einiges an Gateways und things habe. Aus den vorhandenen Things hab ich mir dann auch über den Assistenten Items erstellt. So z.B. für meine EnOcean h/t Sensoren. Ich müsste jetzt also als Globales Objekt ein eigenes Item kreieren (vermute dann Textbasiert?)
Kann ich nun meine Taupunktberechnung in diesem Item direkt einbinden mit Channels aus den vorhandenen things, oder muss ich die Änderungen von h/t in den Items welche die Sensoren repräsentieren als Event abfangen, meinen Taupunkt außen in einer Rule berechnen und dass dann in mein "ItemTaupunktAussen" speichern?
Es gibt verschiedene Möglichkeiten, das Problem gescheit umzusetzen, aber keine davon beinhaltet Blockly. Der einfache Grund: Blockly erlaubt es nicht, frei Funktionen zu programmieren (meines Wissens)

Kann ich denn in den anderen Scriptvarianten wiederkehrende Funktionen in einzelne Scripte verpacken und dann als Funktionen aufrufen oder als sub laufen lassen?

Ungebundene Items kannst Du ganz einfach über die Main UI erstellen wie jedes andere Item auch (natürlich vorausgesetzt, Du legst ein Item überhaupt selbst an… Ich mutmaße, dass all Deine bisherigen Items halbautomatisch von openHAB erzeugt wurden. Schau mal unter Einstellungen -> Items. Da gibt es genau wie bei den Things das weiße Plus in blauem Kreis. Man muss keinen Text eingeben (also außer den, den man in die Felder einträgt, wie auch beim automatischen Erzeugen von Items)

bisher wurden meine items alle mit dem Assistenten aus den vorhandenen Things kreiert. Muss mich echt mal mit den Möglichkeiten Auseinandersetzen.

Ein Item mit expire-Option ist die bequemste Variante. Du setzt das Item in Deiner Rule z.B. auf ON. Wenn die Rule aufgerufen wird, prüfst Du, od das Item auf OFF steht. Ist das der Fall, läuft die Rule wie geplant weiter, ansonsten bricht sie ab. Der über expire eingestellte Timer setzt das Item nach Ablauf wieder auf OFF, so dass die Rule umgehend wieder aktiv ist. Wenn die Rule bei jedem changed Ereignis der beiden Messwerte triggert, musst Du Dic um sonst gar nichts mehr kümmern, denn die Rule macht alles alleine.

Ok, das klingt vom vorgehen ja sehr nach dem was ich suche. Kann ich denn den Teil "Wert aus Channel a thing x und Wert aus Channel B thing x verrechnen und in Wert C im eigenen Item y speichern" im Item als Verhalten hinterlegen, oder läuft das über Rules (betrifft hier zb die taupunktberechnung)
Jensemann_P hat geschrieben: 5. Aug 2021 15:07mein Handy-Autocorrect hatte da aus Timern Zimemrn gemacht.
:)

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

Re: Wie globale Variable speichern oder Script Global verfügbar machen?

Beitrag von udo1toni »

Jensemann_P hat geschrieben: 5. Aug 2021 20:14 Kann ich denn in den anderen Scriptvarianten wiederkehrende Funktionen in einzelne Scripte verpacken und dann als Funktionen aufrufen oder als sub laufen lassen?
Ja, Funktionen sind möglich, aber nicht über die UI. Allerdings muss man dazu auch erwähnen, dass "eigentlich" importierbare Module eingebunden werden können sollen, die man dann auch direkt in Rules verwenden kann. Ich habe das allerdings bisher noch nicht zu Gesicht bekommen :) also vielleicht kommt dieses Killerfeature morgen...
Jensemann_P hat geschrieben: 5. Aug 2021 20:14 bisher wurden meine items alle mit dem Assistenten aus den vorhandenen Things kreiert. Muss mich echt mal mit den Möglichkeiten Auseinandersetzen.
Unbedingt. Nur mit den Assistenten kratzt Du ja nicht mal an der Oberfläche...
Jensemann_P hat geschrieben: 5. Aug 2021 20:14 Ok, das klingt vom vorgehen ja sehr nach dem was ich suche. Kann ich denn den Teil "Wert aus Channel a thing x und Wert aus Channel B thing x verrechnen und in Wert C im eigenen Item y speichern" im Item als Verhalten hinterlegen, oder läuft das über Rules (betrifft hier zb die taupunktberechnung)
Das geht nur über eine Rule. Mit Einschränkungen. Man kann auch eine Java Script Transformation verwenden, wenn alle benötigten Ausgangswerte in einem gemeinsamen String liegen (also z.B. ein JSON Objekt), kann man dieses Objekt in Teilobjekte zerlegen und die Berechnung direkt in der Transformation durchführen. Das ist aber eher ein Spezialfall...

Kurze Randbemerkung: Kannst Du bitte versuchen, die Zitatfunktion so zu nutzen, wie sie gedacht ist? Ich weiß, per Handy zeitraubend...
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Jensemann_P
Beiträge: 162
Registriert: 26. Jul 2021 20:14
Answers: 0

Re: Wie globale Variable speichern oder Script Global verfügbar machen?

Beitrag von Jensemann_P »

Hi nochmal und zunächst vielen vielen Dank für deine vielen und hilfreichen Antworten!

Ich schäme mich ja schon selbst und versuche die Zitatfunktion auch wirklich zu verstehen. Bisher scheitere ich daran zu meiner Schande :-(

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

Re: Wie globale Variable speichern oder Script Global verfügbar machen?

Beitrag von udo1toni »

Eigentlich ist es ganz einfach. Du gehst auf Zitat, dann generiert die Forensoftware ein komplettes Zitat des Postings, z.B.:
Jensemann_P hat geschrieben: 5. Aug 2021 22:22 Hi nochmal und zunächst vielen vielen Dank für deine vielen und hilfreichen Antworten!

Ich schäme mich ja schon selbst und versuche die Zitatfunktion auch wirklich zu verstehen. Bisher scheitere ich daran zu meiner Schande :-(
Im Text werden zwei BBCodes angezeigt, die Zitateinleitung (beginnt mit dem Wort quote) und die Endemarke (ebenfalls das Wort quote, aber mit vorangestelltem Slash). Beide sind mit Eckigen Klammern eingerahmt. Diese Elemente kannst Du einfach in die Zwischenablage kopieren, und zwar Ende zuerst und Anfang danach. Sieht dann z.B. so aus:

Code: Alles auswählen

[/quote]
[quote=Jensemann_P post_id=36585 time=1628194928 user_id=5379]
Den Text fügst Du nun überall da ein, wo Du das Zitat um eigenen Text ergänzen willst. also z.B. so:

Code: Alles auswählen

[quote=Jensemann_P post_id=36585 time=1628194928 user_id=5379]
Hi nochmal und zunächst vielen vielen Dank für deine vielen und hilfreichen Antworten!
[/quote]
[quote=Jensemann_P post_id=36585 time=1628194928 user_id=5379]
Ich schäme mich ja schon selbst 
[/quote]
[quote=Jensemann_P post_id=36585 time=1628194928 user_id=5379]
und versuche die Zitatfunktion auch wirklich zu verstehen. Bisher scheitere ich daran zu meiner Schande :-(
[/quote]
Dann noch schnell den eigenen Text ergänzt, zwischen schließendem und öffnendem BBCode, und ein Klick auf den Vorschau-Button verrät Dir sofort, ob das alles so aussieht, wie Du Dir das vorgestellt hast, also so:
Jensemann_P hat geschrieben: 5. Aug 2021 22:22 Hi nochmal und zunächst vielen vielen Dank für deine vielen und hilfreichen Antworten!
Aber gerne!
Jensemann_P hat geschrieben: 5. Aug 2021 22:22 Ich schäme mich ja schon selbst
Musst Du nicht :) es ist noch kein Meister vom Himmel gefallen.
Jensemann_P hat geschrieben: 5. Aug 2021 22:22 und versuche die Zitatfunktion auch wirklich zu verstehen.
Und natürlich kann man den zitierten Text auch sinnvoll kürzen ;) es geht ja meist darum, klar zu machen, auf welchen Teil des Textes man antwortet.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Jensemann_P
Beiträge: 162
Registriert: 26. Jul 2021 20:14
Answers: 0

Re: Wie globale Variable speichern oder Script Global verfügbar machen?

Beitrag von Jensemann_P »

Danke dir, jetzt hab ich das wieder gerafft. phpBB ist lange her, bin da durch 10 Jahre Social MEdia only ziemlich aus der Übung ;-)


Ich habe mir jetzt mal folgende Implementierung angeschaut und versucht abzuwandeln:
https://knx-user-forum.de/forum/support ... ssteuerung

Scheint sich auf eine ältere Version von OH zu beziehen. Die Syntax und vor allem die imports und der Teil "val org.eclipse.xtext.xbase.lib.Functions$Function2 calculateDewPoint = [" sagen mir jetzt überhaupt ncihts. Ist das DSL-Script?

Im Screenshot sieht man, wie ich das in Blockly nachgebastelt habe (und so langsam verstehe, warum man da bei komplexeren Geschichten nicht so richtig viel Bock drauf haben könnte....).
Taupunkt Blockly.jpg
Der erzeugte Code (soweit ich das verstehe ist das hier dann reines js?) ist folgender:

Code: Alles auswählen

var hum, temp, a, SDD, b, DD, v, TD;


if (itemRegistry.getItem('HTAussen_Humidity').getState() != null && itemRegistry.getItem('HTAussen_Temperature').getState() != null) {
  hum = itemRegistry.getItem('HTAussen_Humidity').getState();
  temp = itemRegistry.getItem('HTAussen_Temperature').getState();
  if (temp >= 0) {
    a = 7.5;
    b = 237.3;
  } else {
    a = 7.6;
    b = 240.7;
  }
  SDD = 6.1078 * Math.pow(10,(a * temp) / (b + temp));
  DD = hum / (100 * SDD);
  v = Math.log(DD / 6.1078) / Math.log(10);
  TD = (b * v) / (a - v);
  events.sendCommand('Taupunkt_Aussen', TD);
}
Heraus kommt jedoch ein negativer Wert (-53 und zig Nachkommastellen).
Ich hoffe jetzt mal, dass ich nicht schon völlig Betriebsblind bin. Ich konnte keinen Fehler in den Formeln entdecken. Da ich in js (und erst recht mit mathematischen Funktionen darin) einen Erfahrungsschatz gegen Null habe, muss ich jetzt zumindest mal darauf hoffen, dass die generierte Syntax korrekt ist. Da js nicht streng typisiert und es eine Gleitkommazahl ist, gehe ich mal davon aus, dass die Genauigkeit auch passen sollte.

Und nun steh ich da wie der Ochs vorm Berg und es wird so langsam spät. :?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Wie globale Variable speichern oder Script Global verfügbar machen?

Beitrag von udo1toni »

Der Teil

Code: Alles auswählen

val org.eclipse.xtext.xbase.lib.Functions$Function2 calculateDewPoint = [
double temperature, double humidity 
    |
definiert die Funktion calculateDewPoint mit zwei Parametern temperature und humidity. Die Schreibweise ist veraltet, es reicht auch

Code: Alles auswählen

val calculateDewPoint = [ double temperature, double humidity |
aber natürlich nur in der Rules DSL.

Ansonsten sieht das eigentlich gut aus. Warum da ein negatives Ergebnis heraus kommt, kann ich Dir aber auch nicht beantworten. Es könnte aber sein, dass die Eingabewerte nicht korrekt als Zahlen übernommen werden. Ich habe keine Ahnung, wie man aus dem getItemState definiert ein Double oder zumindest Float heraus bekommt.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Jensemann_P
Beiträge: 162
Registriert: 26. Jul 2021 20:14
Answers: 0

Re: Wie globale Variable speichern oder Script Global verfügbar machen?

Beitrag von Jensemann_P »

Ok, dann muss ich, wenn ich das nächste mal am System bin, mal schauen wie ich da vl definierte Conversions in JS hinbekomme und setz da mal an.

LG
Jens

Jensemann_P
Beiträge: 162
Registriert: 26. Jul 2021 20:14
Answers: 0

Re: Wie globale Variable speichern oder Script Global verfügbar machen?

Beitrag von Jensemann_P »

Gibt es denn eine Möglichkeit zum debuggen Werte in eine Konsole o.ä zu schreiben?

Antworten