Nodered

Fra IoTwiki
Version fra 6. maj 2020, 09:39 af Morck (diskussion | bidrag) Morck (diskussion | bidrag) (ChirpStack til PostgreSQL)

(forskel) ←Ældre version | Nuværende version (forskel) | Nyere version→ (forskel)
Skift til: navigering, søgning
Nodered
Systemtype
Version
Leverandør
Kort beskrivelse Nodered er et Flowbaseret programmeringsredskab til IoT
Open Source Ja
Dokumentation https://nodered.org/docs/
Hjemmeside https://nodered.org/
Sider, der referer til dette system Anvendelse af klimadata fra skybrudsprojekter


Installering og konfigurering af Node-RED

1. Opsætning og deployment :

Denne metode tager afsæt i linux-miljø og en Raspberry Pi er godt givet ud til førstegangsbrugere. Guiden understøtter derfor også Node-RED på en Raspberry Pi. Node-RED kan installeres på flere måder, hvoraf dette Docker-image er foretrukkent (https://nodered.org/docs/getting-started/docker), men giver pt. (2. kvartal 2020) fejl på diverse postgres-nodes - så kører du med postgres anbefales denne install istedet: https://nodered.org/docs/getting-started/raspberrypi som kan anvendes på alle Debian-systemer, herunder Ubuntu.

(to be continued, - Morck)

Flow Cheatsheet

ChirpStack til PostgreSQL

2. Opret postgresql tabel ved at tilrette tabeldefinition (eksempler på JSON index):

CREATE TABLE lora.sensor_payload (
	payload jsonb NOT NULL
);
CREATE INDEX sensor_data_cmd_index ON lora.sensor_payload USING btree (((payload ->> 'cmd'::text))) WHERE ((payload ->> 'cmd'::text) IS NOT NULL);
CREATE INDEX sensor_data_ts_index ON lora.sensor_payload USING btree (((payload ->> 'ts'::text))) WHERE ((payload ->> 'ts'::text) IS NOT NULL);
CREATE INDEX sensor_payload_eui_index ON lora.sensor_payload USING btree (((payload ->> 'EUI'::text))) WHERE ((payload ->> 'EUI'::text) IS NOT NULL);

3. Opsæt HTTP integration og angiv det endpoint der laves i NodeRED og angiv authorization header.
Chrirp-integration.PNG

4. Importer og tilret dette flow som laver endpoint som ChirpStack kan sende data til hvorefter de ligges i PostgreSQL. Der er skal opsættes en authorization header i ChirpStack som indeholder i Bearer token som der tjekkes for i NodeRED inden data sendes til PostgreSQL. Dette skal afhjælpe at ikke alle bare kan poste data i databasen. Kræver postgres node installeret (https://flows.nodered.org/node/node-red-contrib-re-postgres)

[{"id":"aa97dcbe.06c5a","type":"template","z":"b98e8310.c3c46","name":"format query","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"insert into lora.sensor_payload(payload) \nvalues ($payload)","x":810,"y":220,"wires":[["654e1962.734178"]]},{"id":"7f35e8d8.da47b8","type":"function","z":"b98e8310.c3c46","name":"setup params","func":"var data = JSON.stringify(msg)\n\nmsg.queryParameters = msg.queryParameters || {};\nmsg.queryParameters.payload = data;\n\nreturn msg","outputs":1,"noerr":0,"x":640,"y":220,"wires":[["aa97dcbe.06c5a"]]},{"id":"654e1962.734178","type":"postgres","z":"b98e8310.c3c46","postgresdb":"8f04308e.b0229","name":"iot db","output":false,"perrow":true,"outputs":0,"x":950,"y":220,"wires":[]},{"id":"ebd3a1e3.64e75","type":"http in","z":"b98e8310.c3c46","name":"","url":"/iot/climate","method":"post","upload":false,"swaggerDoc":"","x":180,"y":220,"wires":[["e1daacde.accba"]]},{"id":"e1daacde.accba","type":"function","z":"b98e8310.c3c46","name":"Auth","func":"var token = \"Bearer <JWT TOKEN>\"\n\nif (token === msg.req.headers.authorization) {\n    msg.authorized = true\n    return msg;\n} else {\n    msg.authorized = false\n    msg.payload = { \"message\": \"not authorized\"}\n    return msg\n}\n\n\n\n\n\n\n\n","outputs":1,"noerr":0,"x":330,"y":220,"wires":[["c9d9d387.d7dd3"]]},{"id":"c9d9d387.d7dd3","type":"switch","z":"b98e8310.c3c46","name":"","property":"authorized","propertyType":"msg","rules":[{"t":"true"},{"t":"false"}],"checkall":"true","repair":false,"outputs":2,"x":450,"y":220,"wires":[["afd5430f.fc7b8","7f35e8d8.da47b8"],["19629c53.b6c084"]]},{"id":"afd5430f.fc7b8","type":"http response","z":"b98e8310.c3c46","name":"","statusCode":"200","headers":{},"x":640,"y":360,"wires":[]},{"id":"166ed0cc.b7e1ef","type":"comment","z":"b98e8310.c3c46","name":"Post endpoint","info":"Lav endpoint til at modtage data","x":170,"y":260,"wires":[]},{"id":"4367ff9b.d132f","type":"comment","z":"b98e8310.c3c46","name":"Auth med token","info":"","x":340,"y":260,"wires":[]},{"id":"50f52e0c.a7626","type":"comment","z":"b98e8310.c3c46","name":"Håndter Auth","info":"Håndter Auth switch","x":450,"y":180,"wires":[]},{"id":"c4835f58.f2976","type":"comment","z":"b98e8310.c3c46","name":"klargør data til PG","info":"","x":630,"y":180,"wires":[]},{"id":"3008459a.1d519a","type":"comment","z":"b98e8310.c3c46","name":"Formater SQL","info":"","x":810,"y":180,"wires":[]},{"id":"d947c2e.bc2af4","type":"comment","z":"b98e8310.c3c46","name":"Send tiil DB","info":"","x":970,"y":180,"wires":[]},{"id":"19629c53.b6c084","type":"http response","z":"b98e8310.c3c46","name":"","statusCode":"401","headers":{},"x":640,"y":400,"wires":[]},{"id":"bff1171f.eca8e8","type":"comment","z":"b98e8310.c3c46","name":"Respose","info":"Svar afhængig af Auth","x":640,"y":320,"wires":[]},{"id":"8f04308e.b0229","type":"postgresdb","z":"a97f4c62.b7f59","hostname":"private-db.frb-data.dk","port":"25060","db":"iot","ssl":true}]