SILAM pollen sensors

The SILAM (System for Integrated modeLling of Atmospheric composition) Pollen Sensors flow retrieves data from the SILAM Europe Pollen dataset and processes it to obtain specific pollen concentration values.

This flow can be used to fetch and process pollen data for further analysis, visualization, or integration with Home Assistant.

The flow performs the following steps:

Flow

  • Retrieves the current timestamp. The flow launches every hour.
  • Constructs the URL for accessing the SILAM Europe Pollen dataset, including the latitude, longitude, and time range.
  • Sends an HTTP request to the dataset's URL and retrieves the data in CSV format.
  • Parses the CSV data and extracts the relevant pollen concentration values.
  • Rounds the pollen concentration values to two decimal places.
  • Outputs the processed data with the rounded pollen concentration values.

if you want to change the location for yourself , you should edit the varibles in Generate URL node:

var latitude = '55.4';
var longitude = '37.4';

After a sucsessful run you should get a number a Polen Sensor (device) with all sensors inside your HAOS:

Please note that all data used in this flow is sourced from SILAM and is subject to their terms and conditions. For more information, visit the SILAM website at https://silam.fmi.fi/.

[{"id":"748a9a123fb82754","type":"tab","label":"Pollen","disabled":false,"info":"","env":[]},{"id":"66efc8ab3e071258","type":"http request","z":"748a9a123fb82754","name":"Get data for a nearest hour","method":"GET","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":560,"y":680,"wires":[["30e44156c3b3b844"]]},{"id":"30e44156c3b3b844","type":"csv","z":"748a9a123fb82754","name":"Parse Data","sep":",","hdrin":true,"hdrout":"none","multi":"one","ret":"\\n","temp":"time,latitude,longitude,vertCoord,cnc_POLLEN_ALDER_m22,cnc_POLLEN_GRASS_m32,cnc_POLLEN_MUGWORT_m18,cnc_POLLEN_RAGWEED_m18","skip":"0","strings":true,"include_empty_strings":"","include_null_values":"","x":810,"y":680,"wires":[["be35c11d6f8f37a2"]]},{"id":"d4b5c57364b95d6b","type":"ha-sensor","z":"748a9a123fb82754","name":"Birch","entityConfig":"1c54e03ec90d1c75","version":0,"state":"payload[\"cnc_POLLEN_BIRCH_m22[unit=number/m3]\"]","stateType":"msg","attributes":[],"inputOverride":"merge","outputProperties":[],"x":1490,"y":480,"wires":[[]]},{"id":"7befc5d90f31ecef","type":"function","z":"748a9a123fb82754","name":"Generate URL","func":"// Create a new Date object\nvar currentTimestamp = new Date();\n\n// Get the current year, month, day, and hour\nvar year = currentTimestamp.getUTCFullYear();\nvar month = currentTimestamp.getUTCMonth() + 1; // Month starts from 0, so add 1\nvar day = currentTimestamp.getUTCDate();\nvar hour = currentTimestamp.getUTCHours();\n\n// Format the values as two-digit strings\nvar formattedMonth = month.toString().padStart(2, '0');\nvar formattedDay = day.toString().padStart(2, '0');\nvar formattedHour = hour.toString().padStart(2, '0');\n\n// Construct the time_start and time_end strings\nvar timeStart = year + '-' + formattedMonth + '-' + formattedDay + 'T' + formattedHour + '%3A00%3A00Z';\nvar timeEnd = year + '-' + formattedMonth + '-' + formattedDay + 'T' + formattedHour + '%3A59%3A59Z';\n\n// Store the time variables in flow context or global context\nflow.set('timeStart', timeStart);\nflow.set('timeEnd', timeEnd);\n\n// Construct the complete URL with the time variables\nvar baseUrl = 'https://silam.fmi.fi/thredds/ncss/silam_europe_pollen_v5_8_2/silam_europe_pollen_v5_8_2_best.ncd';\nvar latitude = '55.4';\nvar longitude = '37.4';\nvar vertCoord = '12.5';\nvar accept = 'csv';\n\nvar url = baseUrl +\n  '?var=cnc_POLLEN_ALDER_m22&var=cnc_POLLEN_BIRCH_m22&var=cnc_POLLEN_GRASS_m32&var=cnc_POLLEN_HAZEL_m23' +\n  '&var=cnc_POLLEN_MUGWORT_m18&var=cnc_POLLEN_OLIVE_m28&var=cnc_POLLEN_RAGWEED_m18' +\n  '&latitude=' + latitude +\n  '&longitude=' + longitude +\n  '&time_start=' + timeStart +\n  '&time_end=' + timeEnd +\n  '&vertCoord=' + vertCoord +\n  '&accept=' + accept;\n\n// Set the URL in the output message\nmsg.url = url;\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":300,"y":680,"wires":[["66efc8ab3e071258"]]},{"id":"19de65bf11d3d39c","type":"inject","z":"748a9a123fb82754","name":"","props":[{"p":"payload"}],"repeat":"3600","crontab":"","once":true,"onceDelay":"1","topic":"","payload":"","payloadType":"date","x":110,"y":680,"wires":[["7befc5d90f31ecef"]]},{"id":"4b9d292a1de24852","type":"ha-sensor","z":"748a9a123fb82754","name":"Adler","entityConfig":"f9d23a0f04bdf521","version":0,"state":"payload[\"cnc_POLLEN_ALDER_m22[unit=number/m3]\"]","stateType":"msg","attributes":[],"inputOverride":"merge","outputProperties":[],"x":1490,"y":560,"wires":[[]]},{"id":"670f155890ec0a38","type":"ha-sensor","z":"748a9a123fb82754","name":"Mugwort","entityConfig":"d01c5a15fa9707ee","version":0,"state":"payload[\"cnc_POLLEN_MUGWORT_m18[unit=number/m3]\"]","stateType":"msg","attributes":[],"inputOverride":"merge","outputProperties":[],"x":1500,"y":740,"wires":[[]]},{"id":"22c58fa3f3b5f126","type":"ha-sensor","z":"748a9a123fb82754","name":"Olive","entityConfig":"f94ecb710f8ebb6f","version":0,"state":"payload[\"cnc_POLLEN_OLIVE_m28[unit=number/m3]\"]","stateType":"msg","attributes":[],"inputOverride":"merge","outputProperties":[],"x":1490,"y":800,"wires":[[]]},{"id":"4d06f621814ca963","type":"ha-sensor","z":"748a9a123fb82754","name":"Hazel","entityConfig":"5cadcbaf30d908c8","version":0,"state":"payload[\"cnc_POLLEN_HAZEL_m23[unit=number/m3]\"]","stateType":"msg","attributes":[],"inputOverride":"merge","outputProperties":[],"x":1490,"y":620,"wires":[[]]},{"id":"0be6c4960f613371","type":"ha-sensor","z":"748a9a123fb82754","name":"Grass","entityConfig":"a1c4296e079f7008","version":0,"state":"payload[\"cnc_POLLEN_GRASS_m32[unit=number/m3]\"]","stateType":"msg","attributes":[],"inputOverride":"merge","outputProperties":[],"x":1490,"y":680,"wires":[[]]},{"id":"b2ed93e7e74fdfbf","type":"ha-sensor","z":"748a9a123fb82754","name":"Ragweed","entityConfig":"8abd148ac6f1560d","version":0,"state":"payload[\"cnc_POLLEN_RAGWEED_m18[unit=number/m3]\"]","stateType":"msg","attributes":[],"inputOverride":"merge","outputProperties":[],"x":1500,"y":860,"wires":[[]]},{"id":"f641c0c44ca4113f","type":"debug","z":"748a9a123fb82754","name":"Json","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1270,"y":480,"wires":[]},{"id":"be35c11d6f8f37a2","type":"function","z":"748a9a123fb82754","name":"Round all data to 0.01","func":"// Input msg object contains your data\nvar data = msg.payload;\n\n// Round the values in cnc_ fields to 0.01\nif (data['cnc_POLLEN_ALDER_m22[unit=number/m3]'] !== undefined) {\n    data['cnc_POLLEN_ALDER_m22[unit=number/m3]'] = data['cnc_POLLEN_ALDER_m22[unit=number/m3]'] === 0 ? 0 : Number(data['cnc_POLLEN_ALDER_m22[unit=number/m3]'].toFixed(2));\n}\nif (data['cnc_POLLEN_BIRCH_m22[unit=number/m3]'] !== undefined) {\n    data['cnc_POLLEN_BIRCH_m22[unit=number/m3]'] = data['cnc_POLLEN_BIRCH_m22[unit=number/m3]'] === 0 ? 0 : Number(data['cnc_POLLEN_BIRCH_m22[unit=number/m3]'].toFixed(2));\n}\nif (data['cnc_POLLEN_GRASS_m32[unit=number/m3]'] !== undefined) {\n    data['cnc_POLLEN_GRASS_m32[unit=number/m3]'] = data['cnc_POLLEN_GRASS_m32[unit=number/m3]'] === 0 ? 0 : Number(data['cnc_POLLEN_GRASS_m32[unit=number/m3]'].toFixed(2));\n}\nif (data['cnc_POLLEN_HAZEL_m23[unit=number/m3]'] !== undefined) {\n    data['cnc_POLLEN_HAZEL_m23[unit=number/m3]'] = data['cnc_POLLEN_HAZEL_m23[unit=number/m3]'] === 0 ? 0 : Number(data['cnc_POLLEN_HAZEL_m23[unit=number/m3]'].toFixed(2));\n}\nif (data['cnc_POLLEN_MUGWORT_m18[unit=number/m3]'] !== undefined) {\n    data['cnc_POLLEN_MUGWORT_m18[unit=number/m3]'] = data['cnc_POLLEN_MUGWORT_m18[unit=number/m3]'] === 0 ? 0 : Number(data['cnc_POLLEN_MUGWORT_m18[unit=number/m3]'].toFixed(2));\n}\nif (data['cnc_POLLEN_OLIVE_m28[unit=number/m3]'] !== undefined) {\n    data['cnc_POLLEN_OLIVE_m28[unit=number/m3]'] = data['cnc_POLLEN_OLIVE_m28[unit=number/m3]'] === 0 ? 0 : Number(data['cnc_POLLEN_OLIVE_m28[unit=number/m3]'].toFixed(2));\n}\nif (data['cnc_POLLEN_RAGWEED_m18[unit=number/m3]'] !== undefined) {\n    data['cnc_POLLEN_RAGWEED_m18[unit=number/m3]'] = data['cnc_POLLEN_RAGWEED_m18[unit=number/m3]'] === 0 ? 0 : Number(data['cnc_POLLEN_RAGWEED_m18[unit=number/m3]'].toFixed(2));\n}\n\n// Output the modified data\nmsg.payload = data;\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1040,"y":680,"wires":[["f641c0c44ca4113f","d4b5c57364b95d6b","4b9d292a1de24852","4d06f621814ca963","0be6c4960f613371","670f155890ec0a38","22c58fa3f3b5f126","b2ed93e7e74fdfbf"]]},{"id":"1c54e03ec90d1c75","type":"ha-entity-config","server":"1fa5fc45.f8cc84","deviceConfig":"30de6d12df8e96f8","name":"Birch Sensor","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Birch sensor"},{"property":"icon","value":""},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":"number/m³"},{"property":"state_class","value":"measurement"}],"resend":false,"debugEnabled":false},{"id":"f9d23a0f04bdf521","type":"ha-entity-config","server":"1fa5fc45.f8cc84","deviceConfig":"30de6d12df8e96f8","name":"Adler Sensor","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Adler Sensor"},{"property":"icon","value":""},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":"number/m³"},{"property":"state_class","value":"measurement"}],"resend":false,"debugEnabled":false},{"id":"d01c5a15fa9707ee","type":"ha-entity-config","server":"1fa5fc45.f8cc84","deviceConfig":"30de6d12df8e96f8","name":"Mugwort Sensor","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Concentration Mugwort"},{"property":"icon","value":""},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":"number/m³"},{"property":"state_class","value":"measurement"}],"resend":true,"debugEnabled":false},{"id":"f94ecb710f8ebb6f","type":"ha-entity-config","server":"1fa5fc45.f8cc84","deviceConfig":"30de6d12df8e96f8","name":"Olive Sensor","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Olive Sensor"},{"property":"icon","value":""},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":"number/m³"},{"property":"state_class","value":"measurement"}],"resend":false,"debugEnabled":false},{"id":"5cadcbaf30d908c8","type":"ha-entity-config","server":"1fa5fc45.f8cc84","deviceConfig":"30de6d12df8e96f8","name":"Hazel sensor","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Hazel sensor"},{"property":"icon","value":""},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":"number/m³"},{"property":"state_class","value":"measurement"}],"resend":false,"debugEnabled":false},{"id":"a1c4296e079f7008","type":"ha-entity-config","server":"1fa5fc45.f8cc84","deviceConfig":"30de6d12df8e96f8","name":"Grass Sensor","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Grass Sensor"},{"property":"icon","value":""},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":"number/m³"},{"property":"state_class","value":"measurement"}],"resend":false,"debugEnabled":false},{"id":"8abd148ac6f1560d","type":"ha-entity-config","server":"1fa5fc45.f8cc84","deviceConfig":"30de6d12df8e96f8","name":"Ragweed Sensor","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Ragweed Sensor"},{"property":"icon","value":""},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":"number/m³"},{"property":"state_class","value":"measurement"}],"resend":false,"debugEnabled":false},{"id":"1fa5fc45.f8cc84","type":"server","name":"Home Assistant","addon":true},{"id":"30de6d12df8e96f8","type":"ha-device-config","name":"Polen Sensor (device)","hwVersion":"","manufacturer":"Node-RED","model":"","swVersion":""}]

Flow Info

Created 2 years, 3 months ago
Updated 1 year, 10 months ago
Rating: 5 4

Owner

Actions

Rate:

Node Types

Core
  • csv (x1)
  • debug (x1)
  • function (x2)
  • http request (x1)
  • inject (x1)
Other
  • ha-device-config (x1)
  • ha-entity-config (x7)
  • ha-sensor (x7)
  • server (x1)
  • tab (x1)

Tags

  • SILAM
  • pollen
  • allergy
  • forecast
  • sensor
  • sensors
  • HAOS
  • Home_assistant
Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option