Hallo zusammen.
Ich möchte einfache Berechnungen in Regeln durchführen und scheitere mit der Meldung
Script execution of rule with UID 'Tracing-9' failed: Unknown variable or command '*'
ich möchte einen Rollladen auf 2/3 des Wertes eines anderen Rollladen fahren und versuche daher:
BlindsControlK.sendCommand(BlindsControlE.state * 0.67)
Gibt es Beispiele / Links wie man in den DSL Regeln rechnen kann?
Wie wandelt man die Zahlen um, wenn das Item kein Number ist? Gibt es dafür auch Beispiele?
Ist denn ein Item vom Typ Rollershutter überhaupt eine Zahl?
Vielen Dank im Voraus
Einfache Berechnungen in Regeln
-
- Beiträge: 45
- Registriert: 3. Jul 2019 10:30
Einfache Berechnungen in Regeln
...probier's mal so. Die Umwandlung erfolgt dann nach der Berechnung:
(ungetestet)
Gehe zur vollständigen AntwortCode: Alles auswählen
BlindsControlK.sendCommand(((BlindsControlE.state as Number) * 0.67).intValue)
- udo1toni
- Beiträge: 15249
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Einfache Berechnungen in Regeln
Wenn Du rechnen willst, brauchst Du eine Zahl.
.state ist aber ein Status, keine Zahl. So wird ein Schuh draus:
Oftmals ist es aber sinnvoll, die Berechnung in einer Variablen durchzuführen.
.state ist aber ein Status, keine Zahl. So wird ein Schuh draus:
Code: Alles auswählen
BlindsControlK.sendCommand((BlindsControlE.state as Number) * 0.67)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 45
- Registriert: 3. Jul 2019 10:30
Re: Einfache Berechnungen in Regeln
oha. vielen Dank. das ist ja (wieder mal) ganz einfach.
und wie bekomme ich ein integer daraus? "as Int" bringt mir jetzt die Fehlermeldung: Cannot cast from BigDecimal to int
Gibt es eine Übersicht für solche Befehle? Also Zahlenkonvertierungen oder Stringfunktionen.
Hat da nicht mal jemand die wichtigsten zusammengetragen? ich mach immer über Versuch und Irrtum und hin- und wieder finde ich im Forum mal in einem Beispiel eine Funktion, die mir nützlich ist.
und wie bekomme ich ein integer daraus? "as Int" bringt mir jetzt die Fehlermeldung: Cannot cast from BigDecimal to int
Gibt es eine Übersicht für solche Befehle? Also Zahlenkonvertierungen oder Stringfunktionen.
Hat da nicht mal jemand die wichtigsten zusammengetragen? ich mach immer über Versuch und Irrtum und hin- und wieder finde ich im Forum mal in einem Beispiel eine Funktion, die mir nützlich ist.
- peter-pan
- Beiträge: 2758
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Einfache Berechnungen in Regeln
...probier's mal so. Die Umwandlung erfolgt dann nach der Berechnung:
(ungetestet)
Code: Alles auswählen
BlindsControlK.sendCommand(((BlindsControlE.state as Number) * 0.67).intValue)
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian
- udo1toni
- Beiträge: 15249
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Einfache Berechnungen in Regeln
Ja, das ist ein bisschen schwierig... as Number ist keine Konvertierung im eigentlichen Sinne, der Vorgang heißt Casting. Das heißt, dem konkreten Wert wird einfach ein Datentyp zugewiesen. Wenn ein Objekt-Wert in einen bestimmten Datentyp passt und der Datentyp zugewiesen wurde, erbt das Objekt alle Methoden des Datentyps. Deshalb kann man anschließend mit (.state as Number).intValue den Wert konvertieren (auch .floatValue ginge, oder auch .doubleValue)
Beim Casting kann es grundsätzlich passieren, dass es zu einer NullPointer Exception kommt, weil der Wert des Objekts leider nicht in den Datentyp passt. z.B. kann ein Item immer den Status NULL oder UNDEV annehmen, auch ein Number Item kennt diese beiden Status. Im Datentyp Number steht aber weder NULL noch UNDEV zur Verfügung, stattdessen wird die Rule dann mit einer Exception abgebrochen. Um das zu verhindern, kann man vor dem Casting testen, ob der Wert grundsätzlich von dem gewünschten Datentyp dargestellt werden kann, das geht mit if(meinItem.state instanceof Number). Wenn man sauber programmiert, sollte man diese Prüfung also grundsätzlich vorher ausführen und im Fehlerfall (Bedingung nicht erfüllt) z.B. einen default Value setzen oder die Rule kontrolliert beenden.
Beim Casting kann es grundsätzlich passieren, dass es zu einer NullPointer Exception kommt, weil der Wert des Objekts leider nicht in den Datentyp passt. z.B. kann ein Item immer den Status NULL oder UNDEV annehmen, auch ein Number Item kennt diese beiden Status. Im Datentyp Number steht aber weder NULL noch UNDEV zur Verfügung, stattdessen wird die Rule dann mit einer Exception abgebrochen. Um das zu verhindern, kann man vor dem Casting testen, ob der Wert grundsätzlich von dem gewünschten Datentyp dargestellt werden kann, das geht mit if(meinItem.state instanceof Number). Wenn man sauber programmiert, sollte man diese Prüfung also grundsätzlich vorher ausführen und im Fehlerfall (Bedingung nicht erfüllt) z.B. einen default Value setzen oder die Rule kontrolliert beenden.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet