Temperatur Tendenz ermitteln

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
udo1toni
Beiträge: 15265
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Temperatur Tendenz ermitteln

Beitrag von udo1toni »

Ach so. Aber die werden doch gesetzt?
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Temperatur Tendenz ermitteln

Beitrag von PeterA »

Hiermit ?

Code: Alles auswählen

val ItemTempTendenz = gTempTendenz.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem         // Item für Temperatur Tendenz bestimmen  
- OpenHab 2.4
#PWRUP

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

Re: Temperatur Tendenz ermitteln

Beitrag von udo1toni »

Genau, diese Konstante wird verwendet, um das konkrete Item zu beschreiben.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Temperatur Tendenz ermitteln

Beitrag von PeterA »

Oh yes!
Und hiermit wird dann das Kombi Item bestimmt ?

Code: Alles auswählen

val ItemKombi       =       gKombi.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem         // Kombi Item bestimmen
- OpenHab 2.4
#PWRUP

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

Re: Temperatur Tendenz ermitteln

Beitrag von udo1toni »

Ja,so steht's ja da :)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Temperatur Tendenz ermitteln

Beitrag von PeterA »

Stimmt :oops: sogar mit Kommentar hatte ich übersehen.

Grundsätzlich kann ja jeder Temp und Feuchte Wert in der Rule verarbeitet werden. Solange ich diesem Item Schema Folge.
Richtig ?

Denn ich bilde mir aus meiner Persistenz noch einen Durchsschnitt der Haus Temperatur und Feuchte.
- OpenHab 2.4
#PWRUP

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

Re: Temperatur Tendenz ermitteln

Beitrag von udo1toni »

Ja, solange sie dem Schema folgt, kannst Du die auch einfach in die Gruppe packen und die Rule greift auch für die Durchschnittswerte.


Gesendet von iPad mit Tapatalk
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Temperatur Tendenz ermitteln

Beitrag von PeterA »

Ok super. Durchschnitts Werte gehen also auch. Prima!

Nun ist mir noch etwas eingefallen:

Wie im Screenshot zu sehen habe ich auch fünf Komiitems welche auch die aktuelle Position des jeweiligen Rollladens im Raum beinhalten.

Das Rollladen Items sind so definiert:

Code: Alles auswählen

Rollershutter	Shellyswitch25_00B713_roller		"Rollladen DG Kind 1"													(gruppeRolladen_Sued)		{channel="mqtt:topic:3448a27a:de07756d:Shellyswitch25_00B713_roller"}
die Gruppe "gruppeRolladen_Sued" befindet sich in der Gruppe "grAllshutters"

Wenn ich den Gruppenfilter richtig verstanden habe würde er hier nicht richtig filtern da immer der erste Name vor dem ersten Unterstrich gefiltert wird ?

Leider kann ich die Items der Rolllershutter nicht ändern. Aber den Gruppenfilter wohl ?
Könnte das etwa so aussehen ?

Code: Alles auswählen

    
    rule "Update Kombi Item"
when
    Member of gTemp changed or
    Member of gFeuchte changed or
    Member of grAllshutters changed
then
    val String strSensor = triggeringItem.name.split("_").get(0)                                                        // Sensor bestimmen
    val String strShutter= triggeringItem.name.split("_").get(1)                                                        // Rollladen bestimmen
                                                                                                                        // zugehörige Items bestimmen
    val ItemTempTendenz =  gTempTendenz.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem         // Item für Temperatur Tendenz bestimmen
    val ItemTempProxy   =    gTempProxy.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem         // Proxy Item für Temperatur bestimmen
    val ItemHumTendenz  =   gHumTendenz.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem         // Item für Feuchte Tendenz bestimmen
    val ItemHumProxy    =     gHumProxy.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem         // Proxy Item für Feuchte bestimmen
    val ItemTemp        =         gTemp.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem         // Temperatur Item bestimmen
    val ItemHum         =          gHum.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem         // Feuchte Item bestimmen
    val ItemKombi       =        gKombi.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem         // Kombi Item bestimmen
    val ItemShutter     = grAllshutters.members.findFirst[i|i.name.split("_").get(1) == strShutter] as NumberItem        // Rolladen Pos Item bestimmen
                                                                                                                        // Werte bestimmen
    val Number nTempProxy = if(ItemTempProxy.state instanceof Number) (ItemTempProxy.state as Number) else 0            // Temperatur Proxy auslesen
    val Number nHumProxy  = if(ItemHumTendenz.state instanceof Number) (ItemHumTendenz.state as Number) else 0          // Feuchte  Proxy auslesen
    val Number nTemp = if(ItemTemp.state instanceof Number) (ItemTemp.state as Number).floatValue else nTempProxy       // Temperatur auslesen
    val Number nHum  = if(ItemHum.state instanceof Number) (ItemHum.state as Number).floatValue else nHumProxy          // Feuchte auslesen
    val Number nPos  = if(ItemShutter.state instanceof Number) (ItemShutter.state as Number) else 0                     // Rolladen Position auslesen
                                                                                                                        // Tendenz Temperatur
    var String strTempTendence = "⟷"                                                                                   // Default String für Tendenz Anzeige
    var String strTempMessage = "stagnierend"                                                                           // Default String für Tendenz Logmeldung
    if(nTemp > nTempProxy) {                                                                                            // falls aktuelle Temperatur höher als alte Temperatur
        strTempTendence = "⬆️"                                                                                          // String für Tendenz Anzeige steigend
        strTempMessage = "steigend"                                                                                     // String für Logmeldung steigend
    }
    if(nTemp < nTempProxy) {                                                                                            // falls aktuelle Temperatur geringer als alte Temperatur
        strTempTendence = "⬇️"                                                                                          // String für Tendenz Anzeige sinkend
        strTempMessage = "fallend"                                                                                      // String für Logmeldung sinkend
    }
    logInfo("temphum","Sensor {} Temperatur {}",strSensor,strTempMessage)                                               // Logmeldung ausgeben
    ItemTempProxy.postUpdate(nTemp)                                                                                     // Neue Temperatur in Proxy Item übernehmen
    ItemTempTendenz.postUpdate(strTempTendence)                                                                         // Tendenz Item setzen
                                                                                                                        // Tendenz Feuchte
    var String strHumTendence = "⟷"                                                                                    // Default String für Tendenz Anzeige
    var String strHumMessage = "stagnierend"                                                                            // Default String für Tendenz Logmeldung
    if(nHum > nHumProxy) {                                                                                              // falls aktuelle Feuchte höher als alte Feuchte
        strHumTendence = "⬆️"                                                                                           // String für Tendenz Anzeige steigend
        strHumMessage = "steigend"                                                                                      // String für Logmeldung steigend
    }
    if(nHum < nHumProxy) {                                                                                              // falls aktuelle Feuchte geringer als alte Feuchte
        strHumTendence = "⬇️"                                                                                           // String für Tendenz Anzeige sinkend
        strHumMessage = "fallend"                                                                                       // String für Logmeldung sinkend
    }
    logInfo("temphum","Sensor {} Feuchte {}",strSensor,strHumMessage)                                                   // Logmeldung ausgeben
    ItemHumProxy.postUpdate(nHum)                                                                                       // Neue Feuchte in Proxy Item übernehmen
    ItemHumTendenz.postUpdate(strHumTendence)                                                                           // Tendenz Item setzen
                                                                                                                        // Kombiitem setzen.
    ItemKombi.postUpdate(strTempTendence + " " + nTemp.toString + " °C / " + strHumTendence + " " + nHum.toString + " %")
end
Wie ich aber nun nur bei den fünf Kombiitems das postUdate definiere übersteigt derzeit noch mein Wissen.

Gruß Peter
Bild
- OpenHab 2.4
#PWRUP

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

Re: Temperatur Tendenz ermitteln

Beitrag von udo1toni »

Wennder Itemname nicht angepast werden kann, wie soll dann der Zusammenhang zwischen Shutter und Temperatur/Luftfeuchte gebildet werden?
Grundsätzlich lässt sich der Kombi-String auch abhängig von weiteren Bedingungen bilden, aber die Abhängigkeit vom Namen ist nicht so einfach zu lösen.
Eine schmutzige Variante wäre, den Zusammenhang über eine Hashmap herzustellen, das bedeutet aber, dass Du die Itemnamen an zwei Stellen pflegen musst.

Code: Alles auswählen

import java.util.HashMap

val HashMap <String,String> hmRoller = New Hashmap[ "kind1" -> "Shellyswitch25_00B713_roller",                         // und so weiter,
                                                    "" -> "",                                                          // für jeden Shutter ein Wertepaar
                                                    "" -> "",
                                                    "" -> "",
                                                    "" -> ""
    ]

    rule "Update Kombi Item"
when
    Member of gTemp changed or
    Member of gFeuchte changed or
    Member of grAllshutters changed
then
    val String strSensor = triggeringItem.name.split("_").get(0)                                                        // Sensor bestimmen
    val String strShutter= triggeringItem.name.split("_").get(1)                                                        // Rollladen bestimmen
                                                                                                                        // zugehörige Items bestimmen
    val ItemTempTendenz =  gTempTendenz.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem        // Item für Temperatur Tendenz bestimmen
    val ItemTempProxy   =    gTempProxy.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem        // Proxy Item für Temperatur bestimmen
    val ItemHumTendenz  =   gHumTendenz.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem        // Item für Feuchte Tendenz bestimmen
    val ItemHumProxy    =     gHumProxy.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem        // Proxy Item für Feuchte bestimmen
    val ItemTemp        =         gTemp.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem        // Temperatur Item bestimmen
    val ItemHum         =          gHum.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem        // Feuchte Item bestimmen
    val ItemKombi       =        gKombi.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem        // Kombi Item bestimmen
    val ItemShutter     = grAllshutters.members.findFirst[i|i.name == hmRoller.get(strShutter)]    as NumberItem        // Rolladen Pos Item bestimmen
                                                                                                                        // Werte bestimmen
    val Number nTempProxy = if(ItemTempProxy.state instanceof Number) (ItemTempProxy.state as Number) else 0            // Temperatur Proxy auslesen
    val Number nHumProxy  = if(ItemHumTendenz.state instanceof Number) (ItemHumTendenz.state as Number) else 0          // Feuchte  Proxy auslesen
    val Number nTemp = if(ItemTemp.state instanceof Number) (ItemTemp.state as Number).floatValue else nTempProxy       // Temperatur auslesen
    val Number nHum  = if(ItemHum.state instanceof Number) (ItemHum.state as Number).floatValue else nHumProxy          // Feuchte auslesen
    val Number nPos  = if(ItemShutter.state instanceof Number) (ItemShutter.state as Number) else 0                     // Rolladen Position auslesen
                                                                                                                        // Tendenz Temperatur
    var String strTempTendence = "⟷"                                                                                   // Default String für Tendenz Anzeige
    var String strTempMessage = "stagnierend"                                                                           // Default String für Tendenz Logmeldung
    if(nTemp > nTempProxy) {                                                                                            // falls aktuelle Temperatur höher als alte Temperatur
        strTempTendence = "⬆️"                                                                                          // String für Tendenz Anzeige steigend
        strTempMessage = "steigend"                                                                                     // String für Logmeldung steigend
    }
    if(nTemp < nTempProxy) {                                                                                            // falls aktuelle Temperatur geringer als alte Temperatur
        strTempTendence = "⬇️"                                                                                          // String für Tendenz Anzeige sinkend
        strTempMessage = "fallend"                                                                                      // String für Logmeldung sinkend
    }
    logInfo("temphum","Sensor {} Temperatur {}",strSensor,strTempMessage)                                               // Logmeldung ausgeben
    ItemTempProxy.postUpdate(nTemp)                                                                                     // Neue Temperatur in Proxy Item übernehmen
    ItemTempTendenz.postUpdate(strTempTendence)                                                                         // Tendenz Item setzen
                                                                                                                        // Tendenz Feuchte
    var String strHumTendence = "⟷"                                                                                    // Default String für Tendenz Anzeige
    var String strHumMessage = "stagnierend"                                                                            // Default String für Tendenz Logmeldung
    if(nHum > nHumProxy) {                                                                                              // falls aktuelle Feuchte höher als alte Feuchte
        strHumTendence = "⬆️"                                                                                           // String für Tendenz Anzeige steigend
        strHumMessage = "steigend"                                                                                      // String für Logmeldung steigend
    }
    if(nHum < nHumProxy) {                                                                                              // falls aktuelle Feuchte geringer als alte Feuchte
        strHumTendence = "⬇️"                                                                                           // String für Tendenz Anzeige sinkend
        strHumMessage = "fallend"                                                                                       // String für Logmeldung sinkend
    }
    logInfo("temphum","Sensor {} Feuchte {}",strSensor,strHumMessage)                                                   // Logmeldung ausgeben
    ItemHumProxy.postUpdate(nHum)                                                                                       // Neue Feuchte in Proxy Item übernehmen
    ItemHumTendenz.postUpdate(strHumTendence)                                                                           // Tendenz Item setzen
                                                                                                                        // Kombiitem setzen
    var String strKombi = strTempTendence + " " + nTemp.toString + " °C / " + strHumTendence + " " + nHum.toString + " %" // Kombinierter String ohne Shutter
    if(ItemShutter !== null)                                                                                            // Falls es ein passendes Shutteritem gibt
        strKombi = ItemShutter.state.toString + "% /" + strKombi                                                        // füge den Shutterstatus vorne an
    ItemKombi.postUpdate(strKombi)                                                                                      // Setze das Kombiitem
end
Ohne Gewähr :)

Die Idee: In der Hashmap sind Wertepaare hinterlegt, der jeweils 1. Wert ist der Teilstring des Sensors, der jeweils 2. String ist der komplette Name des Shutteritems. Nun kann das passende Item aus der Grupper herausgefiltert werden.

Zum Schluss der Rule wird der fixe Teil des zu setzenden Strings nun in einer Variablen gespeichert. Nur falls das oben berechnete Shutter Item auch existiert (!== null), wird noch vorne der Shutterstatus ergänzt.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Temperatur Tendenz ermitteln

Beitrag von PeterA »

Hi Udo,

HashMap.... wieder etwas gelernt :)

Noch eine Frage zum Gruppenfilter:
Filtert dieser nur eine Gruppe oder auch Untergruppen?
Denn hier gibt es eine Gruppe "grAllShutters" welche zwei weitere Gruppen enthält.
Und in diesen "Unter" Gruppen befinden sich dann die Rollladen Items.
"gruppeRolladen_Sued" und "gruppeRolladen_West"

Gruß Peter
- OpenHab 2.4
#PWRUP

Antworten