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