Domoticz , KLF-200 et Velux Integra io homecontrol
Publié : 26 oct. 2020, 20:01
Bonjour à tous,
J'ai réussi à faire fonctionner de bout en bout mon installation Domoticz / KLF-200.
Le net n'aide pas beaucoup sur le sujet, j'aimerai donc partager ici la démarche pour y arrriver.
Ma config:
Domoticz <--in/out --> MQTT Broker <---> Node-Red + Node-red-contrib-velux <---> Velux KLF-200 <---> Velux Integra avec volet extérieur.
Prérequis : https://www.domoticz.com/wiki/MQTT
1- Avoir installer un MQTT Broker type mosquitto https://mosquitto.org/blog/2013/01/mosq ... epository/
2- Avoir installer Node-Red https://nodered.org/docs/getting-started/raspberrypi
3- installer node-red-contrib-velux (version 0.0.4) (ne pas faire via l'install de palette dans l'interface web de node-red, la version sera 0.0.3 et ne marchera pas).
4- Avoir installer et configurer le KLF-200: choisir le mode interface,
suivre les instructions pour importer les produits Velux ainsi que les scènes. Une scène doit exister sinon le velux-node plantera dans Node-red.
Coté Domoticz:
1- Créer un hardware Velux Dummy
2- Depuis ce Velux Dummy et pour chaque équipement , Créer un "virtual sensor" de type "blinds percentage" et noter les idx (classique), prendre soin de nomer de manière similaire les équipements comme dans le KLF-200 pour faciliter la correspondance plus tard dans Node-Red.
************************************************
Mise à jour du 27 Novembre 2022:
La toute dernière version de Domoticz 2022.2, impose une correction sur les équipements de type "blinds", ce qui est le cas pour les fenêtre Velux et les volets :
Reverse Open/Close State: Enabled
et permet d'avoir le bon status, Ouvert/Fermé.
************************************************
3- Ajouter le hardware MQTT Client Gateway with LAN interface qui pointe sur le MQTT Broker (prevent loop = true)
Coté Node-Red:
Retour d'état dans Domoticz:
1- Créer la chaine suivante :
- Importer le code dans node-red :
- Configurer la connexion mqtt-broker dans le node domoticz/in
- Idem dans Velux-Nodes, l'adresse ip et le mot de passe du KLF-200 (mot de passe du WIFI !!! )
- Déployer le nouveau flux.
- Surveiller la console Debug voir s'il y a des erreurs de connexion au KLF-200.
- connected doit s'afficher sous le topic domoticz/in
Récupérer les nodeID Velux pour faire la correspondance avec les idx Domoticz :
http://hostname:1880/velux/nodes (hostname = ip où est installé node-red)
Exemple de réponse :
[{"id":3,"name":"VoletVeluxDroit","order":3},{"id":2,"name":"VoletVeluxGauche","order":2},{"id":0,"name":"VeluxDroite","order":1},{"id":1,"name":"VeluxGauche","order":0}]
Si votre réponse est [] , vérifier la connexion au KLF-200 ou la version de contrib-velux qui doit être la 0.0.4. Relancer Node-red : sudo node-red-restart et en dernier, un reboot est peut être nécessaire après l'installation de node-red et .contrib-velux.
Si tout va bien :
- Editer la fonction "Update Position" et adapater le code avec vos idx des virtuals sensors créés dans Domoticz et les id de Velux (nodeID = id) , donc mon cas j'ai 4 équipements, donc 4 conversions.
- Ne pas utiliser "order" qui correspond à l'ordre d'affichage des produits Velux dans le KLF-200.
- C'est un exemple que codage dans Node-red, qui peut être optimisé, je ne suis pas un spécialiste.
- Le statut Velux est envoyé, dès un changement de position et toutes les 15 mn pour les équipements branchés sur le 220V, toutes les heures si sur batterie à haut rendement et 1 fois par jour pour les batteries à faible rendement.
- Une fois la fonction adaptée à votre installation: Deployer à nouveau le flux
- Tester avec le bouton 'LectureVelux', une information remonte dans la console Debug et dans la log de Domoticz.
Exemple:
- Vérifer que Domoticz les traite correctement, qu'il n'y a pas d'erreur d'idx. :
Exemple:
Cette partie est terminée, vous pouvez utiliser votre télécommande Velux pour constater que le retour d'état remonte bien sur Domoticz.
2- Créer la chaine de commande:
C'est plus complex, mais simple à comprendre.
Importer ce code dans le même flux (au popup, valider "import copy" puisque des nodes existent déjà):
- Configurer la connexion mqtt-broker dans le node domoticz/out, normalement la connexion existe déjà du précédent import.
- Idem pour l'API Velux qui utilise le même "velux-connection" , juste vérifier l'adresse ip et le mot de passe du velux-node (celui du WIFI !!! ).
- Editer "VeluxMSG" pour faire correspondre vos équipements, j'ai utilisé la variable "name", on peut utiliser la variable "idx", à vous d'adapter ce node.
- Editer chaque SetxxxxnodeID en fonction de votre installation.
- Deployer votre flux.
- Tester depuis Domoticz et les nouveaux "virtual sensors".
- Vérifier les logs Domoticz et la console Debug de Node-red. Console qui pourra être désactivé en cliquant sur le bouton vert à droite de msg.payload.
Et c'est tout !
ça devrait ressembler à ça :
Remarque : Ma configuration est limitée à 2 Fenêtre de toit Velux Integra et 2 volets/stores extérieurs.
La fonction "BougePosition" devra être adaptée à vos équipements, voir renomée si vous utiliser des lampes, des intérupteurs, des portes de garage, et j'en passe.
Je vous invite à fouiller dans le code klf.js pour retrouver la bonne structure JSON du msg.payload qu'il faudra envoyer à l'API Velux.
https://github.com/PLCHome/velux-klf200-api
https://github.com/PLCHome/velux-klf200 ... lib/klf.js
Il s'agit du même contributeur que pour le node-red-contrib-velux (version 0.0.4) , donc la structure est la même, qu'on retrouve ici:
https://github.com/PLCHome/node-red-contrib-velux
Merci de m'avoir lu jusqu'au bout...
J'ai réussi à faire fonctionner de bout en bout mon installation Domoticz / KLF-200.
Le net n'aide pas beaucoup sur le sujet, j'aimerai donc partager ici la démarche pour y arrriver.
Ma config:
Domoticz <--in/out --> MQTT Broker <---> Node-Red + Node-red-contrib-velux <---> Velux KLF-200 <---> Velux Integra avec volet extérieur.
Prérequis : https://www.domoticz.com/wiki/MQTT
1- Avoir installer un MQTT Broker type mosquitto https://mosquitto.org/blog/2013/01/mosq ... epository/
2- Avoir installer Node-Red https://nodered.org/docs/getting-started/raspberrypi
3- installer node-red-contrib-velux (version 0.0.4) (ne pas faire via l'install de palette dans l'interface web de node-red, la version sera 0.0.3 et ne marchera pas).
Code : Tout sélectionner
sudo node-red-stop
cd ~/.node-red/
npm install node-red-contrib-velux@0.0.4
sudo node-red-start
suivre les instructions pour importer les produits Velux ainsi que les scènes. Une scène doit exister sinon le velux-node plantera dans Node-red.
Coté Domoticz:
1- Créer un hardware Velux Dummy
2- Depuis ce Velux Dummy et pour chaque équipement , Créer un "virtual sensor" de type "blinds percentage" et noter les idx (classique), prendre soin de nomer de manière similaire les équipements comme dans le KLF-200 pour faciliter la correspondance plus tard dans Node-Red.
************************************************
Mise à jour du 27 Novembre 2022:
La toute dernière version de Domoticz 2022.2, impose une correction sur les équipements de type "blinds", ce qui est le cas pour les fenêtre Velux et les volets :
Reverse Open/Close State: Enabled
et permet d'avoir le bon status, Ouvert/Fermé.
************************************************
3- Ajouter le hardware MQTT Client Gateway with LAN interface qui pointe sur le MQTT Broker (prevent loop = true)
Coté Node-Red:
Retour d'état dans Domoticz:
1- Créer la chaine suivante :
- Importer le code dans node-red :
Code : Tout sélectionner
[
{
"id": "774ff8d2.0467c8",
"type": "Velux Nodes",
"z": "6e3cbaf0.36e4e4",
"name": "",
"datasource": "e59f5b49.c02b58",
"index": "-1",
"nodevalue": "ALL",
"topic": "",
"x": 590,
"y": 80,
"wires": [
[
"d7808506.616dc8",
"209dd4dd.4e37ac"
]
]
},
{
"id": "a2494c81.43609",
"type": "mqtt out",
"z": "6e3cbaf0.36e4e4",
"name": "",
"topic": "domoticz/in",
"qos": "",
"retain": "",
"broker": "26a40b17.e8e744",
"x": 1030,
"y": 80,
"wires": []
},
{
"id": "209dd4dd.4e37ac",
"type": "debug",
"z": "6e3cbaf0.36e4e4",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1030,
"y": 160,
"wires": []
},
{
"id": "d7808506.616dc8",
"type": "function",
"z": "6e3cbaf0.36e4e4",
"name": "UpdatePosition",
"func": "var dt = new Date();\n\nvar nodeID = msg.payload.nodeID;\nvar cpv = msg.payload.currentPosition.value;\n// var tpv = msg.payload.target.value\n\n//Convert NodeID to Domoticz IDX value\n\nif (nodeID === 0) {\n\tvar idx = 4556;\n} else if (nodeID === 1) {\n\tvar idx = 4550;\n} else if (nodeID === 2) {\n\tvar idx = 4551;\n} else if (nodeID === 3) {\n\tvar idx = 4552;\n}\n\n// set nvalue and svalue from current position\nif (cpv === 0) {\n\tvar nv=0;\n\tvar sv=0;\n} else if (cpv === 100) {\n\tvar nv=1;\n\tvar sv=100;\n} else {\n\tvar nv=2;\n\tvar sv=cpv;\n}\n\nmsg.payload = {};\nmsg.payload.command = \"switchlight\";\nmsg.payload.switchcmd = \"Set Level\";\nmsg.payload.level = sv;\nmsg.payload.idx = idx;\n// msg.payload.nvalue = nv;\n// msg.payload.svalue = sv;\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 820,
"y": 80,
"wires": [
[
"a2494c81.43609"
]
]
},
{
"id": "c1b21be6.47156",
"type": "comment",
"z": "6e3cbaf0.36e4e4",
"name": "Opérationel",
"info": "ça fonctionne pas touche !",
"x": 590,
"y": 40,
"wires": []
},
{
"id": "6f16143d.f9793c",
"type": "inject",
"z": "6e3cbaf0.36e4e4",
"name": "LectureVelux",
"props": [
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "velux:read",
"payloadType": "str",
"x": 330,
"y": 80,
"wires": [
[
"774ff8d2.0467c8"
]
]
},
{
"id": "e59f5b49.c02b58",
"type": "velux-connection",
"z": "",
"host": "192.168.xx.xx",
"password": "YourWifiPassword",
"monitor": "MONITOR"
},
{
"id": "26a40b17.e8e744",
"type": "mqtt-broker",
"z": "",
"name": "MQTTBroker",
"broker": "localhost",
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": true,
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"willTopic": "",
"willQos": "0",
"willPayload": ""
}
]- Idem dans Velux-Nodes, l'adresse ip et le mot de passe du KLF-200 (mot de passe du WIFI !!! )
- Déployer le nouveau flux.
- Surveiller la console Debug voir s'il y a des erreurs de connexion au KLF-200.
- connected doit s'afficher sous le topic domoticz/in
Récupérer les nodeID Velux pour faire la correspondance avec les idx Domoticz :
http://hostname:1880/velux/nodes (hostname = ip où est installé node-red)
Exemple de réponse :
[{"id":3,"name":"VoletVeluxDroit","order":3},{"id":2,"name":"VoletVeluxGauche","order":2},{"id":0,"name":"VeluxDroite","order":1},{"id":1,"name":"VeluxGauche","order":0}]
Si votre réponse est [] , vérifier la connexion au KLF-200 ou la version de contrib-velux qui doit être la 0.0.4. Relancer Node-red : sudo node-red-restart et en dernier, un reboot est peut être nécessaire après l'installation de node-red et .contrib-velux.
Si tout va bien :
- Editer la fonction "Update Position" et adapater le code avec vos idx des virtuals sensors créés dans Domoticz et les id de Velux (nodeID = id) , donc mon cas j'ai 4 équipements, donc 4 conversions.
- Ne pas utiliser "order" qui correspond à l'ordre d'affichage des produits Velux dans le KLF-200.
- C'est un exemple que codage dans Node-red, qui peut être optimisé, je ne suis pas un spécialiste.
- Le statut Velux est envoyé, dès un changement de position et toutes les 15 mn pour les équipements branchés sur le 220V, toutes les heures si sur batterie à haut rendement et 1 fois par jour pour les batteries à faible rendement.
- Une fois la fonction adaptée à votre installation: Deployer à nouveau le flux
- Tester avec le bouton 'LectureVelux', une information remonte dans la console Debug et dans la log de Domoticz.
Exemple:
Code : Tout sélectionner
26/10/2020 à 18:12:15node: 209dd4dd.4e37acmsg.payload : Object
{ id: 0, api: 529, apiText: "GW_NODE_STATE_POSITION_CHANGED…", nodeID: 0, order: 1 … }
26/10/2020 à 18:12:15node: 209dd4dd.4e37acmsg.payload : Object
{ id: 0, api: 529, apiText: "GW_NODE_STATE_POSITION_CHANGED…", nodeID: 1, order: 0 … }
26/10/2020 à 18:12:15node: 209dd4dd.4e37acmsg.payload : Object
{ id: 0, api: 529, apiText: "GW_NODE_STATE_POSITION_CHANGED…", nodeID: 2, order: 2 … }
26/10/2020 à 18:12:15node: 209dd4dd.4e37acmsg.payload : Object
{ id: 0, api: 529, apiText: "GW_NODE_STATE_POSITION_CHANGED…", nodeID: 3, order: 3 … }
Exemple:
Code : Tout sélectionner
2020-10-26 18:07:47.340 MQTT: Topic: domoticz/in, Message: {"command":"switchlight","switchcmd":"Set Level","level":100,"idx":4556}
2020-10-26 18:07:47.350 (Velux) Light/Switch (VeluxDroite)
2020-10-26 18:07:47.463 MQTT: Topic: domoticz/in, Message: {"command":"switchlight","switchcmd":"Set Level","level":100,"idx":4550}
2020-10-26 18:07:47.471 (Velux) Light/Switch (VeluxGauche)
2020-10-26 18:07:47.583 MQTT: Topic: domoticz/in, Message: {"command":"switchlight","switchcmd":"Set Level","level":100,"idx":4551}
2020-10-26 18:07:47.592 (Velux) Light/Switch (VoletVeluxGauche)
2020-10-26 18:07:47.704 MQTT: Topic: domoticz/in, Message: {"command":"switchlight","switchcmd":"Set Level","level":100,"idx":4552}
2020-10-26 18:07:47.714 (Velux) Light/Switch (VoletVeluxDroit)
2- Créer la chaine de commande:
C'est plus complex, mais simple à comprendre.
Importer ce code dans le même flux (au popup, valider "import copy" puisque des nodes existent déjà):
Code : Tout sélectionner
[
{
"id": "4adc61a.8da8ca",
"type": "mqtt in",
"z": "6e3cbaf0.36e4e4",
"name": "",
"topic": "domoticz/out",
"qos": "2",
"datatype": "json",
"broker": "26a40b17.e8e744",
"x": 110,
"y": 220,
"wires": [
[
"7e99db6c.65c0a4"
]
]
},
{
"id": "209dd4dd.4e37ac",
"type": "debug",
"z": "6e3cbaf0.36e4e4",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1170,
"y": 220,
"wires": []
},
{
"id": "11487e17.9aadfa",
"type": "switch",
"z": "6e3cbaf0.36e4e4",
"name": "VeluxMsg",
"property": "payload.name",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "VeluxGauche",
"vt": "str"
},
{
"t": "eq",
"v": "VeluxDroite",
"vt": "str"
},
{
"t": "eq",
"v": "VoletVeluxGauche",
"vt": "str"
},
{
"t": "eq",
"v": "VoletVeluxDroit",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 4,
"x": 260,
"y": 400,
"wires": [
[
"14871380.3ebfbd"
],
[
"3a5904ed.26840c"
],
[
"a2ff102b.2de6c"
],
[
"91019c5a.a94348"
]
]
},
{
"id": "14871380.3ebfbd",
"type": "change",
"z": "6e3cbaf0.36e4e4",
"name": "SetVeluxGauchenodeID",
"rules": [
{
"t": "set",
"p": "payload.nodeID",
"pt": "msg",
"to": "1",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 510,
"y": 340,
"wires": [
[
"acb78b54.7f69b"
]
]
},
{
"id": "3a5904ed.26840c",
"type": "change",
"z": "6e3cbaf0.36e4e4",
"name": "SetVeluxDroitenodeID",
"rules": [
{
"t": "set",
"p": "payload.nodeID",
"pt": "msg",
"to": "0",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 500,
"y": 380,
"wires": [
[
"acb78b54.7f69b"
]
]
},
{
"id": "7e99db6c.65c0a4",
"type": "change",
"z": "6e3cbaf0.36e4e4",
"name": "SetPosition",
"rules": [
{
"t": "set",
"p": "payload.position",
"pt": "msg",
"to": "$number(payload.svalue1)",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 310,
"y": 220,
"wires": [
[
"11487e17.9aadfa"
]
]
},
{
"id": "4ff6fe72.96ce78",
"type": "Velux Api",
"z": "6e3cbaf0.36e4e4",
"name": "",
"datasource": "e59f5b49.c02b58",
"api": "768",
"ntf": [
"770",
"771"
],
"topic": "",
"x": 1000,
"y": 400,
"wires": [
[
"209dd4dd.4e37ac"
]
]
},
{
"id": "acb78b54.7f69b",
"type": "function",
"z": "6e3cbaf0.36e4e4",
"name": "BougePosition",
"func": "var dt = new Date();\n\nvar nodeID = msg.payload.nodeID\nvar position = msg.payload.position\nif (msg.payload.nvalue === 0) {\n position = 0;\n} else if (msg.payload.nvalue === 1) {\n position = 100;\n}\n\nvar cmd = { \n commandOriginator: 1,\n priorityLevel: 2,\n parameterActive: 0,\n functionalParameterMP: {valueType:'RELATIVE', value:position},\n indexArrayCount: 1,\n indexArray: [nodeID],\n priorityLevelLock: false,\n lockTime: 0\n }\n\nmsg.payload = cmd;\n\n// msg.topic = \"velux:write\"\n// msg.payload.nvalue = nv;\n// msg.payload.svalue = sv;\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 800,
"y": 400,
"wires": [
[
"4ff6fe72.96ce78"
]
]
},
{
"id": "a2ff102b.2de6c",
"type": "change",
"z": "6e3cbaf0.36e4e4",
"name": "SetVoletVeluxGauchenodeID",
"rules": [
{
"t": "set",
"p": "payload.nodeID",
"pt": "msg",
"to": "2",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 520,
"y": 420,
"wires": [
[
"acb78b54.7f69b"
]
]
},
{
"id": "91019c5a.a94348",
"type": "change",
"z": "6e3cbaf0.36e4e4",
"name": "SetVoletVeluxDroitnodeID",
"rules": [
{
"t": "set",
"p": "payload.nodeID",
"pt": "msg",
"to": "3",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 510,
"y": 460,
"wires": [
[
"acb78b54.7f69b"
]
]
},
{
"id": "26a40b17.e8e744",
"type": "mqtt-broker",
"z": "",
"name": "MQTTBroker",
"broker": "localhost",
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": true,
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"willTopic": "",
"willQos": "0",
"willPayload": ""
},
{
"id": "e59f5b49.c02b58",
"type": "velux-connection",
"z": "",
"host": "192.168.xx.xx",
"password": "YouWIFIPassword",
"monitor": "MONITOR"
}
]- Idem pour l'API Velux qui utilise le même "velux-connection" , juste vérifier l'adresse ip et le mot de passe du velux-node (celui du WIFI !!! ).
- Editer "VeluxMSG" pour faire correspondre vos équipements, j'ai utilisé la variable "name", on peut utiliser la variable "idx", à vous d'adapter ce node.
- Editer chaque SetxxxxnodeID en fonction de votre installation.
- Deployer votre flux.
- Tester depuis Domoticz et les nouveaux "virtual sensors".
- Vérifier les logs Domoticz et la console Debug de Node-red. Console qui pourra être désactivé en cliquant sur le bouton vert à droite de msg.payload.
Et c'est tout !
ça devrait ressembler à ça :
Remarque : Ma configuration est limitée à 2 Fenêtre de toit Velux Integra et 2 volets/stores extérieurs.
La fonction "BougePosition" devra être adaptée à vos équipements, voir renomée si vous utiliser des lampes, des intérupteurs, des portes de garage, et j'en passe.
Je vous invite à fouiller dans le code klf.js pour retrouver la bonne structure JSON du msg.payload qu'il faudra envoyer à l'API Velux.
https://github.com/PLCHome/velux-klf200-api
https://github.com/PLCHome/velux-klf200 ... lib/klf.js
Il s'agit du même contributeur que pour le node-red-contrib-velux (version 0.0.4) , donc la structure est la même, qu'on retrouve ici:
https://github.com/PLCHome/node-red-contrib-velux
Merci de m'avoir lu jusqu'au bout...