{"id":748,"date":"2010-08-24T18:49:43","date_gmt":"2010-08-24T17:49:43","guid":{"rendered":"http:\/\/blog.guiguiabloc.fr\/?p=748"},"modified":"2011-05-14T16:20:13","modified_gmt":"2011-05-14T15:20:13","slug":"domotique-synthese-vocale-pulseaudio-en-unicast-zoneminder-et-xap-avec-un-soupcon-de-sec","status":"publish","type":"post","link":"http:\/\/blog.guiguiabloc.fr\/index.php\/2010\/08\/24\/domotique-synthese-vocale-pulseaudio-en-unicast-zoneminder-et-xap-avec-un-soupcon-de-sec\/","title":{"rendered":"Domotique : synth\u00e8se vocale, Pulseaudio en unicast, Zoneminder et xAP, avec un soup\u00e7on de Sec&#8230;"},"content":{"rendered":"<p>En voila du titre bien d\u00e9cousu \ud83d\ude42<\/p>\n<p>En fait, j&rsquo;ai passer quelques semaines a mettre en place diff\u00e9rentes solutions dans mon environnement domotique et plut\u00f4t que d&rsquo;en faire plein de petits billets, j&rsquo;ai d\u00e9cid\u00e9 de tout regrouper en un, \u00e0 vous de piocher dedans \ud83d\ude00<\/p>\n<p>Pour r\u00e9sumer la situation, je voulais d&rsquo;abord que mon serveur Domotique \u00ab\u00a0parle\u00a0\u00bb (\u00e7a c&rsquo;est plut\u00f4t simple), que lorsque j&rsquo;allume mon portable au sous-sol, j&rsquo;entende les messages audio du serveur (la \u00e7a se complique, si comme moi, vous ne souhaitez pas faire du multicast dans votre LAN), et enfin, comble du geekissime domotique, je voulais r\u00e9cup\u00e9rer en temps r\u00e9el les alarmes Zoneminder d\u00e8s la d\u00e9tection d&rsquo;un mouvement dans le champ de la cam\u00e9ra et que mon serveur Domotique me l&rsquo;annonce de sa douce voix (la, \u00e7a se complique beaucoup, vous verrez&#8230;)<\/p>\n<p>Bref, apr\u00e8s plusieurs semaines, tout cela fonctionne, voyons comment.<\/p>\n<ul>\n<li><strong>SYNTHESE VOCALE ou comment faire parler une machine<\/strong><\/li>\n<\/ul>\n<p>Pour l&rsquo;installation d&rsquo;un synth\u00e8se vocale sur un serveur Linux, rien de plus simple.<\/p>\n<p>Plut\u00f4t que de refaire un \u00e9ni\u00e8me billet a ce sujet, je vous renvoie vers le blog de Christophe Nowicki dont je vous avez d\u00e9j\u00e0 parler, qui explique tr\u00e8s bien la fa\u00e7on de le faire :<\/p>\n<p><a title=\"http:\/\/www.csquad.org\/2009\/08\/27\/text-to-speech-avec-espeak-mbrola-et-speech-dispatcher\/\" href=\"http:\/\/www.csquad.org\/2009\/08\/27\/text-to-speech-avec-espeak-mbrola-et-speech-dispatcher\/\" target=\"_blank\">http:\/\/www.csquad.org\/2009\/08\/27\/text-to-speech-avec-espeak-mbrola-et-speech-dispatcher\/<\/a><\/p>\n<p>Il existe bien s\u00fbr d&rsquo;autre tutos, mais Christophe a beaucoup travailler sur le \u00ab\u00a0son\u00a0\u00bb en Domotique et son blog regorge d&rsquo;infos int\u00e9ressantes.<\/p>\n<p>Bilan apr\u00e8s installation, un syst\u00e8me de synth\u00e8se vocale install\u00e9 sous \/opt\/mbrola<\/p>\n<p>et bien s\u00fbr, les commandes essentielles \u00e0 la cr\u00e9ation et gestion des \u00ab\u00a0voix\u00a0\u00bb :<\/p>\n<p>(ps : fr4 est une voix fran\u00e7aise f\u00e9minine, bizarrement je pr\u00e9f\u00e8re :-p )<\/p>\n<p>(NB: a l&rsquo;attention de Fred, je n&rsquo;arrive pas a reproduire la voix de Karen Cheryl&#8230; D\u00e9sol\u00e9&#8230; (ou tant mieux pour nous&#8230;)<\/p>\n<p>&#8211; Convertir le texte \u00e9crit dans le fichier \u00ab\u00a0texte\u00a0\u00bb en un phon\u00e8me compr\u00e9hensible par Mbrola<\/p>\n<p>espeak -x -v mb\/mb-fr4 -f texte &gt; texte.pho<\/p>\n<p>&#8211; Faire parler le serveur en lisant le phon\u00e8me<\/p>\n<p>mbrola -t 1.0 -e -C \u00ab\u00a0n n2\u00a0\u00bb \/opt\/mbrola\/fr4\/fr4 texte.pho -.au | aplay<\/p>\n<p>&#8211; Convertir la phrase lue par mbrola en un fichier Wav<\/p>\n<p>mbrola -e -C \u00ab\u00a0n n2\u00a0\u00bb \/opt\/mbrola\/fr4\/fr4 texte.pho texte.wav<\/p>\n<p>(pour les options mbrola que j&rsquo;utilise, t = la vitesse de lecture, voir la doc officielle)<\/p>\n<p>Pour lire le wav en ligne de commande, mplayer est votre ami.<\/p>\n<ul>\n<li><strong>PULSEAUDIO ou le son en r\u00e9seau<\/strong><\/li>\n<\/ul>\n<p>Voila la partie o\u00f9 j&rsquo;ai passer le plus de temps.<\/p>\n<p>Je souhaitais r\u00e9cup\u00e9rer le son \u00e9mis par mon serveur sur mon portable connect\u00e9 en Wi-Fi.<\/p>\n<p>Le premier serveur de son qui m&rsquo;est venu a l&rsquo;esprit fut bien sur <a title=\"PulseAudio\" href=\"http:\/\/www.pulseaudio.org\/\" target=\"_blank\">Pulseaudio<\/a>.<\/p>\n<p>C&rsquo;est l\u00e0 que les complications sont arriv\u00e9es&#8230;<\/p>\n<p>Pulseaudio peut fonctionner en multicast, comprendre que le son est diffus\u00e9 dans tout le LAN, il peut m\u00eame s&rsquo;int\u00e9grer a <a title=\"Avahi\" href=\"http:\/\/fr.wikipedia.org\/wiki\/Avahi_(logiciel)\" target=\"_blank\">Avahi<\/a> (le mDNS type \u00ab\u00a0Bonjour\u00a0\u00bb).<\/p>\n<p>Sauf que moi le multicast, j&rsquo;aime pas \u00e7a (va comprendre Charles&#8230;) et qui plus est, j&rsquo;ai un LAN segment\u00e9 par VLAN et centralis\u00e9 par du Cisco, et la conf multicast sous Cisco, ca me fait mal au cr\u00e2ne \ud83d\ude42<\/p>\n<p>Donc, out le multicast, je veux de l&rsquo;unicast TCP (bah oui, j&rsquo;aime bien les trames r\u00e9seaux bien proprettes \ud83d\ude00 )<\/p>\n<p>L&rsquo;installation de Pulseaudio sous Debian Lenny passe par un apt-get install tout simple (n&rsquo;oubliez pas pulseaudio-utils)<\/p>\n<p>C\u00f4t\u00e9 configuration sur le serveur Domotique :<\/p>\n<pre lang=\"text\">srvdomotique:\/etc\/pulse# cat default.pa\r\n#!\/usr\/bin\/pulseaudio -nF\r\n.nofail\r\nload-sample-lazy pulse-hotplug \/usr\/share\/sounds\/startup3.wav\r\n.fail\r\n.ifexists module-hal-detect.so\r\nload-module module-hal-detect\r\n.else\r\nload-module module-detect\r\n.endif\r\n### Load several protocols\r\n.ifexists module-esound-protocol-unix.so\r\nload-module module-esound-protocol-unix socket=\"\/tmp\/.esd\/socket\"\r\n.endif\r\nload-module module-native-protocol-unix\r\nload-module module-esound-protocol-tcp auth-anonymous=1\r\nload-module module-native-protocol-tcp listen=192.168.43.100 auth-anonymous=1\r\nload-module module-tunnel-sink server=192.168.8.201 sink_name=copie\r\nload-module\u00a0 module-combine sink_name=combined master=\"copie\" slaves=\"alsa_output.pci_10de_3f0_alsa_playback_0\"\r\n.ifexists module-gconf.so\r\n.nofail\r\n#load-module module-gconf\r\n.fail\r\n.endif\r\n### Automatically restore the volume of playback streams\r\nload-module module-volume-restore\r\nload-module module-default-device-restore\r\nload-module module-rescue-streams\r\nload-module module-suspend-on-idle\r\n.ifexists module-x11-publish.so\r\n.nofail\r\nload-module module-x11-publish\r\n.fail\r\n.endif\r\nset-default-sink combined<\/pre>\n<p>Petite explication.<\/p>\n<p>La ligne : \u00ab\u00a0load-module module-native-protocol-tcp listen=192.168.43.100 auth-anonymous=1\u00a0\u00bb signifie que vous \u00e9coutez sur l&rsquo;ip 102.168.43.100 et que vous autorisez les connexions anonymes (on va filter au niveau ACL du cisco)<\/p>\n<p>La ligne : \u00ab\u00a0load-module module-tunnel-sink server=192.168.8.201 sink_name=copie\u00a0\u00bb<\/p>\n<p>d\u00e9signe le \u00ab\u00a0client\u00a0\u00bb qui va \u00e9couter les sons \u00e9mis par le serveur domotique (en fait le client est le serveur domotique qui va \u00e9mettre le son vers un serveur pulseaudio distant \u00e0 l&rsquo;ip 192.168.8.201&#8230;)<\/p>\n<p>La ligne : \u00ab\u00a0load-module\u00a0 module-combine sink_name=combined master=\u00a0\u00bbcopie\u00a0\u00bb slaves=\u00a0\u00bbalsa_output.pci_10de_3f0_alsa_playback_0&Prime;\u00a0\u00bb<\/p>\n<p>g\u00e9n\u00e8re un \u00ab\u00a0sink\u00a0\u00bb (une destination audio si vous pr\u00e9f\u00e9rez), qui comprend ET le pc a l&rsquo;adresse 192.168.8.201 (alias copie) ET la carte son du serveur Domotique.<\/p>\n<p>Flux par d\u00e9faut : set-default-sink combined<\/p>\n<p>Ce qui veut dire que tout son \u00e9mis doit \u00eatre diffus\u00e9 simultan\u00e9ment sur la carte son du serveur Domotique (je peux donc l&rsquo;entendre par les enceintes branch\u00e9es dessus) et sur les enceintes du PC client.<\/p>\n<p>C&rsquo;est clair ?<\/p>\n<p>Sur le serveur Domotique, dont le syst\u00e8me de son est g\u00e9r\u00e9 par ALSA, je sp\u00e9cifie que tout les sons doivent \u00eatre envoy\u00e9s au d\u00e9mon PulseAudio grace au fichier \/etc\/asound.conf<\/p>\n<pre lang=\"text\">srvdomotique:\/etc# more asound.conf\r\npcm.pulse {\r\ntype pulse\r\n}\r\n\r\nctl.pulse {\r\ntype pulse\r\n}\r\n\r\npcm.!default {\r\ntype pulse\r\n}\r\n\r\nctl.!default {\r\ntype pulse\r\n}<\/pre>\n<p>Reste \u00e0 lancer pulsaudio (ou par la commande pulseaudio -Cvvv pour voir ce qui se passe ou par la commande pulseaudio -D pour le daemoniser en arri\u00e8re plan).<\/p>\n<p>Les sons \u00e9mis par votre serveur doivent \u00eatre audible sur les enceintes de celui-ci.<\/p>\n<p>Sur le PC client (mon portable en l&rsquo;occurence), installation de pulseaudio normale, puis un default.pa comme suit :<\/p>\n<pre lang=\"text\">#!\/usr\/bin\/pulseaudio -nF\r\n.ifexists module-hal-detect.so\r\nload-module module-hal-detect\r\n.else\r\nload-module module-detect\r\n.endif\r\n.ifexists module-esound-protocol-unix.so\r\n.endif\r\nload-module module-native-protocol-unix\r\nload-module module-esound-protocol-tcp auth-anonymous=1\r\nload-module module-native-protocol-tcp listen=192.168.8.201 auth-anonymous=1\r\n.ifexists module-gconf.so\r\n.nofail\r\n.fail\r\n.endif\r\nload-module module-volume-restore\r\nload-module module-default-device-restore\r\nload-module module-rescue-streams\r\nload-module module-suspend-on-idle\r\n.ifexists module-x11-publish.so\r\n.nofail\r\nload-module module-x11-publish\r\n.fail\r\n.endif<\/pre>\n<p>Rien d&rsquo;autre (pas de fichier \/etc\/asound.conf, pas de donn\u00e9es dans client.conf)<\/p>\n<p>Lancer pulseaudio sur le client puis lancer pulseaudio sur le serveur Domotique. Les sons \u00e9mis par le serveur domotique arrive sur le pc portable (m\u00eame dans KDE pour ma part&#8230;)<\/p>\n<p>Oui, MAIS !!!<\/p>\n<p>Le gros probl\u00e8me est que si le PC portable se connecte APRES le d\u00e9marrage de PulseAudio sur le serveur Domotique et bien, cela ne fonctionne plus !!!!<\/p>\n<p>J&rsquo;ai pass\u00e9 des jours a chercher et je n&rsquo;ai pas r\u00e9ussi a comprendre pourquoi le serveur Domotique ne voyait pas le portable se connecter&#8230; J&rsquo;ai tourner dans tout les sens, impossible de le faire marcher comme cela donc si vous avez une solution, je suis preneur !!!<\/p>\n<p>Mais je n&rsquo;allais pas en rester la et donc pour r\u00e9ussir ce tour de force, j&rsquo;ai d\u00e9cider de forcer l&rsquo;enregistrement du pc portable sur le serveur son Domotique via quelques scripts.<\/p>\n<p>Alors, un peu de compassion pour moi, je ne suis pas d\u00e9veloppeur et c&rsquo;est s\u00fbrement tr\u00e8s crado comme code mais au moins \u00e7a marche :-p<\/p>\n<p>&#8211; Technique d&rsquo;enregistrement d&rsquo;un client PulseAudio via socket en Python.<\/p>\n<p>Sur le serveur Domotique, on va faire tourner un petit serveur cod\u00e9 en Python qui \u00e9coute sur le port tcp 12345 :<\/p>\n<pre lang=\"python\">srvdomotique:~# cat pulseserver.py\r\n#!\/usr\/bin\/python\r\nimport socket\r\nimport subprocess\r\nimport sys\r\nimport os\r\nservsock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)\r\n\r\ntry:\r\n    servsock.bind(('',12345))\r\n\r\nexcept socket.error:\r\n        print \"Relance Pulse\"\r\n        pidpulse = subprocess.Popen(\"ps acx | grep pulseaudio | awk '{print $1}'\", shell=True, stdout=subprocess.PIPE)\r\n        pid = pidpulse.stdout.read()\r\n        print pid\r\n        os.kill(int(pid), 9)\r\n        pidpulse.stdout.close()\r\n        subprocess.call([\"pulseaudio -D\"],shell=True)\r\n        servsock.bind(('',12345))\r\n\r\nservsock.listen(1)\r\nwhile True:\r\nsock,addr = servsock.accept()\r\necho = sock.recv(1024)\r\nsubprocess.call([\"\/home\/scripts\/enregistrement_station.sh\"],shell=True)\r\nsock.send(echo)\r\nsock.close()<\/pre>\n<p>Quand le client se connecte, le serveur domotique lance le script enregistrement_station.sh :<\/p>\n<pre lang=\"bash\">#!\/bin\/bash\r\nPIDPULSE=` ps acx | grep pulseaudio | awk '{print $1}'`\r\nkill -9 $PIDPULSE\r\npulseaudio -D\r\nsleep 2\r\nmplayer \/opt\/sound\/notify.wav\r\nmbrola -t 1.1 -e -C \"n n2\" \/opt\/mbrola\/fr4\/fr4 \/opt\/mbrola\/enregistrement_station.pho -.au | aplay<\/pre>\n<p>Dans \/etc\/rc.local, vous n&rsquo;avez plus qu&rsquo;a rajouter la ligne :<br \/>\n\/cheminduscript\/pulseserver.py &amp;<br \/>\npour le lancer au boot du serveur.<\/p>\n<p>C\u00f4t\u00e9 PC portable, le script de connexion.sh :<\/p>\n<pre lang=\"bash\">#!\/bin\/bash\r\nPIDPULSE=` ps acx | grep pulseaudio | awk '{print $1}'`\r\n# On allume le haut-parleur a 80%\r\namixer -q set Master 80%,80%  unmute\r\nif  test -n \"$PIDPULSE\"\r\nthen\r\necho \"pulseaudio actif\"\r\nelse\r\npulseaudio -D\r\nfi\r\nsleep 1\r\npython \/home\/guiguiabloc\/pulseclient.py\r\nexit 0<\/pre>\n<p>Et le client en python (pulseclient.py)<\/p>\n<pre lang=\"python\">#!\/usr\/bin\/python\r\nimport socket\r\nclient = socket.socket(socket.AF_INET,socket.SOCK_STREAM)\r\nhost = 'srvdomotique'\r\nport = 12345\r\nprint 'Connexion sur ', host, port\r\nclient.connect((host, port))\r\nclient.close<\/pre>\n<p>Je vous le con\u00e7ois, c&rsquo;est bourrin&#8230;<br \/>\nQuand le portable lance le script \u00ab\u00a0connexion.sh\u00a0\u00bb, il lance pulseaudio en local, se connecte au serveur domotique sur le port 12345 qui kill son pulseaudio et le relance, puis fait dire au serveur domotique une phrase annon\u00e7ant l&rsquo;enregistrement de la station.<br \/>\nMais au moins \u00e7a marche&#8230;<\/p>\n<p>Donc si vous avez d&rsquo;autres solutions, je suis \u00e0 votre \u00e9coute \ud83d\ude00<\/p>\n<ul>\n<li><strong>ZONEMINDER et xAP (avec un soup\u00e7on de SEC)<\/strong><\/li>\n<\/ul>\n<p>Derni\u00e8re \u00e9tape de mon travail, mon zoneminder.<\/p>\n<p>ZoneMinder, c&rsquo;est \u00ab\u00a0vachement\u00a0\u00bb bien, \u00e7a fait plein de truc par d\u00e9faut mais il me manquait une fonction essentielle.<\/p>\n<p>Quand l&rsquo;on positionne ses cam\u00e9ras en mode \u00ab\u00a0Modect\u00a0\u00bb, il d\u00e9tecte les mouvements dans la zone que vous avez d\u00e9finie et enregistre la s\u00e9quence. Une fois achev\u00e9e, il vous envoie un email pour vous pr\u00e9venir d&rsquo;un mouvement et vous donne le lien vers le \u00ab\u00a0film\u00a0\u00bb.<\/p>\n<p>Super, mais entre le moment o\u00f9 ZoneMinder d\u00e9clenche l&rsquo;enregistrement, l&rsquo;ach\u00e8ve apr\u00e8s un temps pr\u00e9-d\u00e9fini (j&rsquo;utlilise un buffer de 10 secondes avant et 30 secondes apr\u00e8s), et vous envoie le mail, bah il se passe plusieurs secondes, voir minutes.<\/p>\n<p>Ce que je voulais c&rsquo;est que d\u00e8s qu&rsquo;un mouvement \u00e9tait d\u00e9tect\u00e9 par la cam\u00e9ra, ZoneMinder me pr\u00e9vienne d&rsquo;une mani\u00e8re ou d&rsquo;une autre. Dans mon cas, en me l&rsquo;annon\u00e7ant de sa douce voix (via mbrola).<\/p>\n<p>Ce n&rsquo;est pas natif dans les fonctions de ZoneMinder et mon bonheur je l&rsquo;ai trouv\u00e9 (apr\u00e8s moults recherches je vous l&rsquo;avoue), chez <a title=\"xAP\" href=\"http:\/\/www.xapautomation.org\/index.php?title=Getting_started\" target=\"_blank\">xAP<\/a>.<\/p>\n<p>Pour r\u00e9sumer, xAP est un protocole open d\u00e9di\u00e9 a l&rsquo;automatisation. C&rsquo;est la premi\u00e8re fois que j&rsquo;en entendais parler et les fonctionnalit\u00e9s sont nombreuses et puissantes.<\/p>\n<p>Et l&rsquo;une de ses nombreuses fonctionnalit\u00e9s justement, c&rsquo;est sa possibilit\u00e9 d&rsquo;int\u00e9gration avec ZoneMinder, via un script perl nomm\u00e9 ZMXAP.<\/p>\n<p>En fait, au fin fond du WiKi Zoneminder, on trouve un article dessus :<\/p>\n<p><a title=\"http:\/\/www.zoneminder.com\/wiki\/index.php\/Zmxap\" href=\"http:\/\/www.zoneminder.com\/wiki\/index.php\/Zmxap\" target=\"_blank\">http:\/\/www.zoneminder.com\/wiki\/index.php\/Zmxap<\/a><\/p>\n<p>Ni une ni deux, on se t\u00e9l\u00e9charge le bazar ici :<\/p>\n<p><a title=\"http:\/\/www.limings.net\/xap\/zmxap\/zmxap-v0.9.tar.gz\" href=\"http:\/\/www.limings.net\/xap\/zmxap\/zmxap-v0.9.tar.gz\" target=\"_blank\">http:\/\/www.limings.net\/xap\/zmxap\/zmxap-v0.9.tar.gz<\/a><\/p>\n<p>La conf est trivial, juste a sp\u00e9cifier nohub=1 dans le zmxap.conf et surtout, pour le besoin que j&rsquo;avais, g\u00e9n\u00e9rer un fichier de log avec la variable log_file = \/tmp\/zmxap.log<\/p>\n<p>Car\u00a0 zmxap est capable d&rsquo;int\u00e9ragir directement avec Zoneminder et donc de recevoir en temps r\u00e9el les informations qui en d\u00e9coulent.<\/p>\n<p>Petit test pour le v\u00e9rifier :<\/p>\n<p>On lance Zmxap.pl avec la variable du path :<\/p>\n<p>\/opt\/scripts\/zmxap\/zmxap.pl -path=\/opt\/scripts\/zmxap &amp;<\/p>\n<p>On passe la cam\u00e9ra en mode \u00ab\u00a0Modect\u00a0\u00bb, on passe devant elle et on regarde ce qui se passe dans le fichier \/tmp\/zmxap.log<\/p>\n<pre lang=\"text\">\r\n24.08.2010 19:32:08 [INFO] (main::loadMonitors): Loading monitors\r\n######## in sendAlarmEvent\r\n####### state=2 and cause=Motion\r\n###### starting fetch of event_data\r\n###### completed fetch of event_data\r\n######## completed sendAlarmEvent\r\n24.08.2010 19:36:03 [INFO] (checkState) Sous_Sol - initiating alarm state\r\n######### completed sendTrackingEvent\r\n24.08.2010 19:36:18 [INFO] (checkState) Sous_Sol - resuming idle state\r\n######## in sendAlarmEvent\r\n####### state=0 and cause=Motion\r\n###### starting fetch of event_data\r\n###### completed fetch of event_data\r\n<\/pre>\n<p>Magique !!!<\/p>\n<p>ZMXAP a d\u00e9tect\u00e9 imm\u00e9diatement le passage (initiating alarm state) puis on voit l&rsquo;enregistrement se faire.<\/p>\n<p>Ne reste plus qu&rsquo;a analyser ce fichier de log en temps r\u00e9el pour remonter l&rsquo;info.<\/p>\n<p>Et qui a-t-il de mieux pour analyser un fichier de log temps r\u00e9el ? hein ? Pourtant je vous en avez d\u00e9j\u00e0 parler :<\/p>\n<p><a title=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/03\/18\/interception-des-erreurs-applicatives-dans-nagios-avec-sec-et-prelude-lml\/\" href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/03\/18\/interception-des-erreurs-applicatives-dans-nagios-avec-sec-et-prelude-lml\/\" target=\"_blank\">http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/03\/18\/interception-des-erreurs-applicatives-dans-nagios-avec-sec-et-prelude-lml\/<\/a><\/p>\n<p>SEC bien s\u00fbr !!!<\/p>\n<p>Allez hop, on se configure notre sec.conf :<\/p>\n<pre lang=\"text\">\r\ntype=single\r\nptype=RegExp\r\npattern=Sous_Sol(.+)alarm\r\ndesc=$0\r\naction=shellcmd\u00a0 \/opt\/scripts\/AUDIO_alarme_soussol.sh\r\n<\/pre>\n<p>le script AUDIO_alarme_soussol.sh ne fait que lire une phrase disant \u00ab\u00a0attention y&rsquo;a un m\u00e9chant monsieur au sous-sol\u00a0\u00bb (ou autre chose hein&#8230;)<\/p>\n<p>Ne reste qu&rsquo;a lancer tout cela ensemble :<\/p>\n<pre lang=\"bash\">\r\n#!\/bin\/bash\r\n\/opt\/scripts\/zmxap\/zmxap.pl -path=\/opt\/scripts\/zmxap &amp;\r\n\/usr\/local\/bin\/sec\/sec.pl -conf=\/usr\/local\/bin\/sec\/etc\/sec.conf -input=\/tmp\/zmxap.log -log \/var\/log\/sec.log &amp;\r\n<\/pre>\n<p>Et voil\u00e0, d\u00e9sormais, en plus d&rsquo;enregistrer les mouvements d\u00e9tect\u00e9s, ZoneMiner vous pr\u00e9vient imm\u00e9diatement d\u00e8s qu&rsquo;il d\u00e9tecte un mouvement !<\/p>\n<p>C&rsquo;est pas beau \u00e7a ?<\/p>\n<p>Voila un tour de ce que j&rsquo;ai mis en oeuvre ses derni\u00e8res semaines, j&rsquo;avoue que pulseaudio m&rsquo;a beaucoup co\u00fbter en temps, essayant de lui faire recharger sa configuration quand il voyait le portable mais sans succ\u00e8s.<\/p>\n<p>En tout cas, d\u00e9sormais, tout fonctionne \u00e0 merveille et apr\u00e8s tout, c&rsquo;est tout ce que l&rsquo;on en attend.<\/p>\n<p>Amusez vous bien \ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En voila du titre bien d\u00e9cousu \ud83d\ude42 En fait, j&rsquo;ai passer quelques semaines a mettre en place diff\u00e9rentes solutions dans mon environnement domotique et plut\u00f4t que d&rsquo;en faire plein de petits billets, j&rsquo;ai d\u00e9cid\u00e9 de tout regrouper en un, \u00e0 &hellip; <a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2010\/08\/24\/domotique-synthese-vocale-pulseaudio-en-unicast-zoneminder-et-xap-avec-un-soupcon-de-sec\/\">Read More <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[137,13,7],"tags":[224,146,106,147,59],"_links":{"self":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/748"}],"collection":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/comments?post=748"}],"version-history":[{"count":32,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/748\/revisions"}],"predecessor-version":[{"id":980,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/748\/revisions\/980"}],"wp:attachment":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/media?parent=748"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/categories?post=748"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/tags?post=748"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}