Hauptinhalt

Diese Seite wurde mithilfe maschineller Übersetzung übersetzt. Klicken Sie hier, um das englische Original zu sehen.

Massenaktualisierung mit einem Raspberry Pi-Board

Dieses Beispiel zeigt, wie Sie Daten mithilfe einer per WLAN verbundenen Raspberry Pi-Platine mit Python 2.7 erfassen. Sie können alle 15 Sekunden kontinuierlich die CPU-Temperatur und die CPU-Auslastung erfassen und alle 2 Minuten einen ThingSpeak-Kanal 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 Bulk-Updates können Sie den Stromverbrauch Ihrer Geräte reduzieren. Da die Raspberry Pi-Platine nicht mit einer Echtzeituhr ausgestattet ist, können Sie den relativen Zeitstempel für Massenaktualisierungsnachrichten verwenden.

Aufstellen

Erstellen Sie einen Kanal, wie unter Daten in einem neuen Kanal sammeln gezeigt.

Code

1) Importieren Sie die erforderlichen 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 Ihren ThingSpeak-Schreib-API-Schlüssel und die Kanal-ID-Einstellungen zusammen mit den 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 druckt. Der Antwortcode 202 zeigt an, dass der Server die Anfrage akzeptiert hat und 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 alle 15 Sekunden kontinuierlich 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 die Funktion updatesJson alle 15 Sekunden kontinuierlich 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()

Siehe auch

Themen