Diese log Zeile:udo1toni hat geschrieben: ↑20. Sep 2020 17:14 Ich habe hier noch mal eine aktualisierte Fassung: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" ) var String strSensor = "" rule "Update Kombi Item" when Member of gTemp changed or Member of gHum changed or Member of gruppeRolladen_Sued changed or Member of gruppeRolladen_West changed then strSensor = triggeringItem.name.split("_").get(0) // Sensor bestimmen. 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 logInfo("kombiupdate","Rollladen ohne Sensoren. Abbruch!") return; // Rule abbrechen } } logInfo("kombiupdate","var String strSensor: {}",strSensor) // zugehörige Items bestimmen val ItemTempTendenz = gTempTendenz.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem // Item für Temperatur Tendenz bestimmen logInfo("kombiupdate","ItemTempTendenz: {}",ItemTempTendenz.name) val ItemTempProxy = gTempProxy.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem // Proxy Item für Temperatur bestimmen logInfo("kombiupdate","ItemTempProxy: {}",ItemTempProxy.name) val ItemHumTendenz = gHumTendenz.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem // Item für Feuchte Tendenz bestimmen logInfo("kombiupdate","ItemHumTendenz: {}",ItemHumTendenz.name) val ItemHumProxy = gHumProxy.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem // Proxy Item für Feuchte bestimmen logInfo("kombiupdate","ItemHumProxy: {}",ItemHumProxy.name) val ItemTemp = gTemp.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem // Temperatur Item bestimmen logInfo("kombiupdate","ItemTemp: {}",ItemTemp.name) val ItemHum = gHum.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem // Feuchte Item bestimmen logInfo("kombiupdate","ItemHum: {}",ItemHum.name) val ItemKombi = gKombi.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem // Kombi Item bestimmen logInfo("kombiupdate","ItemKombi: {}",ItemKombi.name) val ItemShutter = if(hmRoller.get(strSensor) !== null) // falls Rollladen vorhanden grAllshutters.allMembers.findFirst[i|i.name == hmRoller.get(strSensor)] as RollershutterItem // Rolladen Pos Item bestimmen else null logInfo("kombiupdate","ItemShutter: {}",ItemShutter.name) // 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 logInfo("kombiupdate","Number Proxy") 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 logInfo("kombiupdate","Number") // 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("kombiupdate","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("kombiupdate","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 + " " + String::format("%.1f °C / ",nTemp) + strHumTendence + " " + String::format("%.0f %%",nHum) // 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
- Variable global definiert (das muss funktionieren!)
- Die log-Befehle sind angepasst.
- Ein paar Klammern wurden ergänzt (nötig durch die log-Befehle)
- Eine potentielle null-Meldungsquelle beseitigt...
Code: Alles auswählen
logInfo("kombiupdate","ItemShutter: {}",ItemShutter.name)
Code: Alles auswählen
2020-09-20 17:34:33.053 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Update Kombi Item': cannot invoke method public java.lang.String org.eclipse.smarthome.core.items.GenericItem.getName() on null
Aktuell aktive Rule:
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"
)
var String strSensor = ""
rule "Update Kombi Item"
when
Member of gTemp changed or
Member of gHum changed or
Member of gruppeRolladen_Sued changed or
Member of gruppeRolladen_West changed
then
strSensor = triggeringItem.name.split("_").get(0) // Sensor bestimmen.
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
logInfo("kombiupdate","Rollladen ohne Sensoren. Abbruch!")
return; // Rule abbrechen
}
}
logInfo("kombiupdate","var String strSensor: {}",strSensor)
// zugehörige Items bestimmen
val ItemTempTendenz = gTempTendenz.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem // Item für Temperatur Tendenz bestimmen
logInfo("kombiupdate","ItemTempTendenz: {}",ItemTempTendenz.name)
val ItemTempProxy = gTempProxy.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem // Proxy Item für Temperatur bestimmen
logInfo("kombiupdate","ItemTempProxy: {}",ItemTempProxy.name)
val ItemHumTendenz = gHumTendenz.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem // Item für Feuchte Tendenz bestimmen
logInfo("kombiupdate","ItemHumTendenz: {}",ItemHumTendenz.name)
val ItemHumProxy = gHumProxy.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem // Proxy Item für Feuchte bestimmen
logInfo("kombiupdate","ItemHumProxy: {}",ItemHumProxy.name)
val ItemTemp = gTemp.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem // Temperatur Item bestimmen
logInfo("kombiupdate","ItemTemp: {}",ItemTemp.name)
val ItemHum = gHum.members.findFirst[i|i.name.split("_").get(0) == strSensor] as NumberItem // Feuchte Item bestimmen
logInfo("kombiupdate","ItemHum: {}",ItemHum.name)
val ItemKombi = gKombi.members.findFirst[i|i.name.split("_").get(0) == strSensor] as StringItem // Kombi Item bestimmen
logInfo("kombiupdate","ItemKombi: {}",ItemKombi.name)
val ItemShutter = if(hmRoller.get(strSensor) !== null) // falls Rollladen vorhanden
grAllshutters.allMembers.findFirst[i|i.name == hmRoller.get(strSensor)] as RollershutterItem // Rolladen Pos Item bestimmen
else
null
//logInfo("kombiupdate","ItemShutter: {}",ItemShutter.name)
// 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
logInfo("kombiupdate","Number Proxy")
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
logInfo("kombiupdate","Number")
// 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("kombiupdate","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("kombiupdate","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 + " " + String::format("%.1f °C / ",nTemp) + strHumTendence + " " + String::format("%.0f %%",nHum) // 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
Aber nach wie vor bei der Feuchte kein Update auf fallend oder stagnierend jedoch auf steigend.
Code: Alles auswählen
2020-09-21 09:44:30.439 [vent.ItemStateChangedEvent] - Aussen_Hum changed from 73 to 72
2020-09-21 09:44:30.447 [vent.ItemStateChangedEvent] - AussenFeuchte changed from 73 % to 72 %
==> /var/log/openhab2/openhab.log <==
2020-09-21 09:44:30.461 [INFO ] [e.smarthome.model.script.kombiupdate] - var String strSensor: Aussen
2020-09-21 09:44:30.496 [INFO ] [e.smarthome.model.script.kombiupdate] - ItemTempTendenz: Aussen_TempTendenz
2020-09-21 09:44:30.510 [INFO ] [e.smarthome.model.script.kombiupdate] - ItemTempProxy: Aussen_TempProxy
2020-09-21 09:44:30.519 [INFO ] [e.smarthome.model.script.kombiupdate] - ItemHumTendenz: Aussen_HumTendenz
2020-09-21 09:44:30.530 [INFO ] [e.smarthome.model.script.kombiupdate] - ItemHumProxy: Aussen_HumProxy
2020-09-21 09:44:30.541 [INFO ] [e.smarthome.model.script.kombiupdate] - ItemTemp: Aussen_Temp
2020-09-21 09:44:30.558 [INFO ] [e.smarthome.model.script.kombiupdate] - ItemHum: Aussen_Hum
2020-09-21 09:44:30.571 [INFO ] [e.smarthome.model.script.kombiupdate] - ItemKombi: Aussen_Kombi
2020-09-21 09:44:30.579 [INFO ] [e.smarthome.model.script.kombiupdate] - Number Proxy
2020-09-21 09:44:30.585 [INFO ] [e.smarthome.model.script.kombiupdate] - Number
2020-09-21 09:44:30.593 [INFO ] [e.smarthome.model.script.kombiupdate] - Sensor Aussen Temperatur stagnierend
==> /var/log/openhab2/events.log <==
2020-09-21 09:44:30.607 [vent.ItemStateChangedEvent] - Aussen_TempTendenz changed from ⬆️ to ⬅️➡️
==> /var/log/openhab2/openhab.log <==
2020-09-21 09:44:30.609 [INFO ] [e.smarthome.model.script.kombiupdate] - Sensor Aussen Feuchte steigend
==> /var/log/openhab2/events.log <==
2020-09-21 09:44:30.627 [vent.ItemStateChangedEvent] - Aussen_HumProxy changed from 73.0 to 72.0
2020-09-21 09:44:30.648 [vent.ItemStateChangedEvent] - Aussen_Kombi changed from ⬆️ 13,1 °C / ⬆️ 73 % to ⬅️➡️ 13,1 °C / ⬆️ 72 %