Archives de l’auteur : clyontech

A propos clyontech

SysAdmin Linux/Oracle qui aime aussi l'électronique

send_smsd ou comment un script devient un daemon

L’envoi de sms pfffff … yaka cliquer !

C’est presque vrai. Mais dès que l’on veut que cela soit fais correctement et proprement cela devient moins simple.

Comme je le disais dans cette précedente page de mon blog. mettre en place un modem GSM c’est facile.

Les scripts d’exemples permettent de rapidement comprendre comment cela fonctionnent, python à d’excellente librairie pour communiquer avec des liaisons série bref que de bonheur.

Non c’est après que viennent ces petites choses qui agacent.

D’abord, une liaison série c’est pas multi-tàche : et pourtant j’en ai bouffé de cette @!$% de liaison RS232 au siècle dernier, mais non avec une liaison série on ne communique qu’avec une seule connexion à la fois.

Comme quoi certain réflexe s’émoussent avec le temps, et comme il est normal que certaines technos disparaissent 🙂

Donc un script qui ouvrent la liaison série pour envoyer les commandes AT, tout seul il marchent, si plusieurs SMS doivent être envoyés et ben il faut le gérer.

Allons y c’est pas sorcier non plus, après tout ne n’ai que 5 SMS à envoyer, on fait un plus gros scripts avec des sleep entre chaque envois, cela marche … presque. En fonction des opérateurs et si votre correspondant est sur le même continent ou non le temps d’envoi est TRES variable.

D’une solution passable, on passe à un solution plus que moyenne bref cela ne me convenait pas du tout.

Et donc naturellement l’idée d’utiliser un fichier FIFO m’est venu. Et donc l’esquisse d’un serveur d’envoi de SMS commençait à poindre le bout de son nez.

Allons y :

un script en shell pour envoyer les infos dans le fifo, ce qu’il y a de bien dans les SMS c’est que c’est court et que cela tient dans une ligne 🙂

un script qui scrutent continuellement le fifo ligne par ligne et qui effectue l’envoi, une ligne = 1 SMS.

Simple, pas tant que cela. Car si pour un raison ou une autre un SMS ne passe pas il faut réessayer un certain nombre de fois avant d’abandonner.

Oui d’accord mais la lecture du fifo est bloquante. Je ne vais pas attendre les n tentatives  pour envoyer les suivants, ou je ne vais pas attendre le prochain SMS pour envoyer ceux qui sont en attente.

faire une boucle qui lit de manière non bloquante le fifo, vérifier que la liste des sms en attente est vide sinon on repart pour un tour.

Heureusement, la communauté python regorge de ressources et d’exemples et après quelques essais la solution est apparu auréolé de lumière quasi divine …

Bref vous trouverez le code complet ici, il n’y a pas encore de procédure d’installation automatique mais bon cela tient en 3 fichiers.

send_sms : le shellscript qui dépose le numéro et le message dans le fifo

send_smsd : le daemon qui lit le fifo et envoi les commandes AT sur le modem (faire un lien avec send_smsd.py)

send_smsd.conf : à configurer en fonction de vos besoins (seul le chapitre MAIN est utilisé, l’autre c’est de la déco)

send_smsd.service : le script init.d spécial SUSE (désolé mais la VM qui en avait besoin était sous SUSE)

Même si je l’utilise en exploitation, je ne le considère pas comme finalisé il reste encore beaucoup de choses à faire. (un seul modem de géré, pas franchement objet etc …)

Mais je me suis bien amusé et cela marche 🙂

A+

chris

Surveillance de la Température : le paramétrage du serveur ZABBIX

Nous avions mon collègue et moi mis en œuvre un serveur Zabbix pour tester et appréhender la supervision.

La chose fut simple à mettre en place, il suffit de télécharger une ‘appliance’ (une machine virtuelle déjà paramétré) et de l’incorporer dans notre infra structure VMWARE.

Puis est venu ce mini projet de surveillance de la température de la salle serveur, passons à l’étape suivante avec Zabbix : le paramétrage de quelque chose de spécifique.

Ce que j’aime bien avec zabbix c’est sa simplicité. une fois le serveur en place, il suffit d’installer les clients zabbix sur les serveurs à superviser, après c’est simple.

Parfois sur des machines pas à jour, l’installation du client est un peu difficile mais globalement cela fonctionne.

Petite précision : nous avons démarré avec la version 2.0 de Zabbix

Coté raspberry : le client zabbix

Sur le raspberry : apt-get install zabbix-agent

cela nous donne la version 1.8 mais cela suffit pour ce que l’on veut en faire

il suffit après de modifier le fichier /etc/zabbix/zabbix_agentd.conf pour paramétrer les infos suivantes :

Server :

l’adresse IP du server Zabbix, rajouter aussi 127.0.0.1 cela permet de faire des tests avec zabbix_get.

Hostname:

Le nom du client zabbix, attention il doit être identique avec le nom du hosts paramétré dans le serveur Zabbix

AllowRoot :

Permet de lancer le zabbix_client avec root, ce qui est nécessaire dans notre cas car la plupart des périphériques (1wire, i2c) ne sont accessible que par root.

Timeout:

Par la suite j’ai été obligé de le positionner à 30 secondes (par défaut c’est à 3 secondes) voir les explications plus loin.

UserParameter :

Le plus important, les informations spécifiques que l’on souhaite. Voici la ligne complète

 UserParameter=salle.temp,/home/temperature/bin/get_temp

La syntaxe est simple UserParameter=<clé>,<scripts>

Rien de bien compliqué mais il est possible de faire beaucoup plus plus d’infos ici

Il a fallu créer un user température, avec un home directory et un répertoire bin ou j’ai posé le scripts python get_temp. ( source complète => ici )

Note :

Au début, le script interrogeais le périphérique, si le CRC est bon il récupère la température et l’envoi sur la sortie standard. Simple non ?

Mais pas si simple que cela, parfois, et même si depuis cela s’est stabilisé depuis, les valeurs récupérées n’avait rien de cohérent ( -0.625 par exemple). Il a fallu modifier le script pour prendre 10 valeurs, enlever les extrêmes et faire la moyenne du reste.

Mais par contre le script lui est passé de 2 secondes d’exécution à 8 secondes et il a fallu modifier le Timeout coté serveur ET client pour que zabbix continue sa récolte d’informations.

Coté serveur Zabbix

Il faut d’abord créer un hosts dans zabbix (Configuration/Hosts) ce qui consiste a donner un nom, un nom visible, un accès ip ou DNS un port  et à l’inclure dans des groupes.

Pour les templates commencer par mettre le template « zabbix_agent » cela permet de tester si tout se passe bien avec zabbix, basculer aussi le mode automatic pour le ‘Host inventory’.

Ceci fait vous devriez voir dans ‘Monitoring / Lastest Data’ que le raspberry répond au ping ainsi que sa version de zabbix_client.

Le vrai paramétrage commence ici :

D’abord il faut créer un template puis une application puis un item puis des triggers ouf !

Le template regroupe l’application, les items et les triggers

Il est nécessaire de créer l’application puis l’item

ZABBIX_TEMPLATE

Image écran de création de l’item.

L’item a un type (ici zabbix_agent il s’agit d’un UserParameter),  porte un nom, on lui donne la clé des données à stocker (salle.temp cf UserParameter), le type des données, l’unité l’intervalle de récolte le temps de conservation les modifications à apporter etc …

Ceci fait nous pouvons commencer a tester si cela fonctionne

Pour cela depuis le serveur zabbix il suffit de taper :

zabbix_get -s ADR_IP_CLIENT -k "salle.temp"

Et vous devriez avoir une réponse du style => 19.275

C’est ce que va stocker le serveur zabbix.

Au bout de quelques temps vous pouvez même avoir des graphiques :

ZABBIX_GRAPH_TEMPERATURE

C’est d’un intérêt limité mais cela fait son petit effet quand même 🙂

A partir de la on peut avoir des triggers, donc création de 2 triggers : un quand la température est supérieure à 30° et un quand elle est en dessous de 15°. Le niveau d’alerte (severity)  à déclencher est ‘HIGH’ (que l’on traduit par ‘aie’ en français 🙂 )

Maintenant j’ai des données que je sondes régulièrement et des déclencheurs qui lancent des niveau d’alerte.

Il suffit maintenant de paramétrer une action, rien de bien compliqué.  il suffit de copier 🙂

ZABBIX_ACTION1 ZABBIX_ACTION2 ZABBIX_ACTION3

Cette action va donc, si les conditions sont remplis, déclencher une opération de type « Send Message » a un groupe précis d’utilisateurs en utilisant le media « SMS script temperature salle ».

Ce media est à paramétrer dans Administration (et non plus configuration), ce paramétrage consiste a lui donner une description, un type (Script) et un nom de script.

Pour utiliser des scripts avec zabbix : d’abord modifier zabbix_server.conf comme suit :

387 ### Option: AlertScriptsPath
388 #   Full path to location of custom alert scripts.
389 #   Default depends on compilation options.
390 #
391 # Mandatory: no
392 # Default:
393 # AlertScriptsPath=${datadir}/zabbix/alertscripts
394 AlertScriptsPath=/usr/local/zabbix/alertscripts
395
396 ### Option: ExternalScripts
397 #   Full path to location of external scripts.
398 #   Default depends on compilation options.
399 #
400 # Mandatory: no
401 # Default:
402 # ExternalScripts=${datadir}/zabbix/externalscripts
403 ExternalScripts=/usr/local/zabbix/externalscripts

Le script a été copié dans /usr/local/zabbix/alertscripts :


#!/bin/bash
#set -x
to="$1"
subject="$2"
body="$3"
FIC_LOG=/var/log/send_SMS_temp_salle.log
{
## A l'origine
## Mais probleme pour l'envoi de plusieurs SMS
## corrige voir le daemon send_smsd
/usr/local/bin/send_sms "$to" "$subject" 2>&1

## Au cas ou si cela ne fonctionne pas methode brutale
#T=5
## Ce script va envoyer les n SMS
#/usr/local/bin/send_sms 0612345678 "$subject" 2>&1     #User 1
#sleep $T
#/usr/local/bin/send_sms 0612345678 "$subject" 2>&1     #User 2
#sleep $T
#/usr/local/bin/send_sms 0612345678 "$subject" 2>&1     #User 3
#sleep $T
} >> $FIC_LOG

Notez l’importance de TOUT logger si vous voulez comprendre ce qu’il se passe.

Vous remarquerez que ce script utilise sens_sms un autre script que j’ai du écrire pour pouvoir envoyer correctement des SMS avec le daemon send_smsd, que je décrierais bientôt dans un article dédié.

A ce stade des choses se déclenche si la température dérape dans la salle serveur.

Notez que : Je suis tout à fait conscient que tout n’a pas été fait dans les règles de l’art.

Mais cela fonctionne et cela m’a permis de mieux comprendre le fonctionnement de Zabbix. Rien n’est mieux que de se fixer des buts concrets pour appréhender un outil.

La difficulté est souvent de trouver des objectifs réalisables.

De la camera du raspberry jusqu’a firefox

Bonjour,

Enfin j’ai trouve le moyen de diffuser la cam du raspberry jusqu’a mon navigateur

sur le raspberry il faut lancer

raspivid -o - -t 0 -hf -w 320 -h 200 -fps 20 -b 5000000 | cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8080}' :demux=h264

pour voir ce qu’il faut insérer dans la page HTML pour visualiser
voici un lien (wordpress refuse de l’afficher sous forme de code …)

Ah et surtout il faut installer le plugin vlc => apt-get install mozilla-plugin-vlc

Bon c’est du brut de décoffrage et je comprend pas tout mais cela marche 🙂
a bientot j’essaierais de decortiquer les options

Le capteur de température

Image

Voici les entrailles de la bête.

A gauche l’écran LCD, à droite le rasperry avec par dessus son « shield de prototypage ».

4 connexions donc sur ce rasperry :

  • En haut l’alimentation via le port micro usb prévu à cet effet
  • L’écran LCD qui se connect sur le port I2C du rasperry (en jaune et rouge)
  • Le capteur de température qui est un dallas DS18B20 1wire
  • Le réseau

Tout ça pour connecter un bête composant comme le DS18B20 ?

Oui et j’assume, plusieurs raisons, l’écran affiche alternativement l’heure et la température ainsi chaque fois que je descend dans la salle je peu vérifier que cela fonctionne.

Cela permet aussi de justifier le budget pour les non initiés 🙂

Le shield de prototypage est très pratique car cela  permet de visser les connexions, ne sait on jamais peut être qu’il y aura des extensions 🙂

Le matériel provient de chez MCHobby que je soutiens à 100%, ne vous arrêtez pas à la boutique et parcourez le wiki et le blog.

Vous trouverez une vrai mine de renseignements et de tutoriels traduits en français mais surtout commenté ET corrigé. Chaque produit de la boutique le nécessitant est accompagné des liens et tutos du fabricant et aussi quand c’est nécessaire des tutos et notice de montage en image faite par Mr Dominique Meurisse le responsable de ce site.

Je vous conseille la lecture de cet_article   l’a propos du wiki.

Le composant principal : le Dallas DS18B20

Pour la connexion du composant DS18B20 j’ai suivi cet excellent tutoriel   qui en plus me fait dire que j’ai encore beaucoup de choses à apprendre pour faire de joli blog.

Par contre j’ai nettement modifié le code fourni en exemple. En effet parfois le capteur renvoi des valeurs incohérentes style -0.625 de manière un peu aléatoire. C’est pour cette raison et suivant l’avis de quelques moules expérimentées que le script effectue 10 lectures, les tri supprime les 2 premières et les 2 dernières et transmets la moyenne des 6 autres.

Attention : si comme moi vous voulez utiliser ce script avec zabbix vous devez impérativement modifier la valeurs Timeout à 20 ou 30 secondes, sur le serveur ET l’agent.

Le temps de réponse du script est d’environ 8 à 10 secondes sur un rasperry pas du tout optimisé.

Il aurait été plus judicieux d’effectuer les prélèvements « brutes » (une seule lecture) cela dure moins de 3 secondes (valeur par défaut du Timeout Zabbix) et de trouver le bon paramétrage coté Zabbix. Si je trouve je ne manquerais pas d’en parler sur ce blog 🙂

Un dernier truc : au départ j’avais prévu de connecter 2 capteurs d’où la possibilité d’appeller des devices dans le script.

Voici le code actuellement en exploitation :

get_temp2.py  Note : je ne mets plus de code sous WordPress car sournoisement il le tronque.

Voici le schéma de connexion :

SCHEMA CONNEXION

J’aurais bien aimé utiliser Fritzing mais j’ai pas trouvé tout les composants

Sinon voici les connexions :

Pour l’écran :

les bornes 2 – 5V / 3 – SDA / 5 – SCL / 6 – GND sur les mêmes bornes que l’écran LCD

Pour le capteur DS18B20

Le port GPIO #4 (borne 7) sur la borne DATA du DS18B20 (pin 2)

La borne  17 donne 3.3 V à connecter sur la borne VDD du DS18B20 (pin 3)

La borne 25 – GND à connecter sur la borne GND du DS18B20 (pin 1)

Il faut aussi relier une résistance de 4.7 K Ohms entre 2 et 3 (data + VDD) du DS18B20

Rien de très compliqué en fait.

Le shield de prototypage se révèle pratique pour visser les câbles.

L’écran LCD

OK c’est plus pour le fun et pour apprendre, normalement il devrait se connecter directement sur le raspberry mais cela ne m’arrangeait pas. Aussi il à fallut faire une rallonge.

L’écran connecté il faut régler le potentiomètre sinon cela ne fonctionne pas

Pour le montage de celui ci il suffit de suivre les tutos, rien de compliqué non plus.

il faut un peu de code pour que cela fonctionne dont voici celui en exploitation : cmd_LCD.py

NOTE : Impossible de mettre du code propre dans worldpress 😦 il me sucre des portions entières …

il permet d’afficher une couleur différente part tranche de température et j’avais commencé à gérer les boutons directement sur l’écran, mais rien de concret.

En gros il utilise le get_temp pour récupérer la température ambiante et en fonction change de couleur. Pour indiquer que le raspberry est toujours vivant j’alterne l’affichage de la date/heure et de la température.

Ce code est une utilisation de la librairie et des exemples fournis par Adafruit

Si j’ai le temps un jour je modifierai ce script pour que l’on puisse rebooter le raspberry depuis les 5 touches (qui ne sont pas accessible dans le découpage actuel de la boîte).

En fait cette partie a été très simple, même si j’ai galéré pour trouver une boîte et des connecteurs.

En fait en électronique, comme dans beaucoup de choses, il faut savoir rester simple.

Premier article

Avant j’avais google notes c’était super … trop d’ailleurs google l’a retiré

Après j’ai mis des articles dans robot-maker … le site n’existe plus

Alors je reprend un vieux blog WordPress que j’avais du créer pour voir.

Si cela tombe aussi alors je sais plus quoi faire