mirror of
https://github.com/PiBrewing/craftbeerpi4.git
synced 2024-11-21 22:48:16 +01:00
step logic extended
This commit is contained in:
parent
521f800236
commit
77871010a1
7 changed files with 399 additions and 665 deletions
File diff suppressed because it is too large
Load diff
|
@ -1,11 +1,64 @@
|
||||||
|
import time
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
|
||||||
class Step(object):
|
class Step(object):
|
||||||
|
|
||||||
def __init__(self, key=None, cbpi=None):
|
__dirty = False
|
||||||
self.cbpi = cbpi
|
managed_fields = []
|
||||||
self.id = key
|
_interval = 0.1
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.logger = logging.getLogger(__name__)
|
||||||
|
for a in kwargs:
|
||||||
|
super(Step, self).__setattr__(a, kwargs.get(a))
|
||||||
|
self.id = kwargs.get("id")
|
||||||
|
self.stop = False
|
||||||
|
self.start = time.time()
|
||||||
|
|
||||||
|
def running(self):
|
||||||
|
if self.stop is False:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
async def _run(self):
|
||||||
|
i = 0
|
||||||
|
while i < 5:
|
||||||
|
try:
|
||||||
|
await self.run()
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
|
#logging.exception("Step Error")
|
||||||
|
print("INTER",self._interval)
|
||||||
|
await asyncio.sleep(self._interval)
|
||||||
|
i = i + 1
|
||||||
|
if self.is_dirty():
|
||||||
|
# Now we have to store the managed props
|
||||||
|
self.reset_dirty()
|
||||||
|
|
||||||
async def run(self):
|
async def run(self):
|
||||||
|
print("NOTING IMPLEMENTED")
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def reset(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def is_dirty(self):
|
||||||
|
return self.__dirty
|
||||||
|
|
||||||
|
def reset_dirty(self):
|
||||||
|
self.__dirty = False
|
||||||
|
|
||||||
|
def __setattr__(self, name, value):
|
||||||
|
if name != "_Step__dirty" and name in self.managed_fields:
|
||||||
|
self.__dirty = True
|
||||||
|
super(Step, self).__setattr__(name, value)
|
||||||
|
else:
|
||||||
|
super(Step, self).__setattr__(name, value)
|
|
@ -103,11 +103,10 @@ class PluginController():
|
||||||
self.cbpi.kettle.types[name] = {"class": clazz, "config": self._parse_props(clazz)}
|
self.cbpi.kettle.types[name] = {"class": clazz, "config": self._parse_props(clazz)}
|
||||||
|
|
||||||
if issubclass(clazz, Step):
|
if issubclass(clazz, Step):
|
||||||
print("NAME", name)
|
self.cbpi.step.types[name] = self._parse_props(clazz)
|
||||||
self.cbpi.step.types[name] = {"class": clazz, "config": self._parse_props(clazz)}
|
print(self.cbpi.step.types)
|
||||||
|
#if issubclass(clazz, CBPiExtension):
|
||||||
if issubclass(clazz, CBPiExtension):
|
# self.c = clazz(self.cbpi)
|
||||||
self.c = clazz(self.cbpi)
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_props(self, cls):
|
def _parse_props(self, cls):
|
||||||
|
@ -146,4 +145,5 @@ class PluginController():
|
||||||
key = method.__getattribute__("key")
|
key = method.__getattribute__("key")
|
||||||
parameters = method.__getattribute__("parameters")
|
parameters = method.__getattribute__("parameters")
|
||||||
result["actions"].append({"method": method_name, "label": key, "parameters": parameters})
|
result["actions"].append({"method": method_name, "label": key, "parameters": parameters})
|
||||||
pprint(result, width=200)
|
pprint(result)
|
||||||
|
return result
|
|
@ -6,6 +6,7 @@ class StepController():
|
||||||
|
|
||||||
def __init__(self, cbpi):
|
def __init__(self, cbpi):
|
||||||
self.cbpi = cbpi
|
self.cbpi = cbpi
|
||||||
|
self.current_task = None
|
||||||
self.types = {}
|
self.types = {}
|
||||||
self.steps = {
|
self.steps = {
|
||||||
1: dict(name="S1", config=dict(time=1), type="CustomStep", state=None),
|
1: dict(name="S1", config=dict(time=1), type="CustomStep", state=None),
|
||||||
|
@ -34,21 +35,45 @@ class StepController():
|
||||||
self.start()
|
self.start()
|
||||||
|
|
||||||
@on_event("step/reset")
|
@on_event("step/reset")
|
||||||
def handle_rest(self, topic, **kwargs):
|
def handle_reset(self, topic, **kwargs):
|
||||||
|
if self.current_step is not None:
|
||||||
|
self.current_task.cancel()
|
||||||
|
self.current_step.reset()
|
||||||
|
print("rESeT", self.current_step.id, self.steps)
|
||||||
|
self.steps[self.current_step.id]["state"] = None
|
||||||
|
self.current_step = None
|
||||||
|
self.current_task = None
|
||||||
|
self.start()
|
||||||
|
|
||||||
|
@on_event("step/stop")
|
||||||
|
def handle_stop(self, topic, **kwargs):
|
||||||
|
if self.current_step is not None:
|
||||||
|
self.current_step.stop()
|
||||||
|
|
||||||
for key, step in self.steps.items():
|
for key, step in self.steps.items():
|
||||||
step["state"] = None
|
step["state"] = None
|
||||||
|
|
||||||
self.current_step = Nonecd
|
self.current_step = None
|
||||||
|
|
||||||
@on_event("step/+/done")
|
@on_event("step/+/done")
|
||||||
def handle(self, topic, **kwargs):
|
def handle(self, topic, **kwargs):
|
||||||
self.start()
|
self.start()
|
||||||
|
|
||||||
def _step_done(self, task):
|
def _step_done(self, task):
|
||||||
self.steps[self.current_step.id]["state"] = "D"
|
|
||||||
step_id = self.current_step.id
|
if task.cancelled() == False:
|
||||||
self.current_step = None
|
self.steps[self.current_step.id]["state"] = "D"
|
||||||
self.cbpi.bus.fire("step/%s/done" % step_id)
|
step_id = self.current_step.id
|
||||||
|
self.current_step = None
|
||||||
|
self.cbpi.bus.fire("step/%s/done" % step_id)
|
||||||
|
|
||||||
|
def get_manged_fields_as_array(self, type_cfg):
|
||||||
|
print("tYPE", type_cfg)
|
||||||
|
result = []
|
||||||
|
for f in type_cfg.get("properties"):
|
||||||
|
result.append(f.get("name"))
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
|
|
||||||
|
@ -57,10 +82,14 @@ class StepController():
|
||||||
open_step = False
|
open_step = False
|
||||||
for key, step in self.steps.items():
|
for key, step in self.steps.items():
|
||||||
if step["state"] is None:
|
if step["state"] is None:
|
||||||
type = self.types.get(step["type"])
|
step_type = self.types["CustomStep"]
|
||||||
self.current_step = type["class"](key, self.cbpi)
|
print("----------")
|
||||||
task = loop.create_task(self.current_step.run())
|
print(step_type)
|
||||||
task.add_done_callback(self._step_done)
|
print("----------")
|
||||||
|
config = dict(cbpi = self.cbpi, id=key, name="Manuel", managed_fields=self.get_manged_fields_as_array(step_type))
|
||||||
|
self.current_step = step_type["class"](**config)
|
||||||
|
self.current_task = loop.create_task(self.current_step._run())
|
||||||
|
self.current_task.add_done_callback(self._step_done)
|
||||||
open_step = True
|
open_step = True
|
||||||
break
|
break
|
||||||
if open_step == False:
|
if open_step == False:
|
||||||
|
|
|
@ -51,7 +51,7 @@ class CraftBeerPi():
|
||||||
self.initializer = []
|
self.initializer = []
|
||||||
|
|
||||||
setup(self.app, self)
|
setup(self.app, self)
|
||||||
self.bus = EventBus(self.app.loop)
|
self.bus = EventBus(self.app.loop, self)
|
||||||
self.ws = WebSocket(self)
|
self.ws = WebSocket(self)
|
||||||
self.actor = ActorController(self)
|
self.actor = ActorController(self)
|
||||||
self.sensor = SensorController(self)
|
self.sensor = SensorController(self)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
import inspect
|
import inspect
|
||||||
import logging
|
import logging
|
||||||
|
import json
|
||||||
|
|
||||||
class EventBus(object):
|
class EventBus(object):
|
||||||
class Node(object):
|
class Node(object):
|
||||||
|
@ -58,8 +58,9 @@ class EventBus(object):
|
||||||
if clean_idx is not None:
|
if clean_idx is not None:
|
||||||
del content.parent._content[clean_idx]
|
del content.parent._content[clean_idx]
|
||||||
|
|
||||||
def __init__(self, loop):
|
def __init__(self, loop, cbpi):
|
||||||
self.logger = logging.getLogger(__name__)
|
self.logger = logging.getLogger(__name__)
|
||||||
|
self.cbpi = cbpi
|
||||||
self._root = self.Node()
|
self._root = self.Node()
|
||||||
self.registry = {}
|
self.registry = {}
|
||||||
self.docs = {}
|
self.docs = {}
|
||||||
|
@ -73,6 +74,7 @@ class EventBus(object):
|
||||||
def fire(self, topic: str, **kwargs) -> None:
|
def fire(self, topic: str, **kwargs) -> None:
|
||||||
self.logger.info("EMIT EVENT %s Data: %s", topic, kwargs)
|
self.logger.info("EMIT EVENT %s Data: %s", topic, kwargs)
|
||||||
|
|
||||||
|
#self.cbpi.ws.send(json.dumps(dict(topic=topic, data=dict(**kwargs))))
|
||||||
trx = dict(i=0)
|
trx = dict(i=0)
|
||||||
for e in self.iter_match(topic):
|
for e in self.iter_match(topic):
|
||||||
content_array = e
|
content_array = e
|
||||||
|
@ -91,7 +93,7 @@ class EventBus(object):
|
||||||
else:
|
else:
|
||||||
content_obj.method(**kwargs, topic = topic)
|
content_obj.method(**kwargs, topic = topic)
|
||||||
|
|
||||||
|
|
||||||
if content_obj.once is False:
|
if content_obj.once is False:
|
||||||
keep_idx.append(idx)
|
keep_idx.append(idx)
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,19 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
|
from core.api import Property
|
||||||
from core.api.step import Step
|
from core.api.step import Step
|
||||||
|
|
||||||
|
|
||||||
class CustomStep(Step):
|
class CustomStep(Step):
|
||||||
|
|
||||||
|
name = Property.Number(label="Test")
|
||||||
|
|
||||||
|
|
||||||
async def run(self):
|
async def run(self):
|
||||||
i = 0
|
self.name = "HELLO WORLD"
|
||||||
while i < 3:
|
#await asyncio.sleep(1)
|
||||||
await asyncio.sleep(1)
|
raise Exception("OH O")
|
||||||
print("RUN STEP")
|
print("RUN STEP", self.id, self.name, self.__dict__)
|
||||||
i = i + 1
|
|
||||||
|
|
||||||
|
|
||||||
def setup(cbpi):
|
def setup(cbpi):
|
||||||
|
|
Loading…
Reference in a new issue