diff --git a/.idea/dataSources.local.xml b/.idea/dataSources.local.xml
new file mode 100644
index 0000000..5d2e8dd
--- /dev/null
+++ b/.idea/dataSources.local.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ master_key
+ false
+ *:main
+
+
+
\ No newline at end of file
diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
new file mode 100644
index 0000000..52b9b2d
--- /dev/null
+++ b/.idea/dataSources.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ sqlite.xerial
+ true
+ org.sqlite.JDBC
+ jdbc:sqlite:$PROJECT_DIR$/craftbeerpi.db
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2.xml b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2.xml
new file mode 100644
index 0000000..d63ecaa
--- /dev/null
+++ b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2.xml
@@ -0,0 +1,317 @@
+
+
+
+
+
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ INTEGER|0
+ 1
+
+
+ 1
+ VARCHAR(80)|0
+
+
+ 2
+ VARCHAR(80)|0
+
+
+ 3
+ VARCHAR(3000)|0
+
+
+ id
+ 1
+
+
+ VARCHAR(50)|0
+ 1
+
+
+ 1
+ VARCHAR(255)|0
+
+
+ 2
+ VARCHAR(50)|0
+
+
+ 3
+ VARCHAR(255)|0
+
+
+ 4
+ VARCHAR(255)|0
+
+
+ name
+ 1
+
+
+ name
+ 1
+ sqlite_autoindex_config_1
+
+
+ INTEGER|0
+ 1
+
+
+ 1
+ VARCHAR(80)|0
+
+
+ id
+ 1
+
+
+ INTEGER|0
+ 1
+
+
+ 1
+ INTEGER(80)|0
+
+
+ 2
+ INTEGER|0
+
+
+ 3
+ VARCHAR(80)|0
+
+
+ 4
+ INTEGER(5)|0
+
+
+ 5
+ INTEGER(5)|0
+
+
+ 6
+ VARCHAR(3000)|0
+
+
+ id
+ 1
+
+
+ INTEGER|0
+ 1
+
+
+ 1
+ VARCHAR(80)|0
+
+
+ 2
+ VARCHAR(80)|0
+
+
+ 3
+ VARCHAR(10)|0
+
+
+ 4
+ VARCHAR(255)|0
+
+
+ 5
+ VARCHAR(50)|0
+
+
+ 6
+ VARCHAR(1000)|0
+
+
+ 7
+ VARCHAR(10)|0
+
+
+ 8
+ INTEGER|0
+
+
+ 9
+ INTEGER|0
+
+
+ 10
+ INTEGER|0
+
+
+ id
+ 1
+
+
+ INTEGER|0
+ 1
+
+
+ 1
+ VARCHAR(80)|0
+
+
+ 2
+ VARCHAR(80)|0
+
+
+ 3
+ VARCHAR(3000)|0
+
+
+ id
+ 1
+
+
+ text|0
+
+
+ 1
+ text|0
+
+
+ 2
+ text|0
+
+
+ 3
+ integer|0
+
+
+ 4
+ text|0
+
+
+ INTEGER|0
+ 1
+
+
+ 1
+ INTEGER|0
+
+
+ 2
+ VARCHAR(80)|0
+
+
+ 3
+ VARCHAR(100)|0
+
+
+ 4
+ VARCHAR(255)|0
+
+
+ 5
+ VARCHAR(1)|0
+
+
+ 6
+ INTEGER|0
+
+
+ 7
+ INTEGER|0
+
+
+ 8
+ VARCHAR(255)|0
+
+
+ 9
+ INTEGER|0
+
+
+ id
+ 1
+
+
+ INTEGER|0
+ 1
+
+
+ 1
+ VARCHAR(80)|0
+
+
+ 2
+ VARCHAR(80)|0
+
+
+ 3
+ VARCHAR(80)|0
+
+
+ 4
+ VARCHAR(80)|0
+
+
+ 5
+ VARCHAR(80)|0
+
+
+ 6
+ VARCHAR(10)|0
+
+
+ 7
+ VARCHAR(50)|0
+
+
+ 8
+ VARCHAR(1000)|0
+
+
+ 9
+ VARCHAR(10)|0
+
+
+ 10
+ INTEGER|0
+
+
+ id
+ 1
+
+
+ VARCHAR(3)|0
+ 1
+
+
+ 1
+ VARCHAR(80)|0
+ 1
+
+
+ 2
+ VARCHAR(100)|0
+ 1
+
+
+ language_code
+key
+ 1
+
+
+ language_code
+key
+ 1
+ sqlite_autoindex_translation_1
+
+
+
\ No newline at end of file
diff --git a/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata
new file mode 100644
index 0000000..bbf0401
Binary files /dev/null and b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata differ
diff --git a/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata.keystream b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata.keystream
new file mode 100644
index 0000000..08e7df1
Binary files /dev/null and b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata.keystream differ
diff --git a/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata.keystream.len b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata.keystream.len
new file mode 100644
index 0000000..1b1cb4d
Binary files /dev/null and b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata.keystream.len differ
diff --git a/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata.len b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata.len
new file mode 100644
index 0000000..1b1cb4d
Binary files /dev/null and b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata.len differ
diff --git a/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata_i b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata_i
new file mode 100644
index 0000000..12f3be4
Binary files /dev/null and b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata_i differ
diff --git a/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata_i.len b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata_i.len
new file mode 100644
index 0000000..1b1cb4d
Binary files /dev/null and b/.idea/dataSources/5067e7fe-480d-4433-bc40-f2d1c38362a2/_metadata_/metadata_i.len differ
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 964274c..11c41a2 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -1,7 +1,37 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -10,28 +40,151 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -39,9 +192,87 @@
+
+
+
+
+
+ 7//
+ 7/
+ 7
+ /
+ ///
+ ///7
+ ///77
+ ///777
+ ///7777
+ ///7777/
+ ///7777//
+ ///7777///
+ ///7777///7
+ ///7777///7|
+ ///7777///7||
+ ///7777///7|||
+ ///7777///7|||6
+ \n\n
+ \n\n
+ cpre
+ cpr
+ cp
+ c
+ co
+ core
+ .core
+ from.cbpi.
+ pr
+ p
+ print
+
+
+
+ .cbpi
+ from core.
+
+
+ $PROJECT_DIR$
+ $PROJECT_DIR$/core
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -83,6 +314,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -92,6 +445,8 @@
+
+
@@ -292,27 +647,49 @@
+
-
-
-
+
-
-
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -333,12 +710,266 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/config/config.yaml b/config/config.yaml
new file mode 100644
index 0000000..c1d358e
--- /dev/null
+++ b/config/config.yaml
@@ -0,0 +1 @@
+name: Manuel
\ No newline at end of file
diff --git a/core/__pycache__/cbpi.cpython-36.pyc b/core/__pycache__/cbpi.cpython-36.pyc
deleted file mode 100644
index a5406ff..0000000
Binary files a/core/__pycache__/cbpi.cpython-36.pyc and /dev/null differ
diff --git a/core/__pycache__/craftbeerpi.cpython-36.pyc b/core/__pycache__/craftbeerpi.cpython-36.pyc
new file mode 100644
index 0000000..bbb4638
Binary files /dev/null and b/core/__pycache__/craftbeerpi.cpython-36.pyc differ
diff --git a/core/__pycache__/plugin.cpython-36.pyc b/core/__pycache__/plugin.cpython-36.pyc
index e2fd4b0..6105439 100644
Binary files a/core/__pycache__/plugin.cpython-36.pyc and b/core/__pycache__/plugin.cpython-36.pyc differ
diff --git a/core/__pycache__/websocket.cpython-36.pyc b/core/__pycache__/websocket.cpython-36.pyc
index 561bf69..27ad858 100644
Binary files a/core/__pycache__/websocket.cpython-36.pyc and b/core/__pycache__/websocket.cpython-36.pyc differ
diff --git a/core/api/__pycache__/actor.cpython-36.pyc b/core/api/__pycache__/actor.cpython-36.pyc
deleted file mode 100644
index df979be..0000000
Binary files a/core/api/__pycache__/actor.cpython-36.pyc and /dev/null differ
diff --git a/core/api/actor.py b/core/api/actor.py
index 1f4e505..12cde68 100644
--- a/core/api/actor.py
+++ b/core/api/actor.py
@@ -1,8 +1,13 @@
+import logging
-class Actor():
+from core.api.extension import CBPiExtension
+from core.helper.utils import load_config as load
+logger = logging.getLogger(__file__)
- def __init__(self):
+class CBPiActor(CBPiExtension):
+
+ def __init__(self, cbpi):
self.id = "";
self.name = ""
diff --git a/core/api/extension.py b/core/api/extension.py
new file mode 100644
index 0000000..c67f3e0
--- /dev/null
+++ b/core/api/extension.py
@@ -0,0 +1,16 @@
+import logging
+
+from core.helper.utils import load_config as load
+logger = logging.getLogger(__file__)
+logging.basicConfig(level=logging.INFO)
+
+class CBPiExtension():
+
+ def load_config(self):
+
+
+ path = os.path.dirname(sys.modules[self.__class__.__module__].__file__)
+ try:
+ return load("%s/config.yaml" % path)
+ except:
+ logger.warning("Faild to load config %s/config.yaml" % path)
diff --git a/core/api/sensor.py b/core/api/sensor.py
index a9fd077..a804e52 100644
--- a/core/api/sensor.py
+++ b/core/api/sensor.py
@@ -1,4 +1,7 @@
-class Sensor():
+from core.api.extension import CBPiExtension
+
+
+class CBPiSensor(CBPiExtension):
def __init__(self):
self.id = "";
diff --git a/core/controller/__pycache__/actor_controller.cpython-36.pyc b/core/controller/__pycache__/actor_controller.cpython-36.pyc
index a500f8b..ae970a5 100644
Binary files a/core/controller/__pycache__/actor_controller.cpython-36.pyc and b/core/controller/__pycache__/actor_controller.cpython-36.pyc differ
diff --git a/core/controller/__pycache__/crud_controller.cpython-36.pyc b/core/controller/__pycache__/crud_controller.cpython-36.pyc
index 050551b..825563c 100644
Binary files a/core/controller/__pycache__/crud_controller.cpython-36.pyc and b/core/controller/__pycache__/crud_controller.cpython-36.pyc differ
diff --git a/core/controller/__pycache__/sensor_controller.cpython-36.pyc b/core/controller/__pycache__/sensor_controller.cpython-36.pyc
index 89bb99e..31131c9 100644
Binary files a/core/controller/__pycache__/sensor_controller.cpython-36.pyc and b/core/controller/__pycache__/sensor_controller.cpython-36.pyc differ
diff --git a/core/controller/__pycache__/system_controller.cpython-36.pyc b/core/controller/__pycache__/system_controller.cpython-36.pyc
index 4e5aa82..4c66f3c 100644
Binary files a/core/controller/__pycache__/system_controller.cpython-36.pyc and b/core/controller/__pycache__/system_controller.cpython-36.pyc differ
diff --git a/core/controller/actor_controller.py b/core/controller/actor_controller.py
index ed9127a..0cb1279 100644
--- a/core/controller/actor_controller.py
+++ b/core/controller/actor_controller.py
@@ -8,12 +8,29 @@ from core.http_endpoints.http_api import HttpAPI
from core.plugin import PluginAPI
-class ActorController(HttpAPI, CRUDController, PluginAPI):
+class ActorHttp(HttpAPI):
+ @request_mapping(path="/hallo", auth_required=False)
+ async def hello_world(self, request) -> web.Response:
+ print("HALLO")
+ return web.Response(status=200, text="OK")
+
+ @request_mapping(path="/{id}/on", auth_required=False)
+ async def http_on(self, request) -> web.Response:
+ """
+
+ :param request:
+ :return:
+ """
+ self.cbpi.bus.fire(event="actor/1/on", id=1, power=99)
+ return web.Response(status=204)
+
+
+
+class ActorController(ActorHttp, CRUDController, PluginAPI):
model = ActorModel
-
def __init__(self, cbpi):
super(ActorController, self).__init__(cbpi)
self.cbpi = cbpi
@@ -23,7 +40,6 @@ class ActorController(HttpAPI, CRUDController, PluginAPI):
self.types = {}
self.actors = {}
-
async def init(self):
await super(ActorController, self).init()
@@ -38,33 +54,27 @@ class ActorController(HttpAPI, CRUDController, PluginAPI):
print("CACHE", self.cache)
print("ACTORS", self.actors)
- @request_mapping(path="/{id}/on",auth_required=False)
- async def http_on(self, request) -> web.Response:
- self.cbpi.bus.fire(event="actor/1/on", id=1, power=99)
- return web.Response(status=204)
+
@on_event(topic="actor/+/on")
- def on(self, id, power=100) -> None:
+ def on(self, id, power=100, **kwargs) -> None:
print("ON-------------", id, power)
if id in self.actors:
i = self.actors[id]
i.on(power)
- @on_event(topic="actor/+/on")
- def on2(self, id, **kwargs) -> None:
+ @on_event(topic="actor/+/off")
+ def off(self, id, **kwargs) -> None:
+ """
+
+ :param id:
+ :param kwargs:
+ """
print("POWERED ON", id, kwargs)
- def register(self, name, clazz) -> None:
- '''
- Register a new actor type
- :param name: actor name
- :param clazz: actor class
- :return: None
- '''
- self._parse_props(clazz)
- self.types[name] = clazz
+
diff --git a/core/controller/crud_controller.py b/core/controller/crud_controller.py
index 7079969..92c3588 100644
--- a/core/controller/crud_controller.py
+++ b/core/controller/crud_controller.py
@@ -4,8 +4,8 @@ class CRUDController(object):
cache = {}
caching = True
- def __init__(self, core):
- self.cbpi = core
+ def __init__(self, cbpi):
+ self.cbpi = cbpi
self.cache = {}
async def init(self):
@@ -54,7 +54,7 @@ class CRUDController(object):
except:
pass
m = await self.model.update(**data)
- #self.core.push_ws("UPDATE_%s" % self.key, m)
+ #self.cbpi.push_ws("UPDATE_%s" % self.key, m)
await self._post_update_callback(m)
if self.caching is True:
@@ -77,10 +77,10 @@ class CRUDController(object):
except Exception as e:
pass
- #self.core.push("DELETE_%s" % self.key, id)
+ #self.cbpi.push("DELETE_%s" % self.key, id)
async def delete_all(self):
self.model.delete_all()
if self.caching is True:
self.cache = {}
- #self.core.push_ws("DELETE_ALL_%s" % self.key, None)
\ No newline at end of file
+ #self.cbpi.push_ws("DELETE_ALL_%s" % self.key, None)
\ No newline at end of file
diff --git a/core/controller/sensor_controller.py b/core/controller/sensor_controller.py
index 32f6b41..fe5710b 100644
--- a/core/controller/sensor_controller.py
+++ b/core/controller/sensor_controller.py
@@ -13,9 +13,9 @@ class SensorController(CRUDController, HttpAPI):
model = SensorModel
- def __init__(self, core):
- self.core = core
- self.core.register(self, "/sensor")
+ def __init__(self, cbpi):
+ self.cbpi = cbpi
+ self.cbpi.register(self, "/sensor")
self.service = self
self.sensors = {"S1": "S1", "S2": "S2"}
diff --git a/core/controller/system_controller.py b/core/controller/system_controller.py
index d4d7031..43a5c1f 100644
--- a/core/controller/system_controller.py
+++ b/core/controller/system_controller.py
@@ -7,14 +7,14 @@ from core.api.decorator import request_mapping
class SystemController():
name = "Manuel"
- def __init__(self, core):
- self.core = core
- self.service = core.actor
- self.core.register(self, "/system")
+ def __init__(self, cbpi):
+ self.cbpi = cbpi
+ self.service = cbpi.actor
+ self.cbpi.register(self, "/system")
@request_mapping("/jobs", method="GET", name="get_jobs", auth_required=True)
def get_all_jobs(self, request):
- scheduler = get_scheduler_from_app(self.core.app)
+ scheduler = get_scheduler_from_app(self.cbpi.app)
print(scheduler.active_count, scheduler.pending_limit)
for j in scheduler:
print(j)
diff --git a/core/cbpi.py b/core/craftbeerpi.py
similarity index 93%
rename from core/cbpi.py
rename to core/craftbeerpi.py
index a1a2130..442d691 100644
--- a/core/cbpi.py
+++ b/core/craftbeerpi.py
@@ -12,13 +12,11 @@ from aiohttp_swagger import setup_swagger
from aiojobs.aiohttp import setup, get_scheduler_from_app
from core.controller.actor_controller import ActorController
+from core.controller.sensor_controller import SensorController
from core.controller.system_controller import SystemController
from core.database.model import DBModel
from core.eventbus import EventBus
-
-
from core.http_endpoints.http_login import Login
-from core.controller.sensor_controller import SensorController
from core.websocket import WebSocket
logger = logging.getLogger(__file__)
@@ -26,7 +24,6 @@ logging.basicConfig(level=logging.INFO)
class CraftBeerPi():
-
def __init__(self):
logger.info("Init CraftBeerPI")
@@ -44,7 +41,7 @@ class CraftBeerPi():
def register_events(self, obj):
- for method in [getattr(obj, f) for f in dir(obj) if callable(getattr(obj, f)) and hasattr(getattr(obj, f),"eventbus")]:
+ for method in [getattr(obj, f) for f in dir(obj) if callable(getattr(obj, f)) and hasattr(getattr(obj, f), "eventbus")]:
print(method.__getattribute__("topic"), method)
doc = None
@@ -53,14 +50,13 @@ class CraftBeerPi():
doc["topic"] = method.__getattribute__("topic")
self.bus.register(method.__getattribute__("topic"), method, doc)
-
def register_background_task(self, obj):
for method in [getattr(obj, f) for f in dir(obj) if callable(getattr(obj, f)) and hasattr(getattr(obj, f), "background_task")]:
name = method.__getattribute__("name")
interval = method.__getattribute__("interval")
async def job_loop(app, name, interval, method):
- logger.info("Start Background Task %s Interval %s Method %s" % (name,interval, method))
+ logger.info("Start Background Task %s Interval %s Method %s" % (name, interval, method))
while True:
logger.info("Execute Task %s - interval(%s second(s)" % (name, interval))
await asyncio.sleep(interval)
@@ -70,16 +66,13 @@ class CraftBeerPi():
scheduler = get_scheduler_from_app(self.app)
await scheduler.spawn(job_loop(self.app, name, interval, method))
-
self.app.on_startup.append(spawn_job)
-
-
def register_ws(self, obj):
if self.ws is None:
return
- for method in [getattr(obj, f) for f in dir(obj) if callable(getattr(obj, f)) and hasattr(getattr(obj, f),"ws")]:
+ for method in [getattr(obj, f) for f in dir(obj) if callable(getattr(obj, f)) and hasattr(getattr(obj, f), "ws")]:
self.ws.add_callback(method, method.__getattribute__("key"))
def register(self, obj, subapp=None):
@@ -88,13 +81,13 @@ class CraftBeerPi():
self.register_ws(obj)
self.register_background_task(obj)
-
def register_http_endpoints(self, obj, subapp=None):
routes = []
for method in [getattr(obj, f) for f in dir(obj) if callable(getattr(obj, f)) and hasattr(getattr(obj, f), "route")]:
-
http_method = method.__getattribute__("method")
path = method.__getattribute__("path")
+ class_name = method.__self__.__class__.__name__
+ logger.info("Register Endpoint : %s.%s %s %s%s " % (class_name, method.__name__, http_method, subapp, path))
def add_post():
routes.append(web.post(method.__getattribute__("path"), method))
@@ -107,6 +100,7 @@ class CraftBeerPi():
def add_put():
routes.append(web.put(path, method))
+
switcher = {
"POST": add_post,
"GET": add_get,
@@ -131,7 +125,6 @@ class CraftBeerPi():
my_module = importlib.import_module(extension)
my_module.setup(self)
-
def start(self):
async def init_database(app):
@@ -140,13 +133,8 @@ class CraftBeerPi():
async def init_controller(app):
await self.actor.init()
-
-
-
self.app.on_startup.append(init_database)
self.app.on_startup.append(self._load_extensions)
self.app.on_startup.append(init_controller)
setup_swagger(self.app)
web.run_app(self.app)
-
-
diff --git a/core/database/__pycache__/model.cpython-36.pyc b/core/database/__pycache__/model.cpython-36.pyc
index b12c5d4..267ca37 100644
Binary files a/core/database/__pycache__/model.cpython-36.pyc and b/core/database/__pycache__/model.cpython-36.pyc differ
diff --git a/core/database/__pycache__/orm_framework.cpython-36.pyc b/core/database/__pycache__/orm_framework.cpython-36.pyc
new file mode 100644
index 0000000..a303d09
Binary files /dev/null and b/core/database/__pycache__/orm_framework.cpython-36.pyc differ
diff --git a/core/database/model.py b/core/database/model.py
index f1c8894..87e9e74 100644
--- a/core/database/model.py
+++ b/core/database/model.py
@@ -1,156 +1,13 @@
-import json
-
-import aiosqlite
-
-TEST_DB = "./craftbeerpi.db"
-
-
-
-class DBModel(object):
-
- __priamry_key__ = "id"
- __as_array__ = False
- __order_by__ = None
- __json_fields__ = []
-
- def __init__(self, args):
-
- self.__setattr__(self.__priamry_key__, args[self.__priamry_key__])
- for f in self.__fields__:
- if f in self.__json_fields__:
- if args[f] is not None:
-
- if isinstance(args[f], dict) or isinstance(args[f], list):
- self.__setattr__(f, args[f])
- else:
- self.__setattr__(f, json.loads(args[f]))
- else:
- self.__setattr__(f, None)
- else:
- print(f,args[f])
- self.__setattr__(f, args[f])
-
- @classmethod
- async def test_connection(self):
-
- print("CREATE DATABSE")
- async with aiosqlite.connect(TEST_DB) as db:
- print("DB OK")
- assert isinstance(db, aiosqlite.Connection)
- qry = open('./core/sql/create_table_user.sql', 'r').read()
- cursor = await db.executescript(qry)
-
-
-
-
-
- @classmethod
- async def get_all(cls):
- print("GET ALL")
- if cls.__as_array__ is True:
- result = []
- else:
- result = {}
- async with aiosqlite.connect(TEST_DB) as db:
-
- if cls.__order_by__ is not None:
- sql = "SELECT * FROM %s ORDER BY %s.'%s'" % (cls.__table_name__,cls.__table_name__,cls.__order_by__)
- else:
- sql = "SELECT * FROM %s" % cls.__table_name__
-
- db.row_factory = aiosqlite.Row
- async with db.execute(sql) as cursor:
- async for row in cursor:
- if cls.__as_array__ is True:
- result.append(cls(row))
- else:
- result[row[0]] = cls(row)
- await cursor.close()
-
- return result
-
- @classmethod
- async def get_one(cls, id):
- async with aiosqlite.connect(TEST_DB) as db:
- db.row_factory = aiosqlite.Row
- async with db.execute("SELECT * FROM %s WHERE %s = ?" % (cls.__table_name__, cls.__priamry_key__), (id,)) as cursor:
- row = await cursor.fetchone()
- if row is not None:
- return cls(row)
- else:
- return None
-
- @classmethod
- async def delete(cls, id):
- async with aiosqlite.connect(TEST_DB) as db:
- await db.execute("DELETE FROM %s WHERE %s = ? " % (cls.__table_name__, cls.__priamry_key__), (id,))
- await db.commit()
-
- @classmethod
- async def insert(cls, **kwargs):
-
- async with aiosqlite.connect(TEST_DB) as db:
- if cls.__priamry_key__ is not None and cls.__priamry_key__ in kwargs:
- query = "INSERT INTO %s (%s, %s) VALUES (?, %s)" % (
- cls.__table_name__,
- cls.__priamry_key__,
- ', '.join("'%s'" % str(x) for x in cls.__fields__),
- ', '.join(['?'] * len(cls.__fields__)))
- data = ()
- data = data + (kwargs.get(cls.__priamry_key__),)
- for f in cls.__fields__:
- if f in cls.__json_fields__:
- data = data + (json.dumps(kwargs.get(f)),)
- else:
- data = data + (kwargs.get(f),)
- else:
-
- query = 'INSERT INTO %s (%s) VALUES (%s)' % (
- cls.__table_name__,
- ', '.join("'%s'" % str(x) for x in cls.__fields__),
- ', '.join(['?'] * len(cls.__fields__)))
-
- data = ()
- for f in cls.__fields__:
- if f in cls.__json_fields__:
- data = data + (json.dumps(kwargs.get(f)),)
- else:
- data = data + (kwargs.get(f),)
-
- print(query, data)
- cursor = await db.execute(query, data)
- await db.commit()
-
- i = cursor.lastrowid
- kwargs["id"] = i
-
- return cls(kwargs)
-
- @classmethod
- async def update(cls, **kwargs):
- async with aiosqlite.connect(TEST_DB) as db:
- query = 'UPDATE %s SET %s WHERE %s = ?' % (cls.__table_name__, ', '.join("'%s' = ?" % str(x) for x in cls.__fields__), cls.__priamry_key__)
-
- data = ()
- for f in cls.__fields__:
- if f in cls.__json_fields__:
- data = data + (json.dumps(kwargs.get(f)),)
- else:
- data = data + (kwargs.get(f),)
-
- data = data + (kwargs.get(cls.__priamry_key__),)
- cursor = await db.execute(query, data)
- await db.commit()
- return cls(kwargs)
+from core.database.orm_framework import DBModel
class ActorModel(DBModel):
- __fields__ = ["name","type","config"]
+ __fields__ = ["name", "type", "config"]
__table_name__ = "actor"
__json_fields__ = ["config"]
class SensorModel(DBModel):
- __fields__ = ["name","type", "config"]
+ __fields__ = ["name", "type", "config"]
__table_name__ = "sensor"
- __json_fields__ = ["config"]
\ No newline at end of file
+ __json_fields__ = ["config"]
diff --git a/core/database/orm_framework.py b/core/database/orm_framework.py
index e69de29..11500eb 100644
--- a/core/database/orm_framework.py
+++ b/core/database/orm_framework.py
@@ -0,0 +1,142 @@
+import json
+
+import aiosqlite
+
+# Thats the name of the database file
+TEST_DB = "./craftbeerpi.db"
+
+
+
+class DBModel(object):
+ __priamry_key__ = "id"
+ __as_array__ = False
+ __order_by__ = None
+ __json_fields__ = []
+
+ def __init__(self, args):
+
+ self.__setattr__(self.__priamry_key__, args[self.__priamry_key__])
+ for f in self.__fields__:
+ if f in self.__json_fields__:
+ if args[f] is not None:
+
+ if isinstance(args[f], dict) or isinstance(args[f], list):
+ self.__setattr__(f, args[f])
+ else:
+ self.__setattr__(f, json.loads(args[f]))
+ else:
+ self.__setattr__(f, None)
+ else:
+
+ self.__setattr__(f, args[f])
+
+ @classmethod
+ async def test_connection(self):
+
+ print("CREATE DATABSE")
+ async with aiosqlite.connect(TEST_DB) as db:
+
+ assert isinstance(db, aiosqlite.Connection)
+ qry = open('./core/sql/create_table_user.sql', 'r').read()
+ cursor = await db.executescript(qry)
+
+ @classmethod
+ async def get_all(cls):
+ print("GET ALL")
+ if cls.__as_array__ is True:
+ result = []
+ else:
+ result = {}
+ async with aiosqlite.connect(TEST_DB) as db:
+
+ if cls.__order_by__ is not None:
+ sql = "SELECT * FROM %s ORDER BY %s.'%s'" % (cls.__table_name__, cls.__table_name__, cls.__order_by__)
+ else:
+ sql = "SELECT * FROM %s" % cls.__table_name__
+
+ db.row_factory = aiosqlite.Row
+ async with db.execute(sql) as cursor:
+ async for row in cursor:
+ if cls.__as_array__ is True:
+ result.append(cls(row))
+ else:
+ result[row[0]] = cls(row)
+ await cursor.close()
+
+ return result
+
+ @classmethod
+ async def get_one(cls, id):
+ async with aiosqlite.connect(TEST_DB) as db:
+ db.row_factory = aiosqlite.Row
+ async with db.execute("SELECT * FROM %s WHERE %s = ?" % (cls.__table_name__, cls.__priamry_key__), (id,)) as cursor:
+ row = await cursor.fetchone()
+ if row is not None:
+ return cls(row)
+ else:
+ return None
+
+ @classmethod
+ async def delete(cls, id):
+ async with aiosqlite.connect(TEST_DB) as db:
+ await db.execute("DELETE FROM %s WHERE %s = ? " % (cls.__table_name__, cls.__priamry_key__), (id,))
+ await db.commit()
+
+ @classmethod
+ async def insert(cls, **kwargs):
+
+ async with aiosqlite.connect(TEST_DB) as db:
+ if cls.__priamry_key__ is not None and cls.__priamry_key__ in kwargs:
+ query = "INSERT INTO %s (%s, %s) VALUES (?, %s)" % (
+ cls.__table_name__,
+ cls.__priamry_key__,
+ ', '.join("'%s'" % str(x) for x in cls.__fields__),
+ ', '.join(['?'] * len(cls.__fields__)))
+ data = ()
+ data = data + (kwargs.get(cls.__priamry_key__),)
+ for f in cls.__fields__:
+ if f in cls.__json_fields__:
+ data = data + (json.dumps(kwargs.get(f)),)
+ else:
+ data = data + (kwargs.get(f),)
+ else:
+
+ query = 'INSERT INTO %s (%s) VALUES (%s)' % (
+ cls.__table_name__,
+ ', '.join("'%s'" % str(x) for x in cls.__fields__),
+ ', '.join(['?'] * len(cls.__fields__)))
+
+ data = ()
+ for f in cls.__fields__:
+ if f in cls.__json_fields__:
+ data = data + (json.dumps(kwargs.get(f)),)
+ else:
+ data = data + (kwargs.get(f),)
+
+ print(query, data)
+ cursor = await db.execute(query, data)
+ await db.commit()
+
+ i = cursor.lastrowid
+ kwargs["id"] = i
+
+ return cls(kwargs)
+
+ @classmethod
+ async def update(cls, **kwargs):
+ async with aiosqlite.connect(TEST_DB) as db:
+ query = 'UPDATE %s SET %s WHERE %s = ?' % (cls.__table_name__, ', '.join("'%s' = ?" % str(x) for x in cls.__fields__), cls.__priamry_key__)
+
+ data = ()
+ for f in cls.__fields__:
+ if f in cls.__json_fields__:
+ data = data + (json.dumps(kwargs.get(f)),)
+ else:
+ data = data + (kwargs.get(f),)
+
+ data = data + (kwargs.get(cls.__priamry_key__),)
+ cursor = await db.execute(query, data)
+ await db.commit()
+ return cls(kwargs)
+
+
diff --git a/core/extension/dummy/__init__.py b/core/extension/dummy/__init__.py
index e13f96d..242015b 100644
--- a/core/extension/dummy/__init__.py
+++ b/core/extension/dummy/__init__.py
@@ -1,14 +1,13 @@
from core.database.model import ActorModel
from core.api.decorator import action, background_task
from core.api.property import Property
-print("##################")
-from core.api.actor import Actor
+
+from core.api.actor import CBPiActor
import logging
-class MyActor(Actor):
-
+class MyActor(CBPiActor):
name = Property.Number(label="Test")
name1 = Property.Text(label="Test")
@@ -20,7 +19,7 @@ class MyActor(Actor):
@action(key="name", parameters={})
def myAction(self):
- print("HALLO")
+ pass
def state(self):
super().state()
@@ -31,13 +30,18 @@ class MyActor(Actor):
def on(self, power=100):
super().on(power)
- def __init__(self):
- pass
+ def __init__(self,cbpi=None):
- def __init__(self, core=None):
- self.logger = logging.getLogger(__name__)
- self.logger.info("WOOHOO MY ACTOR")
- self.core = None
+ if cbpi is None:
+ return
+
+ self.cfg = self.load_config()
+ print(self.cfg)
+ self.logger = logging.getLogger(__file__)
+ logging.basicConfig(level=logging.INFO)
+
+ self.logger.info("########WOOHOO MY ACTOR")
+ self.cbpi = cbpi
def setup(cbpi):
diff --git a/core/extension/dummy/__pycache__/__init__.cpython-36.pyc b/core/extension/dummy/__pycache__/__init__.cpython-36.pyc
index 0a07862..3cf58a6 100644
Binary files a/core/extension/dummy/__pycache__/__init__.cpython-36.pyc and b/core/extension/dummy/__pycache__/__init__.cpython-36.pyc differ
diff --git a/core/extension/dummy/config.yaml b/core/extension/dummy/config.yaml
new file mode 100644
index 0000000..a356541
--- /dev/null
+++ b/core/extension/dummy/config.yaml
@@ -0,0 +1 @@
+name: Maneul
\ No newline at end of file
diff --git a/core/helper/__pycache__/jsondump.cpython-36.pyc b/core/helper/__pycache__/jsondump.cpython-36.pyc
index d5e9f2c..573acf4 100644
Binary files a/core/helper/__pycache__/jsondump.cpython-36.pyc and b/core/helper/__pycache__/jsondump.cpython-36.pyc differ
diff --git a/core/helper/__pycache__/utils.cpython-36.pyc b/core/helper/__pycache__/utils.cpython-36.pyc
new file mode 100644
index 0000000..35907cb
Binary files /dev/null and b/core/helper/__pycache__/utils.cpython-36.pyc differ
diff --git a/core/helper/utils.py b/core/helper/utils.py
new file mode 100644
index 0000000..eb0bc36
--- /dev/null
+++ b/core/helper/utils.py
@@ -0,0 +1,8 @@
+import yaml
+
+
+def load_config(fname):
+ with open(fname, 'rt') as f:
+ data = yaml.load(f)
+ # TODO: add config validation
+ return data
\ No newline at end of file
diff --git a/core/http_endpoints/__pycache__/http_api.cpython-36.pyc b/core/http_endpoints/__pycache__/http_api.cpython-36.pyc
index 477fda1..58170c2 100644
Binary files a/core/http_endpoints/__pycache__/http_api.cpython-36.pyc and b/core/http_endpoints/__pycache__/http_api.cpython-36.pyc differ
diff --git a/core/http_endpoints/__pycache__/http_login.cpython-36.pyc b/core/http_endpoints/__pycache__/http_login.cpython-36.pyc
index ec92fba..afd03a8 100644
Binary files a/core/http_endpoints/__pycache__/http_login.cpython-36.pyc and b/core/http_endpoints/__pycache__/http_login.cpython-36.pyc differ
diff --git a/core/http_endpoints/http_api.py b/core/http_endpoints/http_api.py
index e91a3c1..84e5f40 100644
--- a/core/http_endpoints/http_api.py
+++ b/core/http_endpoints/http_api.py
@@ -7,10 +7,10 @@ from core.helper.jsondump import json_dumps
class HttpAPI():
- def __init__(self, core):
+ def __init__(self,cbpi):
self.logger = logging.getLogger(__name__)
self.logger.info("WOOHOO MY ACTOR")
- self.cbpi = core
+ self.cbpi =cbpi
@request_mapping(path="/", auth_required=False)
async def http_get_all(self, request):
diff --git a/core/http_endpoints/http_login.py b/core/http_endpoints/http_login.py
index 8b3d48b..557add5 100644
--- a/core/http_endpoints/http_login.py
+++ b/core/http_endpoints/http_login.py
@@ -1,21 +1,31 @@
+import pathlib
+
from aiohttp import web
from aiohttp_auth import auth
+from core.api.decorator import request_mapping
+from core.helper.utils import load_config
+
+
class Login():
- def __init__(self, core):
- core.app.router.add_route('POST', '/login', self.login_view)
- core.app.router.add_route('GET', '/logout', self.logout_view)
+ def __init__(self,cbpi):
+ self.cbpi = cbpi
+ self.cbpi.register(self)
+ cfg = load_config(str(pathlib.Path('.') / 'config' / 'config.yaml'))
+
+ print("######", cfg)
self.db = {'user': 'password', 'super_user': 'super_password'}
- @auth.auth_required
+ @request_mapping(path="/logout", name="Logout", method="GET", auth_required=True)
async def logout_view(self, request):
await auth.forget(request)
return web.Response(body='OK'.encode('utf-8'))
+ @request_mapping(path="/login",name="Login", method="POST", auth_required=False)
async def login_view(self, request):
params = await request.post()
- print("HALLO LOGIN")
+
print(params.get('username', None), params.get('password', None))
user = params.get('username', None)
if (user in self.db and
diff --git a/core/mqtt/mqtt.py b/core/mqtt/mqtt.py
index 7c7c47b..7b8b717 100644
--- a/core/mqtt/mqtt.py
+++ b/core/mqtt/mqtt.py
@@ -8,7 +8,7 @@ from core.mqtt_matcher import MQTTMatcher
class MQTT():
- def __init__(self, core):
+ def __init__(self,cbpi):
self.config = {
'listeners': {
@@ -30,16 +30,16 @@ class MQTT():
},
'auth': {
'allow-anonymous': True,
- 'password-file': '/Users/manuelfritsch/github/aio_sample/core/user.txt'
+ 'password-file': '/Users/manuelfritsch/github/aio_sample.cbpi/user.txt'
}
}
- self.core = core
+ self.cbpi = cbpi
self.broker = Broker(self.config, plugin_namespace="hbmqtt.broker.plugins")
self.client = MQTTClient()
self.matcher = MQTTMatcher()
self.mqtt_methods = {"test": self.ok_msg, "$SYS/broker/#": self.sysmsg}
- self.core.app.on_startup.append(self.start_broker)
+ self.cbpi.app.on_startup.append(self.start_broker)
self.count = 0
def sysmsg(self, msg):
@@ -52,7 +52,7 @@ class MQTT():
def publish(self, topic, message):
print("PUSH NOW", topic)
- self.core.app.loop.create_task(self.client.publish(topic, str.encode(message), QOS_0))
+ self.cbpi.app.loop.create_task(self.client.publish(topic, str.encode(message), QOS_0))
def register_callback(self, func: Callable, topic) -> None:
diff --git a/core/plugin.py b/core/plugin.py
index cfdab18..4789dc3 100644
--- a/core/plugin.py
+++ b/core/plugin.py
@@ -4,7 +4,15 @@ from core.api.property import Property
class PluginAPI():
-
+ def register(self, name, clazz) -> None:
+ '''
+ Register a new actor type
+ :param name: actor name
+ :param clazz: actor class
+ :return: None
+ '''
+ self._parse_props(clazz)
+ self.types[name] = clazz
def _parse_props(self, cls):
@@ -12,7 +20,6 @@ class PluginAPI():
result = {"name": name, "class": cls, "properties": [], "actions": []}
-
tmpObj = cls()
members = [attr for attr in dir(tmpObj) if not callable(getattr(tmpObj, attr)) and not attr.startswith("__")]
for m in members:
@@ -39,8 +46,8 @@ class PluginAPI():
result["properties"].append({"name": m, "label": t.label, "type": "kettle", "configurable": t.configurable, "description": t.description})
for method_name, method in cls.__dict__.items():
- if hasattr(method, "action"):
- key = method.__getattribute__("key")
- parameters = method.__getattribute__("parameters")
- result["actions"].append({"method": method_name, "label": key, "parameters": parameters})
- pprint(result, width=200)
\ No newline at end of file
+ if hasattr(method, "action"):
+ key = method.__getattribute__("key")
+ parameters = method.__getattribute__("parameters")
+ result["actions"].append({"method": method_name, "label": key, "parameters": parameters})
+ pprint(result, width=200)
diff --git a/core/websocket.py b/core/websocket.py
index 0157d37..ec74d63 100644
--- a/core/websocket.py
+++ b/core/websocket.py
@@ -11,12 +11,12 @@ from typing import Iterable, Callable
class WebSocket:
- def __init__(self, core) -> None:
- self.core = core
+ def __init__(self, cbpi) -> None:
+ self.cbpi = cbpi
self._callbacks = defaultdict(set)
self._clients = weakref.WeakSet()
self.logger = logging.getLogger(__name__)
- self.core.app.add_routes([web.get('/ws', self.websocket_handler)])
+ self.cbpi.app.add_routes([web.get('/ws', self.websocket_handler)])
def add_callback(self, func: Callable, event: str) -> None:
self._callbacks[event].add(func)
@@ -51,7 +51,7 @@ class WebSocket:
- self.core.bus.fire(msg_obj["topic"], id=1, power=22)
+ self.cbpi.bus.fire(msg_obj["topic"], id=1, power=22)
#await self.fire(msg_obj["key"], ws, msg)
#await ws.send_str(msg.data)
diff --git a/craftbeerpi.db b/craftbeerpi.db
index eb7b074..4ee5d9a 100644
Binary files a/craftbeerpi.db and b/craftbeerpi.db differ
diff --git a/logs/first_logfile2.log b/logs/first_logfile2.log
index cb67ea3..c4032f1 100644
--- a/logs/first_logfile2.log
+++ b/logs/first_logfile2.log
@@ -1 +1,15 @@
-2018-11-01 19:49:28,690,1,WOOHO
+2018-11-01 21:25:19,670,1,WOOHO
+2018-11-01 21:25:20,673,1,WOOHO
+2018-11-01 21:25:21,677,1,WOOHO
+2018-11-01 21:25:22,682,1,WOOHO
+2018-11-01 21:25:23,686,1,WOOHO
+2018-11-01 21:25:24,690,1,WOOHO
+2018-11-01 21:25:25,693,1,WOOHO
+2018-11-01 21:25:26,698,1,WOOHO
+2018-11-01 21:25:27,702,1,WOOHO
+2018-11-01 21:25:28,707,1,WOOHO
+2018-11-01 21:25:29,710,1,WOOHO
+2018-11-01 21:25:30,713,1,WOOHO
+2018-11-01 21:25:31,715,1,WOOHO
+2018-11-01 21:25:32,719,1,WOOHO
+2018-11-01 21:25:33,723,1,WOOHO
diff --git a/logs/first_logfile2.log.2018-11-01_17-21 b/logs/first_logfile2.log.2018-11-01_17-21
deleted file mode 100644
index 78e4ad5..0000000
--- a/logs/first_logfile2.log.2018-11-01_17-21
+++ /dev/null
@@ -1,4 +0,0 @@
-2018-11-01 17:20:45,660,1,WOOHO
-2018-11-01 17:20:46,666,1,WOOHO
-2018-11-01 17:21:25,509,1,WOOHO
-2018-11-01 17:21:26,512,1,WOOHO
diff --git a/logs/first_logfile2.log.2018-11-01_17-23 b/logs/first_logfile2.log.2018-11-01_17-23
deleted file mode 100644
index bb81557..0000000
--- a/logs/first_logfile2.log.2018-11-01_17-23
+++ /dev/null
@@ -1,2 +0,0 @@
-2018-11-01 17:23:12,685,1,WOOHO
-2018-11-01 17:23:13,691,1,WOOHO
diff --git a/logs/first_logfile2.log.2018-11-01_17-24 b/logs/first_logfile2.log.2018-11-01_17-24
deleted file mode 100644
index d02b320..0000000
--- a/logs/first_logfile2.log.2018-11-01_17-24
+++ /dev/null
@@ -1 +0,0 @@
-2018-11-01 17:24:28,706,1,WOOHO
diff --git a/logs/first_logfile2.log.2018-11-01_17-27 b/logs/first_logfile2.log.2018-11-01_17-27
deleted file mode 100644
index ea071cf..0000000
--- a/logs/first_logfile2.log.2018-11-01_17-27
+++ /dev/null
@@ -1,2 +0,0 @@
-2018-11-01 17:27:21,293,1,WOOHO
-2018-11-01 17:27:22,302,1,WOOHO
diff --git a/logs/first_logfile2.log.2018-11-01_17-32 b/logs/first_logfile2.log.2018-11-01_17-32
deleted file mode 100644
index a10c009..0000000
--- a/logs/first_logfile2.log.2018-11-01_17-32
+++ /dev/null
@@ -1,61 +0,0 @@
-2018-11-01 17:31:36,985,1,WOOHO
-2018-11-01 17:31:37,991,1,WOOHO
-2018-11-01 17:31:38,993,1,WOOHO
-2018-11-01 17:31:39,994,1,WOOHO
-2018-11-01 17:31:40,996,1,WOOHO
-2018-11-01 17:31:42,000,1,WOOHO
-2018-11-01 17:31:43,001,1,WOOHO
-2018-11-01 17:31:44,005,1,WOOHO
-2018-11-01 17:31:45,007,1,WOOHO
-2018-11-01 17:31:46,013,1,WOOHO
-2018-11-01 17:31:47,014,1,WOOHO
-2018-11-01 17:31:48,020,1,WOOHO
-2018-11-01 17:31:49,024,1,WOOHO
-2018-11-01 17:31:50,028,1,WOOHO
-2018-11-01 17:31:51,032,1,WOOHO
-2018-11-01 17:31:52,040,1,WOOHO
-2018-11-01 17:31:53,045,1,WOOHO
-2018-11-01 17:31:54,050,1,WOOHO
-2018-11-01 17:31:55,054,1,WOOHO
-2018-11-01 17:31:56,057,1,WOOHO
-2018-11-01 17:31:57,060,1,WOOHO
-2018-11-01 17:31:58,061,1,WOOHO
-2018-11-01 17:31:59,066,1,WOOHO
-2018-11-01 17:32:00,070,1,WOOHO
-2018-11-01 17:32:01,075,1,WOOHO
-2018-11-01 17:32:02,079,1,WOOHO
-2018-11-01 17:32:03,083,1,WOOHO
-2018-11-01 17:32:04,087,1,WOOHO
-2018-11-01 17:32:05,089,1,WOOHO
-2018-11-01 17:32:06,094,1,WOOHO
-2018-11-01 17:32:07,098,1,WOOHO
-2018-11-01 17:32:08,101,1,WOOHO
-2018-11-01 17:32:09,104,1,WOOHO
-2018-11-01 17:32:10,106,1,WOOHO
-2018-11-01 17:32:11,108,1,WOOHO
-2018-11-01 17:32:12,112,1,WOOHO
-2018-11-01 17:32:13,115,1,WOOHO
-2018-11-01 17:32:14,116,1,WOOHO
-2018-11-01 17:32:15,119,1,WOOHO
-2018-11-01 17:32:16,121,1,WOOHO
-2018-11-01 17:32:17,122,1,WOOHO
-2018-11-01 17:32:18,127,1,WOOHO
-2018-11-01 17:32:19,130,1,WOOHO
-2018-11-01 17:32:20,135,1,WOOHO
-2018-11-01 17:32:21,136,1,WOOHO
-2018-11-01 17:32:22,142,1,WOOHO
-2018-11-01 17:32:23,145,1,WOOHO
-2018-11-01 17:32:24,148,1,WOOHO
-2018-11-01 17:32:25,153,1,WOOHO
-2018-11-01 17:32:26,159,1,WOOHO
-2018-11-01 17:32:27,162,1,WOOHO
-2018-11-01 17:32:28,166,1,WOOHO
-2018-11-01 17:32:29,169,1,WOOHO
-2018-11-01 17:32:32,214,1,WOOHO
-2018-11-01 17:32:33,215,1,WOOHO
-2018-11-01 17:32:34,220,1,WOOHO
-2018-11-01 17:32:35,224,1,WOOHO
-2018-11-01 17:32:36,229,1,WOOHO
-2018-11-01 17:32:37,235,1,WOOHO
-2018-11-01 17:32:38,238,1,WOOHO
-2018-11-01 17:32:39,242,1,WOOHO
diff --git a/logs/first_logfile2.log.2018-11-01_21-20 b/logs/first_logfile2.log.2018-11-01_21-20
new file mode 100644
index 0000000..cd16989
--- /dev/null
+++ b/logs/first_logfile2.log.2018-11-01_21-20
@@ -0,0 +1,60 @@
+2018-11-01 21:20:19,492,1,WOOHO
+2018-11-01 21:20:20,498,1,WOOHO
+2018-11-01 21:20:21,501,1,WOOHO
+2018-11-01 21:20:22,505,1,WOOHO
+2018-11-01 21:20:23,507,1,WOOHO
+2018-11-01 21:20:24,511,1,WOOHO
+2018-11-01 21:20:25,512,1,WOOHO
+2018-11-01 21:20:26,514,1,WOOHO
+2018-11-01 21:20:27,516,1,WOOHO
+2018-11-01 21:20:28,521,1,WOOHO
+2018-11-01 21:20:29,526,1,WOOHO
+2018-11-01 21:20:30,530,1,WOOHO
+2018-11-01 21:20:31,533,1,WOOHO
+2018-11-01 21:20:32,534,1,WOOHO
+2018-11-01 21:20:33,539,1,WOOHO
+2018-11-01 21:20:34,542,1,WOOHO
+2018-11-01 21:20:35,547,1,WOOHO
+2018-11-01 21:20:36,548,1,WOOHO
+2018-11-01 21:20:37,553,1,WOOHO
+2018-11-01 21:20:38,556,1,WOOHO
+2018-11-01 21:20:39,563,1,WOOHO
+2018-11-01 21:20:40,568,1,WOOHO
+2018-11-01 21:20:41,572,1,WOOHO
+2018-11-01 21:20:42,574,1,WOOHO
+2018-11-01 21:20:43,576,1,WOOHO
+2018-11-01 21:20:44,581,1,WOOHO
+2018-11-01 21:20:45,585,1,WOOHO
+2018-11-01 21:20:46,588,1,WOOHO
+2018-11-01 21:20:47,593,1,WOOHO
+2018-11-01 21:20:48,599,1,WOOHO
+2018-11-01 21:20:49,602,1,WOOHO
+2018-11-01 21:20:50,603,1,WOOHO
+2018-11-01 21:20:51,604,1,WOOHO
+2018-11-01 21:20:52,608,1,WOOHO
+2018-11-01 21:20:53,612,1,WOOHO
+2018-11-01 21:20:54,616,1,WOOHO
+2018-11-01 21:20:55,621,1,WOOHO
+2018-11-01 21:20:56,625,1,WOOHO
+2018-11-01 21:20:57,626,1,WOOHO
+2018-11-01 21:20:58,631,1,WOOHO
+2018-11-01 21:20:59,635,1,WOOHO
+2018-11-01 21:21:00,637,1,WOOHO
+2018-11-01 21:21:01,639,1,WOOHO
+2018-11-01 21:21:02,643,1,WOOHO
+2018-11-01 21:21:03,648,1,WOOHO
+2018-11-01 21:21:04,653,1,WOOHO
+2018-11-01 21:21:05,657,1,WOOHO
+2018-11-01 21:21:06,662,1,WOOHO
+2018-11-01 21:21:07,666,1,WOOHO
+2018-11-01 21:21:08,671,1,WOOHO
+2018-11-01 21:21:09,676,1,WOOHO
+2018-11-01 21:21:10,682,1,WOOHO
+2018-11-01 21:21:11,684,1,WOOHO
+2018-11-01 21:21:12,685,1,WOOHO
+2018-11-01 21:21:13,690,1,WOOHO
+2018-11-01 21:21:14,695,1,WOOHO
+2018-11-01 21:21:15,700,1,WOOHO
+2018-11-01 21:21:16,702,1,WOOHO
+2018-11-01 21:21:17,707,1,WOOHO
+2018-11-01 21:21:18,712,1,WOOHO
diff --git a/logs/first_logfile2.log.2018-11-01_21-21 b/logs/first_logfile2.log.2018-11-01_21-21
new file mode 100644
index 0000000..9c9657f
--- /dev/null
+++ b/logs/first_logfile2.log.2018-11-01_21-21
@@ -0,0 +1,60 @@
+2018-11-01 21:21:19,716,1,WOOHO
+2018-11-01 21:21:20,721,1,WOOHO
+2018-11-01 21:21:21,726,1,WOOHO
+2018-11-01 21:21:22,731,1,WOOHO
+2018-11-01 21:21:23,735,1,WOOHO
+2018-11-01 21:21:24,740,1,WOOHO
+2018-11-01 21:21:25,744,1,WOOHO
+2018-11-01 21:21:26,749,1,WOOHO
+2018-11-01 21:21:27,752,1,WOOHO
+2018-11-01 21:21:28,757,1,WOOHO
+2018-11-01 21:21:29,760,1,WOOHO
+2018-11-01 21:21:30,763,1,WOOHO
+2018-11-01 21:21:31,768,1,WOOHO
+2018-11-01 21:21:32,769,1,WOOHO
+2018-11-01 21:21:33,771,1,WOOHO
+2018-11-01 21:21:34,777,1,WOOHO
+2018-11-01 21:21:35,779,1,WOOHO
+2018-11-01 21:21:36,783,1,WOOHO
+2018-11-01 21:21:37,786,1,WOOHO
+2018-11-01 21:21:38,790,1,WOOHO
+2018-11-01 21:21:39,794,1,WOOHO
+2018-11-01 21:21:40,799,1,WOOHO
+2018-11-01 21:21:41,803,1,WOOHO
+2018-11-01 21:21:42,808,1,WOOHO
+2018-11-01 21:21:43,809,1,WOOHO
+2018-11-01 21:21:44,812,1,WOOHO
+2018-11-01 21:21:45,814,1,WOOHO
+2018-11-01 21:21:46,818,1,WOOHO
+2018-11-01 21:21:47,822,1,WOOHO
+2018-11-01 21:21:48,825,1,WOOHO
+2018-11-01 21:21:49,831,1,WOOHO
+2018-11-01 21:21:50,836,1,WOOHO
+2018-11-01 21:21:51,838,1,WOOHO
+2018-11-01 21:21:52,843,1,WOOHO
+2018-11-01 21:21:53,847,1,WOOHO
+2018-11-01 21:21:54,851,1,WOOHO
+2018-11-01 21:21:55,855,1,WOOHO
+2018-11-01 21:21:56,861,1,WOOHO
+2018-11-01 21:21:57,864,1,WOOHO
+2018-11-01 21:21:58,867,1,WOOHO
+2018-11-01 21:21:59,871,1,WOOHO
+2018-11-01 21:22:00,876,1,WOOHO
+2018-11-01 21:22:01,881,1,WOOHO
+2018-11-01 21:22:02,887,1,WOOHO
+2018-11-01 21:22:03,891,1,WOOHO
+2018-11-01 21:22:04,895,1,WOOHO
+2018-11-01 21:22:05,899,1,WOOHO
+2018-11-01 21:22:06,900,1,WOOHO
+2018-11-01 21:22:07,904,1,WOOHO
+2018-11-01 21:22:08,909,1,WOOHO
+2018-11-01 21:22:09,915,1,WOOHO
+2018-11-01 21:22:10,916,1,WOOHO
+2018-11-01 21:22:11,922,1,WOOHO
+2018-11-01 21:22:12,924,1,WOOHO
+2018-11-01 21:22:13,927,1,WOOHO
+2018-11-01 21:22:14,930,1,WOOHO
+2018-11-01 21:22:15,934,1,WOOHO
+2018-11-01 21:22:16,936,1,WOOHO
+2018-11-01 21:22:17,940,1,WOOHO
+2018-11-01 21:22:18,943,1,WOOHO
diff --git a/logs/first_logfile2.log.2018-11-01_21-22 b/logs/first_logfile2.log.2018-11-01_21-22
new file mode 100644
index 0000000..410c63d
--- /dev/null
+++ b/logs/first_logfile2.log.2018-11-01_21-22
@@ -0,0 +1,59 @@
+2018-11-01 21:22:19,948,1,WOOHO
+2018-11-01 21:22:20,954,1,WOOHO
+2018-11-01 21:22:21,960,1,WOOHO
+2018-11-01 21:22:22,964,1,WOOHO
+2018-11-01 21:22:23,967,1,WOOHO
+2018-11-01 21:22:24,971,1,WOOHO
+2018-11-01 21:22:25,977,1,WOOHO
+2018-11-01 21:22:26,981,1,WOOHO
+2018-11-01 21:22:27,986,1,WOOHO
+2018-11-01 21:22:28,990,1,WOOHO
+2018-11-01 21:22:29,995,1,WOOHO
+2018-11-01 21:22:31,000,1,WOOHO
+2018-11-01 21:22:32,004,1,WOOHO
+2018-11-01 21:22:33,010,1,WOOHO
+2018-11-01 21:22:34,014,1,WOOHO
+2018-11-01 21:22:35,020,1,WOOHO
+2018-11-01 21:22:36,024,1,WOOHO
+2018-11-01 21:22:37,028,1,WOOHO
+2018-11-01 21:22:38,033,1,WOOHO
+2018-11-01 21:22:39,036,1,WOOHO
+2018-11-01 21:22:40,041,1,WOOHO
+2018-11-01 21:22:41,045,1,WOOHO
+2018-11-01 21:22:42,049,1,WOOHO
+2018-11-01 21:22:43,053,1,WOOHO
+2018-11-01 21:22:44,057,1,WOOHO
+2018-11-01 21:22:45,061,1,WOOHO
+2018-11-01 21:22:46,065,1,WOOHO
+2018-11-01 21:22:47,069,1,WOOHO
+2018-11-01 21:22:48,074,1,WOOHO
+2018-11-01 21:22:49,078,1,WOOHO
+2018-11-01 21:22:50,082,1,WOOHO
+2018-11-01 21:22:51,086,1,WOOHO
+2018-11-01 21:22:52,090,1,WOOHO
+2018-11-01 21:22:53,092,1,WOOHO
+2018-11-01 21:22:54,097,1,WOOHO
+2018-11-01 21:22:55,100,1,WOOHO
+2018-11-01 21:22:56,102,1,WOOHO
+2018-11-01 21:22:57,105,1,WOOHO
+2018-11-01 21:22:58,109,1,WOOHO
+2018-11-01 21:22:59,115,1,WOOHO
+2018-11-01 21:23:00,120,1,WOOHO
+2018-11-01 21:23:01,121,1,WOOHO
+2018-11-01 21:23:02,125,1,WOOHO
+2018-11-01 21:23:03,126,1,WOOHO
+2018-11-01 21:23:04,131,1,WOOHO
+2018-11-01 21:23:05,136,1,WOOHO
+2018-11-01 21:23:06,141,1,WOOHO
+2018-11-01 21:23:07,146,1,WOOHO
+2018-11-01 21:23:08,151,1,WOOHO
+2018-11-01 21:23:09,157,1,WOOHO
+2018-11-01 21:23:10,164,1,WOOHO
+2018-11-01 21:23:11,167,1,WOOHO
+2018-11-01 21:23:12,170,1,WOOHO
+2018-11-01 21:23:13,175,1,WOOHO
+2018-11-01 21:23:14,180,1,WOOHO
+2018-11-01 21:23:15,184,1,WOOHO
+2018-11-01 21:23:16,188,1,WOOHO
+2018-11-01 21:23:17,194,1,WOOHO
+2018-11-01 21:23:18,198,1,WOOHO
diff --git a/logs/first_logfile2.log.2018-11-01_21-23 b/logs/first_logfile2.log.2018-11-01_21-23
new file mode 100644
index 0000000..65d52a0
--- /dev/null
+++ b/logs/first_logfile2.log.2018-11-01_21-23
@@ -0,0 +1,60 @@
+2018-11-01 21:23:19,204,1,WOOHO
+2018-11-01 21:23:20,209,1,WOOHO
+2018-11-01 21:23:21,210,1,WOOHO
+2018-11-01 21:23:22,213,1,WOOHO
+2018-11-01 21:23:23,214,1,WOOHO
+2018-11-01 21:23:24,218,1,WOOHO
+2018-11-01 21:23:25,222,1,WOOHO
+2018-11-01 21:23:26,226,1,WOOHO
+2018-11-01 21:23:27,226,1,WOOHO
+2018-11-01 21:23:28,230,1,WOOHO
+2018-11-01 21:23:29,235,1,WOOHO
+2018-11-01 21:23:30,240,1,WOOHO
+2018-11-01 21:23:31,244,1,WOOHO
+2018-11-01 21:23:32,250,1,WOOHO
+2018-11-01 21:23:33,251,1,WOOHO
+2018-11-01 21:23:34,256,1,WOOHO
+2018-11-01 21:23:35,260,1,WOOHO
+2018-11-01 21:23:36,264,1,WOOHO
+2018-11-01 21:23:37,270,1,WOOHO
+2018-11-01 21:23:38,272,1,WOOHO
+2018-11-01 21:23:39,276,1,WOOHO
+2018-11-01 21:23:40,283,1,WOOHO
+2018-11-01 21:23:41,284,1,WOOHO
+2018-11-01 21:23:42,289,1,WOOHO
+2018-11-01 21:23:43,292,1,WOOHO
+2018-11-01 21:23:44,298,1,WOOHO
+2018-11-01 21:23:45,301,1,WOOHO
+2018-11-01 21:23:46,306,1,WOOHO
+2018-11-01 21:23:47,309,1,WOOHO
+2018-11-01 21:23:48,314,1,WOOHO
+2018-11-01 21:23:49,316,1,WOOHO
+2018-11-01 21:23:50,321,1,WOOHO
+2018-11-01 21:23:51,324,1,WOOHO
+2018-11-01 21:23:52,327,1,WOOHO
+2018-11-01 21:23:53,331,1,WOOHO
+2018-11-01 21:23:54,333,1,WOOHO
+2018-11-01 21:23:55,338,1,WOOHO
+2018-11-01 21:23:56,341,1,WOOHO
+2018-11-01 21:23:57,344,1,WOOHO
+2018-11-01 21:23:58,349,1,WOOHO
+2018-11-01 21:23:59,353,1,WOOHO
+2018-11-01 21:24:00,357,1,WOOHO
+2018-11-01 21:24:01,362,1,WOOHO
+2018-11-01 21:24:02,366,1,WOOHO
+2018-11-01 21:24:03,371,1,WOOHO
+2018-11-01 21:24:04,376,1,WOOHO
+2018-11-01 21:24:05,381,1,WOOHO
+2018-11-01 21:24:06,382,1,WOOHO
+2018-11-01 21:24:07,384,1,WOOHO
+2018-11-01 21:24:08,388,1,WOOHO
+2018-11-01 21:24:09,391,1,WOOHO
+2018-11-01 21:24:10,393,1,WOOHO
+2018-11-01 21:24:11,398,1,WOOHO
+2018-11-01 21:24:12,401,1,WOOHO
+2018-11-01 21:24:13,405,1,WOOHO
+2018-11-01 21:24:14,409,1,WOOHO
+2018-11-01 21:24:15,413,1,WOOHO
+2018-11-01 21:24:16,417,1,WOOHO
+2018-11-01 21:24:17,421,1,WOOHO
+2018-11-01 21:24:18,422,1,WOOHO
diff --git a/logs/first_logfile2.log.2018-11-01_21-24 b/logs/first_logfile2.log.2018-11-01_21-24
new file mode 100644
index 0000000..ec5b5bb
--- /dev/null
+++ b/logs/first_logfile2.log.2018-11-01_21-24
@@ -0,0 +1,60 @@
+2018-11-01 21:24:19,426,1,WOOHO
+2018-11-01 21:24:20,431,1,WOOHO
+2018-11-01 21:24:21,436,1,WOOHO
+2018-11-01 21:24:22,442,1,WOOHO
+2018-11-01 21:24:23,445,1,WOOHO
+2018-11-01 21:24:24,450,1,WOOHO
+2018-11-01 21:24:25,453,1,WOOHO
+2018-11-01 21:24:26,457,1,WOOHO
+2018-11-01 21:24:27,462,1,WOOHO
+2018-11-01 21:24:28,466,1,WOOHO
+2018-11-01 21:24:29,471,1,WOOHO
+2018-11-01 21:24:30,475,1,WOOHO
+2018-11-01 21:24:31,481,1,WOOHO
+2018-11-01 21:24:32,484,1,WOOHO
+2018-11-01 21:24:33,487,1,WOOHO
+2018-11-01 21:24:34,491,1,WOOHO
+2018-11-01 21:24:35,495,1,WOOHO
+2018-11-01 21:24:36,499,1,WOOHO
+2018-11-01 21:24:37,503,1,WOOHO
+2018-11-01 21:24:38,506,1,WOOHO
+2018-11-01 21:24:39,510,1,WOOHO
+2018-11-01 21:24:40,515,1,WOOHO
+2018-11-01 21:24:41,519,1,WOOHO
+2018-11-01 21:24:42,522,1,WOOHO
+2018-11-01 21:24:43,527,1,WOOHO
+2018-11-01 21:24:44,532,1,WOOHO
+2018-11-01 21:24:45,537,1,WOOHO
+2018-11-01 21:24:46,542,1,WOOHO
+2018-11-01 21:24:47,548,1,WOOHO
+2018-11-01 21:24:48,554,1,WOOHO
+2018-11-01 21:24:49,558,1,WOOHO
+2018-11-01 21:24:50,563,1,WOOHO
+2018-11-01 21:24:51,567,1,WOOHO
+2018-11-01 21:24:52,573,1,WOOHO
+2018-11-01 21:24:53,575,1,WOOHO
+2018-11-01 21:24:54,578,1,WOOHO
+2018-11-01 21:24:55,582,1,WOOHO
+2018-11-01 21:24:56,583,1,WOOHO
+2018-11-01 21:24:57,586,1,WOOHO
+2018-11-01 21:24:58,589,1,WOOHO
+2018-11-01 21:24:59,593,1,WOOHO
+2018-11-01 21:25:00,597,1,WOOHO
+2018-11-01 21:25:01,598,1,WOOHO
+2018-11-01 21:25:02,600,1,WOOHO
+2018-11-01 21:25:03,606,1,WOOHO
+2018-11-01 21:25:04,612,1,WOOHO
+2018-11-01 21:25:05,614,1,WOOHO
+2018-11-01 21:25:06,616,1,WOOHO
+2018-11-01 21:25:07,620,1,WOOHO
+2018-11-01 21:25:08,624,1,WOOHO
+2018-11-01 21:25:09,631,1,WOOHO
+2018-11-01 21:25:10,634,1,WOOHO
+2018-11-01 21:25:11,636,1,WOOHO
+2018-11-01 21:25:12,640,1,WOOHO
+2018-11-01 21:25:13,645,1,WOOHO
+2018-11-01 21:25:14,649,1,WOOHO
+2018-11-01 21:25:15,653,1,WOOHO
+2018-11-01 21:25:16,657,1,WOOHO
+2018-11-01 21:25:17,661,1,WOOHO
+2018-11-01 21:25:18,665,1,WOOHO
diff --git a/run.py b/run.py
index 0a391c3..a5a391a 100644
--- a/run.py
+++ b/run.py
@@ -1,12 +1,4 @@
-import importlib
-
-from aiohttp import web
-from aiohttp_auth import auth
-from core.cbpi import CraftBeerPi
+from core.craftbeerpi import CraftBeerPi
cbpi = CraftBeerPi()
-
-
-
-
cbpi.start()
\ No newline at end of file
diff --git a/tests/test_app.py b/tests/test_app.py
index 853472f..abba565 100644
--- a/tests/test_app.py
+++ b/tests/test_app.py
@@ -6,7 +6,7 @@ import json
from hbmqtt.broker import Broker
-from core.cbpi import CraftBeerPi
+from core.craftbeerpi import CraftBeerPi
from core.database.model import ActorModel