Seite 1 von 1
Einfache Berechnungen in Regeln
Verfasst: 4. Jul 2022 14:58
von BtBread
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
Re: Einfache Berechnungen in Regeln
Verfasst: 4. Jul 2022 21:49
von udo1toni
Wenn Du rechnen willst, brauchst Du eine Zahl.
.state ist aber ein Status, keine Zahl. So wird ein Schuh draus:
Code: Alles auswählen
BlindsControlK.sendCommand((BlindsControlE.state as Number) * 0.67)
Oftmals ist es aber sinnvoll, die Berechnung in einer Variablen durchzuführen.
Re: Einfache Berechnungen in Regeln
Verfasst: 5. Jul 2022 07:55
von BtBread
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.
Re: Einfache Berechnungen in Regeln
Verfasst: 5. Jul 2022 10:28
von peter-pan
...probier's mal so. Die Umwandlung erfolgt dann nach der Berechnung:
Code: Alles auswählen
BlindsControlK.sendCommand(((BlindsControlE.state as Number) * 0.67).intValue)
(ungetestet)
Re: Einfache Berechnungen in Regeln
Verfasst: 5. Jul 2022 14:11
von udo1toni
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.