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 ! ;-)

christmas gift

Comme chaque année depuis déjà plusieurs années, voici ma sélection d'idées de cadeaux High-tech branchés pour Noël.

Un mini drone ultra-puissant

Le Beta75X 2S est probablement l'un des meilleurs mini-drone du marché capable de monter jusqu'à plus de 80km/h ... Il existe différents modèles, avec des batteries 1S ou 2S en fonction de la puissance que vous souhaitez. Comptez un budget de 100$ à 130$.

betafpv x75 2s

Le dernier assistant vocal

Vous être probablement déjà équipé d'un ou plusieurs assistants chez vous, mais c'est peut-être l'occasion d'en offrir à vos proches ? Le dernier assistant Echo Dot d'Amazon est commercialisé au prix de 59,99€

alexa

Le robot programmable Cozmo

Un robot pour enfants et adultes pour jouer et apprendre à coder. Il faisait déjà partie de la liste de 2017, mais je le remets dans cette liste 2018. C'est l'un des jouets les plus en vogue actuellement sur Amazon. Il est commercialisé au prix de 149,90€. Il dispose d'un SDK Python pour permettre d'enrichir ses compétences ... Le must have des papa geeks.

Un portefeuille de cryptomonnaies

Voici le Ledger Nano S, un portefeuille physique de cryptomonnaies. Il supporte pas moins de 20 cryptomonnaies, y compris Bitcoin, Ethereum, Ripple et Altcoins. C'est un moyen sécurisé pour stocker sa cryptomonnaie, à condition bien sûr de ne pas perdre la clef. Ce petit gadget est commercialisé au prix de 69,99€.

ledger

Un casque sans fil à réduction de bruit

Le Bose QuietComfort 35 II est probablement le meilleur casque sans fil à réduction de bruit du marché. Au prix de 329€, il peut se le permettre d'être le meilleur ... Il est équipé d'un assistant vocal embarqué : Alexa.

bose quiet confort

ColorReader

Je viens de recevoir le scanner de couleur ColorReader de DataColor capable de retrouver la référence de la peinture de tous les objets qui nous entourent.

Cet objet, de la taille d'une boite d'aspirine, fonctionne grâce à une application mobile sur iOS et Android et d'une communication Bluetooth.

L'utilisation du ColorReader est très simple :

  1. Vous appuyez sur le bouton du scanner.
  2. Votre téléphone mobile affiche la référence de la couleur scannée.
  3. Vous pouvez créer des palettes de couleur et les partager grâce à Internet.

Voici à titre d'exemple les couleurs de tous les objets qui décorent de mon salon : color reader ios

Voici à quoi ressemble le portail Web généré dès lors que l'on souhaite partager une palette de couleurs : https://dache-production.herokuapp.com/palette/A0jYmgbM/

Le ColorReader permet de retrouver des références de peintures et de comparer des couleurs virtuellement.

Pour les développeurs d'applications, un SDK est disponible pour intégrer l'utilisation de cet objet dans vos applications. Ce SDK n'est malheureusement pas en libre téléchargement, mais peut être obtenu en contactant DataColor.

Cet objet connecté est disponible au prix de 117.81€ en version classique et 296.31€ pour la version professionnelle. C'est un objet indispensable pour des professionnels de la décoration, il peut être pratique pour un particulier qui se lance dans un chantier de décoration.

Il ne manque au ColorReader qu'une intelligence artificielle pour identifier les palettes de couleur de mauvais goût et réaliser des propositions de couleurs sur la base de ce que vous avez déjà dans votre pièce.

amazon reduction livraison 1centime

Après la semaine Black Fiday, Amazon anticipe la vague de Noël et réduit le prix de ses livraisons à 0.01 euros.

Cette offre est valable pour l'ensemble des produits expédiés par Amazon à partir du jeudi 29 novembre 2018 à 00h01 au mercredi 5 décembre 2018 à 23h59

Cette promotion vous évitera de payer la livraison au prix fort si le montant de votre commande ne dépasse pas les 25€.

N'oubliez pas de saisir le code "LIVRAISON" comme bon de réduction pour profiter de l'offre.

Si vous recherchez des idées de cadeaux à offrir à vos proches, Amazon a créé une page dédiée pour vous aider à trouver des idées.

idees cadeaux noel

confluence

Vous connaissez probablement Confluence ,un Wiki très riche édité par Atlassian qui permet de construire rapidement des espaces collaboratifs pour des projets informatiques.

Ce produit est excellent, l'un des seuls inconvénients que l'on pourrait lui reprocher est son algorithme de construction d'URL un peu simpliste qui consiste à construire des URL "propres" seulement si le titre de la page contient des caractères ASCII.

Cette règle fonctionne bien pour des sites anglophones. Cependant dès lors qu'un caractère accentué apparaît dans le titre d'une page, les URL générées sont des identifiants numériques dénuées de sens syntaxique ....

Exemple d'une URL propre :

https://mon-wiki/display/SPA/Introduction

Exemple d'une URL basée sur l'ID du contenu dès lors que le titre contient un caractère non ASCII :

https://mon-wiki/pages/viewpage.action?pageId=327894

Dans le cadre d'un usage interne, cette règle n'est pas importante, elle l'est cependant dès lors que Confluence est utilisé pour publier du contenu sur Internet. Les mots clefs contenus dans les URL étant pris en compte comme règle de SEO, la construction de l'URL des pages est donc très importante.

La bonne nouvelle est que Atlassian partage le code source de ces outils et que la modification nécessaire pour permettre à Confluence de mieux supporter les accents dans les titres est très simple à réaliser.

Le patch consiste à supprimer les accents dans la fonction getPageUrl de la classe GeneralUtil avant d'appeler la fonction isSafeTitleForUrl qui permet de décider si l'URL de la page à utiliser peut être propre ou non.

Cette classe se trouve dans l'arborescence suivante du code source :

confluence-project/confluence-core/confluence/src/java/com/atlassian/confluence/util

Pour cela on peut s'appuyer sur la fonction stripAccents de la classe StringUtils disponible dans la librairie Commons Lang3.

public static String getPageUrl(AbstractPage page) {
        if (page == null || (page.isLatestVersion() && page.getSpace() == null))
            return "";

        String title = page.getTitle();

        /**
          * @HACK : Suppression des caractères accentués avant vérification 
          * de l'éligibilité du titre à être utilisé comme URL
          **/ 
        title = org.apache.commons.lang3.StringUtils.stripAccents(title);
        	
        // only use simple/nice page url if the page does not contain:
        // - non-ASCII characters
        // - '+' or '-' characters because these can be picked up by the insert and stripe through filters
        // - double quotes (") because orion doesn't play nicely with them (CONF-1287)
        // - ends in punctuation (CONFDEV-3995)
        if (isSafeTitleForUrl(title) && page.isLatestVersion())
            return toDisplayUrl(page);
        else
            return getIdBasedPageUrl(page);
    }

Une fois la modification réalisée, vous devrez compiler la classe et patcher le JAR "confluence-X.X.X.jar" avec le fichier "GeneralUtil.class" compilé. Cette petite modification vous permettra d'obtenir de belles URL sur votre serveur Confluence malgré l'utilisation de caractères accentués de la langue française.

Il est possible d'aller plus loin pour construire des URL plus "SEO friendly", cependant l'outil est conçu pour retrouver un contenu en comparant l'URL reçue aux titres des pages ... Une suggestion d'évolution a été proposée à Atlassian pour ajouter un attribut URL aux pages afin de séparer le contenu du titre des pages aux URL des contenus. Wait & see !

trend micro maximum security 2018

Je profite de ce post pour offrir un numéro de licence à Trend Micro Maximum Security 10 pour 1 an et 3 périphériques au premier lecteur qui souhaite utiliser cet antivirus complet.

Le premier lecteur intéressé qui publie un commentaire à cet article recevra le numéro de licence par email.

L'antivirus est téléchargeable depuis le portail www.trendmicroupdate.com

Vous n'avez pas eu la chance de participer au DevFest Nantes 2018, le 3ème plus grand événement français autour du développement informatique ? Les vidéos des différentes conférences viennent d'être publiées sur Youtube la semaine dernière, profitez-en !

Le DevFest Nantes fut encore une fois au top, plus de visiteurs, plus de speakers .... Vous souhaitez être inspiré, découvrir de nouvelles technologies ? Voici de quoi passer vos longues soirées d'hiver :

  1. Opening keynote / Keynote d'ouverture
  2. Rémunération Poker
  3. Git Dammit !
  4. Penser son infrastructure comme du code
  5. Au pays des Gophers à partir de 3 ans
  6. Shaving my head made me a better programmer
  7. La "process communication" ou comment faire rentrer les gens dans des cases
  8. Passez vos tests end to end en vitesse lumière avec Cypress
  9. Machine Learning & JS Take your PWA to the next level
  10. Hacker les catastrophes naturelles
  11. Enlarge your team !
  12. Comment perdre sa surchage featurale
  13. AI Takeover
  14. Ready for Angular version 8
  15. Vanilla JS 2018
  16. La conquête de l'espace se déroule dans votre poche
  17. Kotlin Coroutines
  18. Ready for Angular version 8
  19. L'infrastructure as code avec Terraform
  20. Où sont les femmes ?
  21. Détectez et trackez les aliens qui se cachent dans vos dépendances
  22. Séquenceur MIDI en NodeJS sur Raspberry PI
  23. Serveur d'intégration mobile gitlab ci avec Fastlane
  24. Android all the things !
  25. Typographie et accessibilité
  26. Concourse : CI/CD version 2020 !
  27. Highway to Elm !
  28. Push du Machine Learning dans ton app When TensorFlow and MLKit rule the world
  29. Lisibilité & Design Construisons des expériences numériques inclusives
  30. Le storytelling et la fiction pour imaginer de nouveaux lendemains
  31. Les nouveautés "serverless" de Google Cloud
  32. Deliver search friendly JavaScript powered websites
  33. Compassion First Design pour l'intelligence artificielle
  34. Kubeflow : Tensorflow on Kubernetes
  35. Créer un datapipeline en 20 minutes avec Kafka Connect
  36. Istio, we have a problem! Understanding and fixing bugs with a service-mesh
  37. Partir à la découverte du serverless avec OpenFaas
  38. Neuro Game Experience : Votre pensée prend le contrôle !
  39. The next big thing in (client side) templating
  40. Look mum, no hands ! Mind control in JavaScript
  41. Ghost in the Machine
  42. Un joli template ne rendra pas votre produit utilisable
  43. What's up TC39
  44. The postmodern API gRPC on Android
  45. How do we use Vue js in GitLab
  46. Shaping your app’s architecture with Kotlin and Architecture Components
  47. Automate your whole iOS Projects & share resources with Android
  48. Creating a geolocation app powered by Firebase
  49. Secret Management with Hashicorp's Vault
  50. Hello from the other side
  51. SSR, SPAs and PWAs
  52. Optimize App Downloads with Android App Bundle and Dynamic Delivery
  53. Crafting a Character Create a Persona for your Google Assistant App
  54. Fast and Beautiful Modern Image Delivery Techniques
  55. What Can We Learn With JavaScript Fatigue
  56. Il développe une solution SaaS sans se soucier de la sécurité ...

Un grand merci au GDG, à tous les bénévoles et aux sponsors qui permettent à cet événement d'exister !

Nantes the place to dev !

Bonsoir, voici comme prévu le résultat du tirage au sort pour les deux places au DevFest Nantes qui aura lieu cette année les 18 et 19 octobre prochain.

Les deux gagnants sont les commentaires 23 et 13, soit Sylvain et Julie ! random devfest

Un grand merci aux 34 participants, aux organisateurs du DevFest pour la première place offerte et à Oniti pour la seconde place offerte à cet événement très attendu à Nantes.

Logo Oniti