Hallo,
ich habe mir jüngst überlegt, wie man Abläufe in SmarthomeNG mit State Machines handhaben könnte. Konkret geht es um die Realisierung einer Alarmanlage entsprechend dem beigefügten Diagramm.
StateMachine.png
Nach ein paar Irrwegen ist es mir jetzt weitestgehend gelungen. Möglich sind auch hierarchische Zustände und Nebenläufigkeit.
Der untere Code ist zwar etwas üppig geworden, aber man sieht dann den vollständigen Aufbau des Automaten.
Vielleicht hilft er ja dem einen oder anderen für eigene Projekte...
Grüße Thorsten
P.S.: Die KNX-Kommunikation habe ich der Übersicht halber gelöscht.
ich habe mir jüngst überlegt, wie man Abläufe in SmarthomeNG mit State Machines handhaben könnte. Konkret geht es um die Realisierung einer Alarmanlage entsprechend dem beigefügten Diagramm.
StateMachine.png
Nach ein paar Irrwegen ist es mir jetzt weitestgehend gelungen. Möglich sind auch hierarchische Zustände und Nebenläufigkeit.
Der untere Code ist zwar etwas üppig geworden, aber man sieht dann den vollständigen Aufbau des Automaten.
Vielleicht hilft er ja dem einen oder anderen für eigene Projekte...
Grüße Thorsten
P.S.: Die KNX-Kommunikation habe ich der Übersicht halber gelöscht.
Code:
alarm: signal: state: type: num initial_value: 1 on_update: state1: # alarm system off ev1: type: bool knx_dpt: 1 knx_listen: 0/3/32 on_update: - (sh....(2)) if (sh....() == 1) else None state2: # alarm system on state21: # alarm system on type: num # state of this substate autocond: type: num autonext: type: num on_update: sh...autocond(sh...()) autodelay: type: num on_update: sh...(sh...autonext()) if ((value == -1) and (sh...() == sh...autocond())) else None autotimer: sh...autodelay() = -1 = latest entry: type: num eval_trigger: ... eval: value on_update: # lal - (sh...(211)) if (sh....() == 2) else (sh...(0)) state211: # alarm system preparation ev1: type: num eval_trigger: ... eval: value on_update: - (sh....autonext(212),sh....autodelay(15)) if (sh....() == 211) else None state212: # alarm system armed ev1: type: num eval_trigger: - alarm.event_ug - alarm.event_eg eval: value on_update: - sh....(213) if (sh....() == 212) else None ev2: type: num eval_trigger: alarm.event_og eval: value on_update: - sh....(215) if (sh....() == 212) else None state213: # alarm system prealarm ev1: type: num eval_trigger: ... eval: value on_update: - (sh....autonext(214),sh....autodelay(30)) if (sh....() == 213) else None state214: # alarm system ealarm ev1: type: num eval_trigger: ... eval: value on_update: - (sh.alarm.signal.state(2)) if (sh....() == 214) else None state215: # alarm system ealarm ev1: type: num eval_trigger: ... eval: value on_update: - (sh....autonext(212),sh....autodelay(20)) if (sh....() == 215) else None ev2: type: num eval_trigger: alarm.event eval: value on_update: - sh.....(2) if (sh....() == 215) else None state22: # alarm system on type: num entry: type: num eval_trigger: ... eval: value on_update: - (sh...(221)) if (sh....() == 2) else (sh...(0)) state221: ev1: type: bool knx_dpt: 1 knx_listen: 0/3/32 on_update: - sh....(222) if (sh....() == 221) else None state222: type: num entry: type: num eval_trigger: ... eval: value on_update: - (sh...(2221)) if (sh....() == 222) else (sh...(0)) state2221: # step 1 ev1: type: bool knx_dpt: 1 knx_listen: 0/3/31 on_update: - sh....(2222) if (sh....() == 2221) else None ev2: type: bool knx_dpt: 1 knx_listen: 0/3/32 on_update: - sh.....(221) if (sh....() == 2221) else None state2222: # step 2 ev1: type: num knx_dpt: 1 knx_listen: 0/3/32 on_update: - sh......(1) if (sh....() == 2222) else None ev2: type: num knx_dpt: 1 knx_listen: 0/3/31 on_update: - sh......(2) if (sh....() == 2222) else None
Kommentar