Support for reading Dutch Smart Meter (electricity/gas) (P1 port)

This is a wireless solution http://www.esp8266thingies.nl/wp/ It uses the espeasy pluging https://github.com/letscontrolit/ESPEasyPluginPlayground/blob/master/_P110_P1WifiGateway.ino

I’m not sure if (how) this works with @aequitas his component.

Hi, I am fairly new to the Home Assistant system.
I have got the “Slimme meter” working on my new PI.
I have noticed that the telegrams got pushed to the homeassistant.db file but after a couple of days the system got a bit slow.
After some investigating I found out the homeassistant.db file got very large because of the telegrams that have been pushed every 10 seconds.
After some reading on the forums I have setup a MySQL database on my NAS and now everything is good/snappy again.
Now my question, is there a file that I can edit so that I can change frequency that the telegram gets pushed from maybe 10 seconds to 1 minute or more so that my MySQL DB doesn’t get filled up that fast?

Sorry for my bad English, it is not my native language.

Thanks in advance

Best thing you can do is purge your database (removing all values older than 7 days) and for the logging revert to influxdb. Some useful documentation on the known error of huge data see files can be found at Large homeassistant database files

I am using this wireless solution: http://www.esp8266thingies.nl/wp/
But I am getting CRC errors. If I set it to dsmr_version 2 it’ll work (but with incorrect/missing data, since it parses as 2 instead of 4).
Smart Meter; Kaifa MA105C -> p1 wifi gateway -> dsmr sensor in home assistant

Does anyone happen to know how to fix this or what the problem might be?

p1 gateway set as, 115200 8N1

Quick and dirty hack;
In deps/dsmr_parser/parser.py
I commented line 92:
# self.validate_telegram_checksum(line_values)

The p1 wifi gateway already does CRC validation, and I am guessing somewhere in the next step something minor changes. So for now I just disabled the validation in the dsmr_parser and all the values appear correct in my dashboard.

If anyone with DSMR5 feels like giving this a try.

Could you raise this issue at: https://github.com/ndokter/dsmr_parser/issues and provide some output of the p1 wifi gateway?

I would like to see friendly_name on the sensors so I can translate the english names to my local language (Dutch) in configuration.yaml

I create a template now to make the translation:

  • platform: template
    sensors:
    stroom_verbruik:
    friendly_name: Stroom Verbruik
    value_template: ‘{{ states.sensor.power_consumption.state }}’
    unit_of_measurement: ‘kW’
    icon_template: mdi:flash
    stroom_verbruik_laag:
    friendly_name: Stroom Verbruik Laag
    value_template: ‘{{ states.sensor.power_consumption_low.state }}’
    unit_of_measurement: ‘kWh’
    icon_template: mdi:flash
    stroom_verbruik_hoog:
    friendly_name: Stroom Verbruik Hoog
    value_template: ‘{{ states.sensor.power_consumption_normal.state }}’
    unit_of_measurement: ‘kWh’
    icon_template: mdi:flash
    stroom_export_laag:
    friendly_name: Stroom Export Laag
    value_template: ‘{{ states.sensor.power_production_low.state }}’
    unit_of_measurement: ‘kWh’
    icon_template: mdi:flash
    stroom_export_hoog:
    value_template: ‘{{ states.sensor.power_production_normal.state }}’
    friendly_name: Stroom Export Hoog
    unit_of_measurement: ‘kWh’
    icon_template: mdi:flash
    stroom_export:
    friendly_name: Stroom Export
    value_template: ‘{{ states.sensor.power_production.state }}’
    unit_of_measurement: ‘kW’
    icon_template: mdi:flash
    stroom_tarief:
    friendly_name: Stroom Tarief
    value_template: ‘{{ states.sensor.power_tariff.state }}’
    icon_template: mdi:flash
    gas_verbruik:
    friendly_name: Gas Verbruik
    value_template: ‘{{ states.sensor.gas_consumption.state }}’
    unit_of_measurement: ‘m3’
    icon_template: mdi:fire
    gas_verbruik_per_uur:
    friendly_name: Gas Verbruik (uur)
    value_template: ‘{{ states.sensor.hourly_gas_consumption.state }}’
    unit_of_measurement: ‘m3/h’
    icon_template: mdi:fire
    energy_generation:
    value_template: ‘{% if is_state_attr(“sensor.pvoutput”, “energy_generation”, “NaN”) %}0{% else %}{{ “%0.2f”|format(states.sensor.pvoutput.attributes.energy_generation|float/1000) }}{% endif %}’
    friendly_name: ‘Generated’
    unit_of_measurement: ‘kWh’
    icon_template: mdi:flash
1 Like

Please look into customizing (https://home-assistant.io/docs/configuration/customizing-devices/) that should provide that functionality.

I noticed that after version 0.6 of the dsmr_parser (that is used here) some additional fixes with regards to CRC errors (https://github.com/ndokter/dsmr_parser/issues/17) I was planning on seeing if I could test and/or integrate the newer version. I was also informed that Domoticz also fails on the CRC parsing at the moment.

But I guess I can make an issue, with all this information on github :slight_smile:

Is there a nice way to combine the power_consumption_low.state and power_consumption_normal.state in a single value?

Thanks.

Totally forgot. Yes this will do the trick.

Has anyone been able to get the notify.REST platform working for publishing to mindergas.nl?

I never managed to get it working reliable so I now have a python script which I run through from every night at 0.45. script is below

import requests
import json
import datetime
import homeassistant.remote as remote

mindergas = “http://www.mindergas.nl/api/gas_meter_readings
mindergas_token = ‘XXXXXXXXXXX’
hass_ip = ‘127.0.0.1’
hass_password = ‘’
hass_port = ‘8123’
gas_sensor = ‘sensor.gas_consumption’
api = remote.API(hass_ip,hass_password, hass_port)
gas_usage = remote.get_state(api, ‘sensor.gas_consumption’)

def post():
yesterday = datetime.date.today () - datetime.timedelta (days=1)
data = {‘date’: yesterday.strftime (“%Y%m%d”), ‘reading’:gas_usage.state}
headers = {‘Content-Type’: ‘application/json’, ‘AUTH-TOKEN’: mindergas_token}
r = requests.post(mindergas, data=json.dumps(data), headers=headers)
print (yesterday.strftime (“%Y%m%d”))
print (data)
print (r)
print (‘Ready’)

post()

I’m using a Python script too but the using the Notify.rest platform is a much more elegant solution. I’ll have a look at it.

Whatever you do; post the outcome here please :slight_smile:

I think you can use this:

Looks promising. Had not thought of this. I will try this asap.

I have looked at the binary sensor and that is not what we need. The sensor is polled every minute. I actually need the REST notify or REST command. When I have the time I will try to modify the latter to support headers.

For the moment I have implemented the python script above. But I can’t get it to work, so I need some help. :cold_sweat:

I can successfully run the command from the command line in the virtualenv:

(homeassistant) homeassistant@raspberrypi:/home/pi$ python /home/homeassistant/.homeassistant/scripts/mindergas.py
20170329
{'reading': '2539.406', 'date': '20170329'}
<Response [201]>
Ready
(homeassistant) homeassistant@raspberrypi:/home/pi$ 

This is the configuration (I can see the logbook entry and the pushover notification, but the reading is not published, so the script is not being called, I guess.

sensor:
  - platform: dsmr
    #etc
shell_command:
  mindergas: 'python /home/homeassistant/.homeassistant/scripts/mindergas.py'
script:
  mindergas:
    alias: Verstuur gasverbruik
    sequence:
      - service: shell_command.mindergas
      - service: logbook.log
        data:
          name: Gasverbruik
          message: is verstuurd
          entity_id: sensor.gas_consumption
          domain: sensor
      - service: notify.pushover
        data_template:
          message: "Gasverbruik ({{ states.sensor.gas_consumption.state}} m3) is verstuurd naar mindergas.nl"
automation:
  mindergas:
    alias: Verstuur gasverbruik
    hide_entity: no # default no
    trigger:
      platform: time
      # run daily at 00:05:00
      hours: 00
      minutes: 15
      seconds: 00
    action:
      service: script.mindergas

I had the exact same problem! That’s why I decided to run the script through a cronjob instead of running it from Homeassistant…