Fehler in Rule "cannot convert from float to int"

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Fehler in Rule "cannot convert from float to int"

Beitrag von BO80 »

Hallo Zusammen,
ich bekomme bei meiner Rule den Fehler in Rule "cannot convert from float to int"

Code: Alles auswählen

var Timer tDelay = null

rule "Zirkulation"
when 
    Time cron "0 0/15 * * * ?"       //alle 15min abfrage
then
    var Temp_aussen = 20                                                                  // Default Wert, falls Sensorausfall
    if (TemperatureDraussenTemperature.state instanceof Number)   {                       // Sensor liefert Wert
        Temp_aussen = (TemperatureDraussenTemperature.state as Number).floatValue         // also Sensortwert übernehmen
        tDelay = null   
    }                                            
     if (Temp_aussen < 19  &&  Zirkulation_Freigabe.state == ON) {
        channel4.sendCommand (ON)    
        tDelay.reschedule(now.plusMinutes(5))
    }else{
       if (Temp_aussen > 19   ) {
         channel4.sendCommand (OFF)    
         tDelay.reschedule(now.plusMinutes(5))
     }
 end
Das Item ist so deffiniert:

Code: Alles auswählen

//Temperatursensor draußen
Number:Temperature     TemperatureDraussenTemperature    "Temperature"     {channel="mihome:sensor_weather_v1:158d0002d80e40:temperature"}
kann mir jemand sagen wo das Problem liegt?

Heavy-Dee
Beiträge: 143
Registriert: 18. Jan 2018 16:38
Answers: 0

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

Beitrag von Heavy-Dee »

Versuch das mal.

Code: Alles auswählen

var Timer tDelay = null

rule "Zirkulation"
when 
    Time cron "0 0/15 * * * ?"       //alle 15min abfrage
then
    var Temp_aussen = 20                                                                  // Default Wert, falls Sensorausfall
    if (TemperatureDraussenTemperature.state instanceof Number)   {                       // Sensor liefert Wert
        Temp_aussen = (TemperatureDraussenTemperature.state as Number)        // also Sensortwert übernehmen
        tDelay = null   
    }                                            
     if (TemperatureDraussenTemperature.state as Number) <= 19)  &&  (Zirkulation_Freigabe.state == ON)) {
        channel4.sendCommand (ON)    
        tDelay.reschedule(now.plusMinutes(5))
    }else{
       if (TemperatureDraussenTemperature.state as Number) > 19   )) {
         channel4.sendCommand (OFF)    
         tDelay.reschedule(now.plusMinutes(5))
     }
 end


Gesendet von meinem SM-A405FN mit Tapatalk


openHab4 (v. 4.1.0) Docker auf Synology DS920+ :!:

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 »

...dann versuch mal beim Initialisieren der Variablen "var Temp_aussen = 20" diese Initialisierung:

Code: Alles auswählen

var Temp_aussen = 20.00
oder

Code: Alles auswählen

var float Temp_aussen = 20
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 »

Hat leider so auch nicht funktioniert.
Der Fehler lieht übrigens in dieser Zeile:

Temp_aussen = (TemperatureDraussenTemperature.state as Number).floatValue // also Sensortwert übernehmen

Heavy-Dee
Beiträge: 143
Registriert: 18. Jan 2018 16:38
Answers: 0

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

Beitrag von Heavy-Dee »

BO80 hat geschrieben:Hat leider so auch nicht funktioniert.
Der Fehler lieht übrigens in dieser Zeile:

Temp_aussen = (TemperatureDraussenTemperature.state as Number).floatValue // also Sensortwert übernehmen
Lass mal das ".float value" weg.

Gesendet von meinem SM-A405FN mit Tapatalk

openHab4 (v. 4.1.0) Docker auf Synology DS920+ :!:

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 »

Hab es jetzt so versucht

Code: Alles auswählen


var Timer tDelay = null

rule "Zirkulation"

when
    
    Time cron "0 0/1 * * * ?"       //alle 15min abfrage

then
    var Temp_aussen = 20.00                                                              // Default Wert, falls Sensorausfall
    if (TemperatureDraussenTemperature.state instanceof Number)   {                       // Sensor liefert Wert
        Temp_aussen = (TemperatureDraussenTemperature.state as Number)      // also Sensortwert übernehmen
        tDelay = null 
    
    }
                                  
            
    
     if (Temp_aussen < 19  &&  Zirkulation_Freigabe.state == ON) {
        channel4.sendCommand (ON)    
        tDelay.reschedule(now.plusMinutes(5))

    }else{
        
       if (Temp_aussen > 19   ) {
         channel4.sendCommand (OFF)    
         tDelay.reschedule(now.plusMinutes(5))
     }




 end


jetzt bekomm ich 2 Fehler
{
"resource": "/etc/openhab2/rules/test.rules",
"owner": "_generated_diagnostic_collection_name_#0",
"code": "org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types",
"severity": 8,
"message": "Type mismatch: cannot convert from Number to double",
"startLineNumber": 13,
"startColumn": 23,
"endLineNumber": 13,
"endColumn": 71
}

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 »

...ich weiss jetzt nicht genau, was in deiner Rule in der angegebenen Zeile steht, aber es fehlt auf jeden Fall eine geschweifte Klammer vor "end".

Ausserdem stimmt etwas bei den Timern nicht, was genau kann ich nicht sagen, aber ich denke es hängt irgendwie mit "Lambda" zusammen. Da müsste ich jetzt auch erst mal herum basteln, aber @Udo1toni kann da schneller helfen.

Das Umwandeln hat bei mir geklappt.

Das ".floatValue" dient übrigens dazu die Einheit (Celsius, etc)aus dem Number-Wert zu entfernen, ansonsten müsstest du die Variable anders definieren.

z.B.:

Code: Alles auswählen

var Temp_aussen = 0.1 | "mm"
oder so ähnlich.

Die Test-rule sieht so aus:

Code: Alles auswählen

var Timer tDelay = null

rule "Zirkulation"

when
    
    Time cron "0 0/1 * * * ?" or //alle 15min abfrage
    Item Dummy4 changed to ON      

then
    logInfo("test", "Rule triggert")
    var Temp_aussen = 20.00                                                              // Default Wert, falls Sensorausfall
    if (Socket_Fritz_03_Temp.state instanceof Number)   {                       // Sensor liefert Wert
        Temp_aussen = (Socket_Fritz_03_Temp.state as Number).floatValue      // also Sensortwert übernehmen
//        tDelay = null 
    logInfo("test", "1 Temp_aussen {}", Temp_aussen)
        }
     if (Temp_aussen < 19  &&  Socket_Fritz_03.state == ON) {
//        channel4.sendCommand (ON)    
//        tDelay.reschedule(now.plusMinutes(5))
          logInfo("test", "2 Temp_aussen {}", Temp_aussen)
    }else{
        
       if (Temp_aussen > 19   ) {
//         channel4.sendCommand (OFF)    
//         tDelay.reschedule(now.plusMinutes(5))
           logInfo("test", "3 Temp_aussen {}", Temp_aussen)
     }
    }
 end
und triggert fröhlich vor sich hin:

Code: Alles auswählen

2020-09-04 11:30:00.009 [INFO ] [.eclipse.smarthome.model.script.test] - Rule triggert
2020-09-04 11:30:00.016 [INFO ] [.eclipse.smarthome.model.script.test] - 1 Temp_aussen 24.0
2020-09-04 11:30:00.023 [INFO ] [.eclipse.smarthome.model.script.test] - 3 Temp_aussen 24.0
Evtl. müsstest du Ablauf-Teil (then) noch mal nachschauen, da die Rule an zwei Stellen triggert.
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 »

Hier noch ein Beispiel der Regel mit den UoMs bzw. Quantity-Items zum Spielen. du musst natürlich wieder deine Items einsetzen.

Code: Alles auswählen

var Timer tDelay = null
rule "Zirkulation"
  when
//    Time cron "0 0/1 * * * ?" or //alle 15min abfrage
    Item Dummy4 changed to ON      
  then
     logInfo("test", "Rule triggert")
     var double Temp_aussen = 20.0                                                              // mit Double-Value scheint's auch zu gehen
     var Temp_innen = 22.0 | "°C"                                                              // mit UoM - Messeinheit
     if (Socket_Fritz_03_Temp.state instanceof Number)   {                       // Sensor liefert Wert
         Temp_aussen = (Socket_Fritz_03_Temp.state as Number).doubleValue      // also Sensortwert übernehmen - als Double
 //        tDelay = null 
     logInfo("test", "1 Temp_aussen {}", Temp_aussen)
         }
      if (Temp_aussen < 19  &&  Socket_Fritz_03.state == ON) {
 //        channel4.sendCommand (ON)    
 //        tDelay.reschedule(now.plusMinutes(5))
           logInfo("test", "2 Temp_aussen {} ", Temp_aussen)
     }else{
        if (Temp_aussen > 19   ) {
 //         channel4.sendCommand (OFF)    
 //         tDelay.reschedule(now.plusMinutes(5))
            logInfo("test", "3 Temp_aussen {} innen {} UoM-Item {}", Temp_aussen, Temp_innen, Socket_Fritz_03_Temp.state)
      }
    }
end
Log:

Code: Alles auswählen

2020-09-04 11:56:01.273 [INFO ] [.eclipse.smarthome.model.script.test] - Rule triggert
2020-09-04 11:56:01.277 [INFO ] [.eclipse.smarthome.model.script.test] - 1 Temp_aussen 25.5
2020-09-04 11:56:01.281 [INFO ] [.eclipse.smarthome.model.script.test] - 3 Temp_aussen 25.5 innen 22.0 °C UoM-Item 25.5 °C
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 »

Jetzt funktioniert es ohne die Timer, danke für deine Hilfe!

Code: Alles auswählen

var Timer tDelay = null

rule "Zirkulation"

when
    
    Time cron "0 0/30 * * * ?"       //alle 30min abfrage

then
    logInfo("test", "Rule triggert")
    var Temp_aussen = 20.00         {                                                     // Default Wert, falls Sensorausfall
    if (TemperatureDraussenTemperature.state instanceof Number)                         // Sensor liefert Wert
        Temp_aussen = (TemperatureDraussenTemperature.state as Number).floatValue      // also Sensortwert übernehmen
       // tDelay = null 
        logInfo("test", "1 Temp_aussen {}", Temp_aussen)
    }
                                  
            
    
     if (Temp_aussen < 19  &&  Zirkulation_Freigabe.state == ON) {
        channel4.sendCommand (ON)    
        
        logInfo("test", "2 Temp_aussen {} ", Temp_aussen)
    }else{
        
       if (Temp_aussen > 19   ) {
         channel4.sendCommand (OFF)    
         
          logInfo("test", "3 Temp_aussen {}" ,Temp_aussen )
     }

    }
 
end


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 habe noch eine Rule (Berechnung der absoluten Luftfeuchtigkeit), welche die Gleichen Fehler liefert "cannot convert from double to int bzw. from Number to double"
Die Rule habe ich als Vorlage gefunden und auf meine Sensoren angepasst.
vielleicht siehst du ja auch hier, was ich falsch gemacht habe?

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



rule "Luftfeuchte Kueche unten"
when
    Time cron "0 0/5 * * * ?"       //alle 5min
then
    // Variablen
    var Number temp_in = (TemperatureKuecheTemperature.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 = (TemperatureKuecheHumidity.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 Kueche", "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", "Kueche lüften")
        
    } else {
        // nicht lüften, Fenster schließen
        logInfo("Luftfeuchte", "Kueche nicht lüften")
    }

 //schreiben der werte in ITEM

   
    //Feuchtegehalt_draussen.sendCommand(abs_hum_out)

    Feuchtegehalt_kueche.sendCommand(abs_hum_in)




end




rule "Luftfeuchte Heizraum unten"
when
    Time cron "0 0/5 * * * ?"       //alle 5min
then
    // Variablen
    var Number temp_in = (TemperatureHeizraumTemperature.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 = (TemperatureHeizraumHumidity.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 Heizraum", "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", "Heizraum lüften")
        
    } else {
        // nicht lüften, Fenster schließen
        logInfo("Luftfeuchte", "Heizraum nicht lüften")
    }

 //schreiben der werte in ITEM

   
    //Feuchtegehalt_draussen.sendCommand(abs_hum_out)

    Feuchtegehalt_heizraum.sendCommand(abs_hum_in)




end





rule "Luftfeuchte Bad unten"
when
    Time cron "0 0/5 * * * ?"       //alle 5min
then
    // Variablen
    var Number temp_in = (TemperaturBad_Temperature.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 = (TemperaturBad_Humidity.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 Bad", "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", "Bad lüften")
        
    } else {
        // nicht lüften, Fenster schließen
        logInfo("Luftfeuchte", "Bad nicht lüften")
    }

 //schreiben der werte in ITEM

   
    Feuchtegehalt_draussen.sendCommand(abs_hum_out)
    Feuchtegehalt_bad.sendCommand(abs_hum_in)




end


rule "Luftfeuchte Tina unten"
when
    Time cron "0 0/5 * * * ?"       //alle 5min
then
    // Variablen
    var Number temp_in = (TemperatureTinaUntenTemperature.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 = (TemperatureTinaUntenHumidity.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 Tina", "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", "Tina unten lüften")
        
    } else {
        // nicht lüften, Fenster schließen
        logInfo("Luftfeuchte", "Tina unten nicht lüften")
    }

    Feuchtegehalt_draussen.sendCommand(abs_hum_out)
    Feuchtegehalt_tina.sendCommand(abs_hum_in)




end


rule "Luftfeuchte Wohnzimmer"
when
    Time cron "0 0/5 * * * ?"       //alle 5min
then
    // Variablen
    var Number temp_in = (TemperaturWohnzimmer_Temperature.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 = (TemperaturWohnzimmer_Humidity.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 Wohnzimmer", "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", "Wohnzimmer lüften")
        
    } else {
        // nicht lüften, Fenster schließen
        logInfo("Luftfeuchte", "Wohnzimmer nicht lüften")
    }

    Feuchtegehalt_draussen.sendCommand(abs_hum_out)
    Feuchtegehalt_wohnzimmer.sendCommand(abs_hum_in)



end


rule "Luftfeuchte Eltern unten"
when
    Time cron "0 0/5 * * * ?"       //alle 5min
then
    // Variablen
    var Number temp_in = (TemperatureElternUntenTemperature.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 = (TemperatureElternUntenHumidity.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 Eltern unten", "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", "Eltern unten lüften")
        
    } else {
        // nicht lüften, Fenster schließen
        logInfo("Luftfeuchte", "Eltern unten nicht lüften")
    }

    Feuchtegehalt_draussen.sendCommand(abs_hum_out)
    Feuchtegehalt_eltern_unten.sendCommand(abs_hum_in)





end


rule "Luftfeuchte Eltern Oben"
when
    Time cron "0 0/5 * * * ?"       //alle 5min
then
    // Variablen
    var Number temp_in = (TemperatureElternObenTemperature.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 = (TemperatureElternObenHumidity.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 Eltern oben", "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", "Eltern oben lüften")
        
    } else {
        // nicht lüften, Fenster schließen
        logInfo("Luftfeuchte", "Eltern oben nicht lüften")
    }


    Feuchtegehalt_draussen.sendCommand(abs_hum_out)
    Feuchtegehalt_eltern_oben.sendCommand(abs_hum_in)



end





rule "Luftfeuchte Tina Oben"
when
    Time cron "0 0/5 * * * ?"       //alle 5min
then
    // Variablen
    var Number temp_in = (TemperatureTinaObenTemperature.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 = (TemperatureTinaObenHumidity.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 Tina oben", "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", "Tina oben lüften")
        
    } else {
        // nicht lüften, Fenster schließen
        logInfo("Luftfeuchte", "Tina oben nicht lüften")
    }


    Feuchtegehalt_draussen.sendCommand(abs_hum_out)
    Feuchtegehalt_Tina_oben.sendCommand(abs_hum_in)



end

Antworten