Gestion RFlink via node red

Bonjour,

Je viens d’installer et paramètrer rflink via node red et ca tourne ! ouf…

par contre je me demande comment via node red gérer mes appareils ?

j’ai actuellement ce flow pour tester et gérer une sonde :

[{"id":"c170e7c6.e2c338","type":"debug","z":"9fec6591.8ae648","name":"Raw messages","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":360,"y":40,"wires":[]},{"id":"74fcb201.733f2c","type":"comment","z":"9fec6591.8ae648","name":"Examples","info":"20;B7;Digitech;ID=01bc;TEMP=0060;BAT=OK;\n20;B8;Prologue;ID=9722;TEMP=00e3;HUM=10;\n20;B9;Oregon TempHygro;ID=928F5;TEMP=00d1;HUM=56;HSTATUS=1;BAT=OK;\n20;BA;Tunex;ID=7B02;TEMP=0000;HUM=99;BAT=OK;\n20;BB;Oregon TempHygro;ID=528F1;TEMP=00c6;HUM=59;HSTATUS=0;BAT=OK;\n20;BC;AlectoV3;ID=3099;TEMP=00b3;HUM=61;BAT=OK;\n20;BD;Prologue;ID=9722;TEMP=00e3;HUM=10;\n20;BE;Oregon TempHygro;ID=528F1;TEMP=00c6;HUM=59;HSTATUS=0;BAT=OK;\n20;BF;Prologue;ID=9722;TEMP=00e3;HUM=10;\n20;C0;AlectoV3;ID=3099;TEMP=00b3;HUM=61;BAT=OK;\n20;C1;Tunex;ID=7B02;TEMP=0000;HUM=99;BAT=OK;\n20;C2;Prologue;ID=9722;TEMP=00e3;HUM=10;\n20;C3;AlectoV3;ID=3099;TEMP=00b4;HUM=61;BAT=OK;\n20;C4;Oregon TempHygro;ID=928F5;TEMP=00d1;HUM=56;HSTATUS=1;BAT=OK;\n20;C5;Digitech;ID=01bc;TEMP=0060;BAT=OK;\n20;C6;Tunex;ID=7B02;TEMP=0000;HUM=99;BAT=OK;\n20;C7;AlectoV3;ID=3099;TEMP=00b3;HUM=61;BAT=OK;\n20;C8;Prologue;ID=9722;TEMP=00e2;HUM=10;\n20;C9;AlectoV3;ID=3099;TEMP=00b4;HUM=61;BAT=OK;\n20;CA;Tunex;ID=7B02;TEMP=0000;HUM=99;BAT=OK;\n20;CB;Prologue;ID=9722;TEMP=00e2;HUM=10;\n20;CC;AlectoV3;ID=3099;TEMP=00b3;HUM=61;BAT=OK;\n20;CD;Doorbell;ID=99ff;SWITCH=1;CMD=ON;CHIME=01;\n20;CE;Doorbell;ID=99ff;SWITCH=1;CMD=ON;CHIME=01;\n20;CF;Doorbell;ID=99ff;SWITCH=1;CMD=ON;CHIME=01;\n20;D0;Prologue;ID=9722;TEMP=00e2;HUM=10;\n20;D1;Doorbell;ID=99ff;SWITCH=1;CMD=ON;CHIME=01;\n20;D2;Doorbell;ID=99ff;SWITCH=1;CMD=ON;CHIME=01;\n20;D3;Tunex;ID=7B02;TEMP=0000;HUM=99;BAT=OK;\n20;D4;AlectoV3;ID=3099;TEMP=00b4;HUM=61;BAT=OK;\n20;D5;Oregon TempHygro;ID=928F5;TEMP=00d1;HUM=56;HSTATUS=1;BAT=OK;\n20;D6;Prologue;ID=9722;TEMP=00e2;HUM=10;\n20;D7;Digitech;ID=01bc;TEMP=0060;BAT=OK;\n20;D8;Tunex;ID=7B02;TEMP=0000;HUM=99;BAT=OK;\n20;D9;AlectoV3;ID=3099;TEMP=00b3;HUM=61;BAT=OK;\n20;DA;Prologue;ID=9722;TEMP=00e2;HUM=10;\n20;DB;AlectoV3;ID=3099;TEMP=00b4;HUM=61;BAT=OK;\n20;DC;Tunex;ID=7B02;TEMP=0001;HUM=99;BAT=OK;\n20;DD;Prologue;ID=9722;TEMP=00e2;HUM=10;\n20;DE;AlectoV3;ID=3099;TEMP=00b3;HUM=61;BAT=OK;\n20;DF;Tunex;ID=7B02;TEMP=0001;HUM=99;BAT=OK;\n20;E0;Oregon TempHygro;ID=928F5;TEMP=00d1;HUM=56;HSTATUS=1;BAT=OK;\n20;E1;AlectoV3;ID=3099;TEMP=00b3;HUM=61;BAT=OK;\n20;E2;Prologue;ID=9722;TEMP=00e2;HUM=10;\n","x":90,"y":31,"wires":[]},{"id":"449c99e2.dc9158","type":"function","z":"9fec6591.8ae648","name":"Parse message","func":"var msg433 = {};\nmsg.payload = msg.payload.replace(/(\\r\\n|\\n|\\r)/gm,\"\");\nvar parts433 = msg.payload.split(\";\");\n\nmsg433.p1 = parts433[0];\nmsg433.p2 = parts433[1];\nmsg433.name = parts433[2];\nfor (var i=3; i<parts433.length; i++) {\n    var keyvalue = parts433[i].split(\"=\");\n    if (keyvalue.length===2) {\n        msg433[keyvalue[0]] = keyvalue[1];\n    }\n}\n\nmsg.msg433 = msg433;\n\nreturn msg;\n\n/*\n\n// So firstly a generic means of getting incoming items into an object\n\nvar the433 = {};\nmsg.payload = msg.payload.replace(/(\\r\\n|\\n|\\r)/gm,\"\");\nnode.warn(msg.payload);\nvar parts433 = msg.payload.split(\";\");\n\nthe433.p1 = parts433[0];\nthe433.p2 = parts433[1];\nthe433.name = parts433[2];\n\nvar a = 3;\nwhile (a < parts433.length) {\n    var bits433 = parts433[a].split(\"=\");\n    switch (bits433[0]) {\n        case \"ID\": the433.id = bits433[1]; break;\n        case \"SWITCH\": the433.switch = bits433[1]; break;\n        case \"CMD\": the433.cmd = bits433[1]; break;\n        case \"SET_LEVEL\": the433.set_level = parseInt(bits433[1], 10); break;\n        case \"TEMP\": the433.temp = parseInt(bits433[1], 16) / 10; break;\n        case \"HUM\": the433.hum = parseInt(bits433[1], 10); break;\n        case \"BARO\": the433.baro = parseInt(bits433[1], 16); break;\n        case \"HSTATUS\": the433.hstatus = parseInt(bits433[1], 10); break;\n        case \"BFORECAST\": the433.bforecast = parseInt(bits433[1], 10); break;\n        case \"UV\": the433.uv = parseInt(bits433[1], 16); break;\n        case \"LUX\": the433.lux = parseInt(bits433[1], 16); break;\n        case \"BAT\": the433.bat = bits433[1]; break;\n        case \"RAIN\": the433.rain = parseInt(bits433[1], 16) / 10; break;\n        case \"RAIN\": the433.rainrate = parseInt(bits433[1], 16) / 10; break;\n        case \"WINSP\": the433.winsp = parseInt(bits433[1], 16) / 10; break;\n        case \"AWINSP\": the433.awinsp = parseInt(bits433[1], 16) / 10; break;\n        case \"WINGS\": the433.wings = parseInt(bits433[1], 16); break;\n        case \"WINDIR\": the433.windir = parseInt(bits433[1], 10); break;\n        case \"WINCHL\": the433.winchl = parseInt(bits433[1], 16); break;\n        case \"WINTMP\": the433.wintmp = parseInt(bits433[1], 16); break;\n        case \"CHIME\": the433.chime = parseInt(bits433[1], 10); break;\n        case \"SMOKEALERT\": the433.smokealert = bits433[1]; break;\n        case \"PIR\": the433.pir = bits433[1]; break;\n        case \"CO2\": the433.co2 = parseInt(bits433[1], 10); break;\n        case \"SOUND\": the433.sound = parseInt(bits433[1], 10); break;\n        case \"KWATT\": the433.kwatt = parseInt(bits433[1], 16); break;\n        case \"WATT\": the433.watt = parseInt(bits433[1], 16); break;\n        case \"CURRENT\": the433.current = parseInt(bits433[1], 10); break;\n        case \"CURRENT2\": the433.current2 = parseInt(bits433[1], 10); break;\n        case \"CURRENT3\": the433.current3 = parseInt(bits433[1], 10); break;\n        case \"DIST\": the433.dist = parseInt(bits433[1], 10); break;\n        case \"METER\": the433.meter = parseInt(bits433[1], 10); break;\n        case \"VOLT\": the433.volt = parseInt(bits433[1], 10); break;\n        case \"RGBW\": the433.rgbc = parseInt(bits433[1].substring(0, 2), 16);\n            the433.rgbw = parseInt(bits433[1].substring(2, 4), 16); break;\n    }\n    a++;\n}\n\n// SO - the above is general... here is my specific setup for temporarily displaying\n// the Acurite info\nif ((the433.p1 == \"20\") && (the433.name == \"Acurite\") && (the433.id == \"c826\")) {\n    if (typeof the433.temp !== 'undefined') temp = the433.temp;\n    if (typeof the433.hum !== 'undefined') hum = the433.hum;\n    if (typeof the433.bat !== 'undefined') bat = the433.bat;\n    if (typeof the433.rain !== 'undefined') rain = the433.rain;\n    if (typeof the433.winsp !== 'undefined') winsp = the433.winsp;\n    if (typeof the433.windir !== 'undefined') windir = the433.windir;\n\n    node.warn(\"Temperature: \" + temp + \"c\");\n    node.warn(\"Humidity: \" + hum + \"%\");\n    node.warn(\"Battery: \" + bat);\n    node.warn(\"Rain: \" + rain + \"mm\");\n    node.warn(\"Wind Speed: \" + winsp + \"km/h\");\n    node.warn(\"Wind Dir: \" + (windir * 22.5) + \" degrees\");\n}\n\n*/","outputs":1,"noerr":0,"x":340,"y":100,"wires":[["c5cf846f.73af78","e01eceac.bb1c3"]]},{"id":"c5cf846f.73af78","type":"function","z":"9fec6591.8ae648","name":"TEMP conversion","func":"if (msg.msg433.TEMP!==undefined) {\n    if (parseInt(msg.msg433.TEMP, 16) >= 0x8000) {\n        msg.msg433.TEMP = (parseInt(msg.msg433.TEMP, 16) & 0x7FFF) / 10 * -1;\n    } else {\n        msg.msg433.TEMP = parseInt(msg.msg433.TEMP, 16) / 10;\n    }\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":550,"y":100,"wires":[["9dc4f5dd.eb6118"]]},{"id":"9dc4f5dd.eb6118","type":"function","z":"9fec6591.8ae648","name":"HUM conversion","func":"if (msg.msg433.HUM!==undefined) {\n    msg.msg433.HUM = parseInt(msg.msg433.HUM, 10);\n}\n\nreturn msg;\n","outputs":1,"noerr":0,"x":760,"y":100,"wires":[["8572cbbb.6db988"]]},{"id":"8572cbbb.6db988","type":"function","z":"9fec6591.8ae648","name":"ID conversion","func":"if (msg.msg433.ID!==undefined) {\n    msg.msg433.ID = parseInt(msg.msg433.ID, 16);\n}\n\nreturn msg;\n","outputs":1,"noerr":0,"x":960,"y":100,"wires":[["9869e902.274c48"]]},{"id":"9869e902.274c48","type":"function","z":"9fec6591.8ae648","name":"RAIN conversion","func":"if (msg.msg433.RAIN!==undefined) {\n    msg.msg433.RAIN = parseInt(msg.msg433.RAIN, 16) /10;\n}\n\nreturn msg;\n","outputs":1,"noerr":0,"x":1170,"y":100,"wires":[["673d837.cb7467c"]]},{"id":"673d837.cb7467c","type":"function","z":"9fec6591.8ae648","name":"WINSP conversion","func":"if (msg.msg433.WINSP!==undefined) {\n    msg.msg433.WINSP = parseInt(msg.msg433.WINSP, 16) /10;\n}\n\nreturn msg;\n","outputs":1,"noerr":0,"x":1390,"y":100,"wires":[["e46fa4f5.0745e8"]]},{"id":"e46fa4f5.0745e8","type":"function","z":"9fec6591.8ae648","name":"WINGS conversion","func":"if (msg.msg433.WINGS!==undefined) {\n    msg.msg433.WINGS  = parseInt(msg.msg433.WINGS , 16);\n}\n\nreturn msg;\n","outputs":1,"noerr":0,"x":1610,"y":100,"wires":[["87b36acb.d71b08"]]},{"id":"87b36acb.d71b08","type":"function","z":"9fec6591.8ae648","name":"SWITCH conversion","func":"if (msg.msg433.SWITCH !==undefined) {\n    msg.msg433.SWITCH   = parseInt(msg.msg433.SWITCH  , 16);\n}\n\nreturn msg;\n","outputs":1,"noerr":0,"x":1860,"y":100,"wires":[["cb1ed351.b93a7"]]},{"id":"cb1ed351.b93a7","type":"function","z":"9fec6591.8ae648","name":"CHIME conversion","func":"if (msg.msg433.CHIME  !==undefined) {\n    msg.msg433.CHIME    = parseInt(msg.msg433.CHIME   , 16);\n}\n\nreturn msg;\n","outputs":1,"noerr":0,"x":150,"y":200,"wires":[["936af1bf.fb719","e79b8bf4.5058f8","519e5b3b.eb74d4","b6cfdb0d.a901b8"]]},{"id":"936af1bf.fb719","type":"switch","z":"9fec6591.8ae648","name":"Select device","property":"msg433.ID","propertyType":"msg","rules":[{"t":"eq","v":"11753","vt":"num"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":510,"y":200,"wires":[[],[]],"outputLabels":["Temp Garage","Unhandled"]},{"id":"e01eceac.bb1c3","type":"debug","z":"9fec6591.8ae648","name":"","active":false,"console":"false","complete":"true","x":490,"y":140,"wires":[]},{"id":"b5f87242.5455f","type":"serial in","z":"9fec6591.8ae648","name":"RFLink","serial":"a26f5ee4.366b5","x":110,"y":100,"wires":[["c170e7c6.e2c338","449c99e2.dc9158"]]},{"id":"6b0d25e7.b56efc","type":"mqtt out","z":"9fec6591.8ae648","name":"temp","topic":"/RFlink/temp_garage/","qos":"1","retain":"true","broker":"946c71c6.9448b","x":730,"y":360,"wires":[]},{"id":"e79b8bf4.5058f8","type":"change","z":"9fec6591.8ae648","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"msg433.TEMP","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":360,"wires":[["6b0d25e7.b56efc"]]},{"id":"b6cfdb0d.a901b8","type":"debug","z":"9fec6591.8ae648","name":"","active":true,"tosidebar":true,"console":false,"complete":"true","statusVal":"","statusType":"auto","x":490,"y":300,"wires":[]},{"id":"519e5b3b.eb74d4","type":"debug","z":"9fec6591.8ae648","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"msg433.TEMP","targetType":"msg","statusVal":"","statusType":"auto","x":530,"y":420,"wires":[]},{"id":"a26f5ee4.366b5","type":"serial-port","z":"","serialport":"/dev/ttyUSB0","serialbaud":"57600","databits":"8","parity":"none","stopbits":"1","waitfor":"","dtr":"none","rts":"none","cts":"none","dsr":"none","newline":"\\n","bin":"false","out":"char","addchar":"","responsetimeout":"10000"},{"id":"946c71c6.9448b","type":"mqtt-broker","z":"","name":"MQTT Docker 2","broker":"192.168.100.10","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]

L’intéret serait maintenant d’automatiser la création de devices selon ce qu’il recoit dans le payload mais la je ne sais pas comment m’y prendre, si quelqu’un a une idée?

Hello,

Remplace ton switch device par une fonction ‹ prepare MQTT ›:

new_msg = {};
new_msg.topic = ‹ /RFlink/ › + msg.msg433.name + ‹ /info ›;
new_msg.qos = 1;
new_msg.retain = true;
new_msg.payload=msg.msg433.TEMP;
return new_msg;

J’attaque maintenant les volets par contre j’ai plusieurs intérrogations … .
ma remontée avec le flow actuel : image

je me demande donc comme créer un cover sous ha avec ceci
le debug actuel me sort ceci :
image

je penais tenté ceci mais sans succès :

- platform: mqtt
  name: "MQTT Cover"
  command_topic: "/RFlink/RTS_40900349/set"
  state_topic: "/RFlink/RTS_40900349/state"
  availability_topic: "/RFlink/RTS_40900349/cover/availability"
  qos: 0
  retain: true
  payload_open: "UP"
  payload_close: "DOWN"
  payload_stop: "STOP"
  state_open: "open"
  state_opening: "opening"
  state_closed: "closed"
  state_closing: "closing"
  payload_available: "online"
  payload_not_available: "offline"
  optimistic: false
  value_template: "{{ value.x }}"

As tu un lien vers un tutoriel ?

Merci.

Nope c’est.pas encore finalisé je dois attendre que @evenisse evenise termine sa version quand il aura un peu de temps…en attendant je peux utiliser les prises et plusieurs autres choses on va voir avec lui quand il aura du temps car je pense que sa version a pas mal évolué comparé à la mienne

1 « J'aime »