das ist es ja gerade, die Positionsmeldungen sind genau und der Status geht m.E. auch nicht verloren. Ich habe ja extra noch mal auf den Kanal 3 gewechselt, da dort die tatsächliche Behanghöhe geliefert wird. Ich zeig noch mal gerade, wie es jetzt genau ausschaut:
Code: Alles auswählen
var Timer tWoZiRollladen = null
rule "Wohzimmer - Rollladen Szenen"
when
Item WoZi_Rollladen_Szenen received command
then
if(!(receivedCommand instanceof Number))
return;
switch(receivedCommand as Number) {
case 0:{
logInfo("scenes", "Wohnzimmer: Alle Rollläden offen gewählt")
WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(0)
WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(0)
}
case 1:{
logInfo("scenes", "Wohnzimmer: Alle Rollläden geschlossen gewählt")
WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(85)
WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(85)
}
case 2:{
logInfo("scenes", "Wohnzimmer: Abendessen gewählt")
WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(35)
WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(55)
}
case 3:{
logInfo("scenes", "Wohnzimmer: Nur Straßenseite geschlossen gewählt")
WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(82)
WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(82)
}
}
end
rule "Wohzimmer - Rollladen Rückmeldung"
when
Member of gRollladenWZ changed
then
if (tWoZiRollladen !== null) {
tWoZiRollladen.cancel()
tWoZiRollladen = null
}
tWoZiRollladen = createTimer(now.plusSeconds(40), [|
val Number nLi = WoZi_Rollladen_liFe_Kanal3_LEVEL.state as Number
val Number nRe = WoZi_Rollladen_reFe_Kanal3_LEVEL.state as Number
//val Number nTuer = WoZi_Rollladen_Tuer_Kanal4_LEVEL.state as Number
var theState = NULL
if(nLi == 0 && nRe == 0) // && nTuer == 0)
theState = 0
if(nLi == 85 && nRe == 85) // && nTuer == 85)
theState = 1
if(nLi == 35 && nRe == 55) // && nTuer == 0)
theState = 2
if(nLi == 82 && nRe == 82) // && nTuer == 0)
theState = 3
if(theState != WoZi_Rollladen_Szenen.state)
WoZi_Rollladen_Szenen.postUpdate(theState)
tWoZiRollladen = null
])
end
- Den Timer habe ich einfach mal global definiert.
- Bei case 3 bin ich auf 82% Behanghöhe gegangen, da er sich sonst aktuell - wegen der noch fehlenden Terrassentüre - nicht von case 1 unterschieden hat (da hatte ich vermutet, dass sich das irgendwie verschluckt)
- Da ein Rollladen maximal 29 Sekunden fährt, hatte ich mir gedacht, mit dem Timer wartet er 40 Sekunden und schreibt dann den Status der beiden Behanghöhen in die beiden values nLi und nRe
- Anschließend werden die IFs durchlaufen und theState korrekt gesetzt. Der spring aber immer wieder auf NULL oder einen case, der nicht passt (eben waren alle Rollladen oben - von meiner Frau manuell gefahren) und trotzdem wurde case 1 "Alle Rollladen geschlossen" angezeigt.
Code: Alles auswählen
2021-04-25 13:48:26.690 [vent.ItemStateChangedEvent] - WoZi_Rollladen_liFe_Kanal3_LEVEL changed from 5 to 0
2021-04-25 13:48:26.728 [vent.ItemStateChangedEvent] - WoZi_Rollladen_liFe_Kanal4_LEVEL changed from 100 to 0
2021-04-25 13:48:27.889 [vent.ItemStateChangedEvent] - WoZi_Rollladen_reFe_Kanal3_LEVEL changed from 7 to 0
2021-04-25 13:48:27.928 [vent.ItemStateChangedEvent] - WoZi_Rollladen_reFe_Kanal4_LEVEL changed from 100 to 0
<null>.tWoZiRollladen = <XNullLiteralImplCustom>
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]
<null>.tWoZiRollladen = <XNullLiteralImplCustom>
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]