From 83286150b742de0b34236dc9caa6453d4b71cdca Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Thu, 24 Mar 2022 07:33:48 +0100 Subject: [PATCH 1/5] Add Codename --- cbpi/__init__.py | 3 ++- cbpi/craftbeerpi.py | 5 +++-- cbpi/http_endpoints/http_system.py | 5 +++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 7002578..52eae63 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1,2 @@ -__version__ = "4.0.3.a2" +__version__ = "4.0.4.a1" +__codename__ = "Spring Break" diff --git a/cbpi/craftbeerpi.py b/cbpi/craftbeerpi.py index aa79701..b9ba484 100644 --- a/cbpi/craftbeerpi.py +++ b/cbpi/craftbeerpi.py @@ -12,7 +12,7 @@ from cbpi.controller.notification_controller import NotificationController import logging from os import urandom import os -from cbpi import __version__ +from cbpi import __version__, __codename__ from aiohttp import web from aiohttp_auth import auth from aiohttp_session import session_middleware @@ -95,7 +95,8 @@ class CraftBeerPi: self.path = os.sep.join(os.path.abspath(__file__).split(os.sep)[:-1]) # The path to the package dir self.version = __version__ - + self.codename = __codename__ + self.static_config = load_config(os.path.join(".", 'config', "config.yaml")) logger.info("Init CraftBeerPI") diff --git a/cbpi/http_endpoints/http_system.py b/cbpi/http_endpoints/http_system.py index 9830cc0..c21c4cf 100644 --- a/cbpi/http_endpoints/http_system.py +++ b/cbpi/http_endpoints/http_system.py @@ -5,7 +5,7 @@ from cbpi.job.aiohttp import get_scheduler_from_app import logging from cbpi.api import request_mapping from cbpi.utils import json_dumps -from cbpi import __version__ +from cbpi import __version__, __codename__ import pathlib import os from cbpi.controller.system_controller import SystemController @@ -36,7 +36,8 @@ class SystemHttpEndpoints: step=self.cbpi.step.get_state(), fermentersteps=self.cbpi.fermenter.get_fermenter_steps(), config=self.cbpi.config.get_state(), - version=__version__) + version=__version__, + codename=__codename__) , dumps=json_dumps) @request_mapping(path="/logs", auth_required=False) From 42670efd9c95265f34398e548d9d6eecdb5041f8 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Mon, 28 Mar 2022 15:59:04 +0200 Subject: [PATCH 2/5] Added fermenterstep with controlled ramp rate --- cbpi/controller/fermentation_controller.py | 12 +- cbpi/extension/FermentationStep/__init__.py | 121 +++++++++++++++++++- 2 files changed, 121 insertions(+), 12 deletions(-) diff --git a/cbpi/controller/fermentation_controller.py b/cbpi/controller/fermentation_controller.py index 7015618..f75690a 100644 --- a/cbpi/controller/fermentation_controller.py +++ b/cbpi/controller/fermentation_controller.py @@ -54,10 +54,7 @@ class FermentationController: for step in fermenter.steps: try: self.logger.info("Stop {}".format(step.name)) - try: - step.instance.shutdown = True - except: - pass + step.instance.shutdown = True await step.instance.stop() except Exception as e: self.logger.error(e) @@ -67,10 +64,7 @@ class FermentationController: for step in fermenter.steps: try: self.logger.info("Stop {}".format(step.name)) - try: - step.instance.shutdown = True - except: - pass + step.instance.shutdown = True await step.instance.stop() except Exception as e: self.logger.error(e) @@ -588,4 +582,4 @@ class FermentationController: self.save() self.push_update("fermenterstepupdate") return step - \ No newline at end of file + diff --git a/cbpi/extension/FermentationStep/__init__.py b/cbpi/extension/FermentationStep/__init__.py index 7ebfbc2..7d905a9 100644 --- a/cbpi/extension/FermentationStep/__init__.py +++ b/cbpi/extension/FermentationStep/__init__.py @@ -81,8 +81,9 @@ class FermenterTargetTempStep(CBPiFermentationStep): if self.AutoMode == True: await self.setAutoMode(False) self.cbpi.notify(self.name, self.props.get("Notification","Target Temp reached. Please add malt and klick next to move on.")) - await self.next(self.fermenter.id) - return StepResult.DONE + if self.shutdown == False: + await self.next(self.fermenter.id) + return StepResult.DONE async def on_timer_update(self,timer, seconds): @@ -183,7 +184,7 @@ class FermenterStep(CBPiFermentationStep): if self.AutoMode == True: await self.setAutoMode(False) self.cbpi.notify(self.name, 'Step finished', NotificationType.SUCCESS) - if self.shutdown != True: + if self.shutdown == False: await self.next(self.fermenter.id) return StepResult.DONE @@ -291,6 +292,119 @@ class FermenterStep(CBPiFermentationStep): except Exception as e: logging.error("Failed to switch on FermenterLogic {} {}".format(self.fermenter.id, e)) +@parameters([Property.Number(label="Temp", configurable=True, description = "Ramp to this temp"), + Property.Number(label="RampRate", configurable=True, description = "Ramp x °C/F per day. Default: 1"), + Property.Sensor(label="Sensor"), + Property.Text(label="Notification",configurable = True, description = "Text for notification when Temp is reached"), + Property.Select(label="AutoMode",options=["Yes","No"], description="Switch Fermenterlogic automatically on and off -> Yes")]) +class FermenterRampTempStep(CBPiFermentationStep): + + async def NextStep(self, **kwargs): + if self.shutdown == False: + await self.next(self.fermenter.id) + return StepResult.DONE + + async def on_timer_done(self,timer): + self.summary = "" + await self.push_update() + if self.AutoMode == True: + await self.setAutoMode(False) + self.cbpi.notify(self.name, self.props.get("Notification","Target Temp reached. Please add malt and klick next to move on.")) + await self.next(self.fermenter.id) + return StepResult.DONE + + + async def on_timer_update(self,timer, seconds): + 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.rate=float(self.props.get("RampRate",1)) + logging.info(self.rate) + self.target_temp = round(float(self.props.get("Temp", 0))*10)/10 + logging.info(self.target_temp) + 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") + + self.current_target_temp = self.starttemp + if self.fermenter is not None: + await self.set_fermenter_target_temp(self.fermenter.id, self.current_target_temp) + if self.AutoMode == True: + await self.setAutoMode(True) + self.summary = "Ramping to {}° with {}° per day".format(self.target_temp,self.rate) + if self.fermenter is not None and self.timer is None: + self.timer = Timer(1 ,on_update=self.on_timer_update, on_done=self.on_timer_done) + await self.push_update() + + async def on_stop(self): + await self.timer.stop() + self.summary = "" + if self.AutoMode == True: + await self.setAutoMode(False) + await self.push_update() + + async def calc_target_temp(self): + delta_time = time.time() - self.starttime + current_target_temp = round((self.starttemp + delta_time * self.ratesecond)*10)/10 +# logging.info(current_target_temp) + if current_target_temp != self.current_target_temp: + self.current_target_temp = current_target_temp + await self.set_fermenter_target_temp(self.fermenter.id, self.current_target_temp) + #self.fermenter.target_temp = self.current_target_temp + await self.push_update() + + pass + + async def run(self): + self.delta_temp = self.target_temp-self.starttemp + try: + self.deltadays = abs(self.delta_temp / self.rate) + self.deltaseconds = self.deltadays * 24 * 60 * 60 + self.ratesecond = self.delta_temp/self.deltaseconds + except Exception as e: + logging.info(e) + self.starttime=time.time() + + if self.target_temp >= self.starttemp: + logging.info("warmup") + while self.running == True: + if self.current_target_temp != self.target_temp: + await self.calc_target_temp() + sensor_value = self.get_sensor_value(self.props.get("Sensor", None)).get("value") + if sensor_value >= self.target_temp and self.timer.is_running is not True: + self.timer.start() + self.timer.is_running = True + await asyncio.sleep(1) + elif self.target_temp <= self.starttemp: + logging.info("Cooldown") + while self.running == True: + if self.current_target_temp != self.target_temp: + await self.calc_target_temp() + sensor_value = self.get_sensor_value(self.props.get("Sensor", None)).get("value") + if sensor_value <= self.target_temp and self.timer.is_running is not True: + self.timer.start() + self.timer.is_running = True + await asyncio.sleep(1) + await self.push_update() + return StepResult.DONE + + 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: + if (self.fermenter.instance is None or self.fermenter.instance.state == False) and (auto_state is True): + await self.cbpi.fermenter.toggle(self.fermenter.id) + elif (self.fermenter.instance.state == True) and (auto_state is False): + await self.fermenter.instance.stop() + await self.push_update() + + except Exception as e: + logging.error("Failed to switch on FermenterLogic {} {}".format(self.fermenter.id, e)) + def setup(cbpi): ''' @@ -303,4 +417,5 @@ def setup(cbpi): cbpi.plugin.register("FermenterNotificationStep", FermenterNotificationStep) cbpi.plugin.register("FermenterTargetTempStep", FermenterTargetTempStep) + cbpi.plugin.register("FermenterRampTempStep", FermenterRampTempStep) cbpi.plugin.register("FermenterStep", FermenterStep) From 43cf27bad5bb8ac4aab46cae0308a5234b355b01 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Mon, 28 Mar 2022 15:59:42 +0200 Subject: [PATCH 3/5] Version bump --- cbpi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 52eae63..06adfea 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1,2 +1,2 @@ -__version__ = "4.0.4.a1" +__version__ = "4.0.4.a2" __codename__ = "Spring Break" From 25327bab9fe79218fbd45b07a8815f3bc4521832 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Tue, 29 Mar 2022 18:48:36 +0200 Subject: [PATCH 4/5] clear femrenter recipe name if recie is cleared --- cbpi/__init__.py | 2 +- cbpi/controller/fermentation_controller.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 06adfea..75f8776 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1,2 +1,2 @@ -__version__ = "4.0.4.a2" +__version__ = "4.0.4.a3" __codename__ = "Spring Break" diff --git a/cbpi/controller/fermentation_controller.py b/cbpi/controller/fermentation_controller.py index f75690a..96b2f49 100644 --- a/cbpi/controller/fermentation_controller.py +++ b/cbpi/controller/fermentation_controller.py @@ -299,6 +299,8 @@ class FermentationController: item = self._find_by_id(id) # might require later check if step is active item.steps = [] + item.brewname = "" + self.push_update() self.save() self.push_update("fermenterstepupdate") From 8a7525ef9ddc035764a3e0f92681cf8d8241b762 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Wed, 30 Mar 2022 07:42:07 +0200 Subject: [PATCH 5/5] Added codenae to release.py and adapted release.py code for 3 digits version --- release.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/release.py b/release.py index 4417727..60514b9 100644 --- a/release.py +++ b/release.py @@ -1,3 +1,4 @@ +import code import subprocess import click import re @@ -9,17 +10,23 @@ def main(): @click.command() @click.option('-m', prompt='Commit Message') def commit(m): - + + new_content = [] file = "./cbpi/__init__.py" with open(file) as reader: match = re.search('.*\"(.*)\"', reader.readline()) - major, minor, patch, build = match.group(1).split(".") - build = int(build) - build += 1 - new_version = "__version__ = \"{}.{}.{}.{}\"".format(major,minor,patch, build) + codename = reader.readline() + try: + major, minor, patch, build = match.group(1).split(".") + except: + major, minor, patch = match.group(1).split(".") + patch = int(patch) + patch += 1 + new_content.append("__version__ = \"{}.{}.{}\"".format(major,minor,patch)) + new_content.append(codename) with open(file,'w',encoding = 'utf-8') as file: - print("New Version {}.{}.{}.{}".format(major,minor,patch, build)) - file.write(new_version) + print("New Version {}.{}.{}".format(major,minor,patch)) + file.writelines("%s\n" % i for i in new_content) subprocess.run(["git", "add", "-A"]) subprocess.run(["git", "commit", "-m", "\"{}\"".format(m)])