Je vous ai présenté dans le précédent article le principe de fonctionnement d'un OpenAlarm Node, c'est parfaitement fonctionnel et utilisable mais nous pouvons simplifier grandement tout ça et c'est là qu'intervient l'interface que je vais vous présenter dans cet article.

Un programme en Python nommé simplement base.py permet les interactions avec les OpenAlarm Node, il s'utilise en ligne de commande :

$ python3 base.py --help
OpenAlarm Base
Usage:
base.py [options] nodeid <nodeid>
base.py [options] config write <config>
base.py [options] config set <key> <value>
base.py [options] profile write <profile_name> [<profile_id>]
base.py [options] profile set <profile_id>
base.py [options] node write <node_name>
base.py [options] node read
base.py [options] listen [--csv <csv_file>]
base.py [options] remote <node_name> --set <commands>...
base.py --version
Options:
-p            Serial port
-f            Force node write even when different nodeid
-h --help     Show this screen
-d --debug    Debug mode
-v --verbose  Verbose mode
$ 

Je vais passer en revue toutes les possibilités offertes par ce programme.

nodeid

python3 base.py -p /dev/usbserial0 nodeid 2

Cette commande va donner au Node dont le périphérique série est /dev/usbserial0 l'identifiant de node 2

config write

python3 base.py -p /dev/usbserial0 config write default

Cette commande va écrire la configuration nommée default dans le node lié au périphérique /dev/usbserial0

Mais d'oû sort la configuration default ?

Toute la configuration d'OpenAlarm tient dans un fichier au format Yaml et default correspond dans l'exemple ci-dessus à la configuration du même nom du nœud config.

Ce n'est pas clair ? Regardons de plus près une partie du fichier de configuration oa.yaml :

[...]
configs:
    default: &default
        group: 210
        freq: 433
        ack: yes
        cmdtimeout: 15
        usbtimeout: 15
        autostart: yes
        power: 0
        remote:
            active: yes
            wait_error_cycle: 7
[...]

Nous y trouvons une suite de clefs / valeurs (les mêmes clefs que nous avons aperçu dans l'article précédent sur les entrailles du firmware) qui vont permettre de configurer comme nous le souhaitons notre Node.

Ainsi, dans l'exemple ci-dessus, nous donnons au Node le groupe 210, nous les spécifions une fréquence de 433Mhz, avec accusé de réception (ack = true), bref, je suppose que vous avez compris le principe de fonctionnement...

La commande config write va donc lire la configuration et l'envoyer au Node directement.

config set

python3 base.py -p /dev/usbserial0 config set group 220

Cette commande permet de modifier directement des variables de configuration, utile si on ne veut changer qu'un seule des paramètres.

profile write

python3 base.py -p /dev/usbserial0 profile write pir0

C'est assez explicite, avec cette commande, nous écrivons le profile nommé pir0 dans le périphérique /dev/usbserial0 (pour en savoir plus sur les profiles, voir le dernier article)

pir0 correspond au nœud du même nom du fichier oa.yaml :

[...]
    pir0: &profilepir
        description: Module avec capteur infrarouge 0
        feedback: yes
        period: 3
        eintwait: 3
        external_interrupts:
            io0: rising
        ios:
            io0: [ input, nopullup ]
        frame:
id: 2
content:
- counter
- waketype
- wakearg
- [ input0, input1, input2 ]
- voltage
- temperature
[...]

profile set

python3 base.py -p /dev/usbserial0 profile set 0

Change le profile courant du Node.

node write

python3 base.py -p /dev/usbserial0 node write xxx

Nous avons vu au dessus le fichier Yaml avec les nœuds configs et profiles, il existe un autre type de nœud, il s'agit de 'nodes' qui contient tous les paramètres pour un Node nommé.

Voici le contenu du nœud nodes du fichier oa.yaml :

[...]
nodes:
    pir0:
        id: 2
        config: *default
        key: abcdefghijklmnop
        profile:
            0: *profilepir
    temp:
        id: 1
        config: *default
        key: AKdlIqdjMKAQwJKz
        profile:
            0: *profiletemp
[...]

node read

python3 base.py -p /dev/usbserial0 node read

Lit le Node et affiche des informations sur sa configuration.

listen

python3 base.py -p /dev/usbserial0 node listen

Se connecte au Node via la liaison série et passe en mode promiscuous, une sorte de mode sniffer ou toutes les frames valident envoyées par les OpenAlarm Node sont retournées via l'interface série.

Si nous nous connections au node directement via l'interface série et que nous entrons la commande série, voici le format du contenu retourné :

$ ino serial
listen
OKX 010206000103047A0B16
OKX 010207000103007A0B16
OKX 010208000202007A0B16
OKX 010209000103007A0B16

À chaque réception d'une frame valide, elle est retournée sous la forme OKX 010206000103047A0B16, ou OK indique un paquet valide, X indique que le format de la frame est hexa, puis, suivi d'un espace, nous avons la frame brute.

Ce contenu n'est pas franchement lisible et c'est pour cela que nous utilisons le programme en Python qui nous simplifie grandement la vie, voici la même fonction listen mais utilisée via l'interface en Python :

$ python3 base.py -p /dev/usbserial0 node listen
Use device /dev/usbserial0
Start listen mode !
Nodeid: 1, frame type: 2 (0 second(s))
    Input       : bit0:0, bit1:0, bit2:0
    Voltage     : 2.94
    Temperature : 21.00
Nodeid: 1, frame type: 2 (5 second(s))
    Input       : bit0:0, bit1:0, bit2:0
    Voltage     : 2.94
    Temperature : 21.00
Nodeid: 1, frame type: 2 (5 second(s))
    Input       : bit0:0, bit1:0, bit2:0
    Voltage     : 2.94
    Temperature : 21.00
Nodeid: 1, frame type: 2 (5 second(s))
    Input       : bit0:0, bit1:0, bit2:0
    Voltage     : 2.94
    Temperature : 21.00

C'est tout de même beaucoup plus clair ainsi ! Non ?

Par curiosité, rendons cela un peu plus verbeux...

$ python3 base.py -p /dev/usbserial0 --verbose node listen
Verbose mode !
Use device /dev/usbserial0
Start listen mode !
verbose get
-> 0
verbose set 0
-> OK
listen raw
Nodeid: 1, frame type: 2, payload: 64000202007A0B15 (2 second(s))
    Counter     : 100
    Waketype    : 2
    Wakearg     : 2
    Input       : bit0:0, bit1:0, bit2:0
    Voltage     : 2.94
    Temperature : 21.00
Nodeid: 1, frame type: 2, payload: 65000202007A0B15 (5 second(s))
    Counter     : 101
    Waketype    : 2
    Wakearg     : 2
    Input       : bit0:0, bit1:0, bit2:0
    Voltage     : 2.94
    Temperature : 21.00
Nodeid: 1, frame type: 2, payload: 66000202007A0B15 (5 second(s))
    Counter     : 103
    Waketype    : 2
    Wakearg     : 2
    Input       : bit0:0, bit1:0, bit2:0
    Voltage     : 2.94
    Temperature : 21.00

Une fois ces données reçue, c'est à vous d'en faire ce que vous voulez...
Un paramètre csv vous permet de spécifier un fichier afin de stocker toutes ces informations dans un fichier.

node remote

python3 base.py -p /dev/usbserial0 remote pir --set period=1

Cette commande va se connecter à l'OpenAlarm Node connecté sur l'USB puis tenter une liaison distante avec le Node nommé pir (voir fichier format Yaml) afin de changer le paramètre period.


Voilà, vous savez tout sur l'interface actuelle en Python, si vous voulez en savoir, vous pouvez consulter le code et au sujet du fichier oa.yaml, je vous invite également à le consulter !