Hentedato for avfall i Home Assistant

Når Sirkula henter avfallet neste gang

Laster inn bilde
Bilde med teksten lik overkriften til dette innlegget

Her skal vi se nærmere på hvordan vi kan få opplistet neste hentedato i Home Assistant for ulike avfallstyper på din adresse.

I dette innlegget skal vi se nærmere på når søppel blir hentet og hvordan man i Home Assistant kan liste opp når f.eks. neste dato for papiravfall. Dette innlegget er basert på løsning som er diskutert på Home Assistant sitt diskusjonsforum https://community.home-assistant.io/t/min-renovasjon/115406 Koden er ikke min, kun tilpasset mitt bruk.

Det kan være ulike fremgangsmåter for å hente ut data avhengig av din kommune. Ta derfor en titt på nevnte diskusjonsforum hvor det nevnes ulike nettadresser man kan kjøre spørring mot.

Om du synes det er litt i overkant mye å gå løs på koden selv så finnes det noen som har laget en tilsvarende løsning som kan installeres i Home Assistant https://github.com/eyesoft/home-assistant-custom-components

Jeg bor i en av kommunene som sogner til Sirkula IKS. På deres nettsted kan man skrive inn en adresse for å få vite når neste hentedato for ulike avfallstyper.

Ved å inspisere kallet mellom nettleser og Sirkulas nettsider så kjøres det tre ulike kall. Det første gir meg adresseid, gatenavn og husnummer. Det andre kallet baserer seg på opplysningene fra første kallet og gir meg så en JSON tilbake med tømmedatoer et år frem i tid for ulike avfallstype. Det tredje kallet gir en PDF. Det trenger vi ikke.

Men ved å kopiere adressen til kall nr 2, så får vi altså et array med objekter for hver avfallstype. Det er denne som er interessant for meg. For denne vil jeg bruke i Home Assistant for å hente inn datoer for neste gang avfall blir hentet.

Kallet ser slik ut:

https://komtek.sirkula.no/aac8b502-cd0c-485c-8ee0-d29a1c41839d/api/komtek/tommekalender?adresseid=XXXX&gatenavn=YYYY&husnr=ZZ

Jeg har erstattet adresseid, gatenavn og husnummer. Så her må du sette inn din eget.

Her er et forkortet eksempel på data som kommer i retur. Hver avfallstype har sin fraksjonsid. I eksempelet har jeg en avfallstype.

[{
    "FraksjonId":1,
    "Fraksjon":{
        "Id":1,
        "Navn":"Restavfall",
        "Ikon":"https://komteksky.norkart.no/komtek.renovasjonwebapi/Ikoner/restavfall.png"},
        "Tommedatoer":[
            "2021-03-04T00:00:00",
            "2021-04-06T00:00:00",
            "2021-05-04T00:00:00",
            "2021-06-07T00:00:00",
            "2021-07-05T00:00:00",
            "2021-08-02T00:00:00",
            "2021-08-30T00:00:00",
            "2021-09-27T00:00:00",
            "2021-10-25T00:00:00",
            "2021-11-22T00:00:00",
            "2021-12-20T00:00:00"
        ]
    },
    ....
}]

Nå har vi altså funnet korrekt adresse å kjøre et kall mot og får tilbake data. Nå må vi inn i Home Assistant og legge til en ny sensor. I mitt tilfelle har jeg Home Assistant Core og redigerer derfor oppsettet via terminalen. Uansett så er det filen configuration.yaml som er stedet vi skal fortsette.

Her legger vi til en ny sensor. Du kan i hovedsak kopiere koden under (om du bruker Sirkula IKS). Som du ser i JSON-eksempelet over så har hver avfallstype sin egen ID. Der er det en sensor pr. avfallstype.

sensor:
  - platform: rest
    name: Sirkula Raw Rest
    value_template: >
      {% for entry in value_json %}
        {% if entry.FraksjonId == 1 %}
          {{ entry.Tommedatoer[0] }}
        {% endif %}
      {% endfor %}
    method: GET
    scan_interval: 43200
    resource: https://komtek.sirkula.no/aac8b502-cd0c-485c-8ee0-d29a1c41839d/api/komtek/tommekalender?adresseid=XXXX&gatenavn=YYYY&husnr=ZZ
    force_update: true
  - platform: rest
    name: Sirkula Raw Mat
    value_template: >
      {% for entry in value_json %}
        {% if entry.FraksjonId == 3 %}
          {{ entry.Tommedatoer[0] }}
        {% endif %}
      {% endfor %}
    method: GET
    scan_interval: 43210
    resource: https://komtek.sirkula.no/aac8b502-cd0c-485c-8ee0-d29a1c41839d/api/komtek/tommekalender?adresseid=XXXX&gatenavn=YYYY&husnr=ZZ
    force_update: true
  - platform: rest
    name: Sirkula Raw Glass Metall
    value_template: >
      {% for entry in value_json %}
        {% if entry.FraksjonId == 4 %}
          {{ entry.Tommedatoer[0] }}
        {% endif %}
      {% endfor %}
    method: GET
    scan_interval: 43220
    resource: https://komtek.sirkula.no/aac8b502-cd0c-485c-8ee0-d29a1c41839d/api/komtek/tommekalender?adresseid=XXXX&gatenavn=YYYY&husnr=ZZ
    force_update: true
  - platform: rest
    name: Sirkula Raw Plast
    value_template: >
      {% for entry in value_json %}
        {% if entry.FraksjonId == 7 %}
          {{ entry.Tommedatoer[0] }}
        {% endif %}
      {% endfor %}
    method: GET
    scan_interval: 43230
    resource: https://komtek.sirkula.no/aac8b502-cd0c-485c-8ee0-d29a1c41839d/api/komtek/tommekalender?adresseid=XXXX&gatenavn=YYYY&husnr=ZZ
    force_update: true
  - platform: rest
    name: Sirkula Raw Papir
    value_template: >
      {% for entry in value_json %}
        {% if entry.FraksjonId == 2 %}
          {{ entry.Tommedatoer[0] }}
        {% endif %}
      {% endfor %}
    method: GET
    scan_interval: 43240
    resource: https://komtek.sirkula.no/aac8b502-cd0c-485c-8ee0-d29a1c41839d/api/komtek/tommekalender?adresseid=XXXX&gatenavn=YYYY&husnr=ZZ
    force_update: true
  - platform: template
    sensors:
      avfall_rest_template:
        friendly_name: Avfall Restavfall
        value_template: "{{ as_timestamp(states('sensor.sirkula_raw_rest')) | timestamp_custom('%d.%m.%Y') }}"
      avfall_mat_template:
        friendly_name: Avfall Mat
        value_template: "{{ as_timestamp(states('sensor.sirkula_raw_mat')) | timestamp_custom('%d.%m.%Y') }}"
      avfall_glassmetall_template:
        friendly_name: Avfall Glass og metall
        value_template: "{{ as_timestamp(states('sensor.sirkula_raw_glass_metall')) | timestamp_custom('%d.%m.%Y') }}"
      avfall_plast_template:
        friendly_name: Avfall Plast
        value_template: "{{ as_timestamp(states('sensor.sirkula_raw_plast')) | timestamp_custom('%d.%m.%Y') }}"
      avfall_papir_template:
        friendly_name: Avfall Papir
        value_template: "{{ as_timestamp(states('sensor.sirkula_raw_papir')) | timestamp_custom('%d.%m.%Y') }}"

Kort forklart: Ca hver 12. time så kjøres det et nytt kall og det hentes ut neste hentedato pr. avfallstype. Dette blir lagt til i Home Assistant som en sensor-verdi. Som du ser så har jeg et lite forskjell på intervallene slik at de ikke skal kjøres samtidig.

Etter at koden er lagt til i configuration.yaml, så kjør en sjekk av fila og start HA på nytt. Etter omstart så kan du legge til et nytt kort.

Laster inn bilde
Avfallskort i Home Assistant

Jeg har brukt følgende kode for mitt kort:

type: entities
entities:
  - entity: sensor.avfall_rest_template
    name: Restavfall
    icon: 'mdi:trash-can-outline'
  - entity: sensor.avfall_mat_template
    name: Matavfall
    icon: 'mdi:food-off'
  - entity: sensor.avfall_glassmetall_template
    name: Glass og metall
    icon: 'mdi:glass-pint-outline'
  - entity: sensor.avfall_papir_template
    name: Papiravfall
    icon: 'mdi:newspaper-variant-outline'
  - entity: sensor.avfall_plast_template
    name: Plast
    icon: 'mdi:trash-can-outline'
title: Avfall tømmedatoer
state_color: false
show_header_toggle: false

Fordeler og ulemper

Disse dataene er ikke ment å hentes ut på denne måten. Så når som helst kan Sirkula endre enten datamodellen eller punktet (URL-en) for uthenting. Hvis Home Assistant slutter å vise dato så er det stor sjanse for at dette har hendt.

Siden dataene ikke ment å hentes ut slik så kan man jo spekulere i om man har lov til å gjøre det på denne måten. Mitt argument er at dette er data som er offentlige, jeg betaler dyrt for å holde liv i Sirkula og deres tjenester via skatter og avgifter til min kommune. Jeg tjener ikke penger på å hente ut dataene og de brukes kun til privat bruk i mitt hjem.

Helge Johnsen

Dette er mitt private nettsted. Jeg jobber til daglig som seniorutvikler i et av Norges større konsulentbyråder. I denne bloggen skriver jeg om store og små ting som rører seg i min private verden. Bloggen består stort sett av tips, egne prosjekter og tanker. Les mer om meg her.

Har du noen tanker eller kommentarer om dette blogginnlegget så finner du meg på en rekke sosiale medier.