Persistence not working

EDIT : I found the “error”: apparently the name of the persistence files should be in lowercase letters. I had it named “JDBC.persistence” to reflect the exact name as found on https://github.com/openhab/openhab/wiki/Persistence. As soon as I renamed the file to “jdbc.persistence” everything started to work as expected.

I have a MariaDB-Server running on the same machine the OpenHab-Server is running.
The connection via “MySQL Persistence” and “JDBC Persistence MariaDB” are working, since a single table named items/Items (depends on the persistence method) is created.
This table, however, stays empty and it is the only table that gets created.

If I add graphs for items in my sitemap, tables for these items get created, but they stay empty. What am I doing wrong?

This is my persistence file:

Strategies {
    everyHour : "0 0 * * * ?"
    everyDay  : "0 0 0 * * ?"
    
    default = everyChange
}

Items {    
    Temperaturen* -> "Temperaturen" : strategy=everyChange,everyUpdate
    Wunschtemperaturen* -> "Wunschtemperaturen" : strategy=everyChange,restoreOnStartup
    Heizungseinstellungen* -> "Heizungseinstellungen" : strategy=everyChange,restoreOnStartup
    Heizung_noetig -> "Heizung_noetig": strategy=everyChange
    Heizung_noetig_count -> "Heizung_noetig_count": strategy=everyChange
    
    // Just for testing purposes
    * : strategy = everyChange, everyDay, restoreOnStartup
}

For details see the next post.

I can’t find any suspicious entries in the karaf log, at least there is nothing persistence or jdbc related. The solution from https://community.openhab.org/t/mysql-persistence-empty-database/2174 didn’t help either.

I do not have any hardware attached to the server yet, all I did is set up the logic using Math:random for all my temperature readings.
It is now set up the following way:

  • Each room has 1 or more thermostats attached to the room’s radiators
  • These thermostats deliver temperature values and can hold a setpoint value
  • The mean temperature of each room is calculated using all available temperature sensors in that room
  • This mean temperature is compared to a room setpoint temperature (these are virtual items)
  • If the temperature in X rooms is below the room setpoint temperature+hysteresis & it is heating time, start the heating (X, hysteresis and heating time are virtual items as well)

This is working quite well with random temperature readings, the last missing piece is now persisting all virtual items (and probably all temperatures, just because it is nice to have).

Here are all other configuration files, maybe the error is within them:

Sitemap:

sitemap Wohnung label="Wohnung"
{
    Chart item=Temperaturen_Wohnzimmer_Thermostat1 period=D refresh=10000  
    Chart item=Temperaturen_Wohnzimmer_Thermostat2 period=D refresh=10000  
    Chart item=Temperaturen_Wohnzimmer_Thermostat3 period=D refresh=10000  
    
    Frame label="Heizung" {
        Text item=Heizung_AnAus 
        Group label="erweiterte Einstellungen" icon="settings" {
            Frame label="Heizungsstatus" {
                Switch item=Heizung_AnAus
                Text item=Heizung_noetig
                Text item=Heizung_noetig_count
                Switch item=Heizzeit
                Group item=Differenzen label="einzelne Differenzen"
            }
            Frame label="Einstellungen" {        
                Setpoint item=Hysterese    minValue=0 maxValue=4 step=0.1    
                Setpoint item=ben_Anzahl_Raeume    minValue=1 maxValue=7 step=1
            }
            
        }        
    }

    Frame label="Diverses" {
        Group label="Serverinfo" item=Serverinfo icon="info" {
            Frame label="CPU" {
                Text item=CPU_usage
            }
            Frame label="RAM" {
                Text item=RAM_free
            }
            Frame label="HDD" {
                Text item=EMMC_free
            }
        }
        Text item=Serverzeit
    }    
    
    Frame label="Internet-Daten" {
        Text item=Yahoo_Temperatur
        Text item=Yahoo_Feuchtigkeit
    }    
    
    Frame label="Sonne" {
        Text item=Sonnenaufgang_Zeit
        Text item=Sonnenuntergang_Zeit
    }

    Frame label="Wunschtemperaturen" {
        Setpoint label="Wohnzimmer" item=Wunschtemperatur_Wohnzimmer icon="sofa" minValue=5 maxValue=30 step=0.2
        Setpoint label="Schlafzimmer" item=Wunschtemperatur_Schlafzimmer icon="bedroom" minValue=5 maxValue=30 step=0.2
        Setpoint label="Küche" item=Wunschtemperatur_Kueche icon="kitchen" minValue=5 maxValue=30 step=0.2
        Setpoint label="Bad" item=Wunschtemperatur_Bad icon="bath" minValue=5 maxValue=30 step=0.2
        Setpoint label="WC" item=Wunschtemperatur_WC icon="toilet" minValue=5 maxValue=30 step=0.2
        Setpoint label="Vorraum" item=Wunschtemperatur_Vorraum icon="corridor" minValue=5 maxValue=30 step=0.2
        Setpoint label="Zwischenraum" item=Wunschtemperatur_Zwischenraum icon="corridor" minValue=5 maxValue=30 step=0.2
    }
    
    Frame label="Isttemperaturen" {
        Text label="Wohnzimmer" item=Temperaturen_Wohnzimmer icon="sofa"
        Text label="Schlafzimmer" item=Temperaturen_Schlafzimmer icon="bedroom"
        Text label="Küche" item=Temperaturen_Kueche icon="kitchen"
        Text label="Bad" item=Temperaturen_Bad icon="bath"
        Text label="WC" item=Temperaturen_WC icon="toilet"
        Text label="Vorraum" item=Temperaturen_Vorraum icon="corridor"
        Text label="Zwischenraum" item=Temperaturen_Zwischenraum icon="corridor"
    }
    
    Frame label="Details" {
        Group label="Wohnzimmer" item=Wohnzimmer icon="sofa"
        Group label="Schlafzimmer" item=Schlafzimmer icon="bedroom"
        Group label="Küche" item=Kueche icon="kitchen"
        Group label="Bad" item=Bad icon="bath"
        Group label="WC" item=WC icon="toilet"        
        Group label="Vorraum" item=Vorraum icon="corridor"
        Group label="Zwischenraum" item=Zwischenraum icon="corridor"        
    }
    
}

Items:

/* Groups */

Group Wohnzimmer
Group Schlafzimmer
Group Kueche
Group Bad
Group WC
Group Vorraum
Group Zwischenraum

Group Thermostate

Group Temperaturen
/* gemittelte-Isttemperaturen */
Group:Number:AVG    Temperaturen_Wohnzimmer    "mittlere Temperatur [%.1f °C]"    <temperature>    (Temperaturen_Wohnzimmer,Wohnzimmer)
Group:Number:AVG    Temperaturen_Schlafzimmer    "mittlere Temperatur [%.1f °C]"    <temperature>    (Temperaturen_Schlafzimmer,Schlafzimmer)
Group:Number:AVG    Temperaturen_Kueche    "mittlere Temperatur [%.1f °C]"    <temperature>    (Temperaturen_Kueche,Kueche)
Group:Number:AVG    Temperaturen_Bad    "mittlere Temperatur [%.1f °C]"    <temperature>    (Temperaturen_Bad,Bad)
Group:Number:AVG    Temperaturen_WC    "mittlere Temperatur [%.1f °C]"    <temperature>    (Temperaturen_WC,WC)
Group:Number:AVG    Temperaturen_Vorraum    "mittlere Temperatur [%.1f °C]"    <temperature>    (Temperaturen_Vorraum,Vorraum)
Group:Number:AVG    Temperaturen_Zwischenraum    "mittlere Temperatur [%.1f °C]"    <temperature>    (Temperaturen_Zwischenraum,Zwischenraum)

/* Differenzen Soll/Ist */
Group:Number:MAX    Differenzen    "maximale Abweichung [%.1f °C]"    <temperature>
Number Differenzen_Wohnzimmer    "Temperaturdifferenz Wohnzimmer [%.1f °C]"    <temperature>    (Differenzen,Wohnzimmer)
Number Differenzen_Schlafzimmer    "Temperaturdifferenz Schlafzimmer [%.1f °C]"    <temperature>    (Differenzen,Schlafzimmer)
Number Differenzen_Kueche    "Temperaturdifferenz Küche [%.1f °C]"    <temperature>    (Differenzen,Kueche)
Number Differenzen_Bad    "Temperaturdifferenz Bad [%.1f °C]"    <temperature>    (Differenzen,Bad)
Number Differenzen_WC    "Temperaturdifferenz WC [%.1f °C]"    <temperature>    (Differenzen,WC)
Number Differenzen_Vorraum    "Temperaturdifferenz Vorraum [%.1f °C]"    <temperature>    (Differenzen,Vorraum)
Number Differenzen_Zwischenraum    "Temperaturdifferenz Zwischenraum [%.1f °C]"    <temperature>    (Differenzen,Zwischenraum)

Group Wunschtemperaturen
Group Wunschtemperaturen_Wohnzimmer
Group Wunschtemperaturen_Schlafzimmer
Group Wunschtemperaturen_Kueche
Group Wunschtemperaturen_Bad
Group Wunschtemperaturen_WC
Group Wunschtemperaturen_Vorraum
Group Wunschtemperaturen_Zwischenraum

Group Wunschtemperaturen_Raum
Group Feuchtigkeiten

Group Yahoo
Group Astro
Group Serverinfo

Group Heizungseinstellungen

/* Heizungs-Steuerungslogik*/
Switch Heizung_noetig "Heizung nötig [MAP(janein.map):%s]"    <heating>
Number Heizung_noetig_count "Heizung nötig in x Räumen [%d]" <heating>
Number Hysterese "Hysterese [%.1f °C]" <temperature> (Heizungseinstellungen)
Number ben_Anzahl_Raeume "min. Räume nötig für Heizungsstart [%d]"    <heating> (Heizungseinstellungen)
Switch Heizzeit "Heizzeit [MAP(janein.map):%s]" <clock> (Heizungseinstellungen)
Switch Heizung_AnAus "Heizung Ein/Aus [MAP(einaus.map):%s]" <switch>

/* Thermostate-Isttemperaturen */
Number Temperaturen_Wohnzimmer_Thermostat1    "Ist-Temperatur T1 [%.1f °C]"    <temperature>    (Temperaturen,Temperaturen_Wohnzimmer,Wohnzimmer)
Number Temperaturen_Wohnzimmer_Thermostat2    "Ist-Temperatur T2 [%.1f °C]"    <temperature>    (Temperaturen,Temperaturen_Wohnzimmer,Wohnzimmer)
Number Temperaturen_Wohnzimmer_Thermostat3    "Ist-Temperatur T3 [%.1f °C]"    <temperature>    (Temperaturen,Temperaturen_Wohnzimmer,Wohnzimmer)

Number Temperaturen_Schlafzimmer_Thermostat1    "Ist-Temperatur T1 [%.1f °C]"    <temperature>    (Temperaturen,Temperaturen_Schlafzimmer,Schlafzimmer)
Number Temperaturen_Schlafzimmer_Thermostat2    "Ist-Temperatur T2 [%.1f °C]"    <temperature>    (Temperaturen,Temperaturen_Schlafzimmer,Schlafzimmer)

Number Temperaturen_Kueche_Thermostat1    "Ist-Temperatur T1 [%.1f °C]"    <temperature>    (Temperaturen,Temperaturen_Kueche,Kueche)

Number Temperaturen_Bad_Thermostat1    "Ist-Temperatur T1 [%.1f °C]"    <temperature>    (Temperaturen,Temperaturen_Bad,Bad)

Number Temperaturen_WC_Thermostat1    "Ist-Temperatur T1 [%.1f °C]"    <temperature>    (Temperaturen,Temperaturen_WC,WC)

Number Temperaturen_Vorraum_Thermostat1    "Ist-Temperatur T1 [%.1f °C]"    <temperature>    (Temperaturen,Temperaturen_Vorraum,Vorraum)

Number Temperaturen_Zwischenraum_Thermostat1    "Ist-Temperatur T1 [%.1f °C]"    <temperature>    (Temperaturen,Temperaturen_Zwischenraum,Zwischenraum)

/* Wunschtemperaturen */
Number Wunschtemperatur_Wohnzimmer    "[%.1f °C]"    <temperature>    (Wunschtemperaturen_Raum)
Number Wunschtemperatur_Schlafzimmer    "[%.1f °C]"    <temperature>    (Wunschtemperaturen_Raum)
Number Wunschtemperatur_Kueche        "[%.1f °C]"    <temperature>    (Wunschtemperaturen_Raum)
Number Wunschtemperatur_Bad        "[%.1f °C]"    <temperature>    (Wunschtemperaturen_Raum)
Number Wunschtemperatur_WC        "[%.1f °C]"    <temperature>    (Wunschtemperaturen_Raum)
Number Wunschtemperatur_Vorraum        "[%.1f °C]"    <temperature>    (Wunschtemperaturen_Raum)
Number Wunschtemperatur_Zwischenraum        "[%.1f °C]"    <temperature>    (Wunschtemperaturen_Raum)

/* Thermostate-Wunschtemperaturen */
Number Wunschtemperaturen_Wohnzimmer_Thermostat1    "Wunschtemperatur T1 [%.1f °C]"    <temperature>    (Wunschtemperaturen,Wunschtemperaturen_Wohnzimmer,Wohnzimmer)
Number Wunschtemperaturen_Wohnzimmer_Thermostat2    "Wunschtemperatur T2 [%.1f °C]"    <temperature>    (Wunschtemperaturen,Wunschtemperaturen_Wohnzimmer,Wohnzimmer)
Number Wunschtemperaturen_Wohnzimmer_Thermostat3    "Wunschtemperatur T3 [%.1f °C]"    <temperature>    (Wunschtemperaturen,Wunschtemperaturen_Wohnzimmer,Wohnzimmer)

Number Wunschtemperaturen_Schlafzimmer_Thermostat1    "Wunschtemperatur T1 [%.1f °C]"    <temperature>    (Wunschtemperaturen,Wunschtemperaturen_Schlafzimmer,Schlafzimmer)
Number Wunschtemperaturen_Schlafzimmer_Thermostat2    "Wunschtemperatur T2 [%.1f °C]"    <temperature>    (Wunschtemperaturen,Wunschtemperaturen_Schlafzimmer,Schlafzimmer)

Number Wunschtemperaturen_Kueche_Thermostat1    "Wunschtemperatur T1 [%.1f °C]"    <temperature>    (Wunschtemperaturen,Wunschtemperaturen_Kueche,Kueche)

Number Wunschtemperaturen_Bad_Thermostat1    "Wunschtemperatur T1 [%.1f °C]"    <temperature>    (Wunschtemperaturen,Wunschtemperaturen_Bad,Bad)

Number Wunschtemperaturen_WC_Thermostat1    "Wunschtemperatur T1 [%.1f °C]"    <temperature>    (Wunschtemperaturen,Wunschtemperaturen_WC,WC)

Number Wunschtemperaturen_Vorraum_Thermostat1    "Wunschtemperatur T1 [%.1f °C]"    <temperature>    (Wunschtemperaturen,Wunschtemperaturen_Vorraum,Vorraum)

Number Wunschtemperaturen_Zwischenraum_Thermostat1    "Wunschtemperatur T1 [%.1f °C]"    <temperature>    (Wunschtemperaturen,Temperaturen_Zwischenraum,Zwischenraum)

/* Server Stuff */
Number CPU_usage     "CPU-Auslastung [%.1f %%]"             <settings>    (Serverinfo)    {channel="systeminfo:computer:odroid:cpu#load"}
Number RAM_free     "freier RAM [%.1f %%]"                 <settings>    (Serverinfo)    {channel="systeminfo:computer:odroid:memory#availablePercent"}
Number EMMC_free     "freier Speicherplatz [%.1f %%]"    <settings>    (Serverinfo)    {channel="systeminfo:computer:odroid:storage#availablePercent"}

/* Yahoo Wetter */
Number Yahoo_Temperatur     "Außentemperatur [%.1f °C]"            <temperature>    (Yahoo)    {channel="yahooweather:weather:72195863:temperature"}
Number Yahoo_Feuchtigkeit         "Luftfeuchtigkeit [%.1f %%]"            <humidity>        (Feuchtigkeiten, Yahoo)    {channel="yahooweather:weather:72195863:humidity"}

/* Sonne und Mond */
DateTime Sonnenaufgang_Zeit    "Sonnenaufgang [%1$tH:%1$tM]"         <sunrise>   (Astro)    { channel = "astro:sun:local:rise#start" }
DateTime Sonnenuntergang_Zeit    "Sonnenuntergang [%1$tH:%1$tM]"       <sunset>    (Astro)    { channel = "astro:sun:local:set#start" }

DateTime Serverzeit "Serverzeit [%1$tH:%1$tM]" <settings> {channel="ntp:ntp:local:dateTime"}

Rules:

rule "Variablendeklaration"
when
    System started    
then
    /* Wunschtemperaturen */
    /*
    Wunschtemperaturen_Raum.members.forEach(xtemperature|
        sendCommand(xtemperature, 22)
    )        
    
    Wunschtemperaturen.members.forEach(wtemperature|
        sendCommand(wtemperature, 22)
    ) */    
    
    Temperaturen.members.forEach(utemperature|
        sendCommand(utemperature, 20.0 + (25.0 - (Math::random * 50.0).intValue) / 10.0)
    )
    
    Differenzen.members.forEach(differenz|
        sendCommand(differenz,0)
    )
    
/*    
    sendCommand(Heizung_noetig,"OFF")
    sendCommand(ben_Anzahl_Raeume,2)
    sendCommand(Heizzeit,"OFF")
    sendCommand(Heizung_AnAus,"OFF")
    sendCommand(Hysterese,0.5)*/
end

rule "Zufallswerte"
when
    Time cron "0/30 * * * * ?"
then
    Temperaturen.members.forEach(utemperature|
        sendCommand(utemperature, 22.0 + (25 - (Math::random * 50.0).intValue) / 10.0)
    )
    sendCommand(Heizzeit, if(Math::random > 0.6) OFF else ON);
end


/* Früh */
rule "Frueh an"
when
    Time cron "0 0 6 ? * MON-SUN"
then
    sendCommand(Heizzeit,"ON")
end

rule "Frueh aus"
when
    Time cron "0 0 8 ? * MON-SUN"
then
    sendCommand(Heizzeit,"OFF")
end

/* Abend */
rule "Abend an"
when
    Time cron "0 0 18 ? * MON-SUN"
then
    sendCommand(Heizzeit,"ON")
end

rule "Abend aus"
when
    Time cron "0 0 22 ? * MON-SUN"
then
    sendCommand(Heizzeit,"OFF")
end



rule "Heizung Ein-/Ausschalten"
when
    Item Heizzeit changed or
    Item Heizung_noetig changed
then
    if(Heizzeit.state == ON && Heizung_noetig.state == ON) {
        sendCommand(Heizung_AnAus,"ON")
    } else {
        sendCommand(Heizung_AnAus,"OFF")
    }
end

rule "Differenz ermitteln - Wohnzimmer"
when
    Item Wunschtemperatur_Wohnzimmer changed or
    Item Temperaturen_Wohnzimmer changed    
then
    var double wunsch=(Wunschtemperatur_Wohnzimmer.state as DecimalType).doubleValue
    var double ist=(Temperaturen_Wohnzimmer.state as DecimalType).doubleValue
    postUpdate(Differenzen_Wohnzimmer,wunsch-ist)        
end

rule "Differenz ermitteln - Schlafzimmer"
when
    Item Wunschtemperatur_Schlafzimmer changed or
    Item Temperaturen_Schlafzimmer changed
then
    var double wunsch=(Wunschtemperatur_Schlafzimmer.state as DecimalType).doubleValue
    var double ist=(Temperaturen_Schlafzimmer.state as DecimalType).doubleValue
    postUpdate(Differenzen_Schlafzimmer,wunsch-ist)        
end

rule "Differenz ermitteln - Kueche"
when
    Item Wunschtemperatur_Kueche changed or
    Item Temperaturen_Kueche changed
then
    var double wunsch=(Wunschtemperatur_Kueche.state as DecimalType).doubleValue
    var double ist=(Temperaturen_Kueche.state as DecimalType).doubleValue
    postUpdate(Differenzen_Kueche,wunsch-ist)        
end

rule "Differenz ermitteln - Bad"
when
    Item Wunschtemperatur_Bad changed or
    Item Temperaturen_Bad changed
then
    var double wunsch=(Wunschtemperatur_Bad.state as DecimalType).doubleValue
    var double ist=(Temperaturen_Bad.state as DecimalType).doubleValue
    postUpdate(Differenzen_Bad,wunsch-ist)        
end

rule "Differenz ermitteln - WC"
when
    Item Wunschtemperatur_WC changed or
    Item Temperaturen_WC changed
then
    var double wunsch=(Wunschtemperatur_WC.state as DecimalType).doubleValue
    var double ist=(Temperaturen_WC.state as DecimalType).doubleValue
    postUpdate(Differenzen_WC,wunsch-ist)        
end

rule "Differenz ermitteln - Vorraum"
when
    Item Wunschtemperatur_Vorraum changed or
    Item Temperaturen_Vorraum changed
then
    var double wunsch=(Wunschtemperatur_Vorraum.state as DecimalType).doubleValue
    var double ist=(Temperaturen_Vorraum.state as DecimalType).doubleValue
    postUpdate(Differenzen_Vorraum,wunsch-ist)        
end

rule "Differenz ermitteln - Zwischenraum"
when
    Item Wunschtemperatur_Zwischenraum changed or
    Item Temperaturen_Zwischenraum changed
then
    var double wunsch=(Wunschtemperatur_Zwischenraum.state as DecimalType).doubleValue
    var double ist=(Temperaturen_Zwischenraum.state as DecimalType).doubleValue
    postUpdate(Differenzen_Zwischenraum,wunsch-ist)        
end

rule "Anzahl der Differenzen ermitteln"
when
    Item Differenzen received update or
    Item Hysterese changed
then
    var double count=0
    var double hysterese=(Hysterese.state as DecimalType).doubleValue
    /* Hysterese + 0,0001 wegen Ungenauigkeiten in der Berechnung */
    Differenzen.members.filter( x | x.state > hysterese+0.0001 ).forEach[ item |
        count=count+1
    ]
    postUpdate(Heizung_noetig_count,count)
end

rule "Heizung nötig berechnen"
when
    Item Heizung_noetig_count changed or
    Item ben_Anzahl_Raeume changed    
then
    var double hnc=(Heizung_noetig_count.state as DecimalType).doubleValue
    var double bar=(ben_Anzahl_Raeume.state as DecimalType).doubleValue
    if (hnc>=bar) {
        postUpdate(Heizung_noetig,"ON")
    } else {
        postUpdate(Heizung_noetig,"OFF")
    }
end

rule "Raumwunschtemperaturen -> Thermostate - Wohnzimmer"
when
    Item Wunschtemperatur_Wohnzimmer changed
then
    var double neue_wunschtemperatur=(Wunschtemperatur_Wohnzimmer.state as DecimalType).doubleValue
    Wunschtemperaturen_Wohnzimmer.members.forEach(temperature_setpoint|        
            
        sendCommand(temperature_setpoint,neue_wunschtemperatur)
    )
end

rule "Raumwunschtemperaturen -> Thermostate - Schlafzimmer"
when
    Item Wunschtemperatur_Schlafzimmer changed
then
    var double neue_wunschtemperatur=(Wunschtemperatur_Schlafzimmer.state as DecimalType).doubleValue
    Wunschtemperaturen_Schlafzimmer.members.forEach(temperature_setpoint|        
                
        sendCommand(temperature_setpoint,neue_wunschtemperatur)
    )
end

rule "Raumwunschtemperaturen -> Thermostate - Kueche"
when
    Item Wunschtemperatur_Kueche changed
then
    var double neue_wunschtemperatur=(Wunschtemperatur_Kueche.state as DecimalType).doubleValue
    Wunschtemperaturen_Kueche.members.forEach(temperature_setpoint|        
    
        sendCommand(temperature_setpoint,neue_wunschtemperatur)
    )
end

rule "Raumwunschtemperaturen -> Thermostate - Bad"
when
    Item Wunschtemperatur_Bad changed
then
    var double neue_wunschtemperatur=(Wunschtemperatur_Bad.state as DecimalType).doubleValue
    Wunschtemperaturen_Bad.members.forEach(temperature_setpoint|        
    
        sendCommand(temperature_setpoint,neue_wunschtemperatur)
    )
end

rule "Raumwunschtemperaturen -> Thermostate - WC"
when
    Item Wunschtemperatur_WC changed
then
    var double neue_wunschtemperatur=(Wunschtemperatur_WC.state as DecimalType).doubleValue
    Wunschtemperaturen_WC.members.forEach(temperature_setpoint|        
    
        sendCommand(temperature_setpoint,neue_wunschtemperatur)
    )
end

rule "Raumwunschtemperaturen -> Thermostate - Vorraum"
when
    Item Wunschtemperatur_Vorraum changed
then
    var double neue_wunschtemperatur=(Wunschtemperatur_Vorraum.state as DecimalType).doubleValue
    Wunschtemperaturen_Vorraum.members.forEach(temperature_setpoint|        
    
        sendCommand(temperature_setpoint,neue_wunschtemperatur)
    )
end

rule "Raumwunschtemperaturen -> Thermostate - Zwischenraum"
when
    Item Wunschtemperatur_Zwischenraum changed
then
    var double neue_wunschtemperatur=(Wunschtemperatur_Zwischenraum.state as DecimalType).doubleValue
    Wunschtemperaturen_Zwischenraum.members.forEach(temperature_setpoint|        
    
        sendCommand(temperature_setpoint,neue_wunschtemperatur)
    )
end