Ich habe mit der Rule DSL inzwischen etwa 30 Rules programmiert. In den vergangenen Monaten bin ich dazu übergegangen die Rules anders zu organisieren und mich würde interessieren, wie ihr das so seht.
Ich vermute, die meisten haben wie ich damit angefangen, je Event eine Regel zu implementieren, die dann ein oder mehrere Aktionen auslöst. Das wirkt zunächst auch übersichtlicher. Als dann aber immer mehr Messwerte und Ereignisse hinzukamen, wurde das ganze unübersichtlich und führte schließlich zu unkontrolliertem Verhalten.
Nun habe ich eher je Aktor eine Rule, die auf alle erforderlichen Ereignisse reagiert. Also genau umgekehrt. Dadurch ist im Code besser zu erkennen, welche Bedingungen zu einem bestimmten Verhalten führen. Leider musst ich dazu aber zwei Nachteile hinnehmen: Im Body der Rule muss ich ggf. die Bedingungen ein zweites Mal prüfen. Und ich "weiß" im Body ggf. nicht mehr, was jeweils das Ereignis war. Insbesondere bei Ereignissen unterschiedlichen Typs.
Code: Alles auswählen
rule "Kitchen worktop light switch"
when
System started or
Item Kitchen_MotionSensor_Occupancy changed or
Item sPresence changed or
Item vDaylight changed
then
var OnOffType state
// Determine new state
if (Kitchen_MotionSensor_Occupancy.state == ON && sPresence.state == "PRESENT" && vDaylight.state != "SUNNY") {
state = ON
} else {
state = OFF
}
// Publish new state, if changed
if (Kitchen_Worktop_Light_Switch.state == NULL || Kitchen_Worktop_Light_Switch.state != state) {
Kitchen_Worktop_Light_Switch.sendCommand(state)
}
end