Actualización masiva usando una placa Raspberry Pi
Este ejemplo muestra cómo recopilar datos utilizando una placa Raspberry Pi conectada a Wi-Fi que ejecuta Python 2.7. Puede recopilar continuamente la temperatura y la utilización de la CPU cada 15 segundos y actualizar de forma masiva un canal ThingSpeak cada 2 minutos. Este ejemplo utiliza la API Bulk-Write JSON Data
para recopilar datos en lotes y enviarlos a los canales de ThingSpeak. Al utilizar la actualización masiva, puede reducir el consumo de energía de sus dispositivos. Dado que la placa Raspberry Pi no viene con un reloj en tiempo real, puede usar la marca de tiempo relativa para mensajes de actualización masiva.
Configuración
Cree un canal como se muestra en Collect Data in a New Channel.
Código
1) Importe las bibliotecas necesarias para el script.
import json import time import os import psutil import requests
2) Defina variables globales que realicen un seguimiento de la última hora de conexión y de la última actualización. Defina intervalos de tiempo para actualizar los datos y publicarlos en 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) Defina su clave API de escritura de ThingSpeak y la configuración de ID de canal, junto con la configuración del servidor de 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) Definir la función httpRequest
que envía datos a ThingSpeak e imprime el código de respuesta del servidor. El código de respuesta 202
indica que el servidor ha aceptado la solicitud y la procesará.
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) Defina la función getData
que devuelve la temperatura de la CPU en grados Celsius junto con la utilización de la CPU como porcentaje.
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) Defina la función updatesJson
para actualizar continuamente el búfer de mensajes cada 15 segundos.
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) Ejecute un bucle infinito para llamar continuamente a la función updatesJson
cada 15 segundos.
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()
Ejemplos relacionados
- Actualización masiva usando un Arduino o un ESP8266
- Actualización masiva de un canal ThingSpeak utilizando un tablero de fotones de partículas