En las últimas entradas de esta serie, vimos que son los pines GPIO y para que sirven, y como controlar el encendido/apagado de leds desde la terminal; antes de empezar debemos tener instaladas las librerías GPIO para Python, y el circuito electronico montado y funcionando.
En esta ocasión vamos a instalar el servidor web apache, y aprenderemos a escribir el código en HTML y PHP para controlar ese mismo LED, o varios, desde una interfaz web.
Lo primero que debemos hacer es instalar el servidor web LAMP, para lo que teclearemos las siguientes órdenes en la terminal:
#Actualizamos los repositorios y el software de la pi
usuario@maquina:~$ sudo apt-get update && sudo apt-get upgrade
#Instalamos LAMP
usuario@maquina:~$ sudo apt-get install apache2
usuario@maquina:~$ sudo apt-get install php5 libapache2-mod-php5
usuario@maquina:~$ sudo service apache2 restart
Ahora añadiremos como sudoer al usuario www-data, esta no es la opción mas segura pero recordemos que estamos haciendo una prueba en un entorno controlado; para un entorno en producción deberíamos buscar otra forma de ejecutar los scripts en python como sudoer.
Para editar estos permisos, escribimos sudo visudo en la terminal y al final del archivo añadimos a www-data como sudoer, debe quedar así.
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
pi ALL=(ALL) NOPASSWD: ALL
www-data ALL=(ALL) NOPASSWD: ALL
Para cada pin GPIO debemos crear un subdirectorio y tres scripts en Python; uno para encender, otro para apagar, y un último script para hacer parpadear nuestro LED, veamos un ejemplo con el pin 4.
#!usr/bin/env/ python ##
enciende.py #Importamos la libreria y le cambiamos el nombre a GPIO
import RPi.GPIO as GPIO #Establecemos el sistema de numeracion que queramos, #en este caso el sistema BCM GPIO.setmode(GPIO.BCM) #Configuramos el pin GPIO 4 como una salida GPIO.setup(4, GPIO.OUT) #Encendemos el led GPIO.output(4, GPIO.HIGH)
#!usr/bin/env/ python ##
apaga.py
#Importamos la libreria y le cambiamos el nombre a GPIO import RPi.GPIO as GPIO #Establecemos el sistema de numeracion que queramos, #en este caso el sistema BCM GPIO.setmode(GPIO.BCM) #Configuramos el pin GPIO 4 como una salida GPIO.setup(4, GPIO.OUT) #Apagamos el led GPIO.output(4, GPIO.LOW) #Y liberamos los GPIO GPIO.cleanup()
#!usr/bin/env/ python ##
parpadea.py
#Importamos la libreria y le cambiamos el nombre a GPIO import RPi.GPIO as GPIO #Necesario para los delays import time #Establecemos el sistema de numeracion que queramos, #en este caso el sistema BCM GPIO.setmode(GPIO.BCM) #Configuramos el pin GPIO 4 como una salida GPIO.setup(4, GPIO.OUT) #Encendemos y apagamos el led 5 veces for i in range(0,5): GPIO.output(4, GPIO.HIGH) time.sleep(1) GPIO.output(4, GPIO.LOW) time.sleep(1) #Y liberamos los GPIO GPIO.cleanup()
Ahora es el momento de crear nuestra página de inicio en HTML y PHP, que contendrá los botones que deberemos pulsar para ejecutar los scripts en Python desde una interfaz web, mas adelante veremos como queda la jerarquía final.
<html>
<head>
<!--index.php-->
</head>
<body>
<!--GPIO17-->
<form action="" method="post">
GPIO 17 <input type="submit" name="encender17" value="Encender">
<input type="submit" name="apagar17" value="Apagar">
<input type="submit" name="parpadear17" value="Parpadear">
<br></br>
<!--GPIO27-->
<form action="" method="post">
GPIO 27 <input type="submit" name="encender27" value="Encender">
<input type="submit" name="apagar27" value="Apagar">
<input type="submit" name="parpadear27" value="Parpadear">
<br></br>
<!--GPIO4-->
<form action="" method="post">
GPIO 04 <input type="submit" name="encender4" value="Encender">
<input type="submit" name="apagar4" value="Apagar">
<input type="submit" name="parpadear4" value="Parpadear">
<br></br>
<!--GPIO22-->
<form action="" method="post">
GPIO 22 <input type="submit" name="encender22" value="Encender">
<input type="submit" name="apagar22" value="Apagar">
<input type="submit" name="parpadear22" value="Parpadear">
</body>
</html>
<?php
// Funciones PHP del pin GPIO 17
if ($_POST[encender17]) {
$a- exec("sudo python /var/www/leds/gpio/17/enciende.py");
echo $a;
}
if ($_POST[apagar17]) {
$a- exec("sudo python /var/www/leds/gpio/17/apaga.py");
echo $a;
}
if ($_POST[parpadear17]) {
$a- exec("sudo python /var/www/leds/gpio/17/parpadea.py");
echo $a;
}
// Fin de las funciónes del pin GPIO 17
// Funciones PHP del pin GPIO 27
if ($_POST[encender27]) {
$a- exec("sudo python /var/www/leds/gpio/27/enciende.py");
echo $a;
}
if ($_POST[apagar27]) {
$a- exec("sudo python /var/www/leds/gpio/27/apaga.py");
echo $a;
}
if ($_POST[parpadear27]) {
$a- exec("sudo python /var/www/leds/gpio/27/parpadea.py");
echo $a;
}
// Fin de las funciónes del pin GPIO 27
// Funciones PHP del pin GPIO 4
if ($_POST[encender4]) {
$a- exec("sudo python /var/www/leds/gpio/4/enciende.py");
echo $a;
}
if ($_POST[apagar4]) {
$a- exec("sudo python /var/www/leds/gpio/4/apaga.py");
echo $a;
}
if ($_POST[parpadear4]) {
$a- exec("sudo python /var/www/leds/gpio/4/parpadea.py");
echo $a;
}
// Fin de las funciónes del pin GPIO 4
// Funciones PHP del pin GPIO 22
if ($_POST[encender22]) {
$a- exec("sudo python /var/www/leds/gpio/22/enciende.py");
echo $a;
}
if ($_POST[apagar22]) {
$a- exec("sudo python /var/www/leds/gpio/22/apaga.py");
echo $a;
}
if ($_POST[parpadear22]) {
$a- exec("sudo python /var/www/leds/ejecgpio/22/parpadea.py");
echo $a;
}
// Fin de las funciónes del pin GPIO 22
?>
Lo he agrupado todo en la misma página ya que si creaba una página en PHP para cada opción, al ejecutarla me mandaba a la página del script (una página en blanco); ahora ejecuta el código y se queda en la misma página.
Finalmente debemos conseguir la siguiente jerarquía dentro del subdirectorio del servidor web /var/www.
Si te ha gustado puedes seguirme en Twitter, Facebook, Google+, Linkedin, o compartirlo con los botones ubicados debajo de esta publicación, si tienes cualquier pregunta o sugerencia no dudes en comentar.
Buenas, despues de mirar por internet soluciones domoticas, me he decidido por tu sistema, me parece bien expuesto.
Aun asi y debido a mi experiencia nula en soft. me surgen dudas, ojala me las pudieras solucionar, llevo haciendo muchas pruebas y nada, no lo consigo….:)
realice todos los pasos que explicas y puedo gestionar los gpio desde el terminal con putty, pero desde web no consigo activar los script en python.
necesito hacer una pagina en /val/www con html (index.html) para que me la sirva apache. Colocando tu pagina aqui si me salen los botones, pero no me ejecuta los script de php. En la pagina index.php, no se que poner dentro.
Perdona por las molestias y gracias.
Es muy posible que hayas olvidado el paso de dar permisos al usuario www-data 🙂 revisa eso y si no miramos que podría ser.
Gracias por responder tan rápido, sí hice el paso de dar permisos en el fichero que pones, estoy confundido con la página index.php, tú la cuelgas del directorio GPiO, sólo veo los botones en la web sí la coloco en /val/www….en html!…index.html, pero no ejecuta los script de PHP. Que debo poner en él index.php que cuelgas del directorio de GPIO?
Si te fijas bien, index.php cuelga de /var/www/leds 🙂 Si aún así no te funciona, coméntalo y lo miramos.
Si la cuelgas de /var/www/index.php la verás en esta dirección pero no funcionará nada:
http://ipdelapi
Si la cuelgas de /var/www/leds/ funcionará adecuadamente pero desde esta ruta:
http://ipdelapi/leds
Espero que esto resuelva tus dudas y que puedas avanzar en este mundo tan apasionante.
Si, todo funciono genial….muchas gracias.
Me alegro de que te haya funcionado, al final era la ruta del script?
Gracias por tu comentario 🙂
Buenas, tengo el mismo problema que el compañero de arriba.
Mi index.php cuelga de /var/www/html/index.html
, si saco mi index html de ahi no se muestra, pero yo no tengo problema en tenerlo ahi, mi problema viene cuando pulso el boton y no me ejecuta el scrip.
PD: le di los permisos y todo
Gracias por tu respuesta.
Un Saludo
J.G.
Buenas, me está sirviendo de mucho tus trabajos, eres un máquina!
Estoy intentando hacer el sistema domotico para controlar varios leds desde la web pero tengo un problema que no consigo paliar.
El tema está en que he activado los GPIO que necesito, los activo y desactivo desde terminal, me conecto desde otro pc conectado en la misma red a 192.168.X.X/leds/ y la pagina web se ve bien, el menú para el control de la vivienda se ve perfecto, pero no responden los leds, lo he intentado por activa y por pasiva, algo estoy haciendo mal…
Lo único que puedo decir es que visualizo el código fuente de la página y solo se muestra el código html, el php no aparece, no se si debería o si no.
Pienso que puede ser algo del PHP pero tampoco estoy muy convencido porque he probado un test de PHP y lo hace bien, estoy desesperado jajaja
Hola Juan,
Me alegro mucho de que le sean de utilidad mis artículos 🙂 siempre son de agradecer los comentarios positivos.
Todo código PHP en el navegador se muestra como HTML, ya que la función de PHP es crear en el momento y de forma dinámica las páginas web que se sirven en el navegador.
Ejecutando los scripts en Python directamente si se encienden los leds? lo correcto seria empezar probando desde ahí e ir avanzando.
Muchas gracias, lo que estaba buscando. Felicidades por tu trabajo
Muchas gracias a ti por tu comentario y por el apoyo, me alegro de que te sea útil el artículo.
Hasta pronto 🙂
Gracias por contestar con rapidez!
Al final formatee la raspberry de nuevo, seguí todos los pasos de nuevo y todo funciona de maravilla, no se que pudo fallar.
De todas formas gracias por la atención.
Un saludo
Gracias a ti por poner tus dudas en común, me alegro de que finalmente se haya arreglado.
Has cambiado algo en tu Raspberry además de formatear, como por ejemplo el transformador microUSB?
Sí, cuando la compré le puse un disipador al micro para subirle la velocidad y que así trabajara más rápido, pero tampoco se nota mucho el cambio.
Eso fue lo único que le cambie a la rasp.
Hola Juan, me alegro de leerte otra vez por aquí.
En principio no tiene por que influir el Overclock en este aspecto, pero puede haber sido cualquier configuración; si ahora que está funcionando con una Raspbian limpia vuelve a dar problemas una vez estando en producción, ya si que te recomendaría buscar la raíz del problema.
El cambio en el Overclock lo notarás en según que tareas específicas que necesiten de mucha potencia de cálculo, pero algunos factores como el puerto Ethernet seguirán haciendo de cuello de botella para según que usos.
Puedes ver el review que hice de los modelos Raspberry PI B, B+ y B2 en el siguiente enlace, con completas pruebas de rendimiento:
http://www.peatonet.com/raspberry-pi-y-los-pines-gpio-controlando-el-led-desde-una-interfaz-web/
Espero que te sea útil, hasta pronto 🙂
Hola, tengo una duda/problemilla. Quisiera conectar un buzzer en lugar de un led, pero quiero probar primero con un led para aprender. Es necesario hacer un index.html y otro .php?
Yo tengo el led conectado al gpio4, y tengo un script on.py y otro off.py dentro de la carpeta 4. en consola funcionan perfectamente.
y el index.html no lo puedo poner porque no me deja, pero solo tiene las funcionalidades para el led 4.
Espero que me puedas ayudar, he visitado tu perfil de facebook y espero algún día saber tanto de Raspberry Pi como tú. Un saludo y gracias.
Una web en PHP puede contener HTML por lo que solo necesitas un index.php
Si colocas las órdenes PHP para ejecutar tus scripts en python en un archivo HTML, no se ejecutarán.
Ahora que en la terminal funciona, podrías copiar exactamente el index.php de este tutorial, eliminando los otros GPIO y dejando únicamente el 4 que es el que utilizas; y debería funcionar.
Si no puedes editar archivos en /var/www seguramente será por permisos, en este mismo tutorial está la solución y debería funcionar, si no es así comenta e intentaré echarte una mano.
Hola, voy a aprovechar para poner por aquí otra duda, por si tú o alguien me puede echar un cable. Tengo este script y quisiera que borrara la carpeta con la fecha una vez reiniciado, y lo que más me interesa, saber como hacer para que cuando llegue a un x tamaño la cantidad de capturas, se borren todas o se reinicie la RPi. Gracias un saludo.
#! /bin/sh
# /etc/init.d/motionStartup
#
# Some things that run always
#touch /var/lock/motionStartup
logger -s “Script motionStartup called”
# Carry out specific functions when asked to by the system
case “$1” in
start)
logger -s “Script motionStartup started”
TIMESTAMP=$(date +%Y%m%d%H%M%S | sed ‘s/ //g’) # No spaces
logger -s “Script motionStartup $TIMESTAMP”
sudo mkdir /motiontmp/$TIMESTAMP || logger -s “Error mkdir start”
find /motiontmp/motion/. -type f -size 0 -print0 -delete
find /motiontmp/motion/. -maxdepth 1 -type f | \
xargs -I ‘{}’ sudo mv {} /motiontmp/$TIMESTAMP
;;
stop)
logger -s “Script motionStartup stopped”
;;
*)
echo “Usage: /etc/init.d/motionStartup {start|stop}”
exit 1
;;
esac
exit 0
Si añades al principio de tu script esta linea, cada vez que se ejecute el script antes de hacer nada borrará todas las carpetas dentro de /motiontmp/
sudo rm -rf /motiontmp/*
En cuanto a lo de borrar los archivos cuando llegue a un tamaño determinado, podrías probar concatenando el comando df -h que muestra el uso en disco de un directorio, o una partición:
df -h /motiontmp
Con otro comando como wc o sed para que solo lea la frase referente a los MB o GB usados, finalmente con if podrías programar la parte en que si el resultado es mayor a N, ejecute el comando rm anteriormente descrito.
Hasta lo de borrar las carpetas perfecto, pero luego…
Disculpa pero es que soy un poco nuevo y me he perdido, como sería por ejemplo para cuando alcance el directorio /motiontmp/motion/ 5 Gigas? Muchas gracias un saludo.
Hola, he estado buscando y para el tamaño de una carpeta concreto creo que es con este comando:
du -sh /ruta/a/carpeta
Disculpen por tantos mensajes seguidos pero conforme voy averiguando actualizo. Algo así podría funcionar?
#! /bin/sh
# /etc/init.d/motionStartup
#
size= du -sh /motiontmp
read “size”
if [ “$size” > “2048000K” ]; then
sudo rm -rf /motiontmp/*
else
logger -s “Script motionStartup called”
# Carry out specific functions when asked to by the system
case “$1” in
start)
logger -s “Script motionStartup started”
TIMESTAMP=$(date +%Y%m%d%H%M%S | sed ‘s/ //g’) # No spaces
logger -s “Script motionStartup $TIMESTAMP”
sudo mkdir /motiontmp/$TIMESTAMP || logger -s “Error mkdir start”
find /motiontmp/motion/. -type f -size 0 -print0 -delete
find /motiontmp/motion/. -maxdepth 1 -type f | \
xargs -I ‘{}’ sudo mv {} /motiontmp/$TIMESTAMP
;;
stop)
logger -s “Script motionStartup stopped”
;;
*)
echo “Usage: /etc/init.d/motionStartup {start|stop}”
exit 1
;;
esac
exit 0
fi
Hola que tal amigo, disculpa segui tu ejemplo y al encender el led no existe algun problema, pero al hacer clic en el boton apagar, el led parpadea, ya cheque los codigos y todo esta correcto :/ tienes alguna idea que podria estar haciendo mal?
Hola Fco, gracias por tu comentario.
En la web, hay tres botones:
Encender, apagar, y parpadear.
Si puedes, pega aquí el código que has asignado al botón apagar, ya que por lo que comentas es posible que el botón apagar esté ejecutando el script que debería ir asociado al botón de parpadeo.
Hasta pronto.
Hola otra vez a todos, otra duda más para añadir jeje.
Antes pongo en antecedentes, resulta que para activar el sonido de un buzzer (zumbador) hay que hacer un bucle que ponga su pin a 1 y a 0 constantemente, no como un led que mientras tenga 1 sigue luciendo.
El problema está en como parar ese bucle al emplearlo en una web php, porque en consola añadiendo al final de la llamada del script un & se ejecuta en segundo plano y deja la consola libre para llamar al script que lo finaliza, ejemplo:
sudo python sonar.py &
estos son los dos scripts, el que hace que suene y el que hace que deje de sonar:
import time
import RPi.GPIO as gpio
gpio.setwarnings(False)
gpi.setmode(gpio.BOARD)
gpio.setup(7,gpio.OUT)
gpio.output(7,1)
time.sleep(.3)
gpio.output(7,0)
time.sleep(.3)
y el de apagado:
import time
import RPi.GPIO as gpio
gpio.setwarnings(False)
gpi.setmode(gpio.BOARD)
gpio.setup(7,gpio.OUT)
gpio.output(7,0)
gpio.cleanup()
aunque simplemente con interrumpir el primero bastaria. Gracias un saludo.
Puedes concatenar distintos comandos, para que basándose en el nombre de tu script, la terminal busque su PID y mate posteriormente su ejecución con Kill.
Una vez hallado el comando, cambia la función pensada para cerrar con Ctrl + C, por una que en lugar de ello, al zumbar N veces lo mate automáticamente con dicho comando.
Si con Ctrl + C se cierra en consola, pero yo trato de implementarlo a través de PHP como los leds de tu post, entonces tendrá que ser de otra manera digo yo.
Arriba tienes la solución para matar tu proceso con BASH, hallando su PID a partir del nombre de archivo; solo tienes que integrarlo en tu web PHP con “exec”.
Me puedes dar alguna pista más por favor? es que estoy un poco bastante perdido.
Hola.
Gracias por el tutorial.
Tengo un problema, no ejecuta los scritp, si los ejecuta desde consola van, pero desde la página no, no sé que puede ser. He hecho lo que comentar de
“escribimos sudo visudo en la terminal y al final del archivo añadimos a www-data como sudoer, debe quedar así.”
Pero nada. ¿Qué más puedo mirar?
Saludos.
Hola ullu, gracias por tu comentario.
En un tutorial anterior al que enlazo al principio de este artículo, se dan los pasos a seguir para instalar Apache2 con las dependencias necesarias para las siguientes lecciones.
http://www.peatonet.com/raspberry-pi-y-los-pines-gpio-controlando-el-led-desde-una-interfaz-web/
Si en el futuro son necesarias nuevas dependencias, se explicará como instalarlas en su momento, pero mientras sean las mismas enlazaré a artículos anteriores para evitar hacerlos demasiado extensos.
Pues al final después de mucho mirar y probar, creo que la solución a mi problema fue hacer esto:
http://www.ubuntu-es.org/node/85464#.VaPXsEZ8s_o
Muchas gracias por compartir una solución valida para este caso en concreto, al parecer faltaba alguna dependencia de Apache2.
En un tutorial anterior podéis ver una forma más cómoda de instalar Apache2 con las dependencias necesarias:
http://www.peatonet.com/raspberry-pi-y-los-pines-gpio-controlando-el-led-desde-una-interfaz-web/
Hola, buenos días,
Ante nada, gracias.
Permite una pregunta, todo funciona perfectamente, ahora, quisiera poder agregar una pantalla que indique cuando los leds están encendidos o apagados, encontré algunos artículos incluso con imágenes que muestran lamparas cambiando de color según si están funcionando o no, trate de entender el funcionamiento pero no logre hacerlo funcionar, llego a la web con los comandos pero nada se activa, espero no molestar con esto y otra ves, gracias por tu increíble amabilidad.
Ignacio desde Bélgica
Hola Ignacio, muchas gracias por tu comentario.
Supongo que para ello estás utilizando Javascript, integrando en él las funciones PHP que activan el script en Python para, gestionar el encendido y apagado de las luminarias.
No domino JavaScript, ya que no soy desarrollador web pero quizás pueda orientarte un poco mejor, o algún otro lector pueda ayudarte a conseguir lo que tú quieres; pero para ello necesitaría ver el código, o los tutoriales que has seguido para intentar detectar donde está el fallo.
Hasta pronto, y ¡mucho ánimo!
Hola ante todo muchas gracias, aprendo un monton.
He seguido todos los pasos expuestos, logro encender los leds desde el terminal local, cargue el parche php como lo indicó ullu, otorgue los permisos incluso uno 775—-etc. Carga la página con los botones despues de leds/gpio pero nada. Estoy usando Raspberry pi 2…..sera algo con esta tarjeta?. Aprecio su colaboración.
Hola Rafael, gracias a ti por comentar.
Es posible que la solución se halle en los comentarios de los tutoriales anteriores de esta serie dedicada a la domotica asequible basada en Raspberry PI.
Los pasos a seguir son compatibles con cualquiera de las versiones de la PI, se me ocurre que podrías cambiar en la página web la ejecución del script en python por la siguiente orden que creará un archivo en el directorio home de tu Raspberry:
sudo touch /home/pi/funciona
Si todo está funcionando bien, debería crearse dicho archivo.
Gracias por su rápida respuesta. Hice los cambios, conforme me lo indicó, en index.html retirando la parte de python y colocando a cambio: sudo touch /home/pi/funciona , pero infortunadamente no se crea el archivo en mi raspberry. Me parece una excelente prueba y por el resultado creo que concentra el problema en la zona web. Buscare mas información en otros tutoriales. Gracias por su ayuda. Estamos en contacto.
Hola Rafael, a continuación podrías hacer la misma prueba cambiando ligeramente la ruta del archivo para comprobar si el problema recae en los permisos del directorio /var/www.
sudo touch /var/www/funciona
Hola, me podrias decir alguna manera de poner una etiqueta con el estatus de el LED desde la interfaz web PHP
que cambie automaticamente al darle Clic a dicho boton ya sea encender, apagar, parpadear… tener una etiqueta que te diga el estatus. Gracias por tu aporte espero me puedas ayudar..
Hola Chaka, muchas gracias por tu comentario.
Creo que podrías hacerlo con PHP y JavaScript si quieres darle algún efecto más visual, o realizar cambios en el botón.
Si solo quieres añadir una etiqueta de texto según que botón presiones, únicamente tendrías que ampliar las funciones asociadas a cada input; te adjunto una lista de las funciones disponibles en PHP:
http://php.net/manual/es/indexes.functions.php
en este caso quiero saber si es la direccion IP de PC que yo voy a usar
Hola Jameson,
No entiendo bien la pregunta, pero para encontrar la IP de algún dispositivo puedes utilizar NMAP.
También dispones de herramientas con interfaz gráfica como ZenMap basada en NMAP y Fing para dispositivos Android.
ok, ahora entiendo, tengo que usar la direccion Ip de mi Raspberry, no verdad Peatonet.
Hola Jameson,
Efectivamente la IP que debes escribir en tu navegador es la de Raspberry PI puesto que esta es la que actúa como servidor web, además si tu archivo php no lo nombraste como index.php tendrás que añadir tras la ip el nombre de tu archivo separado por una “/”.
En mi caso la IP es del rango 10.42.0.0 ya que es una IP del tipo NAT proporcionada por una interfaz virtual de red.
Por favor necesito ayuda. La cuestión es que tengo todo según tal cual lo explicas, pero no funcionan los scripts en PHP.
Muchas gracias
Hola Sergio,
Supongo que te refieres a los scripts en Python, otros usuarios tuvieron el mismo problema y hay varias soluciones en los comentarios anteriores; si tras probarlas persiste el fallo si aportas más datos quizás otros lectores o yo podríamos ayudarte.
Hasta pronto.
¿por qué “a- exec…” en vez de “a= exec…” ?
no entiendo y no he encontrado esta formula en google.
Hola Roberto, bienvenido.
No soy experto en php, y en esos momentos busqué un tutorial para ejecutar ordenes en el interprete bash desde php y así lo encontré.
¿Sería mas apropiado utilizar a= exec en lugar de a- exec?
Muchas gracias por tu comentario, hasta pronto.
Si no os funciona la web pero si los scripts, pronto haré un artículo para que podáis solucionarlo; gracias a los datos que he recopilado de los distintos usuarios a los que no les ha funcionado.
Si os corre prisa solucionarlo, podéis revisar si el directorio /var/www/html existe en vuestra raspberry, y si es así debéis mover todos los archivos a esa ruta y substituir en los scripts “/var/www” por “/var/www/html” ya que ahora
esa es la ruta por defecto del servidor web.
También es posible que no hayáis borrado el index por defecto, “index.html” o que os falte cambiarlo por “index.php”.
Espero que sea de ayuda, hasta pronto.
El nuevo tutorial en el que ya no son necesarios los scripts está en el siguiente enlace:
http://www.peatonet.com/raspberry-pi-implementando-un-sistema-domotico-asequible-parte-iii/
Hola Antonio,
me preguntaba si se puede montar un servidor web para montar un sistema domótico y probar la api de twitter para encender luces etc… (he visto que también se puede hacer por python con algunas librerías y resulta sencillo siguiendo los tutoriales… pero se podría hacer como digo y con php? es decir, que la raspberry tenga el servidor web con twitter y los puertos gpio enciendan los leds
Gracias de antemano.
Hola Nano,
Desde la web en php puedes ejecutar cualquier orden en el interprete de órdenes BASH, lo que incluye scripts en Python.
Puedes utilizar la librería o API de Twitter para que cuando envíes cierto tweet citando el nombre de usuario de la cuenta del bot, apague o encienda la luz o electrodomestico asociada a ese mensaje en concreto.
Veo un problema, y es que cualquiera podría encenderte y apagarte las luces y los electrodomésticos de casa; a no ser que se pueda restringir dependiendo del usuario que envía el tweet.
Sería interesante si vas comentando lo que encuentres al respecto.
Gracias por comentar, hasta pronto.
Buenas tardes,
He seguido el tutorial, copie el codigo de la web, lo guarde como .php, en la carpeta que me crea el servidor /var/www/html , porque si pongo el index.php fuera de la carpeta html no me encuentra el archivo, pero bueno, parece que todo esta bien. Solo estoy probando con el GPIO 17, entonces he creado dos .py, uno para encender y otro para apagar, los he ubicado en la misma carpeta del archivo index.php. Abro el navegador, entro en el index, pero no me prende el led. Si accedo por ssh al archivo enciende y lo ejecuto por consola si que funciona. no se donde puedo estar fallando. Por supuesto cambie la ruta de acceso a los scripts desde el php, ya que es diferente a tu tutoria.
Espero puedas echarme una mano, estoy pillado.
Un saludo.
Muchas gracias.
Hola Charlie,
Desde hace un par de versiones, Raspbian ha actualizado Apache y las páginas web se sirven desde /var/www/html en lugar de /var/www
Hay una nueva versión de la web en la que puedes prescindir de utilizar archivos adicionales, también puedes colaborar en su desarrollo mediante github si lo deseas:
http://www.peatonet.com/raspberry-pi-implementando-un-sistema-domotico-asequible-parte-iii/
De todos modos si quieres utilizar esta versión del panel de control puedes probar añadiendo al usuario www-data en el grupo gpio, parece que ese es el problema puesto que te funciona mediante ssh.
Hola peatonet, estoy intentando hacer un invento para activar un modulo de 4 relés desde la web para encender o apagar las luces de un local que tengo, el problema es que en la prueba, el led puesto con redistencia se enciende y apaga a voluntad desde la web, pero cuando conecto el pin40 (que es el que tengo configurado) quitando la resistencia y el led, se apaga la luz roja del módulo de relés y ni enciende ni apaga la bombilla que tengo para probar.
Por favor ayudadme porque ya no se si es que esta mal el módulo de relés (maldito aliexchinapress) aunque en ninguno de los 2 módulos que tengo funciona o si es que la raspberrypi no manda bastante tensión al relé (como VCC le tengo puesto al pin3)
Perdón por la parrafada y gracias de antemano
Un saludo amigos
Hola, me autorespondo yo amigos, el problema lo tenía en que en el pin20 (en mi caso) le tenía que poner una resistencia, yo la he puesto de 330 unida a tierra.
Supongo que será porque cuando pase de led a relé elimine la resistencia
Gracias por todo ?
Hola Jesús, muchas gracias a ti por compartir la solución con nosotros.
Disculpa si no pude contestar antes pero me pillaste con fiebre, en la última semana de clases preparando exámenes, y hasta arriba de trabajo (los Freelance no tenemos permiso para ponernos enfermos).
Respecto al pin al que tienes conectado el VCC, en mi caso lo conecto al pin 2 o al 4 en su defecto ya que requiere 5V de alimentación.
Si quieres puedes dar más detalles de tu prueba de concepto, estás utilizando leds en lugar de tomas de 220V AC entonces?
Gracias por tu comentario.
Hola, estoy haciendo un proyecto para la facultad y quisiera saber si existe la forma que desde una aplicacion android se pueda emular este sistema, es decir, como manejar los pines de la raspberry de esta forma me parece 100 veces mas facil que en una aplicacion de android, quisiera saber si creando una aplicacion podria de alguna forma automatica direccionarme a este tipo de sistema para no tener que aprender de la nada a programar semejante cosa en android. Lamentablemente estoy obligado a entregar el proyecto como aplicacion de celular, no de forma web.
Espero tu respuesta
Hola amigo muchas gracias!! excelente explicación!! que viva el OpenSource. gracias por tu aporte.
amigo disculpa mi ignorancia es posible realizar el mismo proyecto pero sin utilizar python solamente con php?????
Hola Marco, gracias por su comentario.
Es posible prescindir de la jerarquía de scripts en python empleando únicamente una web en PHP que integra el código en Python, para ello puede seguir este tutorial más actual:
http://www.peatonet.com/raspberry-pi-implementando-un-sistema-domotico-asequible-parte-iii/
En caso de no querer utilizar python, podría hacer las llamadas a los puertos GPIO mediante BASH para lo que tendría que editar el código de dicho tutorial.
Hola y gracias por todo, repito mi pregunta, cual es la diferencia para que esto funcione en la raspberry pi 3, de antemano,
Gracias
Hola Ignacio, gracias por comentar.
Este tutorial está desarrollado sobre una Raspberry PI 3 por lo que debería funcionar sin complicaciones.
Si aún así no logras hacerlo funcionar, puedes compartir los errores o problemas que has encontrado.
Hola colegas, necesito de vuestra ayuda pues estoy inmerso en un proyecto entre 3 especialidades, eléctrica, electrónica e informática, yo domino la parte de electricidad pero no soy especialista en las dos restantes. Les explico, necesito conectar un analizador de red M2DL2 a una Raspberry pi con el objetivo de registrar datos de consumo de corriente y poder trasmitirlos a la raspberry y que esta a su vez lo registre y visualice en una tabla de datos. Sé que la señal que saca el analizador es RS485 y la que debe entrar a la raspberry es RS232 por lo que necesito un convertidor de una señal a otra, lo que no sé es como hacer la interconexion entre el analizador, el convertidor y la raspberry. Sabéis algo de esto o me podéis orientar donde buscar información al respecto?
Saludos.
Ramón.
Hola como andas?
Si quisiera consultar el estado de un gpio, a traves de php, para que me diga si esta ON / OFF ya que me encuentro remoto. Como deberia hacer?
Quizá existe alguna manera de que la rasp devuelva el valor que esta el gpio.
Sino lo hare en una db ingresando 1 o 0 al presionar los botones, pero eso lo veo medio rustico
Hola Juani, gracias por comentar.
El subsistema GPIO es al fin y al cabo parte del sistema de archivos /sys de GNU/Linux, y realmente se gestiona editando los valores de los archivos asignados a cada puerto GPIO.
Puedes consultar si un GPIO está activo o inactivo leyendo el archivo que contiene su valor, un ejemplo en PHP para el GPIO 18:
$estado_gpio18 = file_get_contents(“/sys/class/gpio/gpio18/value”);
Si el valor es “1” el GPIO está activo, por el contrario si el valor es “0” está inactivo.
Hasta pronto.
Hola, lo primero agradecerte la molestia de compartir tus conocimientos con los que tenemos inquietudes similares.
Quisiera hacerte una consulta (espero que no sea muy tonta), ya hace meses que llevo dándole vueltas al tema de la creación de interfaces web para la raspi. Tu comentas el tema de darle permisos a www-data, pero eso, estaría bien como comentas para accesos desde entornos locales o para pruebas. ¿Que soluciones aconsejarías para entornos más seguros?
Un saludo y gracias nuevamente
Hola Gon, gracias a tí por tu comentario; únicamente intento documentar como voy aprendiendo día a día sobre este fascinante mundo, de forma online para que así podamos aprender todos juntos.
Quiero recordar a todos los lectores que a pesar de ser funcional este panel no es en absoluto perfecto, es un ejemplo realmente básico de lo que puede hacerse y cuanto más aprendo más cuenta me doy de lo mucho que se podría mejorar; este año estoy tratando de mejorar mis habilidades como programador ya que siempre me dediqué más a los sistemas y a la seguridad, y no tenía apenas nociones sobre estructuras de código, metodologías de diseño ni algoritmos; espero en breves sacar tiempo para mejorar el panel web y compartir una siguiente versión de la cual ya no me averguence tanto.
En principio desde la versión 3 de la web es suficiente con añadir el usuario www-data al grupo GPIO para gestionar el estado de los pins evitando darle permisos de sudoer; esto puede hacerse mediante la siguiente orden:
sudo usermod -a -G gpio www-data
De todos modos creo que tu pregunta va más enfocada a restringir el acceso a dicho panel mediante autenticación, y esto puede hacerse con el modulo mod_auth para Apache2; también es recomendable utilizar mod_ssl aunque sea con un certificado autofirmado.
Si vas a acceder desde el exterior siempre puedes añadir una capa más de seguridad configurando una VPN, a la cual puedes proteger el acceso con certificados x509, usuario y contraseña, y sistemas de prevención como fail2ban entre otros.
Espero haber aclarado un poco tus dudas, muchas gracias por tu interés acerca del artículo.
Hola Antonio! En primer lugar muchísimas Gracias por responder y tan rápido.
A mi me pasa un poco al revés, soy desarrollador web intentando empaparme del mundo de los sistemas y la seguridad. Es un placer que haya personas como tu que inviertan su tiempo documentando sus proyectos para que otros podamos aprender un poquito más cada día.
Decirte que me has ayudado mucho. Tengo un proyectito conectado a la raspi, y llevo meses dándole vueltas a lo del interfaz y sin decidirme mucho que hacer ( que si php, que si cylon.js, servicios ya creados tipo mydevice y similares…) y siempre me topé con las mismas dudas: permisos, seguridad, …etc. Tu artículo (créeme que leído muchos) es de los pocos que van un poco más allá de como pinchar cables en las GPIO, de ahí el preguntarte.
Gracias nuevamente, has aclarado muchas dudas.
Iré probando e implementando según tenga tiempo libre, y si te interesa te comento resultados.
Un saludo
Hola Que aplicaciones se pueden utilizar en los automóviles
Se podría que funcionara milrrolling
Alguien a echó algún proyecto sobre este tema
Saudos
estimado y si deseo hacerlo con input type radio y sin el boton submit, este podria ser llamado desde un js ? ajax? me gustaria puedas asesorarme gracias
Buenas,
He estado intentando realizar lo que propones y no lo he conseguido. He seguido todos los pasos y nada. El problema es el archivo php. He creado un archivo de texto en el que he copiado todo lo que has puesto arriba, sin modificar nada, tal cuál, y lo he guardado como php. Lo he ubicado dentro de la carpeta leds y no hay manera de que se ejecute. No sé cuál es el problema.
Gracias y un saludo
Muy buen tutorial, hace tiempo queria correr un python desde el navegador y no podia, gracias
Hola Amigo, para mi proyecto me pidieron madar al prender el led de la misma forma pero publicnado desde tweter,tendras algun tuto para eso?? yo tenfo un codigo pero no lo puedo hacer jalar te lo podria compartir para que lo cheques??
Antonio saludos desde colombia, hace rato estaba buscando como integrar python en la web, me diste la luz que necesitaba muchas gracias te felicito