Seite 6 von 14

Re: Temperatur Tendenz ermitteln

Verfasst: 5. Sep 2020 14:49
von PeterA
Ok, aber wie setzt die Rule dann das postUpdate zum jeweiligen Item? Also zb. InnenKombi, AussenKombi usw?

Re: Temperatur Tendenz ermitteln

Verfasst: 5. Sep 2020 14:53
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


Re: Temperatur Tendenz ermitteln

Verfasst: 5. Sep 2020 15:18
von PeterA
Und was ist der Unterschied bei dem Gruppenfilter for each i und each m ?

Re: Temperatur Tendenz ermitteln

Verfasst: 5. Sep 2020 17:40
von peter-pan
i und m sind nur Platzhalter in der GroupItem Methode für die jeweiligen tatsächlichen items.

Re: Temperatur Tendenz ermitteln

Verfasst: 5. Sep 2020 19:47
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 ;)

Re: Temperatur Tendenz ermitteln

Verfasst: 6. Sep 2020 10:56
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

Re: Temperatur Tendenz ermitteln

Verfasst: 6. Sep 2020 20:45
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.

Re: Temperatur Tendenz ermitteln

Verfasst: 7. Sep 2020 11:55
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

Re: Temperatur Tendenz ermitteln

Verfasst: 7. Sep 2020 14:49
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).

Re: Temperatur Tendenz ermitteln

Verfasst: 7. Sep 2020 16:04
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.