[{"id":"2e503ffc98d438e4","type":"tab","label":"Flux Global - Test","disabled":false,"info":"","env":[]},{"id":"33a89cb72c2781b7","type":"inject","z":"2e503ffc98d438e4","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"900","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":110,"y":620,"wires":[["cd3f2f8c7d88b93b"]]},{"id":"b646ea0a1beb29cb","type":"link in","z":"2e503ffc98d438e4","name":"test.getFlowConfig","links":[],"x":35,"y":80,"wires":[["a68fa22dffb86550"]]},{"id":"a68fa22dffb86550","type":"function","z":"2e503ffc98d438e4","name":"flowConfig","func":"const flowConfig = {\n sentilo: {\n // Credencials de l'API\n api: {\n host: \"\",\n token: \"\"\n },\n catalog: {\n // Llistat d'ens per a iterar\n ens: [\n {\n id: \"\",\n provider: \"@TEST_GLOBALS\",\n token: \"\"\n }\n ],\n sensors: [\n {\n \"sensor\": \"TESTG-TEMP\",\n \"description\": \"Temperature sensor\",\n \"type\": \"temperature\",\n \"dataType\": \"number\",\n \"unit\": \"ºC\",\n \"component\": \"TESTG-METEO-001\",\n \"publicAccess\": \"true\",\n \"additionalInfo\": {\n \"accuracy\": \"1.0%\",\n \"voltage\": \"2.1-3.6\"\n }\n },\n {\n \"sensor\": \"TESTG-HUM\",\n \"description\": \"Humidity sensor\",\n \"type\": \"humidity\",\n \"dataType\": \"number\",\n \"unit\": \"%\",\n \"component\": \"TESTG-METEO-001\",\n \"publicAccess\": \"true\",\n \"additionalInfo\": {\n \"accuracy\": \"4.5%\",\n \"voltage\": \"2.1-3.6\"\n }\n }\n ],\n components: {\n \"TESTG-METEO-001\": {\n \"component\": \"TESTG-METEO\",\n \"componentType\": \"meteo\",\n \"componentDesc\": \"Global flow meteo test component\",\n \"componentPublicAccess\": \"true\",\n \"location\": \"41.39479 2.148768\",\n \"componentAdditionalInfo\": {\n \"brand\": \"My brand\",\n \"electrical-connection-type\": \"shuko\",\n \"electrical-connection-voltage\": \"230V\"\n }\n }\n }\n }\n }\n}\n\n// Guardem l'objecte flowConfig al msg\nmsg.flowConfig = flowConfig;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":150,"y":80,"wires":[["fde8d4fa62189a2d"]]},{"id":"fde8d4fa62189a2d","type":"link out","z":"2e503ffc98d438e4","name":"test.flowConfig","mode":"return","links":[],"x":275,"y":80,"wires":[]},{"id":"cd3f2f8c7d88b93b","type":"link call","z":"2e503ffc98d438e4","name":"","links":["b646ea0a1beb29cb"],"timeout":"30","x":330,"y":620,"wires":[["6974659b10b02668","f445fc74a0b2e966"]]},{"id":"f445fc74a0b2e966","type":"debug","z":"2e503ffc98d438e4","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"flowConfig","targetType":"msg","statusVal":"","statusType":"auto","x":320,"y":580,"wires":[]},{"id":"6974659b10b02668","type":"function","z":"2e503ffc98d438e4","name":"getEnsList","func":"msg.payload = msg.flowConfig.sentilo.catalog.ens || [];\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":620,"wires":[["b24919e918f58e3e"]]},{"id":"b24919e918f58e3e","type":"split","z":"2e503ffc98d438e4","name":"ensList","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":740,"y":620,"wires":[["c51c57bd8506276c","0c63e4a426ae001f"]]},{"id":"c51c57bd8506276c","type":"debug","z":"2e503ffc98d438e4","name":"ensConfig","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":920,"y":620,"wires":[]},{"id":"b93ff542917d6c07","type":"link call","z":"2e503ffc98d438e4","name":"","links":["e68bde957f92aeb8"],"timeout":"30","x":550,"y":660,"wires":[["39a4da340eab28e1","ec18f624f9973ced"]]},{"id":"0c63e4a426ae001f","type":"function","z":"2e503ffc98d438e4","name":"getReqParams","func":"const flowConfig = msg.flowConfig;\nconst sentiloConfig = flowConfig.sentilo;\nconst ensConfig = msg.payload;\n\nmsg.reqParams = {\n sentilo: {\n host: sentiloConfig.api.host,\n provider: ensConfig.provider,\n token: ensConfig.token\n }\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":320,"y":660,"wires":[["b93ff542917d6c07"]]},{"id":"39a4da340eab28e1","type":"debug","z":"2e503ffc98d438e4","name":"ensCatalog","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":750,"y":660,"wires":[]},{"id":"ec18f624f9973ced","type":"function","z":"2e503ffc98d438e4","name":"sensorsToCreate","func":"const flowConfig = msg.flowConfig;\nconst sentiloConfig = flowConfig.sentilo;\nconst catalogData = msg.payload;\n\nlet sensorsToExist = [];\nconst sensorsConfig = sentiloConfig.catalog.sensors || [];\nsensorsConfig.forEach(sensor => {\n const componentId = sensor.component;\n const componentConfig = sentiloConfig.catalog.components[componentId];\n sensorsToExist.push({\n ...sensor,\n ...componentConfig\n });\n});\n\n// Només hauríem de tenir un proveïdor\nconst providers = msg.payload.providers || [];\nconst sensors = providers[0]?.sensors || [];\n\n// Cerquem sensors que falten per crear\nconst sensorsToCreate = sensorsToExist.filter(m =>\n !sensors.some(s => s.sensor === m.sensor)\n);\n\n// Llistat de sensors que hauríen de crear-se (aquells que no existeixen i no estan exclosos)\nmsg.reqParams.sentilo.sensorsToCreate = {\n sensors: sensorsToCreate\n}\nmsg.reqParams.sentilo.sensorsToExist = {\n sensors: sensorsToExist\n}\nmsg.reqParams.sentilo.sensorsToCreate = {\n sensors: sensorsToCreate\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":330,"y":720,"wires":[["80dc06170b5a1d5b","56087470a73ed82c"]]},{"id":"df564004cfcee6d0","type":"link call","z":"2e503ffc98d438e4","name":"","links":["baea99486ae4d629"],"timeout":"30","x":790,"y":700,"wires":[["ddbed0973ab32a54"]]},{"id":"80dc06170b5a1d5b","type":"switch","z":"2e503ffc98d438e4","name":"crear sensors?","property":"reqParams.sentilo.sensorsToCreate.sensors","propertyType":"msg","rules":[{"t":"nempty"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":540,"y":720,"wires":[["df564004cfcee6d0"],["b4ea4c27cc23345a"]]},{"id":"ddbed0973ab32a54","type":"delay","z":"2e503ffc98d438e4","name":"","pauseType":"delay","timeout":"30","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":980,"y":700,"wires":[["b4ea4c27cc23345a"]]},{"id":"72878ae3fc50bdf1","type":"link in","z":"2e503ffc98d438e4","name":"test.generateTestData","links":[],"x":35,"y":180,"wires":[["d6c8d42e640fbf2e"]]},{"id":"d6c8d42e640fbf2e","type":"function","z":"2e503ffc98d438e4","name":"generateTestData","func":"///////////////////////////////////////////////////////////////////////////////\n// SIMULACIÓ de connexió a un enpoint extern i obtenció de dades\n// La sortida és una observació de Sentilo, preparada per a ser\n// publicada amb el sub-flux de publicació\n///////////////////////////////////////////////////////////////////////////////\n\n// Genera un valor aleatori de temperatura (entre 15 ºC i 30 ºC)\nlet temperatura = (Math.random() * (30 - 15) + 15).toFixed(1);\n\n// Genera un valor aleatori d'humitat (entre 30% i 80%)\nlet humitat = (Math.random() * (80 - 30) + 30).toFixed(1);\n\n// Obté la marca temporal en format dd/MM/yyyy'T'HH:mm:ss, compatible amb Sentilo\nlet ara = new Date();\nlet marcaTemporal = String(ara.getDate()).padStart(2, '0') + \"/\" +\n String(ara.getMonth() + 1).padStart(2, '0') + \"/\" +\n ara.getFullYear() + \"T\" +\n String(ara.getHours()).padStart(2, '0') + \":\" +\n String(ara.getMinutes()).padStart(2, '0') + \":\" +\n String(ara.getSeconds()).padStart(2, '0');\n\n// Retorna les dues observacions com a array de missatges\nmsg.payload = {\n sensors:[ \n {\n sensor: \"TESTG-TEMP-001\",\n observations: [\n {\n value: temperatura,\n timestamp: marcaTemporal\n }\n ]\n },\n {\n sensor: \"TESTG-HUM-001\",\n observations: [\n {\n value: humitat,\n timestamp: marcaTemporal\n }\n ]\n }\n ]\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":170,"y":180,"wires":[["d3bd27c8efd71da0"]]},{"id":"56087470a73ed82c","type":"debug","z":"2e503ffc98d438e4","name":"sensorsToCreate","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"reqParams.sentilo.sensorsToCreate","targetType":"msg","statusVal":"","statusType":"auto","x":550,"y":760,"wires":[]},{"id":"d3bd27c8efd71da0","type":"link out","z":"2e503ffc98d438e4","name":"","mode":"return","links":[],"x":325,"y":180,"wires":[]},{"id":"f68675328c5fbc39","type":"comment","z":"2e503ffc98d438e4","name":"getFlowConfig: obtenció de la configuració local del flux","info":"","x":220,"y":40,"wires":[]},{"id":"d73cd261f57c377d","type":"comment","z":"2e503ffc98d438e4","name":"generateTestData: simula l'obtenció de dades climatològiques","info":"","x":240,"y":140,"wires":[]},{"id":"64e7f5deeb5cba50","type":"subscribe-with-endpoint","z":"2e503ffc98d438e4","name":"temperature subscription","server":"356c2ed1a954e605","providerId":"opentrends@TEST_GLOBALS","subscriptionType":"data","identifier":"TESTG-TEMP","baseUrl":"https://pre-nodered.diba.cat/ptgu","endpoint":"/subscriptions/global/temp","callbackUrl":"https://pre-nodered.diba.cat/ptgu/subscriptions/global/temp","x":130,"y":400,"wires":[["da6d93844cbca583"],["da6d93844cbca583"],["da6d93844cbca583"]]},{"id":"da6d93844cbca583","type":"debug","z":"2e503ffc98d438e4","name":"temperature subscription","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":390,"y":400,"wires":[]},{"id":"63a97f6abd6bb5ed","type":"subscribe-with-endpoint","z":"2e503ffc98d438e4","name":"humidity subscription","server":"356c2ed1a954e605","providerId":"opentrends@TEST_GLOBALS","subscriptionType":"data","identifier":"TESTG-HUM","baseUrl":"https://pre-nodered.diba.cat/ptgu","endpoint":"/subscriptions/global/hum","callbackUrl":"https://pre-nodered.diba.cat/ptgu/subscriptions/global/hum","x":120,"y":460,"wires":[["2ee8c5d387b13974"],["2ee8c5d387b13974"],["2ee8c5d387b13974"]]},{"id":"2ee8c5d387b13974","type":"debug","z":"2e503ffc98d438e4","name":"temperature subscription","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":390,"y":460,"wires":[]},{"id":"10efc23a8245e8ed","type":"comment","z":"2e503ffc98d438e4","name":"Subscripció a les dades dels sensors de test","info":"","x":190,"y":340,"wires":[]},{"id":"af02e2b73b02b7f8","type":"comment","z":"2e503ffc98d438e4","name":"Test del flux global","info":"","x":110,"y":580,"wires":[]},{"id":"e3b6649435056418","type":"link in","z":"2e503ffc98d438e4","name":"test.fluxPrincipal","links":[],"x":35,"y":280,"wires":[["59a9cbc0169c2b90"]]},{"id":"06bf1201d2b30a14","type":"comment","z":"2e503ffc98d438e4","name":"Cos principal del flux (continuació)","info":"","x":160,"y":240,"wires":[]},{"id":"e5d7f3eac6ba74ed","type":"link call","z":"2e503ffc98d438e4","name":"","links":["de6ceaad8a39e17a"],"timeout":"30","x":420,"y":280,"wires":[["b21158a6bacc2b9b"]]},{"id":"59a9cbc0169c2b90","type":"link call","z":"2e503ffc98d438e4","name":"","links":["72878ae3fc50bdf1"],"timeout":"30","x":180,"y":280,"wires":[["e5d7f3eac6ba74ed"]]},{"id":"b21158a6bacc2b9b","type":"link out","z":"2e503ffc98d438e4","name":"","mode":"return","links":[],"x":585,"y":280,"wires":[]},{"id":"b4ea4c27cc23345a","type":"link call","z":"2e503ffc98d438e4","name":"","links":["e3b6649435056418"],"timeout":"30","x":780,"y":740,"wires":[[]]},{"id":"356c2ed1a954e605","type":"server","alias":"Fluxe Global - opentrends","host":"http://pre-api-sentilo.diba.cat","acceptUntrusted":false,"apiKey":"981d2d1cef7f6ca94667cb6b9bf5e105a7e17ce688023a2eb9a6d317c1849360"}]