synology zwave node red

Vous utilisez un Raspberry Pi comme box domotique alors que vous avez un superbe NAS Synology qui possède un disque redondé et qui est sous-exploité ? Que diriez-vous d'utiliser votre NAS Synology comme box domotique via l'utilisation d'une image Docker de Node-Red et une clef USB ZWave ?

Les 3 ingrédients nécessaires sont :


Installation des modules "Serial" sur votre NAS :

Malheureusement, Synology a retiré les drivers "Serial" du Kernel Linux de son système d'exploitation, il faudra donc installer manuellement les drivers pour permettre à votre clef ZWave de fonctionner correctement et lui permettre d'être reconnue comme interface TTYUSB0.

Vérifiez le type de processeur de votre NAS :

https://www.synology.com/fr-fr/knowledgebase/DSM/tutorial/General/What_kind_of_CPU_does_my_NAS_have

Téléchargez les drivers USBSerial de la plateforme correspondant au type de CPU de votre NAS en vérifiant bien que votre NAS fonctionne en DSM 6.2 :

http://www.jadahl.com/drivers/DSM_6.2/

Allez dans l'application "Centre de paquets" de votre NAS pour installer ce paquet fraîchement téléchargé : install packet nas

Activez le terminal SSH de votre NAS : service ssh synology

Connectez-vous en SSH à notre NAS, le mot de passe est le mot de passe du compte administrateur :

$ ssh admin@<ip du NAS>

Récupérez les droits root :

$ sudo -s

Vérifiez que le kernel de votre NAS a bien identifié la clef USB ZWave :

# dmesg | grep tty
 722.055702] cp210x ttyUSB0: cp210x converter now disconnected from ttyUSB0


Préparez l'espace data

Le container Docker est stateless, afin d'éviter de perdre la configuration de votre système de domotique, vous allez devoir créer un volume spécifique. Dans mon cas j'utilise le répertoire : "/volume1/docker/data"

Lors du premier démarrage de votre container, Node-Red vous réclamera la présence d'un fichier "settings.js" dans ce répertoire data. Copiez ce fichier du repository GitHub de Node-Red et adaptez-le à vos besoins.

Node-Red vous demandera aussi la présence du répertoire "lib/flows". N'hésitez pas à initialiser ce répertoire afin de permettre à Node-Red de démarrer correctement.


Démarrez le container Node-Red :

Afin de démarrez correctement le container Node-Red, nous sommes obligé d'utiliser la ligne de commande shell de votre NAS, l'interface Web du NAS Synology ne supportant pas l'utilisation d'arguments avancés comme le "--device" utilisé pour exploiter le périphérique USB.

Lors des premiers démarrages, supprimez l'option "-d" pour visualiser sur la console les messages d'erreurs.

# docker run -d -t -i \
-e PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' \
-e NODE_VERSION='6.14.4' \
-e YARN_VERSION='1.6.0' \
-e FLOWS='flows.json' \
-e NODE_PATH='/usr/src/node-red/node_modules:/data/node_modules' \
-p 1880:1880 \
-v /volume1/docker/data:/data \
--device=/dev/ttyUSB0 \
--privileged \
--restart=always \
--name domogeek \
nodered/node-red-docker:latest

Connectez-vous au container Docker Node-Red :

# docker ps
(Identifiez l'id du container)

# docker exec -it --user root <id du container> bash

Le connecteur ZWave disponible sur Node-Red requiert la librairie OpenZwave pour fonctionner correctement. Il vous faudra compiler cette librairie pour permettre à votre noeud ZWave de fonctionner sur votre container Node-Red.

# wget https://github.com/OpenZWave/open-zwave/archive/V1.5.tar.gz
# tar -zxvf open-zwave-1.5.tar.gz
# cd open-zwave-1.5
# make 
# sudo make install

Ajoutez le répertoire /usr/local/lib64 dans le LD Library path de votre image Docker :

# echo "/usr/local/lib64" > /etc/ld.so.conf.d/zwave.conf
# ldconfig


Connectez-vous à l'interface d'administration de Node-Red

Ouvrez votre navigateur sur le port 1880 de votre NAS, vous devriez voir apparaître l'interface d'administration de Node-Red : http://<ip du nas>:1880

Installez les noeuds node-red-contrib-openzwave et node-red-contrib-mqtt-broker depuis le burger menu de droite dans l'item "Manage palette" : node red mqtt zwave

Redémarrer votre container Docker Node-Red depuis l'interface d'administration de Synology : docker synology restart

Intégrez le flow suivant via la fonction "Import -> clipboard" présente dans le burger menu de droite de l'interface Web :

[
  {
    "id": "5944d71.e21c728",
    "type": "zwave-in",
    "z": "e17e9ac1.145f38",
    "name": "Zwave",
    "controller": "e027a4e7.1c8068",
    "x": 90,
    "y": 100,
    "wires": [
      [
        "a4fe692d.6e5088"
      ]
    ]
  },
  {
    "id": "7ed78180.055c9",
    "type": "debug",
    "z": "e17e9ac1.145f38",
    "name": "",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "false",
    "x": 550,
    "y": 100,
    "wires": [
      
    ]
  },
  {
    "id": "5885ddff.850334",
    "type": "mosca in",
    "z": "e17e9ac1.145f38",
    "mqtt_port": 1883,
    "mqtt_ws_port": 8080,
    "name": "MQTT Server",
    "username": "",
    "password": "",
    "dburl": "",
    "x": 110,
    "y": 240,
    "wires": [
      [
        "bce0e2f.878f32"
      ]
    ]
  },
  {
    "id": "bce0e2f.878f32",
    "type": "debug",
    "z": "e17e9ac1.145f38",
    "name": "",
    "active": false,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "false",
    "x": 290,
    "y": 240,
    "wires": [
      
    ]
  },
  {
    "id": "3fd7c2af.4e2f1e",
    "type": "comment",
    "z": "e17e9ac1.145f38",
    "name": "ZWave Listener",
    "info": "",
    "x": 120,
    "y": 60,
    "wires": [
      
    ]
  },
  {
    "id": "c6190944.06fe08",
    "type": "comment",
    "z": "e17e9ac1.145f38",
    "name": "MQTT Server",
    "info": "",
    "x": 110,
    "y": 200,
    "wires": [
      
    ]
  },
  {
    "id": "a4fe692d.6e5088",
    "type": "function",
    "z": "e17e9ac1.145f38",
    "name": "Set the command class",
    "func": "var commandClass = {\n\t113 : "alarm",\n\t34 : "applicationStatus",\n\t133 : "association",\n\t155 : "associationCommandConfiguration",\n\t32 : "basic",\n\t80 : "basicWindowCovering",\n\t128 : "battery",\n\t// 0x56 : "crc16Encap",\n\t70 : "climateControlSchedule",\n\t129 : "clock",\n\t112 : "configuration",\n\t33 : "controllerReplication",\n\t144 : "energyProduction",\n\t130 : "hail",\n\t135 : "indicator",\n\t137 : "language",\n\t118 : "lock",\n\t114 : "manufacturerSpecific",\n\t50 : "meter",\n\t53 : "meterPulse",\n\t143 : "multiCmd",\n\t96 : "multiInstanceChannel",\n\t142 : "multiInstanceAssociation",\n\t0 : "noOperation",\n\t115 : "powerlevel",\n\t136 : "proprietary",\n\t117 : "protection",\n\t43 : "sceneActivation",\n\t156 : "sensorAlarm",\n\t48 : "sensorBinary",\n\t49 : "sensorMultilevel",\n\t39 : "switchAll",\n\t37 : "switchBinary",\n\t38 : "switchMultilevel",\n\t40 : "switchToggleBinary",\n\t41 : "switchToggleMultilevel",\n\t68 : "thermostatFanMode",\n\t69 : "thermostatFanState",\n\t64 : "thermostatMode",\n\t66 : "thermostatOperatingState",\n\t67 : "thermostatSetpoint",\n\t99 : "userCode",\n\t134 : "version",\n\t132 : "wakeUp"\n};\n\n// Check the topic\nif (msg.payload.cmdclass !== 'undefined'){\n    msg.topic = commandClass[msg.payload.cmdclass];\n} else {\n    msg.topic = "default";\n}\n\nreturn msg;",
    "outputs": 1,
    "noerr": 0,
    "x": 330,
    "y": 100,
    "wires": [
      [
        "7ed78180.055c9",
        "75d0448.b115cbc"
      ]
    ]
  },
  {
    "id": "75d0448.b115cbc",
    "type": "mqtt out",
    "z": "e17e9ac1.145f38",
    "name": "",
    "topic": "",
    "qos": "0",
    "retain": "false",
    "broker": "23cb3156.2a7d1e",
    "x": 530,
    "y": 160,
    "wires": [
      
    ]
  },
  {
    "id": "e027a4e7.1c8068",
    "type": "zwave-controller",
    "z": "",
    "port": "/dev/ttyUSB0",
    "driverattempts": "3",
    "pollinterval": "10000",
    "allowunreadyupdates": false,
    "networkkey": "",
    "logging": "full"
  },
  {
    "id": "23cb3156.2a7d1e",
    "type": "mqtt-broker",
    "z": "",
    "name": "",
    "broker": "localhost",
    "port": "1883",
    "clientid": "nodered",
    "usetls": false,
    "compatmode": true,
    "keepalive": "15",
    "cleansession": true,
    "birthTopic": "",
    "birthQos": "0",
    "birthPayload": "",
    "closeTopic": "",
    "closePayload": "",
    "willTopic": "",
    "willQos": "0",
    "willPayload": ""
  }
]

Vous devriez voir le flow suivant apparaître : node red admin synology

Ce flow est très simple, il consiste à démarrer un bus MQTT sur votre Node-Red et à distribuer les messages de votre réseau ZWave dans des topics spécifiques en fonction du type de message reçu. Ces topics étant :

  • 113 : "alarm",
  • 34 : "applicationStatus",
  • 133 : "association",
  • 155 : "associationCommandConfiguration",
  • 32 : "basic",
  • 80 : "basicWindowCovering",
  • 128 : "battery",
  • 70 : "climateControlSchedule",
  • 129 : "clock",
  • 112 : "configuration",
  • 33 : "controllerReplication",
  • 144 : "energyProduction",
  • 130 : "hail",
  • 135 : "indicator",
  • 137 : "language",
  • 118 : "lock",
  • 114 : "manufacturerSpecific",
  • 50 : "meter",
  • 53 : "meterPulse",
  • 143 : "multiCmd",
  • 96 : "multiInstanceChannel",
  • 142 : "multiInstanceAssociation",
  • 0 : "noOperation",
  • 115 : "powerlevel",
  • 136 : "proprietary",
  • 117 : "protection",
  • 43 : "sceneActivation",
  • 156 : "sensorAlarm",
  • 48 : "sensorBinary",
  • 49 : "sensorMultilevel",
  • 39 : "switchAll",
  • 37 : "switchBinary",
  • 38 : "switchMultilevel",
  • 40 : "switchToggleBinary",
  • 41 : "switchToggleMultilevel",
  • 68 : "thermostatFanMode",
  • 69 : "thermostatFanState",
  • 64 : "thermostatMode",
  • 66 : "thermostatOperatingState",
  • 67 : "thermostatSetpoint",
  • 99 : "userCode",
  • 134 : "version",
  • 132 : "wakeUp"

Il vous suffira ensuite de créer un client MQTT sur les topics de votre choix pour traiter les messages et réaliser les actions que vous souhaitez ... "Meter" pour les infos de SmartMetering, "sensorAlarm" pour les alarmes ...

Vous voilà avec un NAS Synology transformé en box domotique très puissante ! ;-)

1. Le , 13:40 par Antony
9a2e51ff6d49af524a83f4884c7d98dc

Ce qui est dommage c'est que tout ce fait avec le compte admin du nas.
Le SSH sur syno se fait uniquement en compte admin (à moins que ça ait changé).

2. Le , 16:20 par dedlefou
ab13cd21de3510e93407ed581fdb437c

Pour info si on peut passer des arguments via l'UI de docker hub.
Par contre le docker hub n'est pas dispo sur tous les nas... Uniquement les series + ;)

3. Le , 23:04 par Ludovic
9ab09dd3e305f924f8930e20e1a35843

@Antony : Effectivement, mais une fois en admin tu peux faire un sudo -s pour récupérer un shell root.

@Deldlefou : Pas sur DSM 6.2 ... A moins que j'ai loupé un écran ?

4. Le , 18:04 par Pascal
617df1c0a43521c2183881ee2a03a309

Top. Des idées pour du IO et RTS Somfy ?

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.