Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.
Moderatoren: seppy , udo1toni
PeterA
Beiträge: 1106 Registriert: 8. Feb 2019 12:12
Answers: 13
Beitrag
von PeterA » 11. Sep 2020 19:50
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
udo1toni
Beiträge: 15265 Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt
Beitrag
von udo1toni » 11. Sep 2020 20:17
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
PeterA
Beiträge: 1106 Registriert: 8. Feb 2019 12:12
Answers: 13
Beitrag
von PeterA » 11. Sep 2020 20:44
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
- OpenHab 2.4
#PWRUP
PeterA
Beiträge: 1106 Registriert: 8. Feb 2019 12:12
Answers: 13
Beitrag
von PeterA » 12. Sep 2020 10:56
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
udo1toni
Beiträge: 15265 Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt
Beitrag
von udo1toni » 12. Sep 2020 20:07
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
PeterA
Beiträge: 1106 Registriert: 8. Feb 2019 12:12
Answers: 13
Beitrag
von PeterA » 12. Sep 2020 21:32
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
udo1toni
Beiträge: 15265 Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt
Beitrag
von udo1toni » 13. Sep 2020 18:19
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
PeterA
Beiträge: 1106 Registriert: 8. Feb 2019 12:12
Answers: 13
Beitrag
von PeterA » 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.
- OpenHab 2.4
#PWRUP
PeterA
Beiträge: 1106 Registriert: 8. Feb 2019 12:12
Answers: 13
Beitrag
von PeterA » 13. Sep 2020 18:42
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
udo1toni
Beiträge: 15265 Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt
Beitrag
von udo1toni » 13. Sep 2020 19:45
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