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 !