strawberry-pi-greenhouse/main.py

147 lines
4.8 KiB
Python

from datetime import datetime
def debug_print(message: str):
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print('[DEBUG]['+current_time+'] '+message)
def error_print(message: str):
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print('[ERROR]['+current_time+'] '+message)
debug_print("Importing modules")
from string import whitespace
import time
import os
try:
import paho.mqtt.client as mqtt
import gpiozero
import RPi.GPIO as GPIO
import board
import busio
import adafruit_bmp280
except ImportError:
print('Some modules are missing. Try to install them with "pip3 install -r requirements.txt"')
print(ImportError)
exit()
debug_print("Imported modules")
#relay
def relay_controller(pin: int, state: str):
if state == "True":
os.system('raspi-gpio set '+str(pin)+' op')
debug_print("Set relay-pin "+str(pin)+" to state True")
elif state == "False":
os.system('raspi-gpio set '+str(pin)+' ip')
debug_print("Set relay-pin "+str(pin)+" to state False")
else:
error_print("Unknown state ("+state+") for relay channel "+str(pin))
#ultrasonic
# try:
# def get_water_level():
# GPIO.setmode(GPIO.BCM)
# GPIO.setwarnings(False)
# GPIO_TRIGGER = 24
# GPIO_ECHO = 25
# GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
# GPIO.setup(GPIO_ECHO, GPIO.IN)
# GPIO.output(GPIO_TRIGGER, True)
# time.sleep(0.00001)
# GPIO.output(GPIO_TRIGGER, False)
# startTime = time.time()
# StopTime = time.time()
# while GPIO.input(GPIO_ECHO) == 0:
# startTime = time.time()
# while GPIO.input(GPIO_ECHO) == 1:
# StopTime = time.time()
# TimeElapsed = StopTime - startTime
# distance = (TimeElapsed * 34300) / 2
# rounded_distance = int(distance)
# return str(rounded_distance)
# print(get_water_level())
# debug_print("Added water level detector")
# except:
# print("Adding water level sensor fail.")
#temperature
try:
def get_temperature():
i2c = busio.I2C(board.SCL, board.SDA)
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c, address=0x76)
rounded_temp = int(bmp280.temperature)
return str(rounded_temp)
debug_print("Added temperature sensor")
print(get_temperature())
except:
print("Adding temperature sensor faild.")
def mqtt_on_connect(client, userdata, flags, rc):
client.subscribe("strawberry-pi-greenhouse/relay/channel/1")
client.subscribe("strawberry-pi-greenhouse/relay/channel/2")
client.subscribe("strawberry-pi-greenhouse/relay/channel/3")
client.subscribe("strawberry-pi-greenhouse/relay/channel/4")
def mqtt_on_message(client, userdata, msg):
print("topic: " ,str(msg.topic))
print("payload: " ,str(msg.payload.decode("utf-8")))
topic = str(msg.topic)
payload = str(msg.payload.decode("utf-8"))
channel_1 = 19
channel_2 = 16
channel_3 = 26
channel_4 = 20
if topic == "strawberry-pi-greenhouse/relay/channel/1":
if payload == "on":
relay_controller(channel_1, "True")
elif payload == "off":
relay_controller(channel_1, "False")
elif topic == "strawberry-pi-greenhouse/relay/channel/2":
if payload == "on":
relay_controller(channel_2, "True")
elif payload == "off":
relay_controller(channel_2, "False")
elif topic == "strawberry-pi-greenhouse/relay/channel/3":
if payload == "on":
relay_controller(channel_3, "True")
elif payload == "off":
relay_controller(channel_3, "False")
elif topic == "strawberry-pi-greenhouse/relay/channel/4":
if payload == "on":
relay_controller(channel_4, "True")
elif payload == "off":
relay_controller(channel_4, "False")
if __name__ == "__main__":
mqttBroker ="homeassistant.ping-mee.local"
client = mqtt.Client("greenhouse_client")
client.username_pw_set("mqtt", "pmMQTT_11!")
debug_print("Connecting to MQTT Broker "+str(mqttBroker))
client.connect(mqttBroker)
client.on_connect = mqtt_on_connect
client.on_message = mqtt_on_message
client.loop_start()
try:
client.loop_start()
while True:
client.publish("strawberry-pi-greenhouse/sensor/temperature", get_temperature())
debug_print("Published current temperature: "+get_temperature())
client.publish("strawberry-pi-greenhouse/sensor/water-level", get_water_level())
debug_print("Published current water level: "+get_water_level())
time.sleep(1)
except KeyboardInterrupt:
relay_channels = ["19", "16", "26", "20"]
for channel in relay_channels:
os.system('raspi-gpio set '+channel+' ip')
GPIO.cleanup()