From f8cb99aa08dd26583588de206c2774a1a0b8e2bf Mon Sep 17 00:00:00 2001 From: Dirk Alders Date: Mon, 21 Dec 2020 01:23:52 +0100 Subject: [PATCH] Adaption to new logging --- __init__.py | 8 +++++-- bmp.py | 11 +++++++++- dht.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 75 insertions(+), 7 deletions(-) diff --git a/__init__.py b/__init__.py index 8b5fe4b..74cc71a 100644 --- a/__init__.py +++ b/__init__.py @@ -4,8 +4,12 @@ import time DEBUG = False -logger_name = 'RPI_ENVSENS' -logger = logging.getLogger(logger_name) +try: + from config import APP_NAME as ROOT_LOGGER_NAME +except ImportError: + ROOT_LOGGER_NAME = 'root' + +logger = logging.getLogger(ROOT_LOGGER_NAME).getChild(__name__) class background_task(object): diff --git a/bmp.py b/bmp.py index e21d937..195ccb5 100644 --- a/bmp.py +++ b/bmp.py @@ -1,6 +1,15 @@ +import logging import time -from . import logger, background_task +try: + from config import APP_NAME as ROOT_LOGGER_NAME +except ImportError: + ROOT_LOGGER_NAME = 'root' + +logger = logging.getLogger(ROOT_LOGGER_NAME).getChild(__name__) + +from . import background_task + try: import smbus except ImportError: diff --git a/dht.py b/dht.py index a4161b7..e95bce2 100644 --- a/dht.py +++ b/dht.py @@ -1,6 +1,15 @@ +import logging import time -from . import logger, background_task +try: + from config import APP_NAME as ROOT_LOGGER_NAME +except ImportError: + ROOT_LOGGER_NAME = 'root' + +logger = logging.getLogger(ROOT_LOGGER_NAME).getChild(__name__) + +from . import background_task + try: import adafruit_dht except ImportError: @@ -18,9 +27,10 @@ class dht_22(background_task): def __init__(self, gpio, data_callback=None): self.__data_callback__ = data_callback + self.__monitor__ = dht_22_monitor(300) # Initial the dht device, with data pin connected to: if not DEBUG: - self.__dht_device__ = adafruit_dht.DHT22(gpio) + self.__dht_device__ = adafruit_dht.DHT22(gpio, use_pulseio=False) # Initialise background_task background_task.__init__(self) @@ -28,8 +38,13 @@ class dht_22(background_task): data = self.__dht_data_transmission__() if data is not None: logger.debug('DHT-Communication: Successfully: %s', repr(data)) + self.__monitor__.process(data) if self.__data_callback__ is not None: self.__data_callback__(**data) + if self.__monitor__.status(): + logger.warning("DHT measurement stopped caused by too many identical values!") + self.close() + def __dht_data_transmission__(self): if not DEBUG: @@ -42,11 +57,11 @@ class dht_22(background_task): data[self.KEY_TIME] = int(time.time()) if data[self.KEY_TEMPERATURE] is not None and data[self.KEY_HUMIDITY] is not None: return data - time.sleep(2.0) + time.sleep(self.RUN_SLEEP_TIME) except RuntimeError as error: # Errors happen fairly often, DHT's are hard to read, just keep going logger.info('DHT-Communication: ' + error.args[0]) - time.sleep(0.1) + time.sleep(2.0) except Exception as error: self.__dht_device__.exit() raise error @@ -56,3 +71,43 @@ class dht_22(background_task): self.KEY_HUMIDITY: 1.7, self.KEY_TIME: int(time.time()), } + + +class dht_22_monitor(object): + def __init__(self, max_const_treshold=250): + self.__max_const_treshold__ = max_const_treshold + self.__fail__ = False + self.__max_const_measurements__ = 0 + self.__init_statevars__() + + def __init_statevars__(self): + self.__current_const_measurements__ = 0 + self.__last_measurements__ = None + + def process(self, data): + if self.__last_measurements__ is None: + self.__last_measurements__ = data + else: + data_is_equal = True + for key in [dht_22.KEY_HUMIDITY, dht_22.KEY_TEMPERATURE]: + if data[key] != self.__last_measurements__[key]: + data_is_equal = False + if data_is_equal: + self.__current_const_measurements__ += 1 + if self.__current_const_measurements__ > self.__max_const_measurements__: + self.__max_const_measurements__ = self.__current_const_measurements__ + else: + if self.__current_const_measurements__ >= self.__max_const_measurements__: + logger.warning('%d identical data measurements identified!', self.__max_const_measurements__) + self.__init_statevars__() + if self.__max_const_measurements__ > self.__max_const_treshold__: + if not self.__fail__: + logger.warning("DHT measurement values are suspicious constant!") + self.__fail__ = True + + def status(self): + if self.__fail__: + self.__fail__ = False + self.__max_const_measurements__ = 0 + return True + return False