From f2e9b1bebc43fb401ad06af34443185713052ba4 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Fri, 28 Jan 2022 19:41:58 +0100 Subject: [PATCH 01/17] Update fermentation_controller.py --- cbpi/controller/fermentation_controller.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cbpi/controller/fermentation_controller.py b/cbpi/controller/fermentation_controller.py index 5bb7611..7e2129e 100644 --- a/cbpi/controller/fermentation_controller.py +++ b/cbpi/controller/fermentation_controller.py @@ -199,7 +199,8 @@ class FermentationController: def get_state(self): if self.data == []: - logging.info(self.data) + #logging.info(self.data) + pass return {"data": list(map(lambda x: x.to_dict(), self.data)), "types":self.get_types(), "steptypes":self.get_steptypes()} From a7ddcdd30645c0661649225457f7918a07aa95a0 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Mon, 31 Jan 2022 07:27:01 +0100 Subject: [PATCH 02/17] fix get_actor_state () in CBPiBase --- cbpi/__init__.py | 2 +- cbpi/api/base.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index dc85dce..4fd74a9 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.1.7" +__version__ = "4.0.1.8" diff --git a/cbpi/api/base.py b/cbpi/api/base.py index e4c0c9a..d698c1e 100644 --- a/cbpi/api/base.py +++ b/cbpi/api/base.py @@ -51,10 +51,10 @@ class CBPiBase(metaclass=ABCMeta): def get_actor_state(self,id): try: actor = self.cbpi.actor.find_by_id(id) - return actor.get("instance").get_state() + return actor.instance.state except: logging.error("Failed to read actor state in step - actor {}".format(id)) - return None + return False async def actor_on(self,id,power=100): @@ -73,4 +73,4 @@ class CBPiBase(metaclass=ABCMeta): try: await self.cbpi.actor.set_power(id,power) except Exception as e: - pass \ No newline at end of file + pass From ed141f87881b33fcc4be950fde761395a7a008d9 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Mon, 31 Jan 2022 17:17:53 +0100 Subject: [PATCH 03/17] Added mqttutil extension - forces mqtt update for kettle and femrenter in specified timeframes even w/o change in payload - required for mqttdevice - only active if mqtt is enabled - can be set to never and is also deactivated when mqtt is enabled --- cbpi/__init__.py | 2 +- cbpi/extension/ConfigUpdate/__init__.py | 14 ++++++++ cbpi/extension/mqtt_util/__init__.py | 44 +++++++++++++++++++++++++ cbpi/extension/mqtt_util/config.yaml | 3 ++ 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 cbpi/extension/mqtt_util/__init__.py create mode 100644 cbpi/extension/mqtt_util/config.yaml diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 4fd74a9..1f11a12 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.1.8" +__version__ = "4.0.1.9" diff --git a/cbpi/extension/ConfigUpdate/__init__.py b/cbpi/extension/ConfigUpdate/__init__.py index ae4704f..f05145e 100644 --- a/cbpi/extension/ConfigUpdate/__init__.py +++ b/cbpi/extension/ConfigUpdate/__init__.py @@ -44,6 +44,7 @@ class ConfigUpdate(CBPiExtension): influxdbname = self.cbpi.config.get("INFLUXDBNAME", None) influxdbuser = self.cbpi.config.get("INFLUXDBUSER", None) influxdbpwd = self.cbpi.config.get("INFLUXDBPWD", None) + mqttupdate = self.cbpi.config.get("MQTTUpdate", None) @@ -252,6 +253,19 @@ class ConfigUpdate(CBPiExtension): except: logger.warning('Unable to update config') + if mqttupdate is None: + logger.info("INIT MQTT update frequency for Kettles and Fermenters") + try: + await self.cbpi.config.add("MQTTUpdate", 60, ConfigType.SELECT, "Forced MQTT Update frequency in s for Kettle and Fermenter (no changes in payload required). Restart required after change", + [{"label": "30", "value": 30}, + {"label": "60", "value": 60}, + {"label": "120", "value": 120}, + {"label": "300", "value": 300}, + {"label": "Never", "value": 0}]) + except: + logger.warning('Unable to update database') + + def setup(cbpi): cbpi.plugin.register("ConfigUpdate", ConfigUpdate) pass diff --git a/cbpi/extension/mqtt_util/__init__.py b/cbpi/extension/mqtt_util/__init__.py new file mode 100644 index 0000000..bc20f04 --- /dev/null +++ b/cbpi/extension/mqtt_util/__init__.py @@ -0,0 +1,44 @@ +import logging +import asyncio +from cbpi.api import * +from cbpi.api.config import ConfigType +from cbpi.api.base import CBPiBase +from cbpi.controller.fermentation_controller import FermentationController +from cbpi.controller.kettle_controller import KettleController + +logger = logging.getLogger(__name__) + +class MQTTUtil(CBPiExtension): + + def __init__(self,cbpi): + self.cbpi = cbpi + self.kettlecontroller : KettleController = cbpi.kettle + self.fermentationcontroller : FermentationController = cbpi.fermenter + self.mqttupdate = int(self.cbpi.config.get("MQTTUpdate", 60)) + if self.mqttupdate != 0: + self._task = asyncio.create_task(self.run()) + logger.info("INIT MQTTUtil") + + async def run(self): + + while True: + try: + self.kettle=self.kettlecontroller.get_state() + for item in self.kettle['data']: + self.cbpi.push_update("cbpi/{}/{}".format("kettleupdate",item['id']), item) + except Exception as e: + logging.error(e) + pass + try: + self.fermenter=self.fermentationcontroller.get_state() + for item in self.fermenter['data']: + self.cbpi.push_update("cbpi/{}/{}".format("fermenterupdate",item['id']), item) + except Exception as e: + logging.error(e) + pass + await asyncio.sleep(self.mqttupdate) + +def setup(cbpi): + if str(cbpi.static_config.get("mqtt", False)).lower() == "true": + cbpi.plugin.register("MQTTUtil", MQTTUtil) + pass diff --git a/cbpi/extension/mqtt_util/config.yaml b/cbpi/extension/mqtt_util/config.yaml new file mode 100644 index 0000000..005124a --- /dev/null +++ b/cbpi/extension/mqtt_util/config.yaml @@ -0,0 +1,3 @@ +name: MQTTUtil +version: 4 +active: true From 0bf2b64c3edfa2a7db319deea0159091185bfdd5 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Thu, 3 Feb 2022 17:00:12 +0100 Subject: [PATCH 04/17] Reduction of duplicated mqtt actor messages --- cbpi/__init__.py | 2 +- cbpi/controller/actor_controller.py | 11 +++++++---- cbpi/controller/satellite_controller.py | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 1f11a12..763e1e5 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.1.9" +__version__ = "4.0.1.10" diff --git a/cbpi/controller/actor_controller.py b/cbpi/controller/actor_controller.py index edb559d..f31abeb 100644 --- a/cbpi/controller/actor_controller.py +++ b/cbpi/controller/actor_controller.py @@ -9,7 +9,6 @@ class ActorController(BasicController): self.update_key = "actorupdate" async def on(self, id, power=None): -# logging.info("Controller_power: {}".format(power)) try: item = self.find_by_id(id) if power is None: @@ -20,7 +19,8 @@ class ActorController(BasicController): power = 100 if item.instance.state is False: await item.instance.on(power) - await self.push_udpate() + #await self.push_udpate() + self.cbpi.ws.send(dict(topic=self.update_key, data=list(map(lambda item: item.to_dict(), self.data)))) self.cbpi.push_update("cbpi/actorupdate/{}".format(id), item.to_dict(), True) else: await self.set_power(id, power) @@ -33,7 +33,8 @@ class ActorController(BasicController): item = self.find_by_id(id) if item.instance.state is True: await item.instance.off() - await self.push_udpate() + #await self.push_udpate() + self.cbpi.ws.send(dict(topic=self.update_key, data=list(map(lambda item: item.to_dict(), self.data)))) self.cbpi.push_update("cbpi/actorupdate/{}".format(id), item.to_dict()) except Exception as e: logging.error("Failed to switch on Actor {} {}".format(id, e), True) @@ -43,6 +44,7 @@ class ActorController(BasicController): item = self.find_by_id(id) instance = item.get("instance") await instance.toggle() + self.cbpi.ws.send(dict(topic=self.update_key, data=list(map(lambda item: item.to_dict(), self.data)))) self.cbpi.push_update("cbpi/actorupdate/{}".format(id), item.to_dict()) except Exception as e: logging.error("Failed to toggle Actor {} {}".format(id, e)) @@ -58,7 +60,8 @@ class ActorController(BasicController): try: item = self.find_by_id(id) item.power = round(power) - await self.push_udpate() + #await self.push_udpate() + self.cbpi.ws.send(dict(topic=self.update_key, data=list(map(lambda item: item.to_dict(), self.data)))) self.cbpi.push_update("cbpi/actorupdate/{}".format(id), item.to_dict()) except Exception as e: logging.error("Failed to update Actor {} {}".format(id, e)) diff --git a/cbpi/controller/satellite_controller.py b/cbpi/controller/satellite_controller.py index 4629ac8..3fbcd0d 100644 --- a/cbpi/controller/satellite_controller.py +++ b/cbpi/controller/satellite_controller.py @@ -63,7 +63,7 @@ class SatelliteController: if power < 0: power = 0 await self.cbpi.actor.set_power(topic_key[2],power) - await self.cbpi.actor.actor_update(topic_key[2],power) + #await self.cbpi.actor.actor_update(topic_key[2],power) except: self.logger.warning("Failed to set actor power via mqtt. No valid power in message") except: From c1dacd691e8ca5326b72d965e0ce1fc2c4ece158 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Thu, 3 Feb 2022 18:03:53 +0100 Subject: [PATCH 05/17] added filters for mqtt updates that can be triggered via mqtt cbpi/updatekettle cbpi/updateactor cbpi/updatesensor cbpi/updatefermenter --- cbpi/__init__.py | 2 +- cbpi/controller/satellite_controller.py | 47 +++++++++++++++++++++++-- cbpi/craftbeerpi.py | 2 +- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 763e1e5..466d13e 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.1.10" +__version__ = "4.0.1.11" diff --git a/cbpi/controller/satellite_controller.py b/cbpi/controller/satellite_controller.py index 3fbcd0d..230193e 100644 --- a/cbpi/controller/satellite_controller.py +++ b/cbpi/controller/satellite_controller.py @@ -1,5 +1,4 @@ - import asyncio import json from re import M @@ -8,11 +7,14 @@ from contextlib import AsyncExitStack, asynccontextmanager from cbpi import __version__ import logging - class SatelliteController: def __init__(self, cbpi): self.cbpi = cbpi + self.kettlecontroller = cbpi.kettle + self.fermentercontroller = cbpi.fermenter + self.sensorcontroller = cbpi.sensor + self.actorcontroller = cbpi.actor self.logger = logging.getLogger(__name__) self.host = cbpi.static_config.get("mqtt_host", "localhost") self.port = cbpi.static_config.get("mqtt_port", 1883) @@ -23,6 +25,11 @@ class SatelliteController: ("cbpi/actor/+/on", self._actor_on), ("cbpi/actor/+/off", self._actor_off), ("cbpi/actor/+/power", self._actor_power), + ("cbpi/updateactor", self._actorupdate), + ("cbpi/updatekettle", self._kettleupdate), + ("cbpi/updatesensor", self._sensorupdate), + ("cbpi/updatefermenter", self._fermenterupdate), + ] self.tasks = set() @@ -69,6 +76,42 @@ class SatelliteController: except: self.logger.warning("Failed to set actor power via mqtt") + async def _kettleupdate(self, messages): + async for message in messages: + try: + self.kettle=self.kettlecontroller.get_state() + for item in self.kettle['data']: + self.cbpi.push_update("cbpi/{}/{}".format("kettleupdate",item['id']), item) + except Exception as e: + self.logger.warning("Failed to send kettleupdate via mqtt: {}".format(e)) + + async def _fermenterupdate(self, messages): + async for message in messages: + try: + self.fermenter=self.fermentercontroller.get_state() + for item in self.fermenter['data']: + self.cbpi.push_update("cbpi/{}/{}".format("fermenterupdate",item['id']), item) + except Exception as e: + self.logger.warning("Failed to send fermenterupdate via mqtt: {}".format(e)) + + async def _actorupdate(self, messages): + async for message in messages: + try: + self.actor=self.actorcontroller.get_state() + for item in self.actor['data']: + self.cbpi.push_update("cbpi/{}/{}".format("actorupdate",item['id']), item) + except Exception as e: + self.logger.warning("Failed to send actorupdate via mqtt: {}".format(e)) + + async def _sensorupdate(self, messages): + async for message in messages: + try: + self.sensor=self.sensorcontroller.get_state() + for item in self.sensor['data']: + self.cbpi.push_update("cbpi/{}/{}".format("sensorupdate",item['id']), item) + except Exception as e: + self.logger.warning("Failed to send sensorupdate via mqtt: {}".format(e)) + def subcribe(self, topic, method): task = asyncio.create_task(self._subcribe(topic, method)) return task diff --git a/cbpi/craftbeerpi.py b/cbpi/craftbeerpi.py index 4c2f548..2aec078 100644 --- a/cbpi/craftbeerpi.py +++ b/cbpi/craftbeerpi.py @@ -109,6 +109,7 @@ class CraftBeerPi: self.log = LogController(self) self.system = SystemController(self) self.kettle = KettleController(self) + self.fermenter : FermentationController = FermentationController(self) self.step : StepController = StepController(self) self.recipe : RecipeController = RecipeController(self) self.upload : UploadController = UploadController(self) @@ -117,7 +118,6 @@ class CraftBeerPi: if str(self.static_config.get("mqtt", False)).lower() == "true": self.satellite: SatelliteController = SatelliteController(self) self.dashboard = DashboardController(self) - self.fermenter : FermentationController = FermentationController(self) self.http_step = StepHttpEndpoints(self) self.http_recipe = RecipeHttpEndpoints(self) From 6c1f928933d0306f828a76520ef4541fe0e9a7d1 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Fri, 4 Feb 2022 17:08:10 +0100 Subject: [PATCH 06/17] Update on mqttutil An update on kettle and fermenter is triggered on start of cbpi --- cbpi/__init__.py | 2 +- cbpi/extension/ConfigUpdate/__init__.py | 2 +- cbpi/extension/mqtt_util/__init__.py | 64 ++++++++++++++++++------- 3 files changed, 49 insertions(+), 19 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 466d13e..ff5e50e 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.1.11" +__version__ = "4.0.1.12" diff --git a/cbpi/extension/ConfigUpdate/__init__.py b/cbpi/extension/ConfigUpdate/__init__.py index f05145e..4895dc2 100644 --- a/cbpi/extension/ConfigUpdate/__init__.py +++ b/cbpi/extension/ConfigUpdate/__init__.py @@ -256,7 +256,7 @@ class ConfigUpdate(CBPiExtension): if mqttupdate is None: logger.info("INIT MQTT update frequency for Kettles and Fermenters") try: - await self.cbpi.config.add("MQTTUpdate", 60, ConfigType.SELECT, "Forced MQTT Update frequency in s for Kettle and Fermenter (no changes in payload required). Restart required after change", + await self.cbpi.config.add("MQTTUpdate", 0, ConfigType.SELECT, "Forced MQTT Update frequency in s for Kettle and Fermenter (no changes in payload required). Restart required after change", [{"label": "30", "value": 30}, {"label": "60", "value": 60}, {"label": "120", "value": 120}, diff --git a/cbpi/extension/mqtt_util/__init__.py b/cbpi/extension/mqtt_util/__init__.py index bc20f04..3cce4c4 100644 --- a/cbpi/extension/mqtt_util/__init__.py +++ b/cbpi/extension/mqtt_util/__init__.py @@ -12,32 +12,62 @@ class MQTTUtil(CBPiExtension): def __init__(self,cbpi): self.cbpi = cbpi - self.kettlecontroller : KettleController = cbpi.kettle - self.fermentationcontroller : FermentationController = cbpi.fermenter - self.mqttupdate = int(self.cbpi.config.get("MQTTUpdate", 60)) + self.kettlecontroller = cbpi.kettle + self.fermentationcontroller = cbpi.fermenter + # sensor and actor update is done anyhow during startup +# self.sensorcontroller = cbpi.sensor +# self.actorcontroller = cbpi.actor + + self.mqttupdate = int(self.cbpi.config.get("MQTTUpdate", 0)) if self.mqttupdate != 0: self._task = asyncio.create_task(self.run()) logger.info("INIT MQTTUtil") + else: + self._task = asyncio.create_task(self.push_once()) + + async def push_once(self): + # wait some time to ensure that kettlecontroller is started + await asyncio.sleep(5) + self.push_update() + async def run(self): while True: - try: - self.kettle=self.kettlecontroller.get_state() - for item in self.kettle['data']: - self.cbpi.push_update("cbpi/{}/{}".format("kettleupdate",item['id']), item) - except Exception as e: - logging.error(e) - pass - try: - self.fermenter=self.fermentationcontroller.get_state() - for item in self.fermenter['data']: - self.cbpi.push_update("cbpi/{}/{}".format("fermenterupdate",item['id']), item) - except Exception as e: - logging.error(e) - pass + self.push_update() await asyncio.sleep(self.mqttupdate) + def push_update(self): +# try: +# self.actor=self.actorcontroller.get_state() +# for item in self.actor['data']: +# self.cbpi.push_update("cbpi/{}/{}".format("actorupdate",item['id']), item) +# except Exception as e: +# logging.error(e) +# pass +# try: +# self.sensor=self.sensorcontroller.get_state() +# for item in self.sensor['data']: +# self.cbpi.push_update("cbpi/{}/{}".format("sensorupdate",item['id']), item) +# except Exception as e: +# logging.error(e) +# pass + try: + self.kettle=self.kettlecontroller.get_state() + for item in self.kettle['data']: + self.cbpi.push_update("cbpi/{}/{}".format("kettleupdate",item['id']), item) + except Exception as e: + logging.error(e) + pass + try: + self.fermenter=self.fermentationcontroller.get_state() + for item in self.fermenter['data']: + self.cbpi.push_update("cbpi/{}/{}".format("fermenterupdate",item['id']), item) + except Exception as e: + logging.error(e) + pass + + def setup(cbpi): if str(cbpi.static_config.get("mqtt", False)).lower() == "true": cbpi.plugin.register("MQTTUtil", MQTTUtil) From f8024f3b49902bcb300629fddf831be2b303a931 Mon Sep 17 00:00:00 2001 From: pascal1404 <36039270+pascal1404@users.noreply.github.com> Date: Fri, 4 Feb 2022 20:48:55 +0100 Subject: [PATCH 07/17] Add Influxdb-cloud connection and log for actor, fermenter and kettles --- cbpi/controller/fermentation_controller.py | 1 + cbpi/controller/kettle_controller.py | 1 + cbpi/controller/log_file_controller.py | 63 +++++++++++++++---- cbpi/extension/ConfigUpdate/__init__.py | 25 +++++--- cbpi/extension/dummyactor/__init__.py | 2 + cbpi/extension/gpioactor/__init__.py | 7 +++ .../mqtt_actor/generic_mqtt_actor.py | 2 + cbpi/extension/mqtt_actor/mqtt_actor.py | 2 + 8 files changed, 85 insertions(+), 18 deletions(-) diff --git a/cbpi/controller/fermentation_controller.py b/cbpi/controller/fermentation_controller.py index 5bb7611..e62876e 100644 --- a/cbpi/controller/fermentation_controller.py +++ b/cbpi/controller/fermentation_controller.py @@ -240,6 +240,7 @@ class FermentationController: if item: item.target_temp = target_temp self.save() + self.cbpi.log.log_data(item.id, target_temp) self.push_update() except Exception as e: logging.error("Failed to set Target Temp {} {}".format(id, e)) diff --git a/cbpi/controller/kettle_controller.py b/cbpi/controller/kettle_controller.py index 3c26a95..6cf3930 100644 --- a/cbpi/controller/kettle_controller.py +++ b/cbpi/controller/kettle_controller.py @@ -30,6 +30,7 @@ class KettleController(BasicController): item = self.find_by_id(id) item.target_temp = target_temp await self.save() + self.cbpi.log.log_data(item.id, target_temp) except Exception as e: logging.error("Failed to set Target Temp {} {}".format(id, e)) diff --git a/cbpi/controller/log_file_controller.py b/cbpi/controller/log_file_controller.py index 8546e7d..54a7362 100644 --- a/cbpi/controller/log_file_controller.py +++ b/cbpi/controller/log_file_controller.py @@ -54,25 +54,66 @@ class LogController: self.datalogger[name].info("%s,%s" % (formatted_time, value)) if self.influxdb == "Yes": - self.influxdb = self.cbpi.config.get("INFLUXDB", "No") + self.influxdbcloud = self.cbpi.config.get("INFLUXDBCLOUD", "No") self.influxdbaddr = self.cbpi.config.get("INFLUXDBADDR", None) self.influxdbport = self.cbpi.config.get("INFLUXDBPORT", None) self.influxdbname = self.cbpi.config.get("INFLUXDBNAME", None) self.influxdbuser = self.cbpi.config.get("INFLUXDBUSER", None) self.influxdbpwd = self.cbpi.config.get("INFLUXDBPWD", None) - self.base64string = base64.b64encode(('%s:%s' % (self.influxdbuser,self.influxdbpwd)).encode()) - self.influxdburl='http://' + self.influxdbaddr + ':' + str(self.influxdbport) + '/write?db=' + self.influxdbname - - + + id = name try: + chars = {'ö':'oe','ä':'ae','ü':'ue','Ö':'Oe','Ä':'Ae','Ü':'Ue'} sensor=self.cbpi.sensor.find_by_id(name) - sensorname=sensor.name.replace(" ", "_") - out="measurement,source=" + sensorname + "___" + name + " value="+str(value) - header = {'User-Agent': name, 'Content-Type': 'application/x-www-form-urlencoded','Authorization': 'Basic %s' % self.base64string.decode('utf-8')} - http = urllib3.PoolManager() - req = http.request('POST',self.influxdburl, body=out, headers = header) + if sensor is not None: + itemname=sensor.name.replace(" ", "_") + for char in chars: + itemname = itemname.replace(char,chars[char]) + out="sensor,source=" + itemname + ",itemID=" + str(id) + " value="+str(value) + else: + actor=self.cbpi.actor.find_by_id(name) + if actor is not None: + itemname=actor.name.replace(" ", "_") + for char in chars: + itemname = itemname.replace(char,chars[char]) + out="actor,source=" + itemname + ",itemID=" + str(id) + " value="+str(value) + else: + kettle=self.cbpi.kettle.find_by_id(name) + if kettle is not None: + itemname=kettle.name.replace(" ", "_") + for char in chars: + itemname = itemname.replace(char,chars[char]) + out="kettle,source=" + itemname + ",itemID=" + str(id) + " value="+str(value) + else: + fermenter=self.cbpi.fermenter._find_by_id(name) + if fermenter is not None: + itemname=fermenter.name.replace(" ", "_") + for char in chars: + itemname = itemname.replace(char,chars[char]) + out="fermenter,source=" + itemname + ",itemID=" + str(id) + " value="+str(value) except Exception as e: - logging.error("InfluxDB write Error: {}".format(e)) + logging.error("InfluxDB ID Error: {}".format(e)) + + if self.influxdbcloud == "Yes": + self.influxdburl="https://" + self.influxdbaddr + "/api/v2/write?org=" + self.influxdbuser + "&bucket=" + self.influxdbname + "&precision=s" + try: + header = {'User-Agent': name, 'Authorization': "Token {}".format(self.influxdbpwd)} + http = urllib3.PoolManager() + req = http.request('POST',self.influxdburl, body=out, headers = header) + except Exception as e: + logging.error("InfluxDB write Error: {}".format(e)) + + else: + self.influxdb = self.cbpi.config.get("INFLUXDB", "No") + self.base64string = base64.b64encode(('%s:%s' % (self.influxdbuser,self.influxdbpwd)).encode()) + self.influxdburl='http://' + self.influxdbaddr + ':' + str(self.influxdbport) + '/write?db=' + self.influxdbname + + try: + header = {'User-Agent': name, 'Content-Type': 'application/x-www-form-urlencoded','Authorization': 'Basic %s' % self.base64string.decode('utf-8')} + http = urllib3.PoolManager() + req = http.request('POST',self.influxdburl, body=out, headers = header) + except Exception as e: + logging.error("InfluxDB write Error: {}".format(e)) diff --git a/cbpi/extension/ConfigUpdate/__init__.py b/cbpi/extension/ConfigUpdate/__init__.py index a6714f7..af84bdc 100644 --- a/cbpi/extension/ConfigUpdate/__init__.py +++ b/cbpi/extension/ConfigUpdate/__init__.py @@ -43,6 +43,7 @@ class ConfigUpdate(CBPiExtension): influxdbname = self.cbpi.config.get("INFLUXDBNAME", None) influxdbuser = self.cbpi.config.get("INFLUXDBUSER", None) influxdbpwd = self.cbpi.config.get("INFLUXDBPWD", None) + influxdbcloud = self.cbpi.config.get("INFLUXDBCLOUD", None) @@ -194,7 +195,7 @@ class ConfigUpdate(CBPiExtension): except: logger.warning('Unable to update config') - ## Check if CSV logfiles is on config + ## Check if influxdb is on config if influxdb is None: logger.info("INIT Influxdb") try: @@ -208,7 +209,7 @@ class ConfigUpdate(CBPiExtension): if influxdbaddr is None: logger.info("INIT Influxdbaddr") try: - await self.cbpi.config.add("INFLUXDBADDR", "localhost", ConfigType.STRING, "IP Address of your influxdb server") + await self.cbpi.config.add("INFLUXDBADDR", "localhost", ConfigType.STRING, "IP Address of your influxdb server (If INFLUXDBCLOUD set to Yes use URL Address of your influxdb cloud server)") except: logger.warning('Unable to update config') @@ -224,23 +225,33 @@ class ConfigUpdate(CBPiExtension): if influxdbname is None: logger.info("INIT Influxdbname") try: - await self.cbpi.config.add("INFLUXDBNAME", "cbpi4", ConfigType.STRING, "Name of your influxdb database name") + await self.cbpi.config.add("INFLUXDBNAME", "cbpi4", ConfigType.STRING, "Name of your influxdb database name (If INFLUXDBCLOUD set to Yes use bucket of your influxdb cloud database)") except: logger.warning('Unable to update config') - ## Check if influxdber is in config + ## Check if influxduser is in config if influxdbuser is None: logger.info("INIT Influxdbuser") try: - await self.cbpi.config.add("INFLUXDBUSER", " ", ConfigType.STRING, "User name for your influxdb database (only if required)") + await self.cbpi.config.add("INFLUXDBUSER", " ", ConfigType.STRING, "User name for your influxdb database (only if required)(If INFLUXDBCLOUD set to Yes use organisation of your influxdb cloud database)") except: logger.warning('Unable to update config') - ## Check if influxdber is in config + ## Check if influxdpwd is in config if influxdbpwd is None: logger.info("INIT Influxdbpwd") try: - await self.cbpi.config.add("INFLUXDBPWD", " ", ConfigType.STRING, "Password for your influxdb database (only if required)") + await self.cbpi.config.add("INFLUXDBPWD", " ", ConfigType.STRING, "Password for your influxdb database (only if required)(If INFLUXDBCLOUD set to Yes use token of your influxdb cloud database)") + except: + logger.warning('Unable to update config') + + ## Check if influxdb cloud is on config + if influxdbcloud is None: + logger.info("INIT influxdbcloud") + try: + await self.cbpi.config.add("INFLUXDBCLOUD", "No", ConfigType.SELECT, "Write sensor data to influxdb cloud (INFLUXDB must set to Yes)", + [{"label": "Yes", "value": "Yes"}, + {"label": "No", "value": "No"}]) except: logger.warning('Unable to update config') diff --git a/cbpi/extension/dummyactor/__init__.py b/cbpi/extension/dummyactor/__init__.py index cc8a0cf..c4d954c 100644 --- a/cbpi/extension/dummyactor/__init__.py +++ b/cbpi/extension/dummyactor/__init__.py @@ -25,10 +25,12 @@ class DummyActor(CBPiActor): await super().start() async def on(self, power=0): + self.log_data(100) logger.info("ACTOR %s ON " % self.id) self.state = True async def off(self): + self.log_data(0) logger.info("ACTOR %s OFF " % self.id) self.state = False diff --git a/cbpi/extension/gpioactor/__init__.py b/cbpi/extension/gpioactor/__init__.py index 191aa43..14a21ac 100644 --- a/cbpi/extension/gpioactor/__init__.py +++ b/cbpi/extension/gpioactor/__init__.py @@ -63,11 +63,13 @@ class GPIOActor(CBPiActor): self.power = 100 await self.set_power(self.power) + self.log_data(self.power) logger.info("ACTOR %s ON - GPIO %s " % (self.id, self.gpio)) GPIO.output(self.gpio, self.get_GPIO_state(1)) self.state = True async def off(self): + self.log_data(0) logger.info("ACTOR %s OFF - GPIO %s " % (self.id, self.gpio)) GPIO.output(self.gpio, self.get_GPIO_state(0)) self.state = False @@ -93,6 +95,8 @@ class GPIOActor(CBPiActor): async def set_power(self, power): self.power = power + if self.state == True: + self.log_data(self.power) await self.cbpi.actor.actor_update(self.id,power) pass @@ -131,6 +135,7 @@ class GPIOPWMActor(CBPiActor): logging.info("PWM Final Power: {}".format(self.power)) + self.log_data(self.power) logger.info("PWM ACTOR %s ON - GPIO %s - Frequency %s - Power %s" % (self.id, self.gpio,self.frequency,self.power)) try: if self.p is None: @@ -142,12 +147,14 @@ class GPIOPWMActor(CBPiActor): pass async def off(self): + self.log_data(0) logger.info("PWM ACTOR %s OFF - GPIO %s " % (self.id, self.gpio)) self.p.ChangeDutyCycle(0) self.state = False async def set_power(self, power): if self.p and self.state == True: + self.log_data(self.power) self.p.ChangeDutyCycle(power) await self.cbpi.actor.actor_update(self.id,power) pass diff --git a/cbpi/extension/mqtt_actor/generic_mqtt_actor.py b/cbpi/extension/mqtt_actor/generic_mqtt_actor.py index c1a5b17..741a042 100644 --- a/cbpi/extension/mqtt_actor/generic_mqtt_actor.py +++ b/cbpi/extension/mqtt_actor/generic_mqtt_actor.py @@ -27,11 +27,13 @@ class GenericMqttActor(MQTTActor): async def on(self, power=None): self.normalize_power_value(power) + self.log_data(self.power) formatted_payload = self.payload.format(switch_onoff = "on", switch_10 = 1, power = self.power) await self.publish_mqtt_message(self.topic, formatted_payload) self.state = True async def off(self): + self.log_data(0) formatted_payload = self.payload.format(switch_onoff = "off", switch_10 = 0, power = self.power) await self.publish_mqtt_message(self.topic, formatted_payload) self.state = False \ No newline at end of file diff --git a/cbpi/extension/mqtt_actor/mqtt_actor.py b/cbpi/extension/mqtt_actor/mqtt_actor.py index 5788c12..ea2f034 100644 --- a/cbpi/extension/mqtt_actor/mqtt_actor.py +++ b/cbpi/extension/mqtt_actor/mqtt_actor.py @@ -29,6 +29,7 @@ class MQTTActor(CBPiActor): power = min(100, power) power = max(0, power) self.power = round(power) + self.log_data(self.power) await self.cbpi.satellite.publish(self.topic, json.dumps( {"state": "on", "power": self.power}), True) self.state = True @@ -36,6 +37,7 @@ class MQTTActor(CBPiActor): async def off(self): self.state = False + self.log_data(0) await self.cbpi.satellite.publish(self.topic, json.dumps( {"state": "off", "power": self.power}), True) pass From ab60c5c0fcb827568536c2d37344c28d3df50dc6 Mon Sep 17 00:00:00 2001 From: pascal1404 <36039270+pascal1404@users.noreply.github.com> Date: Sun, 6 Feb 2022 14:05:31 +0100 Subject: [PATCH 08/17] Remove kettle and fermenter target temp logs and actor logs --- cbpi/controller/fermentation_controller.py | 1 - cbpi/controller/kettle_controller.py | 1 - cbpi/controller/log_file_controller.py | 25 ++----------------- cbpi/extension/dummyactor/__init__.py | 2 -- cbpi/extension/gpioactor/__init__.py | 7 ------ .../mqtt_actor/generic_mqtt_actor.py | 2 -- cbpi/extension/mqtt_actor/mqtt_actor.py | 2 -- 7 files changed, 2 insertions(+), 38 deletions(-) diff --git a/cbpi/controller/fermentation_controller.py b/cbpi/controller/fermentation_controller.py index e62876e..5bb7611 100644 --- a/cbpi/controller/fermentation_controller.py +++ b/cbpi/controller/fermentation_controller.py @@ -240,7 +240,6 @@ class FermentationController: if item: item.target_temp = target_temp self.save() - self.cbpi.log.log_data(item.id, target_temp) self.push_update() except Exception as e: logging.error("Failed to set Target Temp {} {}".format(id, e)) diff --git a/cbpi/controller/kettle_controller.py b/cbpi/controller/kettle_controller.py index 6cf3930..3c26a95 100644 --- a/cbpi/controller/kettle_controller.py +++ b/cbpi/controller/kettle_controller.py @@ -30,7 +30,6 @@ class KettleController(BasicController): item = self.find_by_id(id) item.target_temp = target_temp await self.save() - self.cbpi.log.log_data(item.id, target_temp) except Exception as e: logging.error("Failed to set Target Temp {} {}".format(id, e)) diff --git a/cbpi/controller/log_file_controller.py b/cbpi/controller/log_file_controller.py index 54a7362..1decdc5 100644 --- a/cbpi/controller/log_file_controller.py +++ b/cbpi/controller/log_file_controller.py @@ -69,28 +69,7 @@ class LogController: itemname=sensor.name.replace(" ", "_") for char in chars: itemname = itemname.replace(char,chars[char]) - out="sensor,source=" + itemname + ",itemID=" + str(id) + " value="+str(value) - else: - actor=self.cbpi.actor.find_by_id(name) - if actor is not None: - itemname=actor.name.replace(" ", "_") - for char in chars: - itemname = itemname.replace(char,chars[char]) - out="actor,source=" + itemname + ",itemID=" + str(id) + " value="+str(value) - else: - kettle=self.cbpi.kettle.find_by_id(name) - if kettle is not None: - itemname=kettle.name.replace(" ", "_") - for char in chars: - itemname = itemname.replace(char,chars[char]) - out="kettle,source=" + itemname + ",itemID=" + str(id) + " value="+str(value) - else: - fermenter=self.cbpi.fermenter._find_by_id(name) - if fermenter is not None: - itemname=fermenter.name.replace(" ", "_") - for char in chars: - itemname = itemname.replace(char,chars[char]) - out="fermenter,source=" + itemname + ",itemID=" + str(id) + " value="+str(value) + out="measurement,source=" + itemname + ",itemID=" + str(id) + " value="+str(value) except Exception as e: logging.error("InfluxDB ID Error: {}".format(e)) @@ -101,7 +80,7 @@ class LogController: http = urllib3.PoolManager() req = http.request('POST',self.influxdburl, body=out, headers = header) except Exception as e: - logging.error("InfluxDB write Error: {}".format(e)) + logging.error("InfluxDB cloud write Error: {}".format(e)) else: self.influxdb = self.cbpi.config.get("INFLUXDB", "No") diff --git a/cbpi/extension/dummyactor/__init__.py b/cbpi/extension/dummyactor/__init__.py index c4d954c..cc8a0cf 100644 --- a/cbpi/extension/dummyactor/__init__.py +++ b/cbpi/extension/dummyactor/__init__.py @@ -25,12 +25,10 @@ class DummyActor(CBPiActor): await super().start() async def on(self, power=0): - self.log_data(100) logger.info("ACTOR %s ON " % self.id) self.state = True async def off(self): - self.log_data(0) logger.info("ACTOR %s OFF " % self.id) self.state = False diff --git a/cbpi/extension/gpioactor/__init__.py b/cbpi/extension/gpioactor/__init__.py index 14a21ac..191aa43 100644 --- a/cbpi/extension/gpioactor/__init__.py +++ b/cbpi/extension/gpioactor/__init__.py @@ -63,13 +63,11 @@ class GPIOActor(CBPiActor): self.power = 100 await self.set_power(self.power) - self.log_data(self.power) logger.info("ACTOR %s ON - GPIO %s " % (self.id, self.gpio)) GPIO.output(self.gpio, self.get_GPIO_state(1)) self.state = True async def off(self): - self.log_data(0) logger.info("ACTOR %s OFF - GPIO %s " % (self.id, self.gpio)) GPIO.output(self.gpio, self.get_GPIO_state(0)) self.state = False @@ -95,8 +93,6 @@ class GPIOActor(CBPiActor): async def set_power(self, power): self.power = power - if self.state == True: - self.log_data(self.power) await self.cbpi.actor.actor_update(self.id,power) pass @@ -135,7 +131,6 @@ class GPIOPWMActor(CBPiActor): logging.info("PWM Final Power: {}".format(self.power)) - self.log_data(self.power) logger.info("PWM ACTOR %s ON - GPIO %s - Frequency %s - Power %s" % (self.id, self.gpio,self.frequency,self.power)) try: if self.p is None: @@ -147,14 +142,12 @@ class GPIOPWMActor(CBPiActor): pass async def off(self): - self.log_data(0) logger.info("PWM ACTOR %s OFF - GPIO %s " % (self.id, self.gpio)) self.p.ChangeDutyCycle(0) self.state = False async def set_power(self, power): if self.p and self.state == True: - self.log_data(self.power) self.p.ChangeDutyCycle(power) await self.cbpi.actor.actor_update(self.id,power) pass diff --git a/cbpi/extension/mqtt_actor/generic_mqtt_actor.py b/cbpi/extension/mqtt_actor/generic_mqtt_actor.py index 741a042..c1a5b17 100644 --- a/cbpi/extension/mqtt_actor/generic_mqtt_actor.py +++ b/cbpi/extension/mqtt_actor/generic_mqtt_actor.py @@ -27,13 +27,11 @@ class GenericMqttActor(MQTTActor): async def on(self, power=None): self.normalize_power_value(power) - self.log_data(self.power) formatted_payload = self.payload.format(switch_onoff = "on", switch_10 = 1, power = self.power) await self.publish_mqtt_message(self.topic, formatted_payload) self.state = True async def off(self): - self.log_data(0) formatted_payload = self.payload.format(switch_onoff = "off", switch_10 = 0, power = self.power) await self.publish_mqtt_message(self.topic, formatted_payload) self.state = False \ No newline at end of file diff --git a/cbpi/extension/mqtt_actor/mqtt_actor.py b/cbpi/extension/mqtt_actor/mqtt_actor.py index ea2f034..5788c12 100644 --- a/cbpi/extension/mqtt_actor/mqtt_actor.py +++ b/cbpi/extension/mqtt_actor/mqtt_actor.py @@ -29,7 +29,6 @@ class MQTTActor(CBPiActor): power = min(100, power) power = max(0, power) self.power = round(power) - self.log_data(self.power) await self.cbpi.satellite.publish(self.topic, json.dumps( {"state": "on", "power": self.power}), True) self.state = True @@ -37,7 +36,6 @@ class MQTTActor(CBPiActor): async def off(self): self.state = False - self.log_data(0) await self.cbpi.satellite.publish(self.topic, json.dumps( {"state": "off", "power": self.power}), True) pass From 033165d619169440135a18b666f9fb521d5121af Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Mon, 7 Feb 2022 17:52:42 +0100 Subject: [PATCH 09/17] updated requirements in setup.py --- cbpi/__init__.py | 2 +- cbpi/controller/log_file_controller.py | 12 ------------ cbpi/craftbeerpi.py | 6 ++++++ setup.py | 4 ++-- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index ff5e50e..2c44725 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.1.12" +__version__ = "4.0.1.13" diff --git a/cbpi/controller/log_file_controller.py b/cbpi/controller/log_file_controller.py index 1decdc5..d835982 100644 --- a/cbpi/controller/log_file_controller.py +++ b/cbpi/controller/log_file_controller.py @@ -26,15 +26,6 @@ class LogController: self.configuration = False self.datalogger = {} -# self.cbpi.config.get does not seem to work here... -# self.influxdbaddr="192.168.163.105" -# self.influxdbport="8086" -# self.influxdbname="cbpi4" -# self.influxdburl='http://' + self.influxdbaddr + ':' + str(self.influxdbport) + '/write?db=' + self.influxdbname -# self.influxdbuser="" -# self.influxdbpwd="" -# self.base64string = base64.b64encode(('%s:%s' % (self.influxdbuser,self.influxdbpwd)).encode()) - def log_data(self, name: str, value: str) -> None: self.logfiles = self.cbpi.config.get("CSVLOGFILES", "Yes") self.influxdb = self.cbpi.config.get("INFLUXDB", "No") @@ -52,7 +43,6 @@ class LogController: formatted_time = strftime("%Y-%m-%d %H:%M:%S", localtime()) self.datalogger[name].info("%s,%s" % (formatted_time, value)) - if self.influxdb == "Yes": self.influxdbcloud = self.cbpi.config.get("INFLUXDBCLOUD", "No") self.influxdbaddr = self.cbpi.config.get("INFLUXDBADDR", None) @@ -83,10 +73,8 @@ class LogController: logging.error("InfluxDB cloud write Error: {}".format(e)) else: - self.influxdb = self.cbpi.config.get("INFLUXDB", "No") self.base64string = base64.b64encode(('%s:%s' % (self.influxdbuser,self.influxdbpwd)).encode()) self.influxdburl='http://' + self.influxdbaddr + ':' + str(self.influxdbport) + '/write?db=' + self.influxdbname - try: header = {'User-Agent': name, 'Content-Type': 'application/x-www-form-urlencoded','Authorization': 'Basic %s' % self.base64string.decode('utf-8')} http = urllib3.PoolManager() diff --git a/cbpi/craftbeerpi.py b/cbpi/craftbeerpi.py index 2aec078..212537c 100644 --- a/cbpi/craftbeerpi.py +++ b/cbpi/craftbeerpi.py @@ -285,6 +285,12 @@ class CraftBeerPi: self._swagger_setup() + level = logging.INFO + logger = logging.getLogger() + logger.setLevel(level) + for handler in logger.handlers: + handler.setLevel(level) + return self.app def start(self): diff --git a/setup.py b/setup.py index d293b75..ebd0ab3 100644 --- a/setup.py +++ b/setup.py @@ -30,13 +30,13 @@ setup(name='cbpi', "requests==2.25.1", "voluptuous==0.12.1", "pyfiglet==0.8.post1", - 'pandas==1.1.5', + 'pandas==1.4.0', 'click==7.1.2', 'shortuuid==1.0.1', 'tabulate==0.8.7', 'asyncio-mqtt', 'psutil==5.8.0', - 'numpy==1.20.3', + 'numpy==1.22.0', 'cbpi4ui', 'importlib_metadata'] + ( ['RPi.GPIO==0.7.1a4'] if platform.uname()[1] == "raspberrypi" else [] ), From 94d32c4dc4ecec9e9e4c7727c61bbb38aeb6ab75 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Mon, 7 Feb 2022 18:57:02 +0100 Subject: [PATCH 10/17] fixed duplicated mqtt message for gpioactors --- cbpi/__init__.py | 2 +- cbpi/extension/gpioactor/__init__.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cbpi/__init__.py b/cbpi/__init__.py index 2c44725..5c14468 100644 --- a/cbpi/__init__.py +++ b/cbpi/__init__.py @@ -1 +1 @@ -__version__ = "4.0.1.13" +__version__ = "4.0.1.14" diff --git a/cbpi/extension/gpioactor/__init__.py b/cbpi/extension/gpioactor/__init__.py index 191aa43..1687482 100644 --- a/cbpi/extension/gpioactor/__init__.py +++ b/cbpi/extension/gpioactor/__init__.py @@ -61,7 +61,7 @@ class GPIOActor(CBPiActor): self.power = power else: self.power = 100 - await self.set_power(self.power) +# await self.set_power(self.power) logger.info("ACTOR %s ON - GPIO %s " % (self.id, self.gpio)) GPIO.output(self.gpio, self.get_GPIO_state(1)) @@ -123,21 +123,21 @@ class GPIOPWMActor(CBPiActor): pass async def on(self, power = None): - logging.info("PWM Actor Power: {}".format(power)) + logging.debug("PWM Actor Power: {}".format(power)) if power is not None: self.power = power else: self.power = 100 - logging.info("PWM Final Power: {}".format(self.power)) + logging.debug("PWM Final Power: {}".format(self.power)) - logger.info("PWM ACTOR %s ON - GPIO %s - Frequency %s - Power %s" % (self.id, self.gpio,self.frequency,self.power)) + logger.debug("PWM ACTOR %s ON - GPIO %s - Frequency %s - Power %s" % (self.id, self.gpio,self.frequency,self.power)) try: if self.p is None: self.p = GPIO.PWM(int(self.gpio), float(self.frequency)) self.p.start(self.power) self.state = True - await self.cbpi.actor.actor_update(self.id,self.power) +# await self.cbpi.actor.actor_update(self.id,self.power) except: pass From 9deb4d115ea2d52e479eb777e54b433271f4030a Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Mon, 7 Feb 2022 22:31:21 +0100 Subject: [PATCH 11/17] Update setup.py revert back to pandas 1.3.5 as docker image won't build --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ebd0ab3..0ada437 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,7 @@ setup(name='cbpi', "requests==2.25.1", "voluptuous==0.12.1", "pyfiglet==0.8.post1", - 'pandas==1.4.0', + 'pandas==1.3.5', 'click==7.1.2', 'shortuuid==1.0.1', 'tabulate==0.8.7', From a24f4269096fd8ea50abce5dee943b02910d42e3 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Mon, 7 Feb 2022 22:34:53 +0100 Subject: [PATCH 12/17] Update setup.py reverted back to numpy 1.21.5 as docker image won't build --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 0ada437..d82ab02 100644 --- a/setup.py +++ b/setup.py @@ -36,7 +36,7 @@ setup(name='cbpi', 'tabulate==0.8.7', 'asyncio-mqtt', 'psutil==5.8.0', - 'numpy==1.22.0', + 'numpy==1.21.5', 'cbpi4ui', 'importlib_metadata'] + ( ['RPi.GPIO==0.7.1a4'] if platform.uname()[1] == "raspberrypi" else [] ), From 31fb88ef232740db69ef649c3294d2d6d63a1068 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Fri, 11 Feb 2022 06:56:16 +0100 Subject: [PATCH 13/17] Update setup.py test for docker --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index d82ab02..8064774 100644 --- a/setup.py +++ b/setup.py @@ -30,13 +30,13 @@ setup(name='cbpi', "requests==2.25.1", "voluptuous==0.12.1", "pyfiglet==0.8.post1", - 'pandas==1.3.5', + 'pandas', 'click==7.1.2', 'shortuuid==1.0.1', 'tabulate==0.8.7', 'asyncio-mqtt', 'psutil==5.8.0', - 'numpy==1.21.5', + 'numpy', 'cbpi4ui', 'importlib_metadata'] + ( ['RPi.GPIO==0.7.1a4'] if platform.uname()[1] == "raspberrypi" else [] ), From c47849e7413b2290e5a905ae78688fd849d88bc7 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Fri, 11 Feb 2022 07:15:15 +0100 Subject: [PATCH 14/17] Update setup.py Reverted back to old combination of pandas and numpy as other combinations of newer versions are causing an error: valueerror: numpy.ndarray size changed, may indicate binary incompatibility. expected 48 from c header, got 44 from pyobject --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 8064774..d293b75 100644 --- a/setup.py +++ b/setup.py @@ -30,13 +30,13 @@ setup(name='cbpi', "requests==2.25.1", "voluptuous==0.12.1", "pyfiglet==0.8.post1", - 'pandas', + 'pandas==1.1.5', 'click==7.1.2', 'shortuuid==1.0.1', 'tabulate==0.8.7', 'asyncio-mqtt', 'psutil==5.8.0', - 'numpy', + 'numpy==1.20.3', 'cbpi4ui', 'importlib_metadata'] + ( ['RPi.GPIO==0.7.1a4'] if platform.uname()[1] == "raspberrypi" else [] ), From 04753946d0a849451a5eec3eb8f23055883631f8 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Fri, 11 Feb 2022 17:19:41 +0100 Subject: [PATCH 15/17] Update setup.py Test with conditional setup.py for 64 bit raspbian --- setup.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index d293b75..021d7d8 100644 --- a/setup.py +++ b/setup.py @@ -30,16 +30,19 @@ setup(name='cbpi', "requests==2.25.1", "voluptuous==0.12.1", "pyfiglet==0.8.post1", - 'pandas==1.1.5', +# 'pandas==1.1.5', 'click==7.1.2', 'shortuuid==1.0.1', 'tabulate==0.8.7', 'asyncio-mqtt', 'psutil==5.8.0', - 'numpy==1.20.3', +# 'numpy==1.20.3', 'cbpi4ui', 'importlib_metadata'] + ( - ['RPi.GPIO==0.7.1a4'] if platform.uname()[1] == "raspberrypi" else [] ), + ['RPi.GPIO==0.7.1a4'] if platform.uname()[1] == "raspberrypi" else [] ) + + (['numpy==1.22.0'] if (platform.uname()[1] == "raspberrypi") and (platform.architecture()[0][0:2] == "64") else ['numpy==1.20.3'] ) + + (['pandas==1.4.0'] if (platform.uname()[1] == "raspberrypi") and (platform.architecture()[0][0:2] == "64") else ['pandas==1.1.5'] ), + dependency_links=[ 'https://testpypi.python.org/pypi', From f887d6247baf7137e8ac6d7d74c8e5943dc47846 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Sat, 12 Feb 2022 14:56:31 +0100 Subject: [PATCH 16/17] Update setup.py --- setup.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 021d7d8..e773530 100644 --- a/setup.py +++ b/setup.py @@ -30,18 +30,16 @@ setup(name='cbpi', "requests==2.25.1", "voluptuous==0.12.1", "pyfiglet==0.8.post1", -# 'pandas==1.1.5', 'click==7.1.2', 'shortuuid==1.0.1', 'tabulate==0.8.7', 'asyncio-mqtt', 'psutil==5.8.0', -# 'numpy==1.20.3', 'cbpi4ui', 'importlib_metadata'] + ( ['RPi.GPIO==0.7.1a4'] if platform.uname()[1] == "raspberrypi" else [] ) + - (['numpy==1.22.0'] if (platform.uname()[1] == "raspberrypi") and (platform.architecture()[0][0:2] == "64") else ['numpy==1.20.3'] ) + - (['pandas==1.4.0'] if (platform.uname()[1] == "raspberrypi") and (platform.architecture()[0][0:2] == "64") else ['pandas==1.1.5'] ), + (['numpy==1.22.0'] if (int(platform.python_version_tuple()[1]) >= 9) and (int(platform.python_version_tuple()[0]) == 3) else ['numpy==1.20.3'] ) + + (['pandas==1.4.0'] if (int(platform.python_version_tuple()[1]) >= 9) and (int(platform.python_version_tuple()[0]) == 3) else ['pandas==1.1.5'] ), dependency_links=[ From 1652b340fe53d2fd138d72f509a027a8fe3dc9b2 Mon Sep 17 00:00:00 2001 From: avollkopf <43980694+avollkopf@users.noreply.github.com> Date: Sat, 12 Feb 2022 15:38:51 +0100 Subject: [PATCH 17/17] Update setup.py better detection of raspberry pi based cpu for RPi.GPIO --- setup.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index e773530..99d5137 100644 --- a/setup.py +++ b/setup.py @@ -2,6 +2,18 @@ from setuptools import setup, find_packages from cbpi import __version__ import platform +# read the contents of your README file +from os import popen + +localsystem = platform.system() +raspberrypi=False +if localsystem == "Linux": + command="cat /proc/cpuinfo | grep Raspberry" + model=popen(command).read() + if len(model) != 0: + raspberrypi=True + + setup(name='cbpi', version=__version__, description='CraftBeerPi', @@ -37,7 +49,7 @@ setup(name='cbpi', 'psutil==5.8.0', 'cbpi4ui', 'importlib_metadata'] + ( - ['RPi.GPIO==0.7.1a4'] if platform.uname()[1] == "raspberrypi" else [] ) + + ['RPi.GPIO==0.7.1a4'] if raspberrypi else [] ) + (['numpy==1.22.0'] if (int(platform.python_version_tuple()[1]) >= 9) and (int(platform.python_version_tuple()[0]) == 3) else ['numpy==1.20.3'] ) + (['pandas==1.4.0'] if (int(platform.python_version_tuple()[1]) >= 9) and (int(platform.python_version_tuple()[0]) == 3) else ['pandas==1.1.5'] ),