Temperatur Tendenz ermitteln

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Temperatur Tendenz ermitteln

Beitrag von PeterA »

Ok, aber wie setzt die Rule dann das postUpdate zum jeweiligen Item? Also zb. InnenKombi, AussenKombi usw?
- 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 »

Du musst die Kombi-Items ebenfalls in einer extra Gruppe zusammenfassen, auch für diese Item gilt, dass der Name aus den anderen Namen abgeleitet werden können muss. So wie in meinem Beispiel...

Gesendet von meinem SM-G973F 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 »

Und was ist der Unterschied bei dem Gruppenfilter for each i und each m ?
- OpenHab 2.4
#PWRUP

Benutzeravatar
peter-pan
Beiträge: 2768
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Temperatur Tendenz ermitteln

Beitrag von peter-pan »

i und m sind nur Platzhalter in der GroupItem Methode für die jeweiligen tatsächlichen items.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

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

Re: Temperatur Tendenz ermitteln

Beitrag von udo1toni »

Genau.

Die Methode .forEach[] durchläuft die zugrundeliegende Liste. Damit man "etwas zum Anfassen" hat, braucht es eine Variable, die je Durchlauf jeweils ein Listenelement repräsentiert. Bei gGroupItem.members.forEach[] geht es um die Items, die zum Gruppenitem gGroupItem gehören. Man braucht also eine Variable, die jeweils das ausgewählte Item repräsentiert. Du kannst hier einen beliebigen Namen verwenden (Schlüsselworte sind natürlich verboten, ebenfalls real existierende Itemnamen, Variablen oder Konstanten). Der Name muss den normalen Konventionen entsprechen, d.h. er muss mit einem Buchstaben beginnen und darf ausschließlich Buchstaben des englischen Alphabets (groß/klein), Ziffern (0-9) und den Unterstrich (_) enthalten. Du könntest also auch

Code: Alles auswählen

gGroupItem.members.forEach[Platzhalter_fuer_jedes_Item|
if(Platzhalter_fuer_jedes_Item.name.contains("MyItem"))
    logInfo("test","Name des Items ist {}",Platzhalter_fuer_jedes_Item.name)
]
schreiben. Aber irgendwie ist das sehr sperrig und nicht besonders effizient ;)

Es gibt übrigens wahlweise noch einen zweiten Platzhalter:

Code: Alles auswählen

gGroupItem.members.forEach[i,z|
if(i.name.contains("MyItem"))
    logInfo("test","Name des Items ist {}, dies ist das {}. Item der Gruppe.",i.name,z)
]
z ist ein Schleifenzähler. Kann ja auch nützlich sein. z ist vom Typ Integer und kann ebenfalls beliebig gewählt werden, mit den gleichen Einschränkungen wie für den Platzhalter ;)
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,

Sorry dass ich nochmals um Erläuterung bitten muss.

Könntest Du in deiner Rule ggf mit inline Kommentaren erläutern was die Rule wo macht?

Und oben hab ich ja meine aktuellen Items gepostet. Gehts das damit überhaupt?
Oder müssen diese Umbenannt werden?

Ggf würde ich dann auf den jeweiligen Trigger Channel ein weiteres Item linken.

Gruß Peter
- 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 »

Du musst Du Items so umbenennen, dass sie den Regeln entsprechen :)

Ich hab noch einen Dreher festgestellt (steigend und fallend verdreht)

Code: Alles auswählen

rule "Update Kombi Item"
when
    Member of gTemp changed or
    Member of gFeuchte changed
then
    val String strSensor = triggeringItem.name.split("_").get(0)                                                        // Sensor 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
                                                                                                                        // 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
                                                                                                                        // 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
Die Items müssen dem folgenden Schema entsprechen:

Code: Alles auswählen

Group gTempTendenz
Group gTempProxy
Group gHumTendenz
Group gHumProxy
Group gTemp
Group gHum
Group gKombi

String Aussen_TempTendenz "Außentemp. Tendenz [%s]"   (gTempTendenz)
Number Aussen_TempProxy   "Außentemp. Proxy [%s]"     (gTempProxy)
String Aussen_HumTendenz  "Außenfeuchte Tendenz [%s]" (gHumTendenz)
Number Aussen_HumProxy    "Außenfeuchte Proxy [%s]"   (gHumProxy)
Number Aussen_Temp        "Außentemp. [%s]"           (gTemp) { ... }
Number Aussen_Hum         "Außenfeuchte [%s]"         (gHum) { ... }
String Aussen_Kombi       "Außen [%s]"                (gKombi)
Die oberen sieben Items sind die Gruppen Items, die exakt so angelegt werden müssen (der Name...)
Die unteren sieben Items entsprechen einem Sensor-Duo mitsamt allen notwendigen zusätzlichen Items. Dabei sind zwei Items mit dem Sensor verbunden (über das in {} angegebene Addon). Diese sieben Items müssen also pro Dual-Sensor angelegt werden. Der erste Teilstring (vor dem _) muss jeweils pro Dual-Sensor identisch sein und zwischen den einzelnen Dual-Sensoren muss sich dieser Teilstring unterscheiden, z.B. Aussen, Wohnzimmer, Kueche, Schlafzimmer, Kind1, Kind2, Hobbyraum, Abstellraum... Dieser erste Teilstring wird von der Rule verwendet, um in der jeweiligen Gruppe das zugehörige Item zu identifizieren.
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,

vielen Dank ich denke ich habe es verstanden.
Könnte ich aus dieser Rule noch weitere Items mittels postUpdate ein "steigend" und "fallend" verpassen ?
Ich vermute das passiert ja hier:

Code: Alles auswählen

ItemHumTendenz.postUpdate(strHumTendence)
Denn ich habe in der Sitemap noch mal einzelne Tendenz Items.
In der Überschrift ist die String Kombi.
Und unten drunter dann die einzelnen Items.
Bild

Ich nehme an diese müssten dann auch wieder in eine Gruppe um dann entsprechend gefiltert und beschrieben werden zu können
- 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 »

Was meinst Du mit "einzelne Items"? Die Rule braucht zwingend Dual-Sensoren, von denen der eine für die Temperatur und der andere für die Luftfeuchte da ist.
Wobei es nicht darum geht, dass die zwei Werte aus derselben Hardware kommen, aber die 7 Items müssen zueinander namentlich verbunden sein (wie oben beschrieben).
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 »

Ich meinte die beiden String Items im Screenshot "Temperatur Tendenz" und "Luftfeuchtigkeit Tendenz"
Ob ich aus der Rule heraus diesen "einzel" Items auch via postUpdate die Tendenz mit geben kann.
- OpenHab 2.4
#PWRUP

Antworten