..:: Domotique Store : Le Blog ::..
Articles Clients Raspberry Tous les articles Vera

Raspberry pi : Créer une passerelle homecinema multifonctions

Sans titre-1

J’aime bien quand tout fonctionne correctement et que c’est automatisé !

Mon problème: j’en ai marre de manipuler ma télécommande de la TV,  du vidéoprojecteur et surtout j’ai peur qu’une coupure de courant fasse éclater ma lampe de vidéoprojecteur.

Problèmes => solutions :

  • un raspberry pi avec sa carte sd, pour interfacer le tout et piloter par une interface web, (malheureusement pour moi 56 € livré avec boitier avant que Mickael ne propose à la vente un raspberry)
  • l’alimentation du raspberry, (7.90 €)
  • un dispositif USB/infrarouge émetteur et récepteur (transceiver en anglais) (38€ livré),
  • un contrôleur USB/rs232 et son câble null-modem (11.95 €),
  • un onduleur avec une connexion USB (environ 70 €)
  • le tout connecté sur hub usb 7 ports (15€).

Ce qui nous fait un total de: 198.95 € donc environ 200 €

Cela coûte mais vu le prix de l’ampoule  d’un vidéoprojecteur et les services rendus, je trouve que c’est très bien.

Je ne vais pas reprendre l’installation du Raspberry, google est votre ami !

L’architecture que j’ai choisie est une api php qui va appeler des scripts bash qui agiront directement sur les périphériques concernés.

Commençons par le plus simple à paramétrer : l’onduleur.

Mon onduleur est un apc ups  de marque Schneider, il possède un port usb qui donne des informations d’autonomie, de voltage et j’en passe. Il possède des prises standards ce qui permet de  connecter facilement ce que l’on veut.

onduleur

Pour le moment je n’ai pas « scripté » de comportement en rapport à une coupure de courant, je le ferai prochainement. L’idée sera lorsqu’il y a une coupure de courant, de mesurer l’autonomie, si celle-ci et trop basse alors prévoir l’extinction du vidéoprojecteur (prévoir que le vidéoprojecteur à besoin de 90 secondes pour s’éteindre).

Pour installer le process qui va le gérer il faut taper:

sudo aptitude install apcupsd

Une fois que celui-ci est installé, il faut aller le paramétrer  dans:

/etc/apcupsd/apcupsd.conf

Ajoutez ou modifier les lignes de façon à avoir:

UPSCABLE usb

UPSTYPE usb

Piloter le vidéoprojecteur:

Le vidéoprojecteur est pilotable à l’aide d’un port rs232.

BenQ W1070

Un adaptateur usb/rs232 avec chipset ftdi suffit pour le piloter.

Selon votre matériel, il faudra adapter la syntaxe.

Pour envoyer des ordres au vidéoprojecteur, j’ai choisi d’utiliser un script bash. C’est puissant, robuste, et surtout proche du matériel.

Voici le fameux script bash:

#!/bin/bash

tty_device="/dev/ttyUSB0"
speed="115200"
stty -F $tty_device $speed -icrnl -ixon
echo -en "\r$1\r" > $tty_device

L’adaptateur est reconnu sur ttyUSB0, la vitesse est de 115200, pour le reste la syntaxe echo envoi l’argument $1 à ttyUSB0 (les retours chariot au début et à la fin sont nécessaires au protocole de mon vidéoprojecteur, à adapter en fonction de votre matériel).

Exemple: pour allumer le vidéoprojecteur, il faut envoyer:

./serial_to_vp.sh "*pow=on#"

 Allumer et éteindre le PC mediacenter:

Ma configuration multimédia est un peu particulière, c’est un pc sous « Mythbuntu », Mythtv gère la partie TV et films enregistrés.

Donc il faut prévoir l’allumage du pc par un wakeonlan:

#!/bin/bash
#wake mythtvbox
wakeonlan "votre adresse mac ici"

Son arrêt:

#!/bin/bash

#arrête le pc mythtvbox

ssh -t user@mythtvbox "sudo /sbin/shutdown -h 0"

Pour pouvoir arrêter le pc, il faut créer une clef rsa qui vous permettra de lancer une syntaxe à travers ssh sans entrer un mot de passe pour le user www-data.

Ensuite la commande shutdown étant réservée à l’utilisateur root sur le pc distant, il faut utiliser les sudoers pour autoriser la syntaxe au user concernée et le paramétrer pour qu’aucun mot de passe ne soit demandé.

La commande infrarouge:

La partie infrarouge est quant à elle gérée avec un dongle usb appelé « Iguanair » de Iguanaworks.

dongle_iguana

Je ne parlerai pas de la partie compilation, le mieux et de suivre ces deux liens:

http://www.iguanaworks.net/wiki/doku.php
https://github.com/iguanaworks/iguanair

Il faut ensuite utiliser lirc avec  les drivers correspondant à Iguanair.

Le script qui va permettre de transmettre des commandes infrarouges est:

#!/bin/bash

#script permettant d'envoyer une commande lirc à un dispositif infrarouge.
irsend set_transmitters 1 3

if [ "$1" = "power_on_amp" ]; then 
irsend send_once sony_test BTN_POWER BTN_POWER
fi

if [ "$1" = "power_off_amp" ]; then
irsend send_once sony_test BTN_POWER BTN_POWER
fi

if [ "$1" = "muting_amp" ]; then
irsend send_once sony_test BTN_MUTING BTN_MUTING 
fi

Il nous manque plus qu’une chose, l’api qui va commander tout ça!

J’ai choisi le language PHP pour sa facilité d’interaction avec le système linux (scripts et autre).

C’est un peu long et peu complexe, mais cela s’adresse tout de même à des personnes quelques peu averties.

Voici son contenu:

<html>
 <head>
  <title>Test PHP</title>
 </head>
 <body>

 <?php
#$output = shell_exec('/home/pi/scripts/temp_proc.sh');
#$output = shell_exec('/home/pi/scripts/launch.sh');
#echo $output;

//initialisation des variables
        if( ! isset( $rate ) ) $rate = "50";
        if( ! isset( $cmd ) ) $command = "empty";
        if( ! isset( $misc ) ) $misc = "empty";
        if( ! isset( $cmd_vp ) ) $command_vp = "empty";
        if( ! isset( $debug ) ) $debug = "no";
        if( ! isset( $cmd_misc) ) $command_misc = "empty";
        if( ! isset( $help ) ) $help = "yes";

$rate = $_GET["rate"];
$command = $_GET["cmd"];
$misc = $_GET["misc"]; 
$command_vp = $_GET["cmd_vp"];
$debug = $_GET["debug"];
$command_misc = $_GET["cmd_misc"];
$help = $_GET["help"];

function string_to_ascii($string)
{
$string_format = exec("/var/www/serial_to_vp.sh $string 2>&1");
#echo $string_format;
}

if ($help == "yes")
{
echo ("menu d'aide passerelle multi-média");
?>

<pre>
cmd_vp => commande vp possible: power, lamp_mode, 3D 
debug => debug à yes fait apparaitre d'autres informations  
cmd_misc => power_status, power_on, power_off, lamp_status, smart_eco, 3D_status, 3D_TB, 3D_SBS 
help => affiche cette aide.
</pre> 

<?php
}

if ($debug == "yes")
{
echo nl2br("la commande demandée est: $command_vp \r");
}
if ($command_vp == "power")
{
        if ($command_misc == "power_status")
        {
        echo nl2br("\rpower_status\r");
        string_to_ascii("*pow=?#");
        }

        elseif ($command_misc == "power_on")

        {
        echo nl2br("\rpower_on\r");
        #exec ("/var/www/wake_pc.sh");
        string_to_ascii("*pow=on#");
        }

        elseif ($command_misc == "power_off")

        {
        echo nl2br("\rpower_off\r");
        string_to_ascii("*pow=off#");
        }

}

if ($command_vp == "lamp_mode")

{
        echo nl2br("\rlamp_mode\r");
        if ($command_misc == "smart_eco")
        {
        string_to_ascii("*lampm=seco#");
        }

        elseif ($command_misc == "Lamp status")
        {
        string_to_ascii("*lampm=?#");
        }
}
if ($command_vp == "3D")

{
        echo nl2br("\r3D\r");
        if ($command_misc == "3D_off")
        {
        string_to_ascii("*3d=off#");
        }

        elseif ($command_misc == "3D_TB")
        {
        string_to_ascii("*3d=tb#");
        }
        elseif ($command_misc == "3D_FS")
        {
        string_to_ascii("*3d=fs#");
        }
        elseif ($command_misc == "3D_SBS")
        {
        string_to_ascii("*3d=sbs#");
        }
}
if ($misc == "amp")
{
        echo nl2br("\ramp\r");
        if ($command == "power_on_amp")
        {
        exec("/var/www/lirc_command.sh power_on_amp");
#       exec ("/var/www/wake_pc.sh");
        }

        elseif ($command == "power_off_amp")
        {
        exec("/var/www/lirc_command.sh power_off_amp");
#       exec ("/var/www/stop_pc.sh");
        }

        elseif ($command == "muting_amp")
        {
        exec("/var/www/lirc_command.sh muting_amp");
        }

}

if ($misc == "pc")
{
        echo nl2br("\rpc\r");
        if ($command == "power_on_pc")
        {
        exec ("/var/www/wake_pc.sh");
        }

        elseif ($command == "power_off_pc")
        {
        exec ("/var/www/stop_pc.sh");
        }

}
if ($rate == "1080p24")
{
exec("/var/www/remote_xrandr.sh 1920x1080 50");
}

if ($rate == "1080p")
{
exec("/var/www/remote_xrandr.sh 1920x1080 51");
}

if ($rate == "1080i")
{
exec("/var/www/remote_xrandr.sh 1920x1080 52");
}

if ($rate == "720p")
{
exec("/var/www/remote_xrandr.sh 1280x720 71");
}

?>

 </body>
</html>

Cette api sera commandée à partir de scènes crées sur une vera2.

Voici un exemple de scène sur une vera2, si je veux regarder un film 2D avec le vidéoprojecteur cela donnera:

--allume l'ampli audio
-- 5 Second timeout
function power_on_amp()
local status, result = luup.inet.wget("https://10.10.1.7/api.php?misc=amp&cmd=power_on_amp", 5)
end

--allumage PC
function power_on_pc()
local status, result = luup.inet.wget("https://10.10.1.7/api.php?misc=pc&cmd=power_on_pc", 5)
end

--allumage Vidéoprojecteur
function power_on_vp()
local status, result = luup.inet.wget("https://10.10.1.7/api.php?cmd_vp=power&cmd_misc=power_on", 5)
end

--passage lampe a smart_eco
function lamp_smarteco()
local status, result = luup.inet.wget("https://10.10.1.7/api.php?cmd_vp=lamp_mode&cmd_misc=smart_eco", 5)
end

--changement mode p24
function rate_p24()
local status, result = luup.inet.wget("https://10.10.1.7/api.php?rate=1080p24", 5)
end

--sequence de démarrage
power_on_amp()
luup.call_delay('power_on_pc', 5)
luup.call_delay('power_on_vp', 40)
luup.call_delay('lamp_smarteco', 50)
luup.call_delay('rate_p24()', 55)

Suivant cet exemple, vous pouvez faire beaucoup de choses.

Voici donc un exemple d’une installation qui vous permettra de tout piloter à partir d’un téléphone sous android.

0
0
Gilles

Voulant "domotiser" ma maison avec un coût raisonnable, j'ai cherché sur le net ce qui se faisait. Etant a l'époque sur windows, les possibilités étaient assez maigre et surtout payante. Tout ceci à eu pour effet de me faire basculer dans le monde formidable de "Linux", sa puissance, sa fiabilité et sa liberté.<br /> Tout ceci cumulé à du zwave et android, nous voilà prêt pour découvrir ce qui peut être réalisé ....

Laisser un commentaire