Hilfe bei einer Rule

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Hilfe bei einer Rule

Beitrag von udo1toni »

Also, der Channel ist als Typ Number:Temperature angegeben, dann sollte das passende Item ebenfalls von diesem Typ sein:

Code: Alles auswählen

Switch Heizungsschalter_Alle_Heizungen "Hauptschalter Automatik"

Group gSPOnline     "Smartphones online"
Switch onlineLuca   "Smartphone Luca"   (gSPOnline) {channel="network:pingdevice:88c07738b0:online"} 
Switch onlineNelly  "Smartphone Nelly"  (gSPOnline) {channel="network:pingdevice:7e73fbb35d:online"}
Switch onlineSilvia "Smartphone Silvia" (gSPOnline) {channel="network:pingdevice:4b2154548b:online"}
Switch onlineDaniel "Smartphone Daniel" (gSPOnline) {channel="network:pingdevice:d3462f161f:online"}

Group gTempSoll "Solltemperaturen"
Number:Temperature HeizungLucaZimmer_Solltemperatur                  "Solltemperatur Luca"                 (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:1624e16bb3374ba8937d5244df2e789e:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungLucaZimmer_Solltemperatur_Fensterkontakt   "Solltemperatur Luca Fenster"         (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:1624e16bb3374ba8937d5244df2e789e:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungNellyZimmer_Solltemperatur                 "Solltemperatur Nelly"                (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:ced269ec08fa447793a2b40a07d25ad5:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungNellyZimmer_Solltemperatur_Fensterkontakt  "Solltemperatur Nelly Fenster"        (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:ced269ec08fa447793a2b40a07d25ad5:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungSchlafzimmer_Solltemperatur                "Solltemperatur Schlafzimmer"         (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:5a5cb035986f494d8d048c582e52bc55:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungSchlafzimmer_Solltemperatur_Fensterkontakt "Solltemperatur Schlafzimmer Fenster" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:5a5cb035986f494d8d048c582e52bc55:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungBadezimmer_Solltemperatur                  "Solltemperatur Bad"                  (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:f4ab49cd8ef44f85abf748fd513f6d21:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungBadezimmer_Solltemperatur_Fensterkontakt   "Solltemperatur Bad Fenster"          (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:f4ab49cd8ef44f85abf748fd513f6d21:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungUnteresBadezimmer_Solltemperatur           "Solltemperatur Bad unten"            (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:41297270ca984a8d8570a0030243a973:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungPartyraum_Solltemperatur                   "Solltemperatur Partyraum"            (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:17918643887840698438d721a6e9e86d:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungPartyraum_Solltemperatur_Fensterkontakt    "Solltemperatur Partyraum Fenster"    (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:17918643887840698438d721a6e9e86d:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungTreppenhaus_Solltemperatur                 "Solltemperatur Treppenhaus"          (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:cba6993b2b5b4a5094d1d9df957fed58:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungTreppenhaus_Solltemperatur_Fensterkontakt  "Solltemperatur Treppenhaus Fenster"  (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:cba6993b2b5b4a5094d1d9df957fed58:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Die Metadaten unit gibt es seit openHAB4.0 und sie sind für QuantityType (bzw. UoM) Items nicht optional. Das angegebene Pattern sollte openHAB selbst setzen, aber sicher ist sicher.
Die Rule habe ich noch mal etwas angepasst:

Code: Alles auswählen

// Globale Variablen vor der ersten Rule definieren!
var Timer tSoll = null                                                  // Timer für Solltemperatur
var nSoll       = 18.0                                                  // Default Temperatur

rule "Solltemperatur setzen"
when
    Item Heizungsschalter_Alle_Heizungen changed to ON or
    Member of gSPOnline changed
then
    if(Heizungsschalter_Alle_Heizungen.state != ON)                     // rule inaktiv?
        return;
    val bOnline = (gSPOnline.members.filter[i|i.state != OFF].size > 0) // true falls mindestens ein Gerät nicht OFF
    nSoll       = if(bOnline) 21 else  18                               // Solltemperatur
    val nStart  = if(bOnline)  1 else 600                               // Zeitverzögerung abhängig von Soll
    gTempSoll.members.filter[i|!(i.state instanceof Number)].forEach[j| // uninitialisierte Items notfalls initialisieren
        j.postUpdate(19)
    ]
    tSoll?.cancel                                                       // laufende Timer abbrechen

    tSoll = createTimer(now.plusSeconds(nStart), [|                     // nach nStart Sekunden
        val lItems = gTempSoll.members.sortBy[name].filter[i|
                     (i.state as Number).floatValue != nSoll]           // Liste aller Items die vom Soll abweichen
        if(lItems.size == 0)                                            // falls noch Abweichungen vom Soll bestehen
            return;
        tSoll.reschedule(now.plusSeconds(5))                            // führe Timer erneut aus
        logInfo("soll","Setze {} auf {}", lItems.head.name, nSoll)
        lItems.head.sendCommand(nSoll)                                  // Solltemperatur setzen
    ])
end
Bevor der Timer überhaupt gestartet wird, initialisiert die Rule alle Heizungsitems mit 18 als Wert. Falls Du sicher sein kannst, dass alle Items eine gültige Zahl beinhalten, kannst Du darauf auch verzichten. Die Initialisierung betrifft allerdings nur die Items, in denen bisher keine Temperatur gespeichert ist, außerdem wirkt der Befehl ausschließlich auf das Item, nicht jedoch auf den Channel (weshalb man auch keine Vorkehrungen wegen zu vieler Updates in zu kurzem Zeitraum treffen muss).
Innerhalb des Timers habe ich den Code noch etwas angepasst, so dass nun doch noch ein Log erscheint.
Und: ich habe die Rule bei mir getestet :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

Re: Hilfe bei einer Rule

Beitrag von Snatsch »

He udo1toni du schläfst wohl nie ;) vielen Dank für deine Hilfe :) Jetzt läuft der Laden so wie er soll :lol: Das mit den Erzwingen der Temperaturen ist was ganz neues für mich ;) Das müsste ja auch in der Rule funktionieren oder ?

Code: Alles auswählen

var Timer tLucaHeizung = null
var Timer tNellyHeizung = null
var Timer tSchlafzimmerHeizung = null
var Timer tBadezimmerHeizung = null
var Timer tUnteresbadetimmerHeizung = null
var Timer tPartyraumHeizung = null
var Timer tTreppenhausHeizung = null

rule "Heizungsschalter für alle Heizungen"
when
    Item  Heizungsschalter_Alle_Heizungen received command 
then
    if(receivedCommand == ON) {
        tLucaHeizung = createTimer(now.plusSeconds(10), [|
        HeizungLucaZimmer_Solltemperatur.sendCommand(21)
        HeizungLucaZimmer_Solltemperatur_Fensterkontakt.sendCommand(21)
        ])
        tNellyHeizung = createTimer(now.plusSeconds(20), [|
        HeizungNellyZimmer_Solltemperatur.sendCommand(21)
        HeizungNellyZimmer_Solltemperatur_Fensterkontakt.sendCommand(21)
        ])
        tSchlafzimmerHeizung = createTimer(now.plusSeconds(30), [|
        HeizungSchlafzimmer_Solltemperatur.sendCommand(21)
        HeizungSchlafzimmer_Solltemperatur_Fensterkontakt.sendCommand(21)
        ])
        tBadezimmerHeizung = createTimer(now.plusSeconds(40), [|
        HeizungBadezimmer_Solltemperatur.sendCommand(21)
        HeizungBadezimmer_Solltemperatur_Fensterkontakt.sendCommand(21)
        ])
        tUnteresbadetimmerHeizung = createTimer(now.plusSeconds(50), [|
        HeizungUnteresBadezimmer_Solltemperatur.sendCommand(21)
        ])
        tPartyraumHeizung = createTimer(now.plusSeconds(60), [|
        HeizungPartyraum_Solltemperatur.sendCommand(21)
        HeizungPartyraum_Solltemperatur_Fensterkontakt.sendCommand(21)
        ])
        tTreppenhausHeizung = createTimer(now.plusSeconds(70), [|
        HeizungTreppenhaus_Solltemperatur.sendCommand(21)
        HeizungTreppenhaus_Solltemperatur_Fensterkontakt.sendCommand(21)
        ])
	} else {
        tLucaHeizung = createTimer(now.plusSeconds(10), [|
        HeizungLucaZimmer_Solltemperatur.sendCommand(6)
        HeizungLucaZimmer_Solltemperatur_Fensterkontakt.sendCommand(6)
        ])
        tNellyHeizung = createTimer(now.plusSeconds(20), [|
        HeizungNellyZimmer_Solltemperatur.sendCommand(6)
        HeizungNellyZimmer_Solltemperatur_Fensterkontakt.sendCommand(6)
        ])
        tSchlafzimmerHeizung = createTimer(now.plusSeconds(30), [|
        HeizungSchlafzimmer_Solltemperatur.sendCommand(6)
        HeizungSchlafzimmer_Solltemperatur_Fensterkontakt.sendCommand(6)
        ])
        tBadezimmerHeizung = createTimer(now.plusSeconds(40), [|
        HeizungBadezimmer_Solltemperatur.sendCommand(6)
        HeizungBadezimmer_Solltemperatur_Fensterkontakt.sendCommand(6)
        ])
        tUnteresbadetimmerHeizung = createTimer(now.plusSeconds(50), [|
        HeizungUnteresBadezimmer_Solltemperatur.sendCommand(6)
        ])
        tPartyraumHeizung = createTimer(now.plusSeconds(60), [|
        HeizungPartyraum_Solltemperatur.sendCommand(6)
         HeizungPartyraum_Solltemperatur_Fensterkontakt.sendCommand(6)
        ])
        tTreppenhausHeizung = createTimer(now.plusSeconds(70), [|
        HeizungTreppenhaus_Solltemperatur.sendCommand(6)
        HeizungTreppenhaus_Solltemperatur_Fensterkontakt.sendCommand(6)
        ])
    }

end
sie funktioniert zwar auch so ziemlich aber nicht immer zu 100% :(
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

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

Re: Hilfe bei einer Rule

Beitrag von udo1toni »

Die Rule ist fürchterlich :) und es ist quasi genau die gleiche Rule wie oben, nur mit dem Unterschied, dass sie von einem anderen Trigger ausgelöst wird und zu einem anderen Temperaturwechsel führt. Das kannst Du aber mit der ersten Rule mit erledigen. Verzichte dafür auf das received command (wird sonst etwas tricky, da alle wenns und abers abzufangen).

Code: Alles auswählen

// Globale Variablen vor der ersten Rule definieren!
var Timer tSoll = null                                                           // Timer für Solltemperatur
var nSoll       = 18.0                                                           // Default Temperatur

rule "Solltemperatur setzen"
when
    Item Heizungsschalter_Alle_Heizungen changed or
    Member of gSPOnline changed
then
    var nStart  = 1
    if(Heizungsschalter_Alle_Heizungen.state == OFF) {                           // Hauptschalter aus
        nSoll = 6
    } else {                                                                     // Hauptschalter nicht aus
        val bOnline = (gSPOnline.members.filter[i|i.state != OFF].size > 0)      // true falls mindestens ein Gerät nicht OFF
        nSoll       = if(bOnline) 21 else  18                                    // Solltemperatur
        if(!bOnline) nStart = 600                                                // Zeitverzögerung abhängig von Soll
    }
    gTempSoll.members.filter[i|!(i.state instanceof Number)].forEach[j|          // uninitialisierte Items notfalls initialisieren
        j.postUpdate(19)
    ]
    tSoll?.cancel                                                                // laufende Timer abbrechen

    tSoll = createTimer(now.plusSeconds(nStart), [|                              // nach nStart Sekunden
        val lItems = gTempSoll.members.sortBy[name].filter[i|
                     (i.state as Number).floatValue != nSoll]                    // Liste aller Items die vom Soll abweichen
        if(lItems.size == 0)                                                     // falls noch Abweichungen vom Soll bestehen
            return;
        tSoll.reschedule(now.plusSeconds(5))                                     // führe Timer erneut aus
        logInfo("soll","Setze {} auf {}", lItems.head.name, nSoll)
        lItems.head.sendCommand(nSoll)                                           // Solltemperatur setzen
    ])
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

Re: Hilfe bei einer Rule

Beitrag von Snatsch »

wenn ich die Rule von dir verwende kommt der Eintrag im Log

Code: Alles auswählen

2024-01-30 21:34:56.208 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'Solltemp_abwesend.rules', using it anyway:
The value of the local variable nStart is not used
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

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

Re: Hilfe bei einer Rule

Beitrag von udo1toni »

Ups... Hab's oben geändert... nStart muss natürlich etwas anders behandelt werden...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

Re: Hilfe bei einer Rule

Beitrag von Snatsch »

Vielen Dank :) jetzt scheint es zu laufen. Als nächstes wenn mein neues Netzteil für meinen Rasp kommt werde ich mich mal an openhab 4 machen und schauen ob es damit stabil läuft.
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

Antworten