Seite 1 von 2

Javascript >=

Verfasst: 3. Mai 2022 15:19
von manes
Hi,
das hier klappt nicht ab der if Abfrage. Auch nicht Else. Fehlermeldung im LOG File gibt es auch nicht

Code: Alles auswählen

var cTemperatur = itemRegistry.getItem('GenericMQTTThing_esp7C627ATemperaturBadezimmer').getState();
var cOrt        = "Badezimmer";
var cStatus     = "leer";
telegramAction.sendTelegram("Raumtemperatur " + cOrt + " derzeit " + cTemperatur + " Grad. Status: Sonnenschutz " + cStatus);
if (cTemperatur >= 20){
  if (itemRegistry.getItem('temperaturbad') == 'OFF'){
    cStatus = "aktiv";
    events.sendCommand('temperaturbad', 'ON');
    telegramAction.sendTelegram("Raumtemperatur " + cOrt + " derzeit " + cTemperatur + " Grad. Status: Sonnenschutz " + cStatus);
  }
}else{// es ist noch nicht warm genug
  cStatus = "deaktiviert";
  events.sendCommand('temperaturbad', 'OFF');
  telegramAction.sendTelegram("Raumtemperatur " + cOrt + " derzeit " + cTemperatur + " Grad. Status: Sonnenschutz " + cStatus);
}
das klappt.

Code: Alles auswählen

var cTemperatur = itemRegistry.getItem('GenericMQTTThing_esp7C627ATemperaturBadezimmer').getState();
var cOrt        = "Badezimmer";
var cStatus     = "leer";
telegramAction.sendTelegram("Raumtemperatur " + cOrt + " derzeit " + cTemperatur + " Grad. Status: Sonnenschutz " + cStatus);
if (cTemperatur == 20){
  if (itemRegistry.getItem('temperaturbad') == 'OFF'){
    cStatus = "aktiv";
    events.sendCommand('temperaturbad', 'ON');
    telegramAction.sendTelegram("Raumtemperatur " + cOrt + " derzeit " + cTemperatur + " Grad. Status: Sonnenschutz " + cStatus);
  }
}else{// es ist noch nicht warm genug
  cStatus = "deaktiviert";
  events.sendCommand('temperaturbad', 'OFF');
  telegramAction.sendTelegram("Raumtemperatur " + cOrt + " derzeit " + cTemperatur + " Grad. Status: Sonnenschutz " + cStatus);
}
wo ist mein Denkfehler?

Re: Javascript >=

Verfasst: 3. Mai 2022 19:17
von udo1toni
Mein erster Tipp wäre Units of Measurement. Allerdings nutze ich kein ECMA und weiß auch nicht, wie man das korrekt in ECMA verwendet.

Re: Javascript >=

Verfasst: 3. Mai 2022 19:58
von Harka
versuch mal es mal mit
cTemperatur = parseFloat(cTemperatur);
OH+Javascipt stolpert öfter über das Format.
Ggf. wäre die Rückgabe für cTemperatur via Telegramm interessant (Komma oder Punkt als Dezimaltrenner).

Re: Javascript >=

Verfasst: 3. Mai 2022 20:04
von manes
klappt auch nicht.
Rückgabe ist mit "."

Re: Javascript >=

Verfasst: 3. Mai 2022 21:49
von udo1toni
Was ist denn der exakte Inhalt von cTemperatur? geloggt?

Re: Javascript >=

Verfasst: 4. Mai 2022 07:01
von manes
je nachdem. Eine Zahl. (z.B. 20.1)Ich bin leider noch nicht so fit in javascript, deshalb habe ich eh nicht verstanden, wieso eine Zahl zurückkommt, die ich aber mit einem String direkt kombinieren kann, ohhe sie vorher in einen String selbst umzuwandeln. Aber wenn ich den in Hochkomma verpacke und dann abfrage, passiert auch nichts.

Re: Javascript >=

Verfasst: 4. Mai 2022 12:03
von peter-pan
Schau mal hier. Vielleicht hilft dir das weiter.

Das hab ich auf die Schnelle mal gegoogelt, aber selber nicht ausprobiert. Deshalb ohne Gew(e)ähr. ;)

Re: Javascript >=

Verfasst: 5. Mai 2022 10:10
von udo1toni
Kannst Du bitte die Zeile aus dem Log einfügen? Es geht mir nicht darum, dass Du ein Beispiel zeigst, sondern dass ich eine konkrete Zeile aus dem Log sehe.

Grundsätzlich: Die Definition var cTemperatur erzeugt ein Objekt (weil nichts anderes angegeben wurde). Dies ist zunächst vom Typ void (unbestimmt) und mit dem Zuweisen des state wird es vermutlich zu State (oder so).
Was wichtigste dabei: jedes Objekt erbt die Methoden der Eltern. Und es gibt eine Methode, die das Ur-Objekt hat, die also auch alle anderen Objekte haben, diese Methode heißt .toString. openHAB wird bei gemischter Verwendung von Typen immer versuchen, diese ineinander zu konvertieren, es wird also automatisch einen String erzeugen, indem es die Methode .toString anwendet.
Soll der Status hingegen als Zahl betrachtet werden, ist der Fall nicht so einfach, denn es gibt keine Methode .toNumber oder .toDecimal (oder irgendwas in der Art).
In der DSL muss man einfach nur den Type casten var Number nZahl = MeinItem.state as Number aber ob das in JavaScript auch so funktioniert, weiß ich nicht. Bisher wurden bei mir die Werte immer direkt als Zahl verwendet... wobei ich JavaScript auch nur in den Transformations nutze.

Re: Javascript >=

Verfasst: 5. Mai 2022 11:18
von Harka
Zusätzlich könntest Du auch mal versuchen mit den Fehler einzugrenzen. Ich nutze dafür gerne Log-Ausgaben.

Code: Alles auswählen

var logger = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);
var cTemperatur = itemRegistry.getItem('GenericMQTTThing_esp7C627ATemperaturBadezimmer').getState();
cTemperatur = parseFloat(cTemperatur);
logger.warn(cTemperatur);
var cOrt        = "Badezimmer";
var cStatus     = "leer";
telegramAction.sendTelegram("Raumtemperatur " + cOrt + " derzeit " + cTemperatur + " Grad. Status: Sonnenschutz " + cStatus);

if (cTemperatur >= 20){
  logger.warn("Willkommen im ersten IF");
  if (itemRegistry.getItem('temperaturbad') == 'OFF'){
	logger.warn("nun auch im 2. IF");
    cStatus = "aktiv";
    events.sendCommand('temperaturbad', 'ON');
    telegramAction.sendTelegram("Raumtemperatur " + cOrt + " derzeit " + cTemperatur + " Grad. Status: Sonnenschutz " + cStatus);
  }
}else{// es ist noch nicht warm genug
  logger.warn("hier ist die ELSE");
  cStatus = "deaktiviert";
  events.sendCommand('temperaturbad', 'OFF');
  telegramAction.sendTelegram("Raumtemperatur " + cOrt + " derzeit " + cTemperatur + " Grad. Status: Sonnenschutz " + cStatus);
}

Re: Javascript >=

Verfasst: 9. Mai 2022 11:29
von manes
also der logger schreibt genau das weg, was ich auch über telegram erhalte.

Code: Alles auswählen

2022-05-09 11:26:34.585 [WARN ] [org.openhab.rule.temperaturbad      ] - 22.1