devices.esphome.io
Hegg Dongle / EARN-E energiemonitor
Hegg Dongle / EARN-E energiemonitor
Device Type: miscElectrical Standard: euBoard: esp8266
Introduction
This is a dongle that plugs into the P1 port on DSMR meters. Hegg customers get the Hegg Dongle for free. PCB inspection reveals it is made by EARN-E, who presumably sell the same hardware branded as the EARN-E Energiemonitor.
Product Images
Wrapped
      
  
        
        
Unwrapped
      
  
        
        
The P1 connector on the right of this photo has pin 1 (+5V) at the bottom and pin 6 (Power GND) at the top.
GPIO Pinout
All "pads" mentioned in this table are on the back of the board, except those that mention SW1 which is on top.
red/green/blue are for the RGB LED right next to the ESP.
| Pin | Pad | Function | 
|---|---|---|
| GND | Unlabeled (next to 3.3v), one side of SW1 | many; connected to one side of the (unpopulated) SW1 header | 
| GPIO0 | gpio_0, other side of SW1 | FLASH, connected to the other side of the (unpopulated) SW1 header | 
| GPIO1 | txd | TXD0 | 
| GPIO3 | rxd or data_in via inverter | RXD0 | 
| GPIO12 | green | |
| GPIO13 | red | |
| GPIO14 | blue | |
| VCC | 3.3v | power, converted from 5V | 
| P1 data request does not appear to be exposed | ||
5V_in | tied to USB power and the P1 power pin (pin 1) | |
| RST | rst | reboots the ESP when briefly tied to ground | 
Flashing procedure
The text below assumes you removed the plastic wrap around the device. A (so far) untested alternative is to poke a few pins through the plastic at the bottom to reach the pads. If you try this, please update this document with your experiences!
Using the pads, or just the pins on the ESP12F, flashing this device is a pretty "normal" procedure, except that GPIO3/RXD0 is also used to receive data from the smart meter. The DSMR/P1 smart meter protocol uses inverted logic levels for serial, and the dongle contains an inverter circuit to turn these back around to something the ESP can work with. It turns out that this inverter circuit makes RXD0 unusable if the physical Data pin on the P1 port is left floating.
To flash:
- Make GPIO3/RXD0 idle by connecting 
data_into GND, or tie the corresponding pins (5 and 6, the topmost two) on the P1 connector end together. - Connect either the 
txdpad or the GPIO1/TXD0 pin to RX on your serial converter - Connect either the 
rxd, ordata_inpad, or pin 5 of the P1 socket, or the GPIO3/RXD0 pin to TX on your serial converter. If you usedata_inor the P1 pin, you likely need to invert your signal. - Power by connecting GND and VCC to your serial converter, or plugging in USB. Presumably you can also power the dongle via 5V+GND on the P1 connector. Have GND connected to GPIO0/FLASH during powerup, or briefly tie RST to GND with GPIO0/FLASH also tied to GND to reset into flashing mode.
 - Flash as usual with something like 
esptool 
Flashing photos
Tying P1 Data to GND on the P1 port
      
  
        
Building a poor man's Spiderboard so you don't have to hold cables down
      
  
        
Basic configuration
esphome:  name: "p1-reader"  on_boot:    then:      - light.turn_on:         id: status_led         brightness: 50%         blue: 0         red: 0         green: 100%         effect: pulse
esp8266:  board: esp12e
ota:  password: !secret api_pass
api:  encryption:    key: !secret api_key  on_client_connected:      - light.turn_on:         id: status_led         brightness: 50%         blue: 0.949         red: 0.094         green: 0.737         effect:  none  on_client_disconnected:    - if:        condition: wifi.connected        then:          - light.turn_on:              id: status_led              brightness: 50%              blue: 0.949              red: 0.094              green: 0.737              effect:  pulse
wifi:  ssid: !secret wifi_ssid  password: !secret wifi_password  fast_connect: true  power_save_mode: HIGH  on_connect:      - light.turn_on:         id: status_led         brightness: 50%         blue: 0         red: 0         green: 100%         effect:  none  on_disconnect:      - light.turn_on:         id: status_led         brightness: 50%         blue: 0         red: 100%         green: 0         effect: pulse
logger:  baud_rate: 0
captive_portal:
web_server:  port: 80
uart:  rx_pin: 3  tx_pin: 1  baud_rate: 115200  rx_buffer_size: 1700
light:  - platform: rgb    internal: True    id: status_led    name: "Status Led"    red: red    green: green    blue: blue    effects:      - pulse:
sensor:  - platform: dsmr    energy_delivered_tariff1:      name: "Energy Consumed Tariff 1"      state_class: total_increasing    energy_delivered_tariff2:      name: "Energy Consumed Tariff 2"      state_class: total_increasing    energy_returned_tariff1:      name: "Energy Produced Tariff 1"      state_class: total_increasing    energy_returned_tariff2:      name: "Energy Produced Tariff 2"      state_class: total_increasing    power_delivered:      name: "Power Consumed"      unit_of_measurement: "W"      state_class: "measurement"      accuracy_decimals: 0      filters:        - multiply: 1000    power_returned:      name: "Power Produced"      unit_of_measurement: "W"      state_class: "measurement"      accuracy_decimals: 0      filters:        - multiply: 1000    electricity_failures:      name: "Electricity Failures"      icon: mdi:alert    electricity_long_failures:      name: "Long Electricity Failures"      icon: mdi:alert    voltage_l1:      name: "Voltage Phase 1"    voltage_l2:      name: "Voltage Phase 2"    voltage_l3:      name: "Voltage Phase 3"    current_l1:      name: "Current Phase 1"    current_l2:      name: "Current Phase 2"    current_l3:      name: "Current Phase 3"    power_delivered_l1:      name: "Power Consumed Phase 1"      unit_of_measurement: "W"      state_class: "measurement"      accuracy_decimals: 0      filters:        - multiply: 1000    power_delivered_l2:      name: "Power Consumed Phase 2"      unit_of_measurement: "W"      state_class: "measurement"      accuracy_decimals: 0      filters:        - multiply: 1000    power_delivered_l3:      name: "Power Consumed Phase 3"      unit_of_measurement: "W"      state_class: "measurement"      accuracy_decimals: 0      filters:        - multiply: 1000    power_returned_l1:      name: "Power Produced Phase 1"      unit_of_measurement: "W"      state_class: "measurement"      accuracy_decimals: 0      filters:        - multiply: 1000    power_returned_l2:      name: "Power Produced Phase 2"      unit_of_measurement: "W"      state_class: "measurement"      accuracy_decimals: 0      filters:        - multiply: 1000    power_returned_l3:      name: "Power Produced Phase 3"      unit_of_measurement: "W"      state_class: "measurement"      accuracy_decimals: 0      filters:        - multiply: 1000    gas_delivered:      name: "Gas Consumed"      state_class: total_increasing
text_sensor:  - platform: dsmr    identification:      name: "DSMR Identification"    p1_version:      name: "DSMR Version"
output:  - platform: esp8266_pwm    pin: 14    frequency: 600 Hz    id: blue  - platform: esp8266_pwm    pin: 13    frequency: 600 Hz    id: red  - platform: esp8266_pwm    pin: 12    frequency: 600 Hz    id: greenCredits
Documented by Peter van Dijk with lots of input and help from Joris Vandalon, Robert van der Meulen, and Bart Smit.
Edit this page on GitHub