diff --git a/README.md b/README.md index 6793c9d..77eb82b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,37 @@ -# CraftBeerPi4 +# CraftBeerPi -This is the development project for CraftBeerPi4. -It's not ready to use at the moment. +## Intro + +CraftBeerPi is an open source brewing controller. + +## Installation + +CraftBeerPi is python based and will require at last python 3.7.x +You can run CBPi 4.x on your Laptop. It's not required to use a Raspberry Pi. + +Download an install Python 3.7 [https://www.python.org/downloads/](https://www.python.org/downloads/) + +Open a terminal window and run the following commands. + +```text +sudo python3 -m pip install cbpi +``` + +```text +cbpi setup +``` + +```text +cbpi start +``` + +The server is running under http://localhost:8000 by default. + +## Links + +{% embed url="https://www.facebook.com/groups/craftbeerpi" %} + +{% embed url="https://www.youtube.com/channel/UCy47sYaG8YLwJWw2iY5\_aNg" %} + +{% embed url="http://web.craftbeerpi.com" %} -[See Documentation](https://manuel83.github.io/craftbeerpi4/) \ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md new file mode 100644 index 0000000..bd79073 --- /dev/null +++ b/SUMMARY.md @@ -0,0 +1,5 @@ +# Table of contents + +* [CraftBeerPi](README.md) +* [Development](development.md) + diff --git a/development.md b/development.md new file mode 100644 index 0000000..f441dc5 --- /dev/null +++ b/development.md @@ -0,0 +1,178 @@ +# Development + +## Development Setup + +Custom Plugins are shipped as standard Python packages. Just create a python virtual env and add `cbpi`as dependency + +{% hint style="info" %} +How to create virtual env in Python +[https://docs.python.org/3/tutorial/venv.html](https://docs.python.org/3/tutorial/venv.html) +{% endhint %} + +### 1. Create a virtual env with CBPi + +```bash +python3 -m venv venv +source venv/bin/activate +python3 -m pip insatll cbpi +``` + +### 2. Create Folder structure + + + +### 3. Add Custom Code + + + +### 4. Test the Code + + + +### 3. Build plugin + + + +### 4. Upload the plugin + +### Full Example + +[https://github.com/Manuel83/cbpi4-ui-plugin](https://github.com/Manuel83/cbpi4-ui-plugin) + +## Sensor + +```python +# -*- coding: utf-8 -*- +import asyncio +import random +import re +import random +from aiohttp import web +from cbpi.api import * + +''' +Make sure to extend CBPiSensor +''' + +@parameters([Property.Number(label="Param1", configurable=True), + Property.Text(label="Param2", configurable=True, default_value="HALLO"), + Property.Select(label="Param3", options=[1,2,4]), + Property.Sensor(label="Param4"), + Property.Actor(label="Param5")]) +class CustomSensor(CBPiSensor): + + def __init__(self, cbpi, id, props): + + super(CustomSensor, self).__init__(cbpi, id, props) + self.value = 0 + + + @action(key="Test", parameters=[]) + async def action1(self, **kwargs): + ''' + A custom action. Which can be called from the user interface + ''' + print("ACTION!", kwargs) + + async def run(self): + ''' + This method is executed asynchronousely + In this example the code is executed every second + ''' + while self.running is True: + self.value = random.randint(0,50) + self.push_update(self.value) + await asyncio.sleep(1) + + def get_state(self): + # return the current state of the sensor + return dict(value=self.value) + + +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) +``` + +## Actor + +```python + +import logging +from unittest.mock import MagicMock, patch + +from cbpi.api import * + + +logger = logging.getLogger(__name__) + +try: + import RPi.GPIO as GPIO +except Exception: + logger.error("Failed to load RPi.GPIO. Using Mock") + MockRPi = MagicMock() + modules = { + "RPi": MockRPi, + "RPi.GPIO": MockRPi.GPIO + } + patcher = patch.dict("sys.modules", modules) + patcher.start() + import RPi.GPIO as GPIO + + +@parameters([Property.Number(label="Param1", configurable=True), + Property.Text(label="Param2", configurable=True, default_value="HALLO"), + Property.Select(label="Param3", options=[1,2,4]), + Property.Sensor(label="Param4"), + Property.Actor(label="Param5")]) +class CustomActor(CBPiActor): + my_name = "" + + # Custom property which can be configured by the user + @action("test", parameters={}) + async def action1(self, **kwargs): + print("ACTION !", kwargs) + self.my_name = kwargs.get("name") + pass + + def init(self): + print("INIT") + + self.state = False + pass + + async def on(self, power=0): + logger.info("ACTOR 1111 %s ON" % self.id) + self.state = True + + async def off(self): + logger.info("ACTOR %s OFF " % self.id) + self.state = False + + def get_state(self): + + return self.state + + async def run(self): + pass + +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("CustomActor", CustomActor) +``` +