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