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
- Massenaktualisierung mit einem Arduino oder einem ESP8266
- Massenaktualisierung eines ThingSpeak Kanals mit einem Particle Photon Board