Nachdem ich mittlerweile mein system gut aufgesockt habe wird es langsam zeit die Heizungssteuerung mal fertig zu machen
den die Kühle zeit kommt ja langsam ^^
die Rule ansich habe ich denke ich soweit fertig nur wollen wir das die heizung nicht Heizt wenn ein fenster auf ist.
damit ich jetzt nicht die ganzen items rules etc hier hoch laden muss hier mal nur alles aus einem zimmer
.items (Fenster und Heizung)
Code: Alles auswählen
//INT0000001 Florian Zimmer
Switch FZimmer_Unreach "Florian Zimmer" <siren> (Unreach_Group,Unreach_Florian) {channel="homematic:HM-CC-VG-1:3014F711A0001F5A4993D3F2:INT0000001:0#UNREACH"}
Switch FZimmer_Pending "Florian Zimmer" <siren> (Pending_Group,Pending_Florian) {channel="homematic:HM-CC-VG-1:3014F711A0001F5A4993D3F2:INT0000001:0#CONFIG_PENDING"}
Switch FZimmer_LowBat "Florian LowBat" <battery> (Bat_Binary,Bat_Binary_Florian) {channel="homematic:HM-CC-VG-1:3014F711A0001F5A4993D3F2:INT0000001:0#LOWBAT"}
Contact FZimmer_Fenster_State "Fenster [MAP(window.map):%s]" <contact> (Windows,gFZimmer) {channel="homematic:HM-Sec-SC-2:3014F711A0001F5A4993D3F2:OEQ1477775:1#STATE"}
String FZimmer_Fenster_Error "Fenster [MAP(HM-Sec-SCo.map):%s]" <error2> (Error_Group,Error_Florian) {channel="homematic:HM-Sec-SC-2:3014F711A0001F5A4993D3F2:OEQ1477775:1#ERROR"}
Contact FZimmer_DachFenster_State "DachFenster [MAP(window.map):%s]" <contact> (Windows,gFZimmer) {channel="homematic:HM-Sec-SC-2:3014F711A0001F5A4993D3F2:OEQ1477397:1#STATE"}
String FZimmer_DachFenster_Error "DachFenster [MAP(HM-Sec-SCo.map):%s]" <error2> (Error_Group,Error_Florian) {channel="homematic:HM-Sec-SC-2:3014F711A0001F5A4993D3F2:OEQ1477397:1#ERROR"}
String FZimmer_Heizung_Fault "Heizung [MAP(HM-CC-RT-DN.map):%s]" <error2> (Error_Group,Error_Florian) {channel="homematic:HM-CC-RT-DN:3014F711A0001F5A4993D3F2:QEQ1293126:4#FAULT_REPORTING"}
Number:ElectricPotential FZimmer_Heizung_Battery "Heizung [%.1f V]" <"battery-100"> (Heating_FZ,Bat_Volts,Bat_Volts_Florian) {channel="homematic:HM-CC-RT-DN:3014F711A0001F5A4993D3F2:QEQ1293126:4#BATTERY_STATE"}
Number:Dimensionless FZimmer_Heizung_Valve "Florian [%d %%]" <heating> (Heating_FZ,Heating_ValveSettings,Valve_DG) {channel="homematic:HM-CC-RT-DN:3014F711A0001F5A4993D3F2:QEQ1293126:4#VALVE_STATE"}
//Gruppe
Number:Temperature FZimmer_ActTemp "Florian Heizung Ist-Temperatur [%.1f °C]" <temperature> (Heating_FZ) {channel="homematic:HM-CC-VG-1:3014F711A0001F5A4993D3F2:INT0000001:1#ACTUAL_TEMPERATURE"}
Number:Temperature FZimmer_SetTemp "Florian Heizung Soll-Temperatur [%.1f °C]" <temperature> (Heating_FZ,Heating_TargetTemps) {channel="homematic:HM-CC-VG-1:3014F711A0001F5A4993D3F2:INT0000001:1#SET_TEMPERATURE"}
//Number:Dimensionless FZimmer_ActHumidity "Luftfeuchtigkeit [%d %%]" <humidity> (Heating_FZ) {channel="homematic:HM-CC-VG-1:3014F711A0001F5A4993D3F2:INT0000001:1#ACTUAL_HUMIDITY"}
String FZimmer_Mode "Florian Heizung Betriebsart [MAP(HM-CC-RT-DN.map):%s]" <"heating-off"> (Heating_FZ,Heating_OpModes) {channel="homematic:HM-CC-VG-1:3014F711A0001F5A4993D3F2:INT0000001:1#CONTROL_MODE"}
Switch FZimmer_Auto "Florian Heizung Auto-Mode" <temperature> (Heating_FZ) {channel="homematic:HM-CC-VG-1:3014F711A0001F5A4993D3F2:INT0000001:1#AUTO_MODE"}
Number:Temperature FZimmer_Manu "Florian Heizung Manu-Mode [%.1f °C]" <"heating-40"> (Heating_FZ) {channel="homematic:HM-CC-VG-1:3014F711A0001F5A4993D3F2:INT0000001:1#MANU_MODE"}
Switch FZimmer_BoostMode "Florian Heizung Boost-Mode" <fire> (Heating_FZ) {channel="homematic:HM-CC-VG-1:3014F711A0001F5A4993D3F2:INT0000001:1#BOOST_MODE"}
Number FZimmer_BoostTime "Florian Heizung Boost-Restdauer" <"clock-on"> (Heating_FZ) {expire="300s"}
Number FZimmer_Preset "Florian Heizung Soll-Temperatur Schnellauswahl" <"heating-60"> (Heating_FZ)
Number FZimmer_PresetTemp "Florian Heizung Soll-Temperatur Zeitprogramm [%.1f °C]" <line> (Heating_FZ,Heating_TargetPresets_FZ)
String FZimmer_Summary "Florian Heizung Übersicht [%s]" <thermometer_red> (Heating_FZ)
//Contact FZimmer_State "Florian [MAP(window-gruppe.map):%s]" <contact> (Windows) {channel="homematic:HM-CC-VG-1:3014F711A0001F5A4993D3F2:INT0000001:2#STATE"}
String Whg_Heating_Mode_FZ "Florian [MAP(heizmodus.map):%s]" <heating> (Whg)
Switch Whg_Heating_UpdateHeater_FZ "Florian Soll-Temperaturen" <heating> (Whg)
// Wartung Florian Zimmer
Group:Number:SUM Unreach_Florian "Nicht erreichbare Geräte [%d]" <siren>
Group:Number:SUM Pending_Florian "Geräte mit ausstehender Konfig. [%d]" <siren>
Group:Number:SUM Error_Florian "Geräte mit Fehlerzustand [%d]" <error2>
Group:Number:SUM Bat_Binary_Florian "Batteriezustände (Binary) [%d]" <battery>
Group:Number:MIN Bat_Percent_Florian "Batteriezustände (%) [%d %%]" <battery>
Group:Number:MIN Bat_Volts_Florian "Batteriezustände (Volt) [%.1f V]" <battery>
.rule
Code: Alles auswählen
val String filename = "heizung-modus.rules"
// vordefinierte Temperaturen
val Number tempHigh = 24.0
val Number tempComfort = 21.0
val Number tempMid = 19.0
val Number tempLower = 17.0
val Number tempChill = 15.0
val Number tempAway = 15.0
val Number tempAwayLonger = 14.0
val Number tempOff = 4.5
//Florian Zimmer
rule "System started"
when
System started
then
createTimer(now.plusSeconds(180)) [ |
logInfo(filename, "Whg_Heating system started")
if (Whg_Heating_Mode_FZ.state == NULL) Whg_Heating_Mode_FZ.postUpdate("OFF_SUMMER")
Heating_TargetPresets_FZ.members.filter[item | item.state == NULL].forEach[item | item.postUpdate(tempMid)]
Whg_Heating_UpdateHeater_FZ.sendCommand(ON)
]
end
//Florian Zimmer
rule "Heizmodus umschalten und Stellglieder setzen"
when
Item Whg_Heating_Mode_FZ received update or
Item Whg_Heating_UpdateHeater_FZ received command ON
then
Whg_Heating_UpdateHeater_FZ.postUpdate(OFF)
logInfo(filename, "Wohnung Heizmodus: " + Whg_Heating_Mode_FZ.state)
switch Whg_Heating_Mode_FZ.state {
case "NORMAL" : {
FZimmer_Manu.sendCommand(FZimmer_PresetTemp.state as Number)
}
case "PARTY" : {
FZimmer_Manu.sendCommand(tempAwayLonger)
}
case "SICKDAY" : {
FZimmer_Manu.sendCommand(tempHigh)
}
case "OFF_SUMMER" : {
FZimmer_Manu.sendCommand(tempOff)
}
case "CALENDAR" : { logWarn(filename, "Wohnung Heizmodus: CALENDAR (nicht implementiert)") }
case "AUTO_DEVICE" : { logWarn(filename, "Wohnung Heizmodus: AUTO_DEVICE (nicht implementiert)") }
case "MANU_DEVICE" : { logWarn(filename, "Wohnung Heizmodus: MANU_DEVICE (nicht implementiert)") }
default : { logError(filename, "Wohnung Heizmodus ungültig: " + Whg_Heating_Mode_FZ.state) }
}
end
2te .rule
Code: Alles auswählen
import org.eclipse.xtext.xbase.lib.Functions
val String filename = "heizung-raeume.rules"
val Number tempHigher = 24.0
val Number tempComfort = 21.0
val Number tempMid = 19.0
val Number tempLower = 17.0
val Number tempChill = 15.0
val Number tempAway = 15.0
val Number tempAwayLonger = 13.0
val Number tempOff = 4.5
val Functions$Function5<StringItem, NumberItem, NumberItem, NumberItem, SwitchItem, String> //
generateSummary = [Heater_Mode, Heater_Act_Temp, Heater_Set_Temp, Heater_Valve_Position, Window_Mode |
var String summary = "(fehlende Daten)"
if (Heater_Act_Temp.state instanceof Number && Heater_Set_Temp.state instanceof Number && Heater_Valve_Position.state instanceof Number) {
val actTemp = (Heater_Act_Temp.state as DecimalType).floatValue
val setTemp = (Heater_Set_Temp.state as DecimalType).floatValue
val valvePos = (Heater_Valve_Position.state as DecimalType).floatValue
val mode = Heater_Mode.state as StringType
summary = //
if (Window_Mode.state == ON) String::format("( ↻ Fenster offen ) %.1f °C", actTemp)
else if (mode == "BOOST-MODE") String::format("( 🔥 Boost ) %.1f °C", actTemp)
else if (mode == "AUTO-MODE") String::format("( ⚙ %.1f °C ) %.1f °C", setTemp, actTemp)
else if (valvePos > 60) String::format("( ⟰ %.1f °C ) %.1f °C", setTemp, actTemp)
else if (valvePos > 40) String::format("( ⤊ %.1f °C ) %.1f °C", setTemp, actTemp)
else if (valvePos > 20) String::format("( ⇈ %.1f °C ) %.1f °C", setTemp, actTemp)
else if (valvePos > 0) String::format("( ↑ %.1f °C ) %.1f °C", setTemp, actTemp)
else if (setTemp > actTemp) String::format("( • %.1f °C ) %.1f °C", setTemp, actTemp)
else String::format("%.1f °C", actTemp)
}
return summary
]
rule "System started - Heizung"
when
System started
then
createTimer(now.plusSeconds(200)) [|
logInfo(filename, "System started - Heizung")
if (FZimmer_Heizung_Fault.state == NULL) FZimmer_Heizung_Fault.postUpdate("NO_FAULT")
if (VZimmer_Heizung_Fault.state == NULL) VZimmer_Heizung_Fault.postUpdate("NO_FAULT")
if (GSchlaf_Heizung_Fault.state == NULL) GSchlaf_Heizung_Fault.postUpdate("NO_FAULT")
if (GWohn_Heizung_Fault.state == NULL) GWohn_Heizung_Fault.postUpdate("NO_FAULT")
if (GKueche_Heizung_Fault.state == NULL) GKueche_Heizung_Fault.postUpdate("NO_FAULT")
if (Treppenhaus_Heizung_Fault.state == NULL) Treppenhaus_Heizung_Fault.postUpdate("NO_FAULT")
if (DGBad_Heizung_Fault.state == NULL) DGBad_Heizung_Fault.postUpdate("NO_FAULT")
]
end
// Heizung Auswertung Schnellauswahl (Sitemap) //
//Florian Zimmer
rule "FZimmer_Heizung Auswertung Schnellauswahl (Sitemap)"
when
Item FZimmer_Preset received command
then {
//logInfo(filename, "Auswertung Schnellauswahl (Sitemap)")
switch (receivedCommand){
case 0: FZimmer_Manu.sendCommand(tempLower)
case 1: FZimmer_Manu.sendCommand(tempComfort)
case 2: FZimmer_Manu.sendCommand(tempHigher)
}
FZimmer_Preset.postUpdate(-1)
}
end
und hier einmal ein kurzer ausschnitt aus der sitemap wobei die eigendlich keine rolle spielt bei dem worum es mir geht
.sitemap
Code: Alles auswählen
Frame label="Florian Zimmer" {
//
Selection item=Whg_Heating_Mode_FZ label="Heizungsmodus" mappings=[NORMAL="Normal",
PARTY="Arbeit",
SICKDAY="Krank",
OFF_SUMMER="Aus (Standby)"
]
//
Text item=FZimmer_ActTemp label="Aktuelle Temperatur [%.1f °C]"
//
Text item=FZimmer_Heizung_Battery label="Florian Zimmer [%.1f V]" visibility=[FZimmer_Heizung_Battery < 2.2] valuecolor=[<2.2="maroon"]
Text label="Florian Heizstellglied [N/A ✘]" icon="error2" visibility=[FZimmer_Unreach != OFF] valuecolor=["maroon"]
Text item=FZimmer_Heizung_Fault label="Florian Zimmer [MAP(HM-CC-RT-DN.map):%s]" visibility=[FZimmer_Heizung_Fault != NO_FAULT] valuecolor=["maroon"]
Text item=FZimmer_Summary label="Florian Zimmer [%s]" visibility=[FZimmer_Unreach == OFF] {
Frame label="Aktuell" {
Text item=FZimmer_ActTemp label="Temperatur [%.1f °C]"
}
Frame label="Heizung" visibility=[Whg_Heating_Mode_FZ != OFF_SUMMER] {
Setpoint item=FZimmer_SetTemp label="Stellwert (±1) [%.1f °C]" minValue=4.5 maxValue=30.5 step=1.0 visibility=[FZimmer_SetTemp > 4.5]
Setpoint item=FZimmer_SetTemp label="Stellwert (±½) [%.1f °C]" minValue=4.5 maxValue=30.5 step=0.5 visibility=[FZimmer_SetTemp > 4.5]
Switch item=FZimmer_SetTemp label="Stellglied [OFF]" mappings=[5.0=Einschalten] visibility=[FZimmer_SetTemp == 4.5]
Selection item=FZimmer_Preset label="Schnellwahl" mappings=[0="Abgesenkt", 1="Komfort", 2="Warm"]
//Switch item=FZimmer_BoostMode label="Boost (5min)" mappings=[ON="Starten"]
//Text item=FZimmer_BoostTime label="Boost-Restzeit [%d sec]" visibility=[FZimmer_BoostTime > 0]
Text item=FZimmer_Heizung_Valve label="Ventilstellung [%d %%]"
}
Frame label="Fenster/Türen" {
Text item=FZimmer_Fenster_State label="Fenster [MAP(window.map):%s]"
Text item=FZimmer_DachFenster_State label="DachFenster [MAP(window.map):%s]"
}
}
}
die Geräte sind in HomeMatic jeweils in einer gruppe (also heizungsgruppe bestehend aus Fenster kontakten Thermostat und co.)
ich habe ja den mode Normal, Arbeit, Krank und Aus (Standby) nun soll eine weitere rule oder vielleicht auch die selbe je nachdem was besser ist überprüfen ob ein fenster in dem raum auf oder zu ist wenn eins auf ist soll die temperatur gesenkt werden auf zb. 7°C oder so und wenn diese wieder zu sind auch die Temperatur gehen wo sie vorher war (einige räume sollen noch zeitgesteuert werden das wenn man arbeiten ist muss die wohung ja nicht unnötig geheizt werden) nur wie baue ich am sinn vollsten das mit den Fenster ein ?
LG
Florian