jeudi 23 décembre 2010

Thunderbird - Gestion des pièces jointes

Pour une mamie, la toute petite icône en bas du mail qui montre la présence d'une pièce jointe est tout sauf fonctionnel.
Déjà, moi je passe à côté une fois sur deux mais la mamie... je vous raconte pas!

D'autre part, l'affichage des photos dans le corps du mail n'est pas très satisfaisant car on ne peut pas voir la photo en entier. Si on veut la voir en entier, on en reviens au même problème : il faut cliquer sur les toutes petites icônes.

Enfin, lorsqu'on veut enregistrer la pièce jointe sur l'ordinateur il faut parcourir l'arborescence ce qui est tout sauf intuitif pour un novice, surtout si le novice à plus de 80 ans ...

Si je savais programmer, j'aurai bien fait une extension pour thunderbird pour gérer ça, mais comme ce n'ai pas le cas je suis obliger d'utiliser celles existantes:


1) Slideshow

Cette petite extension sympa permet de cliquer sur une (trop) petite icône dans la barre des pièces jointes pour déclencher un diaporama.


2) AttachmentExtractor

Voici une deuxième extension vraiment très pratique et fonctionnelle qui permet d'automatiser certaines tâches.
Dans la configuration, il y a un onglet "Extraction automatique" qui permet à l'arrivée du mail :
  • Sauvegarder automatiquement la pièce jointe dans un dossier pré-défini
  • Charger chaque pièce jointe avec l'application par défaut
Comme ça, si il y a plusieurs photos et un film, ils s'ouvrent tous dans une application différente. Et quand la mamie à fini de voir la photo ou le film elle ferme l'application et voit la suivante.

Et voilà, pour le moment....

Noël approche et ça va être le moment de vérité ... voir si la mamie utilise son ordinateur!
Ordinateur pour grand-parents, ordinateur pour papy, ordinateur pour personnes âgée, linux pour mamie, linux pour papy, linux pour personne âgée, linux pour grands-parents.

mercredi 22 décembre 2010

Skype : video en taille double

Skype ... encore lui! Pas très fonctionnel! Enfin on ne se plaint pas, ça reste une béta!  Enfin si, on se plaint quand même que le code source ne soit pas ouvert et qu'ils ne fassent pas plus d'effort pour développer skype sous Linux...

Donc mon problème, c'est que la vidéo se lance par défaut en taille réelle ce qui est trop petit pour ma mamie. Et pour mettre en taille double il faut cliquer sur un petit icône pas très intuitif et sélectionner dans le menu déroulant.

Alors j'ai décidé d'automatiser ça en configurant les évènements de skype (ça par contre c'est hyper pratique et puissant pour lancer des scripts).
J'ai ajouté le script suivant en cas "d'appel répondu "  (ça déclenche que l'appel soit sortant ou entrant) :


Code:
#!/bin/bash
#on affiche le bureau
wmctrl -k on
wmctrl -a Horloge
wmctrl -a nomskype
#on place la fenetre video à la bonne place
wmctrl -a Appel
wmctrl -r Appel -e 0,433,10,-1,-1
  
#on attend par le test suivant que la communication soit démarrée
TEST=$(wmctrl -l | grep Appel |cut -f5 -d " ")
while [ "$TEST" = "Appel" ]
do
 sleep 1
 TEST=$(wmctrl -l | grep Appel |cut -f5 -d " ")
 echo $TEST
done

if [ "$TEST" = "" ];then
{
echo "personne n'a répondu"
exit 0;
}
else
{
sleep 10
#on clique sur l'endroit pour faire apparaître le menu déroulant
#et on tape 5 fois sur tap puis enter pou sélectionner video 200%
xdotool mousemove 544 345 click 1 key Tab key Tab key Tab key Tab key Tab key Return
}
fi
echo ok appel reçu
exit 0;

Après avoir minimisé toutes les fenêtre, on  place la fenêtre de l'appel à la bonne position pour être sûr de cliquer au bon endroit.
Le $TEST= "appel"quand l'appel est en cours sinon = "12:45"(la durée de l'appel) quand l'appel est démarré. Cela permet d'attendre que la connexion soit faite et la vidéo lancée.
D'ailleurs, pour laisser le temps à la vidéo de démarrer on attends 10 secondes (sleep 10) puis on vient cliquer au bon endroit avec xdotool puis on tape 5 fois sur Tab et Enter.
L'intérêt c'est que si la vidéo de l'autre n'est pas lancé, ça clique sur le bureau et il ne se passe rien. Si on avait pas minimisé les autres fenêtres ça cliquerai en dessous.

Bon par contre c'est dommage si le contact n'a pas lancé sa vidéo ...


- Ah ouais, c'est con ça !
- Ben j'y peut rien si le correspondant il est débile;
- Tu pourrais pas te logger au lancement de la communication sur l'ordi de l'autre pour forcer la vidéo?
- Ben non, là c'est vraiment pousser le bouchon trop loin et en plus c'est mal de hacker les autres!


EDIT : Détecter quand la vidéo de l'autre est lancée 

J'ai enfin trouvé comment faire pour détecter quand la vidéo de l'autre est lancée (puisqu'il m'est impossible de communiquer directement avec skype ) et j'ai nommé :

Xdotool
Eh oui, encore lui, car avec l'option xdotool -l -G  on obtiens la liste des fenêtre avec leur dimension.
Hors quand la vidéo de l'autre n'est pas lancée la fenêtre d'appel Skype est toute petite et dès que la vidéo démarre, la fenêtre change de taille.
Il ne reste plus qu'à détecter le changement de taille. J'ai donc réécrit le script dans cette optique :


Code:
#!/bin/bash
#on place la fenêtre vidéo à la bonne place
wmctrl -r Appel -e 0,433,10,-1,-1
  
#on attend par le test suivant que la vidéo soit démarrée ou l'appel finit
VID=$(wmctrl -l -G | grep Appel |cut -f9-11 -d " ")
while [ "$VID" = "294  253" ]
do
 sleep 3
 VID=$(wmctrl -l -G | grep Appel |cut -f9-11 -d " ")
 echo "$VID"
done

#on vérifie que la fenêtre Appel n'est pas fermée
#et on met la vidéo à 200%
TEST=$(wmctrl -l | grep Appel |cut -f5 -d " ")

if [ "$TEST" = "" ];then
{
echo "fenêtre vidéo fermée"
exit 0;
}
else
{
sleep 1
#on clique sur l'endroit pour faire apparaître le menu déroulant
#et on tape 5 fois sur tab puis enter pou sélectionner vidéo 200%
wmctrl -a Appel
xdotool mousemove 544 345 mousedown 1 key Tab key Tab key Tab key Tab key Tab key Return mouseup 1
xdotool mousemove 1110 622
}
fi
exit 0;

Et voili, ça marche nickel. Quand on dit que la nuit porte conseil, j'ai eut cette idée en m'endormant ^^ !
Ordinateur pour grand-parents, ordinateur pour papy, ordinateur pour personnes âgée, linux pour mamie, linux pour papy, linux pour personne âgée, linux pour grands-parents.

dimanche 12 décembre 2010

Gestion des évènements - LE RETOUR !

Accroche toi à ton siège petit scarabée, ça va envoyer du pâté!

1) Objectif


En cas d'appel manqué sur skype ou de mail arrivé je veux:
Si mamie est devant l'ordi :
  Si mamie n'est pas devant l'ordi
  • que ça attende qu'elle revienne
  • que ça joue un son pour dire qu'elle à manqué un appel / qu'un mail est arrivé
  • que ça affiche le profil / affiche thunderbird

 2) Le script

Le script est assez détaillé et commenté. Ci dessous le script pour skype. Celui pour Thunderbird est quasiment identique mais ce n'est pas le même son joué et c'est thunderbird qu'on affiche à la place du script d'évènement skype.

#En bleu les lignes de commentaires et inutiles (genre echo)

Code:
#!/bin/bash

#Vérifie si motion est déjà en marche
MOTION=$(pidof motion)"0"
echo "pid de motion=$MOTION"

while [ "$MOTION" != "0" ]
do
 #on attend que motion s'arrête
 sleep 3
 MOTION=$(pidof motion)"0"
 echo "pid de motion=$MOTION"
 if [ "$MOTION" = "0" ]; then
  {
  echo "motion vient de s'arrêter, qq est devant l'ordi"
  #on lance le script de notification SCRIPT EVENEMENT et on quitte
  sleep 5
  /home/mamie/.motion/motion-wait-phone.sh
  exit 0;
  }
 else
  {
  echo "on continu la boucle while"
  }
 fi
done 
#motion n'est pas en fonctionnement alors on continue


#lancer motion
#si un autre programme utilise déjà la cam alors motion attends
#que la cam soit dispo et continu
motion -c /home/mamie/.motion/motion-2.conf &

sleep 15
#on vérifie si quelqu'un est déjà devant l'ordi
#si oui il y a des images dans le dossier /tmp/motion
IMG=$(du /tmp/motion | cut -f1) 
#efface le contenu du dossier temporaire
rm /tmp/motion/*
service motion stop

if [ $IMG -gt 30 ]; then
{
echo "il y a du monde près de l'ordinateur !!!!!!!"
#on vérifie maintenant si le screensaver est actif ou non 
SCREEN=$(xscreensaver-command -time | cut -f3-4 -d " ")
echo result = $SCREEN
# résult peut être : screen blanked ou screen non-blanked
 if [ "$SCREEN" = "screen blanked" ] ; then
 {
 echo "le screensaver marche "
 #SCRIPT EVENEMENT
 #on désactive le screensaver
 xscreensaver-command -deactivate
 #on joue un son
 play /home/mamie/.son/phone-missed-skype.ogg &
 #on lance le clic sur l'évènement skype
 /home/mamie/.motion/click-event-skype.sh
 #/FIN SCRIPT EVENEMENT
 }
 else
 {
 echo "le screensaver marche pas"
 #on lance seulement le clic sur l'évènement skype
 /home/mamie/.motion/click-event-skype.sh
 }
 fi

}
else
{
echo "personne est devant l'ordi"
#on lance la détection de mouvement qui déclenchera en cas de mouvement le SCRIPT EVENEMENT
motion -c /home/mamie/.motion/motion-phone.conf &
}
fi

exit 0;

Et bien sûr dans le fichier motion-phone.conf , en cas d'évènement ça pointe vers le script suivant (qui est idem à SCRIPT EVENEMENT du code ci-dessus) :


Code:
#!/bin/bash

#mamie est de retour devant l'ordi (script lancé par l'évènement configuré dans motion conf)
# on désactive motion
service motion stop &
#on désactive le screensaver
xscreensaver-command -deactivate
#Vérifie si un son est déjà en marche (si plusieurs évènements)
SON=$(pidof play)"0"
echo "pid de son=$SON"
while [ "$SON" != "0" ]
do
 #on attend que le son en cours s'arrête
 sleep 3
 SON=$(pidof play)"0"
 echo "pid de son en cours=$SON"
done 
echo "le son a fini de jouer"
#on joue un son
play /home/mamie/.son/phone-missed-skype.ogg &
#on lance le clic sur l'évènement skype
/home/mamie/.motion/click-event-skype.sh
rm /tmp/motion/*

exit 0;


Ce script permet en plus de gérer les situations si il y a plusieurs évènements qui se produisent pour les exécuter les uns après les autres quand mamie reviens devant l'ordi.

Ca fait plaisir quand ça marche bien! Mais à écrire, ça fait mal à la tête!

En tous cas, je suis épaté de la puissance des script shell qu'on peut écrire sous UBUNTU et du nombre de programme qui acceptent les lignes de commandes. Ca n'aurait pas été possible sur windows.


Allez, promis si j'ai plus compliqué à faire, la prochaine fois je programme pour de vrai en python!
Ordinateur pour grand-parents, ordinateur pour papy, ordinateur pour personnes âgée, linux pour mamie, linux pour papy, linux pour personne âgée, linux pour grands-parents.

Détection de présence devant l'ordinateur

Comment faire pour savoir quand mamie est revenu dans la pièce pour l'informer d'un évènement?

En fait ce n'est pas très compliqué si google est ton amis! J'ai trouvé un programme qui permet de faire de la vidéo-surveillance avec la webcam... j'ai nommé motion !
Il suffit de vérifier quand le programme détecte du mouvement et lancer un script externe pour prévenir d'un évènement qui s'est produit en son absence!

Il suffit de lancer motion avec le fichier de configuration motion.conf
On peut créer plusieurs fichiers de configuration différent selon ce qu'on veut faire!

Voici les lignes que j'ai modifiées dans motion.conf :

Pour détecter plus rapidement le mouvement j'utilise 5fps :
# Maximum number of frames to be captured per second.
# Valid range: 2-100. Default: 100 (almost no limit).
framerate 5

je lance un script quand motion commence à détecter du mouvement :
# Command to be executed when an event starts. (default: none)
# An event starts at first motion detected after a period of no motion defined by gap
on_event_start /chemin/vers/mon/script.sh %f


Lorsque motion détecte du mouvement, il stocke les images dans /tmp/motion

Pour vérifier si quelqu'un est devant l'ordinateur, il suffit de faire tourner motion 15 secondes (sans la ligne qui lance le script externe) et vérifier si il y a des images stockées dans /tmp/motion = dossier non vide.
Si aucunes image n'est stocké dans motion, on coupe motion et on le relance avec la config qui va lancer le script de l'évènement en cas de mouvement.


- C'est pas clair ton truc !
- Ben si c'est clair, non?
- Non! Sans le texte du script on comprends rien. Pourquoi t'as pas mis le script de détection de mouvement?
- Ben parce-que là, c'est franchement plus compliqué ! 
- M'en fous, j'veux comprendre!
-Ok tu l'auras voulu!


EDIT :  Configuration précise de motion

Le problème avec les webcam de mauvaise qualité, c'est le" bruit" important créé par la webcam quand l'éclairage est faible ou si la pièce est grande. L'éclairage faible entraîne à la fois des artefacts (bruit) et une adaptation progressive de la luminosité et du contraste par la webcam qui est détecté comme des changement massifs de pixels et donc comme du mouvement. Par contre une fois mise au point effectuée, la détection du mouvement fonctionne très bien.
Il faudrait trouver une solution pour attendre que la webcam soit mise au point avant d'enclencher la détection de mouvement.

N'ayant pas réussit à le faire voici les paramètres optimisés :


v4l2_palette 6
framerate 2
threshold 200
switchfilter off   # le switchfilter ne fonctionnne pas
minimum_motion_frames 2
minimum_frame_time 0.5
despeckle EedDl # on peut jouer avec ça pour diminuer le bruit mais ça ne change rien sur la mise au point
lightswitch 100 # ça ne marche pas terrible (normalement ça ne tiens pas compte des changement de luminosité)
noise_level 32
noise_tune on
brightness 145
contrast 128
saturation 64
hue 0
output_motion on #permet de voir seulement le mouvement
output_normal on  #permet de voir l'image capturée en cas de mouvement

Pour plus d'info il y a une super notice avec la fonction des paramètres très détaillée sur le site de motion : ici.

En conclusion, je ne suis que moyennement satisfait de ce dispositif, mais dans 80% des cas ça marche bien.
Ordinateur pour grand-parents, ordinateur pour papy, ordinateur pour personnes âgée, linux pour mamie, linux pour papy, linux pour personne âgée, linux pour grands-parents.

Gestion des évènements skype

L'affichage des évènements sur skype est merdique, c'est un fait! Déjà, moi je sais jamais sur quoi cliquer pour faire disparaître la notification. Je clique sur l'icône dans la barre des notification mais ça ne fait qu'apparaître la fenêtre skype.

Alors je me dit, que pour la mamie, ça va être compliqué. J'ai donc commencé par écrire un script qui, en cas d'appel manqué effacerait la notification et afficherai la fenêtre du contact qui à essayé d'appeler.

A) Le premier script

Pour ça j'ai d'abord utilisé le rigolo Sikuli :


Commentaires : Je clique sur l'icône pour afficher le bureau, puis clique droit sur l'icône d'appel manqué, puis plusieurs fois Tab pour afficher le contact avec enter et enfin je clique sur la croix pour effacer les notifications.

Au passage on voir sur la capture d'écran la souris ÉNORME pour la mamie ;-)


Avantage : sikuli est relativement solide comme script car même si les choses bougent un peu, il retrouve l'image qui va bien pour cliquer au bon endroit.


Inconvénient : Sikuli est très très lent à charger (environ 30 secondes avant qu'il commence les actions).


B) Le second script

Comme je trouvai sikuli trop lent à charger, j'ai écrit un script bash très simple grâce à la commande xdotool :

Code:
#!/bin/bash
/home/mamie/.sikuli/bureau.sh
xdotool mousemove 1268 490 click 3
xdotool mousemove 1313 646 click 1
xdotool mousemove 1574 497 click 1
wmctrl -a profil
exit 0;

La première ligne lance le script qui affiche le bureau et skype, puis xdotool clique droit là ou il faut puis clique sur "Voir le profil" puis clique sur la croix pour fermer l'évènement.
wmctrl -a profil donne le focus sur la fenêtre du profil du contact (c'est utile si le contact à essayé d'appeler plusieurs fois, car alors le profil est réduit).


Avantage : Ce script est vraiment ultrarapide
Inconvénient : Si la fenêtre skype change de place ou de taille ça ne fonctionne plus.

Pour régler le problème de la position de la fenêtre skype, au démarrage comme lorsqu'on clique sur l'icône pour afficher le bureau, il y a la ligne de code suivante :

Code:
wmctrl -r nomutilisateurskype -e 0,1250,370,337,490

Cette ligne permet de retailler la fenêtre skype à la bonne taille et de la positionner au bon endroit.
Et comme le script de gestion d'évènement lance d'abord le script d'affichage du bureau, même si mamie à bouger la fenêtre, elle reviens à sa place avant que xdotool fasse son travail.

Ce second script est à la fois très rapide, car très simple et solide.

- bon, c'est super ton script pour afficher l'appel manqué, mais la mamie, elle va jamais savoir que quelqu'un à essayé de l'appeler si elle n'a pas entendu skype!
- Minute papillon, il suffit de la prévenir quand elle reviendra dans la pièce !
-Ah...bon?
-Ben ouais!
-Mais ... comment c'est possible ça???
-Surprise !!!
Ordinateur pour grand-parents, ordinateur pour papy, ordinateur pour personnes âgée, linux pour mamie, linux pour papy, linux pour personne âgée, linux pour grands-parents.