From 840d97c1159b09c25fce5029c17e91acf2a20308 Mon Sep 17 00:00:00 2001 From: Manuel Fritsch Date: Sat, 26 Feb 2022 22:03:38 +0100 Subject: [PATCH 01/23] lib update --- requirements.txt | 30 +++++++++++++++--------------- setup.py | 32 +++++++++++++++++--------------- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/requirements.txt b/requirements.txt index 428fcac..ca5da1d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,24 +1,24 @@ -aiohttp==3.7.4 +aiohttp==3.8.1 aiohttp-auth==0.1.1 aiohttp-route-decorator==0.1.4 aiohttp-security==0.4.0 -aiohttp-session==2.9.0 -aiohttp-swagger==1.0.15 -aiojobs==0.3.0 -aiosqlite==0.16.0 -cryptography==3.3.2 -requests==2.25.1 -voluptuous==0.12.1 +aiohttp-session==2.11.0 +aiohttp-swagger==1.0.16 +aiojobs==1.0.0 +aiosqlite==0.17.0 +cryptography==36.0.1 +requests==2.27.1 +voluptuous==0.12.2 pyfiglet==0.8.post1 -pandas==1.4.0 -shortuuid==1.0.1 -tabulate==0.8.7 -numpy==1.22.0 +pandas==1.4.1 +shortuuid==1.0.8 +tabulate==0.8.9 +numpy==1.22.2 cbpi4ui -click==7.1.2 -importlib_metadata==4.8.2 +click==8.0.4 +importlib_metadata==4.11.1 asyncio-mqtt -psutil==5.8.0 +psutil==5.9.0 zipp>=0.5 PyInquirer==1.0.3 colorama==0.4.4 \ No newline at end of file diff --git a/setup.py b/setup.py index cbce4c1..5ce1179 100644 --- a/setup.py +++ b/setup.py @@ -27,31 +27,33 @@ setup(name='cbpi', '': ['*.txt', '*.rst', '*.yaml'], 'cbpi': ['*','*.txt', '*.rst', '*.yaml']}, - python_requires='>=3', + python_requires='>=3.9', install_requires=[ - "aiohttp==3.7.4", + "aiohttp==3.8.1", "aiohttp-auth==0.1.1", "aiohttp-route-decorator==0.1.4", "aiohttp-security==0.4.0", - "aiohttp-session==2.9.0", - "aiohttp-swagger==1.0.15", - "aiojobs==0.3.0", - "aiosqlite==0.16.0", - "cryptography==3.3.2", - "requests==2.25.1", - "voluptuous==0.12.1", + "aiohttp-session==2.11.0", + "aiohttp-swagger==1.0.16", + "aiojobs==1.0.0 ", + "aiosqlite==0.17.0", + "cryptography==36.0.1", + "requests==2.27.1", + "voluptuous==0.12.2", "pyfiglet==0.8.post1", - 'click==7.1.2', - 'shortuuid==1.0.1', - 'tabulate==0.8.7', + 'click==8.0.4', + 'shortuuid==1.0.8', + 'tabulate==0.8.9', 'asyncio-mqtt', - 'psutil==5.8.0', + 'PyInquirer==1.0.3', + 'colorama==0.4.4', + 'psutil==5.9.0', 'cbpi4ui', 'importlib_metadata'] + ( ['RPi.GPIO==0.7.1'] if raspberrypi else [] ) + - (['numpy==1.22.0'] if (int(platform.python_version_tuple()[1]) >= 9) and (int(platform.python_version_tuple()[0]) == 3) else ['numpy==1.20.3'] ) + - (['pandas==1.4.0'] if (int(platform.python_version_tuple()[1]) >= 9) and (int(platform.python_version_tuple()[0]) == 3) else ['pandas==1.1.5'] ), + (['numpy==1.22.2'] if (int(platform.python_version_tuple()[1]) >= 9) and (int(platform.python_version_tuple()[0]) == 3) else ['numpy==1.20.3'] ) + + (['pandas==1.4.1'] if (int(platform.python_version_tuple()[1]) >= 9) and (int(platform.python_version_tuple()[0]) == 3) else ['pandas==1.1.5'] ), dependency_links=[ From 5bcbb7480a5e55dbc59f6e0da3eb2e8d05a0d2c5 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Tue, 1 Mar 2022 21:55:52 +0100 Subject: [PATCH 02/23] fixes for femrentersteps on controler shutdown --- cbpi/cli.py | 4 ++-- cbpi/controller/fermentation_controller.py | 17 +++++++++++++- cbpi/extension/FermentationStep/__init__.py | 25 +++++++++++---------- setup.py | 8 +++---- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/cbpi/cli.py b/cbpi/cli.py index fddd71e..850b53a 100644 --- a/cbpi/cli.py +++ b/cbpi/cli.py @@ -339,7 +339,7 @@ def create(): @click.command() @click.argument('name') def autostart(name): - '''Enable or disable autostart''' + '''(on|off|status) Enable or disable autostart''' if(name == "status"): if os.path.exists(os.path.join("/etc/systemd/system","craftbeerpi.service")) is True: print("CraftBeerPi Autostart is {}ON{}".format(Fore.LIGHTGREEN_EX,Style.RESET_ALL)) @@ -391,7 +391,7 @@ def autostart(name): @click.command() @click.argument('name') def chromium(name): - '''Enable or disable autostart''' + '''(on|off|status) Enable or disable Kiosk mode''' if(name == "status"): if os.path.exists(os.path.join("/etc/xdg/autostart/","chromium.desktop")) is True: print("CraftBeerPi Chromium Desktop is {}ON{}".format(Fore.LIGHTGREEN_EX,Style.RESET_ALL)) diff --git a/cbpi/controller/fermentation_controller.py b/cbpi/controller/fermentation_controller.py index d1ec5a2..c0134fd 100644 --- a/cbpi/controller/fermentation_controller.py +++ b/cbpi/controller/fermentation_controller.py @@ -127,6 +127,10 @@ class FermentationController: for step in fermenter.steps: try: self.logger.info("Stop {}".format(step.name)) + try: + step.instance.shutdown = True + except: + pass await step.instance.stop() except Exception as e: self.logger.error(e) @@ -136,6 +140,10 @@ class FermentationController: for step in fermenter.steps: try: self.logger.info("Stop {}".format(step.name)) + try: + step.instance.shutdown = True + except: + pass await step.instance.stop() except Exception as e: self.logger.error(e) @@ -156,6 +164,8 @@ class FermentationController: name = item.get("name") props = Props(item.get("props")) status = StepState(item.get("status", "I")) + if status == StepState.ACTIVE: + status = StepState("S") type = item.get("type") try: @@ -399,6 +409,7 @@ class FermentationController: logging.info("Restarting step {}".format(step.name)) step.status = StepState.ACTIVE self.save() + self.push_update() self.push_update("fermenterstepupdate") return @@ -411,6 +422,7 @@ class FermentationController: logging.info("Starting step {}".format(step.name)) step.status = StepState.ACTIVE self.save() + self.push_update() self.push_update("fermenterstepupdate") except Exception as e: @@ -496,7 +508,7 @@ class FermentationController: await self.start(id) else: logging.info("No Step is running") - + self.push_update() self.push_update("fermenterstepupdate") except Exception as e: @@ -511,10 +523,12 @@ class FermentationController: self.logger.info("Stopping Step {} {}".format(step.name, step.id)) try: await step.instance.stop() + await step.instance.reset() step.status = StepState.INITIAL except Exception as e: self.logger.error(e) self.save() + self.push_update() self.push_update("fermenterstepupdate") except Exception as e: @@ -533,6 +547,7 @@ class FermentationController: fermenter.steps[index], fermenter.steps[index+direction] = fermenter.steps[index+direction], fermenter.steps[index] self.save() + self.push_update() self.push_update("fermenterstepupdate") except Exception as e: diff --git a/cbpi/extension/FermentationStep/__init__.py b/cbpi/extension/FermentationStep/__init__.py index bb7b051..7660176 100644 --- a/cbpi/extension/FermentationStep/__init__.py +++ b/cbpi/extension/FermentationStep/__init__.py @@ -75,7 +75,6 @@ class FermenterTargetTempStep(CBPiFermentationStep): async def on_timer_done(self,timer): self.summary = "" - self.fermenter.target_temp = 0 await self.push_update() if self.AutoMode == True: await self.setAutoMode(False) @@ -160,23 +159,23 @@ class FermenterStep(CBPiFermentationStep): else: self.cbpi.notify(self.name, 'Timer is already running', NotificationType.WARNING) - @action("Add 5 Minutes to Timer", []) - async def add_timer(self): - if self.timer.is_running == True: - self.cbpi.notify(self.name, '5 Minutes added', NotificationType.INFO) - await self.timer.add(300) - else: - self.cbpi.notify(self.name, 'Timer must be running to add time', NotificationType.WARNING) + # @action("Add 1 Day to Timer", []) + # async def add_timer(self): + # if self.timer.is_running == True: + # self.cbpi.notify(self.name, '5 Minutes added', NotificationType.INFO) + # await self.timer.add(300) + # else: + # self.cbpi.notify(self.name, 'Timer must be running to add time', NotificationType.WARNING) async def on_timer_done(self,timer): self.summary = "" - self.fermenter.target_temp = 0 if self.AutoMode == True: await self.setAutoMode(False) self.cbpi.notify(self.name, 'Step finished', NotificationType.SUCCESS) - await self.next(self.fermenter.id) - return StepResult.DONE + if self.shutdown != True: + await self.next(self.fermenter.id) + return StepResult.DONE async def on_timer_update(self,timer, seconds): @@ -184,6 +183,7 @@ class FermenterStep(CBPiFermentationStep): await self.push_update() async def on_start(self): + self.shutdown = False timeD=int(self.props.get("TimerD", 0)) timeH=int(self.props.get("TimerH", 0)) timeM=int(self.props.get("TimerM", 0)) @@ -218,6 +218,7 @@ class FermenterStep(CBPiFermentationStep): async def reset(self): self.timer = Timer(self.fermentationtime ,on_update=self.on_timer_update, on_done=self.on_timer_done) + self.timer.is_running == False async def run(self): if self.fermenter.target_temp >= self.starttemp: @@ -304,4 +305,4 @@ def setup(cbpi): cbpi.plugin.register("FermenterNotificationStep", FermenterNotificationStep) cbpi.plugin.register("FermenterTargetTempStep", FermenterTargetTempStep) cbpi.plugin.register("FermenterStep", FermenterStep) - cbpi.plugin.register("FermenterWaitStep", FermenterWaitStep) \ No newline at end of file + #cbpi.plugin.register("FermenterWaitStep", FermenterWaitStep) \ No newline at end of file diff --git a/setup.py b/setup.py index 5ce1179..82c23a0 100644 --- a/setup.py +++ b/setup.py @@ -30,13 +30,13 @@ setup(name='cbpi', python_requires='>=3.9', install_requires=[ - "aiohttp==3.8.1", + "aiohttp==3.7.4", "aiohttp-auth==0.1.1", "aiohttp-route-decorator==0.1.4", "aiohttp-security==0.4.0", - "aiohttp-session==2.11.0", - "aiohttp-swagger==1.0.16", - "aiojobs==1.0.0 ", + "aiohttp-session==2.9.0", + "aiohttp-swagger==1.0.15", + "aiojobs==0.3.0 ", "aiosqlite==0.17.0", "cryptography==36.0.1", "requests==2.27.1", From 1d3298fc60d3113eda5a614ad63c8f98a5c38dcb Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Wed, 2 Mar 2022 07:53:43 +0100 Subject: [PATCH 03/23] autostart active fermenterstep with remaining time --- cbpi/api/dataclasses.py | 5 ++-- cbpi/api/step.py | 6 +++- cbpi/controller/fermentation_controller.py | 28 +++++++++++++---- cbpi/extension/FermentationStep/__init__.py | 30 ++++++++++++++++--- .../extension/FermenterHysteresis/__init__.py | 2 +- cbpi/http_endpoints/http_fermentation.py | 2 +- 6 files changed, 58 insertions(+), 15 deletions(-) diff --git a/cbpi/api/dataclasses.py b/cbpi/api/dataclasses.py index 2cb1477..ffb6963 100644 --- a/cbpi/api/dataclasses.py +++ b/cbpi/api/dataclasses.py @@ -162,8 +162,7 @@ class FermenterStep: props: Props = Props() type: str = None status: StepState = StepState.INITIAL - #Add end data as unixtime to setp when active - #step_end: float = 0 + endtime: int = 0 # endtime if step is active and timer is running instance: str = None step: dict = None @@ -171,7 +170,7 @@ class FermenterStep: return "name={} props={}, type={}, instance={}".format(self.name, self.props, self.type, self.instance) def to_dict(self): msg = self.instance.summary if self.instance is not None else "" - return dict(id=self.id, name=self.name, state_text=msg, type=self.type, status=self.status.value, props=self.props.to_dict()) + return dict(id=self.id, name=self.name, state_text=msg, type=self.type, status=self.status.value, endtime=self.endtime, props=self.props.to_dict()) diff --git a/cbpi/api/step.py b/cbpi/api/step.py index e14e292..a9d6d19 100644 --- a/cbpi/api/step.py +++ b/cbpi/api/step.py @@ -136,6 +136,7 @@ class CBPiFermentationStep(CBPiBase): self.timer = None self._done_callback = on_done self.props = props + self.endtime = int(step.get("endtime")) self.cancel_reason: StepResult = None self.summary = "" self.task = None @@ -187,8 +188,11 @@ class CBPiFermentationStep(CBPiBase): async def on_props_update(self, props): self.props = {**self.props, **props} + async def update_endtime(self): + await self.cbpi.fermenter.update_endtime(self.fermenter.id, self.id, self.endtime) + async def save_props(self): - await self.cbpi.step.save() + self.cbpi.fermenter.save() async def push_update(self): self.cbpi.fermenter.push_update(self.update_key) diff --git a/cbpi/controller/fermentation_controller.py b/cbpi/controller/fermentation_controller.py index c0134fd..5a8d294 100644 --- a/cbpi/controller/fermentation_controller.py +++ b/cbpi/controller/fermentation_controller.py @@ -163,6 +163,11 @@ class FermentationController: id = item.get("id") name = item.get("name") props = Props(item.get("props")) + try: + endtime = int(item.get("endtime", 0)) + except: + endtime=0 + status = StepState(item.get("status", "I")) if status == StepState.ACTIVE: status = StepState("S") @@ -176,7 +181,7 @@ class FermentationController: logging.warning("Failed to create step instance %s - %s" % (id, e)) instance = None - step = FermenterStep(id=id, name=name, fermenter=fermenter, props=props, type=type, status=status, instance=instance) + step = FermenterStep(id=id, name=name, fermenter=fermenter, props=props, type=type, status=status, endtime=endtime, instance=instance) return step def _done(self, step_instance, result, fermenter): @@ -345,21 +350,22 @@ class FermentationController: props = item.get("props") status = StepState("I") type = item.get("type") - #logging.info(type) + endtime = 0 name = item.get("name") props = Props(item.get("props")) logging.info("update step") try: type_cfg = self.steptypes.get(type) - #logging.info(type_cfg) + logging.info(type_cfg) clazz = type_cfg.get("class") - #logging.info(clazz) + logging.info(clazz) instance = clazz(self.cbpi, fermenter, item, props, self._done) + logging.info(instance) except Exception as e: logging.warning("Failed to create step instance %s - %s " % (item.id, e)) instance = None - step = FermenterStep(id=stepid, name=name, fermenter=fermenter, props=props, type=type, status=status, instance=instance) + step = FermenterStep(id=stepid, name=name, fermenter=fermenter, props=props, type=type, status=status, endtime=endtime, instance=instance) #logging.info(step) #logging.info(fermenter.steps) try: @@ -386,6 +392,15 @@ class FermentationController: self.save() self.push_update("fermenterstepupdate") + async def update_endtime(self, id, stepid, endtime): + try: + item = self._find_by_id(id) + step = self._find_step_by_id(item.steps, stepid) + step.endtime = int(endtime) + self.save() + self.push_update("fermenterstepupdate") + except Exception as e: + self.logger.error(e) def _find_by_status(self, data, status): return next((item for item in data if item.status == status), None) @@ -405,6 +420,7 @@ class FermentationController: step = self._find_by_status(item.steps, StepState.STOP) if step is not None: + endtime = step.endtime await step.instance.start() logging.info("Restarting step {}".format(step.name)) step.status = StepState.ACTIVE @@ -418,6 +434,7 @@ class FermentationController: if step is None: self.logger.info("No futher step to start") else: + step.instance.endtime = 0 await step.instance.start() logging.info("Starting step {}".format(step.name)) step.status = StepState.ACTIVE @@ -525,6 +542,7 @@ class FermentationController: await step.instance.stop() await step.instance.reset() step.status = StepState.INITIAL + step.endtime = 0 except Exception as e: self.logger.error(e) self.save() diff --git a/cbpi/extension/FermentationStep/__init__.py b/cbpi/extension/FermentationStep/__init__.py index 7660176..130604c 100644 --- a/cbpi/extension/FermentationStep/__init__.py +++ b/cbpi/extension/FermentationStep/__init__.py @@ -154,6 +154,8 @@ class FermenterStep(CBPiFermentationStep): self.cbpi.notify(self.name, 'Timer started', NotificationType.INFO) self.timer.start() self.timer.is_running = True + self.endtime = time.time() + self.fermentationtime + await self.update_endtime() estimated_completion_time = datetime.fromtimestamp(time.time()+ self.fermentationtime) self.cbpi.notify(self.name, 'Timer started. Estimated completion: {}'.format(estimated_completion_time.strftime("%d.%m, %H:%M")), NotificationType.INFO) else: @@ -184,10 +186,13 @@ class FermenterStep(CBPiFermentationStep): async def on_start(self): self.shutdown = False - timeD=int(self.props.get("TimerD", 0)) - timeH=int(self.props.get("TimerH", 0)) - timeM=int(self.props.get("TimerM", 0)) - self.fermentationtime=(timeM+(60*timeH)+(1440*timeD)) *60 + if self.endtime == 0: + timeD=int(self.props.get("TimerD", 0)) + timeH=int(self.props.get("TimerH", 0)) + timeM=int(self.props.get("TimerM", 0)) + self.fermentationtime=(timeM+(60*timeH)+(1440*timeD)) *60 + else: + self.fermentationtime = self.endtime - time.time() self.AutoMode = True if self.props.get("AutoMode", "No") == "Yes" else False self.starttemp= self.get_sensor_value(self.props.get("Sensor", None)).get("value") @@ -203,9 +208,16 @@ class FermenterStep(CBPiFermentationStep): try: if self.timer.is_running == True: self.timer.start() + self.endtime = time.time() + self.fermentationtime + await self.update_endtime() except: pass + if self.endtime != 0 and self.timer is not None and self.timer.is_running == False: + self.timer.start() + self.timer.is_running = True + + self.summary = "Waiting for Target Temp" await self.push_update() @@ -217,7 +229,13 @@ class FermenterStep(CBPiFermentationStep): await self.push_update() async def reset(self): + #await self.timer.stop() + timeD=int(self.props.get("TimerD", 0)) + timeH=int(self.props.get("TimerH", 0)) + timeM=int(self.props.get("TimerM", 0)) + self.fermentationtime=(timeM+(60*timeH)+(1440*timeD)) *60 self.timer = Timer(self.fermentationtime ,on_update=self.on_timer_update, on_done=self.on_timer_done) + self.endtime = 0 self.timer.is_running == False async def run(self): @@ -229,6 +247,8 @@ class FermenterStep(CBPiFermentationStep): if sensor_value >= self.fermenter.target_temp and self.timer.is_running is not True: self.timer.start() self.timer.is_running = True + self.endtime = time.time() + self.fermentationtime + await self.update_endtime() estimated_completion_time = datetime.fromtimestamp(time.time()+ self.fermentationtime) self.cbpi.notify(self.name, 'Timer started. Estimated completion: {}'.format(estimated_completion_time.strftime("%d.%m, %H:%M")), NotificationType.INFO) elif self.fermenter.target_temp <= self.starttemp: @@ -239,6 +259,8 @@ class FermenterStep(CBPiFermentationStep): if sensor_value <= self.fermenter.target_temp and self.timer.is_running is not True: self.timer.start() self.timer.is_running = True + self.endtime = time.time() + self.fermentationtime + await self.update_endtime() estimated_completion_time = datetime.fromtimestamp(time.time()+ self.fermentationtime) self.cbpi.notify(self.name, 'Timer started. Estimated completion: {}'.format(estimated_completion_time.strftime("%d.%m, %H:%M")), NotificationType.INFO) diff --git a/cbpi/extension/FermenterHysteresis/__init__.py b/cbpi/extension/FermenterHysteresis/__init__.py index 4ed1561..5be707c 100644 --- a/cbpi/extension/FermenterHysteresis/__init__.py +++ b/cbpi/extension/FermenterHysteresis/__init__.py @@ -32,7 +32,7 @@ class FermenterAutostart(CBPiExtension): self.fermenter=self.cbpi.fermenter._find_by_id(fermenter_id) try: if (self.fermenter.instance is None or self.fermenter.instance.state == False): - await self.cbpi.fermenter.toggle(self.fermenter.id) + await self.cbpi.fermenter.start(self.fermenter.id) logging.info("Successfully switched on Ferenterlogic for Fermenter {}".format(self.fermenter.id)) except Exception as e: logging.error("Failed to switch on FermenterLogic {} {}".format(self.fermenter.id, e)) diff --git a/cbpi/http_endpoints/http_fermentation.py b/cbpi/http_endpoints/http_fermentation.py index 1eec644..945743c 100644 --- a/cbpi/http_endpoints/http_fermentation.py +++ b/cbpi/http_endpoints/http_fermentation.py @@ -352,7 +352,7 @@ class FermentationHttpEndpoints(): data = await request.json() stepid = request.match_info['stepid'] fermenterid = request.match_info['fermenterid'] - updatedstep = {"id": stepid, "name": data.get("name"), "props": data.get("props", {}), "type": data.get("type")} + updatedstep = {"id": stepid, "name": data.get("name"), "endtime": 0, "props": data.get("props", {}), "type": data.get("type")} #step = FermenterStep(stepid, data.get("name"), None, Props(data.get("props", {})), data.get("type")) await self.controller.update_step(fermenterid,updatedstep) return web.Response(status=200) From 3cf48fff04866bcd980282efe0be78c1294c0822 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Wed, 2 Mar 2022 10:29:21 +0100 Subject: [PATCH 04/23] fix to start timer directly after restart on step with remaining time --- cbpi/__init__.py | 2 +- cbpi/extension/FermentationStep/__init__.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 942c934..d719dda 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.2.0.a3" +__version__ = "4.0.2.0.a9" diff --git a/cbpi/extension/FermentationStep/__init__.py b/cbpi/extension/FermentationStep/__init__.py index 130604c..cf0c552 100644 --- a/cbpi/extension/FermentationStep/__init__.py +++ b/cbpi/extension/FermentationStep/__init__.py @@ -204,6 +204,7 @@ class FermenterStep(CBPiFermentationStep): if self.fermenter is not None and self.timer is None: self.timer = Timer(self.fermentationtime ,on_update=self.on_timer_update, on_done=self.on_timer_done) + self.timer.is_running = False elif self.fermenter is not None: try: if self.timer.is_running == True: From 662e8b4497947fe0ed1d7847ce5f28c3317beafd Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Wed, 2 Mar 2022 12:35:16 +0100 Subject: [PATCH 05/23] updated libs and fix eventloop from lib_update branch --- cbpi/__init__.py | 2 +- cbpi/controller/basic_controller2.py | 5 +++-- cbpi/controller/fermentation_controller.py | 5 +++-- cbpi/controller/step_controller.py | 7 ++++--- cbpi/extension/FermentationStep/__init__.py | 2 ++ setup.py | 8 ++++---- 6 files changed, 17 insertions(+), 12 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index d719dda..d10ec7f 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.2.0.a9" +__version__ = "4.0.2.0.a10" diff --git a/cbpi/controller/basic_controller2.py b/cbpi/controller/basic_controller2.py index 53c3445..990f54e 100644 --- a/cbpi/controller/basic_controller2.py +++ b/cbpi/controller/basic_controller2.py @@ -22,7 +22,7 @@ class BasicController: self.logger = logging.getLogger(__name__) self.data = [] self.autostart = True - self._loop = asyncio.get_event_loop() + #self._loop = asyncio.get_event_loop() self.path = os.path.join(".", 'config', file) self.cbpi.app.on_cleanup.append(self.shutdown) @@ -100,7 +100,8 @@ class BasicController: await item.instance.start() item.instance.running = True - item.instance.task = self._loop.create_task(item.instance._run()) + item.instance.task = asyncio.get_event_loop().create_task(item.instance._run()) + #item.instance.task = self._loop.create_task(item.instance._run()) logging.info("{} started {}".format(self.name, id)) diff --git a/cbpi/controller/fermentation_controller.py b/cbpi/controller/fermentation_controller.py index 5a8d294..c70ab63 100644 --- a/cbpi/controller/fermentation_controller.py +++ b/cbpi/controller/fermentation_controller.py @@ -95,7 +95,7 @@ class FermentationController: self.cbpi = cbpi self.logger = logging.getLogger(__name__) self.path = os.path.join(".", 'config', "fermenter_data.json") - self._loop = asyncio.get_event_loop() + #self._loop = asyncio.get_event_loop() self.data = [] self.types = {} self.steptypes = {} @@ -480,7 +480,8 @@ class FermentationController: await item.instance.start() item.instance.running = True - item.instance.task = self._loop.create_task(item.instance._run()) + item.instance.task = asyncio.get_event_loop().create_task(item.instance._run()) + #item.instance.task = self._loop.create_task(item.instance._run()) logging.info("{} started {}".format(item.name, id)) diff --git a/cbpi/controller/step_controller.py b/cbpi/controller/step_controller.py index 434e799..6632982 100644 --- a/cbpi/controller/step_controller.py +++ b/cbpi/controller/step_controller.py @@ -20,7 +20,7 @@ class StepController: self.cbpi = cbpi self.logger = logging.getLogger(__name__) self.path = os.path.join(".", 'config', "step_data.json") - self._loop = asyncio.get_event_loop() + #self._loop = asyncio.get_event_loop() self.basic_data = {} self.step = None self.types = {} @@ -68,8 +68,9 @@ class StepController: self.profile = list(map(lambda item: self.create(item), self.profile)) if startActive is True: active_step = self.find_by_status("A") - if active_step is not None: - self._loop.create_task(self.start_step(active_step)) + if active_step is not None: + asyncio.get_event_loop().create_task(self.start_step(active_step)) + #self._loop.create_task(self.start_step(active_step)) async def add(self, item: Step): logging.debug("Add step") diff --git a/cbpi/extension/FermentationStep/__init__.py b/cbpi/extension/FermentationStep/__init__.py index cf0c552..9f254f9 100644 --- a/cbpi/extension/FermentationStep/__init__.py +++ b/cbpi/extension/FermentationStep/__init__.py @@ -217,6 +217,8 @@ class FermenterStep(CBPiFermentationStep): if self.endtime != 0 and self.timer is not None and self.timer.is_running == False: self.timer.start() self.timer.is_running = True + estimated_completion_time = datetime.fromtimestamp(time.time()+ self.fermentationtime) + self.cbpi.notify(self.name, 'Timer restarted. Estimated completion: {}'.format(estimated_completion_time.strftime("%d.%m, %H:%M")), NotificationType.INFO) self.summary = "Waiting for Target Temp" diff --git a/setup.py b/setup.py index 82c23a0..5ce1179 100644 --- a/setup.py +++ b/setup.py @@ -30,13 +30,13 @@ setup(name='cbpi', python_requires='>=3.9', install_requires=[ - "aiohttp==3.7.4", + "aiohttp==3.8.1", "aiohttp-auth==0.1.1", "aiohttp-route-decorator==0.1.4", "aiohttp-security==0.4.0", - "aiohttp-session==2.9.0", - "aiohttp-swagger==1.0.15", - "aiojobs==0.3.0 ", + "aiohttp-session==2.11.0", + "aiohttp-swagger==1.0.16", + "aiojobs==1.0.0 ", "aiosqlite==0.17.0", "cryptography==36.0.1", "requests==2.27.1", From b84e33822b378159440f2c43965f785b08015b2c Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Wed, 2 Mar 2022 17:25:59 +0100 Subject: [PATCH 06/23] added shutdown flag to all steps for on_timer_done --- cbpi/extension/FermentationStep/__init__.py | 71 ++++++--------------- 1 file changed, 19 insertions(+), 52 deletions(-) diff --git a/cbpi/extension/FermentationStep/__init__.py b/cbpi/extension/FermentationStep/__init__.py index 9f254f9..f63fb9d 100644 --- a/cbpi/extension/FermentationStep/__init__.py +++ b/cbpi/extension/FermentationStep/__init__.py @@ -32,8 +32,9 @@ class FermenterNotificationStep(CBPiFermentationStep): if self.AutoNext == True: self.cbpi.notify(self.name, self.props.get("Notification",""), NotificationType.INFO) - await self.next(self.fermenter.id) - return StepResult.DONE + if self.shutdown != True: + await self.next(self.fermenter.id) + return StepResult.DONE else: self.cbpi.notify(self.name, self.props.get("Notification",""), NotificationType.INFO, action=[NotificationAction("Next Step", self.NextStep)]) await self.push_update() @@ -42,6 +43,7 @@ class FermenterNotificationStep(CBPiFermentationStep): await self.push_update() async def on_start(self): + self.shutdown = False self.summary="" self.AutoNext = False if self.props.get("AutoNext", "No") == "No" else True if self.timer is None: @@ -69,10 +71,10 @@ class FermenterNotificationStep(CBPiFermentationStep): class FermenterTargetTempStep(CBPiFermentationStep): async def NextStep(self, **kwargs): - await self.next(self.fermenter.id) - return StepResult.DONE + if self.shutdown != True: + await self.next(self.fermenter.id) + return StepResult.DONE - async def on_timer_done(self,timer): self.summary = "" await self.push_update() @@ -87,6 +89,7 @@ class FermenterTargetTempStep(CBPiFermentationStep): await self.push_update() async def on_start(self): + self.shutdown = False self.AutoMode = True if self.props.get("AutoMode","No") == "Yes" else False self.starttemp= self.get_sensor_value(self.props.get("Sensor", None)).get("value") if self.fermenter is not None: @@ -127,6 +130,7 @@ class FermenterTargetTempStep(CBPiFermentationStep): async def reset(self): self.timer = Timer(1 ,on_update=self.on_timer_update, on_done=self.on_timer_done) + self.timer.is_running == False async def setAutoMode(self, auto_state): try: @@ -161,13 +165,15 @@ class FermenterStep(CBPiFermentationStep): else: self.cbpi.notify(self.name, 'Timer is already running', NotificationType.WARNING) - # @action("Add 1 Day to Timer", []) - # async def add_timer(self): - # if self.timer.is_running == True: - # self.cbpi.notify(self.name, '5 Minutes added', NotificationType.INFO) - # await self.timer.add(300) - # else: - # self.cbpi.notify(self.name, 'Timer must be running to add time', NotificationType.WARNING) +# @action("Add 1 Day to Timer", []) +# async def add_timer(self): +# if self.timer.is_running == True: +# self.cbpi.notify(self.name, '1 Day added', NotificationType.INFO) +# await self.timer.add(86400) +# self.endtime = self.endtime +86400 +# await self.update_endtime() +# else: +# self.cbpi.notify(self.name, 'Timer must be running to add time', NotificationType.WARNING) async def on_timer_done(self,timer): @@ -232,7 +238,6 @@ class FermenterStep(CBPiFermentationStep): await self.push_update() async def reset(self): - #await self.timer.stop() timeD=int(self.props.get("TimerD", 0)) timeH=int(self.props.get("TimerH", 0)) timeM=int(self.props.get("TimerM", 0)) @@ -280,43 +285,6 @@ class FermenterStep(CBPiFermentationStep): except Exception as e: logging.error("Failed to switch on FermenterLogic {} {}".format(self.fermenter.id, e)) -@parameters([Property.Number(label="TimerD", description="Timer Days", configurable=True), - Property.Number(label="TimerH", description="Timer Hours", configurable=True), - Property.Number(label="TimerM", description="Timer Minutes", configurable=True) - ]) -class FermenterWaitStep(CBPiFermentationStep): - - async def on_timer_done(self, timer): - self.summary = "" - await self.next(self.fermenter.id) - return StepResult.DONE - - async def on_timer_update(self, timer, seconds): - self.summary = Timer.format_time(seconds) - await self.push_update() - - async def on_start(self): - timeD=int(self.props.get("TimerD", 0)) - timeH=int(self.props.get("TimerH", 0)) - timeM=int(self.props.get("TimerM", 0)) - self.fermentationtime=(timeM+(60*timeH)+(1440*timeD)) *60 - - if self.timer is None: - self.timer = Timer(self.fermentationtime, on_update=self.on_timer_update, on_done=self.on_timer_done) - self.timer.start() - - async def on_stop(self): - await self.timer.stop() - self.summary = "" - await self.push_update() - - async def reset(self): - self.timer = Timer(self.fermentationtime, on_update=self.on_timer_update, on_done=self.on_timer_done) - - async def run(self): - while self.running == True: - await asyncio.sleep(1) - return StepResult.DONE def setup(cbpi): ''' @@ -329,5 +297,4 @@ def setup(cbpi): cbpi.plugin.register("FermenterNotificationStep", FermenterNotificationStep) cbpi.plugin.register("FermenterTargetTempStep", FermenterTargetTempStep) - cbpi.plugin.register("FermenterStep", FermenterStep) - #cbpi.plugin.register("FermenterWaitStep", FermenterWaitStep) \ No newline at end of file + cbpi.plugin.register("FermenterStep", FermenterStep) \ No newline at end of file From a16c14feca1a9b51a7a901ccbcd0c448b6c602c9 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Wed, 2 Mar 2022 19:40:22 +0100 Subject: [PATCH 07/23] fix for loading fermenterrecipes from recipe book -> add endtime = 0 --- cbpi/__init__.py | 2 +- cbpi/controller/fermentation_controller.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index d10ec7f..4ac905a 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.2.0.a10" +__version__ = "4.0.2.0.a11" diff --git a/cbpi/controller/fermentation_controller.py b/cbpi/controller/fermentation_controller.py index c70ab63..5f02a05 100644 --- a/cbpi/controller/fermentation_controller.py +++ b/cbpi/controller/fermentation_controller.py @@ -625,6 +625,7 @@ class FermentationController: fermenter = self._find_by_id(fermenterid) def add_runtime_data(item): item["status"] = "I" + item["endtime"] = 0 item["id"] = shortuuid.uuid() item["props"]["Sensor"] = fermenter.sensor list(map(lambda item: add_runtime_data(item), data.get("steps"))) From db4e75525fd8e9d2614c67f91df89faa9a758d2d Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Fri, 4 Mar 2022 16:36:50 +0100 Subject: [PATCH 08/23] check if server is running under windows to fix issue with mqtt under win and python 3.9 --- cbpi/__init__.py | 2 +- cbpi/craftbeerpi.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 4ac905a..2903a50 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.2.0.a11" +__version__ = "4.0.2.0.a12" diff --git a/cbpi/craftbeerpi.py b/cbpi/craftbeerpi.py index fbbde3f..10dee52 100644 --- a/cbpi/craftbeerpi.py +++ b/cbpi/craftbeerpi.py @@ -1,5 +1,7 @@ import asyncio +import sys +from asyncio import set_event_loop_policy, WindowsSelectorEventLoopPolicy import json from voluptuous.schema_builder import message from cbpi.api.dataclasses import NotificationType @@ -82,6 +84,11 @@ async def error_middleware(request, handler): class CraftBeerPi: def __init__(self): + + operationsystem= sys.platform + if operationsystem.startswith('win'): + set_event_loop_policy(WindowsSelectorEventLoopPolicy()) + self.path = os.sep.join(os.path.abspath(__file__).split(os.sep)[:-1]) # The path to the package dir self.version = __version__ From b1dc05b2095141dc0823beedae00a1f21f96d9ec Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Fri, 4 Mar 2022 16:52:16 +0100 Subject: [PATCH 09/23] feasibility to update fermentersteps (not reqwuired yet) --- cbpi/controller/fermentation_controller.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cbpi/controller/fermentation_controller.py b/cbpi/controller/fermentation_controller.py index 5f02a05..1806518 100644 --- a/cbpi/controller/fermentation_controller.py +++ b/cbpi/controller/fermentation_controller.py @@ -585,6 +585,11 @@ class FermentationController: #logging.info("FERMENTERSTEPUPDATE {}".format(key)) fermentersteps=self.get_fermenter_steps() self.cbpi.ws.send(dict(topic=key, data=fermentersteps)) + + #not yet required and too much mqtt traffic for all steps + #for fermenter in fermentersteps: + # for step in fermenter['steps']: + # self.cbpi.push_update("cbpi/{}/{}/{}".format(key,fermenter['id'],step['id']), step) async def call_action(self, id, action, parameter) -> None: logging.info("FermenterStep Controller - call Action {} {}".format(id, action)) From 2370b6d124f894c96c2b912879128bfddefeae69 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Fri, 4 Mar 2022 17:45:28 +0100 Subject: [PATCH 10/23] WindowsSelectorEventLoopPolicy import caused error under linux -> try to import --- cbpi/craftbeerpi.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cbpi/craftbeerpi.py b/cbpi/craftbeerpi.py index 10dee52..45e54ac 100644 --- a/cbpi/craftbeerpi.py +++ b/cbpi/craftbeerpi.py @@ -1,7 +1,10 @@ import asyncio import sys -from asyncio import set_event_loop_policy, WindowsSelectorEventLoopPolicy +try: + from asyncio import set_event_loop_policy, WindowsSelectorEventLoopPolicy +except ImportError: + pass import json from voluptuous.schema_builder import message from cbpi.api.dataclasses import NotificationType From bce0a0025b0f9cd91cf2f5b2edbf703124645c1b Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Sat, 5 Mar 2022 11:02:49 +0100 Subject: [PATCH 11/23] cleanup in fermentation controller and setup.py --- cbpi/__init__.py | 2 +- cbpi/controller/fermentation_controller.py | 106 +++------------------ cbpi/extension/gpioactor/__init__.py | 2 +- setup.py | 9 +- 4 files changed, 18 insertions(+), 101 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 2903a50..9fcb99b 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.2.0.a12" +__version__ = "4.0.2.0.a13" diff --git a/cbpi/controller/fermentation_controller.py b/cbpi/controller/fermentation_controller.py index 1806518..528a1c6 100644 --- a/cbpi/controller/fermentation_controller.py +++ b/cbpi/controller/fermentation_controller.py @@ -15,79 +15,7 @@ from cbpi.controller.basic_controller2 import BasicController from tabulate import tabulate import sys, os from ..api.step import CBPiStep, StepMove, StepResult, StepState, CBPiFermentationStep - - - -class FermentStep: - - def __init__(self, cbpi, step, on_done) -> None: - self.cbpi = cbpi - self.logger = logging.getLogger(__name__) - self.step = step - self.props = step.props - self._done_callback = on_done - self.task = None - self.summary = "" - - def _done(self, task): - if self._done_callback is not None: - try: - result = task.result() - self._done_callback(self, result) - except Exception as e: - self.logger.error(e) - - @abstractmethod - async def run(self): - while self.running: - logging.info(self.step) - await asyncio.sleep(1) - pass - - async def _run(self): - try: - await self.step.instance.on_start() - await self.step.instance.run() - #await self.on_start() - #await self.run() - self.cancel_reason = StepResult.DONE - except asyncio.CancelledError as e: - pass - finally: - await self.on_stop() - - return self.cancel_reason - - async def start(self): - self.logger.info("Start {}".format(self.step.name)) - self.running = True - self.task = asyncio.create_task(self._run()) - self.task.add_done_callback(self._done) - - async def next(self): - self.running = False - self.cancel_reason = StepResult.NEXT - self.task.cancel() - await self.task - - async def stop(self): - try: - self.running = False - if self.task is not None and self.task.done() is False: - self.logger.info("Stopping Task") - self.cancel_reason = StepResult.STOP - self.task.cancel() - await self.task - except Exception as e: - self.logger.error(e) - - async def on_start(self): - #self.props.hello = "WOOHOo" - pass - - async def on_stop(self): - pass - + class FermentationController: def __init__(self, cbpi): @@ -95,7 +23,6 @@ class FermentationController: self.cbpi = cbpi self.logger = logging.getLogger(__name__) self.path = os.path.join(".", 'config', "fermenter_data.json") - #self._loop = asyncio.get_event_loop() self.data = [] self.types = {} self.steptypes = {} @@ -150,9 +77,6 @@ class FermentationController: async def load(self): -# if os.path.exists(self.path) is False: -# with open(self.path, "w") as file: -# json.dump(dict(basic={}, steps=[]), file, indent=4, sort_keys=True) with open(self.path) as json_file: data = json.load(json_file) @@ -230,7 +154,6 @@ class FermentationController: def get_state(self): if self.data == []: - #logging.info(self.data) pass return {"data": list(map(lambda x: x.to_dict(), self.data)), "types":self.get_types(), "steptypes":self.get_steptypes()} @@ -247,7 +170,6 @@ class FermentationController: def get_fermenter_steps(self): if self.data == []: - #logging.info(self.data) pass fermentersteps=[] steplist=list(map(lambda x: x.to_dict(), self.data)) @@ -366,15 +288,13 @@ class FermentationController: logging.warning("Failed to create step instance %s - %s " % (item.id, e)) instance = None step = FermenterStep(id=stepid, name=name, fermenter=fermenter, props=props, type=type, status=status, endtime=endtime, instance=instance) - #logging.info(step) - #logging.info(fermenter.steps) + try: fermenter.steps = list(map(lambda old: step if old.id == step.id else old, fermenter.steps)) except Exception as e: logging.info(e) - #logging.info(fermenter.steps) + self.save() - #logging.info("SAVEUPDATE") self.push_update("fermenterstepupdate") @@ -481,7 +401,7 @@ class FermentationController: await item.instance.start() item.instance.running = True item.instance.task = asyncio.get_event_loop().create_task(item.instance._run()) - #item.instance.task = self._loop.create_task(item.instance._run()) + logging.info("{} started {}".format(item.name, id)) @@ -576,20 +496,19 @@ class FermentationController: if key == self.update_key: self.cbpi.ws.send(dict(topic=key, data=list(map(lambda item: item.to_dict(), self.data)))) - #self.cbpi.push_update("cbpi/{}".format(self.update_key), list(map(lambda item: item.to_dict(), self.data))) - + for item in self.data: self.cbpi.push_update("cbpi/{}/{}".format(self.update_key,item.id), item.to_dict()) pass else: - #logging.info("FERMENTERSTEPUPDATE {}".format(key)) fermentersteps=self.get_fermenter_steps() self.cbpi.ws.send(dict(topic=key, data=fermentersteps)) - #not yet required and too much mqtt traffic for all steps - #for fermenter in fermentersteps: - # for step in fermenter['steps']: - # self.cbpi.push_update("cbpi/{}/{}/{}".format(key,fermenter['id'],step['id']), step) + # send mqtt update for active femrentersteps + for fermenter in fermentersteps: + for step in fermenter['steps']: + if step['status'] == 'A': + self.cbpi.push_update("cbpi/{}/{}/{}".format(key,fermenter['id'],step['id']), step) async def call_action(self, id, action, parameter) -> None: logging.info("FermenterStep Controller - call Action {} {}".format(id, action)) @@ -599,8 +518,7 @@ class FermentationController: await item.instance.__getattribute__(action)(**parameter) except Exception as e: logging.error("FermenterStep Controller - Failed to call action on {} {} {}".format(id, action, e)) - - # todo: Sensors may need to be removed when saving the recipe -> need to be replaced when assinging later to Fermenter with 'fermenter.sensor' + async def savetobook(self, fermenterid): name = shortuuid.uuid() path = os.path.join(".", 'config', "fermenterrecipes", "{}.yaml".format(name)) @@ -608,7 +526,7 @@ class FermentationController: try: brewname = fermenter.brewname description = fermenter.description - # todo add escription at later point of time, once description has been added to fermenter dataclass + except: brewname = "" description = "" diff --git a/cbpi/extension/gpioactor/__init__.py b/cbpi/extension/gpioactor/__init__.py index 1687482..93141e9 100644 --- a/cbpi/extension/gpioactor/__init__.py +++ b/cbpi/extension/gpioactor/__init__.py @@ -10,7 +10,7 @@ logger = logging.getLogger(__name__) try: import RPi.GPIO as GPIO except Exception: - logger.error("Failed to load RPi.GPIO. Using Mock") + logger.warning("Failed to load RPi.GPIO. Using Mock instead") MockRPi = MagicMock() modules = { "RPi": MockRPi, diff --git a/setup.py b/setup.py index 5ce1179..944575f 100644 --- a/setup.py +++ b/setup.py @@ -50,11 +50,10 @@ setup(name='cbpi', 'colorama==0.4.4', 'psutil==5.9.0', 'cbpi4ui', - 'importlib_metadata'] + ( - ['RPi.GPIO==0.7.1'] if raspberrypi else [] ) + - (['numpy==1.22.2'] if (int(platform.python_version_tuple()[1]) >= 9) and (int(platform.python_version_tuple()[0]) == 3) else ['numpy==1.20.3'] ) + - (['pandas==1.4.1'] if (int(platform.python_version_tuple()[1]) >= 9) and (int(platform.python_version_tuple()[0]) == 3) else ['pandas==1.1.5'] ), - + 'importlib_metadata', + 'numpy==1.22.2', + 'pandas==1.4.1'] + ( + ['RPi.GPIO==0.7.1'] if raspberrypi else [] ), dependency_links=[ 'https://testpypi.python.org/pypi', From a136f6b4674304f8e3f28e45567170c7452b8493 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Sat, 5 Mar 2022 11:29:33 +0100 Subject: [PATCH 12/23] set default for mqtt sensor to 999 and add check to fermentersteps target temp step --- cbpi/__init__.py | 2 +- cbpi/extension/FermentationStep/__init__.py | 4 ++-- cbpi/extension/mqtt_sensor/__init__.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 9fcb99b..d66daf9 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.2.0.a13" +__version__ = "4.0.2.0.a14" diff --git a/cbpi/extension/FermentationStep/__init__.py b/cbpi/extension/FermentationStep/__init__.py index f63fb9d..442c84b 100644 --- a/cbpi/extension/FermentationStep/__init__.py +++ b/cbpi/extension/FermentationStep/__init__.py @@ -113,7 +113,7 @@ class FermenterTargetTempStep(CBPiFermentationStep): logging.info("warmup") while self.running == True: sensor_value = self.get_sensor_value(self.props.get("Sensor", None)).get("value") - if sensor_value >= self.fermenter.target_temp and self.timer.is_running is not True: + if sensor_value < 900 and sensor_value >= self.fermenter.target_temp and self.timer.is_running is not True: self.timer.start() self.timer.is_running = True await asyncio.sleep(1) @@ -121,7 +121,7 @@ class FermenterTargetTempStep(CBPiFermentationStep): logging.info("Cooldown") while self.running == True: sensor_value = self.get_sensor_value(self.props.get("Sensor", None)).get("value") - if sensor_value <= self.fermenter.target_temp and self.timer.is_running is not True: + if sensor_value < 900 and sensor_value <= self.fermenter.target_temp and self.timer.is_running is not True: self.timer.start() self.timer.is_running = True await asyncio.sleep(1) diff --git a/cbpi/extension/mqtt_sensor/__init__.py b/cbpi/extension/mqtt_sensor/__init__.py index 4564416..abc4fae 100644 --- a/cbpi/extension/mqtt_sensor/__init__.py +++ b/cbpi/extension/mqtt_sensor/__init__.py @@ -18,7 +18,7 @@ class MQTTSensor(CBPiSensor): if self.payload_text != None: self.payload_text = self.payload_text.split('.') self.mqtt_task = self.cbpi.satellite.subcribe(self.Topic, self.on_message) - self.value: int = 0 + self.value: int = 999 async def on_message(self, message): val = json.loads(message) From b6ad39df1b35a71279fb4a1f20bacca8a300df65 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Sat, 5 Mar 2022 13:14:29 +0100 Subject: [PATCH 13/23] text workflow --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 39d9296..f9760c8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -66,7 +66,7 @@ jobs: BUILD_CACHE_IMAGE_NAME=${LATEST_IMAGE} TAGS="${LATEST_IMAGE},${{ env.image-name }}:v${VERSION}" PUBLISH_IMAGE=true - elif [[ $GITHUB_REF_NAME == development ]]; then + elif [[ $GITHUB_REF_NAME == development** ]]; then PUBLISH_IMAGE=true fi From ea990bc759ceeda0dd19804f2f763773b4d94774 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Sat, 5 Mar 2022 13:18:12 +0100 Subject: [PATCH 14/23] test workflow --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f9760c8..c7c00fe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -66,7 +66,7 @@ jobs: BUILD_CACHE_IMAGE_NAME=${LATEST_IMAGE} TAGS="${LATEST_IMAGE},${{ env.image-name }}:v${VERSION}" PUBLISH_IMAGE=true - elif [[ $GITHUB_REF_NAME == development** ]]; then + elif [[ startsWith($GITHUB_REF_NAME, 'development' ]]; then PUBLISH_IMAGE=true fi From 0dfc55aa04579e553616744fe1130508a6be8785 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Sat, 5 Mar 2022 13:22:03 +0100 Subject: [PATCH 15/23] another workflow test --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c7c00fe..98f0181 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -66,7 +66,7 @@ jobs: BUILD_CACHE_IMAGE_NAME=${LATEST_IMAGE} TAGS="${LATEST_IMAGE},${{ env.image-name }}:v${VERSION}" PUBLISH_IMAGE=true - elif [[ startsWith($GITHUB_REF_NAME, 'development' ]]; then + elif [[ startsWith($GITHUB_REF_NAME == 'development') ]]; then PUBLISH_IMAGE=true fi From e32b2c4af845a95576cfd625f8c648fc6bbc94c7 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Sat, 5 Mar 2022 13:24:08 +0100 Subject: [PATCH 16/23] worflow --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 98f0181..9c7c1ff 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -66,7 +66,7 @@ jobs: BUILD_CACHE_IMAGE_NAME=${LATEST_IMAGE} TAGS="${LATEST_IMAGE},${{ env.image-name }}:v${VERSION}" PUBLISH_IMAGE=true - elif [[ startsWith($GITHUB_REF_NAME == 'development') ]]; then + elif [[ startsWith($GITHUB_REF_NAME, 'development') ]]; then PUBLISH_IMAGE=true fi From fc14c786a46fc4d15b3cf2bf444ae4888a9c8c9a Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Sat, 5 Mar 2022 13:43:32 +0100 Subject: [PATCH 17/23] added development_fermentersteps to workflow (test) --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9c7c1ff..691a6aa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -66,7 +66,7 @@ jobs: BUILD_CACHE_IMAGE_NAME=${LATEST_IMAGE} TAGS="${LATEST_IMAGE},${{ env.image-name }}:v${VERSION}" PUBLISH_IMAGE=true - elif [[ startsWith($GITHUB_REF_NAME, 'development') ]]; then + elif [[ $GITHUB_REF_NAME == development ]] || [[ $GITHUB_REF_NAME == development_fermentersteps ]]; then PUBLISH_IMAGE=true fi From ecbb2d404da241ae73c6226e72a137d14ea5209d Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Sat, 5 Mar 2022 16:07:15 +0100 Subject: [PATCH 18/23] use current fermenter recipe name when sending recipe to fermenter --- .github/workflows/build.yml | 2 +- cbpi/__init__.py | 2 +- cbpi/controller/fermentation_controller.py | 7 +++++-- cbpi/controller/fermenter_recipe_controller.py | 6 +++--- cbpi/http_endpoints/http_fermenterrecipe.py | 5 +++-- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 691a6aa..39d9296 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -66,7 +66,7 @@ jobs: BUILD_CACHE_IMAGE_NAME=${LATEST_IMAGE} TAGS="${LATEST_IMAGE},${{ env.image-name }}:v${VERSION}" PUBLISH_IMAGE=true - elif [[ $GITHUB_REF_NAME == development ]] || [[ $GITHUB_REF_NAME == development_fermentersteps ]]; then + elif [[ $GITHUB_REF_NAME == development ]]; then PUBLISH_IMAGE=true fi diff --git a/cbpi/__init__.py b/cbpi/__init__.py index d66daf9..733b151 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.2.0.a14" +__version__ = "4.0.2.0.a15" diff --git a/cbpi/controller/fermentation_controller.py b/cbpi/controller/fermentation_controller.py index 528a1c6..3a89dea 100644 --- a/cbpi/controller/fermentation_controller.py +++ b/cbpi/controller/fermentation_controller.py @@ -540,7 +540,7 @@ class FermentationController: with open(path, "w") as file: yaml.dump(data, file) - async def load_recipe(self, data, fermenterid): + async def load_recipe(self, data, fermenterid, name): try: await self.shutdown(None, fermenterid) except: @@ -553,7 +553,10 @@ class FermentationController: item["props"]["Sensor"] = fermenter.sensor list(map(lambda item: add_runtime_data(item), data.get("steps"))) fermenter.description = data['basic']['desc'] - fermenter.brewname = data['basic']['name'] + if name is not None: + fermenter.brewname = name + else: + fermenter.brewname = data['basic']['name'] fermenter.steps=[] await self.update(fermenter) for item in data.get("steps"): diff --git a/cbpi/controller/fermenter_recipe_controller.py b/cbpi/controller/fermenter_recipe_controller.py index e0065c3..d0de8b5 100644 --- a/cbpi/controller/fermenter_recipe_controller.py +++ b/cbpi/controller/fermenter_recipe_controller.py @@ -69,13 +69,13 @@ class FermenterRecipeController: os.remove(path) - async def brew(self, name, fermenterid): + async def brew(self, recipeid, fermenterid, name): - recipe_path = os.path.join(".", 'config', "fermenterrecipes", "%s.yaml" % name) + recipe_path = os.path.join(".", 'config', "fermenterrecipes", "%s.yaml" % recipeid) logging.info(recipe_path) with open(recipe_path) as file: data = yaml.load(file, Loader=yaml.FullLoader) - await self.cbpi.fermenter.load_recipe(data, fermenterid) + await self.cbpi.fermenter.load_recipe(data, fermenterid, name) async def clone(self, id, new_name): recipe_path = os.path.join(".", 'config', "fermenterrecipes", "%s.yaml" % id) diff --git a/cbpi/http_endpoints/http_fermenterrecipe.py b/cbpi/http_endpoints/http_fermenterrecipe.py index 76dddd9..e974e3e 100644 --- a/cbpi/http_endpoints/http_fermenterrecipe.py +++ b/cbpi/http_endpoints/http_fermenterrecipe.py @@ -117,7 +117,7 @@ class FermenterRecipeHttpEndpoints(): await self.controller.remove(name) return web.Response(status=204) - @request_mapping(path="/{name}/{fermenterid}/brew", method="POST", auth_required=False) + @request_mapping(path="/{recipeid}/{fermenterid}/{name}/brew", method="POST", auth_required=False) async def http_brew(self, request): """ @@ -137,9 +137,10 @@ class FermenterRecipeHttpEndpoints(): "200": description: successful operation """ + recipeid = request.match_info['recipeid'] name = request.match_info['name'] fermenterid = request.match_info['fermenterid'] - await self.controller.brew(name,fermenterid) + await self.controller.brew(recipeid,fermenterid,name) return web.Response(status=204) @request_mapping(path="/{id}/clone", method="POST", auth_required=False) From bc6649dff8a478f71b2052b01bb4ec1df3220418 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Mon, 7 Mar 2022 15:03:41 +0100 Subject: [PATCH 19/23] Dont' start femrentationstep before mqtt sensor has received a value --- cbpi/__init__.py | 2 +- cbpi/extension/FermentationStep/__init__.py | 13 +++++++++---- cbpi/extension/mqtt_sensor/__init__.py | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 733b151..c58b6d8 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.2.0.a15" +__version__ = "4.0.2.0.a16" diff --git a/cbpi/extension/FermentationStep/__init__.py b/cbpi/extension/FermentationStep/__init__.py index 442c84b..947be94 100644 --- a/cbpi/extension/FermentationStep/__init__.py +++ b/cbpi/extension/FermentationStep/__init__.py @@ -91,7 +91,6 @@ class FermenterTargetTempStep(CBPiFermentationStep): async def on_start(self): self.shutdown = False self.AutoMode = True if self.props.get("AutoMode","No") == "Yes" else False - self.starttemp= self.get_sensor_value(self.props.get("Sensor", None)).get("value") if self.fermenter is not None: self.fermenter.target_temp = int(self.props.get("Temp", 0)) if self.AutoMode == True: @@ -109,11 +108,14 @@ class FermenterTargetTempStep(CBPiFermentationStep): await self.push_update() async def run(self): + while self.get_sensor_value(self.props.get("Sensor", None)).get("value") > 900: + await asyncio.sleep(1) + self.starttemp= self.get_sensor_value(self.props.get("Sensor", None)).get("value") if self.fermenter.target_temp >= self.starttemp: logging.info("warmup") while self.running == True: sensor_value = self.get_sensor_value(self.props.get("Sensor", None)).get("value") - if sensor_value < 900 and sensor_value >= self.fermenter.target_temp and self.timer.is_running is not True: + if sensor_value >= self.fermenter.target_temp and self.timer.is_running is not True: self.timer.start() self.timer.is_running = True await asyncio.sleep(1) @@ -121,7 +123,7 @@ class FermenterTargetTempStep(CBPiFermentationStep): logging.info("Cooldown") while self.running == True: sensor_value = self.get_sensor_value(self.props.get("Sensor", None)).get("value") - if sensor_value < 900 and sensor_value <= self.fermenter.target_temp and self.timer.is_running is not True: + if sensor_value <= self.fermenter.target_temp and self.timer.is_running is not True: self.timer.start() self.timer.is_running = True await asyncio.sleep(1) @@ -201,7 +203,6 @@ class FermenterStep(CBPiFermentationStep): self.fermentationtime = self.endtime - time.time() self.AutoMode = True if self.props.get("AutoMode", "No") == "Yes" else False - self.starttemp= self.get_sensor_value(self.props.get("Sensor", None)).get("value") if self.fermenter is not None: self.fermenter.target_temp = int(self.props.get("Temp", 0)) if self.AutoMode == True: @@ -247,6 +248,10 @@ class FermenterStep(CBPiFermentationStep): self.timer.is_running == False async def run(self): + while self.get_sensor_value(self.props.get("Sensor", None)).get("value") > 900: + await asyncio.sleep(1) + self.starttemp= self.get_sensor_value(self.props.get("Sensor", None)).get("value") + if self.fermenter.target_temp >= self.starttemp: logging.info("warmup") while self.running == True: diff --git a/cbpi/extension/mqtt_sensor/__init__.py b/cbpi/extension/mqtt_sensor/__init__.py index abc4fae..e2d6e48 100644 --- a/cbpi/extension/mqtt_sensor/__init__.py +++ b/cbpi/extension/mqtt_sensor/__init__.py @@ -18,7 +18,7 @@ class MQTTSensor(CBPiSensor): if self.payload_text != None: self.payload_text = self.payload_text.split('.') self.mqtt_task = self.cbpi.satellite.subcribe(self.Topic, self.on_message) - self.value: int = 999 + self.value: float = 999 async def on_message(self, message): val = json.loads(message) From 6ac93e52127c6eaca7b4243e3f094d1bf55f06d0 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Mon, 7 Mar 2022 16:43:00 +0100 Subject: [PATCH 20/23] fix for stepid on load recipe/addstep --- cbpi/__init__.py | 2 +- cbpi/api/step.py | 9 ------- cbpi/controller/fermentation_controller.py | 31 ++++++++++++++-------- cbpi/http_endpoints/http_fermentation.py | 4 +-- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index c58b6d8..cee5728 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.2.0.a16" +__version__ = "4.0.2.0.a17" diff --git a/cbpi/api/step.py b/cbpi/api/step.py index a9d6d19..bf30778 100644 --- a/cbpi/api/step.py +++ b/cbpi/api/step.py @@ -117,15 +117,6 @@ class CBPiStep(CBPiBase): def __str__(self): return "name={} props={}, type={}".format(self.name, self.props, self.__class__.__name__) -#class CBPiFermentationStep(CBPiStep): - -# def __init__(self, cbpi, fermenter, step, props, on_done) -> None: -# self.fermenter = fermenter -# id = step.get("id") -# name=step.get("name") -# self.step=step -# super().__init__(cbpi, id, name, props, on_done) - class CBPiFermentationStep(CBPiBase): def __init__(self, cbpi, fermenter, step, props, on_done) -> None: diff --git a/cbpi/controller/fermentation_controller.py b/cbpi/controller/fermentation_controller.py index 3a89dea..d0a5009 100644 --- a/cbpi/controller/fermentation_controller.py +++ b/cbpi/controller/fermentation_controller.py @@ -238,16 +238,16 @@ class FermentationController: with open(self.path, "w") as file: json.dump(data, file, indent=4, sort_keys=True) - async def create_step(self, id, item): + def create_step(self, id, item): try: stepid = shortuuid.uuid() - props = item.get("props") + item['id'] = stepid status = StepState("I") type = item.get("type") name = item.get("name") + endtime = item.get("endtime", 0) props = Props(item.get("props")) fermenter = self._find_by_id(id) - try: type_cfg = self.steptypes.get(type) clazz = type_cfg.get("class") @@ -255,13 +255,8 @@ class FermentationController: except Exception as e: logging.warning("Failed to create step instance %s - %s" % (id, e)) instance = None - step = FermenterStep(id=stepid, name=name, fermenter=fermenter, props=props, type=type, status=status, instance=instance) + step = FermenterStep(id=stepid, name=name, fermenter=fermenter, props=props, type=type, status=status, endtime=endtime, instance=instance) - - - fermenter.steps.append(step) - self.save() - self.push_update("fermenterstepupdate") return step except Exception as e: self.logger.error(e) @@ -546,18 +541,32 @@ class FermentationController: except: pass fermenter = self._find_by_id(fermenterid) + def add_runtime_data(item): item["status"] = "I" item["endtime"] = 0 item["id"] = shortuuid.uuid() item["props"]["Sensor"] = fermenter.sensor + list(map(lambda item: add_runtime_data(item), data.get("steps"))) fermenter.description = data['basic']['desc'] if name is not None: fermenter.brewname = name else: fermenter.brewname = data['basic']['name'] - fermenter.steps=[] await self.update(fermenter) + fermenter.steps=[] for item in data.get("steps"): - await self.create_step(fermenterid, item) + fermenter.steps.append(self.create_step(fermenterid, item)) + + self.save() + self.push_update("fermenterstepupdate") + + async def add_step(self, fermenterid, newstep): + fermenter = self._find_by_id(fermenterid) + step = self.create_step(fermenterid, newstep) + fermenter.steps.append(step) + self.save() + self.push_update("fermenterstepupdate") + return step + \ No newline at end of file diff --git a/cbpi/http_endpoints/http_fermentation.py b/cbpi/http_endpoints/http_fermentation.py index 945743c..81c4d89 100644 --- a/cbpi/http_endpoints/http_fermentation.py +++ b/cbpi/http_endpoints/http_fermentation.py @@ -313,8 +313,8 @@ class FermentationHttpEndpoints(): data = await request.json() fermenterid= request.match_info['id'] - newstep = {"name": data.get("name"), "props": data.get("props", {}), "type": data.get("type")} - response_data = await self.controller.create_step(fermenterid,newstep) + newstep = {"name": data.get("name"), "props": data.get("props", {}), "endtime": 0, "type": data.get("type")} + response_data = await self.controller.add_step(fermenterid,newstep) return web.json_response(data=response_data.to_dict()) @request_mapping(path="/{fermenterid}/{stepid}", method="PUT", auth_required=False) From c3c4101b6b3a04bb7b13471e99c3a4c09893057d Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Tue, 8 Mar 2022 14:25:00 +0100 Subject: [PATCH 21/23] Added NIC Speed info to system controller --- cbpi/api/dataclasses.py | 2 +- cbpi/controller/system_controller.py | 30 +++++++++++++++++++-- cbpi/extension/FermentationStep/__init__.py | 4 +-- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/cbpi/api/dataclasses.py b/cbpi/api/dataclasses.py index ffb6963..921582c 100644 --- a/cbpi/api/dataclasses.py +++ b/cbpi/api/dataclasses.py @@ -131,7 +131,7 @@ class Fermenter: brewname: str = None description : str = None props: Props = Props() - target_temp: int = 0 + target_temp: float = 0 type: str = None steps: List[Step]= field(default_factory=list) instance: str = None diff --git a/cbpi/controller/system_controller.py b/cbpi/controller/system_controller.py index 33bf050..153a05b 100644 --- a/cbpi/controller/system_controller.py +++ b/cbpi/controller/system_controller.py @@ -178,6 +178,8 @@ class SystemController: mempercent = 0 eth0IP = "N/A" wlan0IP = "N/A" + eth0speed = "N/A" + wlan0speed = "N/A" TEMP_UNIT=self.cbpi.config.get("TEMP_UNIT", "C") FAHRENHEIT = False if TEMP_UNIT == "C" else True @@ -225,12 +227,23 @@ class SystemController: if str(addr.family) == "AddressFamily.AF_INET": if addr.address: wlan0IP = addr.address + info = psutil.net_if_stats() + try: + for nic in info: + if nic == 'eth0': + if info[nic].speed: + eth0speed = info[nic].speed + if nic == 'wlan0': + if info[nic].speed: + wlan0speed = info[nic].speed + except Exception as e: + logging.info(e) except: pass if system == "Windows": try: - ethernet = psutil.net_if_addrs() + ethernet = psutil.net_if_addrs() for nic, addrs in ethernet.items(): if nic == "Ethernet": for addr in addrs: @@ -242,6 +255,17 @@ class SystemController: if str(addr.family) == "AddressFamily.AF_INET": if addr.address: wlan0IP = addr.address + info = psutil.net_if_stats() + try: + for nic in info: + if nic == 'Ethernet': + if info[nic].speed: + eth0speed = info[nic].speed + if nic == 'WLAN': + if info[nic].speed: + wlan0speed = info[nic].speed + except Exception as e: + logging.info(e) except: pass @@ -258,7 +282,9 @@ class SystemController: 'temp': temp, 'temp_unit': TEMP_UNIT, 'eth0': eth0IP, - 'wlan0': wlan0IP} + 'wlan0': wlan0IP, + 'eth0speed': eth0speed, + 'wlan0speed': wlan0speed} return systeminfo diff --git a/cbpi/extension/FermentationStep/__init__.py b/cbpi/extension/FermentationStep/__init__.py index 947be94..2d0ca32 100644 --- a/cbpi/extension/FermentationStep/__init__.py +++ b/cbpi/extension/FermentationStep/__init__.py @@ -92,7 +92,7 @@ class FermenterTargetTempStep(CBPiFermentationStep): self.shutdown = False self.AutoMode = True if self.props.get("AutoMode","No") == "Yes" else False if self.fermenter is not None: - self.fermenter.target_temp = int(self.props.get("Temp", 0)) + self.fermenter.target_temp = float(self.props.get("Temp", 0)) if self.AutoMode == True: await self.setAutoMode(True) self.summary = "Waiting for Target Temp" @@ -204,7 +204,7 @@ class FermenterStep(CBPiFermentationStep): self.AutoMode = True if self.props.get("AutoMode", "No") == "Yes" else False if self.fermenter is not None: - self.fermenter.target_temp = int(self.props.get("Temp", 0)) + self.fermenter.target_temp = float(self.props.get("Temp", 0)) if self.AutoMode == True: await self.setAutoMode(True) await self.push_update() From 12803b62c4baa99868574bd082cc982313ee1c37 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Tue, 8 Mar 2022 19:43:37 +0100 Subject: [PATCH 22/23] check if nic is down --- cbpi/__init__.py | 2 +- cbpi/controller/system_controller.py | 28 ++++++++++++++++++++-------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index cee5728..2a547cd 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.2.0.a17" +__version__ = "4.0.2.0.a18" diff --git a/cbpi/controller/system_controller.py b/cbpi/controller/system_controller.py index 153a05b..af3c8a0 100644 --- a/cbpi/controller/system_controller.py +++ b/cbpi/controller/system_controller.py @@ -231,11 +231,17 @@ class SystemController: try: for nic in info: if nic == 'eth0': - if info[nic].speed: - eth0speed = info[nic].speed + if info[nic].isup == True: + if info[nic].speed: + eth0speed = info[nic].speed + else: + eth0speed = "down" if nic == 'wlan0': - if info[nic].speed: - wlan0speed = info[nic].speed + if info[nic].isup == True: + if info[nic].speed: + wlan0speed = info[nic].speed + else: + wlan0speed = "down" except Exception as e: logging.info(e) except: @@ -259,11 +265,17 @@ class SystemController: try: for nic in info: if nic == 'Ethernet': - if info[nic].speed: - eth0speed = info[nic].speed + if info[nic].isup == True: + if info[nic].speed: + eth0speed = info[nic].speed + else: + eth0speed = "down" if nic == 'WLAN': - if info[nic].speed: - wlan0speed = info[nic].speed + if info[nic].isup == True: + if info[nic].speed: + wlan0speed = info[nic].speed + else: + wlan0speed = "down" except Exception as e: logging.info(e) except: From aa76c908ef1b132bd1bf4dc3c14797a89ae22768 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Wed, 9 Mar 2022 08:25:17 +0100 Subject: [PATCH 23/23] wlan0 speed fix for linux / defalt mqtt actor off on startup --- cbpi/__init__.py | 2 +- cbpi/controller/system_controller.py | 8 +++++--- cbpi/extension/mqtt_actor/mqtt_actor.py | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 2a547cd..a48bba4 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.2.0.a18" +__version__ = "4.0.2.0.a19" diff --git a/cbpi/controller/system_controller.py b/cbpi/controller/system_controller.py index af3c8a0..59a6eae 100644 --- a/cbpi/controller/system_controller.py +++ b/cbpi/controller/system_controller.py @@ -237,9 +237,11 @@ class SystemController: else: eth0speed = "down" if nic == 'wlan0': - if info[nic].isup == True: - if info[nic].speed: - wlan0speed = info[nic].speed + if info[nic].isup == True: + ratestring = os.popen('iwlist wlan0 rate | grep Rate').read() + start = ratestring.find("=") + 1 + end = ratestring.find(" Mb/s") + wlan0speed = ratestring[start:end] else: wlan0speed = "down" except Exception as e: diff --git a/cbpi/extension/mqtt_actor/mqtt_actor.py b/cbpi/extension/mqtt_actor/mqtt_actor.py index 5788c12..28dd198 100644 --- a/cbpi/extension/mqtt_actor/mqtt_actor.py +++ b/cbpi/extension/mqtt_actor/mqtt_actor.py @@ -22,6 +22,8 @@ class MQTTActor(CBPiActor): async def on_start(self): self.topic = self.props.get("Topic", None) self.power = 100 + await self.off() + self.state = False async def on(self, power=None): if power is not None: