Seite 3 von 3

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

Verfasst: 8. Aug 2021 22:03
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)

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

Verfasst: 10. Aug 2021 00:37
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?

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

Verfasst: 10. Aug 2021 01:01
von Jensemann_P
Ich habe mittlerweile gefunden, dass es Werte mit Units of Measurement gibt. Das wird wohl hier da sProblem sein.

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

Verfasst: 10. Aug 2021 13:07
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.

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

Verfasst: 11. Aug 2021 00:59
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);
 
}

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

Verfasst: 11. Aug 2021 17:02
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

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

Verfasst: 13. Aug 2021 00:04
von Jensemann_P
Danke dir für den Hinweis!