Problema absurdo con Arduino Yun & Python

He perdido casi 2 días de trabajo por culpa de un fallo absurdo que me impedía ejecutar scripts de Python desde el sketch (realmente no sé cuál era el problema, aunque sí cómo solucionarlo). Tengo un Arduino Yun que se encarga de recoger datos mediante sensores y enviar estos valores a una API REST en Node JS.

Por el lado de Arduino tengo una función que se encarga de llamar al script de Python:

void uploadData(uint8_t uploadPic) {
  Process p;
  p.begin("python");
  if (uploadPic == 0) {
    p.addParameter("/mnt/sda1/arduino/server-datos.py");
  } else {
    p.addParameter("/mnt/sda1/arduino/server-pic.py");
  }
  p.run();
}

Donde, dependiendo del parámetro uploadPic (unsigned char), ejecuta un script (server-datos.py) u otro (server-pic.py). Los scripts mencionados son los siguientes:

server-datos.py

import requests
import os
import json
from datetime import datetime
 
sensorData = []
contador = 0
tempVal, lightVal, humidVal = 0, 0, 0
tempDate, lightDate, humidDate = None, None, None
 
# Creamos un fichero de texto para asegurarnos de que se ha ejecutado el script
file = open("/mnt/sda1/arduino/www/debug-data.txt", "w")
file.write("Ejecutando codigo... \n")
file.close()
 
url = 'http://url.api.rest/accion'
 
with open('/mnt/sda1/datalog.txt') as f:
    for line in f:
        jsonObj = {}
        trozos = line.split("#")
        print trozos[0] + ' --> ' + trozos[2]
        if contador <= 2:
            if trozos[0] == "temp":
                tempDate = trozos[1].strip()
                tempVal = trozos[2].strip()
            elif trozos[0] == "light":
                lightDate = trozos[1].strip()
                lightVal = trozos[2].strip()
            elif trozos[0] == "humid":
                humidDate = trozos[1].strip()
                humidVal = trozos[2].strip()
                contador += 1
        if contador > 2:
            jsonObj['dispositivoId'] = 1
            jsonObj['temp'] = tempVal
            jsonObj['light'] = lightVal
            jsonObj['humid'] = humidVal
            jsonObj['fecha'] = humidDate
            json.dumps(jsonObj)
            sensorData.append(jsonObj)
            contador = 0            
            tempVal, lightVal, humidVal = 0, 0, 0
            tempDate, lightDate, humidDate = None, None, None
 
print sensorData
r = requests.post(url, json=sensorData)
print "uploaded!", r

server-pic.py

import requests
import os
 
file = open("/mnt/sda1/arduino/www/debug-pic.txt", "w")
file.write("Ejecutando codigo... \n")
file.close()
 
url = 'http://url.api.rest/accion'
 
files = {'photo': open('/mnt/sda1/pic.jpg', 'rb')}
values = {'dispositivoId': '1'}
r = requests.post(url, files=files, data=values)
 
print "uploaded!", r

El primero se encarga de leer un txt y enviar un json al servidor con Node.JS, el segundo envía una fotografía y un parámetro identificativo. Pues bien, si los ejecutaba desde el terminal Putty me funcionaba sin problemas, pero si era el sketch el que hacía la llamada no llegaba a ejecutarse (ni el inicio). Después de mucho perder el tiempo, me dio por borrar ambos scripts y crearlos desde el terminal (anteriormente los había creado desde windows y arrastado al Arduino mediante WinSCP) y ¡¡MAGIA!!, todo funcionó como la seda.

Si alguna vez alguien lee esto y sabe decirme el por qué… Ah, antes de esto, llegué a mirar permisos (tenían 755), les hice un chmod +x, etc. Nada funcionaba. Al menos si me vuelve a pasar, ya sabré la solución.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *