Prendre la température avec un Rasperry

Bonjour,

tout d’abord une petite précision, cet article s’adresse à des amat(eurs|trices) d’électronique et d’informatique, communément appelez geek ou geekette.Les amateurs de soirées cuirs et chaînes peuvent continuer à lire mais vous ne trouverez qu’une utilisation « normale » d’un Rasperry.

Le contexte :

notre infra structure informatique est dans une petite salle dédiée, cette grosse bête chauffe beaucoup et c’est pour cette raison qu’une climatisation dédiée a été installée.

Comme toute infra qui se respectent beaucoup de choses sont redondées (disque, serveur, CPU, alim etc …) mais pas la clim.

Et,  loi de Murphy oblige, un jour la clim s’est arrêtée, sans raison, la température a du augmenter jusqu’au maximum toléré par les serveurs qui se sont mis en rideau.

Donc le lundi matin, plein de personnes au chômage technique, le temps que l’on refroidissent la salle, redémarrent la clim et les éléments de l’armoire info etc …

La clim n’était pas en panne vu que lorsqu’elle  re démarré tout s’est bien passé. Par contre aucune explication de la part de l’installateur qui ne comprend pas pourquoi elle s’est arrêtée.

Nous lui avons donc demandé un chiffrage pour avoir un message (mail/sms etc …) si cela se reproduit, un autre chiffrage a été demandé au mainteneur de notre alarme. Aucune réponse.

J’ai donc proposé de « bricoler un truc » pour pouvoir tester la température et avertir les personnes capables d’intervenir au cas ou cela dépasserait certain seuils.

Analysons les besoins :

Je venais de découvrir le Rasperry PI ainsi que la supervision avec Zabbix.Par contre je n’avais aucune idée de comment envoyer des SMS depuis ni comment lire une température depuis un serveur unix. Heureusement Internet regorge d’exemples.

Le schéma suivant vient donc tout naturellement :

SCHEMA GENERAL

Le serveur zabbix scrute à intervalle régulier le capteur de température, si la température est inférieure à 15° ou supérieure à 30°, on déclenche un envoi de SMS.

Le modem GSM et l’envoi de SMS

Comment envoyer des SMS via un script shell ?.

Les recherches sur le web ne m’ont pas convaincu car il s’agissait essentiellement d’utiliser des téléphones portables connectés sur un PC, ce que je ne voulais pas.

Rapidement j’ai trouvé commM2M , je les ai contacté et rapidement j’ai reçu le devis que je voulais pour un modem de qualité industrielle.

MODEM

L’envoi a été rapide, tout comme la mise en place, une heure après déballage avec les exemples fournis j’envoyais mes premiers SMS par scripts UNIX.

Le plus long a été de mettre les mains dans les câbles derrières les serveurs ESX pour plugger le port USB sur l’un d’entre eux, surtout que j’adore tripatouiller dans ce m….. de câble sur des machines en exploitation.

Voici un bout de code en python pour tester les commandes AT

C’est copié à partir d’un exemple trouvé sur le web, mais désolé pour l’auteur j’ai perdu le lien 😦

Retrouvé ! gràce aux moules de  LinuxFr voici le lien

import time
import serial

# configure the serial connections (the parameters differs on the device you are connecting to)
ser = serial.Serial(
    port='/dev/ttyACM0',
    baudrate=115200,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)

ser.open()
ser.isOpen()

print 'Enter your commands below.\r\nInsert "exit" to leave the application.'

input=1
while 1 :
    # get keyboard input
    input = raw_input(">> ")
        # Python 3 users
        # input = input(">> ")
    if input == 'exit':
        ser.close()
        exit()
    else:
        # send the character to the device
        # (note that I happend a \r\n carriage return and line feed to the characters - this is requested by my device)
        ser.write(input + '\r\n')
        out = ''
        # let's wait one second before reading output (let's give device time to answer)
        time.sleep(1)
        while ser.inWaiting() > 0:
            out += ser.read(1)

        if out != '':
            print ">>" + out

Le code suivant permet d’envoyer un SMS :

#! /usr/bin/env python
# -*- coding: utf-8 -*-

## --------------------------
## Envoi d'un sms en python
## --------------------------

import sys
import time
import serial

def usage(prog_name):
        print "Usage %s : numero message" % prog_name
        print "numero = numero de telephone"
        print "message = le message transmettre avec guillemet si espace"
        sys.exit(1)

def send_sms(no, msg):
        ser = serial.Serial(
                port='/dev/ttyACM0',
                baudrate=115200,
                parity=serial.PARITY_NONE,
                stopbits=serial.STOPBITS_ONE,
                bytesize=serial.EIGHTBITS
        )
        ser.open()
        ser.isOpen()
        ## Envoi de AT+CMGF=1
        ser.write("AT+CMGF=1\r\n")
        time.sleep(1)
        out=''
        while ser.inWaiting() > 0:
                out += ser.read()
        print "out=%s" % out
        ## Envoi de AT+CMGS
        ser.write("AT+CMGS=%s\r\n" % no)
        time.sleep(1)
        out=''
        while ser.inWaiting() > 0:
                out += ser.read()
        print "out=%s" % out
        ## Envoi du message + CTRLZ
        ser.write("%s %s" % (msg, chr(26)))
        time.sleep(1)
        out=''
        while ser.inWaiting() > 0:
                out += ser.read()
        print "out=%s" % out
        ser.close()
        exit()

if __name__ == '__main__':
        if len(sys.argv) < 2:
                usage(sys.argv[0])
        else:
                send_sms(sys.argv[1], sys.argv[2])

Mais comme nous le verrons plus tard cela n’est pas suffisant si l’on veut envoyer plusieurs SMS de manières concurrentes ou si l’on ne veut pas perdre 1 SMS sur 2 parce que cela se bouscule au portillon.

Juste un dernier truc concernant ce modem, ce que j’aime dans les produits « industriels » c’est la documentation plus que complète. J’ai eu droit à

  • La datasheet                       : 2 pages
  • La description technique  : 33 pages
  • Les commandes AT            : 549 pages

Bref on est chez les pros, les vrais. cela rassure 🙂

Bientôt sur vos écrans :

Et voilà, si la clim de votre salle serveur vous fait des misères vous avez la solution, sachez que bricoler ce genre de truc m’a beaucoup amusé, sans parler du status de Grand Maître sorcier que j’ai maintenant vis à vis de mes collègues de bureau 🙂

Eh oui, ya pas que les grosses voitures rouges pour épater les copines 😉

2 réflexions au sujet de « Prendre la température avec un Rasperry »

  1. Ping : send_smsd ou comment un script devient un daemon | Un Blog de SysAdmin

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s