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?