Domótica, parte 2

Esta es una actualización de https://robertjwallace.com/home-automation-smart-home/.

Finalmente estoy empezando a cambiar del sistema X10 a uno más moderno, a pesar del coste. Mi sistema actual es un híbrido entre Philips Hue y X10. Para integrar el X10 con Alexa, uso... Transceptor X10 CM19 con el controlador mochad para Linux, y puente haUn emulador de Philips Hue. Esto me permitió usar Alexa para controlar el sistema X10.

Luego añadí un puente Hue "de verdad". ¿Por qué el Hue? Bueno, a pesar del precio de las bombillas Hue, decidí que era uno de los mejores productos y un día encontré el puente en oferta.

Pero había un par de factores que todavía me atan al sistema X10:

  1. Sensores de movimiento. Uso los sensores de movimiento X10 para encender las luces al entrar en una habitación. Estos cuestan aproximadamente $19.00, mientras que los sensores Hue cuestan $40.00. Los sensores X10 tienen retardos variables para el apagado automático, lo cual también me gusta.
  2. Algunas de mis luminarias de techo tienen varias bombillas, lo que hace que sea bastante costoso utilizarlas con las bombillas Hue.
  3. Algunas de mis luces de techo están completamente cerradas, lo que las hace susceptibles al sobrecalentamiento de las bombillas LED.

Todo iba bien hasta que un día Alexa dejó de detectar y controlar los dispositivos del ha-bridge. Creo que probablemente se deba a una actualización de software. Buscando en internet no encontré ninguna solución. Y como ya me había acostumbrado al control por voz, decidí que era hora de convertir más habitaciones a Hue.

El principal problema que quería solucionar era que los sensores de movimiento X10 funcionaran con las luces Hue. Por suerte, había una solución.

El CM19A y el mochad usan el puerto 1099. Si observa el tráfico del puerto, puede ver los comandos inalámbricos X10 transmitidos y recibidos usando el comando "nc" de Linux:

host local de Carolina del Norte 1099
15/11 07:53:20 Tx RF HouseUnit: M15 Función: Activada
15/11 07:53:22 Comando de cámara RF desconocido
15/11 07:53:22 5D 14 27 D8 80
15/11 07:53:22 Rx RF HouseUnit: M15 Función: Activada
15/11 07:53:22 Tx RF HouseUnit: M15 Función: Apagado
15/11 07:53:25 Rx RF HouseUnit: M16 Func: Apagado
15/11 07:53:26 Tx RF HouseUnit: M12 Función: Activada

Los dispositivos Philips Hue se pueden encender mediante un comando de protocolo HTTP que se puede enviar al puente mediante el comando “curl” de Linux:

curl –solicitud PUT –datos '{“on”:true}' http://192.168.254.26/api/$apikey/lights/$unit/state

Entonces todo lo que tuve que hacer fue escribir un programa corto con Perl para monitorear el puerto y cuando el programa vio el comando X10 correcto, que era un sensor de movimiento, disparó el comando "curl".

Decidí usar la tubería de Linux para ingresar los datos “nc” al programa Perl, por lo que el comando para comenzar a monitorear el puerto en segundo plano es:

nc localhost 1099 | perl motion.pl &

El programa Perl solo controla los sensores X10 que se utilizan para controlar los dispositivos Hue. Los demás sensores X10 siguen funcionando con normalidad.

Una vez configurado todo, Motion.pl monitorea el tráfico en el puerto 1099 y, al detectar un comando X10 válido, verifica si corresponde a un sensor que controla una luz Hue. De ser así, motion.pl realiza una llamada de sistema a un script de Bash y, a continuación, llama a huecmd.pl para encender o apagar la luz Hue.

Motion.pl

#!/usr/bin/perl -w usar estricto; usar JSON; usar HTTP::Request::Common; usar LWP; # apikey para comunicarse con el puente hue my $apikey = "********************************"; sub gethuenames{ # enviar solicitud a hue para devolver json con datos de luz my $agent = LWP::UserAgent->new; my $url = "http://192.168.999.26/api/".$apikey."/lights"; my $response = $agent->get($url); my $lights = decode_json($response->content); my %obj; mientras ((mi $key, mi $ele) = cada %$lights) { mi $name = %$ele{'name'}; $obj{"$name"} = "$key"; } devolver %obj; } # # obtiene la lista de nombres y números de dispositivos Hue como un hash de "hue name" => "hue number" mi %huenames = gethuenames(); # # El programa obtiene la salida de "nc localhost 1099" (monitorea el tráfico X10 a través de # mochad) y busca comandos que coincidan con los sensores de movimiento. Cuando encuentra uno, dispara un comando del sistema para encender o apagar el dispositivo Hue correspondiente. Tabla hash # de códigos de unidad de sensor de movimiento para verificar. Si se cambia el código de un sensor # o se añade un nuevo sensor de movimiento, esta tabla debe actualizarse. El hash del sensor de movimiento # es x10 unidad => nombre de la luz de tono. my %motionsensors = ( 12 => ['luz de entrada'], 14 => ['spare room 1','spare room 2'] ); # # bucle infinito que analiza la salida del programa de tubería nc # Cuando la línea nc = M3 activado, se enciende la lámpara de tono número 6 while(1) { my $line = readline(STDIN); # obtiene la entrada nc # verifica si es un comando válido if ($line =~ /Rx\s*RF\s*HouseUnit:\s*M(\S*)\sFunc:\s*(On|Off)/) { my $unit = $1; my $cmd = lc $2; if (exists $motionsensors{$unit}) # ¿es este un sensor para controlar una luz Hue? { my @list = @{ $motionsensors{$unit} }; if ($cmd eq "on") { $cmd = "true"; } else { $cmd = "false"; } foreach (@list) { system("perl /home/bob/Domótica/mochad-0.1.17/huecmd.pl \"$_\" $cmd"); } } } }

script bash huecmd

echo "ejecutar comando hue: " echo $1 echo $2 /usr/bin/perl /home/bob/Home-Automation/mochad-0.1.17/huecmd.pl "$1" $2 > log.txt

Programa Perl huecmd

#!/usr/bin/perl #use strict; use JSON; use HTTP::Request::Common; use LWP; # # Se necesita una clave API para el tono. Consulte el sitio web para desarrolladores de tonos: # https://developers.meethue.com/develop/get-started-2/ # my $apikey = "**************************"; sub gethuenames{ my $agent = LWP::UserAgent->new; my $url = "http://192.168.999.26/api/".$apikey."/lights"; my $response = $agent->get($url); my $lights = decode_json($response->content); mi %obj; mientras ((mi $key, mi $ele) = cada %$lights) { mi $name = %$ele{'nombre'}; $obj{"$name"} = "$key"; } devolver %obj; } mi %obj = gethuenames(); mi $device = @ARGV[0]; mi $devnum = $obj{$device}; mi $cmd = '{"on":'.@ARGV[1]."}"; mi $url = "http://192.168.999.26/api/$apikey/lights/$devnum/state"; my $ua = LWP::UserAgent->new; # Crear una solicitud my $req = HTTP::Request->new(PUT => $url); $req->content_type('application/json'); $req->content($cmd); # Pasar la solicitud al agente de usuario y obtener una respuesta my $res = $ua->request($req); # Verificar el resultado de la respuesta if ($res->is_success) { print $res->content; } else { print $res->status_line, "n"; }

Deja un comentario

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