Main Content

Diese Seite wurde mithilfe maschineller Übersetzung übersetzt. Klicken Sie hier, um die neueste Version auf Englisch zu sehen.

Massenaktualisierung mit einem Raspberry Pi-Board

Dieses Beispiel zeigt, wie Sie Daten mit einem über WLAN verbundenen Raspberry Pi-Board sammeln, auf dem Python 2.7 ausgeführt wird. Sie können die CPU-Temperatur und CPU-Auslastung kontinuierlich alle 15 Sekunden erfassen und einen ThingSpeak Kanal alle 2 Minuten massenhaft aktualisieren. In diesem Beispiel wird die Bulk-Write JSON Data- API verwendet, um Daten als Stapel zu sammeln und an ThingSpeak Kanäle zu senden. Durch die Verwendung von Massenaktualisierungen können Sie den Stromverbrauch Ihrer Geräte reduzieren. Da das Raspberry Pi-Board nicht über eine Echtzeituhr verfügt, können Sie den relativen Zeitstempel für Massenaktualisierungsmeldungen verwenden.

Aufstellen

Erstellen Sie einen Kanal wie in Collect Data in a New Channel gezeigt.

Code

1) Importieren Sie die notwendigen Bibliotheken für das Skript.

import json
import time
import os
import psutil
import requests

2) Definieren Sie globale Variablen, die die letzte Verbindungszeit und die letzte Aktualisierungszeit verfolgen. Definieren Sie Zeitintervalle zum Aktualisieren der Daten und veröffentlichen Sie die Daten in ThingSpeak.

last_connection_time = time.time() # Track the last connection time
last_update_time = time.time()     # Track the last update time
posting_interval = 120             # Post data once every 2 minutes
update_interval = 15               # Update once every 15 seconds

3) Definieren Sie Ihre ThingSpeak Schreib-API-Schlüssel- und Kanal-ID-Einstellungen sowie die ThingSpeak Servereinstellungen.

write_api_key = "YOUR-CHANNEL-WRITEAPIKEY" # Replace YOUR-CHANNEL-write_api_key with your channel write API key
channel_ID = "YOUR-CHANNELID"              # Replace YOUR-channel_ID with your channel ID
url = "https://api.thingspeak.com/channels/" + channel_ID + "/bulk_update.json" # ThingSpeak server settings
message_buffer = []

4) Definieren Sie die Funktion httpRequest , die Daten an ThingSpeak sendet und den Antwortcode vom Server ausgibt. Der Antwortcode 202 zeigt an, dass der Server die Anfrage angenommen hat und sie verarbeiten wird.

def httpRequest():
    # Function to send the POST request to ThingSpeak channel for bulk update.
        global message_buffer
        bulk_data = json.dumps({'write_api_key':write_api_key,'updates':message_buffer}) # Format the json data buffer
        request_headers = {"User-Agent":"mw.doc.bulk-update (Raspberry Pi)","Content-Type":"application/json","Content-Length":str(len(bulk_data))}
    # Make the request to ThingSpeak
        try:
            print(request_headers)
            response = requests.post(url,headers=request_headers,data=bulk_data)
            print (response) # A 202 indicates that the server has accepted the request
        except e:
            print(e.code) # Print the error code
        message_buffer = [] # Reinitialize the message buffer
        global last_connection_time
        last_connection_time = time.time() # Update the connection time

5) Definieren Sie die Funktion getData , die die CPU-Temperatur in Celsius zusammen mit der CPU-Auslastung als Prozentsatz zurückgibt.

def getData():
    # Function that returns the CPU temperature and percentage of CPU utilization
        cmd = '/opt/vc/bin/vcgencmd measure_temp'
        process = os.popen(cmd).readline().strip()
        cpu_temp = process.split('=')[1].split("'")[0]
        cpu_usage = psutil.cpu_percent(interval=2)
        return cpu_temp,cpu_usage

6) Definieren Sie die Funktion updatesJson , um den Nachrichtenpuffer kontinuierlich alle 15 Sekunden zu aktualisieren.

def updatesJson():
    # Function to update the message buffer every 15 seconds with data. 
    # And then call the httpRequest function every 2 minutes. 
    # This examples uses the relative timestamp as it uses the "delta_t" parameter.
    # If your device has a real-time clock, you can also provide the absolute timestamp 
    # using the "created_at" parameter.

        global last_update_time
        message = {}
        message['delta_t'] = int(round(time.time() - last_update_time))
        Temp,Usage = getData()
        message['field1'] = Temp
        message['field2'] = Usage
        global message_buffer
        message_buffer.append(message)
    # If posting interval time has crossed 2 minutes update the ThingSpeak channel with your data
        if time.time() - last_connection_time >= posting_interval:
                httpRequest()
                last_update_time = time.time()

7) Führen Sie eine Endlosschleife aus, um alle 15 Sekunden kontinuierlich die Funktion updatesJson aufzurufen.

if __name__ == "__main__":  # To ensure that this is run directly and does not run when imported
        while True:
                # If update interval time has crossed 15 seconds update the message buffer with data
            if time.time() - last_update_time >= update_interval:
                updatesJson()

Verwandte Beispiele

Mehr über