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 »

Nein, die gewöhnliche Möglichkeit zum Debuggen ist über das Logging. Die Logbefehle lauten logDebug(), logInfo(), logWarn() und logError(), wobei all diese Befehle exakt zwei Strings als Parameter erwarten, der erste String ist der Name des Loggers, der zweite String ist die eigentliche Logmeldung.
Dabei wird der Logger Name automatisch um org.openhab.core.automation.module.script ergänzt. Der Logger Name wird im Log in eckigen Klammern ausgegeben (auf die letzten 38 Zeichen gekürzt). Davor steht der log Level, der sich aus dem Befehl ergibt, also DEBUG, INFO, WARN oder ERROR. Dahinter steht die eigentliche Log Meldung (der zweite String).
Der zweite String wird automatisch substituiert, geschweifte Klammern werden jeweils durch den nächsten Parameter ersetzt. Also z.B. so:

Code: Alles auswählen

logWarn("test","Wert 1: {} Wert 2: {} Wert 3: {}",wert1,wert2,wert3)
Ergibt dann z.B. für wert1=0, wert2=3,7 und wert3="ein Text" diese Ausgabe:

Code: Alles auswählen

21:48:46.660 [WARN ] [ab.core.automation.module.script.test] - Wert 1: 0 Wert 2: 3.7 Wert 3: ein Text
Die Meldungen landen in der Datei /var/log/openhab/openhab.log (eine Standard Installation unter GNU/Linux vorausgesetzt)
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 »

Ich bin momentan hierbei (Die auskommentierten Zeilen sind halt diverse Versuche):

Code: Alles auswählen

var hum, temp, tempstr, a, SDD, b, DD, v, TD;
var logger = Java.type("org.slf4j.LoggerFactory").getLogger("Feucht1");

if (itemRegistry.getItem('HTHeizraum_Humidity').getState() != null && itemRegistry.getItem('HTHeizraum_Temperature').getState() != null) {
  hum = itemRegistry.getItem('HTHeizraum_Humidity').getState();
  temp = itemRegistry.getItem('HTHeizraum_Temperature').getState();
  //temp = (itemRegistry.getItem('HTHeizraum_Temperature').getState()) as Number.floatValue
  //tempstr = tempstr.tostring;
  //temp = tempstr.substring(0, (tempstr.length - 3));
  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);
  logger.warn("hum: " + hum);
  logger.warn("temp: " + temp);
  logger.warn("SDD: " + SDD);
  logger.warn("DD: " + DD);
  logger.warn("v: " + v);
  logger.warn("TD: " + TD);
  events.sendCommand('Taupunkt_Heizraum', TD);
 
}
Die Ausgabe im log schaut so aus:

Code: Alles auswählen

2021-08-10 00:32:45.644 [WARN ] [Feucht1                             ] - hum: 66.0
2021-08-10 00:32:45.646 [WARN ] [Feucht1                             ] - temp: 21.92 °C
2021-08-10 00:32:45.649 [WARN ] [Feucht1                             ] - SDD: 26.30844207389058
2021-08-10 00:32:45.650 [WARN ] [Feucht1                             ] - DD: 0.025087004321514242
2021-08-10 00:32:45.653 [WARN ] [Feucht1                             ] - v: -2.3864360030118026
2021-08-10 00:32:45.655 [WARN ] [Feucht1                             ] - TD: -57.28062805870415
Das Problem scheint also daher zu rühren, dass die Temperatur eben mit der Einheit raus kommt. Ich finde nun in JS leider keinen Weg (der OH genehm ist) um aus dieser Temperatur nur die nackte Zahl zu bekommen. Substring scheiterte daran, dass sich dieses Objekt wohl irgendwie nicht mit .tostring zu einem string machen lassen möchte. Wie könnte ich das denn am besten bewerkstelligen?

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 »

Ich habe mittlerweile gefunden, dass es Werte mit Units of Measurement gibt. Das wird wohl hier da sProblem sein.

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 »

Also, in der Rules DSL macht man das entweder, indem man die Einheit entfernt - z.B. so: (MeinItem.state as Number).floatValue für eine Fließkommazahl. Oder man nimmt die Einheit z.B. bei einem Vergleich mit zur Zahl dazu, - z.B. so: if((MeinItem.state as Number) >= 5 |°C). Die Pipe markiert das Anhängen der Unit. Mindestens die Wandlung nach Float sollte in ähnlicher Form auch in JavaScript funktionieren. Es sollten aber auch Beispiele im offiziellen Forum auffindbar sein.
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 »

Wollte hier nochmal kurz Rückmelden dass die Berechnung des Taupunktes jetzt spielt.
Zum einen habe ich dank User Peter-Pan die richtige Syntax gefunden um den numerischen Teil der UoM zu bekommen ( parseFloat() ), zum anderen hatte ich noch in der Berechnung des Wertes DD eine Klammer gesetzt, wo keine Hingehört (statt *100 habe ich den Nenner vergrößert, weswegen meine Werte so unglaublich klein/negativ wurden).

Hier also die funktionierende Taupunktberechnung in JS:

Code: Alles auswählen

var hum, temp, a, SDD, b, DD, v, TD;
// var logger = Java.type("org.slf4j.LoggerFactory").getLogger("Feucht1");

if (itemRegistry.getItem('HTHeizraum_Humidity').getState() != null && itemRegistry.getItem('HTHeizraum_Temperature').getState() != null) {
  hum = itemRegistry.getItem('HTHeizraum_Humidity').getState();
  temp = parseFloat(itemRegistry.getItem('HTHeizraum_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));
  TD = TD.toFixed(2);
 // logger.warn("hum: " + hum);
 // logger.warn("temp: " + temp);
 // logger.warn("SDD: " + SDD);
 // logger.warn("DD: " + DD);
 // logger.warn("v: " + v);
 // logger.warn("TD: " + TD);
  events.sendCommand('Taupunkt_Heizraum', TD);
 
}

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 »

Nur noch ein kurzer Hinweis: Die Prüfung auf null ist nicht hinreichend.

Ein Number Item kann neben einem Zahlenwert und NULL auch auch andere Werte annehmen. Die korrekte Prüfung muss also auf instanceof Number erfolgen.


Gesendet von iPad mit Tapatalk
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 für den Hinweis!

Antworten