Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la versión original en inglés.

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

Más acerca de