Seite 9 von 14
Re: Temperatur Tendenz ermitteln
Verfasst: 11. Sep 2020 19:50
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!
Re: Temperatur Tendenz ermitteln
Verfasst: 11. Sep 2020 20:17
von udo1toni
Ja, ich war zu faul, noch abzufangen, dass das Shutteritem noch keinen Status hat...

Re: Temperatur Tendenz ermitteln
Verfasst: 11. Sep 2020 20:44
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

Re: Temperatur Tendenz ermitteln
Verfasst: 12. Sep 2020 10:56
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
Re: Temperatur Tendenz ermitteln
Verfasst: 12. Sep 2020 20:07
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.
Re: Temperatur Tendenz ermitteln
Verfasst: 12. Sep 2020 21:32
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 ?
Re: Temperatur Tendenz ermitteln
Verfasst: 13. Sep 2020 18:19
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.
Re: Temperatur Tendenz ermitteln
Verfasst: 13. Sep 2020 18:32
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.
Re: Temperatur Tendenz ermitteln
Verfasst: 13. Sep 2020 18:42
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 %
Re: Temperatur Tendenz ermitteln
Verfasst: 13. Sep 2020 19:45
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?