cleanup in fermentation controller and setup.py

This commit is contained in:
avollkopf 2022-03-05 11:02:49 +01:00
parent 2370b6d124
commit bce0a0025b
4 changed files with 18 additions and 101 deletions

View file

@ -1 +1 @@
__version__ = "4.0.2.0.a12" __version__ = "4.0.2.0.a13"

View file

@ -16,78 +16,6 @@ from tabulate import tabulate
import sys, os import sys, os
from ..api.step import CBPiStep, StepMove, StepResult, StepState, CBPiFermentationStep 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: class FermentationController:
def __init__(self, cbpi): def __init__(self, cbpi):
@ -95,7 +23,6 @@ class FermentationController:
self.cbpi = cbpi self.cbpi = cbpi
self.logger = logging.getLogger(__name__) self.logger = logging.getLogger(__name__)
self.path = os.path.join(".", 'config', "fermenter_data.json") self.path = os.path.join(".", 'config', "fermenter_data.json")
#self._loop = asyncio.get_event_loop()
self.data = [] self.data = []
self.types = {} self.types = {}
self.steptypes = {} self.steptypes = {}
@ -150,9 +77,6 @@ class FermentationController:
async def load(self): 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: with open(self.path) as json_file:
data = json.load(json_file) data = json.load(json_file)
@ -230,7 +154,6 @@ class FermentationController:
def get_state(self): def get_state(self):
if self.data == []: if self.data == []:
#logging.info(self.data)
pass pass
return {"data": list(map(lambda x: x.to_dict(), self.data)), "types":self.get_types(), "steptypes":self.get_steptypes()} 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): def get_fermenter_steps(self):
if self.data == []: if self.data == []:
#logging.info(self.data)
pass pass
fermentersteps=[] fermentersteps=[]
steplist=list(map(lambda x: x.to_dict(), self.data)) 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)) logging.warning("Failed to create step instance %s - %s " % (item.id, e))
instance = None instance = None
step = FermenterStep(id=stepid, name=name, fermenter=fermenter, props=props, type=type, status=status, endtime=endtime, 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: try:
fermenter.steps = list(map(lambda old: step if old.id == step.id else old, fermenter.steps)) fermenter.steps = list(map(lambda old: step if old.id == step.id else old, fermenter.steps))
except Exception as e: except Exception as e:
logging.info(e) logging.info(e)
#logging.info(fermenter.steps)
self.save() self.save()
#logging.info("SAVEUPDATE")
self.push_update("fermenterstepupdate") self.push_update("fermenterstepupdate")
@ -481,7 +401,7 @@ class FermentationController:
await item.instance.start() await item.instance.start()
item.instance.running = True item.instance.running = True
item.instance.task = asyncio.get_event_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)) logging.info("{} started {}".format(item.name, id))
@ -576,20 +496,19 @@ class FermentationController:
if key == self.update_key: if key == self.update_key:
self.cbpi.ws.send(dict(topic=key, data=list(map(lambda item: item.to_dict(), self.data)))) 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: for item in self.data:
self.cbpi.push_update("cbpi/{}/{}".format(self.update_key,item.id), item.to_dict()) self.cbpi.push_update("cbpi/{}/{}".format(self.update_key,item.id), item.to_dict())
pass pass
else: else:
#logging.info("FERMENTERSTEPUPDATE {}".format(key))
fermentersteps=self.get_fermenter_steps() fermentersteps=self.get_fermenter_steps()
self.cbpi.ws.send(dict(topic=key, data=fermentersteps)) self.cbpi.ws.send(dict(topic=key, data=fermentersteps))
#not yet required and too much mqtt traffic for all steps # send mqtt update for active femrentersteps
#for fermenter in fermentersteps: for fermenter in fermentersteps:
# for step in fermenter['steps']: for step in fermenter['steps']:
# self.cbpi.push_update("cbpi/{}/{}/{}".format(key,fermenter['id'],step['id']), step) 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: async def call_action(self, id, action, parameter) -> None:
logging.info("FermenterStep Controller - call Action {} {}".format(id, action)) logging.info("FermenterStep Controller - call Action {} {}".format(id, action))
@ -600,7 +519,6 @@ class FermentationController:
except Exception as e: except Exception as e:
logging.error("FermenterStep Controller - Failed to call action on {} {} {}".format(id, action, 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): async def savetobook(self, fermenterid):
name = shortuuid.uuid() name = shortuuid.uuid()
path = os.path.join(".", 'config', "fermenterrecipes", "{}.yaml".format(name)) path = os.path.join(".", 'config', "fermenterrecipes", "{}.yaml".format(name))
@ -608,7 +526,7 @@ class FermentationController:
try: try:
brewname = fermenter.brewname brewname = fermenter.brewname
description = fermenter.description description = fermenter.description
# todo add escription at later point of time, once description has been added to fermenter dataclass
except: except:
brewname = "" brewname = ""
description = "" description = ""

View file

@ -10,7 +10,7 @@ logger = logging.getLogger(__name__)
try: try:
import RPi.GPIO as GPIO import RPi.GPIO as GPIO
except Exception: except Exception:
logger.error("Failed to load RPi.GPIO. Using Mock") logger.warning("Failed to load RPi.GPIO. Using Mock instead")
MockRPi = MagicMock() MockRPi = MagicMock()
modules = { modules = {
"RPi": MockRPi, "RPi": MockRPi,

View file

@ -50,11 +50,10 @@ setup(name='cbpi',
'colorama==0.4.4', 'colorama==0.4.4',
'psutil==5.9.0', 'psutil==5.9.0',
'cbpi4ui', 'cbpi4ui',
'importlib_metadata'] + ( 'importlib_metadata',
['RPi.GPIO==0.7.1'] if raspberrypi else [] ) + 'numpy==1.22.2',
(['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'] + (
(['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'] ), ['RPi.GPIO==0.7.1'] if raspberrypi else [] ),
dependency_links=[ dependency_links=[
'https://testpypi.python.org/pypi', 'https://testpypi.python.org/pypi',