diff options
-rwxr-xr-x | deploy.sh | 4 | ||||
-rwxr-xr-x | make_photo | 4 | ||||
-rw-r--r-- | plot_new.py | 128 | ||||
-rwxr-xr-x | read_dht11.py | 64 |
4 files changed, 196 insertions, 4 deletions
@@ -1,4 +1,4 @@ #!/bin/bash set -e -scp water_the_plant create_backup make_photo *.py index.html history.html *.png robert@waterpi: -ssh robert@waterpi -C 'sudo cp index.html history.html *.png /var/www/html; sudo chown www-data:www-data /var/www/html/*.html /var/www/html/*.png; sudo cp create_backup make_photo plot.py read_temperature.py water_the_plant /usr/local/bin' +scp plot_new.py read_dht11.py water_the_plant create_backup make_photo index.html history.html *.png robert@waterpi: +ssh robert@waterpi -C 'sudo cp index.html history.html *.png /var/www/html; sudo chown www-data:www-data /var/www/html/*.html /var/www/html/*.png; sudo cp plot_new.py read_dht11.py create_backup make_photo plot.py read_temperature.py water_the_plant /usr/local/bin' @@ -8,6 +8,6 @@ rpicam-still -o $image #add date string convert $image -resize 1024x768 -gravity SouthEast -font DejaVu-Sans -pointsize 50 -stroke black -undercolor black -fill "rgba(255,255,255,0.5)" -annotate +30+30 "$(date +\\'%Y-%m-%d %H:%M\')" $image #read cpu temp -read_temperature.py +read_dht11.py #plot cpu temp -plot.py $image $image +plot_new.py $image $image diff --git a/plot_new.py b/plot_new.py new file mode 100644 index 0000000..4a6ee16 --- /dev/null +++ b/plot_new.py @@ -0,0 +1,128 @@ +#!/usr/bin/python3 +import sys +import sqlite3 +import matplotlib.pyplot as plt +import numpy as np +from datetime import datetime, timedelta +import matplotlib.dates as mdates +from PIL import Image + +# Funktion zum Lesen von Temperatur-, Luftfeuchtigkeits- und Zeitstempeldaten aus der SQLite-Datenbank +def read_data_from_db(db_name): + try: + conn = sqlite3.connect(db_name) + cursor = conn.cursor() + cursor.execute("SELECT timestamp, temperature, humidity FROM sensor_data") + data = cursor.fetchall() + conn.close() + return data + except sqlite3.Error as e: + print(f"Fehler beim Lesen aus der Datenbank: {e}") + return [] + +# Funktion zum Erstellen eines Diagramms für Temperatur und Luftfeuchtigkeit (800x200 Pixel) +def create_temperature_humidity_plot(records, output_filename): + if not records: + print("Keine Daten gefunden.") + return + + # Aktuelle Zeit und Filterzeitraum (letzte 24 Stunden) + now = datetime.now() + last_24_hours = now - timedelta(hours=24) + + # Filtern der Datensätze nach den letzten 24 Stunden + filtered_records = [ + (datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S"), temperature, humidity) + for timestamp, temperature, humidity in records + if datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S") >= last_24_hours + ] + if not filtered_records: + print("Keine Daten in den letzten 24 Stunden gefunden.") + return + + # Extrahieren von Zeitstempeln, Temperaturen und Luftfeuchtigkeit + times = [timestamp for timestamp, _, _ in filtered_records] + temperatures = [temperature for _, temperature, _ in filtered_records] + humidities = [humidity for _, _, humidity in filtered_records] + + # Grenzen für die y-Achsen basierend auf den Daten + min_temp = np.floor(min(temperatures) / 5) * 5 + max_temp = np.ceil(max(temperatures) / 5) * 5 + min_humidity = np.floor(min(humidities) / 10) * 10 + max_humidity = np.ceil(max(humidities) / 10) * 10 + + # Diagramm zeichnen (800x200 Pixel) + fig, ax1 = plt.subplots(figsize=(8, 2), dpi=100) + + # Temperaturplot (linke Y-Achse) + ax1.set_xlabel('Uhrzeit', color='white') + ax1.set_ylabel('Temperatur (°C)', color='tab:red') + ax1.plot(times, temperatures, color='tab:red', label='Temperatur') + ax1.tick_params(axis='y', labelcolor='tab:red') + ax1.tick_params(axis='x', colors='white') + ax1.set_ylim(min_temp, max_temp) + ax1.spines['top'].set_color('white') + ax1.spines['bottom'].set_color('white') + ax1.spines['left'].set_color('white') + ax1.spines['right'].set_color('white') + + # Luftfeuchtigkeitsplot (rechte Y-Achse) + ax2 = ax1.twinx() + ax2.set_ylabel('Luftfeuchtigkeit (%)', color='tab:blue') + ax2.plot(times, humidities, color='tab:blue', label='Luftfeuchtigkeit') + ax2.tick_params(axis='y', labelcolor='tab:blue') + ax2.set_ylim(min_humidity, max_humidity) + ax2.spines['top'].set_color('white') + ax2.spines['bottom'].set_color('white') + ax2.spines['left'].set_color('white') + ax2.spines['right'].set_color('white') + + # X-Achse formatieren + ax1.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) + fig.tight_layout() + + # Diagramm speichern (transparent) + plt.savefig(output_filename, transparent=True, bbox_inches='tight') + plt.close() + +# Funktion zum Überlagern des Diagramms auf das Basisbild +def overlay_plot_on_image(base_image_path, plot_image_path, output_image_path): + try: + base_image = Image.open(base_image_path) + plot_image = Image.open(plot_image_path).resize((800, 200)) # Größe des Plots anpassen + + # Überlagern des Diagramms auf das Basisbild (mit Transparenz) + base_image.paste(plot_image, (112, 0), plot_image) # Zentrieren: (1024 - 800) / 2 = 112 + + # Kombiniertes Bild speichern + base_image.save(output_image_path) + print(f"Kombiniertes Bild gespeichert als {output_image_path}") + except Exception as e: + print(f"Fehler beim Überlagern des Diagramms: {e}") + +# Hauptfunktion +def main(): + if len(sys.argv) != 3: + print("Bitte geben Sie den Pfad zum Basisbild und den Pfad zum Ausgabebild an.") + sys.exit(1) + + base_image_path = sys.argv[1] + output_image_path = sys.argv[2] + + db_name = "/var/www/html/sensor_data.db" + + # Daten aus der Datenbank lesen + records = read_data_from_db(db_name) + + # Temporäre Datei für das transparente Temperatur- und Feuchtigkeitsdiagramm + plot_filename = "temperature_humidity_plot.png" + + # Diagramm erstellen und speichern + create_temperature_humidity_plot(records, plot_filename) + + # Basisbild laden und Diagramm überlagern + overlay_plot_on_image(base_image_path, plot_filename, output_image_path) + +if __name__ == "__main__": + main() + diff --git a/read_dht11.py b/read_dht11.py new file mode 100755 index 0000000..524fdba --- /dev/null +++ b/read_dht11.py @@ -0,0 +1,64 @@ +#!/usr/bin/python3 +import sqlite3 +from datetime import datetime +import adafruit_dht +import board + +# GPIO-Pin für den DHT11-Sensor +DHT_SENSOR = adafruit_dht.DHT11(board.D26) + +# Funktion zur Initialisierung der SQLite-Datenbank +def init_db(db_name): + conn = sqlite3.connect(db_name) + cursor = conn.cursor() + # Erstellt eine Tabelle, falls sie noch nicht existiert + cursor.execute(""" + CREATE TABLE IF NOT EXISTS sensor_data ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + timestamp TEXT NOT NULL, + temperature REAL NOT NULL, + humidity REAL NOT NULL + ) + """) + conn.commit() + return conn + +# Funktion zum Einfügen von Daten in die Datenbank +def insert_data(conn, timestamp, temperature, humidity): + cursor = conn.cursor() + cursor.execute(""" + INSERT INTO sensor_data (timestamp, temperature, humidity) + VALUES (?, ?, ?) + """, (timestamp, temperature, humidity)) + conn.commit() + +# Funktion zum Lesen von Temperatur und Luftfeuchtigkeit vom DHT11-Sensor +def read_dht11(): + humidity = DHT_SENSOR.humidity + temperature = DHT_SENSOR.temperature + if humidity is not None and temperature is not None: + return round(temperature, 1), round(humidity, 1) + else: + print("Fehler beim Lesen des Sensors. Versuche erneut...") + return None, None + +# Hauptfunktion +def main(): + db_name = "/var/www/html/sensor_data.db" + conn = init_db(db_name) + + # Ruft Temperatur und Luftfeuchtigkeit ab + temperature, humidity = read_dht11() + + if temperature is not None and humidity is not None: + # Holt das aktuelle Datum und die Uhrzeit + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + # Speichert die Daten in der Datenbank + insert_data(conn, timestamp, temperature, humidity) + print(f"Gespeichert: {timestamp} - Temperatur: {temperature}°C - Luftfeuchtigkeit: {humidity}%") + + conn.close() + +if __name__ == "__main__": + main() + |