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 habs mal so abgeändert.
Zum einen meckert VSC nun...
Aber OpenHab beim Speichern der Rule nicht.

Code: Alles auswählen

{
	"resource": "/Volumes/openHAB-conf/rules/test.rules",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": "org.eclipse.xtext.xbase.validation.IssueCodes.invalid_mutable_variable_access",
	"severity": 8,
	"message": "Cannot refer to the non-final variable strSensor inside a lambda expression",
	"startLineNumber": 31,
	"startColumn": 89,
	"endLineNumber": 31,
	"endColumn": 98
}
Zum anderen gibt es kein Update des Kombiitems wenn ein entsprechender Rollladen bewegt wird.
Ich habe die Gruppen im Verdacht ? Denn VSC zeigt beim Mouseover der Gruppe grAllshutters sowie deren beiden Untergruppen "NULL"
Egal welche Positionen die Rollladen haben...

EDIT: HALT STOP!

Code: Alles auswählen

2020-09-11 19:54:44.691 [vent.ItemStateChangedEvent] - InnenDGKind2_Kombi changed from ⬇️ 23.2 °C / ⬆️ 52.0 % to 100% /⬇️ 23.1 °C / ⬆️ 52.0 %
Es scheint nun zu Funktionieren!!!!! Udo! Ein Traum!
- 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, ich war zu faul, noch abzufangen, dass das Shutteritem noch keinen Status hat... ;)
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 »

So... das isses! Eine Rule mit 77 Zeilen Code ersetzt nun 28 Rules mit ca. 950 Zeilen Code!
Vielen vielen Dank Udo für Deine unermüdliche Geduld!
Hier habe ich nun viel über Gruppenfilter und HasMaps gelernt. Echt Top.

Hier nun die finale Rule (bis jetzt :) )
Wenn ich darf Udo, würde ich das ganze noch mal gesondert im Projektforum vorstellen.

Code: Alles auswählen

import java.util.HashMap

val HashMap <String,String> hmRoller = newHashMap(  "InnenDG"      -> "Shellyswitch25_745118_roller",                      // von Sensor nach Shutter
                                                    "InnenDGKind1" -> "Shellyswitch25_00B713_roller",
                                                    "InnenDGKind2" -> "Shellyswitch25_E58F7A_roller",
                                                    "InnenWHZ"     -> "Shellyswitch25_740A26_roller"
)

val HashMap <String,String> hmSensor = newHashMap(  "Shellyswitch25_745118_roller" -> "InnenDG",                          // von Shutter nach Sensor
                                                    "Shellyswitch25_00B713_roller" -> "InnenDGKind1",
                                                    "Shellyswitch25_E58F7A_roller" -> "InnenDGKind2",
                                                    "Shellyswitch25_740A26_roller" -> "InnenWHZ"
)



rule "Update Kombi Item"
when
    Member of gTemp changed or
    Member of gHum changed or
    Member of grAllshutters changed
then
    var String strSensor = triggeringItem.name.split("_").get(0)       // Sensor bestimmen. ACHTUNG! nun als var!!!
    if(triggeringItem.name.contains("Shellyswitch25")) {                                                                  // Falls ein Rollershutter die Rule getriggert hat
        if(hmSensor.get(triggeringItem.name) !== null)                                                                    // Falls in der Hashmap enthalten
            strSensor = hmSensor.get(triggeringItem.name)                                                                 // Ermittle Sensornamen
        else                                                                                                              // falls nicht in der Hashmap enthalten
            return;                                                                                                       // Rule abbrechen
    }
                                                                                                                          // 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.allMembers.findFirst[i|i.name == hmRoller.get(strSensor)]  as RollershutterItem   // 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
                                                                                                                          // Tendenz Temperatur
    var String strTempTendence = "[emoji3594][emoji3591]"                                                                                    // 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 = "[emoji3595]"                                                                                            // String für Tendenz Anzeige steigend
        strTempMessage = "steigend"                                                                                       // String für Logmeldung steigend
    }
    if(nTemp < nTempProxy) {                                                                                              // falls aktuelle Temperatur geringer als alte Temperatur
        strTempTendence = "[emoji3596]"                                                                                            // 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 = "[emoji3594][emoji3591]"                                                                                     // 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 = "[emoji3595]"                                                                                             // String für Tendenz Anzeige steigend
        strHumMessage = "steigend"                                                                                        // String für Logmeldung steigend
    }
    if(nHum < nHumProxy) {                                                                                                // falls aktuelle Feuchte geringer als alte Feuchte
        strHumTendence = "[emoji3596]"                                                                                             // 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 = "Rollladen: " + ItemShutter.state.toString + "% / " + strKombi                                         // füge den Shutterstatus vorne an
    ItemKombi.postUpdate(strKombi)                                                                                        // Setze das Kombiitem
end
Verbeuge mich zu tiefst! :)

Gruß Peter
Bild
- OpenHab 2.4
#PWRUP

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

Re: Temperatur Tendenz ermitteln

Beitrag von PeterA »

Bei längerer Betrachtung ist mir aufgefallen das die Sensoren den Wert für die Luftfeuchte OHNE Kommastelle liefern.
Die Rule aber eine Kommastelle hinzufügt.
Liese sich das noch abändern ?

Edit:
Und ich habe beobachtet das wenn sich ein Rollladen Wert ändert wird diese Änderung erst ins entsprechende Kombiitem
geschrieben wenn sich einer der entsprechenden Temp oder Hum werte ändert ?

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 »

Das kannst Du gerne verwursten :)
Was das Komma betrifft: Standard liefert Zahlenobjekt.toString als Format .1f aus. Wenn Du das nicht möchtest (kann ich verstehen ;) ) dann kannst Du dafür String::format("%.0f",Zahlenobjekt) verwenden. Die betreffende Zeile im Code sähe dann so aus:

Code: Alles auswählen

var String strKombi = strTempTendence + " " + String::format("%.0f °C / ",nTemp) + strHumTendence + " " + String::format("%.0f %%",nHum) // Kombinierter String ohne Shutter
Man kann also die Einheit gleich mit ins Format einbetten.

Das Problem mit dem fehlenden Update bei Rollladenbewegung sollte eigentlich mit dem letzten Codeschnipsel behoben sein...
Wo ich gerade darüber nachdenke, vermutlich musst Du als Trigger die Gruppen angeben, in denen die Shutter unmittelbare Member sind, nicht die Gruppe aller Shutter.
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 »

Merci für den Code zu den Nachkommastellen.

Zu dem fehlenden Update bei den Rollladenbewegungen sollte also der when teil so aussehen:

Code: Alles auswählen

when
    Member of gTemp changed or
    Member of gHum changed or
    Member of gruppeRolladen_West changed or
    Member of gruppeRolladen_Sued changed
?

aber dann müsste ich doch auch beide Gruppen Filtern ?
- 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 »

Nein, eben nicht :) Es reicht, die übergeordnete Gruppe zu filtern, beim Filter kann man ja durchaus die "Enkel Items" mit berücksichtigen, nur der Trigger auf das "Stamm Gruppenitem" funktioniert halt leider nicht.
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 »

Nun denn, dann ist es eben so das die Position des Rollladens erst ins Kombiitem geschrieben wird sich wenn ein Temp oder Hum Item ändert.
- OpenHab 2.4
#PWRUP

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

Re: Temperatur Tendenz ermitteln

Beitrag von PeterA »

Ab und zu habe ich diese ERROR Meldungen im Log:

Code: Alles auswählen

2020-09-13 17:59:38.125 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Update Kombi Item': null
2020-09-13 18:02:38.229 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Update Kombi Item': null
2020-09-13 18:03:38.421 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Update Kombi Item': null
2020-09-13 18:05:38.321 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Update Kombi Item': null
2020-09-13 18:25:55.693 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Update Kombi Item': null
:?:

Edit:
Hier wars nochmal:

Code: Alles auswählen

2020-09-13 19:03:31.228 [vent.ItemStateChangedEvent] - Aussen_Temp changed from 25.1 to 25.0
2020-09-13 19:03:31.276 [vent.ItemStateChangedEvent] - Aussen_Hum changed from 50 to 51
==> /var/log/openhab2/openhab.log <==
2020-09-13 19:03:31.406 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Update Kombi Item': null
2020-09-13 19:03:31.426 [INFO ] [lipse.smarthome.model.script.temphum] - Sensor Aussen Temperatur fallend
==> /var/log/openhab2/events.log <==
2020-09-13 19:03:31.437 [vent.ItemStateChangedEvent] - Aussen_TempProxy changed from 25.1 to 25.0
==> /var/log/openhab2/openhab.log <==
2020-09-13 19:03:31.443 [INFO ] [lipse.smarthome.model.script.temphum] - Sensor Aussen Feuchte steigend
==> /var/log/openhab2/events.log <==
2020-09-13 19:03:31.463 [vent.ItemStateChangedEvent] - Aussen_HumProxy changed from 50.0 to 51.0
2020-09-13 19:03:31.477 [vent.ItemStateChangedEvent] - Aussen_Kombi changed from ⬇️ 25,1 °C / ⬆️ 50 % to ⬇️ 25,0 °C / ⬆️ 51 %
Edit:
Und hier nochmal:

Code: Alles auswählen

2020-09-13 19:27:39.905 [vent.ItemStateChangedEvent] - InnenDGBad_Temp changed from 23.9 to 24.0
==> /var/log/openhab2/openhab.log <==
2020-09-13 19:27:39.961 [vent.ItemStateChangedEvent] - InnenDGBadTemp changed from 23.9 °C to 24.0 °C
2020-09-13 19:27:39.966 [vent.ItemStateChangedEvent] - InnenDGBadFeuchte changed from 74 % to 75 %
2020-09-13 19:27:39.970 [vent.ItemStateChangedEvent] - InnenDGBad_Hum changed from 74 to 75
==> /var/log/openhab2/openhab.log <==
2020-09-13 19:27:39.998 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Update Kombi Item': null
2020-09-13 19:27:40.105 [INFO ] [lipse.smarthome.model.script.temphum] - Sensor InnenDGBad Temperatur steigend
==> /var/log/openhab2/events.log <==
2020-09-13 19:27:40.116 [vent.ItemStateChangedEvent] - InnenDGBad_TempProxy changed from 23.9 to 24.0
==> /var/log/openhab2/openhab.log <==
2020-09-13 19:27:40.120 [INFO ] [lipse.smarthome.model.script.temphum] - Sensor InnenDGBad Feuchte steigend
==> /var/log/openhab2/events.log <==
2020-09-13 19:27:40.132 [vent.ItemStateChangedEvent] - InnenDGBad_HumProxy changed from 74.0 to 75.0
2020-09-13 19:27:40.153 [vent.ItemStateChangedEvent] - InnenDGBad_Kombi changed from ⬆️ 23,9 °C / ⬆️ 74 % to ⬆️ 24,0 °C / ⬆️ 75 %
- 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 »

PeterA hat geschrieben: 13. Sep 2020 18:32 Nun denn, dann ist es eben so das die Position des Rollladens erst ins Kombiitem geschrieben wird sich wenn ein Temp oder Hum Item ändert.
Funktioniert es denn nicht mit den Triggern?
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten