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

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

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

Beitrag von Jensemann_P »

Liebes Forum,

ich bin gerade dabei, meine Taupunktsteuerung für die Kellerentfeuchtung an den Start zu bringen.
Ich steige gerade mit OH3 neu ein und würde gerne so weit wie möglich Blockly benutzen, da ich heir viele Syntaxfehler (ich komme nicht aus der Java-Welt) erspare und Block-Code auch noch nach Jahren schnell zu erfassen ist.

Für die eigentlichen Rules (auslösen wenn sich innen oder aussen Temperatur oder Feuchtigkeit geändert hat) sehe ich erst mal keine Probleme.
Da unser Keller mehrere sehr unterschiedlich feuchte Zonen hat (Heizraum mit Waschküche, Pelletlager, Holzwerkstatt usw.) möchte ich mehrere einzelne Lüftungskreise bilden (es kann ja durchaus Sinn machen, das Bügelzimmer zu lüften aber für die Werkstatt wäre die Differenz zu gering oder sogar negativ).

Nun habe ich also z.B. die Werte Außentermperatur und Außenfeuchtigkeit. Daraus kann ich mir ja dann Näherungsweise den Taupunkt/die absolute Feuchtigkeit errechnen. Diesen Wert benötige ich ja für alle 4 Lüftungskreise.

Wie geht man nun in OH üblicherweise vor, um so etwas entweder in einem Script abzulegen, welches ich von anderen Scripten (=am liebsten aus den Blockly-Scripten der Rules) aufrufen kann ODER (fast noch besser) ich aktualisiere diesen Wert über eine Rule in ein globales Objekt (und würde dann in den Rules-Bedinungen das globale Objekt "FeuchteAussen" auf Änderung abfragen.

Welche Möglichkeiten gibt es in OH so etwas Übersichtlich abzubilden? Globale Variablen scheint es nicht zu geben.

Die nächste Frage würde dann "Flags" aus den einzelnen Scripten betreffen. Bspw Möchte ich in Intervallen Lüften. Also 30 min an, dann 30 min Zwangspause, dann überprüfen ob die Rahmenparameter noch gegeben sind, dann entscheiden ob ein neuer 2*30 min Zyklus anläuft oder ob das Lüften dann verlassen wird.

Wie löst man so etwas in OH? Da globale Variablen nicht vorgesehen sind, vermute ich dass externe Flags setzen und bei Neuauslösen der Rules überprüfen nicht der vorgesehene Weg ist.
Wie dann? Werden Scripte mehrfach gleichzeitig aufgerufen, wenn die Eingangsbedingungen erfüllt sind, oder wird das erst wieder verarbeitet, wenn das Script einmal durchgelaufen ist? Würde man in Schleifen pollen oder gibt es dafür dann Timerobjekte?

Ihr merkt, hier fehlt mir einfach die Übersicht, wie man sowas unter OH3 am besten angeht.

Ich freue mich über jeden Input.

LG
Jens

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

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

Beitrag von udo1toni »

Jensemann_P hat geschrieben:
Ich steige gerade mit OH3 neu ein[…]
Das heißt, Du bist komplett neu bei openHAB, oder nur neu mit OH3?
Jensemann_P hat geschrieben:
Nun habe ich also z.B. die Werte Außentermperatur und Außenfeuchtigkeit. Daraus kann ich mir ja dann Näherungsweise den Taupunkt/die absolute Feuchtigkeit errechnen. Diesen Wert benötige ich ja für alle 4 Lüftungskreise.
Den Taupunkt musst Du ja pro Raum bestimmen. Du musst also die Taupunktberechnung in eine Funktion auslagern.
Außentemperatur und Außenluftfeuchte liegen ja in Form von Items vor, das heißt, diese Werte sind schon global.
Jensemann_P hat geschrieben:
Globale Variablen scheint es nicht zu geben.
Du kannst Items dafür verwenden. Items müssen nicht zwingend mit Channels verknüpft sein, sie können auch “ungebunden” verwendet werden.
Jensemann_P hat geschrieben:
Werden Scripte mehrfach gleichzeitig aufgerufen, wenn die Eingangsbedingungen erfüllt sind, oder wird das erst wieder verarbeitet, wenn das Script einmal durchgelaufen ist?
openHAB arbeitet eventbezogen. Das heißt, Rules laufen nicht, weil ein Zustand herrscht, sondern weil ein Ereignis auftritt. In diesem Fall wäre das eine Wertänderung.
Jensemann_P hat geschrieben:
Würde man in Schleifen pollen oder gibt es dafür dann Timerobjekte?
Man kann Timer programmieren oder auch ein Item nutzen, welches in den Metadaten einen expiration Timer eingetragen hat. Damit kann man bei ausbleibendem Update ein Item in einen bestimmten Zustand bringen oder wahlweise auch einmalig einen Befehl senden (also z.B. Treppenhausschaltung, Befehl ist dann OFF, oder Sperre, da braucht es keinen Befehl, lediglich der Zustand muss von ON wieder auf OFF wechseln)


Gesendet von iPad mit Tapatalk
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

BOP
Beiträge: 197
Registriert: 23. Sep 2018 19:43
Answers: 1

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

Beitrag von BOP »

Jensemann_P hat geschrieben: 5. Aug 2021 11:31 ... und würde gerne so weit wie möglich Blockly benutzen, (...) und Block-Code auch noch nach Jahren schnell zu erfassen ist.
Hast du damit schon Regeln angelegt?
Meine persönliche Meinung dazu: Für ganz kurze Regeln nach dem Motto "wenn Schalter ON dann Licht ON", geht es noch gerade so. Aber selbst dabei empfinde ich es von der Bedienung als sehr umständlich.
Und wenn die Regeln etwas komplexer werden, klickt und schiebt und tippt man sich einen Wolf. Da bin ich mit einem Editor 10mal schneller.

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 14:10 Das heißt, Du bist komplett neu bei openHAB, oder nur neu mit OH3?
Ich bin ganz neu in der Thematik
udo1toni hat geschrieben: 5. Aug 2021 14:10 Den Taupunkt musst Du ja pro Raum bestimmen. Du musst also die Taupunktberechnung in eine Funktion auslagern.
Außentemperatur und Außenluftfeuchte liegen ja in Form von Items vor, das heißt, diese Werte sind schon global.
also eine rule erstellen und bei Änderung von h oder t aussen die Werte in ein eigenes Item schreiben?
udo1toni hat geschrieben: 5. Aug 2021 14:10 openHAB arbeitet eventbezogen. Das heißt, Rules laufen nicht, weil ein Zustand herrscht, sondern weil ein Ereignis auftritt. In diesem Fall wäre das eine Wertänderung.
soweit klar, aber wird bei jeder Änderung eine neue Instanz der Aktion gestartet ?
udo1toni hat geschrieben: 5. Aug 2021 14:10 Man kann Timer programmieren oder auch ein Item nutzen, welches in den Metadaten einen expiration Timer eingetragen hat. Damit kann man bei ausbleibendem Update ein Item in einen bestimmten Zustand bringen oder wahlweise auch einmalig einen Befehl senden (also z.B. Treppenhausschaltung, Befehl ist dann OFF, oder Sperre, da braucht es keinen Befehl, lediglich der Zustand muss von ON wieder auf OFF wechseln)
das mit den Zimmern muss ich erstmal überhaupt finden

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 »

BOP hat geschrieben: 5. Aug 2021 14:30
Jensemann_P hat geschrieben: 5. Aug 2021 11:31 ... und würde gerne so weit wie möglich Blockly benutzen, (...) und Block-Code auch noch nach Jahren schnell zu erfassen ist.
Hast du damit schon Regeln angelegt?
Meine persönliche Meinung dazu: Für ganz kurze Regeln nach dem Motto "wenn Schalter ON dann Licht ON", geht es noch gerade so. Aber selbst dabei empfinde ich es von der Bedienung als sehr umständlich.
Und wenn die Regeln etwas komplexer werden, klickt und schiebt und tippt man sich einen Wolf. Da bin ich mit einem Editor 10mal schneller.
Schneller glaub ich dir sofort. Ich weiss nur aus Erfahrung, dass ich bei seltener benutzter Syntax dann nach ein paar monaten mehr Gedöns mit Steuerzeichen als mit dem Algorithmus hab beim erweitern.

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 15:07
udo1toni hat geschrieben: 5. Aug 2021 14:10 Den Taupunkt musst Du ja pro Raum bestimmen. Du musst also die Taupunktberechnung in eine Funktion auslagern.
Außentemperatur und Außenluftfeuchte liegen ja in Form von Items vor, das heißt, diese Werte sind schon global.
also eine rule erstellen und bei Änderung von h oder t aussen die Werte in ein eigenes Item schreiben?
Nein, dazu braucht es keine Rule, das macht openHAB komplett alleine. Aber bei Wertänderungen von h und/oder t musst Du die Taupunkte aller Räume neu berechnen und im Zweifel in einzelne Items speichern.
Jensemann_P hat geschrieben: 5. Aug 2021 15:07
udo1toni hat geschrieben: 5. Aug 2021 14:10 openHAB arbeitet eventbezogen. Das heißt, Rules laufen nicht, weil ein Zustand herrscht, sondern weil ein Ereignis auftritt. In diesem Fall wäre das eine Wertänderung.
soweit klar, aber wird bei jeder Änderung eine neue Instanz der Aktion gestartet ?
Da eine Rule möglichst nur wenige Millisekunden läuft, spielt das keine Rolle. In openHAB1 und openHAB2 werden jeweils neue Instanzen in einem neuen Thread geöffnet, in openHAB3 läuft jeweils eine neue Instanz im zugehörigen Thread (es kann also immer nur eine Instanz der Rule laufen).
Jensemann_P hat geschrieben: 5. Aug 2021 15:07
udo1toni hat geschrieben: 5. Aug 2021 14:10 Man kann Timer programmieren oder auch ein Item nutzen, welches in den Metadaten einen expiration Timer eingetragen hat. Damit kann man bei ausbleibendem Update ein Item in einen bestimmten Zustand bringen oder wahlweise auch einmalig einen Befehl senden (also z.B. Treppenhausschaltung, Befehl ist dann OFF, oder Sperre, da braucht es keinen Befehl, lediglich der Zustand muss von ON wieder auf OFF wechseln)
das mit den Zimmern muss ich erstmal überhaupt finden
Was für Zimmer?
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

BOP
Beiträge: 197
Registriert: 23. Sep 2018 19:43
Answers: 1

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

Beitrag von BOP »

Jensemann_P hat geschrieben: 5. Aug 2021 15:09 Ich weiss nur aus Erfahrung, dass ich bei seltener benutzter Syntax dann nach ein paar monaten mehr Gedöns mit Steuerzeichen als mit dem Algorithmus hab beim erweitern.
Ja, kann ich gut verstehen. Wie gesagt, arbeite erst einmal damit.
Ich weiß nicht, ob es zwischen der 3.0 und 3.1 viele Änderungen gegeben hat, aber ich kam damals mit der "Syntax" von Blockly noch weniger zurecht. Ich gehe jede Wette ein, dass ich auch damit nach einem halben Jahr nicht mehr wüsste, wie es geht.

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 »

<wie kann man einen Post zwischendrin löschen?>
Zuletzt geändert von Jensemann_P am 5. Aug 2021 19:22, insgesamt 1-mal geändert.

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 »

Jensemann_P hat geschrieben: 5. Aug 2021 19:17
udo1toni hat geschrieben: 5. Aug 2021 14:10 Den Taupunkt musst Du ja pro Raum bestimmen. Du musst also die Taupunktberechnung in eine Funktion auslagern.
Außentemperatur und Außenluftfeuchte liegen ja in Form von Items vor, das heißt, diese Werte sind schon global.
also eine rule erstellen und bei Änderung von h oder t aussen die Werte in ein eigenes Item schreiben?
Nein, dazu braucht es keine Rule, das macht openHAB komplett alleine. Aber bei Wertänderungen von h und/oder t musst Du die Taupunkte aller Räume neu berechnen und im Zweifel in einzelne Items speichern.
Genau 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?

Jensemann_P hat geschrieben: 5. Aug 2021 15:07
udo1toni hat geschrieben: 5. Aug 2021 14:10 openHAB arbeitet eventbezogen. Das heißt, Rules laufen nicht, weil ein Zustand herrscht, sondern weil ein Ereignis auftritt. In diesem Fall wäre das eine Wertänderung.
soweit klar, aber wird bei jeder Änderung eine neue Instanz der Aktion gestartet ?
Da eine Rule möglichst nur wenige Millisekunden läuft, spielt das keine Rolle. In openHAB1 und openHAB2 werden jeweils neue Instanzen in einem neuen Thread geöffnet, in openHAB3 läuft jeweils eine neue Instanz im zugehörigen Thread (es kann also immer nur eine Instanz der Rule laufen).

hier 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?
Jensemann_P hat geschrieben: 5. Aug 2021 15:07
udo1toni hat geschrieben: 5. Aug 2021 14:10 Man kann Timer programmieren oder auch ein Item nutzen, welches in den Metadaten einen expiration Timer eingetragen hat. Damit kann man bei ausbleibendem Update ein Item in einen bestimmten Zustand bringen oder wahlweise auch einmalig einen Befehl senden (also z.B. Treppenhausschaltung, Befehl ist dann OFF, oder Sperre, da braucht es keinen Befehl, lediglich der Zustand muss von ON wieder auf OFF wechseln)
das mit den Zimmern muss ich erstmal überhaupt finden
Was für Zimmer?
[/quote]
mein Handy-Autocorrect hatte da aus Timern Zimemrn gemacht


Ich hänge im Moment tierisch an der Stelle "wo anfangen und mit welchem Tool/Scriptsprache/Programmiersprache.

Edit: Sorry für die schlechte Lesbarkeit, mir hats beim Editieren gerade die Quoterei zerschossen :-(

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 »

BOP hat geschrieben: 5. Aug 2021 17:50
Jensemann_P hat geschrieben: 5. Aug 2021 15:09 Ich weiss nur aus Erfahrung, dass ich bei seltener benutzter Syntax dann nach ein paar monaten mehr Gedöns mit Steuerzeichen als mit dem Algorithmus hab beim erweitern.
Ja, kann ich gut verstehen. Wie gesagt, arbeite erst einmal damit.
Ich weiß nicht, ob es zwischen der 3.0 und 3.1 viele Änderungen gegeben hat, aber ich kam damals mit der "Syntax" von Blockly noch weniger zurecht. Ich gehe jede Wette ein, dass ich auch damit nach einem halben Jahr nicht mehr wüsste, wie es geht.
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?

LG
Jens

Antworten