Configuration d’un réseau et pilotage d’un SINP1 depuis le shell

L’objectif de cette page est de décrire l’installation et le pilotage du produit SINP1 depuis le shell du controller mesh.

Structure des produits

Le controller

Le FW du controller dans cet exemple dispose des propriétés suivantes :

  • il est provisionneur mesh (il permet d’ajouter des nouveaux noeuds dans le réseau)

  • il est configurateur mesh (il permet de modifier la configuration des noeuds du réseau comme ajout de clefs, binding des models et configuration des models en publish/susbcribe)

  • il est par ailleurs proxy, relay et friend, mais ces propriétés ne sont pas exploitées ici

  • il dispose de tous les models mesh permettant le test et le pilotage de toutes les fonctionnalités de l’ecosystème LinkIO (models generic et vendor, voir Composition Data )

Le produit SINP1

Le Multifunction Relay Switch (SINP1) est un micro-module développé sur la plateforme SIN de NodOn.

Il dispose de 3 fonctionnalités dont 2 sont exploitées (dépendant du firmware implementé):

  • 2 entrées interrupteurs (non implémentés ni exploités ici)

  • une sortie relais (dry contact)

  • Un capteur de température interne (non exploité ici)

Au niveau mesh, le produit expose ainsi 3 elements mesh (voir Composition Data) :

<==     Element @ 0x0000:
<==             SIG Models:
<==                     0x0000 (configuration-server)
<==                     0x0001 (configuration-client)
<==                     0x0002 (health-server)
<==                     0x0003 (health-client)
<==             Vendor Models:
<==                     Company 0x04aa: 0x0012 (feature-property-server)
<==                     Company 0x04aa: 0x0008 (enocean-server)
<==     Element @ 0x0001:
<==             SIG Models:
<==                     0x1000 (generic-onoff-server)
<==             Vendor Models:
<==                     Company 0x04aa: 0x0010
<==     Element @ 0x0002:
<==             SIG Models:
<==                     0x1100 (generic-sensor-server)

Une fois provisionné, le produit obtiendra une adresse unicast pointant sur le premier element[0]. Les autres elements sont accessibles par la formule address[element_n] = address_unicast + element_n.

Installation du réseau

Controller initialisation

La première étape consiste à initialiser le controller en supposant que l’on parte de zéro. Cette étape n’est plus à jouer une fois un réseau consitué.

Le controller garde en mémoire (flash) la structure du réseau au fur et à mesure de sa constitution dans sa CDB (Configuration Data Base) :

  • Les netkeys (ici une seule dans l’exemple),

  • Les AppKeys (ici une seule dans l’exemple),

  • Les devkeys (une par produit),

  • Les adresses unicast des produits,

  • L’IV index,

  • Les bindings des models du controller lui-même

Le controller ne stocke pas en mémoire les informations des produits, il a la capacité d’intérroger les produits pour récupérer leur composition data ainsi que leurs configurations.

==> shell echo off
==> log backend shell_uart_backend halt
==> mesh init
<== Mesh shell initialized
<== cmd_end (err 0)
==> mesh models cfg timeout 5
<== Message timeout: 5 seconds
<== cmd_end (err 0)

==> log backend shell_uart_backend halt

==> shell echo off
==> log backend shell_uart_backend halt
==> mesh init
<== Mesh shell initialized
<== cmd_end (err 0)
==> mesh models cfg timeout 5
<== Message timeout: 5 seconds
<== cmd_end (err 0)
==> mesh reset-local
<== The local node has been reset and needs reprovisioning
<== Local node reset complete
<== cmd_end (err 0)
==> mesh cdb show
<== No valid networks
<== cmd_end (err -22)
==> kernel reboot cold
<== *** Booting Zephyr OS build v3.3.0-rc2-11-g1afeccb39ecd ***
<== I: Starting bootloader
<== I: Primary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
<== I: Secondary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
<== I: Boot source: none
<== I: Swap type: none
<== I: Bootloader chainload address offset: 0xc000
<== I: Jumping to the first image slot
==> shell echo off
==> log backend shell_uart_backend halt
==> mesh init
<== Mesh shell initialized
<== cmd_end (err 0)
==> mesh models cfg timeout 5
<== Message timeout: 5 seconds
<== cmd_end (err 0)
==> mesh cdb clear
<== Cleared CDB
<== cmd_end (err 0)

==> mesh cdb create
<== cmd_end (err 0)

==> mesh cdb app-key-add 0 0
<== Added AppKey 0x000
<== cmd_end (err 0)

Lecture pour vérification des informations du réseau :

==> mesh cdb show
<== Mesh Network Information
<== ========================
<== Address  Elements  Flags  UUID                              DevKey
<== > Total nodes: 0
<== ---
<== NetIdx  NetKey
<== 0x000   7e52b3a6c1674798b88bbdd6971e5985
<== > Total subnets: 1
<== ---
<== NetIdx  AppIdx  AppKey
<== 0x000   0x000   e6aa76aa7e1c00b714a0ab289d5fa92c
<== > Total app-keys: 1
<== cmd_end (err 0)

Controller (local) provisioning

Le contrôleur est le premier noeud du réseau nouvellement constitué, il doit s’auto provisionner avec l’adresse unicast 1 :

==> mesh prov local 0 1
<== Local node provisioned, net_idx 0x0000 address 0x0001
<== cmd_end (err 0)

==> mesh target dst 1
<== Destination address set to 0x0001 (local)
<== cmd_end (err 0)
==> mesh models cfg get-comp
<== Got Composition Data for 0x0001:
<==     CID      0x05f1
<==     PID      0x0000
<==     VID      0x0000
<==     CRPL     0x0080
<==     Features 0x0005
<==     Element @ 0x0000:
<==             SIG Models:
<==                     0x0000
<==                     0x0001
<==                     0x0002
<==                     0x0003
<==             No Vendor Models
<==     Element @ 0x0000:
<==             SIG Models:
<==                     0x1001
<==                     0x1003
<==                     0x1102
<==                     0x100d
<==                     0x1000
<==                     0x1002
<==             Vendor Models:
<==                     Company 0x04aa: 0x0009
<==                     Company 0x04aa: 0x0013
<==                     Company 0x04aa: 0x0015
<==                     Company 0x04aa: 0x0017
<==                     Company 0x04aa: 0x0019
<==                     Company 0x04aa: 0x0014
<==                     Company 0x04aa: 0x0010
<==                     Company 0x04aa: 0x0018
<==                     Company 0x04aa: 0x001a
<==                     Company 0x04aa: 0x0020
<==                     Company 0x04aa: 0x0021
<== cmd_end (err 0)

Controller (local) configuration

Le controller doit ensuite être préparé à configurer et piloter les produits à travers les differents models mesh disponibles dans l’écosysteme :

  • Ajout d’une Appkey[0]

  • Binding de cette Appkey sur les models que l’on veut utiliser

  • Création d’une adresse de groupe 0xC000 et souscription des models client qui écouteront les models server du produit qui publieront dessus

# ajout d'une appkey[0] pour binder tous les models
==> mesh models cfg appkey add 0 0
<== AppKey added, NetKeyIndex 0x0000 AppKeyIndex 0x0000
<== cmd_end (err 0)

# bind de l'appkey[0] sur le model health-server (optionnel)
==> mesh models cfg model app-bind 0x0001 0 0x0002
<== AppKey successfully bound
<== cmd_end (err 0)

# souscription du model health-server sur l'adresse de groupe 0xc000
# (pour recevoir les msgs de groupe Health des produits)
==> mesh models cfg model sub-add 0x0001 0xc000 0x0002
<== Model subscription was successful
<== cmd_end (err 0)

# bind de l'appkey[0] sur le model health-client (optionnel)
==> mesh models cfg model app-bind 0x0001 0 0x0003
<== AppKey successfully bound
<== cmd_end (err 0)

==> mesh models cfg model sub-add 0x0001 0xc000 0x0003
<== Model subscription was successful
<== cmd_end (err 0)

# generic-onoff-client
==> mesh models cfg model app-bind 0x0002 0 0x1001
<== AppKey successfully bound
<== cmd_end (err 0)

==> mesh models cfg model sub-add 0x0002 0xc000 0x1001
<== Model subscription was successful
<== cmd_end (err 0)

# feature-property-client
==> mesh models cfg model app-bind 0x0002 0 0x0013 0x04AA
<== AppKey successfully bound
<== cmd_end (err 0)

Node 3 provisioning

On lance le provisioning du produit dont on connait au préalable l’UUID ( ici un UUID de test : d30e580560ea00000000000000000000). D’autres méthodes de provisioning sont possibles.

==> mesh prov remote-adv d30e580560ea00000000000000000000 0 3 5
<== Provisioning link opened on PB-ADV
<== Node provisioned, net_idx 0x0000 address 0x0003 elements 3
<== Provisioning link closed on PB-ADV
<== cmd_end (err 0)

# vérification
==> mesh cdb show
<== Mesh Network Information
<== ========================
<== Address  Elements  Flags  UUID                              DevKey
<== 0x0001   2         -      dddd0000000000000000000000000000  0123456789abcdef0123456789abcdef
<== 0x0003   3         -      d30e580560ea00000000000000000000  0fa1525323e0a6429a1be139a424514a
<== > Total nodes: 2
<== ---
<== NetIdx  NetKey
<== 0x000   7e52b3a6c1674798b88bbdd6971e5985
<== > Total subnets: 1
<== ---
<== NetIdx  AppIdx  AppKey
<== 0x000   0x000   e6aa76aa7e1c00b714a0ab289d5fa92c
<== > Total app-keys: 1
<== cmd_end (err 0)

Lecture du composition Data

==> mesh target dst 3
<== Destination address set to 0x0003
<== cmd_end (err 0)

==> mesh models cfg get-comp
<== Got Composition Data for 0x0003:
<==     CID      0x05f1
<==     PID      0x0000
<==     VID      0x0000
<==     CRPL     0x0080
<==     Features 0x0007
<==     Element @ 0x0000:
<==             SIG Models:
<==                     0x0000
<==                     0x0001
<==                     0x0002
<==                     0x0003
<==             Vendor Models:
<==                     Company 0x04aa: 0x0012
<==                     Company 0x04aa: 0x0008
<==     Element @ 0x0001:
<==             SIG Models:
<==                     0x1000
<==             Vendor Models:
<==                     Company 0x04aa: 0x0010
<==     Element @ 0x0002:
<==             SIG Models:
<==                     0x1100
<==             No Vendor Models
<== cmd_end (err 0)

Configuration des models du SINP1

Pour le pilotage du SINP1 on a globalement 3 models à configurer :

  • health-client (mesh-model-health)

  • feature-property-server (mesh-model-feature-property)

  • generic-onoff-server (mesh-model-onoff)

==> log backend shell_uart_backend go

# bind de l'appkey[0] sur le model health-server
==> mesh models cfg model app-bind 0x0003 0 0x0002
<== AppKey successfully bound
<== cmd_end (err 0)

# bind de l'appkey[0] sur le model feature-property-server
==> mesh models cfg model app-bind 0x0003 0 0x0012 0x04AA
<== AppKey successfully bound
<== cmd_end (err 0)

# bind de l'appkey[0] sur le model generic-onoff-server
==> mesh models cfg model app-bind 0x0004 0 0x1000
<== AppKey successfully bound
<== cmd_end (err 0)

# publication du model generic-onoff-server sur l'adresse de groupe 0xc000
==> mesh models cfg model pub 0x0004 0x1000 0xc000 0 off 31 0 1 50
<== Model Publication successfully set
<== cmd_end (err 0)

# verification
==> mesh models cfg model pub 0x0004 0x1000
<== Model Publication for Element 0x0004, Model 0x1000:
<==     Publish Address:                0xc000
<==     AppKeyIndex:                    0x0000
<==     Credential Flag:                0
<==     PublishTTL:                     31
<==     PublishPeriod:                  0x00
<==     PublishRetransmitCount:         1
<==     PublishRetransmitInterval:      50ms
<== cmd_end (err 0)

==> mesh models cfg model app-bind 0x0004 0 0x0010 0x04AA
<== AppKey successfully bound
<== cmd_end (err 0)

# configuration du model Health, pour une publication toutes les 10s
==> mesh models cfg model app-bind 0x0003 0 0x0002
<== AppKey successfully bound
<== cmd_end (err 0)
==> mesh models cfg model pub 0x0003 0x0002 0xc000 0 off 31 129 1 50
<== Model Publication successfully set
<== cmd_end (err 0)

# verification
==> mesh models cfg model pub 0x0003 0x0002
<== Model Publication for Element 0x0003, Model 0x0002:
<==     Publish Address:                0xc000
<==     AppKeyIndex:                    0x0000
<==     Credential Flag:                0
<==     PublishTTL:                     31
<==     PublishPeriod:                  0x81
<==     PublishRetransmitCount:         1
<==     PublishRetransmitInterval:      50ms
<== cmd_end (err 0)

Node 3 feature 1 Enable

Sur les produits développés par LinkIO les fonctionnalités des produits sont configurables.

Il faut notamment activer la fonction de sortie relais pour pouvoir l’utiliser. On utilise le model vendor feature-property pour effectuer la configuration à distance :

==> mesh models msg send-vnd-rsp 1 0x0013 0x04AA 3 0xC2 0xC3 010000030401000000
<== len: 10
<== payload: 00010000030401000000
<== cmd_end (err 0)

Pilotage

Node 3 feature 1 ON

Pilotage avec Acknowledge du relais de sortie en ON (sur l’element dont l’adresse est 4, depuis le model generic-onoff-client, payload 0101). La fonctionnalité ayant été configurée pour publier son état sur l’adresse de groupe 0xC000, le controller recoit cette information (ici 2 fois)

==> mesh models msg send-rsp 1 0x1001 0x04 0x8202 0x8204 0101
<== len: 1
<== payload: 01
<== cmd_end (err 0)

<== Mesh status from 0x0004 dst 0xc000 rssi -23 element 1, model 0x1001 op 0x8204 len 1: 01
<== Mesh status from 0x0004 dst 0xc000 rssi -23 element 1, model 0x1001 op 0x8204 len 1: 01

Node 3 feature 1 Off

Pilotage avec Acknowledge du relais de sortie en OFF (payload 0002, on a incrémenté le Tid).

==> mesh models msg send-rsp 1 0x1001 0x04 0x8202 0x8204 0002
<== len: 1
<== payload: 00
<== cmd_end (err 0)

<== Mesh status from 0x0004 dst 0xc000 rssi -22 element 1, model 0x1001 op 0x8204 len 1: 00
<== Mesh status from 0x0004 dst 0xc000 rssi -21 element 1, model 0x1001 op 0x8204 len 1: 00

Réception de message Health “No fault”

Le model health-server ayant été configuré pour publier toutes les 10s, on recoit ces messages :

<== Health from 0x0003 test_id 0 cid 0x05f1 cnt 0:
<== Health from 0x0003 test_id 0 cid 0x05f1 cnt 0:
<== Health from 0x0003 test_id 0 cid 0x05f1 cnt 0:
<== Health from 0x0003 test_id 0 cid 0x05f1 cnt 0:

Désinstallation du produit

Node 3 Reset

Déprovisionning du produit par la commande node reset :

==> mesh target dst 0x0003
<== Destination address set to 0x0003
<== cmd_end (err 0)
==> mesh models cfg reset
<== Remote node reset complete
<== cmd_end (err 0)

# vérification
==> mesh cdb show
<== Mesh Network Information
<== ========================
<== Address  Elements  Flags  UUID                              DevKey
<== 0x0001   2         -      dddd0000000000000000000000000000  0123456789abcdef0123456789abcdef
<== > Total nodes: 1
<== ---
<== NetIdx  NetKey
<== 0x000   7e52b3a6c1674798b88bbdd6971e5985
<== > Total subnets: 1
<== ---
<== NetIdx  AppIdx  AppKey
<== 0x000   0x000   e6aa76aa7e1c00b714a0ab289d5fa92c
<== > Total app-keys: 1
<== cmd_end (err 0)