entschlüsseln mit Crypto-JS

Node-RED als CCU3/RaspberryMatic Addon, WebApp, HomeKit, ...

Moderator: Co-Administratoren

Antworten
Basilisk
Beiträge: 3
Registriert: 27.11.2019, 19:10

entschlüsseln mit Crypto-JS

Beitrag von Basilisk » 16.12.2020, 22:47

Hallo,
ich habe einen Air-Q Luftgütesensor, den ich gern per Node Red integrieren möchte.
Dieser Sensor liefert allerdings seine Daten AES 256 verschlüsselt.
Mittels der Nodes aus 'node-red-contrib-crypto-js' komme ich nicht weiter, da ich dort den Initialisierungsvektor (IV) nicht angeben kann.
So werde ich wohl um eine Function-Node nicht herum kommen.
Aber: wie nutze ich das crypto-js Paket aus der Funktion-Node heraus?
Wie ist da die Vorgehensweise?
Ich wäre für eine Tipp äußerst dankbar

Benutzeravatar
Psi
Beiträge: 512
Registriert: 09.08.2018, 19:58
Wohnort: Nürnberg
Hat sich bedankt: 27 Mal
Danksagung erhalten: 90 Mal

Re: entschlüsseln mit Crypto-JS

Beitrag von Psi » 22.12.2020, 16:08


Basilisk
Beiträge: 3
Registriert: 27.11.2019, 19:10

Re: entschlüsseln mit Crypto-JS

Beitrag von Basilisk » 30.12.2020, 16:09

ja, hatte ich auch probiert.
Ich hatte in der Datei
/usr/local/addons/redmatic/lib/node_modules/node-red/settings.js
folgendes angepasst:

Code: Alles auswählen

    
    functionGlobalContext: {
      cryptojs:require('crypto-js')
    },
Danach startete RedMatic nicht mehr (auch nicht im SafeMode).
Fehlermeldung (Safemode):
Dec 30 12:35:03 Home daemon.info redmatic: Starting Node-RED
Dec 30 12:35:06 Home daemon.err node-red: Error loading settings file: /usr/local/addons/redmatic/lib/settings.js
Dec 30 12:35:06 Home daemon.err node-red: TypeError: Converting circular structure to JSON
Dec 30 12:35:06 Home daemon.err node-red: --> starting at object with constructor 'Object'
Dec 30 12:35:06 Home daemon.err node-red: | property 'Encryptor' -> object with constructor 'Object'
Dec 30 12:35:06 Home daemon.err node-red: --- property '$super' closes the circle
Dec 30 12:35:06 Home daemon.err node-red: at JSON.stringify (<anonymous>)
Dec 30 12:35:06 Home daemon.err node-red: at Object.<anonymous> (/usr/local/addons/redmatic/lib/settings.js:84:49)
Dec 30 12:35:06 Home daemon.err node-red: at Module._compile (internal/modules/cjs/loader.js:1063:30)
Dec 30 12:35:06 Home daemon.err node-red: at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
Dec 30 12:35:06 Home daemon.err node-red: at Module.load (internal/modules/cjs/loader.js:928:32)
Dec 30 12:35:06 Home daemon.err node-red: at Function.Module._load (internal/modules/cjs/loader.js:769:14)
Dec 30 12:35:06 Home daemon.err node-red: at Module.require (internal/modules/cjs/loader.js:952:19)
Dec 30 12:35:06 Home daemon.err node-red: at require (internal/modules/cjs/helpers.js:88:18)
Dec 30 12:35:06 Home daemon.err node-red: at Object.<anonymous> (/usr/local/addons/redmatic/lib/node_modules/node-red/red.js:136:20)
Dec 30 12:35:06 Home daemon.err node-red: at Module._compile (internal/modules/cjs/loader.js:1063:30)

Benutzeravatar
Psi
Beiträge: 512
Registriert: 09.08.2018, 19:58
Wohnort: Nürnberg
Hat sich bedankt: 27 Mal
Danksagung erhalten: 90 Mal

Re: entschlüsseln mit Crypto-JS

Beitrag von Psi » 30.12.2020, 16:15

Probier mal nur den gewünschten Algo zu importieren, zB require("crypto-js/aes")
ansonsten: ist dein global-context file-based? vllt mal auf memory umstellen?

uschlaak
Beiträge: 1
Registriert: 10.02.2021, 18:12
System: CCU

Re: entschlüsseln mit Crypto-JS

Beitrag von uschlaak » 10.02.2021, 18:18

Hi Basilisk,
kannst Du Deine Air-Q Werte mittlerweile in der CCU verfügbar machen?
Falls ja, ich habe die gleiche Anforderung und wäre sehr interessiert an Deiner Lösung.

Basilisk
Beiträge: 3
Registriert: 27.11.2019, 19:10

Re: entschlüsseln mit Crypto-JS

Beitrag von Basilisk » 07.04.2021, 23:06

Hi,
ja, ich mach das mittlerweile per MQTT. Dazu habe ich Mosquitto auf meinem NAS installiert (alternativ gehts auch direkt auf der Raspmatic).
Im Air-Q sind sodann anzugeben: IP des Mosquitto-Servers; Port 1883, und als Topic habe ich 'airq' vergeben.

Das Entschlüsseln per Crypto-JS habe ich nicht hinbekommen.

Hier der relevante Ausschnitt:

Code: Alles auswählen

[{"id":"e76ef1f9.54929","type":"mqtt in","z":"b68cafb2.3fe91","name":"","topic":"airq/#","qos":"2","datatype":"auto","broker":"c6d21b9b.049868","x":110,"y":100,"wires":[["a9fa3ffa.2c693"]]},{"id":"a9fa3ffa.2c693","type":"json","z":"b68cafb2.3fe91","name":"","property":"payload","action":"","pretty":false,"x":270,"y":100,"wires":[["aed7775b.596f18"]]},{"id":"80b95a8.8a1a1a8","type":"ui_text","z":"b68cafb2.3fe91","d":true,"group":"7f9412b5.bb36fc","order":3,"width":0,"height":0,"name":"3","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":280,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"8747c11a.381f3","type":"mysql","z":"b68cafb2.3fe91","mydb":"516fd941.d7ea98","name":"AirQ-DB","x":800,"y":40,"wires":[[]]},{"id":"fb0d60a5.cbd82","type":"function","z":"b68cafb2.3fe91","name":"writeDB","func":"// var ti = Date.now();\n// \"TypPS\":2.432,\"bat\":[0,0],\"oxygen\":[20.887,0.83],\"pm10\":[30.239,13.33],\"cnt0_5\":[890.296,105.53],\"co\":[1.325,0.38],\"temperature\":[23.401,0.53],\"performance\":0,\"uptime\":13149,\"window_event\":0,\"co2\":[759.775,73.94001],\"so2\":[11975.64,35.85],\"DeviceID\":\"dfb9e63f915956256bb051f11297de1e\",\"measuretime\":1598.634,\"no2\":[88.20601,2.96],\"cnt5\":[4.31,10.81],\"timestamp\":1612029223000,\"dewpt\":[5.096,1.4],\"door_event\":0,\"cnt1\":[120.93,24.32],\"pm1\":[19.634,12.14],\"Status\":\"OK\",\"tvoc\":[371.873,57.15],\"health\":190.028,\"cnt10\":[1.014,10.31],\"pressure\":[1005.709,1],\"dCO2dt\":-0.307,\"sound_max\":61.4,\"cnt2_5\":[10.352,11.61],\"o3\":[204.139,1.72],\"humidity\":[31.248,3.38],\"dHdt\":-0.072,\"person\":0,\"window_open\":0,\"humidity_abs\":[6.599,0.63],\"sound\":[40.446,5.68],\"pm2_5\":[26.465,12.86],\"cnt0_3\":[2757.634,304.96]},\"qos\":0,\"retain\":false,\"_msgid\":\"bc506578.333ea8\"}\n\nvar sqlInsert = \"INSERT INTO `Living_Room` (`measuredAt`, `DeviceID`, `Device`, `measuretime`, `uptime` , `health`, `performance`,  `temperature`, `temperature_e`, `dewpt`, `dewpt_e`,  `humidity`, `humidity_e`, `humidity_abs`, `humidity_abs_e`, `dHdt`, `oxygen`, `oxygen_e`, `o3`, `o3_e`,  `co`, `co_e`, `co2`, `co2_e`, `dCO2dt`, `no2`, `no2_e`, `so2`, `so2_e`, `tvoc`, `tvoc_e`, `pm1`, `pm1_e`, `pm2_5`, `pm2_5_e`, `pm10`, `pm10_e`, `cnt0_3`, `cnt0_3_e`, `cnt0_5`, `cnt0_5_e`, `cnt1`, `cnt1_e`, `cnt2_5`, `cnt2_5_e`, `cnt5`, `cnt5_e`, `cnt10`, `cnt10_e`, `TypPS`,`sound`, `sound_e`, `sound_max`, `pressure`, `pressure_e`,  `Status`) \";\nvar sqlValues = \"VALUES (FROM_UNIXTIME(\" + msg.values[\"timestamp\"]/1000 + \"), '\" + \n                                           msg.values[\"DeviceID\"] + \"', 'AirQ Pro', '\" + \n                                           msg.values[\"measuretime\"] + \"', '\" + \n                                           msg.values[\"uptime\"] + \"', '\" + \n                                           msg.values[\"health\"] + \"', '\" + \n                                           msg.values[\"performance\"] + \"', '\" + \n                                           msg.values[\"temperature\"][0] + \"','\" +\n                                           msg.values[\"temperature\"][1] + \"', '\" + \n                                           msg.values[\"dewpt\"][0] + \"', '\" + \n                                           msg.values[\"dewpt\"][1] + \"', '\" + \n                                           msg.values[\"humidity\"][0] + \"', '\" + \n                                           msg.values[\"humidity\"][1] + \"', '\" + \n                                           msg.values[\"humidity_abs\"][0] + \"', '\" + \n                                           msg.values[\"humidity_abs\"][1] + \"', '\" + \n                                           msg.values[\"dHdt\"] + \"', '\" +\n                                           msg.values[\"oxygen\"][0] + \"', '\" + \n                                           msg.values[\"oxygen\"][1] + \"', '\" + \n                                           msg.values[\"o3\"][0] + \"', '\" + \n                                           msg.values[\"o3\"][1] + \"', '\" + \n                                           msg.values[\"co\"][0] + \"', '\" + \n                                           msg.values[\"co\"][1] + \"', '\" +\n                                           msg.values[\"co2\"][0] + \"', '\" + \n                                           msg.values[\"co2\"][1] + \"', '\" +\n                                           msg.values[\"dCO2dt\"] + \"', '\" + \n                                           msg.values[\"no2\"][0] + \"', '\" +\n                                           msg.values[\"no2\"][1] + \"', '\" +\n                                           msg.values[\"so2\"][0] + \"', '\" + \n                                           msg.values[\"so2\"][1] + \"', '\" + \n                                           msg.values[\"tvoc\"][0] + \"', '\" +\n                                           msg.values[\"tvoc\"][1] + \"', '\" + \n                                           msg.values[\"pm1\"][0] + \"', '\" + \n                                           msg.values[\"pm1\"][1] + \"', '\" +\n                                           msg.values[\"pm2_5\"][0] + \"', '\" + \n                                           msg.values[\"pm2_5\"][1] + \"', '\" + \n                                           msg.values[\"pm10\"][0] + \"', '\" + \n                                           msg.values[\"pm10\"][1] + \"', '\" +\n                                           msg.values[\"cnt0_3\"][0] + \"', '\" + \n                                           msg.values[\"cnt0_3\"][1] + \"', '\" + \n                                           msg.values[\"cnt0_5\"][0] + \"', '\" +\n                                           msg.values[\"cnt0_5\"][1] + \"', '\" + \n                                           msg.values[\"cnt1\"][0] + \"', '\" +\n                                           msg.values[\"cnt1\"][1] + \"', '\" +\n                                           msg.values[\"cnt2_5\"][0] + \"', '\" + \n                                           msg.values[\"cnt2_5\"][1] + \"', '\" +\n                                           msg.values[\"cnt5\"][0] + \"', '\" + \n                                           msg.values[\"cnt5\"][1] + \"', '\" + \n                                           msg.values[\"cnt10\"][0] + \"', '\" + \n                                           msg.values[\"cnt10\"][1] + \"', '\" + \n                                           msg.values[\"TypPS\"] + \"', '\" +\n                                           msg.values[\"sound\"][0] + \"', '\" + \n                                           msg.values[\"sound\"][1] + \"','\" +\n                                           msg.values[\"sound_max\"] + \"','\" + \n                                           msg.values[\"pressure\"][0] + \"','\" +\n                                           msg.values[\"pressure\"][1] + \"','\" + \n                                           msg.values[\"Status\"] + \"')\";\"\"\n\nmsg.topic = sqlInsert + sqlValues;\nmsg.values = \"\";\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":640,"y":40,"wires":[["8747c11a.381f3"]]},{"id":"5b579d25.52a2e4","type":"comment","z":"b68cafb2.3fe91","name":"Inhalt","info":"`measuredAt`     DATETIME           COMMENT 'Zeitstempel zu den Messwerten.' \n`DeviceID`       VARCHAR(32)        COMMENT 'Identifiziert den Air-Q eindeutig.' \n`Device`         VARCHAR(32)        COMMENT 'Der vom Air-Q an service.php übergebene Device-Name.' \n`measuretime`    INT   DEFAULT NULL COMMENT 'Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde.' \n`uptime`         INT   DEFAULT NULL COMMENT 'Laufzeit des air-Q in ms seit dem letzten Neustart.' \n`health`         FLOAT DEFAULT NULL COMMENT 'Berechneter Gesundheitsindex. Bereich 0 bis 1000: normale Bewertung. -200 bei Gasalarm. -800 bei Feueralarm.'\n`performance`    FLOAT DEFAULT NULL COMMENT 'Berechneter Leistungsindex.'\n`temperature`    FLOAT DEFAULT NULL COMMENT 'Temperatur in °C.'\n`temperature_e`  FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`dewpt`          FLOAT DEFAULT NULL COMMENT 'Taupunkt in °C.'\n`dewpt_e`        FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`humidity`       FLOAT DEFAULT NULL COMMENT 'Relative Luftfeuchtigkeit in %.'\n`humidity_e`     FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`humidity_abs`   FLOAT DEFAULT NULL COMMENT 'Absolute Luftfeuchtigkeit in g/m3.'\n`humidity_abs_e` FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`dHdt`           FLOAT DEFAULT NULL COMMENT 'Änderungsrate der absoluten Luftfeuchtigkeit in g/m3/s.'\n`oxygen`         FLOAT DEFAULT NULL COMMENT 'Sauerstoff-Konzentration in Volumen-Prozent.'\n`oxygen_e`       FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`o3`             FLOAT DEFAULT NULL COMMENT 'O3-Konzentration in µg/m3.'\n`o3_e`           FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`co`             FLOAT DEFAULT NULL COMMENT 'CO-Konzentration in ppm.'\n`co_e`           FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`co2`            FLOAT DEFAULT NULL COMMENT 'CO2-Konzentration in ppm.'\n`co2_e`          FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`dCO2dt`         FLOAT DEFAULT NULL COMMENT 'CO2-Änderungsrate in ppm/s.'\n`no2`            FLOAT DEFAULT NULL COMMENT 'NO2-Konzentration in µg/m3.'\n`no2_e`          FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`so2`            FLOAT DEFAULT NULL COMMENT 'SO2-Konzentration in µg/m3.'\n`so2_e`          FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`tvoc`           FLOAT DEFAULT NULL COMMENT 'VOC-Konzentration in ppb.'\n`tvoc_e`         FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`pm1`            FLOAT DEFAULT NULL COMMENT 'Feinstaubkonzentration für die Partikel 1.0 µm in µg/m3.'\n`pm1_e`          FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`pm2_5`          FLOAT DEFAULT NULL COMMENT 'Feinstaubkonzentration für die Partikel 2.5 µm in µg/m3.'\n`pm2_5_e`        FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`pm10`           FLOAT DEFAULT NULL COMMENT 'Feinstaubkonzentration für die Partikel 10 µm in µg/m3.'\n`pm10_e`         FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`cnt0_3`         FLOAT DEFAULT NULL COMMENT 'Die Gesamtzahl der Feinstaub-Partikel größer als 0,3 µm.'\n`cnt0_3_e`       FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`cnt0_5`         FLOAT DEFAULT NULL COMMENT 'Die Gesamtzahl der Feinstaub-Partikel größer als 0,5 µm.'\n`cnt0_5_e`       FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`cnt1`           FLOAT DEFAULT NULL COMMENT 'Die Gesamtzahl der Feinstaub-Partikel größer als 1 µm.'\n`cnt1_e`         FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`cnt2_5`         FLOAT DEFAULT NULL COMMENT 'Die Gesamtzahl der Feinstaub-Partikel größer als 2,5 µm.'\n`cnt2_5_e`       FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`cnt5`           FLOAT DEFAULT NULL COMMENT 'Die Gesamtzahl der Feinstaub-Partikel größer als 5 µm.'\n`cnt5_e`         FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`cnt10`          FLOAT DEFAULT NULL COMMENT 'Die Gesamtzahl der Feinstaub-Partikel größer als 10 µm.'\n`cnt10_e`        FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`TypPS`          FLOAT DEFAULT NULL COMMENT 'Die durchschnittliche Partikelgröße in µm.'\n`sound`          FLOAT DEFAULT NULL COMMENT 'Lärm in dB(A).'\n`sound_e`        FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`sound_max`      FLOAT DEFAULT NULL COMMENT 'Maximaler Lärm in dB(A).'\n`pressure`       FLOAT DEFAULT NULL COMMENT 'Luftdruck in hPa.'\n`pressure_e`     FLOAT DEFAULT NULL COMMENT 'Abweichung (errorrate) in %.'\n`Status`         VARCHAR(10000)     COMMENT 'Aktueller Messungsstatus.'\n","x":110,"y":60,"wires":[]},{"id":"7332b150.d20bc","type":"function","z":"b68cafb2.3fe91","d":true,"name":"Messzeit","func":"msg.tooltip = \"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde.\";\nmsg.labelname = \"Messzeit\";\nmsg.unit = \"ms\";\nmsg.dbfield = \"measuretime\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield] + \" \" + msg.unit;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":240,"y":280,"wires":[["80b95a8.8a1a1a8"]]},{"id":"aed7775b.596f18","type":"function","z":"b68cafb2.3fe91","name":"set values","func":"msg.values = msg.payload;\nmsg.payload = \"\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":440,"y":100,"wires":[["fb0d60a5.cbd82","bf2a0ab5.7caca8"]]},{"id":"bf2a0ab5.7caca8","type":"link out","z":"b68cafb2.3fe91","name":"AirQ","links":["16a0621c.4d949e","4e844c2.e54dbb4","83474145.b6d43","264182fb.b2f72e","60a0c72d.7a12e8","f6a8743b.0fb818","cb9014bb.664908","d04f2bdb.1e5cb8"],"x":595,"y":100,"wires":[]},{"id":"16a0621c.4d949e","type":"link in","z":"b68cafb2.3fe91","name":"AirQ","links":["bf2a0ab5.7caca8"],"x":95,"y":200,"wires":[["7332b150.d20bc","c6c8b534.ea2b88","c0b4c074.d2ebd","d57d1964.7f2738","2d6e4d2d.75ffa2"]]},{"id":"c0b4c074.d2ebd","type":"function","z":"b68cafb2.3fe91","d":true,"name":"Laufzeit","func":"msg.tooltip = \"Laufzeit des air-Q in ms seit dem letzten Neustart.\";\nmsg.labelname = \"Laufzeit\";\nmsg.unit = \"ms\";\nmsg.dbfield = \"uptime\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield] + \" \" + msg.unit;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":240,"y":240,"wires":[["d6018919.2e7dd8"]]},{"id":"c6c8b534.ea2b88","type":"function","z":"b68cafb2.3fe91","d":true,"name":"GeräteID","func":"msg.tooltip = \"Identifiziert den Air-Q eindeutig.\";\nmsg.labelname = \"GeräteID\";\nmsg.unit = \"\";\nmsg.dbfield = \"DeviceID\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":240,"y":200,"wires":[["9038e12b.26db8"]]},{"id":"4e844c2.e54dbb4","type":"link in","z":"b68cafb2.3fe91","name":"AirQ","links":["bf2a0ab5.7caca8"],"x":595,"y":200,"wires":[["fcb9d585.c4f998","295e41a2.f5fb9e","caa4f43e.bb70c8","eb7ea811.1d59d8"]]},{"id":"fcb9d585.c4f998","type":"function","z":"b68cafb2.3fe91","name":"Feinstaubkonzentration 1.0 µm","func":"msg.tooltip = \"Feinstaubkonzentration für die Partikel 1.0 µm in µg/m3.\";\nmsg.labelname = \"Feinstaubkonzentration 1.0 µm\";\nmsg.unit = \"µg/m3\";\nmsg.dbfield = \"pm1\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":830,"y":200,"wires":[["26728c54.d460c4"]]},{"id":"295e41a2.f5fb9e","type":"function","z":"b68cafb2.3fe91","name":"Feinstaubkonzentration 2.5 µm","func":"msg.tooltip = \"Feinstaubkonzentration für die Partikel 2.5 µm in µg/m3.\";\nmsg.labelname = \"Feinstaubkonzentration 2.5 µm\";\nmsg.unit = \"µg/m3\";\nmsg.dbfield = \"pm2_5\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":830,"y":240,"wires":[["cced1875.d40dc8"]]},{"id":"caa4f43e.bb70c8","type":"function","z":"b68cafb2.3fe91","name":"durchschnittliche Partikelgröße","func":"msg.tooltip = \"Die durchschnittliche Partikelgröße in µm.\";\nmsg.labelname = \"durchschnittliche Partikelgröße\";\nmsg.unit = \"µm\";\nmsg.dbfield = \"TypPS\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":830,"y":320,"wires":[["355fe454.4d75ac"]]},{"id":"eb7ea811.1d59d8","type":"function","z":"b68cafb2.3fe91","name":"Feinstaubkonzentration 10 µm","func":"msg.tooltip = \"Feinstaubkonzentration für die Partikel 10 µm in µg/m3.\";\nmsg.labelname = \"Feinstaubkonzentration 10 µm\";\nmsg.unit = \"µg/m3\";\nmsg.dbfield = \"pm10\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":830,"y":280,"wires":[["c362fa78.633008"]]},{"id":"83474145.b6d43","type":"link in","z":"b68cafb2.3fe91","name":"AirQ","links":["bf2a0ab5.7caca8"],"x":95,"y":420,"wires":[["36538ebd.9e5412","1317a54c.f348bb","e886fb9b.9cfe98","915c7e6.00b3b8","6e42bf20.35a49"]]},{"id":"36538ebd.9e5412","type":"function","z":"b68cafb2.3fe91","name":"Luftdruck","func":"msg.tooltip = \"Luftdruck in hPa.\";\nmsg.labelname = \"Luftdruck\";\nmsg.unit = \"hPa\";\nmsg.dbfield = \"pressure\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":240,"y":580,"wires":[["56240193.ad9fe"]]},{"id":"1317a54c.f348bb","type":"function","z":"b68cafb2.3fe91","name":"Temperatur","func":"msg.tooltip = \"Temperatur in °C.\";\nmsg.labelname = \"Temperatur\";\nmsg.unit = \"°C.\";\nmsg.dbfield = \"temperature\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":250,"y":540,"wires":[["866afeb.721bd"]]},{"id":"e886fb9b.9cfe98","type":"function","z":"b68cafb2.3fe91","name":"Taupunkt","func":"msg.tooltip = \"Taupunkt in °C.\";\nmsg.labelname = \"Taupunkt\";\nmsg.unit = \"°C.\";\nmsg.dbfield = \"dewpt\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":240,"y":500,"wires":[["c01c59fc.13c8b8"]]},{"id":"915c7e6.00b3b8","type":"function","z":"b68cafb2.3fe91","name":"Absolute Luftfeuchtigkeit","func":"msg.tooltip = \"Absolute Luftfeuchtigkeit in g/m3.\";\nmsg.labelname = \"Absolute Luftfeuchtigkeit\";\nmsg.unit = \"g/m3\";\nmsg.dbfield = \"humidity_abs\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":290,"y":460,"wires":[["c7cabbfe.e57468"]]},{"id":"6e42bf20.35a49","type":"function","z":"b68cafb2.3fe91","name":"Relative Luftfeuchtigkeit","func":"msg.tooltip = \"Relative Luftfeuchtigkeit in %.\";\nmsg.labelname = \"Relative Luftfeuchtigkeit\";\nmsg.unit = \"%\";\nmsg.dbfield = \"humidity\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":290,"y":420,"wires":[["2571ac46.292984"]]},{"id":"d57d1964.7f2738","type":"function","z":"b68cafb2.3fe91","d":true,"name":"Zeitstempel","func":"msg.tooltip = \"Zeitstempel zu den Messwerten.\";\nmsg.labelname = \"Zeitstempel\";\nmsg.unit = \"\";\nmsg.dbfield = \"measuredAt\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":250,"y":320,"wires":[["b39ad21e.d566a"]]},{"id":"2d6e4d2d.75ffa2","type":"function","z":"b68cafb2.3fe91","name":"Status","func":"msg.tooltip = \"Aktueller Messungsstatus.\";\nmsg.labelname = \"Status\";\nmsg.unit = \"\";\nmsg.dbfield = \"Status\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":230,"y":360,"wires":[["1b3320d.1e4c0df"]]},{"id":"d6018919.2e7dd8","type":"ui_text","z":"b68cafb2.3fe91","d":true,"group":"7f9412b5.bb36fc","order":2,"width":0,"height":0,"name":"2","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":240,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"9038e12b.26db8","type":"ui_text","z":"b68cafb2.3fe91","d":true,"group":"7f9412b5.bb36fc","order":1,"width":0,"height":0,"name":"1","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":200,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"b39ad21e.d566a","type":"ui_text","z":"b68cafb2.3fe91","d":true,"group":"7f9412b5.bb36fc","order":4,"width":0,"height":0,"name":"4","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":320,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"1b3320d.1e4c0df","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":5,"width":0,"height":0,"name":"5","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":360,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"866afeb.721bd","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":12,"width":0,"height":0,"name":"12","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":540,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"56240193.ad9fe","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":13,"width":0,"height":0,"name":"13","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":580,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"264182fb.b2f72e","type":"link in","z":"b68cafb2.3fe91","name":"AirQ","links":["bf2a0ab5.7caca8"],"x":595,"y":380,"wires":[["17b0036.46ea0fd","6e35597e.93feb8","3f3ad0a1.aa41d","b00aa4.7ea7d56","7c81a086.9a48e","6fcfa628.8c9458"]]},{"id":"60a0c72d.7a12e8","type":"link in","z":"b68cafb2.3fe91","name":"AirQ","links":["bf2a0ab5.7caca8"],"x":595,"y":640,"wires":[["febf6bdb.e40a18","8e8fe040.703aa","a18679a3.cc0e78","37dde232.70fa1e","89eaa63f.d90268"]]},{"id":"f6a8743b.0fb818","type":"link in","z":"b68cafb2.3fe91","name":"AirQ","links":["bf2a0ab5.7caca8"],"x":595,"y":840,"wires":[["e7ed98b3.cd1968","6ffae204.8bdc7c","e535e2da.60831","6965efc7.ebee9"]]},{"id":"cb9014bb.664908","type":"link in","z":"b68cafb2.3fe91","name":"AirQ","links":["bf2a0ab5.7caca8"],"x":95,"y":640,"wires":[["54a16c63.8c6dc4","6f2d818e.431e4","5a51aec4.606c3"]]},{"id":"d04f2bdb.1e5cb8","type":"link in","z":"b68cafb2.3fe91","name":"AirQ","links":["bf2a0ab5.7caca8"],"x":95,"y":780,"wires":[["17240b37.d15c25","988445cd.f2b7e8","fd559ce5.edd63"]]},{"id":"17b0036.46ea0fd","type":"function","z":"b68cafb2.3fe91","name":"Partikelgröße 10 µm","func":"msg.tooltip = \"Die Gesamtzahl der Feinstaub-Partikel größer als 10 µm.\";\nmsg.labelname = \"Anzahl Partikel größer 10 µm\";\nmsg.unit = \"\";\nmsg.dbfield = \"cnt10\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":800,"y":580,"wires":[["3ec7e28.7cddc1e"]]},{"id":"6e35597e.93feb8","type":"function","z":"b68cafb2.3fe91","name":"Partikelgröße 5 µm","func":"msg.tooltip = \"Die Gesamtzahl der Feinstaub-Partikel größer als 5 µm.\";\nmsg.labelname = \"Anzahl Partikel größer 5 µm\";\nmsg.unit = \"\";\nmsg.dbfield = \"cnt5\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":790,"y":540,"wires":[["9e751b0.a5093e8"]]},{"id":"3f3ad0a1.aa41d","type":"function","z":"b68cafb2.3fe91","name":"Partikelgröße 2,5 µm","func":"msg.tooltip = \"Die Gesamtzahl der Feinstaub-Partikel größer als 2,5 µm.\";\nmsg.labelname = \"Anzahl Partikel größer 2,5 µm\";\nmsg.unit = \"\";\nmsg.dbfield = \"cnt2_5\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":800,"y":500,"wires":[["19cb42b9.30a42d"]]},{"id":"b00aa4.7ea7d56","type":"function","z":"b68cafb2.3fe91","name":"Partikelgröße 1 µm","func":"msg.tooltip = \"Die Gesamtzahl der Feinstaub-Partikel größer als 1 µm.\";\nmsg.labelname = \"Anzahl Partikel größer 1 µm\";\nmsg.unit = \"\";\nmsg.dbfield = \"cnt1\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":790,"y":460,"wires":[["c7fb0441.5441c8"]]},{"id":"7c81a086.9a48e","type":"function","z":"b68cafb2.3fe91","name":"Partikelgröße 0,5 µm","func":"msg.tooltip = \"Die Gesamtzahl der Feinstaub-Partikel größer als 0,5 µm.\";\nmsg.labelname = \"Anzahl Partikel größer 0,5 µm\";\nmsg.unit = \"\";\nmsg.dbfield = \"cnt0_5\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":800,"y":420,"wires":[["82155383.597ae"]]},{"id":"6fcfa628.8c9458","type":"function","z":"b68cafb2.3fe91","name":"Partikelgröße 0,3 µm","func":"msg.tooltip = \"Die Gesamtzahl der Feinstaub-Partikel größer als 0,3 µm.\";\nmsg.labelname = \"Anzahl Partikel größer 0,3 µm\";\nmsg.unit = \"\";\nmsg.dbfield = \"cnt0_3\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":800,"y":380,"wires":[["65603a37.a88fa4"]]},{"id":"febf6bdb.e40a18","type":"function","z":"b68cafb2.3fe91","name":"NO2","func":"msg.tooltip = \"NO2-Konzentration in µg/m3.\";\nmsg.labelname = \"NO2\";\nmsg.unit = \"µg/m3\";\nmsg.dbfield = \"no2\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":750,"y":800,"wires":[["d4189bdc.ae4468"]]},{"id":"8e8fe040.703aa","type":"function","z":"b68cafb2.3fe91","name":"SO2","func":"msg.tooltip = \"SO2-Konzentration in µg/m3.\";\nmsg.labelname = \"SO2\";\nmsg.unit = \"µg/m3\";\nmsg.dbfield = \"so2\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":750,"y":760,"wires":[["65a54708.f5cb48"]]},{"id":"a18679a3.cc0e78","type":"function","z":"b68cafb2.3fe91","name":"CO2","func":"msg.tooltip = \"CO2-Konzentration in ppm (parts per million).\";\nmsg.labelname = \"CO2\";\nmsg.unit = \"ppm\";\nmsg.dbfield = \"co2\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":750,"y":720,"wires":[["5ffcef67.3954f"]]},{"id":"37dde232.70fa1e","type":"function","z":"b68cafb2.3fe91","name":"CO","func":"msg.tooltip = \"CO-Konzentration in ppm (parts per million).\";\nmsg.labelname = \"CO\";\nmsg.unit = \"ppm\";\nmsg.dbfield = \"co\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":750,"y":680,"wires":[["18a6be01.d4ab52"]]},{"id":"89eaa63f.d90268","type":"function","z":"b68cafb2.3fe91","name":"Sauerstoff","func":"msg.tooltip = \"Sauerstoff-Konzentration in Volumen-Prozent.\";\nmsg.labelname = \"Sauerstoff\";\nmsg.unit = \"Volumen-Prozent\";\nmsg.dbfield = \"oxygen\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":770,"y":640,"wires":[["aae14e.b8e71eb"]]},{"id":"e7ed98b3.cd1968","type":"function","z":"b68cafb2.3fe91","name":"Änderungsrate der absoluten Luftfeuchtigkeit","func":"msg.tooltip = \"Änderungsrate der absoluten Luftfeuchtigkeit in g/m3/s.\";\nmsg.labelname = \"Änderungsrate der absoluten Luftfeuchtigkeit\";\nmsg.unit = \"g/m3/s\";\nmsg.dbfield = \"dHdt\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":870,"y":980,"wires":[["babb40ac.71009"]]},{"id":"6ffae204.8bdc7c","type":"function","z":"b68cafb2.3fe91","name":"CO2-Änderungsrate","func":"msg.tooltip = \"CO2-Änderungsrate in ppm/s.\";\nmsg.labelname = \"CO2-Änderungsrate\";\nmsg.unit = \"ppm/s\";\nmsg.dbfield = \"dCO2dt\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":800,"y":940,"wires":[["6936b2a1.94080c"]]},{"id":"e535e2da.60831","type":"function","z":"b68cafb2.3fe91","name":"Ozon","func":"msg.tooltip = \"Ozon-Konzentration in µg/m3.\";\nmsg.labelname = \"Ozon\";\nmsg.unit = \"µg/m3\";\nmsg.dbfield = \"o3\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":750,"y":880,"wires":[["b85b88f3.c57cb8"]]},{"id":"6965efc7.ebee9","type":"function","z":"b68cafb2.3fe91","name":"VOC","func":"msg.tooltip = \"VOC-Konzentration in ppb (parts per billion).\";\nmsg.labelname = \"VOC\";\nmsg.unit = \"ppb\";\nmsg.dbfield = \"tvoc\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":750,"y":840,"wires":[["4a51630d.30d25c"]]},{"id":"17240b37.d15c25","type":"function","z":"b68cafb2.3fe91","d":true,"name":"bat","func":"msg.tooltip = \"bat\";\nmsg.labelname = \"bat\";\nmsg.unit = \"\";\nmsg.dbfield = \"bat\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":230,"y":860,"wires":[["75c365a.5b8a69c"]]},{"id":"988445cd.f2b7e8","type":"function","z":"b68cafb2.3fe91","name":"Gesundheitsindex","func":"msg.tooltip = \"Berechneter Gesundheitsindex. Bereich 0 bis 1000: normale Bewertung. -200 bei Gasalarm. -800 bei Feueralarm.\";\nmsg.labelname = \"Gesundheitsindex\";\nmsg.unit = \"\";\nmsg.dbfield = \"health\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":270,"y":820,"wires":[["1d5b4b4d.325885"]]},{"id":"fd559ce5.edd63","type":"function","z":"b68cafb2.3fe91","name":"Leistungsindex","func":"msg.tooltip = \"Berechneter Leistungsindex.\";\nmsg.labelname = \"Leistungsindex\";\nmsg.unit = \"\";\nmsg.dbfield = \"performance\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":260,"y":780,"wires":[["24137a30.6a2c06"]]},{"id":"54a16c63.8c6dc4","type":"function","z":"b68cafb2.3fe91","name":"window_open","func":"msg.tooltip = \"window_open\";\nmsg.labelname = \"window_open\";\nmsg.unit = \"\";\nmsg.dbfield = \"window_open\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield] + \" \" + msg.unit;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":260,"y":720,"wires":[["e7eb8a01.b23ec8"]]},{"id":"6f2d818e.431e4","type":"function","z":"b68cafb2.3fe91","name":"Maximaler Lärm","func":"msg.tooltip = \"Maximaler Lärm in dB(A).\";\nmsg.labelname = \"Maximaler Lärm\";\nmsg.unit = \"dB(A)\";\nmsg.dbfield = \"sound_max\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":260,"y":680,"wires":[["3fed3fc4.23371"]]},{"id":"5a51aec4.606c3","type":"function","z":"b68cafb2.3fe91","name":"Lärm","func":"msg.tooltip = \"Lärm in dB(A).\";\nmsg.labelname = \"Lärm\";\nmsg.unit = \"dB(A)\";\nmsg.dbfield = \"sound\";\n\nmsg.label = '<label for=\"male\" title=\"' + msg.tooltip + '\">' + msg.labelname + '</label>';\nmsg.value = msg.values[msg.dbfield][0] + \" \" + msg.unit;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":230,"y":640,"wires":[["f890f40b.e42a68"]]},{"id":"c01c59fc.13c8b8","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":11,"width":0,"height":0,"name":"11","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":500,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"c7cabbfe.e57468","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":10,"width":0,"height":0,"name":"10","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":460,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"2571ac46.292984","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":9,"width":0,"height":0,"name":"9","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":420,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"24137a30.6a2c06","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":6,"width":0,"height":0,"name":"6","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":780,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"1d5b4b4d.325885","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":7,"width":0,"height":0,"name":"7","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":820,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"6936b2a1.94080c","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":35,"width":0,"height":0,"name":"22b","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":940,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"babb40ac.71009","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":34,"width":0,"height":0,"name":"10b","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":980,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"75c365a.5b8a69c","type":"ui_text","z":"b68cafb2.3fe91","d":true,"group":"7f9412b5.bb36fc","order":8,"width":0,"height":0,"name":"8","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":860,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"e7eb8a01.b23ec8","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":16,"width":0,"height":0,"name":"16","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":720,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"3fed3fc4.23371","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":15,"width":0,"height":0,"name":"15","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":680,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"f890f40b.e42a68","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":14,"width":0,"height":0,"name":"14","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":470,"y":640,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"4a51630d.30d25c","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":22,"width":0,"height":0,"name":"25","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":840,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"b85b88f3.c57cb8","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":23,"width":0,"height":0,"name":"26","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":880,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"aae14e.b8e71eb","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":17,"width":0,"height":0,"name":"20","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":640,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"18a6be01.d4ab52","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":18,"width":0,"height":0,"name":"21","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":680,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"5ffcef67.3954f","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":19,"width":0,"height":0,"name":"22","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":720,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"65a54708.f5cb48","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":20,"width":0,"height":0,"name":"23","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":760,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"d4189bdc.ae4468","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":21,"width":0,"height":0,"name":"24","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":800,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"65603a37.a88fa4","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":28,"width":0,"height":0,"name":"34","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":380,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"82155383.597ae","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":29,"width":0,"height":0,"name":"35","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":420,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"c7fb0441.5441c8","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":30,"width":0,"height":0,"name":"36","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":460,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"19cb42b9.30a42d","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":31,"width":0,"height":0,"name":"37","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":500,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"9e751b0.a5093e8","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":32,"width":0,"height":0,"name":"38","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":540,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"3ec7e28.7cddc1e","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":33,"width":0,"height":0,"name":"39","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":580,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"355fe454.4d75ac","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":27,"width":0,"height":0,"name":"33","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":320,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"c362fa78.633008","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":26,"width":0,"height":0,"name":"32","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":280,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"cced1875.d40dc8","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":25,"width":0,"height":0,"name":"31","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":240,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"26728c54.d460c4","type":"ui_text","z":"b68cafb2.3fe91","group":"7f9412b5.bb36fc","order":24,"width":0,"height":0,"name":"30","label":"{{msg.label}}","format":"{{msg.value}}","layout":"row-spread","x":1110,"y":200,"wires":[],"info":"Zeit in ms, die für den gesamten letzten Messdurchlauf benötigt wurde."},{"id":"c6d21b9b.049868","type":"mqtt-broker","name":"MQTT Broker on NAS-UD7","broker":"nas.ud7","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"7f9412b5.bb36fc","type":"ui_group","name":"AirQ (innen)","tab":"f8242e83.941c2","order":1,"disp":true,"width":"12","collapse":false},{"id":"516fd941.d7ea98","type":"MySQLdatabase","name":"AirQ","host":"nas.ud7","port":"3306","db":"airq","tz":"","charset":"UTF8"},{"id":"f8242e83.941c2","type":"ui_tab","name":"Tests","icon":"fa-code","order":22,"disabled":false,"hidden":false}]

Benutzeravatar
Daniel [air-Q]
Beiträge: 1
Registriert: 04.05.2021, 16:29
System: sonstige
Wohnort: Leipzig
Kontaktdaten:

Re: entschlüsseln mit Crypto-JS

Beitrag von Daniel [air-Q] » 04.05.2021, 17:16

Hallo,
ich habe keine tieferen Erfahrungen mit node-red, habe aber einen Flow erstellt, mit dem das Entschlüsseln der Daten vom air-Q einfach in komplexere Szenarien zu integrieren sein sollte.
Flow1.png
Überblick
Flow1.png (20.1 KiB) 1993 mal betrachtet
Zunächst muss crypto-js installiert werden:

Code: Alles auswählen

npm install crypto-js
Die http request-Node muss auf GET gesetzt werden und die URL bzw. IP-Adresse das air-Q als http-Aufruf mit der Route /data angegeben werden. Das Resultat wird direkt als geparsetes JSON weiter gegeben.
Flow2.png
http request
In der Datei settings.js im node-red-Verzeichnis muss der Eintrag

Code: Alles auswählen

functionExternalModules: false
auf

Code: Alles auswählen

functionExternalModules: true
gesetzt und node-red neu gestartet werden. Nun gibt es für die function-Node die Möglichkeit externe Module einzubinden. Hier ist crypto-js einzufügen als CryptoJS. Bei letzterem ist auf die richtige Großschreibung der entsprechenden Buchstaben zu achten.
Flow3.png
function module
Nun kann als Funktion in der function-Node nahezu 1:1 das JS-Beispiel aus der air-Q-Doku eingesetzt werden.
Flow4.png
function code
Das Passwort muss natürlich durch das eingestellte des air-Qs ersetzt werden.
Hier noch mal für Copy&Paste:

Code: Alles auswählen

let airqpass = 'airqsetup'

function decrypt(msgb64, airqpass) {
    if (airqpass.length < 32) {
      for (i=airqpass.length; i<32; i++) {
        airqpass += "0";
      }
    } else if (airqpass.length > 32) {
      airqpass = airqpass.substring(0,32)
    }
    var key = CryptoJS.enc.Utf8.parse(airqpass);
    var ciphertext = CryptoJS.enc.Base64.parse(msgb64);
    var iv = ciphertext.clone();
    iv.sigBytes = 16;
    iv.clamp();
    ciphertext.words.splice(0, 4); // delete 4 words = 16 bytes
    ciphertext.sigBytes -= 16;
    var decrypted = CryptoJS.AES.decrypt({ciphertext: ciphertext}, key, {
        iv: iv
    });
    return decrypted.toString(CryptoJS.enc.Utf8);
  }

decryptedMsg = decrypt(msg.payload.content, airqpass);
newMsg = { payload: decryptedMsg };
return newMsg;
Danach wird das Ergebnis noch durch den JSON parser geschickt und steht zur Weiterverarbeitung als JSON-Objekt zur Verfügung.

Ich füge hier noch den Inhalt des kompletten node-red-Flows für Copy&Paste ein, da ich die json-Datei leider nicht hochladen kann:

Code: Alles auswählen

[{"id":"c43f04e3.83891","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"9885b979.173ac","type":"inject","z":"c43f04e3.83891","name":"Execute","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":"1","topic":"","payload":"","payloadType":"date","x":150,"y":180,"wires":[["7c48c167.979f2"]]},{"id":"7c48c167.979f2","type":"http request","z":"c43f04e3.83891","name":"GET /data","method":"GET","ret":"obj","paytoqs":"ignore","url":"http://a1b2c_air-q.local/data","tls":"","persist":false,"proxy":"","authType":"","x":330,"y":180,"wires":[["5108ad8d.3213dc"]]},{"id":"10c7044c.9cab34","type":"debug","z":"c43f04e3.83891","name":"Result","active":false,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":880,"y":180,"wires":[]},{"id":"5108ad8d.3213dc","type":"function","z":"c43f04e3.83891","name":"Decrypt","func":"let airqpass = 'airqsetup'\n\nfunction decrypt(msgb64, airqpass) {\n    if (airqpass.length < 32) {\n      for (i=airqpass.length; i<32; i++) {\n        airqpass += \"0\";\n      }\n    } else if (airqpass.length > 32) {\n      airqpass = airqpass.substring(0,32)\n    }\n    var key = CryptoJS.enc.Utf8.parse(airqpass);\n    var ciphertext = CryptoJS.enc.Base64.parse(msgb64);\n    var iv = ciphertext.clone();\n    iv.sigBytes = 16;\n    iv.clamp();\n    ciphertext.words.splice(0, 4); // delete 4 words = 16 bytes\n    ciphertext.sigBytes -= 16;\n    var decrypted = CryptoJS.AES.decrypt({ciphertext: ciphertext}, key, {\n        iv: iv\n    });\n    return decrypted.toString(CryptoJS.enc.Utf8);\n  }\n\ndecryptedMsg = decrypt(msg.payload.content, airqpass);\nnewMsg = { payload: decryptedMsg };\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"CryptoJS","module":"crypto-js"}],"x":520,"y":180,"wires":[["8ced7356.8540d"]]},{"id":"8ced7356.8540d","type":"json","z":"c43f04e3.83891","name":"to JSON","property":"payload","action":"","pretty":false,"x":700,"y":180,"wires":[["10c7044c.9cab34"]]}]
Wissen was in der Luft ist - air-q.com

Antworten

Zurück zu „RedMatic“