ET-SM01 – DIY DSMR P1 smart meter
Table of Contents
Introduction
In the Netherlands, Belgium, Luxembourg and Sweden Residential Smart Electricity Meters comply to DSMR (Dutch Smart Meter Requirements), also known as ‘Smart Meter’ or ‘P1 port’ which supports plain non encrypted telegrams and also encrypted telegrams as used in Luxembourg. This hardware sends the data of your Residential Smart Meter to Home Assistant using a esphome component.
There are many designs of Home Assistant compatible DSMR interfaces available. Some commercial, some open source. Most of the open source designs are ‘complicated’ and/or hard to build by a regular consumer. As always we try to keep things simple, so we designed the SM01 to be easy to build and use only a few widely available components.
On top of that we designed to SM01 to optionally support your water meter using a simple inductive sensor and you could add a I2C (OLED) display as well.

SM01 with optional water meter sensor
Design parameters
Our requirements were:
- Wemos D1 mini ESP8266 of ESP32 Wemos D1 controlled
- Can be powered from the P1 port (DSMR v5) or from USB
- Simple to build
- Nicely fits inside a proper enclosure
- Parts should be available at AliExpress or Amazon for affordable prices, making it as cheap as possible to build
- Optional water meter support
- Optional (OLED) I2C Display support
- Optionally exposed GPIO pins and 3.3v and 5v on pin headers
- Firmware should be ESPHome (for use with Home Assistant)
Practical design
We came up with this practical design that in its simplest form (just DSMR functionality) needs just 8 components including the PCB and the Wemos D1.
Circuit diagram
Build it!
Bill of materials
See below the list with the components you will need to build the ET-SM01. A number of these items will not be sold in smaller quantities at AliExpress. We will try to use the same components as much as possible in future projects.
We would really appreciate it if you will use the links below to buy the components, since it will give a little bit of commission to us without any additional cost for yourself. These commissions will be used to cover some of the costs involved in the development of the design.
Reference | Qty | Description | Link |
WEMOS1 | 1 | Wemos Mini D1 ESP8266 | AliExpress |
WEMOS1 | 1 | Wemos D1 ESP32 | Aliexpress |
D1 | 1 | 1N4001 | AliExpress |
C1 | 1 | 470µF / 16V 6mm diameter, 2.54mm pitch | AliExpress |
T1 | 1 | S8050 TO-92 Triode Transistor | Aliexpress |
R1, R4, R5, R6, R7 | 1 (or 5) | Resistor 1k | Aliexpress |
R2 | 1 | Resistor 3k3 | Aliexpress |
R3 | 1 | Resistor 10k | Aliexpress |
X1 | 2 | 1x 3 pole screw terminal 5.00mm pitch | Aliexpress |
JP3-JP6 | 1 | Male pin headers 2.54p | Aliexpress |
J1 | 1 | RJ12 terminal (6p6C) | Aliexpress |
Enclosure | 1 | 76X56X29mm DIY Enclosure | Aliexpress |
PCB | 1 | A 5-pack is the smallest order at PCBway, enough for you and your friends 😉 | PCBway |
Cable | 1 | RJ12 cable straight 0.5meter | Aliexpress |
Water meter sensor | 1 | PL-05N inductive proximity switch | Aliexpress |
Putting it together
Like with all other projects, it is the easiest to start with identifying the components purchased as discussed in the blog post. After sorting the components and cleaning the PCB, start with the lowest components first. For this project, we advise to work in this order:
- Resistors
- Diode
- Transistor
- (optional) Screw terminal
- (optional) pin headers
- ESP module headers (Use the hints in the soldering blog post!)
- Electrolytic capacitor
- (optional) RJ12 terminal
If you need DSMR functionality only, you can only populate the components marked green.
Once all components are soldered in place, perform a good visual check of all joints, and pay particular attention to possible solder bridges (unwanted solder connections between pins). Do not forget to clean the excess solder flux from the PCB using alcohol!

Fully assembled board
Software configuration
substitutions: device_name: espthings-sm01 human_devicename: espthings.io SM-01 device_description: "DIY DSMR P1 interface for your residential Smart Meter" esphome: name: ${device_name} comment: "${device_description}" platform: ESP8266 esp8266_restore_from_flash: true board: d1_mini name_add_mac_suffix: false project: name: espthings.et-sm01 version: "220818-01" wifi: networks: - ssid: !secret esphome_wifi_ssid password: !secret esphome_wifi_password logger: baud_rate: 0 api: encryption: key: !secret esphome_api_key ota: password: !secret esphome_ota_password web_server: port: 80 uart: baud_rate: 115200 rx_pin: D7 # On esp32 wemos d1 use: GPIO23 dsmr: id: dsmr_instance sensor: - platform: dsmr energy_delivered_tariff1: name: "$human_devicename - Energy Consumed Tariff 1" state_class: total_increasing energy_delivered_tariff2: name: "$human_devicename - Energy Consumed Tariff 2" state_class: total_increasing energy_returned_tariff1: name: "$human_devicename - Energy Produced Tariff 1" state_class: total_increasing energy_returned_tariff2: name: "$human_devicename - Energy Produced Tariff 2" state_class: total_increasing power_delivered: name: "$human_devicename - Power Consumed" accuracy_decimals: 3 power_returned: name: "$human_devicename - Power Produced" accuracy_decimals: 3 electricity_failures: name: "$human_devicename - Electricity Failures" icon: mdi:alert electricity_long_failures: name: "$human_devicename - Long Electricity Failures" icon: mdi:alert voltage_l1: name: "$human_devicename - Voltage Phase 1" voltage_l2: name: "$human_devicename - Voltage Phase 2" voltage_l3: name: "$human_devicename - Voltage Phase 3" current_l1: name: "$human_devicename - Current Phase 1" id: currentl1 current_l2: name: "$human_devicename - Current Phase 2" id: currentl2 current_l3: name: "$human_devicename - Current Phase 3" id: currentl3 power_delivered_l1: name: "$human_devicename - Power Consumed Phase 1" accuracy_decimals: 3 power_delivered_l2: name: "$human_devicename - Power Consumed Phase 2" accuracy_decimals: 3 power_delivered_l3: name: "$human_devicename - Power Consumed Phase 3" accuracy_decimals: 3 power_returned_l1: name: "$human_devicename - Power Produced Phase 1" accuracy_decimals: 3 power_returned_l2: name: "$human_devicename - Power Produced Phase 2" accuracy_decimals: 3 power_returned_l3: name: "$human_devicename - Power Produced Phase 3" accuracy_decimals: 3 gas_delivered: name: "$human_devicename - Gas Consumed" state_class: total_increasing gas_delivered_be: name: "$human_devicename - Gas Consumed Belgium" state_class: total_increasing - platform: uptime name: "$human_devicename - Uptime" - platform: wifi_signal name: "$human_devicename - Wi-Fi Signal" update_interval: 60s ### use if you populate the water meter stuff :) - platform: pulse_counter pin: D3 # On esp32 wemos d1 use: GPIO17 update_interval : 6s name: "$human_devicename - water pulse" id: water_pulse - platform: pulse_meter pin: D3 # On esp32 wemos d1 use: GPIO17 name: "$human_devicename - Water Pulse Meter" unit_of_measurement: "liter/min" icon: "mdi:water" total: name: "$human_devicename - Water Total" unit_of_measurement: "liter" - platform: pulse_meter pin: D3 # On esp32 wemos d1 use: GPIO17 name: "$human_devicename - Water Pulse Meter" unit_of_measurement: "liter/min" icon: "mdi:water" total: name: "$human_devicename - Water Meter Total" unit_of_measurement: "m³" id: water_meter_total accuracy_decimals: 3 device_class: water state_class: total_increasing filters: - multiply: 0.001 - platform: template name: "$human_devicename - Water Usage Liter" id: water_flow_rate accuracy_decimals: 1 unit_of_measurement: "l/min" icon: "mdi:water" lambda: return (id(water_pulse).state * 10); update_interval: 6s text_sensor: - platform: dsmr identification: name: "$human_devicename - Identification" p1_version: name: "$human_devicename - Version" p1_version_be: name: "$human_devicename - Version Belgium" electricity_tariff: name: "$human_devicename - Tarief" - platform: wifi_info ip_address: name: "$human_devicename - IP Address" ssid: name: "$human_devicename - Wi-Fi SSID" bssid: name: "$human_devicename - Wi-Fi BSSID" - platform: version name: "$human_devicename - ESPHome Version" hide_timestamp: true switch: - platform: restart name: "$human_devicename - Restart"
Home Assistant
This is what it looks like in Home Assistant:
Water meter
If you want water meter support, purchase the PL-05N, use the relevant ESPHome code and 3d-print this [mount]. You need to experiment with placing the proximity sensor in the exact right spot and then attach it using some double sided tape.

PL-05N mounted to water meter
Final thoughts
We have the SM01 running flawlessly for a few months now. If you want residential Electricity, Gas and Water Meter monitoring, then build this thing yourself and If you do, please let us know in the comments 🙂
If you run into issues during the construction, or you have any question regarding this controller, please leave a comment below. We will try to reply as soon as possible!
Make sure to subscribe to our YouTube channel so you won’t miss any of our upcoming project videos!