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.
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.
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.
Je ne parlerai pas de la partie compilation, le mieux et de suivre ces deux liens:
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.