From 6c02fd1bcaa875815607aa2f950a1f99029f2d70 Mon Sep 17 00:00:00 2001 From: Thomas Klaehn Date: Sun, 4 Apr 2021 08:49:35 +0200 Subject: [PATCH] Fix heat pin handling --- greenhouse/app.py | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/greenhouse/app.py b/greenhouse/app.py index fe7e382..30b10b8 100644 --- a/greenhouse/app.py +++ b/greenhouse/app.py @@ -1,5 +1,6 @@ import json import datetime +import logging from threading import Thread from time import sleep @@ -12,7 +13,7 @@ from w1thermsensor import W1ThermSensor import RPi.GPIO as GPIO sensor = W1ThermSensor() -water_pin = 17 #17/27/22 +water_pin = 22 #17/27/22 heat_pin = 26 heat_state = False @@ -23,6 +24,14 @@ GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(water_pin, GPIO.OUT) +log_level = logging.INFO +LOG_FILE = "/var/log/greenhouse.log" +LOG_FORMAT = "%(asctime)s %(levelname)s %(message)s" + +logging.basicConfig(format=LOG_FORMAT, level=log_level, filename=LOG_FILE) +#logging.basicConfig(format=LOG_FORMAT, level=log_level) +log = logging.getLogger('greenhouse') + class Heat(Thread): def __init__(self, pin): super(Heat, self).__init__() @@ -36,11 +45,11 @@ class Heat(Thread): def on(self): self.__state = True - GPIO.output(self.__pin, 1) + GPIO.output(self.__pin, 0) def off(self): self.__state = False - GPIO.output(self.__pin, 0) + GPIO.output(self.__pin, 1) def run(self): self.__next_update = datetime.datetime.now() @@ -49,9 +58,9 @@ class Heat(Thread): if now >= self.__next_update: if self.__state: # Do a power cycle to prevent auto-poweroff - GPIO.output(self.__pin, 0) - sleep(5) GPIO.output(self.__pin, 1) + sleep(5) + GPIO.output(self.__pin, 0) self.__next_update = now + datetime.timedelta(minutes=5) sleep(1) @@ -93,8 +102,10 @@ class GreenControl(Thread): temperature = sensor.get_temperature() if float(temperature) < float(self.config['heat']['on_temperature']) and not heat.state(): heat.on() + log.info("Switch heat on by temperature level: %.1f °C", float(temperature)) elif float(temperature) > float(self.config['heat']['off_temperature']) and heat.state(): heat.off() + log.info("Switch heat off by temperature level: %.1f °C", float(temperature)) elif heat.state(): # Do a power cycle to prevent auto-poweroff heat.off() @@ -113,11 +124,13 @@ class GreenControl(Thread): off_time = now.replace(hour=int(off_time_pattern[0]), minute=int(off_time_pattern[1]), second=0, microsecond=0) if now > on_time and now <= off_time and not self.__water_state: - GPIO.output(water_pin, 1) - self.__water_state = True - elif now > off_time and self.__water_state: GPIO.output(water_pin, 0) + self.__water_state = True + log.info("Switch water on by time") + elif now > off_time and self.__water_state: + GPIO.output(water_pin, 1) self.__water_state = False + log.info("Switch water off by time") sleep(1) @@ -165,7 +178,7 @@ def get_sample(): temperature = None water_state = False - if GPIO.input(water_pin): + if not GPIO.input(water_pin): water_state = True res = {} @@ -183,14 +196,18 @@ def patch_sample(): record = json.loads(request.data) if "water" in record: if record["water"]: - GPIO.output(water_pin, 1) - else: GPIO.output(water_pin, 0) + log.info("Switch water on by button: {}".format(datetime.datetime.now())) + else: + GPIO.output(water_pin, 1) + log.info("Switch water off by button: {}".format(datetime.datetime.now())) if "heat" in record: if record["heat"]: heat.on() + log.info("Switch heat on by button: {}".format(datetime.datetime.now())) else: heat.off() + log.info("Switch heat off by button: {}".format(datetime.datetime.now())) res = make_response("", 204) return res