Fluxos Node-RED

Taula de continguts 

1. Importar fluxos Node-RED de la Wiki

El flux s'importa a la instància Node-RED accedint a:

"Menú hamburguesa -> Import -> Clipboard" i marquem l'opció "Import to new flow".

 

2. Sostenibilitat i medi ambient

2.1. LoraWan - Flux d'integració de dades de sensors de qualitat de l'aire (descarrega)

Agraïr l'aportació desinteresada de l'Ajuntament d'Arenys de Munt amb aquest flux. En concret s'integren dades de dispositius dels fabricants DecentLab i Dragino.

Amb la col·laboració de Femprocomuns han fet un esforç d’adaptació important del flux per a que sigui reutilitzable per altres municipis i altres dispositius de diferents fabricants.

El flux està dividit en 5 etapes:

  1. Configuració, s'injecta la configuració amb els dispositius que es volen monitorar. Per cada dispositiu es registra l'identificador, tipus de dispositiu, proveïdor associat a Sentilo i un "mapeig" de camps entre els que torna el dispositiu i com es diuen els sensors associats a Sentilo. 
  2. Entrada de dades. Es reben les dades des del servidor LoraWAN, es filtren per processar només els dispositius que volem i preprocessa l'entrada de dades per tenir un "buffer" de bytes.
  3. Descodificació. En funció del tipus de dispositiu es fa passar el "buffer" de bytes per un descodificador o un altre. Aquests descodificadors són els proporcionats pel fabricant del dispositiu (en el codi s'inclou la referència) però modificats per tal que la sortida sigui homogènia entre diferents fabricants. A aquestes alçades tindrem un llistat de camps i valors.
  4. Es "mapegen" els camps que torna el descodificador del dispositiu a sensors a Sentilo basant-nos en la informació de configuració. La sortida es passa per una plantilla i es neteja per obtenir un missatge preparat pel node de publicació de Sentilo.
  5. S'ingereixen les dades a Sentilo en funció del proveïdor associat en aquest. Un únic missatge genera una única crida al node "publish" de Sentilo amb dades dels N sensors associats a aquell dispositiu.

S'ha dissenyat modularment amb l'objectiu de homogeneïtzar els fluxos per afavorir la replicació i manteniment del codi.
Permet identificar quins són els nodes i variables específics per cada sensor i fabricant.

Autoria: xoic@femprocomuns.coop

 

2.2. Meteocat - Flux d'integració de dades (descarrega)

Documentació de la sessió de Formació, veure enllaç

Des d'Octubre 2024 aquesta integració de les estacions de la XEMA de Meteocat es realitza de forma agrupada des de Smart Region: si esteu interessats en integrar aquestes dades sobre la vosta instància de la Plataforma Smart Region, envieu un correu a smartregion@diba.cat i us activarem aquesta integració de dades directa.

2.3. PLC's Loxonne - Flux d'integració de dades (descarrega)

2.3.1. Descripció del funcionament 

El flux utilitza l’API de Miniserver de Loxone per obtenir les dades actuals d’un sensor concret. Existeix un servei de núvol de Loxone que ofereix accés al Miniserver sense necessitat de conèixer la IP de Miniserver prèviament - només és necessari saber el ID de Miniserver.

Bàsicament, el flux segueix aquests passos:

  1. Llegeix la configuració dels sensors, cada hora o una vegada al día
  2. Per cada sensor fa una crida a l’API de Loxone i recupera la dada actual del sensor en format XML
  3. Si la connexió en el punt anterior falla, torna a provar
  4. Parseja la resposta XML i obté el valor
  5. Publica el valor a Sentilo.

2.3.2. Configuració del flux

Configuració de la connexió a Sentilo

Si fem un doble clic sobre el node "Publica a Sentilo", podem escollir una connexió a Sentilo de les existents o configurar una nova.

Alternativament, podem esborrar la connexió importada i crear o reutilitzar una connexió que ja tenim dins de la nostra instància de Node-RED.

 

Configuració dels sensors a importar

Dins dels nodes Function "Configuració dels sensors amb lectura horària" i "Configuració dels sensors amb lectura diària" hi ha una array javascript SENSORS.

Cada element de la array és una configuració de sensor amb les següents atributs:

  • Miniserver: ID de Miniserver Loxone
  • Sensor: ID de Sensor Loxone
  • Usr: Usuari d'accés a Miniserver
  • Pass: Contrasenya d'accés a Miniserver
  • sSensor: ID de sensor de Sentilo

Per exemple, la definició de sensor seria:

  {
    "lMiniserver":"504F94A050B0",
    "lSensor":"08213ENS001_MV_BMC1_ENER",
    "lUsr":"x",
    "lPass":"x",
    "sSensor":"08213ENS001_MV_BMC1_ENER" 
  }

El flux processarà tots els elements de la array SENSORS, si està activat el seu Inject Node (veure el següent apartat).

 

Programació periódica de l'execució

Dins del flux hi ha 2 injectors, cadascun pensat per planificar l’execució amb una freqüència different. Per defecte estan desactivats. Si volem activar la execució de cada hora, hem de accedir a la configuració d’Inject Node "Cada hora" i configurar-ho d’aquesta forma:

Desplegament del flux

Finalment publiquem les nostres canvis amb el botó "Deploy".

En cas d'incidència, podem activar els nodes "Debug" i revisar el contingut dels missatges en la pestanya log.

2.4. Qualitat de l'aire - Flux d'integració de dades de Qualitat de l'Aire

Des de Novembre 2024 aquesta integració de les estacions de la XPVCA de dades obertes es realitza de forma agrupada des de Smart Region: si esteu interessats en integrar aquestes dades sobre la vosta instància de la Plataforma Smart Region, envieu un correu a smartregion@diba.cat i us activarem aquesta integració de dades directa."

3. Adaptacions necessàries dels fluxos per actualització de la versió del Node-Red a v0.5.1

L'actualització de Node-RED a la versió 2.2.2, també ha aportat actualitzacions d'alguns nodes, com és el cas dels de Sentilo, que passen de la versió v0.1.5 a la v0.5.1.

Per tal de poder continuar fent servir els nostres fluxos que utilitzen aquests nodes, caldrà fer una petita intervenció.

A continuació es detalla com cal actuar per tal d'adaptar els fluxos a la nova versió si és necessari.

3.1. Detalls de la versió v0.1.5

Si recordem els nodes de la versió anterior, teníem la següent col·lecció:

que estava formada per 3 nodes funcionals i un de configuració del servidor (node intern):

  • retrieve: permet obtenir dades de Sentilo, i les ofereix a la seva sortida
  • publish: permet publicar dades a Sentilo, injectades com a entrada en format observation
  • subscribe: permet subscriure's a un recurs de Sentilo (en el moment del desplegament del fluxe), i ens ofereix la dada publicada a la seva sortida, en format observació
  • server: ofereix un espai de configuració per a la connexió a Sentilo, que es pot fet servir a la resta de nodes del fluxe

3.2. Detalls de la versió v0.5.1

La nova versió de nodes de Sentilo, la v0.5.1, ofereix els mateixos nodes funcionals, i el node de servidor. A part, s'ha introduït un nou node de subscripció:

un cop més tenim:

  • retrieve: permet obtenir dades de Sentilo, i ofereix dos dades de sortida
    • sortida 1: resposta de l'api de Sentilo, amb la dada sol·licitada
    • sortida 2: codi http de resposta del servidor de Sentilo
  • publish: permet publicar dades a Sentilo, injectades com a entrada en format observation, i ofereix dos sortides:
    • sortida 1: només en cas d'error, emetrà el missatge retornat per l'api de Sentilo, o un missatge buit si tot ha anat bé
    • sortida 2: codi http de resposta del servidor de Sentilo
  • subscribe with endpoint: permet subscriure's a un recurs de Sentilo (en el moment del desplegament del fluxe) i rebre la dada al mateix node, tenim 3 sortides:
    • sortida 1: ofereix la dada a la qual estem subscrits en el moment de la seva publicació (actua com a endpoint)
    • sortida 2: ofereix la resposta de Sentilo a l'event de subscripció (només un cop, quan fem el desplegament del fluxe)
    • sortida 3: ofereix el codi de resposta http que ens retorna el servidor en el moment de fer la subscripció
  • subscribe without endpoint: aquest node és una modificació del node subscription with endpoint de anterior, però amb la particularitat que accepta dades d'entrada (de configuració), i no genera dades de sortida quan es publica una dada a la que estem subscrits (no crea un endpoint), sinò que les reenvia cap a una adreça remota (de fet, el que fa és generar una subscripció cap a la url que informarem a la dada Callback URL de la seva configuració).
    El funcionament segueix sent molt semblant al cas anterior, però com a sortida disposem de dos canals que podem explotar:
    • sortida 1: ofereix la resposta de Sentilo a l'event de subscripció (només un cop, quan fem el desplegament del fluxe)
    • sortida 2: ofereix el codi de resposta http que ens retorna el servidor en el moment de fer la subscripció
  • server: ofereix un espai de configuració per a la connexió a Sentilo, que es pot fet servir a la resta de nodes del fluxe

Com veiem, els nodes publish i retrieve mantenen la seva funcionalitat, i afegeixen una nova sortida informativa.

Per contra, els dos nodes de subscripció han canviat. El primer, subscribe with endpoint és l'equivalent a l'original de la versió anterior, mentres que el subscribe without endpoint és un node nou que afegeix una nova funcionalitat.

A continuació es mostra un conjunt d'imatges amb l'estructura funcional de cadascun d'ells, i com explotar la seva sortida:

Retrieve

Publish

Subscribe with endpoint

Subscribe without endpoint

En aquest darrer cas cal tenir en compte el node function anomenat Prepara subscripció que és l'encarregat d'injectar les dades de configuració del node de subscripció.

3.3. Com adaptar fluxos a la nova versió dels nodes de Sentilo

Per tal d'adaptar els nostres fluxos a la nova versió de Sentilo v0.5.1, cal seguir unes passes molt senzilles que tot seguit explicarem.

Prendrem com a referència el fluxe de test Meteocat Simple:

Com podem veure, el node publish està connectat a un node funcional que li prepara les dades a enviar (node Prepare Sentilo msg).

En arrencar la instància normalment detectarà que aquest node ha estat actualitzat, i el substituirà per la nova versió. En aquest cas no caldrà fer res més (si no fos així, només cal esborrar el node i tornar a insertar el node de la nova versió al seu lloc).

Per tant, ens trobem amb aquest escenari:

  1. Arrenquem la nova instància i accedim al nostre fluxe
  2. Revisem els nodes de Sentilo existents (en l'exemple, és el node publish) i mirem que hagin estat correctament actualitzats (verificar que el node no està en format transparent i no tenim cap error per pantalla, indicaria que cal substituir el node manualment)
    • si hi ha incompatibilitats, esborrem el node, i el tornem a inserir, aquesta vegada amb la versió actual (actualització del node de forma manual)
  3. Cal tornar a configurar el node Server que estem fent servir per a les nostres connexions
    • és possible que Node-RED ens indiqui que hi ha errors de configuració al node (icona vermella o missatge d'error que diu SETTINGS ERROR!)
    • cal revisar i inserir les dades de connexió a Sentilo, en especial el token, que per seguretat haurà estat esborrat del node server
  4. Un cop hem actualitzat el node, podem fer servir les sortides segons ens convingui
    • en l'exemple que estem explicant (veure imatge inferior) hem fet servir les sortides a mode de debug
      • sortida 1: debug de resposta de Sentilo
      • sortida 2: debug de codi d'estat http de Sentilo

Un cop finalitzat aquest procediment, ja hauríem de poder tornar a fer servir el nostre fluxe normalment:

3.3.1. Casos d'incompatibilitat

Un cop arranquem i entrem per primer cop a la nova instància de Node-RED, és molt probable que ens trobem amb aquest missatge per pantalla (en el cas que algun dels nostres fluxos estiguin fent servir un node de subscripció):

És un missatge totalment normal, i ens indica que, en algun dels nostres fluxos, estem fent servir un node que ja no existeix.

Ens trobarem una situació com aquesta:

En aquest cas, és el node subscribe que no existeix. Com ja hem dit abans, ha canviat de nom i ara hi ha dos tipus de node de subscripció.

El que correspon a la versió anterior de forma directa seria el subscribe with enpoint, que podríem substituir-lo sense més problemes, tot seguint les passes comentades anteriorment.

Per fer-ho, cal esborrar el node antic (marcat en vermell) i inserir el nou node, tot tornant a configurar les seves dades de connexió com s'ha explicat anteriorment.

Finalment, el fluxe quedaria així:

NOTA: les indicacions i errors ens avisen que cal configurar novament el node, ja que hem fet una substitució

 

4. Recomanacions en el desenvolupament de fluxos personalitzats

4.1. Flux global

El flux global és una plantilla d'inici per a proveïdors que necessitin començar de forma ràpida i amb l'aplicació de bones pràctiques assolides durant el desenvolupament dels fluxes transversals.

En aquest flux mostrarem una petita col·lecció de sub-fluxes que podrem fer servir per a dur a terme tasques rutinàries i que sovint es repeteixen en els nostres fluxes:

clipboard-202503271625-ld51o.png

 

I un petit flux principal que mostra el seu ús:

clipboard-202503271625-fzx4u.png

Finalment donarem un seguit de pautes que cal seguir per tal de desenvolupar de forma estandarditzada dintre de l'ecosistema Node-RED d'SmartRegion.

4.1.1. Documentació

A continuació es detallen tots els recursos que composen un flux estandarditzat segons les bones pràctiques propossades.

4.1.1.1. Sub fluxos
4.1.1.1.1. globals.getFlowConfig: obtenció de la configuració del flux

clipboard-202503271625-9rbaf.png

Injecta automàticament l'objecte msg.flowConfig en el contexte, cada cop que es desplega el flux, i conté tota la configuració inicial, necessària per a poder executar el flux.

Estructura base:

  • flowConfig.sentilo: configuració base de Sentilo
    • flowConfig.sentilo.api.host: host de l'API de Sentilo
    • flowConfig.sentilo.api.token: token mestre, o per defecte, per acreditar-se contra l'API de Sentilo
    • flowConfig.sentilo.catalog.ens: llistat d'objectes amb les dades dels ens que es faran servir a l'execució
      • contingut: ens, provider i token
      • aquesta configuració depen de les necessitats del desenvolupador, i és una forma de determinar l'ens completament, però a part de l'id, la resta de dades podríen estar declarades de forma més global
    • flowConfig.sentilo.catalog.component: descripció de les dades del component (formen part dels paràmetres del sensors Sentilo)
      • component: nom / id del component
      • componentType: tipus del component
      • componentDesc: descripció del component
      • componentPublicAccess: declaració de si és públic o no el component
    • flowConfig.sentilo.catalog.sensors: llistat de sensors amb els que treballarem durant l'execució del flux
      • segueixen la normativa de paràmetres de sensors Sentilo quant a creació de Sensors
      • es poden definir completament o bé parcialment (per exemple, podem definir les dades del component de forma global, i compartir-la amb tots ells en el moment de la seva creació)

En general podem afegir qualsevol altre configuració que creiem oportuna, i la podrem fer servir sempre que cridem aquest sub-flux des del flux principal o altres sub-fluxos.

4.1.1.1.2. globals.getCatalog: Obtenir dades del catàleg

clipboard-202503271625-qgyas.png

Aquest sub-flux rep com a entrada un objecte reqParams amb les dades necessàries per fer la crida a l'API de Sentilo.

La sortida serà el resultat de la crida al servei catalog de Sentilo per a la recuperació del catalog del proveïdor (en cas de que el token sigui d'un proveïdor) o bé de tot el catàleg (si el token és el mestre).

reqParams

El sub-flux espera l'objecte msg.reqParams a l'entrada, o fallarà si no es troba correctament definit:

{ 
    ens: <ENS_ID>,
    provider: <PROVIDER_ID>,
    token: <PROVIDER_TOKEN> 
}

Si no s'informa el paràmetre token s'agafarà el token mestre per defecte (si està informat). Sinò, el sub-flux donarà un error i es pararà l'execució.

Filtres

  • componentType: si tenim definit el valor flowConfig.sentilo.catalog.component.componentType es farà servir com a filtre de la crida a Sentilo filtrant per tipus de component

Resposta

La resposta es recupera al msg.payload i és la que ofereix el servei catalog de Sentilo quan es cerca per credencials.

4.1.1.1.3. globals.addCatalog: Afegir sensors al catàleg

clipboard-202503271626-t3pok.png

Amb aquest sub-flux podrem afegir sensors al catàleg segons el servei catalog de Sentilo.

reqParams

El sub-flux espera l'objecte msg.reqParams a l'entrada, o fallarà si no es troba correctament definit:

{ 
    ens: <ENS_ID>,
    provider: <PROVIDER_ID>,
    token: <PROVIDER_TOKEN>, 
    sensorsToCreate: [SENSORS_ARRAY] 
}

Si no s'informa el paràmetre token s'agafarà el token mestre per defecte (si està informat). Sinò, el sub-flux donarà un error i es pararà l'execució.

El paràmetre reqParams.sensorsToCreate ha de contenir el llistat de sensors a crear, segons la documetació del servei catalog de Sentilo per a afegir diversos sensors d'un proveïdor (és el llistat del camp sensors).

Resposta

La resposta es recupera al msg.payload i és la que ofereix el servei catalog de Sentilo quan s'afegeixen diversos sensors per un proveïdor.

4.1.1.1.4. globals.publishObservations: Publicar observacions

clipboard-202503271626-5vk9q.png

Aquest sub-flux permet afegir publicar observacions per a diversos sensors, segons la documentació del servei data de Sentilo.

reqParams

El sub-flux espera l'objecte msg.reqParams a l'entrada, o fallarà si no es troba correctament definit:

{ 
    ens: <ENS_ID>,
    provider: <PROVIDER_ID>,
    token: <PROVIDER_TOKEN> 
}

Com a body passarem dintre de l'objecte msg.payload un objecte json amb el llistat d'observacions a publicar, tal i com s'especifica pel servei data de Sentilo.

Resposta

La resposta es recupera al msg.payload i és la que ofereix el servei data de Sentilo quan es publiquen observacions per a diversos sensors d'un proveïdor.

4.1.1.1.5. globals.getLastObservations: Obtenir les darreres observacions

clipboard-202503271711-4v0nh.png

Aquest sub-flux permet recuperar observacions dels sensors d'un proveïdor, segons la documentació del servei data de Sentilo.

reqParams

El sub-flux espera l'objecte msg.reqParams a l'entrada, o fallarà si no es troba correctament definit:

{ 
    ens: <ENS_ID>,
    provider: <PROVIDER_ID>,
    token: <PROVIDER_TOKEN>, 
    filters: { 
        from: <FROM_DATE>, 
        to: <TO_DATE>, 
        limit: <LIMIT> 
    } 
}

Si no s'informa el paràmetre token s'agafarà el token mestre per defecte (si està informat). Sinò, el sub-flux donarà un error i es pararà l'execució.

El paràmetre reqParams.filters és opcional, i pot contenir dades de filtrat per a realitzar la crida al servei de recuperació de d'observacions, amb els posibles paràmetres segons el servei data de Sentilo.

Exemple

filters: { 
    from: "27/03/2025T14:00:00", 
    to: "27/03/2025T14:59:59", 
    limit: 100 
}

Amb aquests filtres podrem obtenir les 100 darreres observacions dels sensors del proveïdor pel temps comprès entre 27/03/2025T14:00:00 i 27/03/2025T14:59:59.

Tots els paràmetres de filtrat són opcionals.

Resposta

La resposta serà un json que serà retornat en l'objecte msg.payload i que contindrà l'estructura de dades segons el servei data de Sentilo.

4.1.1.2. Configuració i pas de paràmetres
4.1.1.2.1. flowConfig

Tota la paremetrització del flux ha d'anar definida en l'objecte json msg.flowConfig per conveniència. Qualsevol dada addicional hauria d'estar inclosa dintre d'ell, de forma que segueixi l'arquitectura documentada. D'aquesta forma assegurarem que sempre podrem trobar i configurar la parametrització del flux de forma senzilla i ordenada.

Exemple: 

msg.flowConfig =  {
    sentilo: {
        api: {
            host: "<HOST_SENTILO_API>",
            token: "<MASTER_TOKEN>" 
        },
        catalog: {
            ens: [
                {
                    ens: "myEns",
                    provider: "myEns@TEST_GLOBAL_FLOWS",
                    token: "<PROVIDER_TOKEN>" 
                }
            ],
            component: {
                "component": "test_global",
                "componentType": "generic",
                "componentDesc": "Component de test pels fluxos globals",
                "componentPublicAccess": "false",
            },
            sensors: {
                "global001": {
                    "sensor": "global001",
                    "description": "Test sensor for global flows",
                    "type": "status",
                    "dataType": "boolean",
                    "unit": "",
                    "publicAccess": "false",
                    "location":"41.4123488 2.2076235",
                },
                "global002": {
                    "sensor": "global002",
                    "description": "Test sensor for global flows",
                    "type": "temperature",
                    "dataType": "number",
                    "unit": "ºC",
                    "publicAccess": "false",
                    "location":"41.4123488 2.2076235",
                },
                "global003": {
                    "sensor": "global003",
                    "description": "Test sensor for global flows",
                    "type": "battery",
                    "dataType": "number",
                    "unit": "%",
                    "publicAccess": "false",
                    "location":"41.4123488 2.2076235",
                }
            }
        }
    }
}
4.1.1.2.2. reqParams

El pas de paràmetres entre nodes es fa a través de l'objecte msg.reqParams i ha de contenit, al menys, les dades de l'ens amb el que estem treballant. Addicionalment podrem passar tota aquella parametrització que sigui necessària, sempre assegurant una convenció segura i senzilla de recordar.

IMPORTANT: donat que aquest objecte viatga en el contexte msg&nbsp;del flux, és molt important mantenir-lo durant tota l'execució, fet que si modifiquem o destruïm el msg&nbsp;en algun node, hem de saber que pedrem aquesta parametrització i el flux fallarà en cridar els sub-fluxos.

4.1.2. Flux principal

Per tal de demostrar el funcionament dels sub-fluxos globals, i donar un exemple d'ús i bones pràctiques, a continuació podreu trobar un flux de test que els fa servir de forma linial.

clipboard-202503271625-fzx4u.png

El flux llegeix la configuració, genera el catàleg que no existeix, i hi publica dades d'observacions aleatòries.

4.1.2.1. Funcionament

Aquest flux de proves demostra com fer servir les diferents funcionalitats globals:

4.1.2.1.1. Inici i iteració de ens

clipboard-202503271628-vpyfo.png

  1. Iniciem el flux de forma manual amb Inici
  2. Obtenim la configuració del flux amb la crida globals.getFlowConfig
  3. Obtenim un llistat d'ens i ho passem com a array en msg.ensList
  4. Iterem els ens amb el node loopArray, de forma que tindrem a la sortida un nou msg amb les dades de l'ens actual
    • el node de debug ens&nbsp;informa de les dades de l'ens que actualment estem tractant (contingut del msg.payload)
    • el node de debug end&nbsp;informa quan acabem totes les iteracions (mostrarà el contingut de msg.payload)
4.1.2.1.2. prepareReqParams

clipboard-202503271707-tqzwu.png

El node funcional prepareReqParams&nbsp;recupera les dades de l'ens, que venen en msg.payload i les integra en msg.reqParams, que serà l'objecte de parametrització que farem servir durant tot el flux.

4.1.2.1.3. Recupera dades del catàleg

clipboard-202503271706-lphfo.png

El primer pas de la iteració recupera les dades del cataleg:

  1. Cridem a globals.getCatalog
  2. Tractem la resposta de la sortida en el node funcional sensorsToCreate
    • obtenim la llista de sensors que hauríen d'existir pel proveïdor (segons la configuració del flux), s'emmagatzema en msg.reqParams.sensorsToExist, i la mostra el node de debug sensorsToExist
    • generem una llista de sensors que cal crear (es fa la comparació entre les dades obtingudes del catàleg i els sensors que hauríen d'existir, i es genera la llista), s'emmagatzema en msg.reqParams.sensorsToCreate, i la mostra el node de debug sensorsToCreate
4.1.2.1.4. Crear sensors al catàleg

clipboard-202503271638-i4bzi.png

Es processa la llista msg.reqParams.sensorsToCreate, i si no es buida es crida a globals.addCatalog, passant-la com a body de la crida a Sentilo:

  1. El node crearSensors? decideix si cal o no crear sensors (verifica msg.reqParams.sensorsToCreate)
    • si cal crear-los, anirem per la primera sortida del node, on es crida a globals.addCatalog i es fa una pausa de 5 segons (temps de sincronització del catàleg de Sentilo, caldrà validar segons el cas si augmentar aquest temps)
    • si no cal crear-los, continuem per la segona sortida
4.1.2.1.5. Obtenció de les darreres observacions

clipboard-202503271642-unkbw.png

  1. El node crearSensors? decideix que no cal crear sensors (verifica msg.reqParams.sensorsToCreate), continuem per la segona sortida
  2. El node funcional prepareGetLastObservations prepara la crida per obtenir les darreres observacions del catàleg
    • en aquest punt podem afegir els paràmetres msg.reqParams.filters.frommsg.reqParams.filters.to i msg.reqParams.filters.limit (totalment opcionals, veieu els exemples de la documentació oficial de Sentilo per a més informació)
    • si no cal afegir filtres, podem deixar aquest node sense implementar
  3. Es crida a globals.getLastObservations, per tal d'obtenir les observacions que resultin d'aplicar els diferents filtres
    • el node de debug getLastObservations&nbsp;mostra les dades obtingudes
4.1.2.1.6. Processament de les dades obtingudes

clipboard-202503271649-ocjok.png

Si cal fer algun processament o interpretació de les dades ho farem al node funcional processLastObservations, que les tindrem disponibles al msg.payload (el format és el que es defineix a la documentació oficial de Sentilo)

El flux d'exemple conté una implementació parcial d'aquest node per a poder treballar amb les dades d'entrada.

4.1.2.1.7. Preparar la publicació de les dades

clipboard-202503271652-frhwv.png

Finalment, un cop hem obtingut les dades de sentilo, i si ha calgut tractar-les, podrem preparar les possibles publicacions al node funcional preparePublishObservatiosn.

Aquest node del flux de test implementa la generació de dades aletòries pels diferents sensors de test. És en aquest punt on caldrà afegir la lògica de creació de les possibles observacions que volem publicar a Sentilo.

L'objecte msg.payload haurà de contenir les observacions que enviarem en el body de la crida a Sentilo (veieu el format en la documentació oficial de Sentilo). Aquestes dades les podrem revisar gràcies al node de debug preparePublishObservations.

La publicació es fa amb la posterior crida al sub-flux globals.publishObservations, que publicarà les dades que li passem pel msg.payload com a body de la crida. El node de debug publishObaservations mostrarà el resultat de la crida.

4.1.3. Consideracions finals

  • Aquest flux estableix una base de desenvolupament, i caldria fer-la servir per a tots els fluxos que es desenvolupin, donat que aporta un sistema de treball consolidat i testejat
  • Els sub-fluxos globals es poden localitzar en una pestanya independent, i fer-los servir des de qualsevol flux de la instància Node-RED a la que es despleguen
  • Es recomana canviar els noms de global. per altres més addients, o simplement extreure aquest prefixe, si es considera oportú (només són noms descriptius)
  • La lògica de recuperació de dades del catàleg, el seu tractament i posterior processat per tal de generar o recuperar dades a publicar a Sentilo és el core del flux, i és on realment es farà tota la feixa important (queda a dispossició del desenvolupador implementar aquesta part)
  • La configuració es pot extendre al màxim, però es recomana sempre afegir a les dades de l'ens tot allò que en algun moment sigui necessari per a realitzar crides o càlculs específics, donat que sempre viatgen dintre dels reqParams
  • Es desaconsella fer servir un token mestre, però si es pot fer servir el paràmetre si el mateix token pot afectar a tots els ens iterables (pe. una aplicació amb permisos sobre tots ells)

 

4.1.4. Descàrrega del codi font

Podeu trobar el codi font d'aquest flux en aquest link, per tal de poder-lo fer servir com a base inicial.

 

 

4.2. Persistència de dades a disc

Els fluxos tenen un espai de disc reservat per a poder escriure de forma segura. Aquest espai roman dintre del contexte de la instància Node-RED, i només podrem escriure les nostres dades dintre del mateix.

Aquest espai es troba al path absolut /data.

Es recomanda, doncs, fer servir sempre aquesta adreça com a base del path del fitxer que volguem escriure (o llegir), per tal d'accedir correctament i sense problemes al seu contingut.

Exemple d'escriptura a /data/fluxes/global/flowConfig.json