Hent og vis pollental
Nu er det desværre den tid på året, hvor mange er genereret af pollen-allergi.
Heldigvis kan du få Home Assistant (HA) til at advare dig, hvis pollen-prognosen lover høje pollental.
Du kan f.eks. lave en automatisering, der husker dig på at tage din allergi medicin. Eller ændrer udsugningen på dit Genvex anlæg.
Du kan også vise pollentallene i dit dashboard.
Men først skal du hente data med pollental og -prognoser ind i HA.
Hent pollenprognose
Der er flere muligheder for at hente dagens pollenprognose. De forskellige muligheder er kort beskrevet i de efterfølgende afsnit.
REST sensor i HA
Du kan bruge en REST sensor i HA til at hente data fra f.eks. Astma-Allergi Danmark eller DMI.
REST sensorer skal defineres i din configuration.yaml fil. Denne kode henter prognose og seneste pollental for græspollen i København i hver sin sensor:
rest:
############################################################################
# Hent pollental og prognose fra Astma-Allergi Danmark
#
# REST sensor er udarbejdet af Martin Larsen og oprindeligt delt her:
# https://www.facebook.com/groups/209025039666209/permalink/1153666198535417/
#
# Data er opdelt efter region:
#
# 48 = Øst for Storebælt
# 49 = Vest for Storebælt
#
# Og derefter pollentype:
#
# Alternaria: 44
# Birk: 7
# Bynke: 31
# Cladosporium: 45
# El: 1
# Elm: 4
# Græs: 28
# Hassel: 2
############################################################################
scan_interval: 3600 # Opdater hver time (=3600 sekunder)
resource: https://www.astma-allergi.dk/umbraco/Api/PollenApi/GetPollenFeed
sensor:
# Græspollen - pollental
- name: "Græspollen (seneste)"
icon: mdi:grass
value_template: >
{% set region = '48' %}
{% set pollen = '28' %}
{{ (value_json | from_json).fields[region].mapValue.fields.data.mapValue.fields[pollen].mapValue.fields.level.integerValue }}
# Græspollen - prognose
- name: "Græspollen (prognose)"
icon: mdi:grass
value_template: >
{% set region = '48' %}
{% set pollen = '28' %}
{% set prognose = (value_json | from_json).fields[region].mapValue.fields.data.mapValue.fields[pollen].mapValue.fields.predictions.mapValue.fields %}
{% set data = namespace(predictions=[]) %}
{% for p in prognose %}
{% set data.predictions = data.predictions + [{'date': p[6:10]+p[2:5]+'-'+p[:2], 'value': prognose[p].mapValue.fields.prediction.stringValue}] %}
{% endfor %}
{{ data.predictions | sort(attribute="date")}}
Der kan tilføjes sensorer for øvrige pollentyper eller for Viborg ved at ændre værdierne i hhv. set region
og set pollen
.
NodeRED
Du kan også lave en automatisering i NodeRED, der henter prognoserne. Det giver bedre kontrol over hvornår data skal hentes og hvordan de skal formateres og præsenteres:
Nedenstående kode er anvendt til dette flow:
[{"id":"fce46d9d310ebdfb","type":"inject","z":"acf7df60c2e781a0","name":"Hver 4. time","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"14400","crontab":"","once":false,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":110,"y":960,"wires":[["50d3abe8dde82418"]]},{"id":"50d3abe8dde82418","type":"http request","z":"acf7df60c2e781a0","name":"Allergi Danmark","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://www.astma-allergi.dk/umbraco/Api/PollenApi/GetPollenFeed","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":280,"y":960,"wires":[["3f8c55a0cfb8dbe7"]],"info":"### Credit\r\nPollen rest sensor udarbejdet af Martin Larsen og delt her:\r\n\r\nhttps://www.facebook.com/groups/209025039666209/permalink/1153666198535417/\r\n\r\nFørste tal i value_template er regionen, næste tal er pollentypen:\r\n\r\n### Region\r\n- Øst for Storebælt: 48\r\n- Vest for Storebælt: 49\r\n\r\n### Pollentype\r\n- Alternaria: 44\r\n- Birk: 7\r\n- Bynke: 31\r\n- Cladosporium: 45\r\n- El: 1\r\n- Elm: 4\r\n- Græs: 28\r\n- Hassel: 2"},{"id":"3f8c55a0cfb8dbe7","type":"json","z":"acf7df60c2e781a0","name":"","property":"payload","action":"","pretty":false,"x":470,"y":960,"wires":[["960878c66d210219"]]},{"id":"960878c66d210219","type":"change","z":"acf7df60c2e781a0","name":"Pollendata - København","rules":[{"t":"set","p":"update","pt":"msg","to":"payload.updateTime","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"payload.fields[\"48\"].mapValue.fields.data.mapValue.fields","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":660,"y":960,"wires":[["af8983811c7d4ec4"]]},{"id":"af8983811c7d4ec4","type":"split","z":"acf7df60c2e781a0","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"pollen","x":850,"y":960,"wires":[["43564f9fc9b2a117"]]},{"id":"43564f9fc9b2a117","type":"function","z":"acf7df60c2e781a0","name":"Parse data","func":"var pollen_navn=\"\";\nconst prognose = Object.entries(msg.payload.mapValue.fields.predictions.mapValue.fields);\nconst predictions=[];\n\nfor (let i = 0; i < prognose.length; i++) {\n var parts = prognose[i][0].split(\"-\");\n var dt = new Date(parseInt(parts[2], 10),\n parseInt(parts[1], 10) - 1,\n parseInt(parts[0], 10));\n predictions.push({ \"date\": dt, \"level\": prognose[i][1].mapValue.fields.prediction.stringValue});\n\n}\n\nswitch(msg.pollen) {\n case '1':\n pollen_navn='El';\n break;\n case '2':\n pollen_navn='Hassel';\n break;\n case '4':\n pollen_navn='Elm';\n break;\n case '7':\n pollen_navn='Birk';\n break;\n case '28':\n pollen_navn='Græs';\n break;\n case '31':\n pollen_navn='Bynke';\n break;\n case '44':\n pollen_navn='Alternaria';\n break;\n case '45':\n pollen_navn='Cladosporium';\n break;\n}\n\nmsg.payload= { \n \"navn\": pollen_navn,\n \"sæson\": msg.payload.mapValue.fields.inSeason.booleanValue,\n \"update\": msg.pollen.last_update,\n \"måling\": msg.payload.mapValue.fields.level.integerValue,\n \"prognose\": predictions.sort(function(a, b){return a.date - b.date})\n }\nreturn msg;\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1000,"y":960,"wires":[["163c90285d5c0896"]]},{"id":"163c90285d5c0896","type":"switch","z":"acf7df60c2e781a0","name":"Opdel pollen efter navn","property":"payload.navn","propertyType":"msg","rules":[{"t":"eq","v":"Græs","vt":"str"},{"t":"eq","v":"Bynke","vt":"str"},{"t":"eq","v":"Birk","vt":"str"},{"t":"eq","v":"El","vt":"str"},{"t":"eq","v":"Elm","vt":"str"},{"t":"eq","v":"Hassel","vt":"str"}],"checkall":"true","repair":false,"outputs":6,"x":1210,"y":960,"wires":[["7590197bd77c1465"],["15493183aaa81091"],["29337879c5cf6fd5"],["ac84c27d342b86ee"],["76a75bc965b1731c"],["c020c219e2a01dcd"]]},{"id":"7590197bd77c1465","type":"ha-sensor","z":"acf7df60c2e781a0","name":"Græs sensor","entityConfig":"b0a1841c1d98d55d","version":0,"state":"payload.måling","stateType":"msg","attributes":[{"property":"last_update","value":"update","valueType":"msg"},{"property":"predictions","value":"payload.prognose","valueType":"msg"},{"property":"in_season","value":"payload.sæson","valueType":"msg"},{"property":"friendly_name","value":"Pollental - Græs","valueType":"str"}],"inputOverride":"allow","outputProperties":[],"x":1480,"y":830,"wires":[[]]},{"id":"15493183aaa81091","type":"ha-sensor","z":"acf7df60c2e781a0","name":"Bynke sensor","entityConfig":"6a9bfef01b17a599","version":0,"state":"payload.måling","stateType":"msg","attributes":[{"property":"last_update","value":"update","valueType":"msg"},{"property":"predictions","value":"payload.prognose","valueType":"msg"},{"property":"in_season","value":"payload.sæson","valueType":"msg"},{"property":"friendly_name","value":"Pollental - Bynke","valueType":"str"}],"inputOverride":"allow","outputProperties":[],"x":1490,"y":880,"wires":[[]]},{"id":"29337879c5cf6fd5","type":"ha-sensor","z":"acf7df60c2e781a0","name":"Birk sensor","entityConfig":"dfadcaf44ea15249","version":0,"state":"payload.måling","stateType":"msg","attributes":[{"property":"last_update","value":"update","valueType":"msg"},{"property":"predictions","value":"payload.prognose","valueType":"msg"},{"property":"in_season","value":"payload.sæson","valueType":"msg"},{"property":"friendly_name","value":"Pollental - Birk","valueType":"str"}],"inputOverride":"allow","outputProperties":[],"x":1480,"y":930,"wires":[[]]},{"id":"ac84c27d342b86ee","type":"ha-sensor","z":"acf7df60c2e781a0","name":"El sensor","entityConfig":"37a7385bfeb35177","version":0,"state":"payload.måling","stateType":"msg","attributes":[{"property":"last_update","value":"update","valueType":"msg"},{"property":"predictions","value":"payload.prognose","valueType":"msg"},{"property":"in_season","value":"payload.sæson","valueType":"msg"},{"property":"friendly_name","value":"Pollental - El","valueType":"str"}],"inputOverride":"allow","outputProperties":[],"x":1470,"y":980,"wires":[[]]},{"id":"76a75bc965b1731c","type":"ha-sensor","z":"acf7df60c2e781a0","name":"Elm sensor","entityConfig":"8e97b343cf61558b","version":0,"state":"payload.måling","stateType":"msg","attributes":[{"property":"last_update","value":"update","valueType":"msg"},{"property":"predictions","value":"payload.prognose","valueType":"msg"},{"property":"in_season","value":"payload.sæson","valueType":"msg"},{"property":"friendly_name","value":"Pollental - Elm","valueType":"str"}],"inputOverride":"allow","outputProperties":[],"x":1480,"y":1030,"wires":[[]]},{"id":"c020c219e2a01dcd","type":"ha-sensor","z":"acf7df60c2e781a0","name":"Hassel sensor","entityConfig":"abb222f43688b967","version":0,"state":"payload.måling","stateType":"msg","attributes":[{"property":"last_update","value":"update","valueType":"msg"},{"property":"predictions","value":"payload.prognose","valueType":"msg"},{"property":"in_season","value":"payload.sæson","valueType":"msg"},{"property":"friendly_name","value":"Pollental - Hassel","valueType":"str"}],"inputOverride":"allow","outputProperties":[],"x":1490,"y":1080,"wires":[[]]},{"id":"c6592d527c8074ea","type":"comment","z":"acf7df60c2e781a0","name":"Hent pollental for København","info":"## Græspollen-tal for:\n\n**København:**\npayload.pollen_info.region[0].readings[0].reading[4].value[0]\n\n**Viborg:**\npayload.pollen_info.region[1].readings[0].reading[4].value[0]\n\n\n\n## Pollen rest sensor udarbejdet af Martin Larsen og delt her:\nhttps://www.facebook.com/groups/209025039666209/permalink/1153666198535417/\n\nPollendata fra feed fra Astma Allergi Danmark:\nhttps://www.astma-allergi.dk/dagens-pollental/\n\nData er opdelt efter region:\n- Øst for Storebælt: 48\n- Vest for Storebælt: 49\n\nOg derefter pollentype:\n\n- Alternaria: 44\n- Birk: 7\n- Bynke: 31\n- Cladosporium: 45\n- El: 1\n- Elm: 4\n- Græs: 28\n- Hassel: 2\n\nData omfatter seneste pollental samt prognose for 5 dage.\n","x":130,"y":840,"wires":[]},{"id":"b0a1841c1d98d55d","type":"ha-entity-config","server":"49e64ea71c5ef4d9","deviceConfig":"","name":"sensor config for Græs sensor","version":6,"entityType":"sensor","haConfig":[{"property":"name","value":"Pollental_græs"},{"property":"device_class","value":"measurement"},{"property":"icon","value":"mdi:barley"},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""},{"property":"last_reset","value":""}],"resend":true},{"id":"6a9bfef01b17a599","type":"ha-entity-config","server":"49e64ea71c5ef4d9","deviceConfig":"","name":"sensor config for Bynke sensor","version":6,"entityType":"sensor","haConfig":[{"property":"name","value":"Pollental_bynke"},{"property":"device_class","value":"measurement"},{"property":"icon","value":"mdi:barley"},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""},{"property":"last_reset","value":""}],"resend":true},{"id":"dfadcaf44ea15249","type":"ha-entity-config","server":"49e64ea71c5ef4d9","deviceConfig":"","name":"sensor config for Birk sensor","version":6,"entityType":"sensor","haConfig":[{"property":"name","value":"Pollental_birk"},{"property":"device_class","value":"measurement"},{"property":"icon","value":"mdi:barley"},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""},{"property":"last_reset","value":""}],"resend":true},{"id":"37a7385bfeb35177","type":"ha-entity-config","server":"49e64ea71c5ef4d9","deviceConfig":"","name":"sensor config for El sensor","version":6,"entityType":"sensor","haConfig":[{"property":"name","value":"Pollental_el"},{"property":"device_class","value":"measurement"},{"property":"icon","value":"mdi:barley"},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""},{"property":"last_reset","value":""}],"resend":true},{"id":"8e97b343cf61558b","type":"ha-entity-config","server":"49e64ea71c5ef4d9","deviceConfig":"","name":"sensor config for Elm sensor","version":6,"entityType":"sensor","haConfig":[{"property":"name","value":"Pollental_elm"},{"property":"device_class","value":"measurement"},{"property":"icon","value":"mdi:barley"},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""},{"property":"last_reset","value":""}],"resend":true},{"id":"abb222f43688b967","type":"ha-entity-config","server":"49e64ea71c5ef4d9","deviceConfig":"","name":"sensor config for Hassel sensor","version":6,"entityType":"sensor","haConfig":[{"property":"name","value":"Pollental_hassel"},{"property":"device_class","value":"measurement"},{"property":"icon","value":"mdi:barley"},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""},{"property":"last_reset","value":""}],"resend":true}]
Integration
Endeligt kan også bruge en brugerudviklet integration til at hente relevante sensorer med pollental. Der er flere forskellige muligheder, men Pollen DK integrationen fra Jacob Henriksen henter data direkte fra Astma-Allergi Danmarks prognose. Og den indeholder alle relevante pollental og prognosedata.
Data fra integrationen er derfor brugt i de efterfølgende eksempler på automatisering og dashboard.
Installer integrationen via HACS
Du kan installere Polle DK integrationen via HACS.
Start HACS ved at vælge HACS i din sidemenu.
På HACS forsiden skal du trykke på menupunktet ”Integrationer”:
Da integrationen endnu ikke er tilgængelig på HACS, skal du selv tilføje den for at kunne installere.
Klik på de tre prikker i øverste højre hjørne og vælg derefter menupunktet: “Brugerdefinerede repositories”:
Under “Repository” indtastes “https://github.com/J-Lindvig/Pollen_DK” og der vælges “Integration” under “Kategori”. Tryk derefter på “Tilføj” knappen:
Nu bør du kunne se Pollen DK integrationen på oversigten. Klik på integrationen:
Klik på ”Download” knappen i nederste højre hjørne:
Klik på ”Download” knappen for at installere den seneste version:
Du skal genstarte HA for at få startet integrationen.
Det gøres ved at klikke på ”Genstart” knappen under ”Udviklerværktøjer” -> ”YAML”:
Tryk på “Genstart Home Assistant” for at foretage en fuld genstart:
Bekræft, at du ønsker at genstarte HA ved at klikke på ”Genstart” knappen:
Efter genstart kan du tilføje konfigurationen af integrationen i din configuration.yaml fil.
Nedenstående tilføjer alle pollental for København. Du kan udskifte “øst” med “vest” for at få vist tallene for Viborg i stedet for København
#───────────────────────────────────────────────────────────────────────────────
# Pollen prognose og seneste pollental
#───────────────────────────────────────────────────────────────────────────────
pollen_dk:
regions: # Possible values: øst, vest
- øst
pollen_types: # Possible values: alternaria, birk, bynke, cladosporium, el, elm, græs, hassel
- alternaria
- birk
- bynke
- cladosporium
- el
- elm
- græs
- hassel
En ny Genstart er nødvendig for at få indlæst den opdaterede konfiguration.
Tryk på “Genstart Home Assistant” for at foretage en fuld genstart:
Bekræft, at du ønsker at genstarte HA ved at klikke på ”Genstart” knappen:
Når HA er genstartet, skulle du have fået de nye pollensensorer:
Så kan du bruge data fra sensorerne i dine automatiseringer eller vise dem på dit dashboard.
Automatisering med påmindelse om høje pollental
Når du har fået hentet pollendata ind i HA, kan du bruge sensorer i dine automatiseringer.
Det kunne f.eks. være en notifikation med påmindelse om høje pollental. Så kan du huske at tage allergi medicin:
Notifikationen kan laves med følgende automatisering:
alias: "Notifikation: Advarsel om pollen"
description: Daglig advarsel, hvis et eller flere pollental er høje eller moderate
trigger:
- platform: time
at: "07:00:00"
condition:
- condition: template
value_template: >-
{% set ns = namespace(found=false,firstname='') -%}
{% set ns.count = 0 -%}
{% for ps in integration_entities('pollen_dk') -%}
{% if state_attr(ps, "predictions")!=[] -%}
{% for pollen in state_attr(ps,"predictions") -%}
{% set pd = strptime(pollen.date, '%d-%m-%Y') -%}
{% if pd.day == now().day and pd.month == now().month and pd.year == now().year -%} {% if pollen.level>1 -%}
{% set ns.count=ns.count+1 -%}
{% endif -%} {% endif -%} {% endfor -%} {% endif -%} {% endfor -%}
{{ ns.count >0 }}
action:
- service: notify.notify
data:
title: Advarsel om pollen
message: >-
For i dag ventes følgende pollental: {{"\n"}}{{"\n"}}
{% set ns =namespace(found=false,firstname='') -%}
{% for ps in integration_entities('pollen_dk') -%}
{% if state_attr(ps,"predictions")!=[] -%}
{% for pollen in state_attr(ps, "predictions") -%}
{% set pd = strptime(pollen.date, '%d-%m-%Y') -%}
{% if pd.day == now().day and pd.month == now().month and pd.year == now().year -%}
{% if pollen.level==3 -%} {{state_attr(ps,'friendly_name') | regex_replace(find='Pollen ', replace='') }} forventes høj{{"\n"}}
{% elif pollen.level==2 -%} {{state_attr(ps,'friendly_name') | regex_replace(find='Pollen ', replace='') }} forventes moderat{{"\n"}}
{% endif -%} {% endif -%} {% endfor -%} {% endif -%} {% endfor -%}
mode: single
Det kan evt. også laves som en actionable notifikation, hvor du skal bekræfte, at der er taget allergi medicin. Og ellers sendes en ny notifikation senere.
Vis pollenprognose på dashboard
Når først data er hentet ind i HA, er der mange forskellige muligheder for at vise dem på dit dashboard.
Jeg har eksempelvis lavet nedenstående markdown kort, der viser pollental og prognoser for alle sensorer, hvor pollen er indenfor sæson:
Oversigten er lavet med denne YAML kode:
type: markdown
title: Pollental
content: >-
{% set weekdaynames_dk= ['MAN','TIR','ONS','TOR','FRE','LØR','SØN'] -%}
{% set ns = namespace(found=false,firstname='') %}
{% for ps in integration_entities('pollen_dk') -%}
{% if state_attr(ps,'in_season')==true -%}
{% set ns.found = true %}
{% if state_attr(ps, "predictions")!=[] -%}
{% set ns.firstname = ps %}
{% endif -%}
{% endif -%}
{% endfor -%}
{% if ns.found==true -%}
<table>
<thead>
<tr>
<th align='left'>Type</th><th align='right'>Pollen</th>
{% for pollen in state_attr(ns.firstname, "predictions") -%}
<th>{{ weekdaynames_dk[strptime(pollen.date, '%d-%m-%Y').isoweekday()-1] }}</th>
{% endfor -%}
</tr>
</thead>
<tbody>
{% for ps in integration_entities('pollen_dk') -%}
{% if state_attr(ps,'in_season')==true -%}
<tr>
<td>{{ state_attr(ps,'friendly_name') | regex_replace(find='Pollen ', replace='') }}</td>
<td align='right'>{{ states(ps) }}</td>
{% if state_attr(ps, "predictions")!=[] -%}
{% for pollen in state_attr(ps, "predictions") -%}
<td align='center'>
{% if pollen.level==3 -%}<ha-alert alert-type="error"></ha-alert>
{% elif pollen.level==2 -%}<ha-alert alert-type="warning"></ha-alert>
{% elif pollen.level==1 -%}<ha-alert alert-type="success"></ha-alert>
{% else -%}
{% endif -%}</td>
{% endfor -%}
{% else -%}
<td colspan="5" align=center><ha-alert alert-type="info">Ingen prognose tilgængelig</ha-alert></td>
{% endif -%}
</tr>
{% endif -%}
{% endfor -%}
</tbody>
</table>
{% else -%}
<ha-alert alert-type="info">Der er ingen pollen i sæson</ha-alert>
{% endif -%}
<br>Data er opdateret pr. {{
state_attr(integration_entities('pollen_dk')[0],'last_update') }}
{% if ns.found==true -%}
<br><br><h3>Symbolforklaring:</h3>
<ha-alert alert-type="error">Pollentallet er højt</ha-alert>
<ha-alert alert-type="warning">Pollentallet er moderat</ha-alert>
<ha-alert alert-type="success">Pollentallet er lavt</ha-alert>
Kilde: <a href="https://www.astma-allergi.dk/dagens-pollental/">Astma Allergi Danmark
{% endif -%}
Du kan også vælge at få vist de historiske data. Denne graf viser udviklingen i den seneste uge:
Grafen er lavet ved brug af Apex-charts komponenten, der er kombineret med auto-entities komponenten. På den måde vises der kun grafer for pollen, der er i sæson.
Grafen er lavet med følgende kode:
type: custom:auto-entities
card:
type: custom:apexcharts-card
graph_span: 1w
span:
end: day
header:
show: true
title: Pollental i den seneste uge
standard_format: true
show_states: true
colorize_states: true
all_series_config:
stroke_width: 2
show:
in_header: true
legend_value: false
filter:
include:
- entity_id: sensor.pollen_*
state: '> 0'
options:
entity: this.entity_id
sort:
method: state
reverse: false
Hej. Først engang tak for alle de fine guides på din side.
Jeg har et lille problem med pollen integrationen via HACS. Når jeg installerer den virker det lige som det skal. Men sensoren opdaterer ikke medmindre at jeg genstarter min HA. Ved ikke om det er mig der har gjort noget forkert så den ikke opdaterer sensoren, men har prøvet at slette det hele og starte forfra med samme resultat
Hej Anders,
Tak for din kommentar.
Jeg har faktisk samme udfordring med min pollen integrationen.
Jeg tror desværre ikke længere at integrationen bliver vedligeholdt, og jeg har ikke selv haft tid til at kigge nærmere på det.
Mvh.
Anders