1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
#!/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, moisture 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, moisture)
for timestamp, temperature, humidity, moisture 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, Luftfeuchtigkeit und Feuchtigkeit
times = [timestamp for timestamp, _, _, _ in filtered_records]
temperatures = [temperature for _, temperature, _, _ in filtered_records]
humidities = [humidity for _, _, humidity, _ in filtered_records]
moistures = [moisture for _, _, _, moisture 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
min_moisture = np.floor(min(moistures) / 10) * 10
max_moisture = np.ceil(max(moistures) / 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.tick_params(axis='x', colors='white')
ax2.spines['top'].set_color('white')
ax2.spines['bottom'].set_color('white')
ax2.spines['left'].set_color('white')
ax2.spines['right'].set_color('white')
# Feuchtigkeitsplot (dritte Y-Achse)
ax3 = ax1.twinx()
ax3.spines['right'].set_position(('outward', 60)) # Platz für die dritte Achse schaffen
ax3.set_ylabel('Feuchtigkeit (16-32k)', color='tab:green')
ax3.plot(times, moistures, color='tab:green', label='Feuchtigkeit')
ax3.tick_params(axis='y', labelcolor='tab:green')
ax3.set_ylim(min_moisture, max_moisture)
ax3.tick_params(axis='x', colors='white')
ax3.spines['top'].set_color('white')
ax3.spines['bottom'].set_color('white')
ax3.spines['left'].set_color('white')
ax3.spines['right'].set_color('white')
# X-Achse formatieren
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
# Layout anpassen und Diagramm speichern
fig.tight_layout()
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()
|