RASP-SENSE-HAT-ASTRO-PI-IP

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Afficher votre adresse IP

Dans ce tutoriel, vous allez apprendre comment afficher votre adresse IP sur votre Sense hat lors du démarrage.

Si vous possédez un Raspberry PI configuré pour avoir une adresse IP dynamique, et que vous possédez un Sense hat: cet article est fait pour vous!

Le but est d'afficher l'adresse IP sur la matrice de LED afin de pouvoir démarrer une session ssh / vnc / ... sans avoir à faire des commandes pour récupérer l'adresse.

Afin d'arriver à ce but, je suis passé à travers ces différentes étapes:

  • Créer un script Python qui récupère l'adrese IP (de l'interface eth0 ou wlan0) et l'affiche 3 fois sur la matrice de LEDs
  • Créer un script bash qui définit le service à ajouter au processus de démarrage INIT V
  • Ajouter le script au processus de démarrage pour qu'il démarre automatiquement

Comme prérequis, je pars du principe que vous avez déjà installé la librairie pour gérer votre Sense hat. Dans le cas contraire, voici les commandes à exécuter:

sudo apt-get update
sudo apt-get install sense-hat
sudo pip-3.2 install pillow

Procédure rapide

Si vous ne souhaitez pas perdre du temps, vous pouvez télécharger ce fichier zip contenant les codes sources nécessaires: il contient 2 fichiers avec leur chemin d'emplacement. Procédez à l'extraction de l'archive et exécutez les instructions suivantes:

  • Extraire tous les fichiers ainsi que l'arborescence
  • Allez dans /etc/init.d avec l'instruction cd /etc/init.d
  • Démarrez le service au démarrage avec la commande:
    sudo update-rc.d sense_hat_ip defaults

Procédure détaillée

Etape 1 sur 2 - Créer le script Python

Commençons par la rédaction de la partie fonctionnelle:

cd /usr/share
md sense_hat_ip
cd sense_hat_ip
sudo nano sense_hat_ip.py

Vous pouvez copiez/coller ce code

# ============================================================================
# Sense hat - IP address
#
# Description: This component displays the IP address on the lcd of the Sense
#              hat. The complete system is made out of 2 components:
#
#              - /user/share/sense_hat_ip/sense_hat_ip.py
#                   Component executing the functional logic
#
#              - /etc/init.d/sense_hat_ip
#                   Service added to the INIT process with the command
#                   sudo update-rc.d sense_hat_ip
#
# Author     : Serge Bollaerts
# Date       : 1-sept-2015
# License    : GPL, free for commercial and non-commercial use
# Feedback   : sbollaerts@hotmail.com
# ============================================================================
from sense_hat import SenseHat
from daemon import runner
from subprocess import *
import logging
import time
# ============================================================================
# Class App
#
# This class contains the code to be executed asynchronously with the daemon.
# ============================================================================
class App():
     sense = SenseHat()

     def __init__(self):
          self.stdin_path = "/dev/null"
          self.stdout_path = "/dev/tty0" # When debugging, use tty instead
          self.stderr_path = "/dev/tty0" # When debugging, use tty instead 
          # When I provide the real path, it does not work: why?
          self.pidfile_path = "/usr/share/sense_hat_ip/sense_hat_ip.pid"
          self.pidfile_timeout = 30

     def run(self):
          ipaddr = self.get_ip_address()
          msg = ipaddr
          if msg == "":
               msg = "<No IP found>"

          for i in range(0, 3):
               self.sense.show_message(msg)
               time.sleep(2)

          self.sense.clear();

     def get_ip_address(self):
          cmd1 = "ip addr show scope global eth0 | grep inet | cut -d' ' -f6 | cut -d/ -f1"
          cmd2 = "ip addr show scope global wlan0 | grep inet | cut -d' ' -f6 | cut -d/ -f1"

          # For any obscure reason, the command doesn't always return a
          # result. I created a loop in order to wait for a result to be
          # provided.
          output = ""
          retry = 0;
          while (output == "") and (retry < 30):
               time.sleep(1)
               p = Popen(cmd1, shell=True, stdout=PIPE)
               output = p.communicate()[0]
               if output == "":
                    print("eth0 not found")
                    time.sleep(1)
                    p = Popen(cmd2, shell=True, stdout=PIPE)
                    output = p.communicate()[0]
                    if output == "":
                         print("wlan0 not found")
                    retry = retry + 1 

          return output.rstrip()

# ============================================================================
# Main application logic creating an instance of App and executing it inside a
# daemon context.                
# ============================================================================
app = App()

logger = logging.getLogger("DaemonLog")
logger.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler = logging.FileHandler("/var/log/sense_hat_ip.log")
handler.setFormatter(formatter)
logger.addHandler(handler)

daemon_runner = runner.DaemonRunner(app)
daemon_runner.daemon_context.files_preserve = [handler.stream]
daemon_runner.do_action()

Sauvez le fichier et quittez nano:

  • [CTRL] + O puis [ENTER]
  • [CTRL] + X

Si vous souhaitez tester votre script, tapez la commande suivante:

sudo python sense_hat_ip.py start

Etape 2 sur 2 - Créer le service (daemon)

Allez dans le répertoire init.d et créer le script du service:

cd /etc/init.d
sudo nano sense_hat_ip

Copiez et collez ce code dans votre script:

#! /bin/bash
# Copyright (c) 2015 Do [MORE], do IT better.
# All rights reserved.
#
# Author: Serge Bollaerts, 2015
#
# Please send feedback to sbollaerts@hotmail.com
#
# /etc/init.d/sense_hat_ip
#
### BEGIN INIT INFO
# Provides: sense_hat_ip
# Required-Start: 
# Should-Start: 
# Required-Stop: 
# Should-Stop:
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Short-Description: Show IP address on Sense Hat
# Description:    Runs up the test daemon process
### END INIT INFO

case "$1" in
  start)
    echo "sense_hat_ip: starting server"
    # Start the daemon 
    python /usr/share/sense_hat_ip/sense_hat_ip.py start
    ;;
  stop)
    echo "sense_hat_ip: stopping server"
    # Stop the daemon
    python /usr/share/sense_hat_ip/sense_hat_ip.py stop
    ;;
  restart)
    echo "sense_hat_ip: restarting server"
    python /usr/share/sense_hat_ip/sense_hat_ip.py restart
    ;;
  *)
    # Refuse to do other stuff
    echo "Usage: /etc/init.d/sense_hat_ip {start|stop|restart}"
    exit 1
    ;;
esac

exit 0

Sauvez le fichier et quittez:

  • [CTRL] + O puis [ENTER]
  • [CTRL] + X

Enregistrez votre service dans la séquence de démarrage

sudo update-rc.d sense_hat_ip defaults

Redémarrez votre appareil avec sudo reboot et admirez votre matrice LED!

Désinstaller le service

Si vous souhaitez désinstaller le service de la séquence de démarrage, tapez les commandes suivantes:

cd /etc/init.d
sudo update-rc.d sense_hat_ip remove

Remerciement

Tous nos remerciement à Mr Bollaerts pour l'ajout de ce bonus à nos tutoriels Hat Sense.


Source: Getting Started with Astro PI et Astro-Pi Guide proposé par Raspberry Pi Learning Resource (www.raspberrypi.org)

Licence Creative Commons - CC-BY-SA
The learning resource is provided for free by the Raspberry Pi Foundation under a Creative Commons licence.
Find more at raspberrypi.org/resources and github.com/raspberrypilearning.

Traduction réalisée par Meurisse. D pour shop.MCHobby.be - Licence CC-BY-SA.
Crédit de traduction: Toute référence, mention ou extrait de cette traduction doit également être explicitement accompagné du crédit de traduction suivant : «  Traduction par MCHobby (shop.MCHobby.be) » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.