Simplify to one trigger per transition.
authorBenjamin Braatz <bb@bbraatz.eu>
Tue, 23 Mar 2021 15:32:16 +0000 (16:32 +0100)
committerBenjamin Braatz <bb@bbraatz.eu>
Tue, 23 Mar 2021 15:32:16 +0000 (16:32 +0100)
conf.json
controlpi_plugins/statemachine.py

index 7429043d6815c80d51c91ea221c4c41e89f5e58d..04fe43ab918613cceef5a11ab9f972928defd8ef 100644 (file)
--- a/conf.json
+++ b/conf.json
                 ],
                 "transitions": [
                     {
-                        "triggers": [
-                            {
-                                "sender": { "const": "Emergency Button" },
-                                "event": { "const": "pressed" }
-                            }
-                        ],
+                        "trigger": {
+                            "sender": { "const": "Emergency Button" },
+                            "event": { "const": "pressed" }
+                        },
                         "to": "off"
                     }
                 ]
                 ],
                 "transitions": [
                     {
-                        "triggers": [
-                            {
-                                "sender": { "const": "Emergency Button" },
-                                "event": { "const": "pressed" }
-                            }
-                        ],
+                        "trigger": {
+                            "sender": { "const": "Emergency Button" },
+                            "event": { "const": "pressed" }
+                        },
                         "to": "emergency"
                     },
                     {
-                        "triggers": [
-                            {
-                                "sender": { "const": "Lubrication Button" },
-                                "event": { "const": "pressed" }
-                            }
-                        ],
+                        "trigger": {
+                            "sender": { "const": "Lubrication Button" },
+                            "event": { "const": "pressed" }
+                        },
                         "to": "lubrication on"
                     }
                 ]
                 ],
                 "transitions": [
                     {
-                        "triggers": [
-                            {
-                                "sender": { "const": "Emergency Button" },
-                                "event": { "const": "pressed" }
-                            }
-                        ],
+                        "trigger": {
+                            "sender": { "const": "Emergency Button" },
+                            "event": { "const": "pressed" }
+                        },
                         "to": "emergency"
                     },
                     {
-                        "triggers": [
-                            {
-                                "sender": { "const": "Lubrication Button" },
-                                "event": { "const": "pressed" }
-                            }
-                        ],
+                        "trigger": {
+                            "sender": { "const": "Lubrication Button" },
+                            "event": { "const": "pressed" }
+                        },
                         "to": "off"
                     },
                     {
-                        "triggers": [
-                            {
-                                "sender": { "const": "Engine Button" },
-                                "event": { "const": "pressed" }
-                            }
-                        ],
+                        "trigger": {
+                            "sender": { "const": "Engine Button" },
+                            "event": { "const": "pressed" }
+                        },
                         "to": "engine on"
                     }
                 ]
                 ],
                 "transitions": [
                     {
-                        "triggers": [
-                            {
-                                "sender": { "const": "Emergency Button" },
-                                "event": { "const": "pressed" }
-                            }
-                        ],
+                        "trigger": {
+                            "sender": { "const": "Emergency Button" },
+                            "event": { "const": "pressed" }
+                        },
                         "to": "emergency"
                     },
                     {
-                        "triggers": [
-                            {
-                                "sender": { "const": "Engine Button" },
-                                "event": { "const": "pressed" }
-                            }
-                        ],
+                        "trigger": {
+                            "sender": { "const": "Engine Button" },
+                            "event": { "const": "pressed" }
+                        },
                         "to": "lubrication on"
                     }
                 ]
index a68e04f958972d940810888ab961bc6959f09689..089cc792bb8351e02148c3019fa80944841537c3 100644 (file)
@@ -29,10 +29,9 @@ class StateMachine(BasePlugin):
                          'items':
                          {'type': 'object',
                           'properties':
-                          {'triggers':
-                           {'type': 'array', 'items': {'type': 'object'}},
+                          {'trigger': {'type': 'object'},
                            'to': {'type': 'string'}},
-                          'required': ['triggers', 'to']}}},
+                          'required': ['trigger', 'to']}}},
                        'required': ['commands', 'transitions']}},
                      'additionalProperties': False}},
                    'required': ['init', 'states']}
@@ -49,17 +48,16 @@ class StateMachine(BasePlugin):
                                              'states': self.conf['states']}))
         transitions = self.conf['states'][self._current_state]['transitions']
         for transition in transitions:
-            for trigger in transition['triggers']:
-                if MessageTemplate(trigger).check(message):
-                    new_state = transition['to']
-                    self._current_state: str = new_state
-                    await self.bus.send(Message(self.name,
-                                                {'event': 'changed',
-                                                 'state': new_state}))
-                    commands = self.conf['states'][new_state]['commands']
-                    for command in commands:
-                        await self.bus.send(Message(self.name, command))
-                    break
+            if MessageTemplate(transition['trigger']).check(message):
+                new_state = transition['to']
+                self._current_state: str = new_state
+                await self.bus.send(Message(self.name,
+                                            {'event': 'changed',
+                                             'state': new_state}))
+                commands = self.conf['states'][new_state]['commands']
+                for command in commands:
+                    await self.bus.send(Message(self.name, command))
+                break
 
     def process_conf(self) -> None:
         """Register plugin as bus client."""
@@ -83,11 +81,9 @@ class StateMachine(BasePlugin):
                                            'items':
                                            {'type': 'object',
                                             'properties':
-                                            {'triggers':
-                                             {'type': 'array',
-                                              'items': {'type': 'object'}},
+                                            {'trigger': {'type': 'object'},
                                              'to': {'type': 'string'}},
-                                            'required': ['triggers', 'to']}}},
+                                            'required': ['trigger', 'to']}}},
                                          'required': ['commands',
                                                       'transitions']}},
                                        'additionalProperties': False}}))
@@ -102,8 +98,7 @@ class StateMachine(BasePlugin):
                 sends.append(MessageTemplate.from_message(command))
             transitions = self.conf['states'][state]['transitions']
             for transition in transitions:
-                for template in transition['triggers']:
-                    receives.append(MessageTemplate(template))
+                receives.append(MessageTemplate(transition['trigger']))
         self.bus.register(self.name, 'StateMachine',
                           sends, receives, self._receive)