From aceba27597d5e4fbdaebc8e0093d4c02c404d5e7 Mon Sep 17 00:00:00 2001 From: Benjamin Braatz Date: Tue, 25 Jan 2022 22:08:54 +0100 Subject: [PATCH] Add possibility to query the source states of And and Or. --- controlpi_plugins/state.py | 88 ++++++++++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 8 deletions(-) diff --git a/controlpi_plugins/state.py b/controlpi_plugins/state.py index afa1b9d..fd314d4 100644 --- a/controlpi_plugins/state.py +++ b/controlpi_plugins/state.py @@ -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) -- 2.34.1