Domótica en RaspberryPi (parte 2)

Domótica en RaspberryPi (parte 2)

... con interfaz web

Llevo unos días un poco liado y no podido actualizar el blog, sorry. Hoy os voy a enseñar que no tengo ni idea de programación web, pero me he fabricado un engendro para controlar la domótica de mi casa, via web. Por favor, no me critiquéis mucho, ya os he dicho que no se programar webs.

En este ejemplo, la idea es ver un mapa de la casa con las bombillas a controlar, así que lo primero que necesitamos es un poco de paciencia y Sweet Home 3D, es software libre y muy sencillo de usar. Luego con un poco de Gimp + InkScape, le pintamos las bombillas. Mi resultado es:
Precioso, en mi caso he pintado también el termo. Si os fijais he pintado tambien un + y un - en aquellas bombillas que puedo regular la intensidad. Continuamos ahora en nuestro RaspberryPi:
?
1
apt-get install apache2 php5
Ahora lo que toca es hacer un mapa de imagen html (image map) para que al hacer clic en zonas determinadas de una imagen, te abra un enlace. Como no tengo muchos conocimientos, uso un editor web: Online Image Maps Creator. Le cargamos la imagen y sobre ella pintamos los rectángulos sobre las bombillas. Cuando lo tengamos le decimos que nos muestre el codigo y lo guardamos como index.html en /var/www/ del RaspberryPi.
Ahora toca un poco de código, la idea es tener un index.html con el siguiente aspecto:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<div style="text-align:center; width:1293px; margin-left:auto; margin-right:auto;">
<img id="Image-Maps_4201104201142424" src="a4.jpg" usemap="#Image-Maps_4201104201142424" border="0" width="800" height="793" alt="">
<map id="_Image-Maps_4201104201142424" name="Image-Maps_4201104201142424">
<area shape="rect" coords="397,123,475,243" href="acciones.php?acc=encender&app=A1" alt="" title="">
<area shape="rect" coords="307,125,385,245" href="acciones.php?acc=apagar&app=A1" alt="" title="">
<area shape="rect" coords="540,208,618,293" href="acciones.php?acc=apagar&app=A4" alt="" title="">
<area shape="rect" coords="631,207,709,296" href="acciones.php?acc=encender&app=A4" alt="" title="">
<area shape="rect" coords="563,415,641,500" href="acciones.php?acc=apagar&app=A3" alt="" title="">
<area shape="rect" coords="650,416,728,501" href="acciones.php?acc=encender&app=A3" alt="" title="">
<area shape="rect" coords="539,177,617,209" href="acciones.php?acc=menos&app=A4" alt="" title="">
<area shape="rect" coords="632,179,710,211" href="acciones.php?acc=mas&app=A4" alt="" title="">
<area shape="rect" coords="563,385,641,417" href="acciones.php?acc=menos&app=A3" alt="" title="">
<area shape="rect" coords="649,381,727,413" href="acciones.php?acc=mas&app=A3" alt="" title="">
<area shape="rect" coords="473,433,526,492" href="acciones.php?acc=encender&app=A2" alt="" title="">
<area shape="rect" coords="408,433,461,492" href="acciones.php?acc=apagar&app=A2" alt="" title="">
<area shape="rect" coords="408,407,461,432" href="acciones.php?acc=menos&app=A2" alt="" title="">
<area shape="rect" coords="473,408,526,433" href="acciones.php?acc=mas&app=A2" alt="" title="">
<area shape="rect" coords="353,640,404,724" href="acciones.php?acc=apagar&app=A5" alt="" title="">
<area shape="rect" coords="297,640,348,724" href="acciones.php?acc=encender&app=A5" alt="" title="">
</map>
<!-- Image map text links - Start - If you do not wish to have text links under your image map, you can move or delete this DIV -->
<div style="text-align:center; font-size:12px; font-family:verdana; margin-left:auto; margin-right:auto; width:800px;">
<!-- Image map text links - End - -->
 
</div>
</div>
Veamos por ejemplo:
?
1
<area shape="rect" coords="408,433,461,492" href="acciones.php?acc=apagar&app=A2" alt="" title="">
eso es el código del rectángulo sobre la bombilla A2 en apagar. El href nos envía a un php: acciones.php con los parámetros:
?
1
acc=apagar y app=A2
Bien, ahora toca crear:
?
1
vim /var/www/acciones.php
El mio es así:
?
1
2
3
4
5
6
<!--?php
 
exec("sudo /usr/bin/perl /var/www/domo.pl {$_GET["acc"]} {$_GET["app"]}");
header("Location: http://192.168.1.2/index.html");
 
?-->
Básicamente ejecuta como root el script domo.pl y le añade los parámetros de acción y aparato. Asi que toca añadir al archivo:
?
1
/etc/sudoers
la linea:
?
1
www-data ALL=(ALL) NOPASSWD: /usr/bin/perl /var/www/domo.pl
para que cuando www-data ejecute como root el script, no pida clave. Y ahora el script en cuestión: /var/www/domo.pl
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/perl -w
 
use Fcntl;
foreach $argnum (0 .. $#ARGV) {
        if ($ARGV[$argnum] eq "encender") {
                $accion = 0x62;
        }
        if ($ARGV[$argnum] eq "on") {
                $accion = 0x62;
        }
        if ($ARGV[$argnum] eq "apagar") {
                $accion = 0x63;
        }
        if ($ARGV[$argnum] eq "off") {
                $accion = 0x63;
        }
        if ($ARGV[$argnum] eq "mas") {
                $accion = 0x65;
        }
        if ($ARGV[$argnum] eq "menos") {
                $accion = 0x64;
        }
        if ($ARGV[$argnum] eq "bright") {
                $accion = 0x65;
        }
        if ($ARGV[$argnum] eq "dim") {
                $accion = 0x64;
        }
        if ($ARGV[$argnum] eq "A1") {
                $aparato = 0x66;
        }
        if ($ARGV[$argnum] eq "a1") {
                $aparato = 0x66;
        }
        if ($ARGV[$argnum] eq "A2") {
                $aparato = 0x6E;
        }
        if ($ARGV[$argnum] eq "aseo") {
                $aparato = 0x6E;
        }
        if ($ARGV[$argnum] eq "a2") {
                $aparato = 0x6E;
        }
        if ($ARGV[$argnum] eq "A3") {
                $aparato = 0x62;
        }
        if ($ARGV[$argnum] eq "comedor") {
                $aparato = 0x62;
        }
        if ($ARGV[$argnum] eq "A4") {
                $aparato = 0x6A;
        }
        if ($ARGV[$argnum] eq "salon") {
                $aparato = 0x6A;
        }
        if ($ARGV[$argnum] eq "a3") {
                $aparato = 0x62;
        }
        if ($ARGV[$argnum] eq "a4") {
                $aparato = 0x6A;
        }
        if ($ARGV[$argnum] eq "A5") {
                $aparato = 0x61;
        }
        if ($ARGV[$argnum] eq "A6") {
                $aparato = 0x69;
        }
        if ($ARGV[$argnum] eq "A7") {
                $aparato = 0x65;
        }
        if ($ARGV[$argnum] eq "A8") {
                $aparato = 0x6D;
        }
        if ($ARGV[$argnum] eq "A9") {
                $aparato = 0x67;
        }
        if ($ARGV[$argnum] eq "A10") {
                $aparato = 0x6F;
        }
        if ($ARGV[$argnum] eq "A11") {
                $aparato = 0x63;
        }
        if ($ARGV[$argnum] eq "A12") {
                $aparato = 0x6B;
        }
        if ($ARGV[$argnum] eq "A13") {
                $aparato = 0x60;
        }
        if ($ARGV[$argnum] eq "A14") {
                $aparato = 0x68;
        }
        if ($ARGV[$argnum] eq "A15") {
                $aparato = 0x64;
        }
        if ($ARGV[$argnum] eq "A16") {
                $aparato = 0x6C;
        }
}
#print "se va a $accion el cacharro $aparato\n";
sysopen( CM15A, "/dev/cm15a0", O_RDWR |O_NOCTTY | O_NONBLOCK ) || die "Cannot open device $!";
syswrite CM15A, pack( "CC", 4, $aparato ), 2;
sleep 1;
syswrite CM15A, pack( "CC", 6, $accion ), 2;
close( CM15A );
Básicamente lo hace es ir traduciendo a hexadecimal el código de aparato y función, la verdad no se de donde cogí la información :) Y ya está, reiniciamos sudo:
?
1
/etc/init.d/sudo reload
Nos conectamos a:
?
1
http://ip_raspberrypi
y ya podemos controlar las luces de casa. Que bonito esto del X10 ¿verdad?

Leave a Reply