Simulation d'un onduleur pour l'extinction d'une station sous linux

Page suivante Page précédente Table des matières

2. Réalisation

2.1 La prise

Comme vous avez été voir le UPS-Howto, je vais juste vous rappeler comment fonctionne un onduleur:
L'appareil est branché sur le 220v d'un coté, l'ordinateur se branche sur l'onduleur, et un cable série relie ces deux derniers pour communiquer. Les diverses informations fournies par l'onduleur sont:
Nous allons donc faire croire qu'un onduleur envoi un signal 'coupure réseau électrique' à notre linuxette.
Pour cela, nous avons besoin de peu de matériel: Les prises ont les broches numérotées (normalement), mais voici un rappel de leurs positions:
      ------------------------- 
      \   5   4   3   2   1   /       shema d'une prise série femelle, vue de face
       \    9   8   7   6    /         (de toute façon, les chiffres sont gravés sur la prise)
        ---------------------


et voici comment connecter les composants:
                     +------------------------o  DTR (broche n°4)
                     |
                   +---+
                   |   | resistance
                   |   | 10 kilo-Ohm
                   |   |
                   +---+                     
                     |
       +-----o-------+------------------------o  DCD (broche n° 1)
       |
       o  bouton poussoir
     \     ou
      \   mini interrupteur
       |
       +-----o--------------------------------o  GND (broche n° 5)

Le DTR est maintenu haut.
Lorsque vous basculez le bouton, l'ordinateur détecte la descente de la ligne DCD.
Lorsque cela arrive, il lance une sequence shutdown...

A priori, le montage ne devrait pas poser de problème... Meme moi, j'y suis arrivé!
Je pense meme que l'on pourrai ajouter un autre interrupteur, sur une autre broche, puis recuperer cette autre donnée pour en faire ce que l'on veut.

Pour rappel, je met ici, quelques info sur l'assignement des broches du port série, ainsi que les correspondances entre les signaux de terminal et des broches du port série. Ces correspondances, sont reprise du HOWTO-UPS, qui les a reprise du document de David Tal : "Câbles et connecteurs fréquemment utilisés".

DB-25	DB-9	Nom	EIA	CCITT	DTE-DCE		Description		Broche Broche
---------------------------------------------------------------------------------------------------
1	 	 FG	 AA	 101	 ---		 Masse de chassis	 GND
2	 3	 TD	 BA	 103	 --->		 Données transmises,	 TxD
3	 2	 RD	 BB	 104	 <---		 Données reçues,	 RxD
4	 7	 RTS	 CA	 105	 --->		 Requête pour envoyer
5	 8	 CTS	 CB	 106	 <---		 Prêt à envoyer
6	 6	 DSR	 CC	 107	 <---		 Jeu de données prêt
7 	 5	 SG	 AB	 102	 ----		 Masse de signal,	 GND
8	 1	 DCD	 CF	 109	 <---		 Détection de porteuse
9		 --	 --	 -	 -		 Tension positive continue de test
10		 --	 --	 -	 -		 Tension négative continue de test
11		 QM	 --	 -	 <---		 Mode d'égalisation
12		 SDCD	 SCF	 122	 <---		 Détection de porteuse secondaire
13		 SCTS	 SCB	 121	 <---		 Prêt à envoyer secondaire
14		 STD	 SBA	 118	 --->		 Données transmise secondaires
15		 TC	 DB	 114	 <---		 Signal d'horloge de l'émetteur
16		 SRD	 SBB	 119	 <---		 Signal d'horloge secondaire du récepteur
17		 RC	 DD	 115	 --->		 Signal d'horloge du récepteur
18		 DCR	 --	 -	 <---		 Horloge divisée du récepteur
19		 SRTS	 SCA	 120	 --->		 Requête pour émettre secondaire
20	 4	 DTR	 CD	 108.2	 --->		 Terminal de données prêt
21		 SQ	 CG	 110	 <---		 Détection de qualité de signal
22	 9	 RI	 CE	 125	 <---		 Indicateur de sonnerie
23		 --	 CH	 111	 --->		 Sélecteur de vitesse de données
24		 --	 CI	 112	 <---		 Sélecteur de vitesse de données
25		 TC	 DA	 113	 <---		 Horloge transmise

---------------------------------------------------------------------------------------------

        1                         13         1         5
      _______________________________      _______________
      \  . . . . . . . . . . . . .  /      \  . . . . .  /    Connecteurs
       \  . . . . . . . . . . . .  /        \  . . . .  /     RS-232 vus de
        ---------------------------          -----------      l'arriére de
        14                      25            6       9       l'ordinateur

|DB25|DB-9|nom | 
+----+----+----+-----------------------------------------------------------------------------
|    |    :DTE : Equipement terminal de données (i.e. ordinateur)
|    |    :DCE : Equipement de communication de données (i.e. modem)
| 3  | 2  :RxD : Données reçues; 1 est transmis "bas", 0 "haut"
| 2  | 3  :TxD : Données envoyées; 1 est transmis "bas", 0 "haut"
| 20 | 4  :DTR : DTE annonce qu'il est alimenté et prêt à communiquer
| 6  | 6  :DSR : DCE annonce qu'il est prêt à communiquer; "bas" raccroche le modem
| 4  | 7  :RTS : DTE demande à DCE la permission d'envoyer des données
| 5  | 8  :CTS : DCE agrée la RTS
| 22 | 9  :RI  : DCE indique au DTE qu'il tente d'établir une connexion
| 8  | 1  :DCD : DCE annonce qu'une connexion est établie
+----+----+----+-----------------------------------------------------------------------------

2.2 Le logiciel

C'est un peu plus compliqué. Nous allons donc commencer par préparer le terrain, faire quelques tests, puis on améliorera après.

En premier, il faut vérifier sur quelle sortie série vous avez branché votre boitier. Pour rappel:

Pour ne pas rechercher à chaque fois , la solution la plus simple, c'est de créer un lien de /dev/ttySx vers, par exemple /dev/ups:
~/genpower-1.0.2/$ su
password:  
/home/admin/genpower-1.0.2/# ln -s /dev/ttyS0 /dev/ups
/home/admin/genpower-1.0.2/# exit
Nous ferons donc toujours référence à ce périphérique, à présent.
Selon votre ditribution, vérifiez si vous avez les autorisations de lecture/écriture sur /dev/ttySx. C'est béte, mais c'est toujours source de perturbation!
A présent, un petit test?
J'ai trouvé le programme suivant sur usenet, écrit par Alessandro Rubini pour tester le port série. Pour vous éviter de refaire cette recherche, vous pouvez trouver l'archive prète à être compilée sur ce site.
Décompactez, compilez, et lancez le petit éxécutable créé:
~/$ tar xzvf genteste.tar.gz
~/$ cd genteste
~/genteste/$ ./compile genteste
~/genteste/$ ./genteste
Voici le résultat chez moi:
~/genteste/$ ./genteste /dev/ups -rts +dtr 1
CTS DTR DCD
0   0   0
0   0   0
0   0   0
0   0   1              <----- je bascule le bouton
0   0   1              <----- je change rien...
0   0   1              <----- idem....
0   0   0              <----- J'ai rebasculé le bonton!
0   0   0
Terminez par 'Control C' pour stopper le processus.

Ce test est positif, mais si vous voulez, vous pouvez aussi en faire un autre avec le package gepower. Récupérer l'archive genpower-1.0.2.tar.gz qui contient les sources de l'utilitaire avec lequel nous allons pouvoir récupérer les signaux sur la prise série.
Ensuite, on décompacte ça et on va dans le répertoire créé:

~/$ tar xzvf genpower-1.0.2.tar.gz
~/$ cd genpower-1.0.2
La prochaine opération, c'est de lire les fichiers README et genpower.docs, puis de créer les executables:
~/genpower-1.0.2/$ make
Surtout pas de make install, on veut juste essayer gentest!
A présent, LE test:
~/genpower-1.0.2/$ ./gentest -d /dev/ups
---------------
DTR = Set
RTS = Cleared

CAR = High  (*)
CTS = Low   ( )
DSR = Low   ( )
RNG = Low   ( )
---------------
DTR = Set                                <----- ici, le bouton est basculé
RTS = Cleared

CAR = Low  (*)
CTS = Low   ( )
DSR = Low   ( )
RNG = Low   ( )
Terminez par 'Control C' pour stopper le processus.

Bon, en principe, ça fonctionne. A présent, mettons tout cela sur la linuxette.

2.3 Installation

Commencez par récupérer l'archive complete, puis décompactez tout ça. Ensuite passez sous root, puis executez install.sh:
~/$ tar xzvf oupsd-1.0.tar.gz
~/$ cd oupsd-1.0/
~/oupsd-1.0/ $ su
passwrd:
~/oupsd-1.0/ # ./install.sh
Si tout c'est bien passé, vous devriez avoir tout d'installé. En tout état de cause, lisez le fichier README!
Pour rappel:
  1. Configuration d'init

  2. Il nous faut avertir correctement Init de ce qu'il doit 'écouter' et quoi faire en fonction des messages, Voici ce que contient mon fichier /etc/inittab:
    ~/$ cat /etc/inittab | grep power
    # What to do when the power fails/returns.
    pf::powerwait:/etc/init.d/powerfail start
    pn::powerfailnow:/etc/init.d/powerfail now
    po::powerokwait:/etc/init.d/powerfail stop
    
    On voit que selon le signal reçu ('pf', 'pn' ou 'po'), Init appelle le script /etc/init.d/powerfail, et lui passe comme argument l'action à effectuer.
    Par défaut, sur ma debian, les lignes ne sont pas commentées, mais le script n'est pas présent, bien sur. Et donc là, on ne change rien!

  3. Le script powerfail

  4. Celui ci est simple, puisque nous n'avons pas besoin de gérer l'interruption de l'arret de la machine (lorsque le courant revient, normalement, l'onduleur peut indiquer à l'ordinateur que celui ci peut reprendre le cours de son travail). De toute façon, le script est tellement simple, que vous pouvez largement l'améliorer!
    Entre autre, vous pouvez changer la commande shutdown par ce que vous voulez! Une fois le script powerfail appelé par init, la commande shutdown sera appele une minute apres. Il doit se trouvez dans /etc/init.d/, porter le nom de powerfail, et n'être executable que par root.

  5. Le demon

  6. Meme remarque que pour le script, nous n'avons pas besoin de quelque chose de très poussé, et donc, on va se contenter d'un démon powerd minimal, basé sur le source original powerd.c, de Miquel van Smoorenburg (je ne suis pas sur de la validité de l'adresse email). Vous pouvez trouver ici meme le source original, trouvé sur le site src.openresources.com. Notre demon ne fait pas grand chose: il regarde le status de la prise, au demarrage du demon, puis attend un changement sur celle ci. Cela permet de placer le bouton dans n'importe quelle position, du momment que le demon le note en premier. Une fois une modification du bouton detectee, le demon attent 15 seconds (afin d'être sur que c'est bien un changement d'etat, puis envoi la commande 'pf' a init. Comme powerfail, le demon ne doit etre executable que par root (par sécurité).

  7. Demande du status actuel

  8. C'est un petit utilitaire que vous pouvez utiliser pour connaitre l'état actuel de la prise. Il se trouve dans /usr/bin, et peut etre appelé soit directement, soit en utilisant le script powerfail de cette facon: /etc/init.d/powerfail status.

A noter: pour la commande d'arret de la machine, utilisez 'man shutdown' pour connaitre l'utilisation de ses parametres, et modifiez dans /etc/init.d/powerfail ceux que j'ai mis, si ceux-ci ne conviennent pas.


Page suivante Page précédente Table des matières

Ce site est continuellement en chantier, surtout la partie 'Journal de bord' (cf 'Documentations').
Cependant, vous pouvez quand même me contacter et me donner vos avis/idées/corrections à rsuinux <at> gmx.fr

Mise en place du site:   11 Juillet 2001     Dernière mise à jour: 11/05/04

Vous êtes     à être passé me voir!

Valid HTML 4.01! Valid CSS!