From 1c6dae875c2bda6cd09abb1c373fe8d2b027f976 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Wed, 7 Aug 2024 18:42:57 +0200 Subject: [PATCH] !!! DONT USE !!! - feasibility test to add output parameter to actor --- cbpi/api/actor.py | 11 +- cbpi/api/base.py | 10 +- cbpi/api/dataclasses.py | 5 +- cbpi/controller/actor_controller.py | 24 ++- cbpi/controller/satellite_controller.py | 16 ++ .../extension/FermenterHysteresis/__init__.py | 6 +- cbpi/extension/dummyactor/__init__.py | 2 +- tests/cbpi-test-config/actor.json | 2 + tests/cbpi-test-config/config.json | 169 +++++++++++++++++- tests/cbpi-test-config/config.yaml | 1 + 10 files changed, 233 insertions(+), 13 deletions(-) diff --git a/cbpi/api/actor.py b/cbpi/api/actor.py index 53d8855..941b729 100644 --- a/cbpi/api/actor.py +++ b/cbpi/api/actor.py @@ -21,6 +21,7 @@ class CBPiActor(metaclass=ABCMeta): self.state = False self.running = False self.power = 100 + self.output = 100 self.timer = 0 def init(self): @@ -71,7 +72,7 @@ class CBPiActor(metaclass=ABCMeta): async def add_config_value(self, name, value, type: ConfigType, description, options=None): await self.cbpi.add(name, value, type, description, options=None) - async def on(self, power): + async def on(self, power, output): ''' Code to switch the actor on. Power is provided as integer value @@ -98,3 +99,11 @@ class CBPiActor(metaclass=ABCMeta): return dict(power=self.power) pass + async def set_output(self,output): + ''' + Code to set power for actor + + :return: dict power + ''' + return dict(output=self.output) + pass diff --git a/cbpi/api/base.py b/cbpi/api/base.py index 7e6365c..f0aead6 100644 --- a/cbpi/api/base.py +++ b/cbpi/api/base.py @@ -65,10 +65,10 @@ class CBPiBase(metaclass=ABCMeta): logging.error("Failed to read actor state in step - actor {}".format(id)) return False - async def actor_on(self,id,power=100): + async def actor_on(self,id,power=100, output=100): try: - await self.cbpi.actor.on(id,power) + await self.cbpi.actor.on(id,power, output) except Exception as e: pass @@ -83,3 +83,9 @@ class CBPiBase(metaclass=ABCMeta): await self.cbpi.actor.set_power(id,power) except Exception as e: pass + + async def actor_set_output(self,id,output): + try: + await self.cbpi.actor.set_output(id,output) + except Exception as e: + pass \ No newline at end of file diff --git a/cbpi/api/dataclasses.py b/cbpi/api/dataclasses.py index 1c403be..e837cc4 100644 --- a/cbpi/api/dataclasses.py +++ b/cbpi/api/dataclasses.py @@ -56,14 +56,15 @@ class Actor: props: Props = Props() state: bool = False power: int = 100 + output: int = 100 timer: int = 0 type: str = None instance: str = None def __str__(self): - return "name={} props={}, state={}, type={}, power={}, timer={}".format(self.name, self.props, self.state, self.type, self.power, self.timer) + return "name={} props={}, state={}, type={}, power={}, output={}, timer={}".format(self.name, self.props, self.state, self.type, self.power, self.output, self.timer) def to_dict(self): - return dict(id=self.id, name=self.name, type=self.type, props=self.props.to_dict(), state=self.instance.get_state(), power=self.power, timer=self.timer) + return dict(id=self.id, name=self.name, type=self.type, props=self.props.to_dict(), state=self.instance.get_state(), power=self.power, output=self.output, timer=self.timer) class DataType(Enum): VALUE="value" diff --git a/cbpi/controller/actor_controller.py b/cbpi/controller/actor_controller.py index 118d031..ced8ae9 100644 --- a/cbpi/controller/actor_controller.py +++ b/cbpi/controller/actor_controller.py @@ -9,7 +9,7 @@ class ActorController(BasicController): self.update_key = "actorupdate" self.sorting=True - async def on(self, id, power=None): + async def on(self, id, power=None, output=None): try: item = self.find_by_id(id) if power is None: @@ -18,14 +18,22 @@ class ActorController(BasicController): power = item.power else: power = 100 + + if output is None: + logging.info("Output is none") + if item.output: + output = item.output + else: + output = 100 if item.instance.state is False: - await item.instance.on(power) + await item.instance.on(power,output) #await self.push_udpate() self.cbpi.ws.send(dict(topic=self.update_key, data=list(map(lambda item: item.to_dict(), self.data))),self.sorting) self.cbpi.push_update("cbpi/actorupdate/{}".format(id), item.to_dict(), True) else: await self.set_power(id, power) - + await self.set_output(id, output) + except Exception as e: logging.error("Failed to switch on Actor {} {}".format(id, e)) @@ -57,10 +65,18 @@ class ActorController(BasicController): except Exception as e: logging.error("Failed to set power {} {}".format(id, e)) - async def actor_update(self, id, power): + async def set_output(self, id, output): + try: + item = self.find_by_id(id) + await item.instance.set_output(output) + except Exception as e: + logging.error("Failed to set output {} {}".format(id, e)) + + async def actor_update(self, id, power, output): try: item = self.find_by_id(id) item.power = round(power) + item.output = round(output) #await self.push_udpate() self.cbpi.ws.send(dict(topic=self.update_key, data=list(map(lambda item: item.to_dict(), self.data))),self.sorting) self.cbpi.push_update("cbpi/actorupdate/{}".format(id), item.to_dict()) diff --git a/cbpi/controller/satellite_controller.py b/cbpi/controller/satellite_controller.py index 19f2dc5..2ead477 100644 --- a/cbpi/controller/satellite_controller.py +++ b/cbpi/controller/satellite_controller.py @@ -27,6 +27,7 @@ class SatelliteController: ("cbpi/actor/+/on", self._actor_on), ("cbpi/actor/+/off", self._actor_off), ("cbpi/actor/+/power", self._actor_power), + ("cbpi/actor/+/output", self._actor_output), ("cbpi/updateactor", self._actorupdate), ("cbpi/updatekettle", self._kettleupdate), ("cbpi/updatesensor", self._sensorupdate), @@ -123,6 +124,21 @@ class SatelliteController: self.logger.warning("Failed to set actor power via mqtt. No valid power in message") except: self.logger.warning("Failed to set actor power via mqtt") + + async def _actor_output(self, message): + try: + topic_key = str(message.topic).split("/") + try: + output=int(message.payload.decode()) + #if power > 100: + # power = 100 + #if power < 0: + # power = 0 + await self.cbpi.actor.set_output(topic_key[2],output) + except: + self.logger.warning("Failed to set actor output via mqtt. No valid output in message") + except: + self.logger.warning("Failed to set actor output via mqtt") async def _kettleupdate(self, message): try: diff --git a/cbpi/extension/FermenterHysteresis/__init__.py b/cbpi/extension/FermenterHysteresis/__init__.py index 9f7d0fe..ad2684a 100644 --- a/cbpi/extension/FermenterHysteresis/__init__.py +++ b/cbpi/extension/FermenterHysteresis/__init__.py @@ -61,6 +61,8 @@ class FermenterHysteresis(CBPiFermenterLogic): self.cooler_offset_max = float(self.props.get("CoolerOffsetOff", 0)) self.heater_max_power = int(self.props.get("HeaterMaxPower", 100)) self.cooler_max_power = int(self.props.get("CoolerMaxPower", 100)) + self.heater_max_output=self.heater_max_power + self.cooler_max_output=self.cooler_max_power self.fermenter = self.get_fermenter(self.id) self.heater = self.fermenter.heater @@ -85,7 +87,7 @@ class FermenterHysteresis(CBPiFermenterLogic): if sensor_value + self.heater_offset_min <= target_temp: if self.heater and (heater_state == False): - await self.actor_on(self.heater, self.heater_max_power) + await self.actor_on(self.heater, self.heater_max_power, self.heater_max_output) if sensor_value + self.heater_offset_max >= target_temp: if self.heater and (heater_state == True): @@ -93,7 +95,7 @@ class FermenterHysteresis(CBPiFermenterLogic): if sensor_value >= self.cooler_offset_min + target_temp: if self.cooler and (cooler_state == False): - await self.actor_on(self.cooler, self.cooler_max_power) + await self.actor_on(self.cooler, self.cooler_max_power, self.cooler_max_output) if sensor_value <= self.cooler_offset_max + target_temp: if self.cooler and (cooler_state == True): diff --git a/cbpi/extension/dummyactor/__init__.py b/cbpi/extension/dummyactor/__init__.py index cc8a0cf..96d5c6b 100644 --- a/cbpi/extension/dummyactor/__init__.py +++ b/cbpi/extension/dummyactor/__init__.py @@ -24,7 +24,7 @@ class DummyActor(CBPiActor): async def start(self): await super().start() - async def on(self, power=0): + async def on(self, power=0, output=0): logger.info("ACTOR %s ON " % self.id) self.state = True diff --git a/tests/cbpi-test-config/actor.json b/tests/cbpi-test-config/actor.json index 9e413ee..ca537cb 100644 --- a/tests/cbpi-test-config/actor.json +++ b/tests/cbpi-test-config/actor.json @@ -3,9 +3,11 @@ { "id": "3CUJte4bkxDMFCtLX8eqsX", "name": "SomeActor", + "output": 100, "power": 100, "props": {}, "state": false, + "timer": 0, "type": "DummyActor" } ] diff --git a/tests/cbpi-test-config/config.json b/tests/cbpi-test-config/config.json index 48da07d..5122046 100644 --- a/tests/cbpi-test-config/config.json +++ b/tests/cbpi-test-config/config.json @@ -41,6 +41,128 @@ "type": "select", "value": "Yes" }, + "AutoReboot": { + "description": "Reboot Pi once a day at selected time", + "name": "AutoReboot", + "options": [ + { + "label": "Yes", + "value": "Yes" + }, + { + "label": "No", + "value": "No" + } + ], + "source": "cbpi4-system", + "type": "select", + "value": "No" + }, + "AutoRebootTime": { + "description": "Time for daily reboot", + "name": "AutoRebootTime", + "options": [ + { + "label": "0", + "value": 0 + }, + { + "label": "1", + "value": 1 + }, + { + "label": "2", + "value": 2 + }, + { + "label": "3", + "value": 3 + }, + { + "label": "4", + "value": 4 + }, + { + "label": "5", + "value": 5 + }, + { + "label": "6", + "value": 6 + }, + { + "label": "7", + "value": 7 + }, + { + "label": "8", + "value": 8 + }, + { + "label": "9", + "value": 9 + }, + { + "label": "10", + "value": 10 + }, + { + "label": "11", + "value": 11 + }, + { + "label": "12", + "value": 12 + }, + { + "label": "13", + "value": 13 + }, + { + "label": "14", + "value": 14 + }, + { + "label": "15", + "value": 15 + }, + { + "label": "16", + "value": 16 + }, + { + "label": "17", + "value": 17 + }, + { + "label": "18", + "value": 18 + }, + { + "label": "19", + "value": 19 + }, + { + "label": "20", + "value": 20 + }, + { + "label": "21", + "value": 21 + }, + { + "label": "22", + "value": 22 + }, + { + "label": "23", + "value": 23 + } + ], + "source": "cbpi4-system", + "type": "select", + "value": "0" + }, "BREWERY_NAME": { "description": "Brewery Name", "name": "BREWERY_NAME", @@ -80,7 +202,7 @@ "options": null, "source": "hidden", "type": "string", - "value": "4.3.2.a6" + "value": "4.4.3" }, "CSVLOGFILES": { "description": "Write sensor data to csv logfiles (enabling requires restart)", @@ -302,6 +424,14 @@ "type": "select", "value": "C" }, + "TasmotaTopic": { + "description": "Tasmota MQTT Topic", + "name": "TasmotaTopic", + "options": null, + "source": "craftbeerpi", + "type": "string", + "value": "" + }, "brewfather_api_key": { "description": "Brewfather API Key", "name": "brewfather_api_key", @@ -310,6 +440,35 @@ "type": "string", "value": "" }, + "brewfather_list_length": { + "description": "Brewfather Recipe List length", + "name": "brewfather_list_length", + "options": [ + { + "label": "5", + "value": 5 + }, + { + "label": "10", + "value": 10 + }, + { + "label": "25", + "value": 25 + }, + { + "label": "50", + "value": 50 + }, + { + "label": "100", + "value": 100 + } + ], + "source": "craftbeerpi", + "type": "select", + "value": 50 + }, "brewfather_user_id": { "description": "Brewfather User ID", "name": "brewfather_user_id", @@ -318,6 +477,14 @@ "type": "string", "value": "" }, + "cbpi4-system_update": { + "description": "cbpi4 system version update", + "name": "cbpi4-system_update", + "options": null, + "source": "hidden", + "type": "string", + "value": "0.0.9a6" + }, "current_dashboard_number": { "description": "Number of current Dashboard", "name": "current_dashboard_number", diff --git a/tests/cbpi-test-config/config.yaml b/tests/cbpi-test-config/config.yaml index f7a5abe..9e79c35 100644 --- a/tests/cbpi-test-config/config.yaml +++ b/tests/cbpi-test-config/config.yaml @@ -18,3 +18,4 @@ password: 123 plugins: - cbpi4ui +mqtt_offset: false