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