TUTO : Piloter ses volets Somfy IO avec Node-RED et le pack sécurité de la Freebox Delta

1) Freebox Home

Pour piloter ces volets depuis l’API Free (Node-RED) ou autre il faut dans un premier temps appairer ces volets avec l’application Freebox Home. Si les volets ne sont pas intégrés dans l’application de Free alors ils ne seront pas accessible depuis Node-RED et donc de Gladys.

2) Création virtual device dans l’intégration MQTT de Gladys

Pré-requis : Installer le brocker MQTT dans Gladys.

Ajouter un virtual device dans l’intégration MQTT avec les fonctionnalités Position du volet et Etat du volet.

3) Installation dans Node-RED

Pré-requis : Avoir installer Node-RED et configurer le broker MQTT. Si besoin aller voir la vidéo de @Pierre-Gilles

Pour piloter ses volets depuis Node-RED il faut installer node-red-contrib-freebox.
Pour cela se rendre dans le menu de Node-RED et cliquer sur Manage palette.

Dans l’onglet Install rechercher freebox et installer node-red-contrib-freebox.

Une fois installé les nœuds Freebox seront alors disponible dans la barre de gauche.
image

4) Configuration de la connexion avec la freebox.

Ajouter un nœud api sur votre flow Node-RED et faite un double-clic pour ouvrir la page de propriétés.

image

Sur la ligne serveur cliquer sur le crayon pour créer une nouvelle freebox.

Indiquez l’URL de votre freebox et le port
image

Cliquer ensuite sur Add pour ajouter la configuration.

Pour tester la connexion c’est possible d’ajouter un nœud Inject en entrée et un nœud Debug en sortie du nœud API.

Dans le nœud Inject envoyer le message ci-dessous. Cela permettra de récupérer tous les devices connectés de votre freebox ainsi que leur état. Le résultat de ce flow permettra de récupérer plus tard les identifiants de nos volets.

image

Un image du flow
image

Le code de ce flow pour l’importer directement dans Node-Red.

[
    {
        "id": "1d67dee27a16208d",
        "type": "group",
        "z": "d7c3929073ea7b03",
        "name": "Call API Freebox",
        "style": {
            "fill": "#dbcbe7",
            "label": true,
            "color": "#000000"
        },
        "nodes": [
            "4f8f16965ae54f50",
            "72e75292b4cb21f9",
            "7dd73ca182891c1b"
        ],
        "x": 1254,
        "y": 699,
        "w": 552,
        "h": 82
    },
    {
        "id": "4f8f16965ae54f50",
        "type": "api",
        "z": "d7c3929073ea7b03",
        "g": "1d67dee27a16208d",
        "name": "",
        "url": "",
        "server": "35b9faf136b9302a",
        "x": 1530,
        "y": 740,
        "wires": [
            [
                "72e75292b4cb21f9"
            ]
        ]
    },
    {
        "id": "72e75292b4cb21f9",
        "type": "debug",
        "z": "d7c3929073ea7b03",
        "g": "1d67dee27a16208d",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1690,
        "y": 740,
        "wires": []
    },
    {
        "id": "7dd73ca182891c1b",
        "type": "inject",
        "z": "d7c3929073ea7b03",
        "g": "1d67dee27a16208d",
        "name": "/home/tileset",
        "props": [
            {
                "p": "url",
                "v": "/home/tileset/all",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "x": 1370,
        "y": 740,
        "wires": [
            [
                "4f8f16965ae54f50"
            ]
        ]
    },
    {
        "id": "35b9faf136b9302a",
        "type": "freebox-server",
        "host": "https://mafreebox.freebox.fr",
        "port": "443"
    }
]

Lors de la première requête il sera nécessaire de valider l’application directement sur la façade de votre Freebox Delta.
image

Le nom Node-RED s’affichera sur la façade.
Attention il y a un délai pour accepter la demande. Si vous ne valider pas, la Freebox refusera la connexion avec Node-RED.

Ce n’est pas fini côté Freebox, il faudra aussi autoriser la lecture du pack sécurité dans les paramètres de la Freebox.

Pour cela se rendre sur Freebox OS ( https://mafreebox.freebox.fr), connectez vous et aller dans Paramètres de la Freebox et Gestion des accès
image
image

Dans Gestion des accès, dans l’onglet Application, vous devez retrouver une ligne correspondant à Node-RED
image

Cliquer sur le crayon à droite pour modifier les autorisations.
image

Cocher la case Gestion de l’alarme et maison connectée
image

5) Création du flow pour lire la position d’un volet

Il faudra configurer ces 3 noeuds et les adapter en fonction de votre installation.

1. noeud Poll free

image

Nom: nom de votre volet
Url: url pour intérrogé l’API free sur la position de votre volet… Ici il faudra changer uniquement la valeur 30 et indiqué la valeur node_id de votre volet. (voir ci dessous pour retrouver le node_id de votre volet
Interval: période en ms pour l’interrogation de l’API. Si vous réglé cette valeur sur 3000 cela veut dire que Node-RED va envoyé une requête à la Freebox toutes les 3s.
Serveur: indiquer ici votre freebox créer précédement. Vous devez retrouver ce choix en appuyant sur la flèche

Comment trouver le node_id de votre volet?
Pour retrouver le node_id il suffit d’exécuter le premier flow et de cherche la valeur dans le retour.
Développer le tableau obtenu jusqu’à trouver l’indication action: « store_slider »


En dessous vous pouvez donc lire l’identifiant de votre volet. Pour moi il s’agit donc de l’identifiant 30.

2. noeud fonction
Le noeud ‹ Get only the value › pas besoin de le modifier. La fonction inverse la valeur obtenu pour l’afficher correctement dans Gladys.

3. noeud MQTT OUT

Indiquez la valeur du topic MQTT de votre device MQTT dans Topic MQTT pour publier.

Le résultat dans Gladys, vous aurez une lecture la position de votre volet.
image

Ci dessous le flow Node-RED

[
    {
        "id": "83c677d56359578d",
        "type": "poll",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "Volet Bureau",
        "url": "/home/tileset/30",
        "interval": "3000",
        "server": "35b9faf136b9302a",
        "x": 1150,
        "y": 540,
        "wires": [
            [
                "633f74301050d2f8"
            ]
        ]
    },
    {
        "id": "633f74301050d2f8",
        "type": "function",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "Get only the value",
        "func": "msg.payload = 100 - msg.payload[0].data[0].value;\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1750,
        "y": 540,
        "wires": [
            [
                "1ab1d89e132c7653"
            ]
        ]
    },
    {
        "id": "1ab1d89e132c7653",
        "type": "mqtt out",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "Update Gladys value",
        "topic": "gladys/master/device/mqtt:volet_bureau/feature/mqtt:position_volet_bureau/state",
        "qos": "2",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "05eac840560ca08c",
        "x": 2080,
        "y": 540,
        "wires": []
    },
    {
        "id": "35b9faf136b9302a",
        "type": "freebox-server",
        "host": "https://mafreebox.freebox.fr",
        "port": "443"
    },
    {
        "id": "05eac840560ca08c",
        "type": "mqtt-broker",
        "name": "GladysMQTT",
        "broker": "192.168.***.***",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    }
]

6) Création du flow pour modifier la position d’un volet

1. noeud MQTT IN
image

Serveur : Votre broker MQTT Gladys
Topic: Le topic de votre device slider récupérer dans l’intégration MQTT correspondant à la posititon de votre volet.
image

image

2. noeud fonction
Le noeud ‹ Convert to the correct value › il faudra modifier les identifiants dans l’URL pour mettre ceux de votre volet. La il y a 2 identifiants à récupérer, node_id qui correspont à votre volet et ep_id qui correspond à la fonctionnalité de votre volet.
Le message url est de ce format « /home/endpoints/node_id/ep_id »

image
Pour récupérer ces identifiants utiliser le premier flow que je vous ai donné.


Le node_id c’est toujours le même que dans le flow précédent.
Le ep_id se trouve dans la section data et il s’agit de la fonctionnalité position. Donc ici pour mon volet la valeur 3.

Cette valeur doit être identique pour tout le monde.

3. noeud api free
Indiquer l’url de votre freebox comme dans le premier flow.
image

Ci dessous le flow à importer dans node-RED.

[
    {
        "id": "42f1d4ec5102ed80",
        "type": "mqtt in",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "Gladys value",
        "topic": "gladys/device/mqtt:volet_bureau/feature/mqtt:position_volet_bureau/state",
        "qos": "2",
        "datatype": "auto-detect",
        "broker": "05eac840560ca08c",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 1150,
        "y": 660,
        "wires": [
            [
                "3bb82c10f8678d6a"
            ]
        ]
    },
    {
        "id": "3bb82c10f8678d6a",
        "type": "function",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "Convert to the correct value",
        "func": "msg.url = \"/home/endpoints/30/3\"\nmsg.method = \"PUT\"\nmsg.payload = {\n    \"value\": 100 - msg.payload\n}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1540,
        "y": 660,
        "wires": [
            [
                "77d7357b042a5833"
            ]
        ]
    },
    {
        "id": "77d7357b042a5833",
        "type": "api",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "",
        "url": "",
        "server": "35b9faf136b9302a",
        "x": 1950,
        "y": 660,
        "wires": [
            [
                "4efe8217d70b5fe3"
            ]
        ]
    },
    {
        "id": "4efe8217d70b5fe3",
        "type": "debug",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "debug 26",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 2200,
        "y": 660,
        "wires": []
    },
    {
        "id": "05eac840560ca08c",
        "type": "mqtt-broker",
        "name": "GladysMQTT",
        "broker": "192.168.***.***",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    },
    {
        "id": "35b9faf136b9302a",
        "type": "freebox-server",
        "host": "https://mafreebox.freebox.fr",
        "port": "443"
    }
]

7) Création d’un flow pour modifier la position d’un volet avec un bouton 3 état (OPEN / STOP / CLOSE)

1. noeud MQTT IN
image
Serveur : Votre broker MQTT Gladys
Topic: Le topic de votre device Etat du volet à récupérer dans l’intégration MQTT.

Pas besoin de toucher au 2 noeuds suivant (json et switch)

Le switch permettra de sélectionner l’action à éxécuté en fonction de l’appui sur le bouton dnas Gladys.

2. noeuds OPEN STOP CLOSE
Dans ces 3 noeuds modifier l’adresse URL indiquer l’id de votre volet à la place de la valeur 30.
image

3. noeud api free
Indiquer l’url de votre freebox comme dans le premier flow.
image

La deuxième partie du flow permet de sélectionner le bouton STOP dans Gladys au bout de 15s.
image
image
Ici on peut voir que le STOP est grisé (donc sélectionner). Je trouvais cela mieux visuellement de repasser l’état du bouton à STOP au bout d’un certain moment. Cette partie peut être supprimé.
Il faudra juste ici configurer le noeud MQTT OUT avec le topic de votre bouton. Topic à récupérer dans Gladys.
image

Ci dessous le flow à importer dans node-RED

[
    {
        "id": "471ec274b89ba7a7",
        "type": "mqtt in",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "Gladys value",
        "topic": "gladys/device/mqtt:volet_bureau/feature/mqtt:cmd_volet_bureau/state",
        "qos": "2",
        "datatype": "auto-detect",
        "broker": "05eac840560ca08c",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 1150,
        "y": 320,
        "wires": [
            [
                "79ea0b61e2b9efd3"
            ]
        ]
    },
    {
        "id": "79ea0b61e2b9efd3",
        "type": "json",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 1290,
        "y": 320,
        "wires": [
            [
                "661245a7f638d8d1"
            ]
        ]
    },
    {
        "id": "661245a7f638d8d1",
        "type": "switch",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "1",
                "vt": "num"
            },
            {
                "t": "eq",
                "v": "0",
                "vt": "num"
            },
            {
                "t": "eq",
                "v": "-1",
                "vt": "num"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 3,
        "x": 1410,
        "y": 320,
        "wires": [
            [
                "e67eee566c013802",
                "06446de47c9607fd"
            ],
            [
                "cd893f51cc091045"
            ],
            [
                "51d16ab4960719bd",
                "06446de47c9607fd"
            ]
        ],
        "outputLabels": [
            "Open",
            "Stop",
            "Close"
        ]
    },
    {
        "id": "cd893f51cc091045",
        "type": "function",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "STOP",
        "func": "msg.url = \"/home/endpoints/30/1\"\nmsg.method = \"PUT\"\nmsg.payload = {\n    \"value\": null\n}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1710,
        "y": 320,
        "wires": [
            [
                "8654a1df5516031e"
            ]
        ]
    },
    {
        "id": "e67eee566c013802",
        "type": "function",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "OPEN",
        "func": "msg.url = \"/home/endpoints/30/3\"\nmsg.method = \"PUT\"\nmsg.payload = {\n    \"value\": 0\n}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1710,
        "y": 280,
        "wires": [
            [
                "8654a1df5516031e"
            ]
        ]
    },
    {
        "id": "51d16ab4960719bd",
        "type": "function",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "CLOSE",
        "func": "msg.url = \"/home/endpoints/30/3\"\nmsg.method = \"PUT\"\nmsg.payload = {\n    \"value\": 100\n}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1720,
        "y": 360,
        "wires": [
            [
                "8654a1df5516031e"
            ]
        ]
    },
    {
        "id": "06446de47c9607fd",
        "type": "trigger",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "Wait for stable value",
        "op1": "",
        "op2": "",
        "op1type": "nul",
        "op2type": "payl",
        "duration": "15",
        "extend": true,
        "overrideDelay": false,
        "units": "s",
        "reset": "",
        "bytopic": "all",
        "topic": "topic",
        "outputs": 1,
        "x": 1500,
        "y": 400,
        "wires": [
            [
                "0714f8d0c789b85c"
            ]
        ]
    },
    {
        "id": "534e1350127d6e31",
        "type": "mqtt out",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "Update Gladys value",
        "topic": "gladys/master/device/mqtt:volet_bureau/feature/mqtt:cmd_volet_bureau/state",
        "qos": "2",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "05eac840560ca08c",
        "x": 2080,
        "y": 400,
        "wires": []
    },
    {
        "id": "0714f8d0c789b85c",
        "type": "function",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "Set value to 0",
        "func": "msg.payload = 0;\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1740,
        "y": 400,
        "wires": [
            [
                "534e1350127d6e31"
            ]
        ]
    },
    {
        "id": "8654a1df5516031e",
        "type": "api",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "",
        "url": "",
        "server": "35b9faf136b9302a",
        "x": 2050,
        "y": 300,
        "wires": [
            [
                "d08253b67c85d52f"
            ]
        ]
    },
    {
        "id": "d08253b67c85d52f",
        "type": "debug",
        "z": "facf6f6a9a445bc5",
        "g": "7a04e315ea806549",
        "name": "debug 23",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 2220,
        "y": 300,
        "wires": []
    },
    {
        "id": "05eac840560ca08c",
        "type": "mqtt-broker",
        "name": "GladysMQTT",
        "broker": "192.168.***.***",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    },
    {
        "id": "35b9faf136b9302a",
        "type": "freebox-server",
        "host": "https://mafreebox.freebox.fr",
        "port": "443"
    }
]
7 « J'aime »

@_Will_71

Et pour les piloter en fonction de la position du soleil il y a un tuto ici

1 « J'aime »

OK cool après c’est pas une fonction qui m’intéresse mais si çà peut servir à quelqu’un.

Mon tuto est terminée. :smile:

3 « J'aime »

Salut @_Will_71,
Super ton tuto, juste 1/2 petits détails :
Ici préciser « uniquement la valeur » 30…

Et ici remplacer « slider » par volet pour rester cohérent avec le reste du tuto

Tu vois vraiment des détails histoire de chipoter :smile: :smile: :smile:
Je testerais en détails de suivre quand je mettre çà en prod, mais j’hésite à attendre la mise en prod du lancement de node-red en un clic sur Gladys.

Encore merci et :clap: :clap:

1 « J'aime »

Merci de ton retour.
Pour le slider, j’ai juste ajouter device devant car c’était vraiment pour indiquer la fonctionnalité MQTT.

Et normalement, je vais mettre l’image de l’intégration dans la semaine.

1 « J'aime »