Add possibility to query the source states of And and Or.
authorBenjamin Braatz <bb@bbraatz.eu>
Tue, 25 Jan 2022 21:08:54 +0000 (22:08 +0100)
committerBenjamin Braatz <bb@bbraatz.eu>
Tue, 25 Jan 2022 21:08:54 +0000 (22:08 +0100)
controlpi_plugins/state.py

index afa1b9df0d63c762c54bf304c1fd2b5d92c1c698..fd314d4c3b819b9c39f87e03952c327a71770bf1 100644 (file)
@@ -302,7 +302,8 @@ class AndState(BasePlugin):
     ...       "new state": True},
     ...      {"target": "Test State 1", "command": "set state",
     ...       "new state": False},
-    ...      {"target": "Test AndState", "command": "get state"}]))
+    ...      {"target": "Test AndState", "command": "get state"},
+    ...      {"target": "Test AndState", "command": "get sources"}]))
     ... # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
     test(): {'sender': '', 'event': 'registered', ...
     test(): {'sender': 'test()', 'target': 'Test State 1',
@@ -319,6 +320,10 @@ class AndState(BasePlugin):
     test(): {'sender': 'test()', 'target': 'Test AndState',
              'command': 'get state'}
     test(): {'sender': 'Test AndState', 'state': False}
+    test(): {'sender': 'test()', 'target': 'Test AndState',
+             'command': 'get sources'}
+    test(): {'sender': 'Test AndState',
+             'states': ['Test State 1', 'Test State 2']}
     """
 
     CONF_SCHEMA = {'properties': {'states': {'type': 'array',
@@ -343,17 +348,30 @@ class AndState(BasePlugin):
         self.bus.register(self.name, 'AndState',
                           [MessageTemplate({'event': {'const': 'changed'},
                                             'state': {'type': 'boolean'}}),
-                           MessageTemplate({'state': {'type': 'boolean'}})],
+                           MessageTemplate({'state': {'type': 'boolean'}}),
+                           MessageTemplate({'states': {'type': 'array',
+                                                       'items': {
+                                                         'type': 'string'
+                                                       }}})],
                           [([MessageTemplate({'target':
                                               {'const': self.name},
                                               'command':
                                               {'const': 'get state'}})],
                             self._get_state),
+                           ([MessageTemplate({'target':
+                                              {'const': self.name},
+                                              'command':
+                                              {'const': 'get sources'}})],
+                            self._get_sources),
                            (updates, self._update)])
 
     async def _get_state(self, message: Message) -> None:
         await self.bus.send(Message(self.name, {'state': self.state}))
 
+    async def _get_sources(self, message: Message) -> None:
+        source_states = list(self.states.keys())
+        await self.bus.send(Message(self.name, {'states': source_states}))
+
     async def _update(self, message: Message) -> None:
         assert isinstance(message['sender'], str)
         assert isinstance(message['state'], bool)
@@ -390,7 +408,8 @@ class OrState(BasePlugin):
     ...       "new state": True},
     ...      {"target": "Test State 1", "command": "set state",
     ...       "new state": False},
-    ...      {"target": "Test OrState", "command": "get state"}]))
+    ...      {"target": "Test OrState", "command": "get state"},
+    ...      {"target": "Test OrState", "command": "get sources"}]))
     ... # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
     test(): {'sender': '', 'event': 'registered', ...
     test(): {'sender': 'test()', 'target': 'Test State 1',
@@ -406,6 +425,10 @@ class OrState(BasePlugin):
     test(): {'sender': 'test()', 'target': 'Test OrState',
              'command': 'get state'}
     test(): {'sender': 'Test OrState', 'state': True}
+    test(): {'sender': 'test()', 'target': 'Test OrState',
+             'command': 'get sources'}
+    test(): {'sender': 'Test OrState',
+             'states': ['Test State 1', 'Test State 2']}
     """
 
     CONF_SCHEMA = {'properties': {'states': {'type': 'array',
@@ -430,17 +453,30 @@ class OrState(BasePlugin):
         self.bus.register(self.name, 'OrState',
                           [MessageTemplate({'event': {'const': 'changed'},
                                             'state': {'type': 'boolean'}}),
-                           MessageTemplate({'state': {'type': 'boolean'}})],
+                           MessageTemplate({'state': {'type': 'boolean'}}),
+                           MessageTemplate({'states': {'type': 'array',
+                                                       'items': {
+                                                         'type': 'string'
+                                                       }}})],
                           [([MessageTemplate({'target':
                                               {'const': self.name},
                                               'command':
                                               {'const': 'get state'}})],
                             self._get_state),
+                           ([MessageTemplate({'target':
+                                              {'const': self.name},
+                                              'command':
+                                              {'const': 'get sources'}})],
+                            self._get_sources),
                            (updates, self._update)])
 
     async def _get_state(self, message: Message) -> None:
         await self.bus.send(Message(self.name, {'state': self.state}))
 
+    async def _get_sources(self, message: Message) -> None:
+        source_states = list(self.states.keys())
+        await self.bus.send(Message(self.name, {'states': source_states}))
+
     async def _update(self, message: Message) -> None:
         assert isinstance(message['sender'], str)
         assert isinstance(message['state'], bool)
@@ -479,7 +515,8 @@ class AndSet(BasePlugin):
     ...      {"target": "Test AndSet", "command": "get state"},
     ...      {"target": "Test State 1", "command": "set state",
     ...       "new state": False},
-    ...      {"target": "Test AndSet", "command": "get state"}]))
+    ...      {"target": "Test AndSet", "command": "get state"},
+    ...      {"target": "Test AndSet", "command": "get sources"}]))
     ... # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
     test(): {'sender': '', 'event': 'registered', ...
     test(): {'sender': 'test()', 'target': 'Test State 1',
@@ -507,6 +544,10 @@ class AndSet(BasePlugin):
     test(): {'sender': 'Test AndSet', 'target': 'Test State 3',
              'command': 'set state', 'new state': False}
     test(): {'sender': 'Test State 3', 'state': False}
+    test(): {'sender': 'test()', 'target': 'Test AndSet',
+             'command': 'get sources'}
+    test(): {'sender': 'Test AndSet',
+             'states': ['Test State 1', 'Test State 2']}
     """
 
     CONF_SCHEMA = {'properties': {'input states': {'type': 'array',
@@ -538,12 +579,21 @@ class AndSet(BasePlugin):
                                             'command':
                                             {'const': 'set state'},
                                             'new state':
-                                            {'type': 'boolean'}})],
+                                            {'type': 'boolean'}}),
+                           MessageTemplate({'states': {'type': 'array',
+                                                       'items': {
+                                                         'type': 'string'
+                                                       }}})],
                           [([MessageTemplate({'target':
                                               {'const': self.name},
                                               'command':
                                               {'const': 'get state'}})],
                             self._get_state),
+                           ([MessageTemplate({'target':
+                                              {'const': self.name},
+                                              'command':
+                                              {'const': 'get sources'}})],
+                            self._get_sources),
                            (updates, self._update)])
 
     async def _get_state(self, message: Message) -> None:
@@ -552,6 +602,10 @@ class AndSet(BasePlugin):
                                      'command': 'set state',
                                      'new state': self.state}))
 
+    async def _get_sources(self, message: Message) -> None:
+        source_states = list(self.states.keys())
+        await self.bus.send(Message(self.name, {'states': source_states}))
+
     async def _update(self, message: Message) -> None:
         assert isinstance(message['sender'], str)
         assert isinstance(message['state'], bool)
@@ -591,7 +645,8 @@ class OrSet(BasePlugin):
     ...      {"target": "Test State 2", "command": "set state",
     ...       "new state": True},
     ...      {"target": "Test State 1", "command": "set state",
-    ...       "new state": False}]))
+    ...       "new state": False},
+    ...      {"target": "Test OrSet", "command": "get sources"}]))
     ... # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
     test(): {'sender': '', 'event': 'registered', ...
     test(): {'sender': 'test()', 'target': 'Test State 1',
@@ -611,6 +666,10 @@ class OrSet(BasePlugin):
     test(): {'sender': 'test()', 'target': 'Test State 1',
              'command': 'set state', 'new state': False}
     test(): {'sender': 'Test State 1', 'event': 'changed', 'state': False}
+    test(): {'sender': 'test()', 'target': 'Test OrSet',
+             'command': 'get sources'}
+    test(): {'sender': 'Test OrSet',
+             'states': ['Test State 1', 'Test State 2']}
     """
 
     CONF_SCHEMA = {'properties': {'input states': {'type': 'array',
@@ -642,12 +701,21 @@ class OrSet(BasePlugin):
                                             'command':
                                             {'const': 'set state'},
                                             'new state':
-                                            {'type': 'boolean'}})],
+                                            {'type': 'boolean'}}),
+                           MessageTemplate({'states': {'type': 'array',
+                                                       'items': {
+                                                         'type': 'string'
+                                                       }}})],
                           [([MessageTemplate({'target':
                                               {'const': self.name},
                                               'command':
                                               {'const': 'get state'}})],
                             self._get_state),
+                           ([MessageTemplate({'target':
+                                              {'const': self.name},
+                                              'command':
+                                              {'const': 'get sources'}})],
+                            self._get_sources),
                            (updates, self._update)])
 
     async def _get_state(self, message: Message) -> None:
@@ -656,6 +724,10 @@ class OrSet(BasePlugin):
                                      'command': 'set state',
                                      'new state': self.state}))
 
+    async def _get_sources(self, message: Message) -> None:
+        source_states = list(self.states.keys())
+        await self.bus.send(Message(self.name, {'states': source_states}))
+
     async def _update(self, message: Message) -> None:
         assert isinstance(message['sender'], str)
         assert isinstance(message['state'], bool)