[PYTHON] Messen und vergleichen Sie Temperaturen mit Raspberry Pi und generieren Sie automatisch Diagramme

Dies ist Qiitas 4. Beitrag. Unerfahrene in der IT-Branche und die Definition von Wörtern können falsch sein. Wenn Sie eine Nachricht haben, würde ich mich freuen, wenn Sie mir einen Rat geben könnten.

Mein Haus ist ein 25 Jahre altes Holzhaus, und der erste Stock ist im Winter sehr kalt und der zweite Stock ist im Sommer mäßig heiß. Wahrscheinlich, weil es sich um ein Holzgebäude handelt, habe ich auch das Gefühl, dass sich die Temperatur im Haus langsam ändert. Zum Beispiel ist es im Juni von 9 bis 11 Uhr kühl, aber das Innere des Hauses wird gegen 19:00 Uhr abends feucht.

Daher wollte ich Temperaturdaten zu verschiedenen Jahreszeiten und an verschiedenen Orten messen, also versuchte ich, Temperaturdaten zu erfassen und die Daten mit Rasberry Pi zu verarbeiten.

Einführung

Ich wollte unbedingt die Temperaturen an mehreren Standorten gleichzeitig messen und vergleichen, aber aus Budgetgründen konnte ich nur einen Rasberry Pi erhalten. Deshalb habe ich beschlossen, die Messdaten mit den Daten der Meteorologischen Agentur in der Nähe meines Hauses zu vergleichen. Hat.

  1. Messen Sie die Temperatur alle 60 Minuten mit einem Temperatursensor namens DHT11
  2. Kratzen der meteorologischen Daten der Meteorologischen Agentur mit schöner Suppe
  3. Erstellen Sie mit matplotlib ein Diagramm Das Wir.

Scraping ist das Extrahieren spezifischer Informationen von einer Website. Klicken Sie hier für Details (https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B9%E3%82%AF%E3 Bitte überprüfen Sie% 83% AC% E3% 82% A4% E3% 83% 94% E3% 83% B3% E3% 82% B0).

1. Messen Sie die Temperatur alle 60 Minuten mit einem Temperatursensor namens DHT11

1-1. Erstellen Sie eine Schaltung und installieren Sie ein Beispielskript

Messen Sie Temperatur und Luftfeuchtigkeit mit Raspberry Pi und DHT11 und Erstellen Sie einen Temperatur- und Feuchtigkeitslogger mit Raspberry Zero und DHT11 / items / 2737749d4532150026ee) Ich habe eine Schaltung erstellt und ein Beispielskript mit Bezug auf erstellt.

Ich habe Raspberry Pi 3B + verwendet und die Schaltung sieht so aus. IMG_20200617_094254.jpg

Für jede Funktion des Beispielskripts [Detaillierte Beschreibung des Temperatur- und Feuchtigkeitssensors (DHT11)](https://www.souichi.club/technology/dht11-datasheet/#parsedatapulluplengths%E3%83%A1%E3%82%BD Ich verstand in% E3% 83% 83% E3% 83% 89).

1-2. Erstellen Sie Code zum Speichern von Daten in CSV mithilfe eines Beispielskripts

Da die Daten der Meteorologischen Agentur abgekratzt werden, muss die Zeit der zu verkratzenden Daten mit den vom Sensor erfassten Daten abgeglichen werden.

Da die Fehlerbehandlung durch collect_input und parse_data_pull_up_lengths des Beispielskripts durchgeführt wird, wurde die example.py des Beispielskripts neu geschrieben, damit die gemessenen Daten in der CSV-Datei gespeichert werden können. Es scheint auch, dass die Funktion is_varlid () ausgeführt wird, um zu überprüfen, ob sie ordnungsgemäß abgerufen wurde. Es gibt jedoch einige Fälle, in denen diese Funktion einen Fehler zurückgibt.

Als ich die Anzahl der Fehler mit der Zählvariablen erhielt, ・ Erfolg auf einmal ... 70% ・ Zum 17. Mal erfolgreich ... 15% ・ Zum 33. Mal erfolgreich ... 10% ・ Mehr ... 5% (Es tut mir leid. Ich habe keine Statistiken. Es ist nur subjektiv.) Wenn es fehlschlägt, scheint es in einer Reihe von 2 nach der n-ten Potenz fehlgeschlagen zu sein. Da die Daten diesmal alle 60 Minuten erfasst werden, wird "die Anzahl der Versuche, die anhand der Anzahl der Fehler in der Vergangenheit berücksichtigt werden können" auf 2 plus 10 (= 1029) festgelegt.

** Klicken Sie auf den gesamten Code, um ihn zu erweitern **
import RPi.GPIO as GPIO
import dht11
import time
import datetime
import os
import numpy as np
import pandas as pd

def add_data(filepath):
    #Überprüfen Sie, ob die CSV-Datei im angegebenen Pfad vorhanden ist
    if os.path.isfile(filepath):
        #Lesen Sie, ob es existiert
        df = pd.read_csv(filepath, index_col=0)
    else:
        #Neu erstellen, wenn es nicht vorhanden ist
        df = pd.DataFrame([], columns=["year","month","day","hour","sensor_temprature", \
                                       "scraping_temprature","read_try"])
    #Erstellen Sie eine Variable, um die Anzahl der Versuche zu zählen
    count=0
    # is_valid()Lesen Sie die Temperaturdaten bis zu 1029 Mal, bis die Funktion True ist
    while count<=1029:
        result = instance.read()
        count+=1
        if result.is_valid():
           #Speichern Sie Jahr, Monat und Tag in DataFrame für das Web-Scraping
            year = datetime.datetime.now().year
            month = datetime.datetime.now().month
            day = datetime.datetime.now().day
            hour = datetime.datetime.now().hour
            temp = result.temperature
            hum = result.humidity
            data=[year,month,day,hour,temp,hum,"",count]
            s = pd.Series(data, index=df.columns)
            df = df.append(s, ignore_index=True)
            break
    return df

# initialize GPIO
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)

instance = dht11.DHT11(pin=14)

filepath = '/home/pi/Desktop/DHT11_Python/data.csv'
df=add_data(filepath)
df.to_csv(filepath)
print(df)

Stellen Sie den Temperatursensor so ein, dass er alle 1-3,60 Minuten startet

Ich habe es so eingestellt, dass es pünktlich startet, indem ich auf Programme mit systemd auf Raspberry Pi automatisch ausführen verweise. Außerdem werden Arch-Handbuchseiten (SYSTEMD.TIME (7)) unten gemäß "stündlich" festgelegt tun.

2. Kratzen der meteorologischen Daten der Meteorologischen Agentur mit schöner Suppe

Ich habe den Code geschrieben, damit ich die Daten der Meteorological Agency unter Bezugnahme auf Scraping vergangener Wetterdaten mit Python kratzen kann. Der zu beachtende Punkt ist, dass sich die Beschreibungsmethode je nach Version der schönen Suppe und des Raspeltörtchens leicht ändert.

Der Unterschied zwischen der Referenz-URL und der Seite, auf die dieses Mal abgekratzt werden soll, beträgt

--Während die Referenzlink-Seite zwei Tabellen enthält, enthält die Zielseite diesmal nur eine Tabelle.
Daher muss der Code neu geschrieben werden, sofern Tabelle 1 nicht vorhanden ist.

Screenshot dieses Scraping-Ziels 対象の画像.png

Screenshots der zu kratzenden Links リンクの画像.png

Andere Änderungen beim Schreiben von Code sind

** Klicken Sie auf den gesamten Code, um ihn zu erweitern **
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import requests
import datetime
import os
import sys

#Durch Ändern der Vor- und Blockcodes wird die Region geändert.
# m_prec=44 repräsentiert Tokio, m_block=1133 repräsentiert Fuchu.
def scraping_weather(m_year,m_month,m_day,m_prec=44,m_block=1133):
    url ="https://www.data.jma.go.jp/obd/stats/etrn/view/hourly_a1.php?prec_no={prec}&block_no={block}&year={year}&month={month}&day={day}&view="
    url = url.format(prec=m_prec,block=m_block,year=m_year,month=m_month,day=m_day)
    html=requests.get(url)
    soup = BeautifulSoup(html.content, "html.parser")

    # id='tablefix2'von<table>Extrakt
    table = soup.find('table', id='tablefix1')  

    #Extrahieren Sie alles in Tabelle 2
    th_all = table.find_all('th')  
    #Spaltenüberschriften manuell speichern
    table_column = ["Zeit", "Niederschlag","Temperatur", "Windgeschwindigkeit / Windrichtung(m/s)","日照Zeit間","Schnee(cm)","Windgeschwindigkeit","Windrichtung","降Schnee","積Schnee"]

    # <table>Extrahieren Sie alle trs in.
    tr_all = table.find_all('tr')  

    #Das erste tr ist bereits extrahiert, überspringen Sie es also
    tr_all = tr_all[1:]  

    #Berechnen Sie die Anzahl der Zeilen und Spalten und erstellen Sie ein ndarray
    number_of_cols = len(table_column)  
    number_of_rows = len(tr_all)  
    table_data = np.zeros((number_of_rows, number_of_cols), dtype=np.float32)  

    #Speichern Sie die Daten jeder Zeile in ndarray
    for r, tr in enumerate(tr_all):  
        td_all = tr.find_all('td')  
        for c, td in enumerate(td_all):  
            try:  
                table_data[r,c] = td.string  
            except ValueError:  
                table_data[r,c] = np.nan  

    #Generieren Sie einen DataFrame der extrahierten Daten
    df = pd.DataFrame(data=table_data, columns=table_column)  
    return df

def combine_scraping_data(df):
    date_before=str(0)
    #Erkunde alle Daten
    for i in range(len(df)):
        #Überprüfen Sie, ob in der Vergangenheit Web Scraping durchgeführt wurde
        if np.isnan(df.loc[i,"scraping_temprature"]):
            year = df.loc[i,"year"]
            month = df.loc[i,"month"]
            day = df.loc[i,"day"]
            
            #Für heute gibt es keine Scraping-Daten. Überspringen Sie diese, wenn sie mit denen von heute identisch sind
            if ((day == datetime.date.today().day)&(month == datetime.date.today().month)):
                continue
            
            #Ersatzdatum als Str-Typ
            date_now = str(year)+str(month)+str(day)
            
            #Überprüfen Sie, ob sich die vorherige Zeile und das Datum geändert haben
            if date_now != date_before:
                #Wenn es sich geändert hat, kratzen Sie es und speichern Sie es im DataFrame.
                t_df =  scraping_weather(year,month,day)
                # date_Aktualisieren Sie das Datum der Vorher-Variablen
                date_before=date_now
            for j in range(len(t_df)):
                #Ordnen Sie die Kratzdaten den Sensordaten zu und ersetzen Sie die Kratztemperatur
                if df.loc[i,"hour"] == t_df.loc[j,"Zeit"]:
                    df.loc[i,"scraping_temprature"] = t_df.loc[j,"Temperatur"]
    return df


filepath = '/home/pi/Desktop/DHT11_Python/data.csv'

if os.path.isfile(filepath):
    df = pd.read_csv(filepath, index_col=0)
else:
    print("No data. This python wll be stopped.")
    sys.exit()


for i in range(len(df)):
    if df.loc[i,'hour']==0:
        df.loc[i,'hour'] =24
        df.loc[i,'day'] -=1

df = combine_scraping_data(df)

df.to_csv(filepath)
print(df['scraping_temprature'])

3. Erstellen Sie mit matplotlib ein Diagramm

Erstellen Sie mit matplotlib ein Diagramm zum Scraping von Daten und speichern Sie es in der angegebenen Datei. Das Diagramm lautet [Zeichnen Sie ein Liniendiagramm mit matplotlib](https://pythondatascience.plavox.info/matplotlib/%E6%8A%98%E3%82%8C%E7%B7%9A%E3%82%B0%E3% Es wurde unter Bezugnahme auf 83% A9% E3% 83% 95) aufgetragen.

Ich habe beschlossen, für jedes Datum einen Ordner im Ergebnisordner zu erstellen und die CSV-Datei und das Diagramm (PNG-Datei) darin zu speichern. In der Abbildung sieht es so aus.

├── creating_graph.py
└── result
    ├── 6_10
    │   ├── 6_10.csv
    │   └── 6_10.png
    └── 6_11
        ├── 6_11.csv
        └── 6_11.png

Nachdem ich das Diagramm erstellt hatte, entschied ich mich, die Zieldaten aus den Originaldaten zu löschen.

** Klicken Sie auf den gesamten Code, um ihn zu erweitern **
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os


filepath = '/home/pi/Desktop/DHT11_Python/data.csv'

#Lesen Sie die CSV-Datei mit DataFrame
if os.path.isfile(filepath):
    df = pd.read_csv(filepath, index_col=0)
else:
    print("No data. This python wll be stopped.")
    sys.exit()

#Da ein Tagesdiagramm erstellt wird, listen Sie die Monats- / Tagesdaten auf und führen Sie eine Schleife aus.
for g_month in df["month"].unique():
    for g_day in df["day"].unique():
        #Zieldaten t_Laden Sie in df
        t_df = df[(df['day']==g_day)&(df['month']==g_month)]
        #Überspringen, wenn keine Scraping-Daten vorhanden sind
        if t_df["scraping_temprature"].isnull().any():
            continue
        
        #Einen neuen Ordner erstellen
        result_filepath = '/home/pi/Desktop/DHT11_Python/dht11_creating_graph/result/{month}_{day}'
        result_filepath = result_filepath.format(month=g_month, day=g_day)
        os.makedirs(result_filepath, exist_ok=True)
        
        #Erstellen und speichern Sie den Pfad zum Speichern der CSV-Datei
        result_filename = '/{month}_{day}.csv'
        result_filename = result_filename.format(month=g_month, day=g_day)
        t_df.to_csv(result_filepath+result_filename)
        
        #Erstellen Sie einen Pfad zum Speichern des Diagramms
        result_graphname = '/{month}_{day}.png'
        result_graphname = result_graphname.format(month=g_month, day=g_day)
        
        #Erstellen Sie ein Diagramm
        x=t_df['hour']
        y1=t_df['sensor_temprature']
        y2=t_df['scraping_temprature']
        
        fig = plt.figure()
        p1 = plt.plot(x, y1, linewidth=2)
        p2 = plt.plot(x, y2, linewidth=2, linestyle="dashed")
        plt.legend((p1[0], p2[0]), ('sensor_temprature', 'scraping_temprature'), loc=2)
        plt.xlabel("hour")
        plt.ylabel("temprature")
        
        #Speichern Sie das Diagramm
        fig.savefig(result_filepath+result_graphname)
        
        #Löschen Sie die grafischen Daten aus den Originaldaten
        df = df[(df['day']!=g_day)|(df['month']!=g_month)]
        #Indizieren Sie die Originaldaten neu
        df.reset_index(inplace=True, drop=True)

#Speichern Sie die Originaldaten
df.to_csv(filepath)

Ergebnis

Es gibt viele Dinge zu sehen, aber ich konnte die Daten für den heißen Raum im 2. Stock am 14. Juni und die Daten für den Raum im 1. Stock, der am 16. Juni nicht so heiß ist, abrufen. Wenn Sie sich die Grafik unten in der Grafik im ersten Stock ansehen, ist die Raumtemperatur von 8:00 bis 18:00 Uhr niedriger als die Kratztemperatur, während in der Grafik im zweiten Stock die Raumtemperatur niedriger als die Kratztemperatur ist. Sie können sehen, dass es immer teuer ist.

Grafik des heißen Raumes im 2. Stock 6_14.png

Grafik eines Raumes im ersten Stock, der nicht so heiß ist 6_16.png

Höhepunkte

Referenzfoto IMG_20200617_094254.jpg

abschließend

Es gibt Zweifel an den Messergebnissen, aber da wir das Scraping von Temperaturdaten und die Erstellung von Diagrammen bis zu einem gewissen Grad automatisieren konnten, werden wir diese Zeit beenden. Ich wäre Ihnen dankbar, wenn Sie mich kontaktieren könnten, wenn Sie Bedenken haben!

Recommended Posts

Messen und vergleichen Sie Temperaturen mit Raspberry Pi und generieren Sie automatisch Diagramme
Messen Sie Temperatur und Luftfeuchtigkeit mit Raspberry Pi3 und visualisieren Sie mit Ambient
Himbeere + am2302 Temperatur und Luftfeuchtigkeit mit Temperatur- und Feuchtigkeitssensor messen
Holen Sie sich Temperatur und Luftfeuchtigkeit mit DHT11 und Raspberry Pi
Messen Sie die CPU-Temperatur von Raspeye mit Python
Messen Sie Temperatur, Luftfeuchtigkeit usw. mit SensorTag und senden Sie es über Raspberry Pi 3 an Ambient, um es Teil 2 grafisch darzustellen
Notieren Sie Temperatur und Luftfeuchtigkeit mit systemd auf Raspberry Pi
Herstellung eines Temperaturregelungssystems mit Himbeerkuchen und ESP32 (1)
Grafische Darstellung des Stromverbrauchs im Haushalt mit 3GPI und Raspeye
Messen Sie die SIM-Signalstärke mit Raspberry Pi
Herstellung eines Temperaturregelungssystems mit Himbeerkuchen und ESP32 (2) Herstellung eines Übertragungsgeräts
MQTT Radicon Car mit Arduino und Himbeere
GPGPU mit Raspberry Pi
DigitalSignage mit Raspberry Pi
Maschinelles Lernen mit Raspberry Pi 4 und Coral USB Accelerator
Einfaches IoT, um mit Raspeye und MESH zu beginnen
Ermitteln Sie den Tragezustand der Maske mit OpenCV und Raspberry Pi
Ubuntu 20.04 auf Himbeer-Pi 4 mit OpenCV und mit Python verwenden
Fehlerbehebung bei der Installation von OpenCV auf Raspberry Pi und der Erfassung
Simulieren Sie die Temperaturmessung mit Raspberry Pi + Flask + SQLite + Ajax
Einfache Einführung in Home Hack mit Raspberry Pi und discord.py
Mutter pflanzt mit Raspberry Pi
Erstellen Sie eine WEB-Überwachungskamera mit Raspberry Pi und OpenCV
Python-Anfänger öffnet und schließt die ineinandergreifende Kamera mit Raspberry Pi
Erstellen Sie mit Raspberry Pi + DHT11 ganz einfach einen TweetBot, der Sie über Temperatur und Luftfeuchtigkeit informiert.
Erstellen Sie LCD-Spiele (16x2) mit Raspberry Pi und Python
Ich habe versucht, Raspeye und conect + mit der Web-API zu verbinden
Ich habe meine Qiita-Post-Daten automatisch mit Raspberry Pi gesammelt und regelmäßig mit Slack benachrichtigt
Home Hack zum automatischen Kauf, wenn es mit Amazon Dash Button und Raspberry Pi billiger wird
Weihnachtsklassiker (?) Einen Weihnachtsbaum mit Raspberry Pi und Philips Hue anzünden
Benachrichtigen Sie LINE über die Körpertemperatur vom BLE-Thermometer mit Raspeltorte Nr. 2
Machen Sie ein Thermometer mit Raspberry Pi und machen Sie es im Browser Teil 4 sichtbar
Erstellen Sie einen Kanji-Kompass mit Raspberry Pi und Sense Hat
[Raspberry Pi] Schrittmotorsteuerung mit Raspberry Pi
Servomotorsteuerung mit Raspberry Pi
MQTT auf Raspberry Pi und Mac
Betriebssystem-Setup mit Raspberry Pi Imager
Probieren Sie L Chika mit Himbeerpi
Vergleichen Sie DCGAN und pix2pix mit Keras
Aufbau eines VPN-Servers mit Raspberry Pie
Versuchen Sie, 3 Servos mit Raspeye zu bewegen
Verwenden einer Webkamera mit Raspberry Pi
Erstellen Sie mit Raspberry Pi einen WLAN-Ethernet-Konverter und einen einfachen Router
Erfassen Sie den Sensorwert von Grove Pi + mit Raspberry Pi und speichern Sie ihn in Kintone
[Python + PHP] Erstellen Sie mit Raspberry Pi einen Temperatur-, Feuchtigkeits- und Druckmonitor
Rabbit MQ Nachrichtenbenachrichtigungs-App mit Growl in Python ~ mit Raspeye und Julius ~
Die Temperatur wird automatisch mit Raspberry Pi 3 gemessen und automatisch zur Anzeige auf den Server (Docker Python3 + Flasche + MySQL) hochgeladen!
Generieren Sie automatisch Objektspezifikationen mit Blue Prism
[Raspberry Pi] Fügen Sie ein Thermometer und ein Feuchtigkeitsmessgerät hinzu
Hallo Welt mit Raspberry Pi + Minecraft Pi Edition
Erstellen Sie eine Tensorflow-Umgebung mit Raspberry Pi [2020]
Vergleichen Sie rohen TensorFlow mit tf.contrib.learn und Keras
Versuchen Sie, mit Raspberry Pi nach Wakasagi zu fischen
Normal programmieren mit Node-RED-Programmierung mit Raspberry Pi 3
Verbesserter menschlicher Sensor mit Raspberry Pi
Generiere automatisch Bilder von Koala und Bär