In dem Wetterstationskit hast du gelernt, wie du verschiedene Wetterdaten auslesen kannst und auf einem Display anzeigen lassen kannst. Jetzt wollen wir uns ansehen, wie du die Wetterdaten in einer Tabelle abspeichern lassen kannst und so später einen Verlauf hast, wann wie das Wetter war.

Wie genau wir wir die Daten von den Sensoren bekommen, haben wir ja schon in dem Wetterstations-Kit beschrieben. Darauf gehen wir also nicht mehr so genau drauf ein. Du kannst das aber natürlich einfach hier nachlesen: https://codingworld.io/wetter3-wetterstation-ende/

Gleich gucken wir uns genauer an, wie wir die Daten in einem CSV speichern können. CSV steht für „Comma Separated Value“, das heißt so viel wie Kommergetrennte Daten. Eine CSV-Datei ist also nicht viel mehr als eine Textdatei, in der Daten durch Komma und Absatz getrennt tabellarisch gespeichert werden können. Du kannst CSV-Datein auch z.B. in Programmen wie LibreOffice Calc oder Excell öffnen. Die Spalten sind dabei also mit Komma getrennt und die Reihen mit Absätzen.

Jetzt gucken wir uns an, wie wir mit Python Daten in einer solchen CSV-Datei speichern können.

with open('wetterdaten.csv', 'a', newline='') as csvfile:
  header = ['Zeit', 'Temperatur Drinnen', 'Luftfeuchtigkeit', 'Temperatur Draußen']
  writer = csv.writer(csvfile, header)

Hier öffnen wir die Datei wetterdaten.csv, legen die Spaltenbeschriftungen fest und erstellen ein Object writer mit dem wir Daten zu der csv-Datei hinzufügen können.

Jetzt fragen wir ab, ob bereits etwas in der Datei steht; wenn nicht, dann schreiben wir die Header, damit wir die Daten später auch zuordnen können wenn wir sie öffnen:

 if csvfile.tell() == 0:
    writer.writeheader()

Nun holen wir uns die aktuellen Messwerte von den Sensoren:

  indoor = sensor.read()
  while not indoor.is_valid():
    indoor = sensor.read()
  outdoor = get_outdoor()

Jetzt müssen wir nur noch die Daten in die CSV-Datei speichern:

  row = {
    header[0]: datetime.datetime.utcnow().isoformat(),
    header[1]: indoor.temperature,
    header[2]: indoor.humidity,
    header[3]: outdoor
  }
  writer.writerow(row)
  print(row)

Dabei erstellen wir zunächst ein Dictionary mit den gleichen Headern, die wir zu Beginn gesetzt haben und übergeben dabei jeweils die Werte der Sensoren.
Mit der Methode writer.writerow(row) schreiben wir die Daten dann in die Datei. Zum Schluss lassen wir uns noch das Dictionary in der Konsole anzeigen.

Wenn du das alles gemacht hast, sollte dein fertiges Skript so aussehen:

import RPi.GPIO as GPIO
import dht11
import csv
import datetime

GPIO.setmode(GPIO.BCM)
sensor = dht11.DHT11(pin=17)

w1 = "/sys/bus/w1/devices/28-01204b8ac86e/w1_slave"

def get_outdoor():
  outdoor = open(w1).readlines()
  a = (outdoor[1].find("=")) + 1
  return (int(outdoor[1][a:-1]) / 1000)

with open('temp.csv', 'a', newline='') as csvfile:
  header = ['Zeit', 'Temperatur Drinnen', 'Luftfeuchtigkeit', 'Temperatur Draußen']
  writer = csv.writer(csvfile, header)

  if csvfile.tell() == 0:
    writer.writeheader()

  indoor = sensor.read()
  while not indoor.is_valid():
    indoor = sensor.read()
  outdoor = get_outdoor()

  row = {
    header[0]: datetime.datetime.utcnow().isoformat(),
    header[1]: indoor.temperature,
    header[2]: indoor.humidity,
    header[3]: outdoor
  }
  writer.writerow(row)
  print(row)