Hack : Transformez votre NAS Synology en Box Domotique ZWave
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 :
- Un NAS Synology.
- Une clef ZWave pour vos capteurs.
- Un image docker Node-Red que l'on téléchargera via Docker Hub.
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 :
Allez dans l'application "Centre de paquets" de votre NAS pour installer ce paquet fraîchement téléchargé :
Activez le terminal SSH de votre NAS :
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 : https://
Installez les noeuds node-red-contrib-openzwave et node-red-contrib-mqtt-broker depuis le burger menu de droite dans l'item "Manage palette" :
Redémarrer votre container Docker Node-Red depuis l'interface d'administration de Synology :
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 :
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 ! ;-)