Home-Assistant Integratie met de DSMR-logger

[ 126,631 keer bekeken / views ]
Belofte maakt schuld. In mijn post over de DSMR-logger heb ik belooft om ook een post te schrijven over de integratie van Home-Assistant met de DSMR-logger.

Die belofte willig ik met deze post in.

Let op!
Deze post is geschreven met de DSMRloggerWS firmware in gedachte.
Ondertussen is de DSMRloggerAPI firmware de standaard en daar moet je op een andere manier gegevens uit lezen. Hoe dit moet staat beschreven in de documentatie van deze firmware.

Home-Assistant is, naar mijn bescheiden mening, één zo niet dé meest universele en robuuste Domotica oplossing die momenteel bestaat. De manieren waarop Home-Assistant gegevens uit andere systemen kan halen is bijna onuitputtelijk. Het is alleen zaak de voor jou beste manier te vinden.

Home-Assistant kan gegevens via een restAPI uit andere systemen (en dus uit de DSMR-logger) halen maar dat heeft als nadeel dat als je meerdere gegevens uit zo’n extern systeem wilt halen en deze allemaal beschikbaar worden gesteld via één restAPI deze restAPI voor ieder veld aangeroepen wordt en er dus héél veel data “over de lijn gaat” en het externe systeem ook vrij zwaar wordt belast.

Daarom heb ik, voor het uitlezen van de DSMR-logger, gekozen om Home-Assistant (HA) de gegevens uit een bestand (platform: file) te laten halen. Dat bestand staat op dezelfde computer waar ook HA op draait waardoor de overhead wordt geminimaliseerd.

Het werkt zo:

Middels een python programma doen we een request naar de DSMR-logger om de actuele gegevens van de Slimme Meter te geven. Dit programma moet periodiek (zeg één maal per minuut) gestart worden. Dat is de taak van ‘cron‘. Cron is een Unix/Linux deamon die, op basis van tijd, jobs start. In ons geval moet hij dus het python programma “DSMR_Actual.py” starten.

Met het commando ‘crontab -e’ (als user root!!) kun je de volgende regel in crontab aanbrengen:

# For more information see the manual pages of crontab(5) and cron(8)
#
@reboot /home/homeassistant/.homeassistant/scripts/DSMR_Actual.py
#
# m h  dom mon dow   command
# iedere minuut
* * * * *    /home/homeassistant/.homeassistant/scripts/DSMR_Actual.py
#

Het programma DSMR_Actual.py ziet er zo uit:

  #!/srv/homeassistant/bin/python
  #
  import urllib.request
  import json
  url = 'http://ESP01-DSMR.local/getActual.json'
  req = urllib.request.Request(url)

  ##parsing response
  r = urllib.request.urlopen(req).read()
  response = json.loads(r.decode('utf-8'))
  #print(response)
  
  with open('/tmp/DSMR-Actual.json', 'w') as outfile:
    json.dump(response, outfile)

In regel 5 krijgt ‘url’ de verwijzing naar de restAPI van de DSMR-logger waarmee de actuele gegevens worden opgevraagd.
Regel 6 zet dit om in een request aan de DSMR-logger en regel 9 stopt het antwoord van de DSMR-logger in de variabele ‘r’ die vervolgens in regel 10 gedecodeerd in de variabele ‘response’ wordt gestopt. Uiteindelijk schrijft json.dump() de terug gekregen response naar het bestand ‘/tmp/DSMR-Actual.json’.

Dat bestand ziet er dan zo uit:

{
	"Timestamp": "190211122653W", 
	"Energy_Delivered": "3317.275", 
	"Energy_Returned": "824.638", 
	"Gas_Delivered": "1755.84", 
	"Energy_Delivered_Tariff1": "1512.558", 
	"Energy_Delivered_Tariff2": "1804.717", 
	"Energy_Returned_Tariff1": "242.226", 
	"Energy_Returned_Tariff2": "582.412", 
	"Power_Delivered": "0.300", 
	"Power_Returned": "0.000", 
	"Voltage_l1": "234.0", 
	"Current_l1": "1", 
	"Voltage_l2": "235.0", 
	"Current_l2": "2", 
	"Voltage_l3": "236.0", 
	"Current_l3": "1", 
	"Power_Delivered_l1": "242", 
	"Power_Returned_l1": "0", 
	"Power_Delivered_l2": "506", 
	"Power_Returned_l2": "0", 
	"Power_Delivered_l3": "0", 
	"Power_Returned_l3": "448"
}

Om het geheel een beetje overzichtelijk te houden heb ik alle scripts die ik voor HA gebruik in de map ~/.homeassistant/scripts/ gestopt.

Vervolgens moeten we aan HA duidelijk maken dat ze de gegevens van de DSMR-logger uit het bestand /tmp/DSMR-Actueel.json moet halen.

Ik heb al mijn sensor-configuraties in de map ~/homeassistant/sensors gestopt. In het configuration.yaml bestand heb ik de volgende verwijzing staan:

	sensor: !include_dir_merge_list sensors/

Deze regel zorgt ervoor dat alle .yaml files die in de map sensors/ staan als configuratie bestand van de HA installatie worden geparsed en opgenomen.

Eén van de sensor configuratie files is DSMT_Actueel.yaml. Deze heeft de volgende inhoud:

## sensor: ###
### ESP-DSMR ###

# DSMR_Actual.py wordt iedere minuut door cron gestart
#- platform: command_line
#  name: DSMRdata
#  command: "~/.homeassistant/scripts/DSMR_Actual.py"

- platform: file
  name: "LastUpdate"
  file_path: /tmp/DSMR-Actual.json
  friendly_name: "Last update"
  unit_of_measurement: ""
  value_template: "{{ value_json.Timestamp }}"

- platform: file
  name: "Energy Delivered"
  file_path: /tmp/DSMR-Actual.json
  unit_of_measurement: "kWh"
  value_template: '{{ value_json.Energy_Delivered  }}'

- platform: file
  name: "Energy Returned"
  file_path: /tmp/DSMR-Actual.json
  unit_of_measurement: "kWh"
  value_template: '{{ value_json.Energy_Returned | round(3) }}'

- platform: file
  name: "Power Delivered"
  file_path: /tmp/DSMR-Actual.json
  unit_of_measurement: "Watt"
  value_template: '{{ value_json.Power_Delivered | round(1) }}'

- platform: file
  name: "Power Returned"
  file_path: /tmp/DSMR-Actual.json
  unit_of_measurement: "Watt"
  value_template: '{{ value_json.Power_Returned | round(1) }}'

- platform: file
  name: "Power Delivered l1"
  file_path: /tmp/DSMR-Actual.json
  unit_of_measurement: "Watt"
  value_template: '{{ value_json.Power_Delivered_l1 | round(1) }}'

- platform: file
  name: "Power Delivered l2"
  file_path: /tmp/DSMR-Actual.json
  unit_of_measurement: "Watt"
  value_template: '{{ value_json.Power_Delivered_l2 | round(1) }}'

- platform: file
  name: "Power Delivered l3"
  file_path: /tmp/DSMR-Actual.json
  unit_of_measurement: "Watt"
  value_template: '{{ value_json.Power_Delivered_l3 | round(1) }}'

- platform: file
  name: "Power Returned l1"
  file_path: /tmp/DSMR-Actual.json
  unit_of_measurement: "Watt"
  value_template: '{{ value_json.Power_Returned_l1 | round(1) }}'

- platform: file
  name: "Power Returned l2"
  file_path: /tmp/DSMR-Actual.json
  unit_of_measurement: "Watt"
  value_template: '{{ value_json.Power_Returned_l2 | round(1) }}'

- platform: file
  name: "Power Returned l3"
  file_path: /tmp/DSMR-Actual.json
  unit_of_measurement: "Watt"
  value_template: '{{ value_json.Power_Returned_l3 | round(1) }}'

- platform: file
  name: "Gas Delivered"
  file_path: /tmp/DSMR-Actual.json
  unit_of_measurement: "m3"
  value_template: '{{ value_json.Gas_Delivered | round(2) }}'

Om deze gegevens ook daadwerkelijk op de front-end van HA te krijgen moet ook groups.yaml worden aangepast.

### group: ###
###VIEWS###
  default_view:
    view: yes
    entities:
      .
      .
      - sun.sun
      - group.DateTimes

  Energie:
    name: Energie
    view: yes
    entities:
      - group.Energie_Verbruik
      - group.Energie_Teruglevering
      - group.DSMR_Last_Update
 
###CARDS###
  DSMR_Last_Update:
    name: DSMR Last Update
    entities:
      - sensor.LastUpdate

  Energie_Verbruik:
    name: Energie Verbruik (actueel)
    entities:
      - sensor.Energy_Delivered
      - sensor.Power_Delivered
      - sensor.Power_Delivered_l1
      - sensor.Power_Delivered_l2
      - sensor.Power_Delivered_l3
      - sensor.Gas_Delivered

  Energie_Teruglevering:
    name: Energie Teruglevering (actueel)
    entities:
      - sensor.Energy_Returned
      - sensor.Power_Returned
      - sensor.Power_Returned_l3

De Home-Assistant front-end geeft dan dit inzicht:

This entry was posted in Firmware, Scripts and tagged . Bookmark the permalink.

22 Responses to Home-Assistant Integratie met de DSMR-logger

  1. Paul says:

    Voor future reference, op de repository op Github staat nu ook een configuration file voor Home Assistant welke werkt met Energy Dashboard:

    • Remco Franke says:

      Hi Paul,
      Met de komst van de ESP-dsmr-loggen van Willem, werkt dit script niet meer.
      ik heb geen verstand van Json. Willem geeft aan dat ie een iets andere versie van JSON gebruikt. wat zou ik moeten veranderen om de data van de nieuwe weer netjes in HomeAssistant binnen te krijgen.

      Ook Willem weet het niet. 🙁
      https://mrwheel-docs.gitbook.io/dsmrlogger32/integratie-met-home-assistant

      stukje tekst uit deze link :

      Crisis? What Crisis? (een betere DSMR-logger)

      Een aantal gebruikers heeft aangegeven moeite te hebben met de manier waarop in de DSMRloggerAPI firmware de JSON strings zijn opgebouwd (zgn. “Name/Value” pairs). Dit heb ik indertijd zo ontworpen omdat ik onvoldoende kennis had van JSON en dan vooral hoe ik JSON strings in de GUI (Javascript) kon verwerken.
      In api versie 1 ziet de uitvoer van ”/api/v1/dev/time” er zo uit:

      {"devtime":[
      {"name": "timestamp", "value": "221207120652W"},
      {"name": "time", "value": "2022-12-07 12:06:17"},
      {"name": "epoch", "value": 1670411166},
      {"name": "uptime", "value": "128(d)-18:32(H:m)"},
      {"name": "uptime_secs", "value": 11059921, "unit": "sec"}
      ]}

      De firmware voor de nieuwe DSMR-logger32 stapt af van de “/api/v1” versie. JSON wordt zoals het (blijkbaar) hoort.

      Met de ”/api/v2/dev/time” versie van de api ziet bovenstaande JSON string er zo uit:

      {
      "devtime": {
      "timestamp": "221207120652W",
      "time": "07-12-2022 12:06:17",
      "time_rev": "2022-12-07 12:06:17",
      "epoch": 1670411166,
      "uptime": "0(d)-00:39(H:m)",
      "uptime_secs": 2386
      }
      }

      De DSMRloggerAPI firmware heeft de …

  2. Otto says:

    Is er al iemand die het voor elkaar gekregen heeft de dsmr-logger te gebruiken in het nieuwe Home-asistant energie-dashboard?

    • Willem Aandewiel says:

      Hi Otto,

      Volgens mij is Robert met zoiets bezig.

      Kijk hier eens.

      • otto says:

        Inmiddels gevonden hoe het moet:
        -bij gas: geen ‘m3’ maar ‘m³’
        -bij gas: device_class: gas
        -bij allemaal: state_class: total_increasing
        Daarna zijn alle sensors toe te voegen aan het energiedashboard van Home Assistant!

        Uit mijn configuration.yaml:

          - platform: rest
            name: "Gas gebruik"
            resource: http://......./api/v1/sm/fields/mbus1_delivered
            unit_of_measurement: 'm³'
            value_template: "{{ (value_json.fields[1].value | float) | round(1) }}"
            device_class: gas
            state_class: total_increasing
        
          - platform: rest
            name: "Verbruik 1"
            resource: http://......./api/v1/sm/fields/energy_delivered_tariff1
            unit_of_measurement: "kWh"
            value_template: '{{ (value_json.fields[1].value | float) | round(1) }}'
            device_class: energy
            state_class: total_increasing
        
          - platform: rest
            name: "Verbruik 2"
            resource: http://......./api/v1/sm/fields/energy_delivered_tariff2
            unit_of_measurement: "kWh"
            value_template: '{{ (value_json.fields[1].value | float) | round(1) }}'
            device_class: energy
            state_class: total_increasing
            
          - platform: rest
            name: "Geleverd 1"
            resource: http://......./api/v1/sm/fields/energy_returned_tariff1
            unit_of_measurement: "kWh"
            value_template: '{{ (value_json.fields[1].value | float) | round(1) }}'
            device_class: energy
            state_class: total_increasing
        
          - platform: rest
            name: "Geleverd 2"
            resource: http://......./api/v1/sm/fields/energy_returned_tariff2
            unit_of_measurement: "kWh"
            value_template: '{{ (value_json.fields[1].value | float) | round(1) }}'
            device_class: energy
            state_class: total_increasing
        
  3. Co says:

    Wat een gaaf project Willem, complimenten.

    Ik raak geïnspireerd, wij hebben onlangs een esmr5 meter ontvangen wellicht werkt jouw oplossing ook daarvoor?

    Heb jij toevallig nog een of 2 printjes liggen? Evt kit? Solderen lukt me wel 🙂

    Gr Co

  4. John says:

    Dag Willem,

    Ik ben pas begonnen met mijn integraties in Home assistant en was op zoek naar een DSMR logger. Is er nog een mogelijkheid om de door u ontworpen printplaat te kopen.
    Zo niet kan me wegwijs maken in hoe ik dit zelf moet ontwerpen?

    Groeten

    John Dasseville

  5. arnold says:

    Dankje ik heb al een langetijd een van de eerste versies en had vroeger een homewizard.
    omdat ik daar niets mee kon gaan kijken naar HA waar je wel even de tijd voormoet nemen om .e.e.a te begrijpen.
    Echter op mijn odroid C2 draaid nu de hass versie met een rfxtx en ikea hub erg stabiel.
    updates gewoon vanuit de interface.
    Ben een avond bezig geweest om DSMR in de HA te krijgen want cron en python willen niet vanuit de OS shell. gebruik terminal plugin.
    echter ik heb het van elkaar. de gegeven informatie was voldoende om het om te zetten.
    zit op HA 115.6 en de dsmr 0.76(Oct 27 2018)

  6. Frank says:

    Geprobeerd op Raspberry Pi 3B, Odroid C2, en Intel/Debian. De eerste twee met platform specifieke images, de laatste met behulp van Controlled install.
    Integraties met RFX (KaKu) en Zigbee (Conbee II).
    Vooral Conbee is instabiel, twee, drie keer per dag verdwijnen alle apparaten, en soms komen ze spontaan terug, vaak pas na een harde reset/reboot. Onwerkbaar.

  7. frank says:

    Jammer, dat HomeAssistant zo instabiel is. Heb het al eenkeer of vier, vijf geprobeerd, versies 0.8x tot de laatste 0.114 aan toe, en ik krijg het niet stabiel.
    Ook de hoeveelheid problemen, te wijten aan updates bij nieuwe versies geven me weinig vertrouwen. Mijn advies is: HA, leuk, maar als je een werkende omgeving hebt, afblijven!

    En dat is jammer, want het is wel een van de meest moderne, en flexibele domotica oplossingen die ik ken.

  8. otto says:

    Dank voor je slimme meter uitlezer.
    Hij werkt ook prima met een Sagemcom T210-D ESMR5 3-fase slimme meter, zonder extra power adapter.

  9. Tom says:

    Heb je ook al geprobeerd de utility_meter component te gebruiken?
    Ik heb zelf al een NodeMCU ESP boardje aan m’n P1 poort van m’n Kaifa Ma105 hangen en deze schrijft de waarden weg in Home Assistant via MQTT.
    Echter krijg ik het (nog) niet voor elkaar de utility_meter component goed te configureren.

    • Willem Aandewiel says:

      Hi Tom,

      Dit project gebruikt de “dsmr” bibliotheek van Matthijs Kooijman.
      Als het uitlezen van de utility_meter component met deze bibliotheek uitgelezen kan worden dan kan het ook met de DSMR-logger.

  10. Klaas Marijs says:

    Weer mooi helder uitgelegd Willem, complimenten voor dit leuke projectje!

    Reageren op de vorige post gaat niet meer zag ik, wilde nog aangeven dat bij mij blijkbaar zowel de slimme meter (Kaifa MA304C) als de Vera Edge (waar ik ook de P1 mee uitlees) te weinig stroom leveren voor de ESP8266. Nu een externe USB voeding aangesloten op het printje en het werkt goed! Wil de waarden nu nog gaan loggen in een eigen database (via MQTT?) en hiermee grafieken op een webpagina maken. Actuele waarden toon ik nu mbv ImperiHome uit de Vera Edge.
    Zit er ook al een tijdje over te denken om van Vera over te stappen op HomeAssistant voor wat uitgebreidere mogelijkheden, dus dan komt dit artikel weer mooi van pas!
    Wat overigens apart is; eerder zag ik ook de spanning per fase in Vera. Nu niet meer en ook niet in de DSMR-logger, dus de slimme meter lijkt dit ineens niet meer uit te sturen? Enig idee hoe dat kan?

    Klaas Image 1
    Klaas Image 2
    Klaas Image 3

    • Willem Aandewiel says:

      Hoi Klaas,

      Mooi opgelost! Fijn dat de uitlezer (eindelijk) werkt.
      Op opencircuit.nl verschijnt één dezer dagen een post waarin ik ook een summiere uitleg geef over MQTT.
      Gegevens opslaan in MySQL (of de nieuwere versie daarvan “MariaDB”) is een mooie uitbreiding.
      Waarom de Slimme Meter opeens geen informatie over de spanning van de fasen geeft is voor mij ook een raadsel.

      • frank says:

        MySQL is (nog steeds) van Oracle, MariaDB is open community. De community was de niet nagekomen beloftes helemaal zat, vandaar MariaDB als fork (want dat is het) van MySQL.

  11. Sander says:

    Bedankt Willem, Ik ga er mee aan de slag !

Leave a Reply

Your email address will not be published. Required fields are marked *

The maximum upload file size: 4 MB. You can upload: image, other. Links to YouTube, Facebook, Twitter and other services inserted in the comment text will be automatically embedded. Drop file here

This site uses Akismet to reduce spam. Learn how your comment data is processed.