Also bei den Timern könnte evtl. Udo weiterhelfen. Ich müsste da auch erst rumprobieren und das kann dauern
Fehler in Rule "cannot convert from float to int"
- peter-pan
- Beiträge: 2814
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Fehler in Rule "cannot convert from float to int"
Pi5/8GB(PiOS Lite 64-bit(trixie)/SSD 120GB - OH5.0.2 openhabian
- peter-pan
- Beiträge: 2814
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Fehler in Rule "cannot convert from float to int"
Welche Regel meinst du denn ? Das sind ja eine ganze Menge !!!
Pi5/8GB(PiOS Lite 64-bit(trixie)/SSD 120GB - OH5.0.2 openhabian
-
BO80
- Beiträge: 37
- Registriert: 18. Mär 2019 07:47
Re: Fehler in Rule "cannot convert from float to int"
Ja, die Regel wiederholt sich für verschiedene Zimmer,
ich hab es auf einen Raum gekürzt.
Mit folgenden Fehlermeldungen:
Type mismatch: cannot convert from double to int
Type mismatch: cannot convert from Number to double
ich hab es auf einen Raum gekürzt.
Code: Alles auswählen
rule "Init virtual Items"
when
System started or
Time cron "0 0/1 * * * ?" //alle 5min abfrage
then
/*if (Wassertemperatur_Soll_Setpoint.state == Uninitialized) {
Wassertemperatur_Soll_Setpoint.postUpdate(5.5) //postUpdate ist nur für Aktualisierungen innerhalb von openHAB (sendCommand gibt diese auch auf den Bus)
}
if (Feuchtegehalt_draussen.state == uninitialized) {
Feuchtegehalt_draussen.postUpdate(1)
}
*/
end
rule "Luftfeuchte Garage1 unten"
when
Time cron "0 0/5 * * * ?" //alle 5min
then
// Variablen
var Number temp_in = (TemperatureGarageRechtsTemperature.state as Number).floatValue //Innentemperatur in Grad Celsius
var Number temp_out = (TemperatureDraussenTemperature.state as Number).floatValue //Außentemperatur in Grad Celsius
var Number abs_hum_in = 0
var Number abs_hum_out = 0
var Number rel_hum_in = (TemperatureGarageRechtsHumidity.state as Number).floatValue //relative Feuchte Innen
var Number rel_hum_out = (TemperatureDraussenHumidity.state as Number).floatValue //relative Feuchte Außen
// Konstanten
val gas_const = 8314.3
val mol = 18.016
var Number ab = 0
var a_out = 0
var b_out = 0
// Parameter a, b
// wenn T>=0: a = 7.5, b = 237.3 (dies wird wohl immer von den Innenraum zutreffen)
// wenn T<0: a = 7.6, b = 240.7 (dies kann für die Außerntemperatur zutreffen)
val a_in=7.5
val b_in=237.3
if (temp_out >= 0) {
a_out=7.5
b_out=237.3
} else {
a_out=7.6
b_out=240.7
}
// Formeln
// Sättingungsdampfdruck: SDD = 6.1078 * 10^((a*temp)/(b+temp))
// Dampfdruck: DD = rel_hum * 100 / SDD
// Absolute Feuchte: AF = 10^5 * mol / gas_const * DD / (temp + 273.15)
// absolute Innenfeuchte
ab = ((a_in * temp_in) / (b_in + temp_in)).doubleValue()
var Number sdd_in = 6.1078 * Math::pow(10, ab)
var Number dd_in = rel_hum_in / 100 * sdd_in
abs_hum_in = Math::pow(10, 5) * mol / gas_const * dd_in / (temp_in + 273.15)
// absolute Außenfeuchte
ab = ((a_out * temp_out) / (b_out + temp_out)).doubleValue()
var Number sdd_out = 6.1078 * Math::pow(10, ab)
var Number dd_out = rel_hum_out / 100 * sdd_out
abs_hum_out = Math::pow(10, 5) * mol / gas_const * dd_out / (temp_out + 273.15)
logInfo("Luftfeuchte Garage1", "Abs. Luftfeuchte - in: " + abs_hum_in + "g/m3, out: " + abs_hum_out + "g/m3")
if (abs_hum_in > abs_hum_out) { //wenn innen feuchter als außen, dann lüften
// lüften, Fenster öffnen
logInfo("Luftfeuchte", "Garage1 lüften")
} else {
// nicht lüften, Fenster schließen
logInfo("Luftfeuchte", "Garage1 nicht lüften")
}
//schreiben der werte in ITEM
//Feuchtegehalt_draussen.sendCommand(abs_hum_out)
Feuchtegehalt_garage1.sendCommand(abs_hum_in)
end
Type mismatch: cannot convert from double to int
Type mismatch: cannot convert from Number to double
- peter-pan
- Beiträge: 2814
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Fehler in Rule "cannot convert from float to int"
...also ohne die Regel weiter auf Logik geprüft zu haben. Hier mein Ergebnis mit kleinen Änderungen in der Syntax (Variablen) und ohne die Updates und teilweise mit meinen Items (Temperatur + Luftfeuchtigkeit).
Log:
Code: Alles auswählen
rule "Luftfeuchte Garage1 unten"
when
Time cron "0 0/5 * * * ?" or //alle 5min
Item Dummy4 changed to ON
then
// Variablen
var Number temp_in = (Socket_Fritz_03_Temp.state as Number).floatValue //Innentemperatur in Grad Celsius
var Number temp_out = (Socket_Fritz_04_Temp.state as Number).floatValue //Außentemperatur in Grad Celsius
var Number abs_hum_in = 0
var Number abs_hum_out = 0
var Number rel_hum_in = (localHourlyForecastHumidity_02.state as Number).floatValue //relative Feuchte Innen
var Number rel_hum_out = (localHourlyForecastHumidity_03.state as Number).floatValue //relative Feuchte Außen
// Konstanten
val gas_const = 8314.3
val mol = 18.016
var ab = 0.0
var a_out = 0.0
var b_out = 0.0
// Parameter a, b
// wenn T>=0: a = 7.5, b = 237.3 (dies wird wohl immer von den Innenraum zutreffen)
// wenn T<0: a = 7.6, b = 240.7 (dies kann für die Außerntemperatur zutreffen)
val a_in=7.5
val b_in=237.3
if (temp_out >= 0) {
a_out=7.5
b_out=237.3
} else {
a_out=7.6
b_out=240.7
}
// Formeln
// Sättingungsdampfdruck: SDD = 6.1078 * 10^((a*temp)/(b+temp))
// Dampfdruck: DD = rel_hum * 100 / SDD
// Absolute Feuchte: AF = 10^5 * mol / gas_const * DD / (temp + 273.15)
// absolute Innenfeuchte
ab = ((a_in * temp_in) / (b_in + temp_in))
var Number sdd_in = 6.1078 * Math::pow(10, ab)
var Number dd_in = rel_hum_in / 100 * sdd_in
abs_hum_in = Math::pow(10, 5) * mol / gas_const * dd_in / (temp_in + 273.15)
// absolute Außenfeuchte
ab = ((a_out * temp_out) / (b_out + temp_out))
var Number sdd_out = 6.1078 * Math::pow(10, ab)
var Number dd_out = rel_hum_out / 100 * sdd_out
abs_hum_out = Math::pow(10, 5) * mol / gas_const * dd_out / (temp_out + 273.15)
logInfo("Luftfeuchte Garage1", "Abs. Luftfeuchte - in: " + abs_hum_in + "g/m3, out: " + abs_hum_out + "g/m3")
if (abs_hum_in > abs_hum_out) { //wenn innen feuchter als außen, dann lüften
// lüften, Fenster öffnen
logInfo("Luftfeuchte", "Garage1 lüften")
} else {
// nicht lüften, Fenster schließen
logInfo("Luftfeuchte", "Garage1 nicht lüften")
}
//schreiben der werte in ITEM
//Feuchtegehalt_draussen.sendCommand(abs_hum_out)
// Feuchtegehalt_garage1.sendCommand(abs_hum_in)
logInfo("Luftfeuchte", "Bin am Ende")
endCode: Alles auswählen
2020-09-04 22:10:00.091 [INFO ] [ome.model.script.Luftfeuchte Garage1] - Abs. Luftfeuchte - in: 19.919263078355254g/m3, out: 17.777378515751558g/m3
2020-09-04 22:10:00.094 [INFO ] [e.smarthome.model.script.Luftfeuchte] - Garage1 lüften
2020-09-04 22:10:00.102 [INFO ] [e.smarthome.model.script.Luftfeuchte] - Bin am EndePi5/8GB(PiOS Lite 64-bit(trixie)/SSD 120GB - OH5.0.2 openhabian
- udo1toni
- Beiträge: 15446
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Fehler in Rule "cannot convert from float to int"
Aaaalso...
Wenn Du eine Variable verwendest, welche einem bestimmten Typ entsprechen soll, dann ist es das Einfachste, sie auch gleich so zu definieren:
Alsternativ könntest Du eine Wandlung nach Float bei der Definition erzwingen:
Beides sollte dazu führen, dass es keine Probleme mehr mit dem floatValue gibt.
Die Rule ist... suboptimal. Grundsätzlich: Konstanten werden ausschließlich mit dem Schlüsselwort val definiert. Sie sind dann Konstanten, also unabänderlich. Variablen werden ausschließlich mit dem Schlüsselwort var definiert.
Konstanten mit fixen Zahlenwerten (z.B. mol) sollten global (Am anfang der Datei, vor der ersten Rule) definiert werden, gerade wenn mehrere Rules dieselbe Konstante nutzen.
Wenn Du schon Konstanten und Variablen in einem Block definierst, dann definiere alle in dem Block
Einen Status uninitialized oder Uninitialized gibt es nicht. Stattdessen solltest Du auf einen gültigen Zahlenwert prüfen:ist wahr, sobald das Item eine Zahl enthält.
Und warum überhaupt die Rule zyklisch triggern? openHAB ist ein eventbasiertes System. Der korrekte Trigger ist also z.B. Feuchtegehalt_draussen changed. Wenn noch andere Items eine Rolle bei der Berechnung spielen, müssen diese natürlich ebenfalls als Trigger aufgeführt werden...
Wenn Du eine Variable verwendest, welche einem bestimmten Typ entsprechen soll, dann ist es das Einfachste, sie auch gleich so zu definieren:
Code: Alles auswählen
var Number Temp_aussen = 20Code: Alles auswählen
var Temp_aussen = (20).floatValueDie Rule ist... suboptimal. Grundsätzlich: Konstanten werden ausschließlich mit dem Schlüsselwort val definiert. Sie sind dann Konstanten, also unabänderlich. Variablen werden ausschließlich mit dem Schlüsselwort var definiert.
Konstanten mit fixen Zahlenwerten (z.B. mol) sollten global (Am anfang der Datei, vor der ersten Rule) definiert werden, gerade wenn mehrere Rules dieselbe Konstante nutzen.
Wenn Du schon Konstanten und Variablen in einem Block definierst, dann definiere alle in dem Block
Einen Status uninitialized oder Uninitialized gibt es nicht. Stattdessen solltest Du auf einen gültigen Zahlenwert prüfen:
Code: Alles auswählen
if(Feuchtegehalt_draussen.state instanceof Number)Und warum überhaupt die Rule zyklisch triggern? openHAB ist ein eventbasiertes System. Der korrekte Trigger ist also z.B. Feuchtegehalt_draussen changed. Wenn noch andere Items eine Rolle bei der Berechnung spielen, müssen diese natürlich ebenfalls als Trigger aufgeführt werden...
openHAB5.0.1 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime) (Proxmox 9.0.11, LXC)
-
BO80
- Beiträge: 37
- Registriert: 18. Mär 2019 07:47
Re: Fehler in Rule "cannot convert from float to int"
Danke für die ausführliche Antwort, das hilft mir auf jeden Fall weiter. Ich versuche alles umzusetzen und poste dann das Ergebnis wenn es funktioniert!
Gesendet von meinem ELE-L29 mit Tapatalk
Gesendet von meinem ELE-L29 mit Tapatalk
-
BO80
- Beiträge: 37
- Registriert: 18. Mär 2019 07:47
Re: Fehler in Rule "cannot convert from float to int"
Ich konnte alle Tipps umsetzen und es läuft jetzt ohne Fehlermeldungen.
Danke nochmal für eure Unterstützung!!!
Danke nochmal für eure Unterstützung!!!
Code: Alles auswählen
//Konstanten
val gas_const = 8314.3
val mol = 18.016
val a_in = 7.5
val b_in = 237.3
// Parameter a, b
// wenn T>=0: a = 7.5, b = 237.3 (dies wird wohl immer von den Innenraum zutreffen)
// wenn T<0: a = 7.6, b = 240.7 (dies kann für die Außerntemperatur zutreffen)
rule "Luftfeuchte Garage1 unten"
when
Item TemperatureGarageRechtsTemperature changed
//Time cron "0 0/5 * * * ?" //alle 5min
then
logInfo("abs feuchte", "Rule triggert")
// Variablen
var Number temp_in = (TemperatureGarageRechtsTemperature.state as Number).floatValue //Innentemperatur in Grad Celsius
var Number temp_out = (TemperatureDraussenTemperature.state as Number).floatValue //Außentemperatur in Grad Celsius
var Number abs_hum_in = 0
var Number abs_hum_out = 0
var Number rel_hum_in = (TemperatureGarageRechtsHumidity.state as Number).floatValue //relative Feuchte Innen
var Number rel_hum_out = (TemperatureDraussenHumidity.state as Number).floatValue //relative Feuchte Außen
// Konstanten
var double ab = 0
var Number a_out = 0
var Number b_out = 0
// Parameter a, b
// wenn T>=0: a = 7.5, b = 237.3 (dies wird wohl immer von den Innenraum zutreffen)
// wenn T<0: a = 7.6, b = 240.7 (dies kann für die Außerntemperatur zutreffen)
{
if (temp_out >= 0) {
a_out = 7.5
b_out = 237.3
} else {
a_out = 7.6
b_out = 240.7
}
// Formeln
// Sättingungsdampfdruck: SDD = 6.1078 * 10^((a*temp)/(b+temp))
// Dampfdruck: DD = rel_hum * 100 / SDD
// Absolute Feuchte: AF = 10^5 * mol / gas_const * DD / (temp + 273.15)
// absolute Innenfeuchte
ab = ((a_in * temp_in) / (b_in + temp_in))
var Number sdd_in = 6.1078 * Math::pow(10, ab)
var Number dd_in = rel_hum_in / 100 * sdd_in
abs_hum_in = Math::pow(10, 5) * mol / gas_const * dd_in / (temp_in + 273.15)
// absolute Außenfeuchte
ab = ((a_out * temp_out) / (b_out + temp_out)).doubleValue
var Number sdd_out = 6.1078 * Math::pow(10, ab)
var Number dd_out = rel_hum_out / 100 * sdd_out
abs_hum_out = Math::pow(10, 5) * mol / gas_const * dd_out / (temp_out + 273.15)
logInfo("Luftfeuchte Garage1", "Abs. Luftfeuchte - in: " + abs_hum_in + "g/m3, out: " + abs_hum_out + "g/m3")
if (abs_hum_in > abs_hum_out) { //wenn innen feuchter als außen, dann lüften
// lüften, Fenster öffnen
logInfo("Luftfeuchte", "Garage1 lüften")
} else {
// nicht lüften, Fenster schließen
logInfo("Luftfeuchte", "Garage1 nicht lüften")
}
//schreiben der werte in ITEM
Feuchtegehalt_garage1.sendCommand(abs_hum_in)
}
end