Domótica en RaspberryPi (parte 3)

Domótica en RaspberryPi (parte 3)

... demonio para monitorizar

Hola de nuevo!. Este post es la continuación de este y de este, así no te servirá de mucho, si aún no has realizado los dos anteriores. Hasta ahora hemos mandado comandos x10 desde el RaspberryPi, hacia el CM15PRO. Ahora vamos a hacer lo contrario, vamos a leer la información que llega al CM15PRO, con la ayuda de un demonio de fabricación casera. Al lío.


Antes de nada, volveré a deciros que no tengo ni idea de programar, por ello este demonio es un poco ... casero. Cubre las necesidades al 100% pero sólo es elegante en un 50%, si alguien quiere regalarme tiempo y un par de cursos de perl y python, se lo agradeceré ;)
Vamos al demonio, lo primero es ver que es lo que pasa por el CM15PRO, en nuestro RaspberryPi:
?
1
nc localhost 1099
... y no pasa nada, mantenemos la conexión y en el minimando x10 le damos al A2 On:
?
1
2
3
4
5
06/13 21:40:04 Rx RF HouseUnit: A2 Func: On
06/13 21:40:04 Tx PL HouseUnit: A2
06/13 21:40:04 Tx PL House: A Func: On
06/13 21:40:05 Rx PL HouseUnit: A2
06/13 21:40:06 Rx PL House: A Func: On
interesante, ahora le damos al A2 Off:
?
1
2
3
4
5
06/13 21:40:12 Rx RF HouseUnit: A2 Func: Off
06/13 21:40:12 Tx PL HouseUnit: A2
06/13 21:40:12 Tx PL House: A Func: Off
06/13 21:40:13 Rx PL HouseUnit: A2
06/13 21:40:13 Rx PL House: A Func: Off
vale, parece que la línea que nos interesa es la que contiene las palabras HouseUnit y Func ¿verdad?. Ahora viene la gran pregunta:
¿cómo mantengo la conexión abierta con el mochad y actúo en consecuencia? Pues vamos a usar un poco de perl y ngrep:
?
1
apt-get install ngrep
De forma que la conexión es:
?
1
ngrep -d any 'HouseUnit' port 1099 | perl -ne 'system("/usr/local/bin/ejecutadorx10.sh $_") if (/HouseUnit/)'
básicamente eso mantiene la conexión y hace el primer filtrado "HouseUnit", y se lo envía a /usr/local/bin/ejecutadorx10.sh , de forma que la única línea que recibe ejecutador.sh es:
?
1
2
06/13 21:40:04 Rx RF HouseUnit: A2 Func: On
06/13 21:40:12 Rx RF HouseUnit: A2 Func: Off
Perfecto, podemos por lo tanto hacer un script /usr/local/bin/demoniox10.sh :
?
1
2
#!/bin/bash
ngrep -d any 'HouseUnit' port 1099 | perl -ne 'system("/usr/local/bin/ejecutadorx10.sh $_") if (/HouseUnit/)'
y le damos permisos:
?
1
chmod +x /usr/local/bin/demoniox10.sh
Ahora el script ejecutador, tiene que hacer un segundo filtro con "Func" y por ahora guardar lo recibido en un archivo temporal, de forma que en siguientes post podamos usarlo para las alarmas y otros menesteres. Este es el script /usr/local/bin/ejecutadorx10.sh:
?
1
2
3
4
5
6
7
8
9
#!/bin/bash
correcto=$(echo $@ | grep Func | wc -l) # 1 ok - 0 fail
 
if [ $correcto = 1 ];
then
        modulo=$(echo $@ | cut -f6 -d\ )
        funcion=$(echo $@ | cut -f8 -d\ )
        echo se recibe $modulo $funcion >> /usr/local/bin/recibido.txt
fi
le damos permiso:
?
1
chmod +x  /usr/local/bin/ejecutadorx10.sh
De acuerdo, ahora ejecutamos el demonio:
?
1
/bin/bash /usr/local/bin/demoniox10.sh
en otro terminal estamos atentos:
?
1
2
touch /usr/local/bin/recibido.txt
tail -f /usr/local/bin/recibido.txt
y en el minimando pulsamos A3 On (por ejemplo), en el nuevo terminal tiene que salir:
?
1
se recibe A3 On
jejejeje que bueno, solo queda parar el demonio (CTRL+c) y añadimos:
?
1
/bin/bash /usr/local/bin/demoniox10.sh
al archivo (antes del exit 0):
?
1
/etc/rc.local

Leave a Reply