Wie globale Variable speichern oder Script Global verfügbar machen?
-
- Beiträge: 162
- Registriert: 26. Jul 2021 20:14
Wie globale Variable speichern oder Script Global verfügbar machen?
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
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
- udo1toni
- Beiträge: 15269
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Wie globale Variable speichern oder Script Global verfügbar machen?
Das heißt, Du bist komplett neu bei openHAB, oder nur neu mit OH3?Jensemann_P hat geschrieben:
Ich steige gerade mit OH3 neu ein[…]
Den Taupunkt musst Du ja pro Raum bestimmen. Du musst also die Taupunktberechnung in eine Funktion auslagern.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.
Außentemperatur und Außenluftfeuchte liegen ja in Form von Items vor, das heißt, diese Werte sind schon global.
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:
Globale Variablen scheint es nicht zu geben.
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:
Werden Scripte mehrfach gleichzeitig aufgerufen, wenn die Eingangsbedingungen erfüllt sind, oder wird das erst wieder verarbeitet, wenn das Script einmal durchgelaufen ist?
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)Jensemann_P hat geschrieben:
Würde man in Schleifen pollen oder gibt es dafür dann Timerobjekte?
Gesendet von iPad mit Tapatalk
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
-
- Beiträge: 197
- Registriert: 23. Sep 2018 19:43
Re: Wie globale Variable speichern oder Script Global verfügbar machen?
Hast du damit schon Regeln angelegt?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.
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.
-
- Beiträge: 162
- Registriert: 26. Jul 2021 20:14
Re: Wie globale Variable speichern oder Script Global verfügbar machen?
Ich bin ganz neu in der Thematik
also eine rule erstellen und bei Änderung von h oder t aussen die Werte in ein eigenes Item schreiben?
soweit klar, aber wird bei jeder Änderung eine neue Instanz der Aktion gestartet ?
das mit den Zimmern muss ich erstmal überhaupt findenudo1toni 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)
-
- Beiträge: 162
- Registriert: 26. Jul 2021 20:14
Re: Wie globale Variable speichern oder Script Global verfügbar machen?
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.BOP hat geschrieben: ↑5. Aug 2021 14:30Hast du damit schon Regeln angelegt?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.
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.
- udo1toni
- Beiträge: 15269
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Wie globale Variable speichern oder Script Global verfügbar machen?
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:07also eine rule erstellen und bei Änderung von h oder t aussen die Werte in ein eigenes Item schreiben?
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:07soweit klar, aber wird bei jeder Änderung eine neue Instanz der Aktion gestartet ?
Was für Zimmer?Jensemann_P hat geschrieben: ↑5. Aug 2021 15:07das mit den Zimmern muss ich erstmal überhaupt findenudo1toni 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)
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
-
- Beiträge: 197
- Registriert: 23. Sep 2018 19:43
Re: Wie globale Variable speichern oder Script Global verfügbar machen?
Ja, kann ich gut verstehen. Wie gesagt, arbeite erst einmal damit.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.
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.
-
- Beiträge: 162
- Registriert: 26. Jul 2021 20:14
Re: Wie globale Variable speichern oder Script Global verfügbar machen?
<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.
-
- Beiträge: 162
- Registriert: 26. Jul 2021 20:14
Re: Wie globale Variable speichern oder Script Global verfügbar machen?
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 19:17also eine rule erstellen und bei Änderung von h oder t aussen die Werte in ein eigenes Item schreiben?
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?
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:07soweit klar, aber wird bei jeder Änderung eine neue Instanz der Aktion gestartet ?
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?
Was für Zimmer?Jensemann_P hat geschrieben: ↑5. Aug 2021 15:07das mit den Zimmern muss ich erstmal überhaupt findenudo1toni 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)
[/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

-
- Beiträge: 162
- Registriert: 26. Jul 2021 20:14
Re: Wie globale Variable speichern oder Script Global verfügbar machen?
Es gibt so viele Varianten/Sprachen. Soweit ich das sehe ist Blockly also sehr neu dazugekommen. Was ist denn die verbreitetste Variante?BOP hat geschrieben: ↑5. Aug 2021 17:50Ja, kann ich gut verstehen. Wie gesagt, arbeite erst einmal damit.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.
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.
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