diff --git a/cbpi/api/step.py b/cbpi/api/step.py index 0f099ca..8e16b07 100644 --- a/cbpi/api/step.py +++ b/cbpi/api/step.py @@ -1,33 +1,32 @@ import asyncio -import json -import logging -import time -from abc import ABCMeta, abstractmethod -from enum import Enum +from abc import abstractmethod from cbpi.api.base import CBPiBase -from cbpi.api.config import ConfigType __all__ = ["StepResult", "StepState", "StepMove", "CBPiStep"] from enum import Enum + class StepResult(Enum): - STOP=1 - NEXT=2 - DONE=3 - ERROR=4 + STOP = 1 + NEXT = 2 + DONE = 3 + ERROR = 4 + class StepState(Enum): - INITIAL="I" - DONE="D" - ACTIVE="A" - ERROR="E" - STOP="S" + INITIAL = "I" + DONE = "D" + ACTIVE = "A" + ERROR = "E" + STOP = "S" + class StepMove(Enum): - UP=-1 - DOWN=1 + UP = -1 + DOWN = 1 + class CBPiStep(CBPiBase): @@ -40,21 +39,25 @@ class CBPiStep(CBPiBase): self.props = props self.cancel_reason: StepResult = None self.summary = "" + self.running: bool = False def _done(self, task): self._done_callback(self, task.result()) async def start(self): + self.running = True self.task = asyncio.create_task(self._run()) self.task.add_done_callback(self._done) - async def next(self): + async def next(self): + self.running = False self.cancel_reason = StepResult.NEXT self.task.cancel() await self.task - async def stop(self): + async def stop(self): try: + self.running = False self.cancel_reason = StepResult.STOP self.task.cancel() await self.task @@ -69,7 +72,7 @@ class CBPiStep(CBPiBase): async def save_props(self): await self.cbpi.step.save() - + async def push_update(self): self.cbpi.step.push_udpate() @@ -84,11 +87,11 @@ class CBPiStep(CBPiBase): await self.on_start() await self.run() self.cancel_reason = StepResult.DONE - except asyncio.CancelledError as e: + except asyncio.CancelledError as e: pass finally: await self.on_stop() - + return self.cancel_reason @abstractmethod diff --git a/cbpi/extension/mashstep/__init__.py b/cbpi/extension/mashstep/__init__.py index 700ebf4..972b6b9 100644 --- a/cbpi/extension/mashstep/__init__.py +++ b/cbpi/extension/mashstep/__init__.py @@ -1,27 +1,26 @@ - import asyncio -from cbpi.api.step import CBPiStep, StepResult -from cbpi.api.timer import Timer + from cbpi.api import * -import logging +from cbpi.api.step import StepResult +from cbpi.api.timer import Timer -@parameters([Property.Number(label="Timer", description="Time in Minutes", configurable=True), +@parameters([Property.Number(label="Timer", description="Time in Minutes", configurable=True), Property.Number(label="Temp", configurable=True), Property.Sensor(label="Sensor"), Property.Kettle(label="Kettle")]) class MashStep(CBPiStep): - async def on_timer_done(self,timer): + async def on_timer_done(self, timer): self.summary = "" await self.next() - async def on_timer_update(self,timer, seconds): + async def on_timer_update(self, timer, seconds): self.summary = Timer.format_time(seconds) await self.push_update() async def on_start(self): if self.timer is None: - self.timer = Timer(int(self.props.Timer) *60 ,on_update=self.on_timer_update, on_done=self.on_timer_done) + self.timer = Timer(int(self.props.Timer) * 60, on_update=self.on_timer_update, on_done=self.on_timer_done) if self.cbpi.kettle is not None: await self.cbpi.kettle.set_target_temp(self.props.Kettle, int(self.props.Temp)) self.summary = "Waiting for Target Temp" @@ -34,7 +33,7 @@ class MashStep(CBPiStep): async def reset(self): self.summary = "" - self.timer = Timer(int(self.props.Timer) *60 ,on_update=self.on_timer_update, on_done=self.on_timer_done) + self.timer = Timer(int(self.props.Timer) * 60, on_update=self.on_timer_update, on_done=self.on_timer_done) async def run(self): while True: @@ -45,7 +44,6 @@ class MashStep(CBPiStep): self.timer.is_running = True return StepResult.DONE - @parameters([Property.Number(label="Timer", description="Time in Minutes", configurable=True)]) class WaitStep(CBPiStep): @@ -53,24 +51,22 @@ class WaitStep(CBPiStep): @action(key="Custom Step Action", parameters=[]) async def hello(self, **kwargs): print("ACTION") - @action(key="Custom Step Action 2", parameters=[]) async def hello2(self, **kwargs): print("ACTION2") - - async def on_timer_done(self,timer): + async def on_timer_done(self, timer): self.summary = "" await self.next() - async def on_timer_update(self,timer, seconds): + async def on_timer_update(self, timer, seconds): self.summary = Timer.format_time(seconds) await self.push_update() async def on_start(self): if self.timer is None: - self.timer = Timer(int(self.props.Timer) * 60,on_update=self.on_timer_update, on_done=self.on_timer_done) + self.timer = Timer(int(self.props.Timer) * 60, on_update=self.on_timer_update, on_done=self.on_timer_done) self.timer.start() async def on_stop(self): @@ -79,27 +75,28 @@ class WaitStep(CBPiStep): await self.push_update() async def reset(self): - self.timer = Timer(int(self.props.Timer) * 60,on_update=self.on_timer_update, on_done=self.on_timer_done) + self.timer = Timer(int(self.props.Timer) * 60, 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 + @parameters([Property.Number(label="Timer", description="Time in Minutes", configurable=True), - Property.Actor(label="Actor")]) + Property.Actor(label="Actor")]) class ActorStep(CBPiStep): - async def on_timer_done(self,timer): + async def on_timer_done(self, timer): self.summary = "" await self.next() - async def on_timer_update(self,timer, seconds): + async def on_timer_update(self, timer, seconds): self.summary = Timer.format_time(seconds) await self.push_update() async def on_start(self): if self.timer is None: - self.timer = Timer(int(self.props.Timer) * 60,on_update=self.on_timer_update, on_done=self.on_timer_done) + self.timer = Timer(int(self.props.Timer) * 60, on_update=self.on_timer_update, on_done=self.on_timer_done) self.timer.start() await self.actor_on(self.props.Actor) @@ -108,9 +105,9 @@ class ActorStep(CBPiStep): await self.timer.stop() self.summary = "" await self.push_update() - + async def reset(self): - self.timer = Timer(int(self.props.Timer) *60 ,on_update=self.on_timer_update, on_done=self.on_timer_done) + self.timer = Timer(int(self.props.Timer) * 60, on_update=self.on_timer_update, on_done=self.on_timer_done) async def run(self): while self.running == True: @@ -118,23 +115,23 @@ class ActorStep(CBPiStep): return StepResult.DONE -@parameters([Property.Number(label="Timer", description="Time in Minutes", configurable=True), +@parameters([Property.Number(label="Timer", description="Time in Minutes", configurable=True), Property.Number(label="Temp", description="Boil temperature", configurable=True), Property.Sensor(label="Sensor"), Property.Kettle(label="Kettle")]) class BoilStep(CBPiStep): - async def on_timer_done(self,timer): + async def on_timer_done(self, timer): self.summary = "" await self.next() - async def on_timer_update(self,timer, seconds): + async def on_timer_update(self, timer, seconds): self.summary = Timer.format_time(seconds) await self.push_update() async def on_start(self): if self.timer is None: - self.timer = Timer(int(self.props.Timer) *60 ,on_update=self.on_timer_update, on_done=self.on_timer_done) + self.timer = Timer(int(self.props.Timer) * 60, on_update=self.on_timer_update, on_done=self.on_timer_done) if self.cbpi.kettle is not None: await self.cbpi.kettle.set_target_temp(self.props.Kettle, int(self.props.Temp)) self.summary = "Waiting for Target Temp" @@ -146,11 +143,11 @@ class BoilStep(CBPiStep): await self.push_update() async def reset(self): - self.timer = Timer(int(self.props.Timer) *60 ,on_update=self.on_timer_update, on_done=self.on_timer_done) + self.timer = Timer(int(self.props.Timer) * 60, on_update=self.on_timer_update, on_done=self.on_timer_done) @action("Start Timer", []) async def star_timer(self): - + self.timer.start() async def run(self): @@ -162,6 +159,7 @@ class BoilStep(CBPiStep): self.timer.is_running = True return StepResult.DONE + def setup(cbpi): ''' This method is called by the server during startup @@ -169,14 +167,9 @@ def setup(cbpi): :param cbpi: the cbpi core :return: - ''' - + ''' + cbpi.plugin.register("BoilStep", BoilStep) cbpi.plugin.register("WaitStep", WaitStep) cbpi.plugin.register("MashStep", MashStep) cbpi.plugin.register("ActorStep", ActorStep) - - - - -