30/09/2012 à 22:26:20 - Aucun commentaire
Problématique: quand j'écoute de la musique chez moi, je n'entends pas toujours la sonnette. Contexte: j'ai acheté un Raspberry Pi sans trop savoir ce que j'allais en faire. Résultat: une sonnette améliorée !
Le matériel
Un Raspberry Pi avec Raspbian comme système d'exploitation.
Une Webcam qui trainaît dans un tiroir (en l'occurence un EyeToy de Playstation 2, qui fonctionne directement sous Raspbian).
Le résultat
La webcam est branchée sur le Raspberry Pi, et est pointée en direction de la porte d'entrée, au travers d'une fenêtre adjacente à celle-ci. Quand quelqu'un se présente devant ma porte d'entrée, l'évènement est détecté, et une notification s'affiche directement sur mon bureau KDE.
La mise en place
Motion est utilisé pour détecter les mouvements.
Il se configure dans /etc/motion/motion.conf. Pour éviter les faux-positifs, j'ai modifié les paramètres suivants:
threshold 3000
lightswitch 70
Pour pouvoir me connecter au flux vidéo depuis mon portable:
webcam_localhost off
Pour lancer la notification quand un évènement est détecté:
on_event_start /home/motion/bin/motionnotify.sh
Une fois l'évènement détecté, la commande notify-send (du paquet libnotify-bin) permet d'afficher la notification.
Notify-send ne fonctionnant qu'en local, les scripts python suivants permettent de l'utiliser en réseau:
http://ubuntuforums.org/showthread.php?t=1222502
Le client (/home/motion/bin/notifyclient.sh):
#!/usr/bin/env python
#network notify-send
import socket
import sys
host = '192.168.1.10' #server IP
port = 50000
size = 1024
title = sys.argv[1]
message = sys.argv[2]
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.send('\"' + title + '\" \"' +message+'"')
data = s.recv(size)
s.close()
Le serveur (/home/utilisateur/bin/notifyserver.sh):
#!/usr/bin/env python
# Network Listener for notify-send
import socket
import os
host = ''
port = 50000
backlog = 5
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(backlog)
while 1:
client, address = s.accept()
data = client.recv(size)
if data:
client.send(data)
cmd = 'notify-send ' + data
os.system(cmd)
client.close()
Un petit script qui va appeler le client, avec un lien vers le flux vidéo, pour voir qui se trouve devant la porte (/home/motion/bin/motionnotify.sh):
#!/bin/sh
logger "Motion detected"
/home/motion/bin/notifyclient.sh "Porte" "Il y a quelqu'un à la porte.\<br /\>\<br /\>\<a href=\"http://raspberry.local:8081\"\>Voir le flux\</a\>"
Motion crée un utilisateur "motion", le script doit donc être exécutable par cet utilisateur.
Et voilà, je peux écouter de la musique très fort :)