Fehler in Rule "cannot convert from float to int"

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
peter-pan
Beiträge: 2782
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Fehler in Rule "cannot convert from float to int"

Beitrag von peter-pan »

BO80 hat geschrieben: 4. Sep 2020 12:37 Jetzt funktioniert es ohne die Timer
Also bei den Timern könnte evtl. Udo weiterhelfen. Ich müsste da auch erst rumprobieren und das kann dauern :oops: .
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH5.0.0 openhabian

Benutzeravatar
peter-pan
Beiträge: 2782
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Fehler in Rule "cannot convert from float to int"

Beitrag von peter-pan »

BO80 hat geschrieben: 4. Sep 2020 12:42 Ich habe noch eine Rule
Welche Regel meinst du denn ? Das sind ja eine ganze Menge !!!
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH5.0.0 openhabian

BO80
Beiträge: 37
Registriert: 18. Mär 2019 07:47
Answers: 0

Re: Fehler in Rule "cannot convert from float to int"

Beitrag von BO80 »

Ja, die Regel wiederholt sich für verschiedene Zimmer,
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
Mit folgenden Fehlermeldungen:

Type mismatch: cannot convert from double to int
Type mismatch: cannot convert from Number to double

Benutzeravatar
peter-pan
Beiträge: 2782
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Fehler in Rule "cannot convert from float to int"

Beitrag von peter-pan »

...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).

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")
end
Log:

Code: 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 Ende
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH5.0.0 openhabian

Benutzeravatar
udo1toni
Beiträge: 15307
Registriert: 11. Apr 2018 18:05
Answers: 246
Wohnort: Darmstadt

Re: Fehler in Rule "cannot convert from float to int"

Beitrag von udo1toni »

Aaaalso...

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 = 20
Alsternativ könntest Du eine Wandlung nach Float bei der Definition erzwingen:

Code: Alles auswählen

var Temp_aussen = (20).floatValue
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:

Code: Alles auswählen

if(Feuchtegehalt_draussen.state instanceof Number)
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...
openHAB5.0.0 stable in einem Debian-Container (bookworm) (Proxmox 9.0.3, LXC)

BO80
Beiträge: 37
Registriert: 18. Mär 2019 07:47
Answers: 0

Re: Fehler in Rule "cannot convert from float to int"

Beitrag von BO80 »

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


BO80
Beiträge: 37
Registriert: 18. Mär 2019 07:47
Answers: 0

Re: Fehler in Rule "cannot convert from float to int"

Beitrag von BO80 »

Ich konnte alle Tipps umsetzen und es läuft jetzt ohne Fehlermeldungen.
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




Antworten