{"id":1713,"date":"2019-02-11T13:57:12","date_gmt":"2019-02-11T12:57:12","guid":{"rendered":"https:\/\/willem.aandewiel.nl\/?p=1713"},"modified":"2021-02-19T15:02:48","modified_gmt":"2021-02-19T14:02:48","slug":"home-assistant-integratie-met-de-dsmr-logger","status":"publish","type":"post","link":"https:\/\/willem.aandewiel.nl\/index.php\/2019\/02\/11\/home-assistant-integratie-met-de-dsmr-logger\/","title":{"rendered":"Home-Assistant Integratie met de DSMR-logger"},"content":{"rendered":"\n<p>[ 134,629 keer bekeken \/ views ]<br>Belofte maakt schuld. In mijn post over de DSMR-logger heb ik belooft om ook een post te schrijven over de <a href=\"https:\/\/willem.aandewiel.nl\/index.php\/2018\/08\/28\/slimme-meter-uitlezer\/#belofte\">integratie<\/a> van Home-Assistant met de DSMR-logger.<\/p>\n\n\n\n<p>Die belofte willig ik met deze post in.<\/p>\n\n\n\n<p class=\"has-white-color has-blue-background-color has-text-color has-background\">Let op! <br>Deze post is geschreven met de DSMRloggerWS firmware in gedachte.<br>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 <a href=\"https:\/\/mrwheel-docs.gitbook.io\/dsmrloggerapi\/integratie-met-home-assistant\">documentatie<\/a> van deze firmware.<\/p>\n\n\n\n<p>Home-Assistant is, naar mijn bescheiden mening, \u00e9\u00e9n zo niet d\u00e9 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.<\/p>\n\n\n\n<p>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\u2019n extern systeem wilt halen en deze allemaal beschikbaar worden gesteld via \u00e9\u00e9n restAPI deze restAPI voor ieder veld aangeroepen wordt en er dus h\u00e9\u00e9l veel data \u201c<em>over de lijn gaat<\/em>\u201d en het externe systeem ook vrij zwaar wordt belast.<\/p>\n\n\n\n<p>Daarom heb ik, voor het uitlezen van de DSMR-logger, gekozen om Home-Assistant (HA) de gegevens uit een bestand (<code>platform: file<\/code>) te laten halen. Dat bestand staat op dezelfde computer waar ook HA op draait waardoor de overhead wordt geminimaliseerd.<\/p>\n\n\n\n<p>Het werkt zo:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2019\/02\/DSMR-HASS.jpg\"><img decoding=\"async\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2019\/02\/DSMR-HASS-1024x712.jpg\" alt=\"\" class=\"wp-image-1720\"\/><\/a><\/figure><\/div>\n\n\n\n<p>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 \u00e9\u00e9n maal per minuut) gestart worden. Dat is de taak van &#8216;<code>cron<\/code>&#8216;. Cron is een Unix\/Linux deamon die, op basis van tijd, jobs start. In ons geval moet hij dus het python programma \u201c<code>DSMR_Actual.py<\/code>\u201d starten.<\/p>\n\n\n\n<p>Met het commando \u2018<code>crontab -e<\/code>\u2019 (als user <strong><em>root<\/em><\/strong>!!) kun je de volgende regel in crontab aanbrengen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># For more information see the manual pages of crontab(5) and cron(8)\n#\n@reboot \/home\/homeassistant\/.homeassistant\/scripts\/DSMR_Actual.py\n#\n# m h  dom mon dow   command\n# iedere minuut\n* * * * *    \/home\/homeassistant\/.homeassistant\/scripts\/DSMR_Actual.py\n#\n<\/pre>\n\n\n\n<p>Het programma <code>DSMR_Actual.py<\/code> ziet er zo uit:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  #!\/srv\/homeassistant\/bin\/python\n  #\n  import urllib.request\n  import json\n  url = 'http:\/\/ESP01-DSMR.local\/getActual.json'\n  req = urllib.request.Request(url)\n\n  ##parsing response\n  r = urllib.request.urlopen(req).read()\n  response = json.loads(r.decode('utf-8'))\n  #print(response)\n  \n  with open('\/tmp\/DSMR-Actual.json', 'w') as outfile:\n    json.dump(response, outfile)\n<\/pre>\n\n\n\n<p>In regel 5 krijgt \u2018<code>url<\/code>\u2019 de verwijzing naar de restAPI van de DSMR-logger waarmee de actuele gegevens worden opgevraagd.<br>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 \u2018<code>r<\/code>\u2019 die vervolgens in regel 10 gedecodeerd in de variabele \u2018<code>response<\/code>\u2019 wordt gestopt. Uiteindelijk schrijft <code>json.dump()<\/code> de terug gekregen <code>response<\/code> naar het bestand \u2018<code>\/tmp\/DSMR-Actual.json<\/code>\u2019.<\/p>\n\n\n\n<p>Dat bestand ziet er dan zo uit:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n\t\"Timestamp\": \"190211122653W\", \n\t\"Energy_Delivered\": \"3317.275\", \n\t\"Energy_Returned\": \"824.638\", \n\t\"Gas_Delivered\": \"1755.84\", \n\t\"Energy_Delivered_Tariff1\": \"1512.558\", \n\t\"Energy_Delivered_Tariff2\": \"1804.717\", \n\t\"Energy_Returned_Tariff1\": \"242.226\", \n\t\"Energy_Returned_Tariff2\": \"582.412\", \n\t\"Power_Delivered\": \"0.300\", \n\t\"Power_Returned\": \"0.000\", \n\t\"Voltage_l1\": \"234.0\", \n\t\"Current_l1\": \"1\", \n\t\"Voltage_l2\": \"235.0\", \n\t\"Current_l2\": \"2\", \n\t\"Voltage_l3\": \"236.0\", \n\t\"Current_l3\": \"1\", \n\t\"Power_Delivered_l1\": \"242\", \n\t\"Power_Returned_l1\": \"0\", \n\t\"Power_Delivered_l2\": \"506\", \n\t\"Power_Returned_l2\": \"0\", \n\t\"Power_Delivered_l3\": \"0\", \n\t\"Power_Returned_l3\": \"448\"\n}\n<\/pre>\n\n\n\n<p>Om het geheel een beetje overzichtelijk te houden heb ik alle scripts die ik voor HA gebruik in de map <code>~\/.homeassistant\/scripts\/<\/code> gestopt.<\/p>\n\n\n\n<p>Vervolgens moeten we aan HA duidelijk maken dat ze de gegevens van de DSMR-logger uit het bestand <code>\/tmp\/DSMR-Actueel.json<\/code> moet halen.<\/p>\n\n\n\n<p>Ik heb al mijn sensor-configuraties in de map <code>~\/homeassistant\/sensors<\/code> gestopt. In het <code>configuration.yaml<\/code> bestand heb ik de volgende verwijzing staan:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\tsensor: !include_dir_merge_list sensors\/\n<\/pre>\n\n\n\n<p>Deze regel zorgt ervoor dat alle <code>.yaml<\/code> files die in de map <code>sensors\/<\/code> staan als configuratie bestand van de HA installatie worden geparsed en opgenomen.<\/p>\n\n\n\n<p>E\u00e9n van de sensor configuratie files is <code>DSMT_Actueel.yaml<\/code>. Deze heeft de volgende inhoud:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">## sensor: ###\n### ESP-DSMR ###\n\n# DSMR_Actual.py wordt iedere minuut door cron gestart\n#- platform: command_line\n#  name: DSMRdata\n#  command: \"~\/.homeassistant\/scripts\/DSMR_Actual.py\"\n\n- platform: file\n  name: \"LastUpdate\"\n  file_path: \/tmp\/DSMR-Actual.json\n  friendly_name: \"Last update\"\n  unit_of_measurement: \"\"\n  value_template: \"{{ value_json.Timestamp }}\"\n\n- platform: file\n  name: \"Energy Delivered\"\n  file_path: \/tmp\/DSMR-Actual.json\n  unit_of_measurement: \"kWh\"\n  value_template: '{{ value_json.Energy_Delivered  }}'\n\n- platform: file\n  name: \"Energy Returned\"\n  file_path: \/tmp\/DSMR-Actual.json\n  unit_of_measurement: \"kWh\"\n  value_template: '{{ value_json.Energy_Returned | round(3) }}'\n\n- platform: file\n  name: \"Power Delivered\"\n  file_path: \/tmp\/DSMR-Actual.json\n  unit_of_measurement: \"Watt\"\n  value_template: '{{ value_json.Power_Delivered | round(1) }}'\n\n- platform: file\n  name: \"Power Returned\"\n  file_path: \/tmp\/DSMR-Actual.json\n  unit_of_measurement: \"Watt\"\n  value_template: '{{ value_json.Power_Returned | round(1) }}'\n\n- platform: file\n  name: \"Power Delivered l1\"\n  file_path: \/tmp\/DSMR-Actual.json\n  unit_of_measurement: \"Watt\"\n  value_template: '{{ value_json.Power_Delivered_l1 | round(1) }}'\n\n- platform: file\n  name: \"Power Delivered l2\"\n  file_path: \/tmp\/DSMR-Actual.json\n  unit_of_measurement: \"Watt\"\n  value_template: '{{ value_json.Power_Delivered_l2 | round(1) }}'\n\n- platform: file\n  name: \"Power Delivered l3\"\n  file_path: \/tmp\/DSMR-Actual.json\n  unit_of_measurement: \"Watt\"\n  value_template: '{{ value_json.Power_Delivered_l3 | round(1) }}'\n\n- platform: file\n  name: \"Power Returned l1\"\n  file_path: \/tmp\/DSMR-Actual.json\n  unit_of_measurement: \"Watt\"\n  value_template: '{{ value_json.Power_Returned_l1 | round(1) }}'\n\n- platform: file\n  name: \"Power Returned l2\"\n  file_path: \/tmp\/DSMR-Actual.json\n  unit_of_measurement: \"Watt\"\n  value_template: '{{ value_json.Power_Returned_l2 | round(1) }}'\n\n- platform: file\n  name: \"Power Returned l3\"\n  file_path: \/tmp\/DSMR-Actual.json\n  unit_of_measurement: \"Watt\"\n  value_template: '{{ value_json.Power_Returned_l3 | round(1) }}'\n\n- platform: file\n  name: \"Gas Delivered\"\n  file_path: \/tmp\/DSMR-Actual.json\n  unit_of_measurement: \"m3\"\n  value_template: '{{ value_json.Gas_Delivered | round(2) }}'\n<\/pre>\n\n\n\n<p>Om deze gegevens ook daadwerkelijk op de front-end van HA te krijgen moet ook <code>groups.yaml<\/code> worden aangepast.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">### group: ###\n###VIEWS###\n  default_view:\n    view: yes\n    entities:\n      .\n      .\n      - sun.sun\n      - group.DateTimes\n\n  Energie:\n    name: Energie\n    view: yes\n    entities:\n      - group.Energie_Verbruik\n      - group.Energie_Teruglevering\n      - group.DSMR_Last_Update\n \n###CARDS###\n  DSMR_Last_Update:\n    name: DSMR Last Update\n    entities:\n      - sensor.LastUpdate\n\n  Energie_Verbruik:\n    name: Energie Verbruik (actueel)\n    entities:\n      - sensor.Energy_Delivered\n      - sensor.Power_Delivered\n      - sensor.Power_Delivered_l1\n      - sensor.Power_Delivered_l2\n      - sensor.Power_Delivered_l3\n      - sensor.Gas_Delivered\n\n  Energie_Teruglevering:\n    name: Energie Teruglevering (actueel)\n    entities:\n      - sensor.Energy_Returned\n      - sensor.Power_Returned\n      - sensor.Power_Returned_l3\n<\/pre>\n\n\n\n<p>De Home-Assistant front-end geeft dan dit inzicht:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2019\/02\/HA_EnergieActual.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2019\/02\/HA_EnergieActual.png\" alt=\"\" class=\"wp-image-1719\" width=\"506\" height=\"251\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2019\/02\/HA_EnergieActual.png 1011w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2019\/02\/HA_EnergieActual-300x149.png 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2019\/02\/HA_EnergieActual-768x381.png 768w\" sizes=\"auto, (max-width: 506px) 100vw, 506px\" \/><\/a><\/figure><\/div>\n","protected":false},"excerpt":{"rendered":"<p>[ ]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 &hellip; <a href=\"https:\/\/willem.aandewiel.nl\/index.php\/2019\/02\/11\/home-assistant-integratie-met-de-dsmr-logger\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[143,15],"tags":[45],"class_list":["post-1713","post","type-post","status-publish","format-standard","hentry","category-firmware","category-scripts","tag-energie"],"views":134629,"_links":{"self":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts\/1713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/comments?post=1713"}],"version-history":[{"count":18,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts\/1713\/revisions"}],"predecessor-version":[{"id":6191,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts\/1713\/revisions\/6191"}],"wp:attachment":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/media?parent=1713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/categories?post=1713"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/tags?post=1713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}