Es war angesagt die Pflanzen auf der Fensterbank und im Garten etwas genauer zu überwachen, zu gießen und die Werte zu protokollieren.
Homematic biete diese Sensoren nicht und so musste eine Alternative gefunden werden. Einige Werte aus der Homematic waren schon da (Wetterstation) und andere müssen zur Steuerung in die CCU übertragen werden.
Meine Lösung:
1. Systemvariablen aus der CCU3 auszulesen und über Raspberry in eine MSQL Datenbank auf ein Synology NAS zu schreiben
2. Systemvariablen von Sensoren die am Raspberry über WiFi und Bluetooth angeschlossen sind an die CCU zu senden
Das Ganze ist eine sehr preiswerte Lösung, Sensoren anzukoppeln die es für die Homematic so nicht gibt und damit Aktoren zu steuern.
Man sollte das aber als Bastel-Lösung betrachten und auf gar keinen Fall mit den WiFi Relais 220V ohne einschlägige Kenntnisse schalten.
Auf dem Raspberry läuft ein Python Skript das zyklisch alle 30 Minuten die Sensoren abfragt, die Werte aus der CCU ausliest und sendet und dann in die MYSQL Datenbank schreibt. Der Raspberry wird so als Datensammler und Slave für die angeschlossenen Sensoren und Relais benutzt. Die CCU3 macht das was sie soll, nämlich die Aktoren steuern. Dazu gibt es ja jede Menge Skripte bzw. Verknüpfungen von Aktoren mit den Systemvariablen.
Die Programmierung des Raspberries in Python ist auf Anfängerniveau und wird noch optimiert. Hauptsache ist aber das es funktioniert.
Nebenbei:
- Für die MiFlora sensoren gibt es auch eine hübsche Handyapp, die eine große Auswahl von Pflanzen mit Pflegeanleitung bietet und genau anzeigt wann man gießen und düngen soll. Eure Liebste wird begeistert sein !
- Das Luftdatenprojekt macht Spaß und man sieht wieviel Feinstaub wirklich bei uns rumfliegt.
Kosten (alles bei Ama**n):
- Raspberry Starterkit ~ 60€
- MiFLora Bluetooth Pflanzensensoren (Helligkeit, Bodenfeuchte, Temperature und Helligkeit) ~ 15€
- Nodemcu ESP32 WiFI mit Bodenfeuchtesensor ~ 12€
- Relais mit WiFI ESP8266 ~ 7€
- Luftdatensensor ~ 30€
In der CCU muss das XMLAPI installiert sein und es sind die benötigten Systemvariablen anzulegen, entsprechend zu füllen, bzw. zu benutzen.
Angeschlossen am Raspberry sind folgende Sensoren:
- MiFlora Bluetooth Pflanzensensoren (sehr preiswert und haltbar)
- BM280 Luftdruck/Temperatur
- extern etliche batteriebetriebene Mini WiFi ESP8266/32 (Nodemcu) mit Temperatur und Bodenfeuchtigkeitssensoren die
über den Mosquittoserver Daten an den Raspberry liefern
- einige Arduino WiFi Relais die mit 9V laufen um Ventile im Garten zu schalten
- Abfrage eines Feinstaubsensors über www.luftdaten.info, ein Open Project für Luftqualität
Raspberry Software installation:
- Mosquitto Server für WiFI Sensoren
- Python3 (standard) mit den notwendigen Bibliotheken
Hier ein paar Codeschnipsel in Python3 wie das alles funktioniert. Wer Interesse hat, kann gerne das ganze Skript haben. Insbesondere die Mosquitto Abfrage von den WiFi Nodemcu Sensoren ist etwas tricky und würde hier den Rahmen sprengen.
benötigte Python Bibliotheken
Code: Alles auswählen
import mysql.connector as mc # MYSQL Verbindung
import Python_DHT # Thermosensor am Raspi
import lcddriver # Anzeige der Werte an einem LCD
import time
import requests # HTTP Koomunikation
from btlewrap.gatttool import GatttoolBackend # Bluetooth Kommunikation
from miflora_poller import (
MiFloraPoller, MI_CONDUCTIVITY, MI_MOISTURE, MI_LIGHT, MI_TEMPERATURE,
MI_BATTERY,
) # MiFlora Abfrage
from RPi import GPIO # ein paar LED's schaden auch nicht
from datetime import datetime
from shutil import get_terminal_size # für die Anzeige auf der Konsole
import smbus # für weitere Analog sensoren an einem MCP3008 DA Wandler
import paho.mqtt.client as mqtt # für die Abfrage des Mosquitto Servers
from queue import Queue # dto
import json # Entschlüsselung der luftdaten werte
Code: Alles auswählen
# IP Relais und Templates
IP_RELAY_GET_TEMPLATE = ('http://{}/{}{}')
IP_RELAY_01 = '192.168.10.53'
RELAY_PW ="pw=xxx"
ON = "ON"
OFF = "OFF"
# per WiFi verbundene Relais ansteuern
def ip_relay_switch(ip, pw, function):
try:
responses = requests.get(IP_RELAY_GET_TEMPLATE.format(ip, pw, function))
if responses.status_code == 200 :
status = "OK " + function
else :
status = "Failure"
except:
status = "Failure"
return(status)
Code: Alles auswählen
# Homematic Adresse
HOMEMATIC_SEND_TEMPLATE = ('http://192.168.10.10:8181/egal.exe?x=dom.GetObject("{}").State({})')
HOMEMATIC_GET_TEMPLATE = ('http://192.168.10.10/config/xmlapi/state.cgi?datapoint_id={}')
# Raspberry -> CCU senden
def send_homematic(sensors,values): # Systemvariablen auf Homematic schreiben
responses = [
requests.get(HOMEMATIC_SEND_TEMPLATE.format(homematic_name, value))
for (_, homematic_name), value in zip(sensors, values)
]
return(responses)
# von CCU empfangen
def get_homematic(datapoint): # Systemvariablen von Homematic holen
responses = requests.get(HOMEMATIC_GET_TEMPLATE.format(datapoint))
result = responses.text # Rückgabe von CCU
# responses.text = <?xml version="1.0" encoding="ISO-8859-1" ?><state><datapoint ise_id='18719' value='21.600000'/></state
value= result[result.find('value') +7 : result.find('/') -1] # suche nach value +7 zeichen und / -1 Zeichen
return(value)
#----------------------------------#
# Werte an Homematic senden
responses = send_homematic(sensors, values) # sensors: Liste mit Namen der Systemvariablen, values mit Werten
# responses 200 = alles ok, sonst fehler
# Werte von Homematic holen (Wind, Regen usw.)
datapoint = "2100" # Regen_heute
# id der SysVar aus http://meine.ccu.ip/config/xmlapi/sysvarlist.cgi
rain_today = int(float(get_homematic(datapoint))) # Rückgabe als String (True, False, Text oder Zahl im float format
Code: Alles auswählen
#Sensor Adressen
MIFLORA_MAC_ADDRESS_01 = 'C4:7C:8D:6A:5A:57'
def get_bluetooth_sensors(mac_adresse):
# Bluetooth sensor(en) einlesen
# Liste mit NAmen der CCU3 Systemvariablen
sensors = [
(MI_TEMPERATURE, 'MiaFlora_Temp'),
(MI_MOISTURE, 'MiaFlora_Humidity'),
(MI_CONDUCTIVITY, 'MiaFlora_Conductivity'),
(MI_LIGHT, 'MiaFlora_Brightness'),
(MI_BATTERY, 'MiaFlora_Battery'),
]
poller = MiFloraPoller(mac_adresse, GatttoolBackend)
values = [poller.parameter_value(parameter) for parameter, _ in sensors]
return(values, sensors, mac_adresse)
#------------------------------------------------------
# Mi Flora Abfrage
try:
values = list()
sensors = list()
values, sensors, sender_id = get_bluetooth_sensors(MIFLORA_MAC_ADDRESS_01)
except:
pass
Code: Alles auswählen
def save_msql(values):
try :
# Datenbank öffnen
db = mc.connect(host="192.168.10.111", port="3307", user="Raspi", password="xxxxxx", database="sensor-log")
db.autocommit = False
cursor = db.cursor()
# Datenbank schreiben mit den entsprechenden Feldern
cursor.execute(
'INSERT INTO BlueTooth_01(datum, temp, humidity, conductivity,'
' brightness, battery, sender_id, board_temperature, board_humidity, particle, air_pressure, rain_today, sun_today,'
' V_01,V_02, V_03, V_04, V_05, V_06, V_07, V_08 ,VP_01,VP_02, VP_03, VP_04, VP_05, VP_06, VP_07, VP_08,'
' wifi_01_a_temp, wifi_01_a_humidity, wifi_01_s_moisture, wifi_02_a_temp, wifi_02_a_humidity, wifi_02_s_moisture )'
' Values (NOW(), %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,'
'%s, %s, %s, %s, %s, %s, %s, %s,%s, %s, %s)',
values,
)
db.commit()
except :
db.rollback()
finally :
# und weider schließen
cursor.close()
db.close()
#------------------------------------------------------------
# Speichern in MYSQL
# erst alle Wertesammeln und in eine Liste übertragen
values = values + ([sender_id] + [board_temperature] +[board_humidity] + [particle] + [baro_pressure] +
[rain_today] + [sunlight_today] + voltages + percentages + esp_01_values + esp_02_values)
# dann über die Funktion speichern
save_msql(values)