Aggiornamento in blocco tramite una scheda Raspberry Pi
Questo esempio mostra come raccogliere dati utilizzando una scheda Raspberry Pi connessa tramite Wi-Fi che esegue Python 2.7. È possibile raccogliere continuamente la temperatura e l'utilizzo della CPU ogni 15 secondi ed eseguire l'aggiornamento in blocco di un canale ThingSpeak ogni 2 minuti. Questo esempio utilizza l'API Bulk-Write JSON Data per raccogliere dati in batch e inviarli ai canali ThingSpeak. Utilizzando l'aggiornamento in blocco, puoi ridurre il consumo energetico dei tuoi dispositivi. Poiché la scheda Raspberry Pi non è dotata di un orologio in tempo reale, è possibile utilizzare il timestamp relativo per i messaggi di aggiornamento in blocco.
Impostare
Crea un canale come mostrato in Raccogli dati in un nuovo canale.
Codice
1) Importare le librerie necessarie per lo script.
import json import time import os import psutil import requests
2) Definire variabili globali che tracciano l'ora dell'ultima connessione e l'ora dell'ultimo aggiornamento. Definisci intervalli di tempo per aggiornare i dati e post su 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) Definisci le impostazioni della chiave API di scrittura ThingSpeak e dell'ID canale, insieme alle impostazioni del server ThingSpeak.
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) Definire la funzione httpRequest che invia dati a ThingSpeak e stampa il codice di risposta dal server. Il codice di risposta 202 indica che il server ha accettato la richiesta e la elaborerà.
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) Definire la funzione getData che restituisce la temperatura della CPU in gradi Celsius insieme all'utilizzo della CPU in percentuale.
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) Definire la funzione updatesJson per aggiornare continuamente il buffer dei messaggi ogni 15 secondi.
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) Eseguire un ciclo infinito per chiamare continuamente la funzione updatesJson ogni 15 secondi.
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()