Kettle added

This commit is contained in:
manuel83 2018-11-18 15:40:10 +01:00
parent b5d96bf191
commit f300076134
101 changed files with 6791 additions and 2051 deletions

View file

@ -2,7 +2,7 @@
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.6.1 virtualenv at ~/aioenv" jdkType="Python SDK" />
<orderEntry type="jdk" jdkName="Python 3.6.1 virtualenv at ~/cbpi41" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6.1 virtualenv at ~/aioenv" project-jdk-type="Python SDK" />
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6.1 virtualenv at ~/cbpi41" project-jdk-type="Python SDK" />
</project>

File diff suppressed because it is too large Load diff

View file

@ -3,16 +3,11 @@ __all__ = ["CBPiActor"]
import logging
from core.api.extension import CBPiExtension
from core.utils.utils import load_config as load
logger = logging.getLogger(__file__)
class CBPiActor(CBPiExtension):
def __init__(self, cbpi):
self.id = ""
self.state = None
self.name = ""
def on(self, power):
pass

View file

@ -1,16 +1,34 @@
__all__ = ["CBPiExtension"]
import logging
import os
import sys
from core.utils.utils import load_config as load
__all__ = ["CBPiExtension"]
logger = logging.getLogger(__file__)
logging.basicConfig(level=logging.INFO)
class CBPiExtension():
def __init__(self, *args, **kwds):
for a in kwds:
print(a)
super(CBPiExtension, self).__setattr__(a, kwds.get(a))
self.cbpi = kwds.get("cbpi")
self.id = kwds.get("id")
self.value = None
self.__dirty = False
def __setattr__(self, name, value):
if name != "_CBPiExtension__dirty":
self.__dirty = True
super(CBPiExtension, self).__setattr__(name, value)
else:
super(CBPiExtension, self).__setattr__(name, value)
def load_config(self):
path = os.path.dirname(sys.modules[self.__class__.__module__].__file__)
try:

7
core/api/kettle_logic.py Normal file
View file

@ -0,0 +1,7 @@
from core.api.extension import CBPiExtension
class CBPiKettleLogic(CBPiExtension):
def test(self):
pass

View file

@ -3,15 +3,9 @@ from core.api.extension import CBPiExtension
class CBPiSensor(CBPiExtension):
def __init__(self):
self.id = "";
self.name = ""
def on(self):
pass
def off(self):
pass
async def run(self, cbpi):
print("RUN NOT IMPLEMENTED")
def state(self):
pass

View file

@ -58,13 +58,9 @@ class ActorController(ActorHttp, CRUDController):
self.types = {}
self.actors = {}
def register(self, name, clazz) -> None:
'''
Register a new actor type
:param name: actor name
:param clazz: actor class
:return: None
'''
print("REGISTER", name)
if issubclass(clazz, CBPiActor):
print("ITS AN ACTOR")
@ -79,29 +75,51 @@ class ActorController(ActorHttp, CRUDController):
:return:
'''
await super(ActorController, self).init()
print("INIT ACTOR")
for name, clazz in self.types.items():
print("Type", name)
for id, value in self.cache.items():
if value.type in self.types:
cfg = value.config.copy()
print(cfg)
cfg.update(dict(cbpi=self.cbpi, id=id, name=value.name))
clazz = self.types[value.type]["class"];
print(self.cache[id])
self.cache[id].instance = clazz(self.cbpi)
self.cache[id].instance = clazz(**cfg)
print("gpIO", self.cache[id].instance, self.cache[id].instance.gpio)
@on_event(topic="actor/+/on")
def on(self, id, power=100, **kwargs) -> None:
print(id)
'''
Method to switch an actor on.
Supporting Event Topic "actor/+/on"
:param id: the actor id
:param power: as integer value between 1 and 100
:param kwargs:
:return:
'''
id = int(id)
if id in self.cache:
print("POWER ON")
actor = self.cache[id].instance
print("ONNNNN", actor)
actor.on(power)
@on_event(topic="actor/+/toggle")
def toggle(self, id, power=100, **kwargs) -> None:
'''
Method to toggle an actor on or off
Supporting Event Topic "actor/+/toggle"
:param power:
:return:
'''
id = int(id)
if id in self.cache:
@ -114,7 +132,10 @@ class ActorController(ActorHttp, CRUDController):
@on_event(topic="actor/+/off")
def off(self, id, **kwargs) -> None:
"""
Method to switch and actor off
Supporting Event Topic "actor/+/off"
:param id:
:param kwargs:
"""

View file

@ -0,0 +1,18 @@
from core.controller.crud_controller import CRUDController
from core.database.model import ConfigModel
class ConfigController(CRUDController):
'''
The main actor controller
'''
model = ConfigModel
def __init__(self, cbpi):
super(ConfigController, self).__init__(cbpi)
self.cbpi = cbpi
self.cbpi.register(self, "/config")

View file

@ -13,7 +13,11 @@ class CRUDController(object):
self.cache = await self.model.get_all()
async def get_all(self, force_db_update=False):
'''
:param force_db_update:
:return:
'''
if self.caching is False or force_db_update:
self.cache = await self.model.get_all()

View file

@ -0,0 +1,81 @@
from aiohttp import web
from core.api import request_mapping
from core.controller.crud_controller import CRUDController
from core.database.model import KettleModel
from core.http_endpoints.http_api import HttpAPI
from core.utils import json_dumps
class KettleHttp(HttpAPI):
@request_mapping(path="/types", auth_required=False)
async def get_types(self, request):
web.json_response(data=self.types, dumps=json_dumps)
@request_mapping(path="/automatic", auth_required=False)
async def start(self, request):
await self.toggle_automtic(1)
return web.Response(text="OK")
@request_mapping(path="/automatic/stop", auth_required=False)
async def stop(self, request):
kettle = await self.get_one(1)
kettle.instance.running = False
return web.Response(text="OK")
class KettleController(CRUDController, KettleHttp):
'''
The main actor controller
'''
model = KettleModel
def __init__(self, cbpi):
super(KettleController, self).__init__(cbpi)
self.cbpi = cbpi
self.types = {}
self.cbpi.register(self, "/kettle")
async def init(self):
'''
This method initializes all actors during startup. It creates actor instances
:return:
'''
await super(KettleController, self).init()
async def toggle_automtic(self, id):
kettle = await self.get_one(id)
if hasattr(kettle, "instance") is False:
kettle.instance = None
if kettle.instance is None:
if kettle.logic in self.types:
clazz = self.types.get("CustomKettleLogic")["class"]
kettle.instance = clazz()
await self.cbpi.start_job(kettle.instance.run(), "test", "test")
else:
kettle.instance.running = False
kettle.instance = None
async def heater_on(self, id):
pass
async def heater_off(self, id):
pass
async def agitator_on(self, id):
pass
async def agitator_off(self, id):
pass
async def get_traget_temp(self, id):
pass
async def get_temp(self, id):
pass

View file

@ -10,7 +10,9 @@ from aiohttp import web
from core.api.actor import CBPiActor
from core.api.decorator import request_mapping
from core.api.extension import CBPiExtension
from core.api.kettle_logic import CBPiKettleLogic
from core.api.property import Property
from core.api.sensor import CBPiSensor
from core.utils.utils import load_config, json_dumps
logger = logging.getLogger(__file__)
@ -87,10 +89,19 @@ class PluginController():
:param clazz: actor class
:return: None
'''
print("REGISTER", name, clazz)
if issubclass(clazz, CBPiActor):
self.cbpi.actor.types[name] = {"class": clazz, "config": self._parse_props(clazz)}
if issubclass(clazz, CBPiSensor):
self.cbpi.sensor.types[name] = {"class": clazz, "config": self._parse_props(clazz)}
if issubclass(clazz, CBPiKettleLogic):
self.cbpi.kettle.types[name] = {"class": clazz, "config": self._parse_props(clazz)}
if issubclass(clazz, CBPiExtension):
self.c = clazz(self.cbpi)

View file

@ -2,6 +2,8 @@ import logging
import os
from logging.handlers import TimedRotatingFileHandler
from core.job.aiohttp import get_scheduler_from_app
from core.api.decorator import background_task
from core.controller.crud_controller import CRUDController
from core.database.model import SensorModel
@ -16,6 +18,7 @@ class SensorController(CRUDController, HttpAPI):
self.cbpi = cbpi
self.cbpi.register(self, "/sensor")
self.service = self
self.types = {}
self.sensors = {"S1": "S1", "S2": "S2"}
@ -32,12 +35,28 @@ class SensorController(CRUDController, HttpAPI):
self.logger.propagate = False
self.logger.addHandler(handler)
async def pre_get_one(self, id):
pass
async def init(self):
'''
This method initializes all actors during startup. It creates actor instances
:return:
'''
await super(SensorController, self).init()
print("INIT SENSOR")
for name, clazz in self.types.items():
print("Type", name)
for id, value in self.cache.items():
if value.type in self.types:
cfg = value.config.copy()
cfg.update(dict(cbpi=self.cbpi, id=id, name=value.name))
clazz = self.types[value.type]["class"];
self.cache[id].instance = clazz(**cfg)
scheduler = get_scheduler_from_app(self.cbpi.app)
self.cache[id].instance.job = await scheduler.spawn(self.cache[id].instance.run(self.cbpi), value.name, "sensor")
print("------------")
@background_task(name="test", interval=1)
async def hallo(self):
print("AHLLO")
self.logger.info("WOOHO", extra={"sensor": 1})

View file

@ -24,9 +24,11 @@ class SystemController():
@request_mapping("/jobs", method="GET", name="get_jobs", auth_required=False)
def get_all_jobs(self, request):
scheduler = get_scheduler_from_app(self.cbpi.app)
result = []
for j in scheduler:
print(j)
try:
result.append(dict(name=j.name, type=j.type, time=j.start_time))
except:
pass
# await j.close()
return web.Response(text="HALLO")
return web.json_response(data=result)

View file

@ -9,7 +9,10 @@ from aiohttp_auth import auth
from aiohttp_session import session_middleware
from aiohttp_session.cookie_storage import EncryptedCookieStorage
from aiohttp_swagger import setup_swagger
from aiojobs.aiohttp import setup, get_scheduler_from_app
from core.controller.config_controller import ConfigController
from core.controller.kettle_controller import KettleController
from core.job.aiohttp import setup, get_scheduler_from_app
from core.controller.actor_controller import ActorController
from core.controller.notification_controller import NotificationController
@ -53,6 +56,8 @@ class CraftBeerPi():
self.sensor = SensorController(self)
self.plugin = PluginController(self)
self.system = SystemController(self)
self.config2 = ConfigController(self)
self.kettle = KettleController(self)
self.notification = NotificationController(self)
self.login = Login(self)
@ -64,8 +69,11 @@ class CraftBeerPi():
doc = None
if method.__doc__ is not None:
doc = yaml.load(method.__doc__)
doc["topic"] = method.__getattribute__("topic")
try:
doc = yaml.load(method.__doc__)
doc["topic"] = method.__getattribute__("topic")
except:
pass
self.bus.register(method.__getattribute__("topic"), method, doc)
def register_background_task(self, obj):
@ -89,8 +97,8 @@ class CraftBeerPi():
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")
job = await scheduler.spawn(job_loop(self.app, name, interval, method),name, "background")
await scheduler.spawn(job_loop(self.app, name, interval, method))
self.app.on_startup.append(spawn_job)
@ -171,6 +179,11 @@ class CraftBeerPi():
else:
self.app.add_routes(routes)
async def start_job(self, method, name, type):
scheduler = get_scheduler_from_app(self.app)
return await scheduler.spawn(method, name, type)
def _swagger_setup(self):
'''
Internatl method to expose REST API documentation by swagger
@ -178,9 +191,7 @@ class CraftBeerPi():
:return:
'''
long_description = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus vehicula, metus et sodales fringilla, purus leo aliquet odio, non tempor ante urna aliquet nibh. Integer accumsan laoreet tincidunt. Vestibulum semper vehicula sollicitudin. Suspendisse dapibus neque vitae mattis bibendum. Morbi eu pulvinar turpis, quis malesuada ex. Vestibulum sed maximus diam. Proin semper fermentum suscipit. Duis at suscipit diam. Integer in augue elementum, auctor orci ac, elementum est. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas condimentum id arcu quis volutpat. Vestibulum sit amet nibh sodales, iaculis nibh eget, scelerisque justo.
Nunc eget mauris lectus. Proin sit amet volutpat risus. Aliquam auctor nunc sit amet feugiat tempus. Maecenas nec ex dolor. Nam fermentum, mauris ut suscipit varius, odio purus luctus mauris, pretium interdum felis sem vel est. Proin a turpis vitae nunc volutpat tristique ac in erat. Pellentesque consequat rhoncus libero, ac sollicitudin odio tempus a. Sed vestibulum leo erat, ut auctor turpis mollis id. Ut nec nunc ex. Maecenas eu turpis in nibh placerat ullamcorper ac nec dui. Integer ac lacus neque. Donec dictum tellus lacus, a vulputate justo venenatis at. Morbi malesuada tellus quis orci aliquet, at vulputate lacus imperdiet. Nulla eu diam quis orci aliquam vulputate ac imperdiet elit. Quisque varius mollis dolor in interdum.
This is the api for CraftBeerPi
"""
setup_swagger(self.app,
@ -218,7 +229,9 @@ class CraftBeerPi():
await DBModel.test_connection()
async def init_controller(app):
await self.sensor.init()
await self.actor.init()
await self.kettle.init()
async def load_plugins(app):
await PluginController.load_plugin_list()

View file

@ -11,3 +11,14 @@ class SensorModel(DBModel):
__fields__ = ["name", "type", "config"]
__table_name__ = "sensor"
__json_fields__ = ["config"]
class ConfigModel(DBModel):
__fields__ = ["type", "value", "description", "options"]
__table_name__ = "config"
__json_fields__ = ["options"]
__priamry_key__ = "name"
class KettleModel(DBModel):
__fields__ = ["name","sensor", "heater", "automatic", "logic", "config", "agitator", "target_temp"]
__table_name__ = "kettle"
__json_fields__ = ["config"]

View file

@ -6,13 +6,9 @@ from core.api import CBPiActor, Property, action, background_task
class CustomActor(CBPiActor):
name = Property.Number(label="Test")
name1 = Property.Text(label="Test")
name2 = Property.Kettle(label="Test")
@background_task("s1", interval=2)
async def bg_job(self):
print("WOOH BG")
gpio = Property.Number(label="Test")
@action(key="name", parameters={})
def myAction(self):
@ -22,29 +18,15 @@ class CustomActor(CBPiActor):
super().state()
def off(self):
print("OFF")
print("OFF", self.gpio)
self.state = False
def on(self, power=100):
print("ON")
print("ON", self.gpio)
self.state = True
def __init__(self, cbpi=None):
if cbpi is None:
return
print("INIT MY ACTOR111111")
self.cfg = self.load_config()
self.logger = logging.getLogger(__file__)
logging.basicConfig(level=logging.INFO)
self.logger.info("########WOOHOO MY ACTOR")
self.cbpi = cbpi
def setup(cbpi):

View file

@ -0,0 +1,30 @@
import asyncio
from core.api import Property
from core.api.kettle_logic import CBPiKettleLogic
class CustomLogic(CBPiKettleLogic):
name = Property.Number(label="Test")
running = True
async def run(self):
while self.running:
print("RUN")
await asyncio.sleep(1)
def setup(cbpi):
'''
This method is called by the server during startup
Here you need to register your plugins at the server
:param cbpi: the cbpi core
:return:
'''
cbpi.plugin.register("CustomKettleLogic", CustomLogic)

View file

@ -0,0 +1,2 @@
name: Manuel
version: 4

View file

@ -0,0 +1,44 @@
import asyncio
import logging
from core.api import CBPiActor, Property, action, background_task
from core.api.sensor import CBPiSensor
class CustomSensor(CBPiSensor):
name = Property.Number(label="Test")
name1 = Property.Text(label="Test")
interval = Property.Number(label="interval")
name2 = Property.Kettle(label="Test")
@action(key="name", parameters={})
def myAction(self):
pass
def state(self):
super().state()
def stop(self):
pass
async def run(self, cbpi):
while True:
await asyncio.sleep(self.interval)
print("SENSOR IS RUNNING")
def setup(cbpi):
'''
This method is called by the server during startup
Here you need to register your plugins at the server
:param cbpi: the cbpi core
:return:
'''
cbpi.plugin.register("CustomSensor", CustomSensor)

View file

@ -0,0 +1,2 @@
name: Manuel
version: 4

View file

@ -14,18 +14,28 @@ class HttpAPI():
@request_mapping(path="/", auth_required=False)
async def http_get_all(self, request):
"""
---
description: This end-point allow to test that service is up.
tags:
- REST API
produces:
- application/json
responses:
"200":
description: successful operation. Return "pong" text
"405":
description: invalid HTTP Method
"""
---
description: This end-point allow to test that service is up.
tags:
- REST API
produces:
- application/json
parameters:
- name: "id"
in: "path"
description: "ID of object to return"
required: true
type: "integer"
format: "int64"
responses:
"200":
description: successful operation. Return "pong" text
"405":
description: invalid HTTP Met
"""
return web.json_response(await self.get_all(force_db_update=True), dumps=json_dumps)
@request_mapping(path="/{id:\d+}", auth_required=False)

23
core/job/__init__.py Normal file
View file

@ -0,0 +1,23 @@
"""Jobs scheduler for managing background task (asyncio).
The library gives controlled way for scheduling background tasks for
asyncio applications.
"""
__version__ = '0.2.2'
import asyncio
from ._scheduler import Scheduler
async def create_scheduler(*, close_timeout=0.1, limit=100,
pending_limit=10000, exception_handler=None):
if exception_handler is not None and not callable(exception_handler):
raise TypeError('A callable object or None is expected, '
'got {!r}'.format(exception_handler))
loop = asyncio.get_event_loop()
return Scheduler(loop=loop, close_timeout=close_timeout,
limit=limit, pending_limit=pending_limit,
exception_handler=exception_handler)
__all__ = ('create_scheduler',)

136
core/job/_job.py Normal file
View file

@ -0,0 +1,136 @@
import asyncio
import sys
import traceback
import async_timeout
import time
class Job:
_source_traceback = None
_closed = False
_explicit = False
_task = None
def __init__(self, coro, name, type, scheduler, loop):
self._loop = loop
self.name = name
self.type = type
self.start_time = time.time()
self._coro = coro
self._scheduler = scheduler
self._started = loop.create_future()
if loop.get_debug():
self._source_traceback = traceback.extract_stack(sys._getframe(2))
def __repr__(self):
info = []
if self._closed:
info.append('closed')
elif self._task is None:
info.append('pending')
info = ' '.join(info)
if info:
info += ' '
return '<Job {}coro=<{}>>'.format(info, self._coro)
@property
def active(self):
return not self.closed and not self.pending
@property
def pending(self):
return self._task is None and not self.closed
@property
def closed(self):
return self._closed
async def _do_wait(self, timeout):
with async_timeout.timeout(timeout=timeout, loop=self._loop):
# TODO: add a test for waiting for a pending coro
await self._started
return await self._task
async def wait(self, *, timeout=None):
if self._closed:
return
self._explicit = True
scheduler = self._scheduler
try:
return await asyncio.shield(self._do_wait(timeout),
loop=self._loop)
except asyncio.CancelledError:
# Don't stop inner coroutine on explicit cancel
raise
except Exception:
await self._close(scheduler.close_timeout)
raise
async def close(self, *, timeout=None):
if self._closed:
return
self._explicit = True
if timeout is None:
timeout = self._scheduler.close_timeout
await self._close(timeout)
async def _close(self, timeout):
self._closed = True
if self._task is None:
# the task is closed immediately without actual execution
# it prevents a warning like
# RuntimeWarning: coroutine 'coro' was never awaited
self._start()
if not self._task.done():
self._task.cancel()
# self._scheduler is None after _done_callback()
scheduler = self._scheduler
try:
with async_timeout.timeout(timeout=timeout,
loop=self._loop):
await self._task
except asyncio.CancelledError:
pass
except asyncio.TimeoutError as exc:
if self._explicit:
raise
context = {'message': "Job closing timed out",
'job': self,
'exception': exc}
if self._source_traceback is not None:
context['source_traceback'] = self._source_traceback
scheduler.call_exception_handler(context)
except Exception as exc:
if self._explicit:
raise
self._report_exception(exc)
def _start(self):
assert self._task is None
self._task = self._loop.create_task(self._coro)
self._task.add_done_callback(self._done_callback)
self._started.set_result(None)
def _done_callback(self, task):
scheduler = self._scheduler
scheduler._done(self)
try:
exc = task.exception()
except asyncio.CancelledError:
pass
else:
if exc is not None and not self._explicit:
self._report_exception(exc)
scheduler._failed_tasks.put_nowait(task)
self._scheduler = None # drop backref
self._closed = True
def _report_exception(self, exc):
context = {'message': "Job processing failed",
'job': self,
'exception': exc}
if self._source_traceback is not None:
context['source_traceback'] = self._source_traceback
self._scheduler.call_exception_handler(context)

144
core/job/_scheduler.py Normal file
View file

@ -0,0 +1,144 @@
import asyncio
from ._job import Job
try:
from collections.abc import Collection
except ImportError: # pragma: no cover
# Python 3.5 has no Collection ABC class
from collections.abc import Sized, Iterable, Container
bases = Sized, Iterable, Container
else: # pragma: no cover
bases = (Collection,)
class Scheduler(*bases):
def __init__(self, *, close_timeout, limit, pending_limit,
exception_handler, loop):
self._loop = loop
self._jobs = set()
self._close_timeout = close_timeout
self._limit = limit
self._exception_handler = exception_handler
self._failed_tasks = asyncio.Queue(loop=loop)
self._failed_task = loop.create_task(self._wait_failed())
self._pending = asyncio.Queue(maxsize=pending_limit, loop=loop)
self._closed = False
def __iter__(self):
return iter(list(self._jobs))
def __len__(self):
return len(self._jobs)
def __contains__(self, job):
return job in self._jobs
def __repr__(self):
info = []
if self._closed:
info.append('closed')
info = ' '.join(info)
if info:
info += ' '
return '<Scheduler {}jobs={}>'.format(info, len(self))
@property
def limit(self):
return self._limit
@property
def pending_limit(self):
return self._pending.maxsize
@property
def close_timeout(self):
return self._close_timeout
@property
def active_count(self):
return len(self._jobs) - self._pending.qsize()
@property
def pending_count(self):
return self._pending.qsize()
@property
def closed(self):
return self._closed
async def spawn(self, coro, name=None, type=None):
if self._closed:
raise RuntimeError("Scheduling a new job after closing")
job = Job(coro, name, type, self, self._loop)
should_start = (self._limit is None or
self.active_count < self._limit)
self._jobs.add(job)
if should_start:
job._start()
else:
# wait for free slot in queue
await self._pending.put(job)
return job
async def close(self):
if self._closed:
return
self._closed = True # prevent adding new jobs
jobs = self._jobs
if jobs:
# cleanup pending queue
# all job will be started on closing
while not self._pending.empty():
self._pending.get_nowait()
await asyncio.gather(
*[job._close(self._close_timeout) for job in jobs],
loop=self._loop, return_exceptions=True)
self._jobs.clear()
self._failed_tasks.put_nowait(None)
await self._failed_task
def call_exception_handler(self, context):
handler = self._exception_handler
if handler is None:
handler = self._loop.call_exception_handler(context)
else:
handler(self, context)
@property
def exception_handler(self):
return self._exception_handler
def _done(self, job):
self._jobs.discard(job)
if not self.pending_count:
return
# No pending jobs when limit is None
# Safe to subtract.
ntodo = self._limit - self.active_count
i = 0
while i < ntodo:
if not self.pending_count:
return
new_job = self._pending.get_nowait()
if new_job.closed:
continue
new_job._start()
i += 1
async def _wait_failed(self):
# a coroutine for waiting failed tasks
# without awaiting for failed tasks async raises a warning
while True:
task = await self._failed_tasks.get()
if task is None:
return # closing
try:
await task # should raise exception
except Exception:
# Cleanup a warning
# self.call_exception_handler() is already called
# by Job._add_done_callback
# Thus we caught an task exception and we are good citizens
pass

51
core/job/aiohttp.py Normal file
View file

@ -0,0 +1,51 @@
from functools import wraps
from aiohttp.web import View
from . import create_scheduler
__all__ = ('setup', 'spawn', 'get_scheduler', 'get_scheduler_from_app',
'atomic')
def get_scheduler(request):
scheduler = get_scheduler_from_request(request)
if scheduler is None:
raise RuntimeError(
"Call aiojobs.aiohttp.setup() on application initialization")
return scheduler
def get_scheduler_from_app(app):
return app.get('AIOJOBS_SCHEDULER')
def get_scheduler_from_request(request):
return request.config_dict.get('AIOJOBS_SCHEDULER')
async def spawn(request, coro, name="Manuel"):
return await get_scheduler(request).spawn(coro)
def atomic(coro):
@wraps(coro)
async def wrapper(request):
if isinstance(request, View):
# Class Based View decorated.
request = request.request
job = await spawn(request, coro(request))
return await job.wait()
return wrapper
def setup(app, **kwargs):
async def on_startup(app):
app['AIOJOBS_SCHEDULER'] = await create_scheduler(**kwargs)
async def on_cleanup(app):
await app['AIOJOBS_SCHEDULER'].close()
app.on_startup.append(on_startup)
app.on_cleanup.append(on_cleanup)

26
core/utils/encoder.py Normal file
View file

@ -0,0 +1,26 @@
from json import JSONEncoder
class ComplexEncoder(JSONEncoder):
def default(self, obj):
from core.database.model import ActorModel
from core.database.orm_framework import DBModel
from core.api.kettle_logic import CBPiKettleLogic
try:
if isinstance(obj, DBModel):
return obj.__dict__
elif isinstance(obj, ActorModel):
return None
elif hasattr(obj, "callback"):
return obj()
else:
return None
except TypeError as e:
pass
return None

View file

@ -1,6 +1,8 @@
from pprint import pprint
from core.api.property import Property
from core.utils.encoder import ComplexEncoder
__all__ = ['load_config',"json_dumps", "parse_props"]
@ -21,23 +23,6 @@ def load_config(fname):
pass
class ComplexEncoder(JSONEncoder):
def default(self, obj):
try:
if isinstance(obj, DBModel):
return obj.__dict__
elif isinstance(obj, ActorModel):
return None
elif hasattr(obj, "callback"):
return obj()
else:
return None
except TypeError as e:
pass
return None
def json_dumps(obj):

Binary file not shown.

View file

@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 68b21bdf85f832d5bb6e445088bd68e4
config: a7fdf21acdd201956ed9899e36546207
tags: 645f666f9bcd5a90fca523b33c5a78b7

View file

@ -13,6 +13,7 @@ ActorController
.. automodule:: core.controller.actor_controller
:members:
:inherited-members:
Custom Actor
^^^^^^^^^^^^^

View file

@ -10,6 +10,7 @@ Welcome to CraftBeerPi's documentation!
.. toctree::
:maxdepth: 3
install
core
actor
sensor

View file

@ -0,0 +1,12 @@
Installation
============
Please make sure that Python 3.6 is installed
::
git clone https://github.com/manuel83/craftbeerpi4
cd craftbeerpi4
pip install -r requirements.txt

View file

@ -1,701 +0,0 @@
@import url("basic.css");
/* -- page layout ----------------------------------------------------------- */
body {
font-family: Georgia, serif;
font-size: 17px;
background-color: #fff;
color: #000;
margin: 0;
padding: 0;
}
div.document {
width: 940px;
margin: 30px auto 0 auto;
}
div.documentwrapper {
float: left;
width: 100%;
}
div.bodywrapper {
margin: 0 0 0 220px;
}
div.sphinxsidebar {
width: 220px;
font-size: 14px;
line-height: 1.5;
}
hr {
border: 1px solid #B1B4B6;
}
div.body {
background-color: #fff;
color: #3E4349;
padding: 0 30px 0 30px;
}
div.body > .section {
text-align: left;
}
div.footer {
width: 940px;
margin: 20px auto 30px auto;
font-size: 14px;
color: #888;
text-align: right;
}
div.footer a {
color: #888;
}
p.caption {
font-family: inherit;
font-size: inherit;
}
div.relations {
display: none;
}
div.sphinxsidebar a {
color: #444;
text-decoration: none;
border-bottom: 1px dotted #999;
}
div.sphinxsidebar a:hover {
border-bottom: 1px solid #999;
}
div.sphinxsidebarwrapper {
padding: 18px 10px;
}
div.sphinxsidebarwrapper p.logo {
padding: 0;
margin: -10px 0 0 0px;
text-align: center;
}
div.sphinxsidebarwrapper h1.logo {
margin-top: -10px;
text-align: center;
margin-bottom: 5px;
text-align: left;
}
div.sphinxsidebarwrapper h1.logo-name {
margin-top: 0px;
}
div.sphinxsidebarwrapper p.blurb {
margin-top: 0;
font-style: normal;
}
div.sphinxsidebar h3,
div.sphinxsidebar h4 {
font-family: Georgia, serif;
color: #444;
font-size: 24px;
font-weight: normal;
margin: 0 0 5px 0;
padding: 0;
}
div.sphinxsidebar h4 {
font-size: 20px;
}
div.sphinxsidebar h3 a {
color: #444;
}
div.sphinxsidebar p.logo a,
div.sphinxsidebar h3 a,
div.sphinxsidebar p.logo a:hover,
div.sphinxsidebar h3 a:hover {
border: none;
}
div.sphinxsidebar p {
color: #555;
margin: 10px 0;
}
div.sphinxsidebar ul {
margin: 10px 0;
padding: 0;
color: #000;
}
div.sphinxsidebar ul li.toctree-l1 > a {
font-size: 120%;
}
div.sphinxsidebar ul li.toctree-l2 > a {
font-size: 110%;
}
div.sphinxsidebar input {
border: 1px solid #CCC;
font-family: Georgia, serif;
font-size: 1em;
}
div.sphinxsidebar hr {
border: none;
height: 1px;
color: #AAA;
background: #AAA;
text-align: left;
margin-left: 0;
width: 50%;
}
div.sphinxsidebar .badge {
border-bottom: none;
}
div.sphinxsidebar .badge:hover {
border-bottom: none;
}
/* To address an issue with donation coming after search */
div.sphinxsidebar h3.donation {
margin-top: 10px;
}
/* -- body styles ----------------------------------------------------------- */
a {
color: #004B6B;
text-decoration: underline;
}
a:hover {
color: #6D4100;
text-decoration: underline;
}
div.body h1,
div.body h2,
div.body h3,
div.body h4,
div.body h5,
div.body h6 {
font-family: Georgia, serif;
font-weight: normal;
margin: 30px 0px 10px 0px;
padding: 0;
}
div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }
div.body h2 { font-size: 180%; }
div.body h3 { font-size: 150%; }
div.body h4 { font-size: 130%; }
div.body h5 { font-size: 100%; }
div.body h6 { font-size: 100%; }
a.headerlink {
color: #DDD;
padding: 0 4px;
text-decoration: none;
}
a.headerlink:hover {
color: #444;
background: #EAEAEA;
}
div.body p, div.body dd, div.body li {
line-height: 1.4em;
}
div.admonition {
margin: 20px 0px;
padding: 10px 30px;
background-color: #EEE;
border: 1px solid #CCC;
}
div.admonition tt.xref, div.admonition code.xref, div.admonition a tt {
background-color: #FBFBFB;
border-bottom: 1px solid #fafafa;
}
div.admonition p.admonition-title {
font-family: Georgia, serif;
font-weight: normal;
font-size: 24px;
margin: 0 0 10px 0;
padding: 0;
line-height: 1;
}
div.admonition p.last {
margin-bottom: 0;
}
div.highlight {
background-color: #fff;
}
dt:target, .highlight {
background: #FAF3E8;
}
div.warning {
background-color: #FCC;
border: 1px solid #FAA;
}
div.danger {
background-color: #FCC;
border: 1px solid #FAA;
-moz-box-shadow: 2px 2px 4px #D52C2C;
-webkit-box-shadow: 2px 2px 4px #D52C2C;
box-shadow: 2px 2px 4px #D52C2C;
}
div.error {
background-color: #FCC;
border: 1px solid #FAA;
-moz-box-shadow: 2px 2px 4px #D52C2C;
-webkit-box-shadow: 2px 2px 4px #D52C2C;
box-shadow: 2px 2px 4px #D52C2C;
}
div.caution {
background-color: #FCC;
border: 1px solid #FAA;
}
div.attention {
background-color: #FCC;
border: 1px solid #FAA;
}
div.important {
background-color: #EEE;
border: 1px solid #CCC;
}
div.note {
background-color: #EEE;
border: 1px solid #CCC;
}
div.tip {
background-color: #EEE;
border: 1px solid #CCC;
}
div.hint {
background-color: #EEE;
border: 1px solid #CCC;
}
div.seealso {
background-color: #EEE;
border: 1px solid #CCC;
}
div.topic {
background-color: #EEE;
}
p.admonition-title {
display: inline;
}
p.admonition-title:after {
content: ":";
}
pre, tt, code {
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
font-size: 0.9em;
}
.hll {
background-color: #FFC;
margin: 0 -12px;
padding: 0 12px;
display: block;
}
img.screenshot {
}
tt.descname, tt.descclassname, code.descname, code.descclassname {
font-size: 0.95em;
}
tt.descname, code.descname {
padding-right: 0.08em;
}
img.screenshot {
-moz-box-shadow: 2px 2px 4px #EEE;
-webkit-box-shadow: 2px 2px 4px #EEE;
box-shadow: 2px 2px 4px #EEE;
}
table.docutils {
border: 1px solid #888;
-moz-box-shadow: 2px 2px 4px #EEE;
-webkit-box-shadow: 2px 2px 4px #EEE;
box-shadow: 2px 2px 4px #EEE;
}
table.docutils td, table.docutils th {
border: 1px solid #888;
padding: 0.25em 0.7em;
}
table.field-list, table.footnote {
border: none;
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
table.footnote {
margin: 15px 0;
width: 100%;
border: 1px solid #EEE;
background: #FDFDFD;
font-size: 0.9em;
}
table.footnote + table.footnote {
margin-top: -15px;
border-top: none;
}
table.field-list th {
padding: 0 0.8em 0 0;
}
table.field-list td {
padding: 0;
}
table.field-list p {
margin-bottom: 0.8em;
}
/* Cloned from
* https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68
*/
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
table.footnote td.label {
width: .1px;
padding: 0.3em 0 0.3em 0.5em;
}
table.footnote td {
padding: 0.3em 0.5em;
}
dl {
margin: 0;
padding: 0;
}
dl dd {
margin-left: 30px;
}
blockquote {
margin: 0 0 0 30px;
padding: 0;
}
ul, ol {
/* Matches the 30px from the narrow-screen "li > ul" selector below */
margin: 10px 0 10px 30px;
padding: 0;
}
pre {
background: #EEE;
padding: 7px 30px;
margin: 15px 0px;
line-height: 1.3em;
}
div.viewcode-block:target {
background: #ffd;
}
dl pre, blockquote pre, li pre {
margin-left: 0;
padding-left: 30px;
}
tt, code {
background-color: #ecf0f3;
color: #222;
/* padding: 1px 2px; */
}
tt.xref, code.xref, a tt {
background-color: #FBFBFB;
border-bottom: 1px solid #fff;
}
a.reference {
text-decoration: none;
border-bottom: 1px dotted #004B6B;
}
/* Don't put an underline on images */
a.image-reference, a.image-reference:hover {
border-bottom: none;
}
a.reference:hover {
border-bottom: 1px solid #6D4100;
}
a.footnote-reference {
text-decoration: none;
font-size: 0.7em;
vertical-align: top;
border-bottom: 1px dotted #004B6B;
}
a.footnote-reference:hover {
border-bottom: 1px solid #6D4100;
}
a:hover tt, a:hover code {
background: #EEE;
}
@media screen and (max-width: 870px) {
div.sphinxsidebar {
display: none;
}
div.document {
width: 100%;
}
div.documentwrapper {
margin-left: 0;
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
}
div.bodywrapper {
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
margin-left: 0;
}
ul {
margin-left: 0;
}
li > ul {
/* Matches the 30px from the "ul, ol" selector above */
margin-left: 30px;
}
.document {
width: auto;
}
.footer {
width: auto;
}
.bodywrapper {
margin: 0;
}
.footer {
width: auto;
}
.github {
display: none;
}
}
@media screen and (max-width: 875px) {
body {
margin: 0;
padding: 20px 30px;
}
div.documentwrapper {
float: none;
background: #fff;
}
div.sphinxsidebar {
display: block;
float: none;
width: 102.5%;
margin: 50px -30px -20px -30px;
padding: 10px 20px;
background: #333;
color: #FFF;
}
div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
div.sphinxsidebar h3 a {
color: #fff;
}
div.sphinxsidebar a {
color: #AAA;
}
div.sphinxsidebar p.logo {
display: none;
}
div.document {
width: 100%;
margin: 0;
}
div.footer {
display: none;
}
div.bodywrapper {
margin: 0;
}
div.body {
min-height: 0;
padding: 0;
}
.rtd_doc_footer {
display: none;
}
.document {
width: auto;
}
.footer {
width: auto;
}
.footer {
width: auto;
}
.github {
display: none;
}
}
/* misc. */
.revsys-inline {
display: none!important;
}
/* Make nested-list/multi-paragraph items look better in Releases changelog
* pages. Without this, docutils' magical list fuckery causes inconsistent
* formatting between different release sub-lists.
*/
div#changelog > div.section > ul > li > p:only-child {
margin-bottom: 0;
}
/* Hide fugly table cell borders in ..bibliography:: directive output */
table.docutils.citation, table.docutils.citation td, table.docutils.citation th {
border: none;
/* Below needed in some edge cases; if not applied, bottom shadows appear */
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
/* relbar */
.related {
line-height: 30px;
width: 100%;
font-size: 0.9rem;
}
.related.top {
border-bottom: 1px solid #EEE;
margin-bottom: 20px;
}
.related.bottom {
border-top: 1px solid #EEE;
}
.related ul {
padding: 0;
margin: 0;
list-style: none;
}
.related li {
display: inline;
}
nav#rellinks {
float: right;
}
nav#rellinks li+li:before {
content: "|";
}
nav#breadcrumbs li+li:before {
content: "\00BB";
}
/* Hide certain items when printing */
@media print {
div.related {
display: none;
}
}

1
docs/_static/css/badge_only.css vendored Normal file
View file

@ -0,0 +1 @@
.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../fonts/fontawesome-webfont.eot");src:url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff") format("woff"),url("../fonts/fontawesome-webfont.ttf") format("truetype"),url("../fonts/fontawesome-webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}

6
docs/_static/css/theme.css vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
/* This file intentionally left blank. */

BIN
docs/_static/fonts/Inconsolata-Bold.ttf vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
docs/_static/fonts/Inconsolata.ttf vendored Normal file

Binary file not shown.

BIN
docs/_static/fonts/Lato-Bold.ttf vendored Normal file

Binary file not shown.

BIN
docs/_static/fonts/Lato-Regular.ttf vendored Normal file

Binary file not shown.

BIN
docs/_static/fonts/Lato/lato-bold.eot vendored Normal file

Binary file not shown.

BIN
docs/_static/fonts/Lato/lato-bold.ttf vendored Normal file

Binary file not shown.

BIN
docs/_static/fonts/Lato/lato-bold.woff vendored Normal file

Binary file not shown.

BIN
docs/_static/fonts/Lato/lato-bold.woff2 vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
docs/_static/fonts/Lato/lato-italic.eot vendored Normal file

Binary file not shown.

BIN
docs/_static/fonts/Lato/lato-italic.ttf vendored Normal file

Binary file not shown.

BIN
docs/_static/fonts/Lato/lato-italic.woff vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
docs/_static/fonts/Lato/lato-regular.eot vendored Normal file

Binary file not shown.

BIN
docs/_static/fonts/Lato/lato-regular.ttf vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
docs/_static/fonts/RobotoSlab-Bold.ttf vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

2671
docs/_static/fonts/fontawesome-webfont.svg vendored Normal file

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

4
docs/_static/js/modernizr.min.js vendored Normal file

File diff suppressed because one or more lines are too long

3
docs/_static/js/theme.js vendored Normal file
View file

@ -0,0 +1,3 @@
/* sphinx_rtd_theme version 0.4.2 | MIT license */
/* Built 20181005 13:10 */
require=function r(s,a,l){function c(e,n){if(!a[e]){if(!s[e]){var i="function"==typeof require&&require;if(!n&&i)return i(e,!0);if(u)return u(e,!0);var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}var o=a[e]={exports:{}};s[e][0].call(o.exports,function(n){return c(s[e][1][n]||n)},o,o.exports,r,s,a,l)}return a[e].exports}for(var u="function"==typeof require&&require,n=0;n<l.length;n++)c(l[n]);return c}({"sphinx-rtd-theme":[function(n,e,i){var jQuery="undefined"!=typeof window?window.jQuery:n("jquery");e.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(e){var i=this;void 0===e&&(e=!0),i.isRunning||(i.isRunning=!0,jQuery(function(n){i.init(n),i.reset(),i.win.on("hashchange",i.reset),e&&i.win.on("scroll",function(){i.linkScroll||i.winScroll||(i.winScroll=!0,requestAnimationFrame(function(){i.onScroll()}))}),i.win.on("resize",function(){i.winResize||(i.winResize=!0,requestAnimationFrame(function(){i.onResize()}))}),i.onResize()}))},enableSticky:function(){this.enable(!0)},init:function(i){i(document);var t=this;this.navBar=i("div.wy-side-scroll:first"),this.win=i(window),i(document).on("click","[data-toggle='wy-nav-top']",function(){i("[data-toggle='wy-nav-shift']").toggleClass("shift"),i("[data-toggle='rst-versions']").toggleClass("shift")}).on("click",".wy-menu-vertical .current ul li a",function(){var n=i(this);i("[data-toggle='wy-nav-shift']").removeClass("shift"),i("[data-toggle='rst-versions']").toggleClass("shift"),t.toggleCurrent(n),t.hashChange()}).on("click","[data-toggle='rst-current-version']",function(){i("[data-toggle='rst-versions']").toggleClass("shift-up")}),i("table.docutils:not(.field-list,.footnote,.citation)").wrap("<div class='wy-table-responsive'></div>"),i("table.docutils.footnote").wrap("<div class='wy-table-responsive footnote'></div>"),i("table.docutils.citation").wrap("<div class='wy-table-responsive citation'></div>"),i(".wy-menu-vertical ul").not(".simple").siblings("a").each(function(){var e=i(this);expand=i('<span class="toctree-expand"></span>'),expand.on("click",function(n){return t.toggleCurrent(e),n.stopPropagation(),!1}),e.prepend(expand)})},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),i=e.find('[href="'+n+'"]');if(0===i.length){var t=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(i=e.find('[href="#'+t.attr("id")+'"]')).length&&(i=e.find('[href="#"]'))}0<i.length&&($(".wy-menu-vertical .current").removeClass("current"),i.addClass("current"),i.closest("li.toctree-l1").addClass("current"),i.closest("li.toctree-l1").parent().addClass("current"),i.closest("li.toctree-l1").addClass("current"),i.closest("li.toctree-l2").addClass("current"),i.closest("li.toctree-l3").addClass("current"),i.closest("li.toctree-l4").addClass("current"))}catch(o){console.log("Error expanding nav for anchor",o)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,i=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(i),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",function(){this.linkScroll=!1})},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current"),e.siblings().find("li.current").removeClass("current"),e.find("> ul li.current").removeClass("current"),e.toggleClass("current")}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:e.exports.ThemeNav,StickyNav:e.exports.ThemeNav}),function(){for(var r=0,n=["ms","moz","webkit","o"],e=0;e<n.length&&!window.requestAnimationFrame;++e)window.requestAnimationFrame=window[n[e]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[n[e]+"CancelAnimationFrame"]||window[n[e]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(n,e){var i=(new Date).getTime(),t=Math.max(0,16-(i-r)),o=window.setTimeout(function(){n(i+t)},t);return r=i+t,o}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(n){clearTimeout(n)})}()},{jquery:"jquery"}]},{},["sphinx-rtd-theme"]);

View file

@ -1,77 +1,69 @@
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #8f5902; font-style: italic } /* Comment */
.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */
.highlight .g { color: #000000 } /* Generic */
.highlight .k { color: #004461; font-weight: bold } /* Keyword */
.highlight .l { color: #000000 } /* Literal */
.highlight .n { color: #000000 } /* Name */
.highlight .o { color: #582800 } /* Operator */
.highlight .x { color: #000000 } /* Other */
.highlight .p { color: #000000; font-weight: bold } /* Punctuation */
.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #8f5902 } /* Comment.Preproc */
.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */
.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */
.highlight .gd { color: #a40000 } /* Generic.Deleted */
.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
.highlight .gr { color: #ef2929 } /* Generic.Error */
.highlight .c { color: #408080; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #BC7A00 } /* Comment.Preproc */
.highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #745334 } /* Generic.Prompt */
.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */
.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */
.highlight .ld { color: #000000 } /* Literal.Date */
.highlight .m { color: #990000 } /* Literal.Number */
.highlight .s { color: #4e9a06 } /* Literal.String */
.highlight .na { color: #c4a000 } /* Name.Attribute */
.highlight .nb { color: #004461 } /* Name.Builtin */
.highlight .nc { color: #000000 } /* Name.Class */
.highlight .no { color: #000000 } /* Name.Constant */
.highlight .nd { color: #888888 } /* Name.Decorator */
.highlight .ni { color: #ce5c00 } /* Name.Entity */
.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #000000 } /* Name.Function */
.highlight .nl { color: #f57900 } /* Name.Label */
.highlight .nn { color: #000000 } /* Name.Namespace */
.highlight .nx { color: #000000 } /* Name.Other */
.highlight .py { color: #000000 } /* Name.Property */
.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #000000 } /* Name.Variable */
.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */
.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */
.highlight .mb { color: #990000 } /* Literal.Number.Bin */
.highlight .mf { color: #990000 } /* Literal.Number.Float */
.highlight .mh { color: #990000 } /* Literal.Number.Hex */
.highlight .mi { color: #990000 } /* Literal.Number.Integer */
.highlight .mo { color: #990000 } /* Literal.Number.Oct */
.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */
.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */
.highlight .sc { color: #4e9a06 } /* Literal.String.Char */
.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */
.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */
.highlight .se { color: #4e9a06 } /* Literal.String.Escape */
.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */
.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */
.highlight .sx { color: #4e9a06 } /* Literal.String.Other */
.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */
.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */
.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */
.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #000000 } /* Name.Function.Magic */
.highlight .vc { color: #000000 } /* Name.Variable.Class */
.highlight .vg { color: #000000 } /* Name.Variable.Global */
.highlight .vi { color: #000000 } /* Name.Variable.Instance */
.highlight .vm { color: #000000 } /* Name.Variable.Magic */
.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */
.highlight .gt { color: #0044DD } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #7D9029 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
.highlight .no { color: #880000 } /* Name.Constant */
.highlight .nd { color: #AA22FF } /* Name.Decorator */
.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0000FF } /* Name.Function */
.highlight .nl { color: #A0A000 } /* Name.Label */
.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #666666 } /* Literal.Number.Bin */
.highlight .mf { color: #666666 } /* Literal.Number.Float */
.highlight .mh { color: #666666 } /* Literal.Number.Hex */
.highlight .mi { color: #666666 } /* Literal.Number.Integer */
.highlight .mo { color: #666666 } /* Literal.Number.Oct */
.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #BB6688 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0000FF } /* Name.Function.Magic */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .vm { color: #19177C } /* Name.Variable.Magic */
.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */

View file

@ -1,38 +1,156 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Actor &#8212; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Actor &mdash; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Sensor" href="sensor.html" />
<link rel="prev" title="Welcome to CraftBeerPis documentation!" href="index.html" />
<link rel="prev" title="Core" href="core.html" />
<script src="_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav">
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
<div class="wy-grid-for-nav">
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<div class="body" role="main">
<a href="index.html" class="icon icon-home"> CraftBeerPi
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="install.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="core.html">Core</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Actor</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#architecture">Architecture</a></li>
<li class="toctree-l2"><a class="reference internal" href="#module-core.controller.actor_controller">ActorController</a></li>
<li class="toctree-l2"><a class="reference internal" href="#custom-actor">Custom Actor</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">CraftBeerPi</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Actor</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/actor.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="actor">
<h1>Actor<a class="headerlink" href="#actor" title="Permalink to this headline"></a></h1>
@ -46,6 +164,191 @@
<dt id="core.controller.actor_controller.ActorController">
<em class="property">class </em><code class="descclassname">core.controller.actor_controller.</code><code class="descname">ActorController</code><span class="sig-paren">(</span><em>cbpi</em><span class="sig-paren">)</span><a class="headerlink" href="#core.controller.actor_controller.ActorController" title="Permalink to this definition"></a></dt>
<dd><p>The main actor controller</p>
<dl class="method">
<dt id="core.controller.actor_controller.ActorController.get_all">
<code class="descname">get_all</code><span class="sig-paren">(</span><em>force_db_update=False</em><span class="sig-paren">)</span><a class="headerlink" href="#core.controller.actor_controller.ActorController.get_all" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>force_db_update</strong> </td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="core.controller.actor_controller.ActorController.http_add">
<code class="descname">http_add</code><span class="sig-paren">(</span><em>request</em><span class="sig-paren">)</span><a class="headerlink" href="#core.controller.actor_controller.ActorController.http_add" title="Permalink to this definition"></a></dt>
<dd><p>
description: This end-point allow to test that service is up.
tags:
- REST API
produces:
- application/json
responses:</p>
<blockquote>
<div><dl class="docutils">
<dt>“200”:</dt>
<dd>description: successful operation. Return “pong” text</dd>
<dt>“405”:</dt>
<dd>description: invalid HTTP Method</dd>
</dl>
</div></blockquote>
</dd></dl>
<dl class="method">
<dt id="core.controller.actor_controller.ActorController.http_delete_one">
<code class="descname">http_delete_one</code><span class="sig-paren">(</span><em>request</em><span class="sig-paren">)</span><a class="headerlink" href="#core.controller.actor_controller.ActorController.http_delete_one" title="Permalink to this definition"></a></dt>
<dd><p>
description: This end-point allow to test that service is up.
tags:
- REST API
produces:
- text/plain
responses:</p>
<blockquote>
<div><dl class="docutils">
<dt>“200”:</dt>
<dd>description: successful operation. Return “pong” text</dd>
<dt>“405”:</dt>
<dd>description: invalid HTTP Method</dd>
</dl>
</div></blockquote>
</dd></dl>
<dl class="method">
<dt id="core.controller.actor_controller.ActorController.http_get_all">
<code class="descname">http_get_all</code><span class="sig-paren">(</span><em>request</em><span class="sig-paren">)</span><a class="headerlink" href="#core.controller.actor_controller.ActorController.http_get_all" title="Permalink to this definition"></a></dt>
<dd><p>test</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>request</strong> </td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="core.controller.actor_controller.ActorController.http_get_one">
<code class="descname">http_get_one</code><span class="sig-paren">(</span><em>request</em><span class="sig-paren">)</span><a class="headerlink" href="#core.controller.actor_controller.ActorController.http_get_one" title="Permalink to this definition"></a></dt>
<dd><p>
description: This end-point allow to test that service is up.
tags:
- REST API
produces:
- application/json
parameters:
- name: “id”</p>
<blockquote>
<div>in: “path”
description: “ID of object to return”
required: true
type: “integer”
format: “int64”</div></blockquote>
<dl class="docutils">
<dt>responses:</dt>
<dd><dl class="first last docutils">
<dt>“200”:</dt>
<dd>description: successful operation. Return “pong” text</dd>
<dt>“405”:</dt>
<dd>description: invalid HTTP Method</dd>
</dl>
</dd>
</dl>
</dd></dl>
<dl class="method">
<dt id="core.controller.actor_controller.ActorController.http_off">
<code class="descname">http_off</code><span class="sig-paren">(</span><em>request</em><span class="sig-paren">)</span> &#x2192; aiohttp.web_response.Response<a class="headerlink" href="#core.controller.actor_controller.ActorController.http_off" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>request</strong> </td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="core.controller.actor_controller.ActorController.http_on">
<code class="descname">http_on</code><span class="sig-paren">(</span><em>request</em><span class="sig-paren">)</span> &#x2192; aiohttp.web_response.Response<a class="headerlink" href="#core.controller.actor_controller.ActorController.http_on" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>request</strong> </td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="core.controller.actor_controller.ActorController.http_toggle">
<code class="descname">http_toggle</code><span class="sig-paren">(</span><em>request</em><span class="sig-paren">)</span> &#x2192; aiohttp.web_response.Response<a class="headerlink" href="#core.controller.actor_controller.ActorController.http_toggle" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>request</strong> </td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="core.controller.actor_controller.ActorController.http_update">
<code class="descname">http_update</code><span class="sig-paren">(</span><em>request</em><span class="sig-paren">)</span><a class="headerlink" href="#core.controller.actor_controller.ActorController.http_update" title="Permalink to this definition"></a></dt>
<dd><p>
description: This end-point allow to test that service is up.
tags:
- REST API
produces:
- application/json
parameters:
- in: body</p>
<blockquote>
<div><p>name: body
description: Created user object
required: false
schema:</p>
<blockquote>
<div><p>type: object
properties:</p>
<blockquote>
<div><dl class="docutils">
<dt>id:</dt>
<dd>type: integer
format: int64</dd>
</dl>
</div></blockquote>
</div></blockquote>
</div></blockquote>
<dl class="docutils">
<dt>responses:</dt>
<dd><dl class="first last docutils">
<dt>“200”:</dt>
<dd>description: successful operation. Return “pong” text</dd>
<dt>“405”:</dt>
<dd>description: invalid HTTP Method</dd>
</dl>
</dd>
</dl>
</dd></dl>
<dl class="method">
<dt id="core.controller.actor_controller.ActorController.init">
<code class="descname">init</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#core.controller.actor_controller.ActorController.init" title="Permalink to this definition"></a></dt>
@ -63,7 +366,9 @@
<dl class="method">
<dt id="core.controller.actor_controller.ActorController.off">
<code class="descname">off</code><span class="sig-paren">(</span><em>id</em>, <em>**kwargs</em><span class="sig-paren">)</span> &#x2192; None<a class="headerlink" href="#core.controller.actor_controller.ActorController.off" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<dd><p>Method to switch and actor off
Supporting Event Topic “actor/+/off”</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
@ -78,12 +383,43 @@
</dd></dl>
<dl class="method">
<dt id="core.controller.actor_controller.ActorController.register">
<code class="descname">register</code><span class="sig-paren">(</span><em>name</em>, <em>clazz</em><span class="sig-paren">)</span> &#x2192; None<a class="headerlink" href="#core.controller.actor_controller.ActorController.register" title="Permalink to this definition"></a></dt>
<dd><p>Register a new actor type
:param name: actor name
:param clazz: actor class
:return: None</p>
<dt id="core.controller.actor_controller.ActorController.on">
<code class="descname">on</code><span class="sig-paren">(</span><em>id</em>, <em>power=100</em>, <em>**kwargs</em><span class="sig-paren">)</span> &#x2192; None<a class="headerlink" href="#core.controller.actor_controller.ActorController.on" title="Permalink to this definition"></a></dt>
<dd><p>Method to switch an actor on.
Supporting Event Topic “actor/+/on”</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
<li><strong>id</strong> the actor id</li>
<li><strong>power</strong> as integer value between 1 and 100</li>
<li><strong>kwargs</strong> </li>
</ul>
</td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last"></p>
</td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="core.controller.actor_controller.ActorController.toggle">
<code class="descname">toggle</code><span class="sig-paren">(</span><em>id</em>, <em>power=100</em>, <em>**kwargs</em><span class="sig-paren">)</span> &#x2192; None<a class="headerlink" href="#core.controller.actor_controller.ActorController.toggle" title="Permalink to this definition"></a></dt>
<dd><p>Method to toggle an actor on or off
Supporting Event Topic “actor/+/toggle”</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>power</strong> </td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"></td>
</tr>
</tbody>
</table>
</dd></dl>
</dd></dl>
@ -223,75 +559,61 @@
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">CraftBeerPi</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Actor</a></li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
<li class="toctree-l1"><a class="reference internal" href="step.html">Step API</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li>Previous: <a href="index.html" title="previous chapter">Welcome to CraftBeerPis documentation!</a></li>
<li>Next: <a href="sensor.html" title="next chapter">Sensor</a></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="sensor.html" class="btn btn-neutral float-right" title="Sensor" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
<a href="core.html" class="btn btn-neutral" title="Core" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2018, Manuel Fritsch
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2018, Manuel Fritsch.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/actor.rst.txt"
rel="nofollow">Page source</a>
</div>
</section>
</div>
</body>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View file

@ -1,113 +1,212 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Core &#8212; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Core &mdash; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Actor" href="actor.html" />
<link rel="prev" title="Welcome to CraftBeerPis documentation!" href="index.html" />
<link rel="prev" title="Installation" href="install.html" />
<script src="_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav">
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
<div class="wy-grid-for-nav">
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<div class="body" role="main">
<a href="index.html" class="icon icon-home"> CraftBeerPi
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="install.html">Installation</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">CraftBeerPi</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Core</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/core.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="core">
<h1>Core<a class="headerlink" href="#core" title="Permalink to this headline"></a></h1>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">CraftBeerPi</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li>Previous: <a href="index.html" title="previous chapter">Welcome to CraftBeerPis documentation!</a></li>
<li>Next: <a href="actor.html" title="next chapter">Actor</a></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="actor.html" class="btn btn-neutral float-right" title="Actor" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
<a href="install.html" class="btn btn-neutral" title="Installation" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2018, Manuel Fritsch
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2018, Manuel Fritsch.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/core.rst.txt"
rel="nofollow">Page source</a>
</div>
</section>
</div>
</body>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View file

@ -1,37 +1,148 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Index &#8212; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Index &mdash; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="#" />
<link rel="search" title="Search" href="search.html" />
<link rel="search" title="Search" href="search.html" />
<script src="_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav">
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
<div class="wy-grid-for-nav">
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<div class="body" role="main">
<a href="index.html" class="icon icon-home"> CraftBeerPi
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="install.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">CraftBeerPi</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Index</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1 id="index">Index</h1>
@ -39,9 +150,11 @@
<div class="genindex-jumpbox">
<a href="#A"><strong>A</strong></a>
| <a href="#C"><strong>C</strong></a>
| <a href="#G"><strong>G</strong></a>
| <a href="#H"><strong>H</strong></a>
| <a href="#I"><strong>I</strong></a>
| <a href="#O"><strong>O</strong></a>
| <a href="#R"><strong>R</strong></a>
| <a href="#T"><strong>T</strong></a>
</div>
<h2 id="A">A</h2>
@ -64,6 +177,38 @@
</ul></td>
</tr></table>
<h2 id="G">G</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="actor.html#core.controller.actor_controller.ActorController.get_all">get_all() (core.controller.actor_controller.ActorController method)</a>
</li>
</ul></td>
</tr></table>
<h2 id="H">H</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="actor.html#core.controller.actor_controller.ActorController.http_add">http_add() (core.controller.actor_controller.ActorController method)</a>
</li>
<li><a href="actor.html#core.controller.actor_controller.ActorController.http_delete_one">http_delete_one() (core.controller.actor_controller.ActorController method)</a>
</li>
<li><a href="actor.html#core.controller.actor_controller.ActorController.http_get_all">http_get_all() (core.controller.actor_controller.ActorController method)</a>
</li>
<li><a href="actor.html#core.controller.actor_controller.ActorController.http_get_one">http_get_one() (core.controller.actor_controller.ActorController method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="actor.html#core.controller.actor_controller.ActorController.http_off">http_off() (core.controller.actor_controller.ActorController method)</a>
</li>
<li><a href="actor.html#core.controller.actor_controller.ActorController.http_on">http_on() (core.controller.actor_controller.ActorController method)</a>
</li>
<li><a href="actor.html#core.controller.actor_controller.ActorController.http_toggle">http_toggle() (core.controller.actor_controller.ActorController method)</a>
</li>
<li><a href="actor.html#core.controller.actor_controller.ActorController.http_update">http_update() (core.controller.actor_controller.ActorController method)</a>
</li>
</ul></td>
</tr></table>
<h2 id="I">I</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
@ -76,84 +221,70 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="actor.html#core.controller.actor_controller.ActorController.off">off() (core.controller.actor_controller.ActorController method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="actor.html#core.controller.actor_controller.ActorController.on">on() (core.controller.actor_controller.ActorController method)</a>
</li>
</ul></td>
</tr></table>
<h2 id="R">R</h2>
<h2 id="T">T</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="actor.html#core.controller.actor_controller.ActorController.register">register() (core.controller.actor_controller.ActorController method)</a>
<li><a href="actor.html#core.controller.actor_controller.ActorController.toggle">toggle() (core.controller.actor_controller.ActorController method)</a>
</li>
</ul></td>
</tr></table>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">CraftBeerPi</a></h1>
<h3>Navigation</h3>
<ul>
<li class="toctree-l1"><a class="reference internal" href="core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2018, Manuel Fritsch
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2018, Manuel Fritsch.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
</section>
</div>
</body>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View file

@ -1,42 +1,156 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome to CraftBeerPis documentation! &#8212; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Welcome to CraftBeerPis documentation! &mdash; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Core" href="core.html" />
<link rel="next" title="Installation" href="install.html" />
<script src="_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav">
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
<div class="wy-grid-for-nav">
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<div class="body" role="main">
<a href="#" class="icon icon-home"> CraftBeerPi
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="install.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="#">CraftBeerPi</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="#">Docs</a> &raquo;</li>
<li>Welcome to CraftBeerPis documentation!</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/index.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="welcome-to-craftbeerpi-s-documentation">
<h1>Welcome to CraftBeerPis documentation!<a class="headerlink" href="#welcome-to-craftbeerpi-s-documentation" title="Permalink to this headline"></a></h1>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="install.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a><ul>
<li class="toctree-l2"><a class="reference internal" href="actor.html#architecture">Architecture</a></li>
@ -55,74 +169,59 @@
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="#">CraftBeerPi</a></h1>
<h3>Navigation</h3>
<ul>
<li class="toctree-l1"><a class="reference internal" href="core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="#">Documentation overview</a><ul>
<li>Next: <a href="core.html" title="next chapter">Core</a></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="install.html" class="btn btn-neutral float-right" title="Installation" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2018, Manuel Fritsch
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2018, Manuel Fritsch.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/index.rst.txt"
rel="nofollow">Page source</a>
</div>
</section>
</div>
</body>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

220
docs/install.html Normal file
View file

@ -0,0 +1,220 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Installation &mdash; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Core" href="core.html" />
<link rel="prev" title="Welcome to CraftBeerPis documentation!" href="index.html" />
<script src="_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<a href="index.html" class="icon icon-home"> CraftBeerPi
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">CraftBeerPi</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Installation</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/install.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="installation">
<h1>Installation<a class="headerlink" href="#installation" title="Permalink to this headline"></a></h1>
<p>Please make sure that Python 3.6 is installed</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">git</span> <span class="n">clone</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">manuel83</span><span class="o">/</span><span class="n">craftbeerpi4</span>
<span class="n">cd</span> <span class="n">craftbeerpi4</span>
<span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">r</span> <span class="n">requirements</span><span class="o">.</span><span class="n">txt</span>
</pre></div>
</div>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="core.html" class="btn btn-neutral float-right" title="Core" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
<a href="index.html" class="btn btn-neutral" title="Welcome to CraftBeerPis documentation!" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2018, Manuel Fritsch
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

Binary file not shown.

View file

@ -1,39 +1,148 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Python Module Index &#8212; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Python Module Index &mdash; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<script src="_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav">
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
<div class="wy-grid-for-nav">
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<div class="body" role="main">
<a href="index.html" class="icon icon-home"> CraftBeerPi
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="install.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">CraftBeerPi</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Python Module Index</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Python Module Index</h1>
@ -65,70 +174,52 @@
</table>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">CraftBeerPi</a></h1>
<h3>Navigation</h3>
<ul>
<li class="toctree-l1"><a class="reference internal" href="core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2018, Manuel Fritsch
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2018, Manuel Fritsch.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
</section>
</div>
</body>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View file

@ -1,122 +1,216 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Search &#8212; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Search &mdash; CraftBeerPi 4.0 documentation</title>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/javascript" src="_static/searchtools.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="#" />
<script type="text/javascript">
jQuery(function() { Search.loadIndex("searchindex.js"); });
</script>
<script type="text/javascript" id="searchindexloader"></script>
<link rel="search" title="Search" href="#" />
<script src="_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav">
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
<div class="wy-grid-for-nav">
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<div class="body" role="main">
<h1 id="search-documentation">Search</h1>
<div id="fallback" class="admonition warning">
<script type="text/javascript">$('#fallback').hide();</script>
<p>
Please activate JavaScript to enable the search
functionality.
</p>
</div>
<p>
From here you can search these documents. Enter your search
words into the box below and click "search". Note that the search
function will automatically search for all of the words. Pages
containing fewer words won't appear in the result list.
</p>
<form action="" method="get">
<input type="text" name="q" value="" />
<input type="submit" value="search" />
<span id="search-progress" style="padding-left: 10px"></span>
</form>
<div id="search-results">
</div>
<a href="index.html" class="icon icon-home"> CraftBeerPi
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="#" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">CraftBeerPi</a></h1>
<h3>Navigation</h3>
<ul>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="install.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">CraftBeerPi</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Search</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<noscript>
<div id="fallback" class="admonition warning">
<p class="last">
Please activate JavaScript to enable the search
functionality.
</p>
</div>
</noscript>
<div id="search-results">
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2018, Manuel Fritsch
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2018, Manuel Fritsch.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
</section>
</div>
</body>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/searchtools.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
<script type="text/javascript">
jQuery(function() { Search.loadIndex("searchindex.js"); });
</script>
<script type="text/javascript" id="searchindexloader"></script>
</body>
</html>

View file

@ -1 +1 @@
Search.setIndex({docnames:["actor","core","index","sensor","step"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":1,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},filenames:["actor.rst","core.rst","index.rst","sensor.rst","step.rst"],objects:{"core.controller":{actor_controller:[0,0,0,"-"],sensor_controller:[3,0,0,"-"]},"core.controller.actor_controller":{ActorController:[0,1,1,""]},"core.controller.actor_controller.ActorController":{init:[0,2,1,""],off:[0,2,1,""],register:[0,2,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"class":0,"import":0,"new":0,"return":0,"super":0,"true":0,The:0,__file__:0,__init__:0,action:0,actor111111:0,actor:2,actor_control:0,actorcontrol:2,all:0,api:0,architectur:2,async:0,background_task:0,basicconfig:0,bg_job:0,call:0,cbpi:0,cbpiactor:0,cfg:0,clazz:0,config:0,control:0,core:[0,2],creat:0,custom:2,customactor:0,def:0,dure:0,fals:0,from:0,getlogg:0,here:0,info:0,init:0,initi:0,instanc:0,interv:0,kei:0,kettl:0,kwarg:0,label:0,level:0,load_config:0,log:0,logger:0,main:0,manuel:0,method:0,myaction:0,name1:0,name2:0,name:0,need:0,none:0,number:0,off:0,param:0,paramet:0,pass:0,plugin:0,power:0,print:0,properti:0,regist:0,self:0,sensor:2,sensorcontrol:2,server:0,setup:0,startup:0,state:0,step:[],test:0,text:0,thi:0,type:0,version:0,wooh:0,woohoo:0,yaml:0,you:0,your:0},titles:["Actor","Core","Welcome to CraftBeerPi\u2019s documentation!","Sensor","Step API"],titleterms:{actor:0,actorcontrol:0,api:4,architectur:[0,3],core:1,craftbeerpi:2,custom:[0,3],document:2,sensor:3,sensorcontrol:3,step:4,welcom:2}})
Search.setIndex({docnames:["actor","core","index","install","sensor","step"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},filenames:["actor.rst","core.rst","index.rst","install.rst","sensor.rst","step.rst"],objects:{"core.controller":{actor_controller:[0,0,0,"-"],sensor_controller:[4,0,0,"-"]},"core.controller.actor_controller":{ActorController:[0,1,1,""]},"core.controller.actor_controller.ActorController":{get_all:[0,2,1,""],http_add:[0,2,1,""],http_delete_one:[0,2,1,""],http_get_all:[0,2,1,""],http_get_one:[0,2,1,""],http_off:[0,2,1,""],http_on:[0,2,1,""],http_toggle:[0,2,1,""],http_update:[0,2,1,""],init:[0,2,1,""],off:[0,2,1,""],on:[0,2,1,""],toggle:[0,2,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"class":0,"import":0,"return":0,"super":0,"switch":0,"true":0,The:0,__file__:0,__init__:0,action:0,actor111111:0,actor:2,actor_control:0,actorcontrol:2,aiohttp:0,all:0,allow:0,api:0,applic:0,architectur:2,async:0,background_task:0,basicconfig:0,between:0,bg_job:0,bodi:0,call:0,cbpi:0,cbpiactor:0,cfg:0,clone:3,com:3,config:0,control:0,core:[0,2],craftbeerpi4:3,creat:0,custom:2,customactor:0,def:0,descript:0,dure:0,end:0,event:0,fals:0,force_db_upd:0,format:0,from:0,get_al:0,getlogg:0,git:3,github:3,here:0,http:[0,3],http_add:0,http_delete_on:0,http_get_al:0,http_get_on:0,http_off:0,http_on:0,http_toggl:0,http_updat:0,info:0,init:0,initi:0,instal:2,instanc:0,int64:0,integ:0,interv:0,invalid:0,json:0,kei:0,kettl:0,kwarg:0,label:0,level:0,load_config:0,log:0,logger:0,main:0,make:3,manuel83:3,manuel:0,method:0,myaction:0,name1:0,name2:0,name:0,need:0,none:0,number:0,object:0,off:0,oper:0,param:0,paramet:0,pass:0,path:0,pip:3,plain:0,pleas:3,plugin:0,point:0,pong:0,power:0,print:0,produc:0,properti:0,python:3,regist:0,request:0,requir:[0,3],respons:0,rest:0,schema:0,self:0,sensor:2,sensorcontrol:2,server:0,servic:0,setup:0,startup:0,state:0,success:0,support:0,sure:3,tag:0,test:0,text:0,thi:0,toggl:0,topic:0,txt:3,type:0,user:0,valu:0,version:0,web_respons:0,wooh:0,woohoo:0,yaml:0,you:0,your:0},titles:["Actor","Core","Welcome to CraftBeerPi\u2019s documentation!","Installation","Sensor","Step API"],titleterms:{actor:0,actorcontrol:0,api:5,architectur:[0,4],core:1,craftbeerpi:2,custom:[0,4],document:2,instal:3,sensor:4,sensorcontrol:4,step:5,welcom:2}})

View file

@ -1,38 +1,155 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Sensor &#8212; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sensor &mdash; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Step API" href="step.html" />
<link rel="prev" title="Actor" href="actor.html" />
<link rel="prev" title="Actor" href="actor.html" />
<script src="_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav">
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
<div class="wy-grid-for-nav">
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<div class="body" role="main">
<a href="index.html" class="icon icon-home"> CraftBeerPi
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="install.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Sensor</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#architecture">Architecture</a></li>
<li class="toctree-l2"><a class="reference internal" href="#module-core.controller.sensor_controller">SensorController</a></li>
<li class="toctree-l2"><a class="reference internal" href="#custom-sensor">Custom Sensor</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">CraftBeerPi</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Sensor</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/sensor.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="sensor">
<h1>Sensor<a class="headerlink" href="#sensor" title="Permalink to this headline"></a></h1>
@ -48,75 +165,59 @@
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">CraftBeerPi</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Sensor</a></li>
<li class="toctree-l1"><a class="reference internal" href="step.html">Step API</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li>Previous: <a href="actor.html" title="previous chapter">Actor</a></li>
<li>Next: <a href="step.html" title="next chapter">Step API</a></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="actor.html" class="btn btn-neutral" title="Actor" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2018, Manuel Fritsch
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2018, Manuel Fritsch.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/sensor.rst.txt"
rel="nofollow">Page source</a>
</div>
</section>
</div>
</body>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View file

@ -1,111 +1,201 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Step API &#8212; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Step API &mdash; CraftBeerPi 4.0 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="prev" title="Sensor" href="sensor.html" />
<link rel="search" title="Search" href="search.html" />
<script src="_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav">
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
<div class="wy-grid-for-nav">
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<div class="body" role="main">
<a href="index.html" class="icon icon-home"> CraftBeerPi
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="install.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">CraftBeerPi</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Step API</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/step.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="step-api">
<h1>Step API<a class="headerlink" href="#step-api" title="Permalink to this headline"></a></h1>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">CraftBeerPi</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="actor.html">Actor</a></li>
<li class="toctree-l1"><a class="reference internal" href="sensor.html">Sensor</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Step API</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li>Previous: <a href="sensor.html" title="previous chapter">Sensor</a></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2018, Manuel Fritsch
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2018, Manuel Fritsch.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/step.rst.txt"
rel="nofollow">Page source</a>
</div>
</section>
</div>
</body>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View file

@ -13,6 +13,7 @@ ActorController
.. automodule:: core.controller.actor_controller
:members:
:inherited-members:
Custom Actor
^^^^^^^^^^^^^

View file

@ -75,7 +75,8 @@ pygments_style = None
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'alabaster'
#html_theme = 'alabaster'
html_theme = 'sphinx_rtd_theme'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the

View file

@ -10,6 +10,7 @@ Welcome to CraftBeerPi's documentation!
.. toctree::
:maxdepth: 3
install
core
actor
sensor

View file

@ -0,0 +1,12 @@
Installation
============
Please make sure that Python 3.6 is installed
::
git clone https://github.com/manuel83/craftbeerpi4
cd craftbeerpi4
pip install -r requirements.txt

5
logger.conf Normal file
View file

@ -0,0 +1,5 @@
2018-11-18 15:39:26,909,1,WOOHO
2018-11-18 15:39:28,083,1,WOOHO
2018-11-18 15:39:28,716,1,WOOHO
2018-11-18 15:39:29,721,1,WOOHO
2018-11-18 15:39:30,724,1,WOOHO

View file

@ -0,0 +1,59 @@
2018-11-18 14:05:13,822,1,WOOHO
2018-11-18 14:05:14,829,1,WOOHO
2018-11-18 14:05:15,832,1,WOOHO
2018-11-18 14:05:16,837,1,WOOHO
2018-11-18 14:05:17,842,1,WOOHO
2018-11-18 14:05:18,844,1,WOOHO
2018-11-18 14:05:19,849,1,WOOHO
2018-11-18 14:05:20,860,1,WOOHO
2018-11-18 14:05:21,863,1,WOOHO
2018-11-18 14:05:22,869,1,WOOHO
2018-11-18 14:05:23,875,1,WOOHO
2018-11-18 14:05:24,877,1,WOOHO
2018-11-18 14:05:25,880,1,WOOHO
2018-11-18 14:05:26,883,1,WOOHO
2018-11-18 14:05:27,888,1,WOOHO
2018-11-18 14:05:28,889,1,WOOHO
2018-11-18 14:05:29,893,1,WOOHO
2018-11-18 14:05:30,897,1,WOOHO
2018-11-18 14:05:31,901,1,WOOHO
2018-11-18 14:05:32,906,1,WOOHO
2018-11-18 14:05:33,907,1,WOOHO
2018-11-18 14:05:34,912,1,WOOHO
2018-11-18 14:05:35,915,1,WOOHO
2018-11-18 14:05:36,919,1,WOOHO
2018-11-18 14:05:37,922,1,WOOHO
2018-11-18 14:05:38,927,1,WOOHO
2018-11-18 14:05:39,928,1,WOOHO
2018-11-18 14:05:40,932,1,WOOHO
2018-11-18 14:05:41,936,1,WOOHO
2018-11-18 14:05:42,941,1,WOOHO
2018-11-18 14:05:43,945,1,WOOHO
2018-11-18 14:05:44,951,1,WOOHO
2018-11-18 14:05:45,954,1,WOOHO
2018-11-18 14:05:46,957,1,WOOHO
2018-11-18 14:05:47,961,1,WOOHO
2018-11-18 14:05:48,966,1,WOOHO
2018-11-18 14:05:49,974,1,WOOHO
2018-11-18 14:05:50,975,1,WOOHO
2018-11-18 14:05:51,976,1,WOOHO
2018-11-18 14:05:52,977,1,WOOHO
2018-11-18 14:05:53,977,1,WOOHO
2018-11-18 14:05:54,981,1,WOOHO
2018-11-18 14:05:55,986,1,WOOHO
2018-11-18 14:05:56,988,1,WOOHO
2018-11-18 14:05:57,988,1,WOOHO
2018-11-18 14:05:58,992,1,WOOHO
2018-11-18 14:05:59,995,1,WOOHO
2018-11-18 14:06:00,998,1,WOOHO
2018-11-18 14:06:01,999,1,WOOHO
2018-11-18 14:06:03,004,1,WOOHO
2018-11-18 14:06:04,009,1,WOOHO
2018-11-18 14:06:05,013,1,WOOHO
2018-11-18 14:06:06,019,1,WOOHO
2018-11-18 14:06:07,025,1,WOOHO
2018-11-18 14:06:08,030,1,WOOHO
2018-11-18 14:06:09,033,1,WOOHO
2018-11-18 14:06:10,037,1,WOOHO
2018-11-18 14:06:11,041,1,WOOHO
2018-11-18 14:06:12,042,1,WOOHO

View file

@ -0,0 +1,116 @@
2018-11-18 14:06:13,042,1,WOOHO
2018-11-18 14:06:14,050,1,WOOHO
2018-11-18 14:06:15,051,1,WOOHO
2018-11-18 14:06:16,056,1,WOOHO
2018-11-18 14:06:17,060,1,WOOHO
2018-11-18 14:06:18,064,1,WOOHO
2018-11-18 14:06:19,069,1,WOOHO
2018-11-18 14:06:20,084,1,WOOHO
2018-11-18 14:06:21,087,1,WOOHO
2018-11-18 14:06:22,091,1,WOOHO
2018-11-18 14:06:23,092,1,WOOHO
2018-11-18 14:06:24,096,1,WOOHO
2018-11-18 14:06:25,097,1,WOOHO
2018-11-18 14:06:26,101,1,WOOHO
2018-11-18 14:06:27,102,1,WOOHO
2018-11-18 14:06:28,104,1,WOOHO
2018-11-18 14:06:29,109,1,WOOHO
2018-11-18 14:06:30,113,1,WOOHO
2018-11-18 14:06:31,115,1,WOOHO
2018-11-18 14:06:32,119,1,WOOHO
2018-11-18 14:06:33,125,1,WOOHO
2018-11-18 14:06:34,129,1,WOOHO
2018-11-18 14:06:35,133,1,WOOHO
2018-11-18 14:06:36,134,1,WOOHO
2018-11-18 14:06:37,136,1,WOOHO
2018-11-18 14:06:38,137,1,WOOHO
2018-11-18 14:06:39,139,1,WOOHO
2018-11-18 14:06:40,143,1,WOOHO
2018-11-18 14:06:41,144,1,WOOHO
2018-11-18 14:06:42,145,1,WOOHO
2018-11-18 14:06:43,147,1,WOOHO
2018-11-18 14:06:44,151,1,WOOHO
2018-11-18 14:06:45,153,1,WOOHO
2018-11-18 14:06:46,159,1,WOOHO
2018-11-18 14:06:47,163,1,WOOHO
2018-11-18 14:06:48,169,1,WOOHO
2018-11-18 14:06:49,172,1,WOOHO
2018-11-18 14:06:50,174,1,WOOHO
2018-11-18 14:06:51,182,1,WOOHO
2018-11-18 14:06:52,188,1,WOOHO
2018-11-18 14:06:53,193,1,WOOHO
2018-11-18 14:06:54,195,1,WOOHO
2018-11-18 14:06:55,196,1,WOOHO
2018-11-18 14:06:56,197,1,WOOHO
2018-11-18 14:06:57,203,1,WOOHO
2018-11-18 14:06:58,208,1,WOOHO
2018-11-18 14:06:59,212,1,WOOHO
2018-11-18 14:07:00,216,1,WOOHO
2018-11-18 14:07:01,218,1,WOOHO
2018-11-18 14:07:02,219,1,WOOHO
2018-11-18 14:07:03,225,1,WOOHO
2018-11-18 14:07:04,228,1,WOOHO
2018-11-18 14:07:05,233,1,WOOHO
2018-11-18 14:07:06,239,1,WOOHO
2018-11-18 14:07:07,244,1,WOOHO
2018-11-18 14:07:08,249,1,WOOHO
2018-11-18 14:07:09,250,1,WOOHO
2018-11-18 14:07:10,254,1,WOOHO
2018-11-18 14:07:11,259,1,WOOHO
2018-11-18 14:07:14,795,1,WOOHO
2018-11-18 14:07:15,799,1,WOOHO
2018-11-18 14:07:16,800,1,WOOHO
2018-11-18 14:07:17,808,1,WOOHO
2018-11-18 14:07:18,811,1,WOOHO
2018-11-18 14:07:19,813,1,WOOHO
2018-11-18 14:07:20,817,1,WOOHO
2018-11-18 14:07:21,821,1,WOOHO
2018-11-18 14:07:22,825,1,WOOHO
2018-11-18 14:07:23,829,1,WOOHO
2018-11-18 14:07:24,834,1,WOOHO
2018-11-18 14:07:25,835,1,WOOHO
2018-11-18 14:07:26,839,1,WOOHO
2018-11-18 14:07:27,841,1,WOOHO
2018-11-18 14:07:28,845,1,WOOHO
2018-11-18 14:07:29,851,1,WOOHO
2018-11-18 14:07:30,854,1,WOOHO
2018-11-18 14:07:31,859,1,WOOHO
2018-11-18 14:07:32,862,1,WOOHO
2018-11-18 14:07:33,867,1,WOOHO
2018-11-18 14:07:34,873,1,WOOHO
2018-11-18 14:07:35,874,1,WOOHO
2018-11-18 14:07:36,878,1,WOOHO
2018-11-18 14:07:37,883,1,WOOHO
2018-11-18 14:07:38,888,1,WOOHO
2018-11-18 14:07:39,889,1,WOOHO
2018-11-18 14:07:40,893,1,WOOHO
2018-11-18 14:07:41,898,1,WOOHO
2018-11-18 14:07:42,902,1,WOOHO
2018-11-18 14:07:43,907,1,WOOHO
2018-11-18 14:07:44,912,1,WOOHO
2018-11-18 14:07:45,913,1,WOOHO
2018-11-18 14:07:46,918,1,WOOHO
2018-11-18 14:07:47,920,1,WOOHO
2018-11-18 14:07:48,924,1,WOOHO
2018-11-18 14:07:49,928,1,WOOHO
2018-11-18 14:07:50,929,1,WOOHO
2018-11-18 14:07:51,934,1,WOOHO
2018-11-18 14:07:52,937,1,WOOHO
2018-11-18 14:07:53,941,1,WOOHO
2018-11-18 14:07:54,945,1,WOOHO
2018-11-18 14:07:55,949,1,WOOHO
2018-11-18 14:07:56,954,1,WOOHO
2018-11-18 14:07:57,956,1,WOOHO
2018-11-18 14:07:58,962,1,WOOHO
2018-11-18 14:07:59,966,1,WOOHO
2018-11-18 14:08:00,970,1,WOOHO
2018-11-18 14:08:01,975,1,WOOHO
2018-11-18 14:08:02,977,1,WOOHO
2018-11-18 14:08:03,981,1,WOOHO
2018-11-18 14:08:04,986,1,WOOHO
2018-11-18 14:08:05,987,1,WOOHO
2018-11-18 14:08:06,988,1,WOOHO
2018-11-18 14:08:07,993,1,WOOHO
2018-11-18 14:08:08,996,1,WOOHO
2018-11-18 14:08:09,998,1,WOOHO
2018-11-18 14:08:10,999,1,WOOHO

View file

@ -0,0 +1,170 @@
2018-11-18 14:08:12,004,1,WOOHO
2018-11-18 14:08:13,007,1,WOOHO
2018-11-18 14:08:14,013,1,WOOHO
2018-11-18 14:08:15,016,1,WOOHO
2018-11-18 14:08:16,020,1,WOOHO
2018-11-18 14:08:17,025,1,WOOHO
2018-11-18 14:08:18,030,1,WOOHO
2018-11-18 14:08:19,032,1,WOOHO
2018-11-18 14:08:20,036,1,WOOHO
2018-11-18 14:08:21,042,1,WOOHO
2018-11-18 14:08:22,047,1,WOOHO
2018-11-18 14:08:23,048,1,WOOHO
2018-11-18 14:08:24,052,1,WOOHO
2018-11-18 14:08:25,056,1,WOOHO
2018-11-18 14:08:26,061,1,WOOHO
2018-11-18 14:08:27,065,1,WOOHO
2018-11-18 14:08:28,069,1,WOOHO
2018-11-18 14:08:29,073,1,WOOHO
2018-11-18 14:08:30,076,1,WOOHO
2018-11-18 14:08:31,082,1,WOOHO
2018-11-18 14:08:32,083,1,WOOHO
2018-11-18 14:08:33,089,1,WOOHO
2018-11-18 14:08:34,091,1,WOOHO
2018-11-18 14:08:35,092,1,WOOHO
2018-11-18 14:08:36,097,1,WOOHO
2018-11-18 14:08:37,101,1,WOOHO
2018-11-18 14:08:38,105,1,WOOHO
2018-11-18 14:08:39,107,1,WOOHO
2018-11-18 14:08:40,112,1,WOOHO
2018-11-18 14:08:41,116,1,WOOHO
2018-11-18 14:08:42,121,1,WOOHO
2018-11-18 14:08:43,124,1,WOOHO
2018-11-18 14:08:44,126,1,WOOHO
2018-11-18 14:08:45,128,1,WOOHO
2018-11-18 14:08:46,131,1,WOOHO
2018-11-18 14:08:47,136,1,WOOHO
2018-11-18 14:08:48,138,1,WOOHO
2018-11-18 14:08:49,146,1,WOOHO
2018-11-18 14:08:50,152,1,WOOHO
2018-11-18 14:08:51,154,1,WOOHO
2018-11-18 14:08:52,160,1,WOOHO
2018-11-18 14:08:53,165,1,WOOHO
2018-11-18 14:08:54,170,1,WOOHO
2018-11-18 14:08:55,174,1,WOOHO
2018-11-18 14:08:56,178,1,WOOHO
2018-11-18 14:08:57,181,1,WOOHO
2018-11-18 14:08:58,185,1,WOOHO
2018-11-18 14:08:59,191,1,WOOHO
2018-11-18 14:09:00,193,1,WOOHO
2018-11-18 14:09:01,199,1,WOOHO
2018-11-18 14:09:02,201,1,WOOHO
2018-11-18 14:09:03,212,1,WOOHO
2018-11-18 14:09:04,213,1,WOOHO
2018-11-18 14:09:05,215,1,WOOHO
2018-11-18 14:09:06,218,1,WOOHO
2018-11-18 14:09:07,223,1,WOOHO
2018-11-18 14:09:08,227,1,WOOHO
2018-11-18 14:09:11,791,1,WOOHO
2018-11-18 14:09:12,796,1,WOOHO
2018-11-18 14:09:13,801,1,WOOHO
2018-11-18 14:09:14,805,1,WOOHO
2018-11-18 14:09:15,806,1,WOOHO
2018-11-18 14:09:16,811,1,WOOHO
2018-11-18 14:09:17,814,1,WOOHO
2018-11-18 14:09:18,820,1,WOOHO
2018-11-18 14:09:19,821,1,WOOHO
2018-11-18 14:09:20,829,1,WOOHO
2018-11-18 14:09:21,832,1,WOOHO
2018-11-18 14:09:22,836,1,WOOHO
2018-11-18 14:09:23,841,1,WOOHO
2018-11-18 14:09:24,844,1,WOOHO
2018-11-18 14:09:25,848,1,WOOHO
2018-11-18 14:09:26,853,1,WOOHO
2018-11-18 14:09:27,858,1,WOOHO
2018-11-18 14:09:28,860,1,WOOHO
2018-11-18 14:09:29,865,1,WOOHO
2018-11-18 14:09:30,868,1,WOOHO
2018-11-18 14:09:31,872,1,WOOHO
2018-11-18 14:09:32,879,1,WOOHO
2018-11-18 14:09:33,884,1,WOOHO
2018-11-18 14:09:34,885,1,WOOHO
2018-11-18 14:09:35,889,1,WOOHO
2018-11-18 14:09:36,894,1,WOOHO
2018-11-18 14:09:37,899,1,WOOHO
2018-11-18 14:09:38,905,1,WOOHO
2018-11-18 14:09:39,905,1,WOOHO
2018-11-18 14:09:40,906,1,WOOHO
2018-11-18 14:09:41,907,1,WOOHO
2018-11-18 14:09:42,913,1,WOOHO
2018-11-18 14:09:43,914,1,WOOHO
2018-11-18 14:09:44,918,1,WOOHO
2018-11-18 14:09:45,920,1,WOOHO
2018-11-18 14:09:46,923,1,WOOHO
2018-11-18 14:09:47,927,1,WOOHO
2018-11-18 14:09:48,931,1,WOOHO
2018-11-18 14:09:49,937,1,WOOHO
2018-11-18 14:09:50,948,1,WOOHO
2018-11-18 14:09:51,950,1,WOOHO
2018-11-18 14:09:52,954,1,WOOHO
2018-11-18 14:09:53,957,1,WOOHO
2018-11-18 14:09:54,959,1,WOOHO
2018-11-18 14:09:55,965,1,WOOHO
2018-11-18 14:09:56,969,1,WOOHO
2018-11-18 14:09:57,974,1,WOOHO
2018-11-18 14:09:58,979,1,WOOHO
2018-11-18 14:09:59,982,1,WOOHO
2018-11-18 14:10:00,986,1,WOOHO
2018-11-18 14:10:01,991,1,WOOHO
2018-11-18 14:10:02,997,1,WOOHO
2018-11-18 14:10:04,001,1,WOOHO
2018-11-18 14:10:05,007,1,WOOHO
2018-11-18 14:10:06,013,1,WOOHO
2018-11-18 14:10:07,017,1,WOOHO
2018-11-18 14:10:10,186,1,WOOHO
2018-11-18 14:10:11,192,1,WOOHO
2018-11-18 14:10:12,194,1,WOOHO
2018-11-18 14:10:13,197,1,WOOHO
2018-11-18 14:10:14,202,1,WOOHO
2018-11-18 14:10:15,206,1,WOOHO
2018-11-18 14:10:16,210,1,WOOHO
2018-11-18 14:10:17,211,1,WOOHO
2018-11-18 14:10:18,215,1,WOOHO
2018-11-18 14:10:19,216,1,WOOHO
2018-11-18 14:10:20,219,1,WOOHO
2018-11-18 14:10:21,219,1,WOOHO
2018-11-18 14:10:22,220,1,WOOHO
2018-11-18 14:10:23,224,1,WOOHO
2018-11-18 14:10:24,227,1,WOOHO
2018-11-18 14:10:25,232,1,WOOHO
2018-11-18 14:10:26,237,1,WOOHO
2018-11-18 14:10:27,239,1,WOOHO
2018-11-18 14:10:28,244,1,WOOHO
2018-11-18 14:10:29,246,1,WOOHO
2018-11-18 14:10:30,248,1,WOOHO
2018-11-18 14:10:31,251,1,WOOHO
2018-11-18 14:10:32,256,1,WOOHO
2018-11-18 14:10:33,258,1,WOOHO
2018-11-18 14:10:34,261,1,WOOHO
2018-11-18 14:10:35,263,1,WOOHO
2018-11-18 14:10:36,265,1,WOOHO
2018-11-18 14:10:37,267,1,WOOHO
2018-11-18 14:10:38,268,1,WOOHO
2018-11-18 14:10:39,269,1,WOOHO
2018-11-18 14:10:40,274,1,WOOHO
2018-11-18 14:10:41,278,1,WOOHO
2018-11-18 14:10:42,282,1,WOOHO
2018-11-18 14:10:43,286,1,WOOHO
2018-11-18 14:10:44,290,1,WOOHO
2018-11-18 14:10:45,295,1,WOOHO
2018-11-18 14:10:46,299,1,WOOHO
2018-11-18 14:10:47,302,1,WOOHO
2018-11-18 14:10:48,307,1,WOOHO
2018-11-18 14:10:49,310,1,WOOHO
2018-11-18 14:10:50,321,1,WOOHO
2018-11-18 14:10:51,324,1,WOOHO
2018-11-18 14:10:52,329,1,WOOHO
2018-11-18 14:10:53,333,1,WOOHO
2018-11-18 14:10:54,336,1,WOOHO
2018-11-18 14:10:55,341,1,WOOHO
2018-11-18 14:10:56,346,1,WOOHO
2018-11-18 14:10:57,350,1,WOOHO
2018-11-18 14:10:58,354,1,WOOHO
2018-11-18 14:10:59,358,1,WOOHO
2018-11-18 14:11:00,362,1,WOOHO
2018-11-18 14:11:01,367,1,WOOHO
2018-11-18 14:11:02,370,1,WOOHO
2018-11-18 14:11:03,372,1,WOOHO
2018-11-18 14:11:04,378,1,WOOHO
2018-11-18 14:11:05,382,1,WOOHO
2018-11-18 14:11:06,386,1,WOOHO

View file

@ -0,0 +1,60 @@
2018-11-18 14:11:07,390,1,WOOHO
2018-11-18 14:11:08,395,1,WOOHO
2018-11-18 14:11:09,399,1,WOOHO
2018-11-18 14:11:10,402,1,WOOHO
2018-11-18 14:11:11,407,1,WOOHO
2018-11-18 14:11:12,411,1,WOOHO
2018-11-18 14:11:13,416,1,WOOHO
2018-11-18 14:11:14,419,1,WOOHO
2018-11-18 14:11:15,423,1,WOOHO
2018-11-18 14:11:16,428,1,WOOHO
2018-11-18 14:11:17,434,1,WOOHO
2018-11-18 14:11:18,439,1,WOOHO
2018-11-18 14:11:19,443,1,WOOHO
2018-11-18 14:11:20,451,1,WOOHO
2018-11-18 14:11:21,457,1,WOOHO
2018-11-18 14:11:22,458,1,WOOHO
2018-11-18 14:11:23,462,1,WOOHO
2018-11-18 14:11:24,467,1,WOOHO
2018-11-18 14:11:25,470,1,WOOHO
2018-11-18 14:11:26,474,1,WOOHO
2018-11-18 14:11:27,478,1,WOOHO
2018-11-18 14:11:28,480,1,WOOHO
2018-11-18 14:11:29,480,1,WOOHO
2018-11-18 14:11:30,484,1,WOOHO
2018-11-18 14:11:31,489,1,WOOHO
2018-11-18 14:11:32,492,1,WOOHO
2018-11-18 14:11:33,496,1,WOOHO
2018-11-18 14:11:34,502,1,WOOHO
2018-11-18 14:11:35,505,1,WOOHO
2018-11-18 14:11:36,509,1,WOOHO
2018-11-18 14:11:37,513,1,WOOHO
2018-11-18 14:11:38,519,1,WOOHO
2018-11-18 14:11:39,520,1,WOOHO
2018-11-18 14:11:40,525,1,WOOHO
2018-11-18 14:11:41,530,1,WOOHO
2018-11-18 14:11:42,535,1,WOOHO
2018-11-18 14:11:43,540,1,WOOHO
2018-11-18 14:11:44,542,1,WOOHO
2018-11-18 14:11:45,546,1,WOOHO
2018-11-18 14:11:46,551,1,WOOHO
2018-11-18 14:11:47,554,1,WOOHO
2018-11-18 14:11:48,559,1,WOOHO
2018-11-18 14:11:49,563,1,WOOHO
2018-11-18 14:11:50,572,1,WOOHO
2018-11-18 14:11:51,576,1,WOOHO
2018-11-18 14:11:52,581,1,WOOHO
2018-11-18 14:11:53,586,1,WOOHO
2018-11-18 14:11:54,589,1,WOOHO
2018-11-18 14:11:55,594,1,WOOHO
2018-11-18 14:11:56,597,1,WOOHO
2018-11-18 14:11:57,601,1,WOOHO
2018-11-18 14:11:58,606,1,WOOHO
2018-11-18 14:11:59,610,1,WOOHO
2018-11-18 14:12:00,614,1,WOOHO
2018-11-18 14:12:01,618,1,WOOHO
2018-11-18 14:12:02,621,1,WOOHO
2018-11-18 14:12:03,625,1,WOOHO
2018-11-18 14:12:04,630,1,WOOHO
2018-11-18 14:12:05,635,1,WOOHO
2018-11-18 14:12:06,639,1,WOOHO

View file

@ -0,0 +1,39 @@
2018-11-18 14:12:07,642,1,WOOHO
2018-11-18 14:12:08,644,1,WOOHO
2018-11-18 14:12:09,649,1,WOOHO
2018-11-18 14:12:10,653,1,WOOHO
2018-11-18 14:12:11,654,1,WOOHO
2018-11-18 14:12:12,657,1,WOOHO
2018-11-18 14:12:13,661,1,WOOHO
2018-11-18 14:12:14,666,1,WOOHO
2018-11-18 14:12:15,670,1,WOOHO
2018-11-18 14:12:16,674,1,WOOHO
2018-11-18 14:12:17,677,1,WOOHO
2018-11-18 14:12:18,682,1,WOOHO
2018-11-18 14:12:19,686,1,WOOHO
2018-11-18 14:12:20,695,1,WOOHO
2018-11-18 14:12:21,700,1,WOOHO
2018-11-18 14:12:22,701,1,WOOHO
2018-11-18 14:12:23,702,1,WOOHO
2018-11-18 14:12:24,703,1,WOOHO
2018-11-18 14:12:25,711,1,WOOHO
2018-11-18 14:12:26,718,1,WOOHO
2018-11-18 14:12:27,719,1,WOOHO
2018-11-18 14:12:28,729,1,WOOHO
2018-11-18 14:12:29,733,1,WOOHO
2018-11-18 14:12:30,743,1,WOOHO
2018-11-18 14:12:31,753,1,WOOHO
2018-11-18 14:12:32,758,1,WOOHO
2018-11-18 14:12:33,761,1,WOOHO
2018-11-18 14:12:34,768,1,WOOHO
2018-11-18 14:12:35,770,1,WOOHO
2018-11-18 14:12:36,777,1,WOOHO
2018-11-18 14:12:37,778,1,WOOHO
2018-11-18 14:12:38,787,1,WOOHO
2018-11-18 14:12:39,798,1,WOOHO
2018-11-18 14:12:40,802,1,WOOHO
2018-11-18 14:12:41,813,1,WOOHO
2018-11-18 14:12:42,816,1,WOOHO
2018-11-18 14:12:43,819,1,WOOHO
2018-11-18 14:12:44,827,1,WOOHO
2018-11-18 14:12:45,837,1,WOOHO

View file

@ -35,3 +35,4 @@ ticket-auth==0.1.4
transitions==0.6.8
websockets==6.0
yarl==1.2.6
pyfiglet

View file

@ -39,6 +39,8 @@ class MyAppTestCase(AioHTTPTestCase):
i = await self.cbpi.actor.get_one(1)
assert i.instance.state is False
i = await self.cbpi.actor.get_all()
assert len(i) == 2
#ws = await self.client.ws_connect("/ws");
#await ws.send_str(json.dumps({"key": "test"}))

Some files were not shown because too many files have changed in this diff Show more