95 | struct _ParseResult {
96 | T result;
97 |
98 | P& succeed(T& result) {
99 | this->result = result; return *static_cast(this);
100 | }
101 | P& succeed(T&& result) {
102 | this->result = result;
103 | return *static_cast
(this);
104 | }
105 | };
106 |
107 | // partial specialization for void result
108 | template
109 | struct _ParseResult {
110 | };
111 |
112 | // Actual ParseResult class
113 | template
114 | struct ParseResult : public _ParseResult, T> {
115 | const char *next = NULL;
116 | const __FlashStringHelper *err = NULL;
117 | const char *ctx = NULL;
118 |
119 | ParseResult& fail(const __FlashStringHelper *err, const char* ctx = NULL) {
120 | this->err = err;
121 | this->ctx = ctx;
122 | return *this;
123 | }
124 | ParseResult& until(const char *next) {
125 | this->next = next;
126 | return *this;
127 | }
128 | ParseResult() = default;
129 | ParseResult(const ParseResult& other) = default;
130 |
131 | template
132 | ParseResult(const ParseResult& other): next(other.next), err(other.err), ctx(other.ctx) { }
133 |
134 | /**
135 | * Returns the error, including context in a fancy multi-line format.
136 | * The start and end passed are the first and one-past-the-end
137 | * characters in the total parsed string. These are needed to properly
138 | * limit the context output.
139 | */
140 | String fullError(const char* start, const char* end) const {
141 | String res;
142 | if (this->ctx && start && end) {
143 | // Find the entire line surrounding the context
144 | const char *line_end = this->ctx;
145 | while(line_end < end && line_end[0] != '\r' && line_end[0] != '\n') ++line_end;
146 | const char *line_start = this->ctx;
147 | while(line_start > start && line_start[-1] != '\r' && line_start[-1] != '\n') --line_start;
148 |
149 | // We can now predict the context string length, so let String allocate
150 | // memory in advance
151 | res.reserve((line_end - line_start) + 2 + (this->ctx - line_start) + 1 + 2);
152 |
153 | // Write the line
154 | concat_hack(res, line_start, line_end - line_start);
155 | res += "\r\n";
156 |
157 | // Write a marker to point out ctx
158 | while (line_start++ < this->ctx)
159 | res += ' ';
160 | res += '^';
161 | res += "\r\n";
162 | }
163 | res += this->err;
164 | return res;
165 | }
166 | };
167 |
168 | /**
169 | * An OBIS id is 6 bytes, usually noted as a-b:c.d.e.f. Here we put them
170 | * in an array for easy parsing.
171 | */
172 | struct ObisId {
173 | uint8_t v[6];
174 |
175 | constexpr ObisId(uint8_t a, uint8_t b = 255, uint8_t c = 255, uint8_t d = 255, uint8_t e = 255, uint8_t f = 255)
176 | : v{a, b, c, d, e, f} { };
177 | constexpr ObisId() : v() {} // Zeroes
178 |
179 | bool operator==(const ObisId &other) const {
180 | return memcmp(&v, &other.v, sizeof(v)) == 0;
181 | }
182 | };
183 |
184 | } // namespace dsmr
185 |
186 | #endif // DSMR_INCLUDE_UTIL_H
187 |
--------------------------------------------------------------------------------
/components/empty.txt:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/dashboard_import.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | substitutions:
3 | device_name: slimmelezer
4 | device_description: "DIY P1 module to read your smart meter"
5 |
6 | esphome:
7 | name: ${device_name}
8 | comment: "${device_description}"
9 | name_add_mac_suffix: false
10 | project:
11 | name: zuidwijk.slimmelezer
12 | version: "2.0"
13 | on_boot:
14 | then:
15 | - if:
16 | condition:
17 | lambda: return id(has_key);
18 | then:
19 | - lambda: |-
20 | std::string key(id(stored_decryption_key), 32);
21 | id(dsmr_instance).set_decryption_key(key);
22 | else:
23 | - logger.log:
24 | level: info
25 | format: "Not using decryption key. If you need to set a key use Home Assistant service 'ESPHome: ${device_name}_set_dsmr_key'"
26 |
27 | esp8266:
28 | restore_from_flash: true
29 | board: d1_mini
30 |
31 | # To be able to get logs from the device via serial and api.
32 | logger:
33 | baud_rate: 0
34 |
35 | # API is a requirement of the dashboard import.
36 | api:
37 | services:
38 | service: set_dsmr_key
39 | variables:
40 | private_key: string
41 | then:
42 | - logger.log:
43 | format: Setting private key %s. Set to empty string to disable
44 | args: [private_key.c_str()]
45 | - globals.set:
46 | id: has_key
47 | value: !lambda "return private_key.length() == 32;"
48 | - lambda: |-
49 | if (private_key.length() == 32)
50 | private_key.copy(id(stored_decryption_key), 32);
51 | id(dsmr_instance).set_decryption_key(private_key);
52 |
53 | # OTA is required for Over-the-Air updating
54 | ota:
55 |
56 | # This should point to the public location of this yaml file.
57 | dashboard_import:
58 | package_import_url: github://zuidwijk/dsmr/dashboard_import.yaml
59 |
60 | wifi:
61 | # ssid: !secret wifi_ssid
62 | # password: !secret wifi_password
63 |
64 | # Enable fallback hotspot (captive portal) in case wifi connection fails
65 | ap:
66 | ssid: ${device_name}
67 |
68 | captive_portal:
69 |
70 | web_server:
71 | port: 80
72 |
73 | uart:
74 | baud_rate: 115200
75 | rx_pin: D7
76 | rx_buffer_size: 1500
77 |
78 | globals:
79 | - id: has_key
80 | type: bool
81 | restore_value: yes
82 | initial_value: "false"
83 | - id: stored_decryption_key
84 | type: char[32]
85 | restore_value: yes
86 |
87 | dsmr:
88 | id: dsmr_instance
89 | # For Luxembourg users set here your decryption key
90 | #decryption_key: !secret decryption_key // enable this when using decryption for Luxembourg; key like '00112233445566778899AABBCCDDEEFF'
91 |
92 | sensor:
93 | - platform: dsmr
94 | energy_delivered_lux:
95 | name: "Energy Consumed Luxembourg"
96 | energy_delivered_tariff1:
97 | name: "Energy Consumed Tariff 1"
98 | energy_delivered_tariff2:
99 | name: "Energy Consumed Tariff 2"
100 | energy_returned_lux:
101 | name: "Energy Produced Luxembourg"
102 | energy_returned_tariff1:
103 | name: "Energy Produced Tariff 1"
104 | energy_returned_tariff2:
105 | name: "Energy Produced Tariff 2"
106 | power_delivered:
107 | name: "Power Consumed"
108 | accuracy_decimals: 3
109 | power_returned:
110 | name: "Power Produced"
111 | accuracy_decimals: 3
112 | electricity_failures:
113 | name: "Electricity Failures"
114 | icon: mdi:alert
115 | electricity_long_failures:
116 | name: "Long Electricity Failures"
117 | icon: mdi:alert
118 | voltage_l1:
119 | name: "Voltage Phase 1"
120 | voltage_l2:
121 | name: "Voltage Phase 2"
122 | voltage_l3:
123 | name: "Voltage Phase 3"
124 | current_l1:
125 | name: "Current Phase 1"
126 | current_l2:
127 | name: "Current Phase 2"
128 | current_l3:
129 | name: "Current Phase 3"
130 | power_delivered_l1:
131 | name: "Power Consumed Phase 1"
132 | accuracy_decimals: 3
133 | power_delivered_l2:
134 | name: "Power Consumed Phase 2"
135 | accuracy_decimals: 3
136 | power_delivered_l3:
137 | name: "Power Consumed Phase 3"
138 | accuracy_decimals: 3
139 | power_returned_l1:
140 | name: "Power Produced Phase 1"
141 | accuracy_decimals: 3
142 | power_returned_l2:
143 | name: "Power Produced Phase 2"
144 | accuracy_decimals: 3
145 | power_returned_l3:
146 | name: "Power Produced Phase 3"
147 | accuracy_decimals: 3
148 | gas_delivered:
149 | name: "Gas Consumed"
150 | gas_delivered_be:
151 | name: "Gas Consumed Belgium"
152 | - platform: uptime
153 | name: "SlimmeLezer Uptime"
154 | - platform: wifi_signal
155 | name: "SlimmeLezer Wi-Fi Signal"
156 | update_interval: 60s
157 |
158 | text_sensor:
159 | - platform: dsmr
160 | identification:
161 | name: "DSMR Identification"
162 | p1_version:
163 | name: "DSMR Version"
164 | p1_version_be:
165 | name: "DSMR Version Belgium"
166 | - platform: wifi_info
167 | ip_address:
168 | name: "SlimmeLezer IP Address"
169 | ssid:
170 | name: "SlimmeLezer Wi-Fi SSID"
171 | bssid:
172 | name: "SlimmeLezer Wi-Fi BSSID"
173 | - platform: version
174 | name: "ESPHome Version"
175 | hide_timestamp: true
176 |
--------------------------------------------------------------------------------
/pre-compiled/slimmelezer-v2022.10.1.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zuidwijk/dsmr/33accb0fbb4d52ad8ea1bbde2332ac561a276285/pre-compiled/slimmelezer-v2022.10.1.bin
--------------------------------------------------------------------------------
/pre-compiled/slimmelezer-v2022.11.3.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zuidwijk/dsmr/33accb0fbb4d52ad8ea1bbde2332ac561a276285/pre-compiled/slimmelezer-v2022.11.3.bin
--------------------------------------------------------------------------------
/pre-compiled/slimmelezer-v2022.11.4.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zuidwijk/dsmr/33accb0fbb4d52ad8ea1bbde2332ac561a276285/pre-compiled/slimmelezer-v2022.11.4.bin
--------------------------------------------------------------------------------
/pre-compiled/slimmelezer-v2022.11.5.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zuidwijk/dsmr/33accb0fbb4d52ad8ea1bbde2332ac561a276285/pre-compiled/slimmelezer-v2022.11.5.bin
--------------------------------------------------------------------------------
/pre-compiled/slimmelezer-v2022.12.1.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zuidwijk/dsmr/33accb0fbb4d52ad8ea1bbde2332ac561a276285/pre-compiled/slimmelezer-v2022.12.1.bin
--------------------------------------------------------------------------------
/pre-compiled/slimmelezer-v2022.12.3.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zuidwijk/dsmr/33accb0fbb4d52ad8ea1bbde2332ac561a276285/pre-compiled/slimmelezer-v2022.12.3.bin
--------------------------------------------------------------------------------
/pre-compiled/slimmelezer-v2022.12.8.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zuidwijk/dsmr/33accb0fbb4d52ad8ea1bbde2332ac561a276285/pre-compiled/slimmelezer-v2022.12.8.bin
--------------------------------------------------------------------------------
/sl32plus.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | substitutions:
3 | device_name: sl32plus
4 | device_description: "DIY P1 module to read your smart meter"
5 |
6 | esp32:
7 | board: esp32dev
8 |
9 | esphome:
10 | name: ${device_name}
11 | comment: "${device_description}"
12 | name_add_mac_suffix: false
13 | project:
14 | name: zuidwijk.slimmelezer
15 | version: "2.0"
16 | on_boot:
17 | then:
18 | - if:
19 | condition:
20 | lambda: return id(has_key);
21 | then:
22 | - lambda: |-
23 | std::string key(id(stored_decryption_key), 32);
24 | id(dsmr_instance).set_decryption_key(key);
25 | else:
26 | - logger.log:
27 | level: info
28 | format: "Not using decryption key. If you need to set a key use Home Assistant service 'ESPHome: ${device_name}_set_dsmr_key'"
29 |
30 | wifi:
31 | ap:
32 | ssid: ${device_name}
33 |
34 | captive_portal:
35 |
36 | esp32_ble_tracker:
37 | scan_parameters:
38 | interval: 1100ms
39 | window: 1100ms
40 | active: true
41 |
42 | bluetooth_proxy:
43 | active: true
44 |
45 | improv_serial:
46 |
47 | # Enable logging
48 | logger:
49 | baud_rate: 115200
50 |
51 | # Enable Home Assistant API
52 | api:
53 | services:
54 | service: set_dsmr_key
55 | variables:
56 | private_key: string
57 | then:
58 | - logger.log:
59 | format: Setting private key %s. Set to empty string to disable
60 | args: [private_key.c_str()]
61 | - globals.set:
62 | id: has_key
63 | value: !lambda "return private_key.length() == 32;"
64 | - lambda: |-
65 | if (private_key.length() == 32)
66 | private_key.copy(id(stored_decryption_key), 32);
67 | id(dsmr_instance).set_decryption_key(private_key);
68 |
69 | ota:
70 | platform: esphome
71 |
72 | dashboard_import:
73 | package_import_url: github://zuidwijk/dsmr/sl32plus.yaml@main
74 |
75 | web_server:
76 | port: 80
77 |
78 | uart:
79 | id: uart_dsmr
80 | baud_rate: 115200
81 | rx_pin: GPIO16
82 | rx_buffer_size: 1700
83 |
84 | globals:
85 | - id: has_key
86 | type: bool
87 | restore_value: yes
88 | initial_value: "false"
89 | - id: stored_decryption_key
90 | type: char[32]
91 | restore_value: yes
92 |
93 | dsmr:
94 | uart_id: uart_dsmr
95 | id: dsmr_instance
96 | max_telegram_length: 1700
97 | # For Luxembourg users set here your decryption key
98 | #decryption_key: !secret decryption_key // enable this when using decryption for Luxembourg; key like '00112233445566778899AABBCCDDEEFF'
99 |
100 | sensor:
101 | - platform: dsmr
102 | energy_delivered_lux:
103 | name: "Energy Consumed Luxembourg"
104 | energy_delivered_tariff1:
105 | name: "Energy Consumed Tariff 1"
106 | energy_delivered_tariff2:
107 | name: "Energy Consumed Tariff 2"
108 | energy_returned_lux:
109 | name: "Energy Produced Luxembourg"
110 | energy_returned_tariff1:
111 | name: "Energy Produced Tariff 1"
112 | energy_returned_tariff2:
113 | name: "Energy Produced Tariff 2"
114 | power_delivered:
115 | name: "Power Consumed"
116 | accuracy_decimals: 3
117 | power_returned:
118 | name: "Power Produced"
119 | accuracy_decimals: 3
120 | electricity_failures:
121 | name: "Electricity Failures"
122 | icon: mdi:alert
123 | electricity_long_failures:
124 | name: "Long Electricity Failures"
125 | icon: mdi:alert
126 | voltage_l1:
127 | name: "Voltage Phase 1"
128 | voltage_l2:
129 | name: "Voltage Phase 2"
130 | voltage_l3:
131 | name: "Voltage Phase 3"
132 | current_l1:
133 | name: "Current Phase 1"
134 | current_l2:
135 | name: "Current Phase 2"
136 | current_l3:
137 | name: "Current Phase 3"
138 | power_delivered_l1:
139 | name: "Power Consumed Phase 1"
140 | accuracy_decimals: 3
141 | power_delivered_l2:
142 | name: "Power Consumed Phase 2"
143 | accuracy_decimals: 3
144 | power_delivered_l3:
145 | name: "Power Consumed Phase 3"
146 | accuracy_decimals: 3
147 | power_returned_l1:
148 | name: "Power Produced Phase 1"
149 | accuracy_decimals: 3
150 | power_returned_l2:
151 | name: "Power Produced Phase 2"
152 | accuracy_decimals: 3
153 | power_returned_l3:
154 | name: "Power Produced Phase 3"
155 | accuracy_decimals: 3
156 | gas_delivered:
157 | name: "Gas Consumed"
158 | gas_delivered_be:
159 | name: "Gas Consumed Belgium"
160 | - platform: uptime
161 | name: "SlimmeLezer Uptime"
162 | - platform: wifi_signal
163 | name: "SlimmeLezer Wi-Fi Signal"
164 | update_interval: 60s
165 |
166 | text_sensor:
167 | - platform: dsmr
168 | identification:
169 | name: "DSMR Identification"
170 | p1_version:
171 | name: "DSMR Version"
172 | p1_version_be:
173 | name: "DSMR Version Belgium"
174 | - platform: wifi_info
175 | ip_address:
176 | name: "SlimmeLezer IP Address"
177 | ssid:
178 | name: "SlimmeLezer Wi-Fi SSID"
179 | bssid:
180 | name: "SlimmeLezer Wi-Fi BSSID"
181 | - platform: version
182 | name: "ESPHome Version"
183 | hide_timestamp: true
184 |
--------------------------------------------------------------------------------
/slimmelezer-be.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | substitutions:
3 | device_name: slimmelezer
4 |
5 | esphome:
6 | name: ${device_name}
7 | platform: ESP8266
8 | esp8266_restore_from_flash: true
9 | board: d1_mini
10 | name_add_mac_suffix: false
11 | project:
12 | name: zuidwijk.slimmelezer
13 | version: "1.2"
14 |
15 | wifi:
16 | # remove leading '#' and fill in your wifi details
17 | # ssid: !secret wifi_ssid
18 | # password: !secret wifi_password
19 |
20 | # Enable fallback hotspot (captive portal) in case wifi connection fails
21 | ap:
22 | ssid: ${device_name}
23 |
24 | captive_portal:
25 |
26 | # Enable logging
27 | logger:
28 | baud_rate: 0
29 |
30 | # Enable Home Assistant API
31 | api:
32 |
33 | ota:
34 |
35 | dashboard_import:
36 | package_import_url: github://zuidwijk/dsmr/slimmelezer-be.yaml@main
37 | import_full_config: true
38 |
39 | web_server:
40 | port: 80
41 |
42 | uart:
43 | baud_rate: 115200
44 | rx_pin: D7
45 | rx_buffer_size: 1700
46 |
47 | dsmr:
48 | id: dsmr_instance
49 | max_telegram_length: 1700
50 |
51 | sensor:
52 | - platform: dsmr
53 | energy_delivered_tariff1:
54 | name: "Energy Consumed Tariff 1"
55 | energy_delivered_tariff2:
56 | name: "Energy Consumed Tariff 2"
57 | energy_returned_tariff1:
58 | name: "Energy Produced Tariff 1"
59 | energy_returned_tariff2:
60 | name: "Energy Produced Tariff 2"
61 | power_delivered:
62 | name: "Power Consumed"
63 | accuracy_decimals: 3
64 | power_returned:
65 | name: "Power Produced"
66 | accuracy_decimals: 3
67 | voltage_l1:
68 | name: "Voltage Phase 1"
69 | voltage_l2:
70 | name: "Voltage Phase 2"
71 | voltage_l3:
72 | name: "Voltage Phase 3"
73 | current_l1:
74 | name: "Current Phase 1"
75 | current_l2:
76 | name: "Current Phase 2"
77 | current_l3:
78 | name: "Current Phase 3"
79 | power_delivered_l1:
80 | name: "Power Consumed Phase 1"
81 | accuracy_decimals: 3
82 | power_delivered_l2:
83 | name: "Power Consumed Phase 2"
84 | accuracy_decimals: 3
85 | power_delivered_l3:
86 | name: "Power Consumed Phase 3"
87 | accuracy_decimals: 3
88 | power_returned_l1:
89 | name: "Power Produced Phase 1"
90 | accuracy_decimals: 3
91 | power_returned_l2:
92 | name: "Power Produced Phase 2"
93 | accuracy_decimals: 3
94 | power_returned_l3:
95 | name: "Power Produced Phase 3"
96 | accuracy_decimals: 3
97 | gas_delivered_be:
98 | name: "Gas Consumed Belgium"
99 | active_energy_import_current_average_demand:
100 | name: "Peak Current Average Quarterly Demand"
101 | icon: mdi:chart-sankey
102 | active_energy_import_maximum_demand_running_month:
103 | name: "Peak Month Maximum Quarterly Demand"
104 | icon: mdi:chart-sankey
105 | active_energy_import_maximum_demand_last_13_months:
106 | name: "Peak 13 Month Maximum Quarterly Demand"
107 | icon: mdi:chart-sankey
108 | - platform: uptime
109 | name: "${device_name} Uptime"
110 | - platform: wifi_signal
111 | name: "${device_name} Wi-Fi Signal"
112 | update_interval: 60s
113 |
114 | text_sensor:
115 | - platform: dsmr
116 | identification:
117 | name: "DSMR Identification"
118 | p1_version_be:
119 | name: "DSMR Version Belgium"
120 | electricity_tariff:
121 | name: "DSMR Tariff"
122 | message_long:
123 | name: "DSMR Message Long"
124 | icon: mdi:message-text-outline
125 | - platform: wifi_info
126 | ip_address:
127 | name: "SlimmeLezer IP Address"
128 | ssid:
129 | name: "SlimmeLezer Wi-Fi SSID"
130 | bssid:
131 | name: "SlimmeLezer Wi-Fi BSSID"
132 | - platform: version
133 | name: "ESPHome Version"
134 | hide_timestamp: true
135 |
--------------------------------------------------------------------------------
/slimmelezer-test.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | substitutions:
3 | device_name: slimmelezer-test
4 |
5 | esphome:
6 | name: ${device_name}
7 | platform: ESP8266
8 | esp8266_restore_from_flash: true
9 | board: d1_mini
10 | name_add_mac_suffix: false
11 | project:
12 | name: zuidwijk.slimmelezer
13 | version: "2.0"
14 | on_boot:
15 | then:
16 | - if:
17 | condition:
18 | lambda: return id(has_key);
19 | then:
20 | - lambda: |-
21 | std::string key(id(stored_decryption_key), 32);
22 | id(dsmr_instance).set_decryption_key(key);
23 | else:
24 | - logger.log:
25 | level: info
26 | format: "Not using decryption key. If you need to set a key use Home Assistant service 'ESPHome: ${device_name}_set_dsmr_key'"
27 |
28 | wifi:
29 | ap:
30 | ssid: ${device_name}
31 |
32 | captive_portal:
33 |
34 | # Enable logging
35 | logger:
36 | baud_rate: 0
37 |
38 | # Enable Home Assistant API
39 | api:
40 | services:
41 | service: set_dsmr_key
42 | variables:
43 | private_key: string
44 | then:
45 | - logger.log:
46 | format: Setting private key %s. Set to empty string to disable
47 | args: [private_key.c_str()]
48 | - globals.set:
49 | id: has_key
50 | value: !lambda "return private_key.length() == 32;"
51 | - lambda: |-
52 | if (private_key.length() == 32)
53 | private_key.copy(id(stored_decryption_key), 32);
54 | id(dsmr_instance).set_decryption_key(private_key);
55 |
56 | ota:
57 |
58 | dashboard_import:
59 | package_import_url: github://zuidwijk/dsmr/slimmelezer-test.yaml@main
60 |
61 | web_server:
62 | port: 80
63 |
64 | uart:
65 | baud_rate: 115200
66 | rx_pin: D7
67 | rx_buffer_size: 1700
68 |
69 | globals:
70 | - id: has_key
71 | type: bool
72 | restore_value: yes
73 | initial_value: "false"
74 | - id: stored_decryption_key
75 | type: char[32]
76 | restore_value: yes
77 |
78 | dsmr:
79 | id: dsmr_instance
80 | max_telegram_length: 1700
81 | # For Luxembourg users set here your decryption key
82 | #decryption_key: !secret decryption_key // enable this when using decryption for Luxembourg; key like '00112233445566778899AABBCCDDEEFF'
83 |
84 | sensor:
85 | - platform: dsmr
86 | energy_delivered_lux:
87 | name: "Energy Consumed Luxembourg"
88 | energy_delivered_tariff1:
89 | name: "Energy Consumed Tariff 1"
90 | energy_delivered_tariff2:
91 | name: "Energy Consumed Tariff 2"
92 | energy_returned_lux:
93 | name: "Energy Produced Luxembourg"
94 | energy_returned_tariff1:
95 | name: "Energy Produced Tariff 1"
96 | energy_returned_tariff2:
97 | name: "Energy Produced Tariff 2"
98 | power_delivered:
99 | name: "Power Consumed"
100 | accuracy_decimals: 3
101 | power_returned:
102 | name: "Power Produced"
103 | accuracy_decimals: 3
104 | electricity_failures:
105 | name: "Electricity Failures"
106 | icon: mdi:alert
107 | electricity_long_failures:
108 | name: "Long Electricity Failures"
109 | icon: mdi:alert
110 | voltage_l1:
111 | name: "Voltage Phase 1"
112 | voltage_l2:
113 | name: "Voltage Phase 2"
114 | voltage_l3:
115 | name: "Voltage Phase 3"
116 | current_l1:
117 | name: "Current Phase 1"
118 | current_l2:
119 | name: "Current Phase 2"
120 | current_l3:
121 | name: "Current Phase 3"
122 | power_delivered_l1:
123 | name: "Power Consumed Phase 1"
124 | accuracy_decimals: 3
125 | power_delivered_l2:
126 | name: "Power Consumed Phase 2"
127 | accuracy_decimals: 3
128 | power_delivered_l3:
129 | name: "Power Consumed Phase 3"
130 | accuracy_decimals: 3
131 | power_returned_l1:
132 | name: "Power Produced Phase 1"
133 | accuracy_decimals: 3
134 | power_returned_l2:
135 | name: "Power Produced Phase 2"
136 | accuracy_decimals: 3
137 | power_returned_l3:
138 | name: "Power Produced Phase 3"
139 | accuracy_decimals: 3
140 | gas_delivered:
141 | name: "Gas Consumed"
142 | gas_delivered_be:
143 | name: "Gas Consumed Belgium"
144 | - platform: uptime
145 | name: "SlimmeLezer Uptime"
146 | - platform: wifi_signal
147 | name: "SlimmeLezer Wi-Fi Signal"
148 | update_interval: 60s
149 |
150 | text_sensor:
151 | - platform: dsmr
152 | identification:
153 | name: "DSMR Identification"
154 | p1_version:
155 | name: "DSMR Version"
156 | p1_version_be:
157 | name: "DSMR Version Belgium"
158 | - platform: wifi_info
159 | ip_address:
160 | name: "SlimmeLezer IP Address"
161 | ssid:
162 | name: "SlimmeLezer Wi-Fi SSID"
163 | bssid:
164 | name: "SlimmeLezer Wi-Fi BSSID"
165 | - platform: version
166 | name: "ESPHome Version"
167 | hide_timestamp: true
168 |
--------------------------------------------------------------------------------
/slimmelezer.old.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | substitutions:
3 | device_name: slimmelezer
4 |
5 | esphome:
6 | name: ${device_name}
7 | platform: ESP8266
8 | esp8266_restore_from_flash: true
9 | board: d1_mini
10 | name_add_mac_suffix: false
11 | project:
12 | name: zuidwijk.slimmelezer
13 | version: "1.2"
14 | on_boot:
15 | then:
16 | - if:
17 | condition:
18 | lambda: return id(has_key);
19 | then:
20 | - lambda: |-
21 | std::string key(id(stored_decryption_key), 32);
22 | id(dsmr_instance).set_decryption_key(key);
23 | else:
24 | - logger.log:
25 | level: info
26 | format: "Not using decryption key. If you need to set a key use Home Assistant service 'ESPHome: ${device_name}_set_dsmr_key'"
27 |
28 | wifi:
29 | # remove leading '#' and fill in your wifi details
30 | # ssid: !secret wifi_ssid
31 | # password: !secret wifi_password
32 |
33 | # Enable fallback hotspot (captive portal) in case wifi connection fails
34 | ap:
35 | ssid: ${device_name}
36 |
37 | captive_portal:
38 |
39 | # Enable logging
40 | logger:
41 | baud_rate: 0
42 |
43 | # Enable Home Assistant API
44 | api:
45 | services:
46 | service: set_dsmr_key
47 | variables:
48 | private_key: string
49 | then:
50 | - logger.log:
51 | format: Setting private key %s. Set to empty string to disable
52 | args: [private_key.c_str()]
53 | - globals.set:
54 | id: has_key
55 | value: !lambda "return private_key.length() == 32;"
56 | - lambda: |-
57 | if (private_key.length() == 32)
58 | private_key.copy(id(stored_decryption_key), 32);
59 | id(dsmr_instance).set_decryption_key(private_key);
60 |
61 | ota:
62 | platform: esphome
63 |
64 | dashboard_import:
65 | package_import_url: github://zuidwijk/dsmr/slimmelezer.yaml@main
66 | import_full_config: true
67 |
68 | web_server:
69 | port: 80
70 |
71 | uart:
72 | baud_rate: 115200
73 | rx_pin: D7
74 | rx_buffer_size: 1700
75 |
76 | globals:
77 | - id: has_key
78 | type: bool
79 | restore_value: yes
80 | initial_value: "false"
81 | - id: stored_decryption_key
82 | type: char[32]
83 | restore_value: yes
84 |
85 | dsmr:
86 | id: dsmr_instance
87 | max_telegram_length: 1700
88 | # For Luxembourg users set here your decryption key
89 | #decryption_key: !secret decryption_key // enable this when using decryption for Luxembourg; key like '00112233445566778899AABBCCDDEEFF'
90 |
91 | sensor:
92 | - platform: dsmr
93 | energy_delivered_lux:
94 | name: "Energy Consumed Luxembourg"
95 | energy_delivered_tariff1:
96 | name: "Energy Consumed Tariff 1"
97 | energy_delivered_tariff2:
98 | name: "Energy Consumed Tariff 2"
99 | energy_returned_lux:
100 | name: "Energy Produced Luxembourg"
101 | energy_returned_tariff1:
102 | name: "Energy Produced Tariff 1"
103 | energy_returned_tariff2:
104 | name: "Energy Produced Tariff 2"
105 | power_delivered:
106 | name: "Power Consumed"
107 | accuracy_decimals: 3
108 | power_returned:
109 | name: "Power Produced"
110 | accuracy_decimals: 3
111 | electricity_failures:
112 | name: "Electricity Failures"
113 | icon: mdi:alert
114 | electricity_long_failures:
115 | name: "Long Electricity Failures"
116 | icon: mdi:alert
117 | voltage_l1:
118 | name: "Voltage Phase 1"
119 | voltage_l2:
120 | name: "Voltage Phase 2"
121 | voltage_l3:
122 | name: "Voltage Phase 3"
123 | current_l1:
124 | name: "Current Phase 1"
125 | current_l2:
126 | name: "Current Phase 2"
127 | current_l3:
128 | name: "Current Phase 3"
129 | power_delivered_l1:
130 | name: "Power Consumed Phase 1"
131 | accuracy_decimals: 3
132 | power_delivered_l2:
133 | name: "Power Consumed Phase 2"
134 | accuracy_decimals: 3
135 | power_delivered_l3:
136 | name: "Power Consumed Phase 3"
137 | accuracy_decimals: 3
138 | power_returned_l1:
139 | name: "Power Produced Phase 1"
140 | accuracy_decimals: 3
141 | power_returned_l2:
142 | name: "Power Produced Phase 2"
143 | accuracy_decimals: 3
144 | power_returned_l3:
145 | name: "Power Produced Phase 3"
146 | accuracy_decimals: 3
147 | gas_delivered:
148 | name: "Gas Consumed"
149 | gas_delivered_be:
150 | name: "Gas Consumed Belgium"
151 | - platform: uptime
152 | name: "SlimmeLezer Uptime"
153 | - platform: wifi_signal
154 | name: "SlimmeLezer Wi-Fi Signal"
155 | update_interval: 60s
156 |
157 | text_sensor:
158 | - platform: dsmr
159 | identification:
160 | name: "DSMR Identification"
161 | p1_version:
162 | name: "DSMR Version"
163 | p1_version_be:
164 | name: "DSMR Version Belgium"
165 | - platform: wifi_info
166 | ip_address:
167 | name: "SlimmeLezer IP Address"
168 | ssid:
169 | name: "SlimmeLezer Wi-Fi SSID"
170 | bssid:
171 | name: "SlimmeLezer Wi-Fi BSSID"
172 | - platform: version
173 | name: "ESPHome Version"
174 | hide_timestamp: true
175 |
--------------------------------------------------------------------------------
/slimmelezer.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | substitutions:
3 | device_name: slimmelezer
4 |
5 | esphome:
6 | name: ${device_name}
7 | name_add_mac_suffix: false
8 | project:
9 | name: zuidwijk.slimmelezer
10 | version: "2.0"
11 | on_boot:
12 | then:
13 | - if:
14 | condition:
15 | lambda: return id(has_key);
16 | then:
17 | - lambda: |-
18 | std::string key(id(stored_decryption_key), 32);
19 | id(dsmr_instance).set_decryption_key(key);
20 | else:
21 | - logger.log:
22 | level: info
23 | format: "Not using decryption key. If you need to set a key use Home Assistant service 'ESPHome: ${device_name}_set_dsmr_key'"
24 |
25 | esp8266:
26 | restore_from_flash: true
27 | board: d1_mini
28 |
29 | wifi:
30 | # remove leading '#' and fill in your wifi details !!
31 | # ssid: !secret wifi_ssid
32 | # password: !secret wifi_password
33 |
34 | # Enable fallback hotspot (captive portal) in case wifi connection fails
35 | ap:
36 | ssid: ${device_name}
37 |
38 | # Powersaving for brownout due to 250mA restriction P1
39 | output_power: 14dB
40 |
41 | captive_portal:
42 |
43 | # Enable logging
44 | logger:
45 | baud_rate: 0
46 | # logs:
47 | # component: ERROR
48 |
49 | # Enable Home Assistant API
50 | api:
51 | services:
52 | service: set_dsmr_key
53 | variables:
54 | private_key: string
55 | then:
56 | - logger.log:
57 | format: Setting private key %s. Set to empty string to disable
58 | args: [private_key.c_str()]
59 | - globals.set:
60 | id: has_key
61 | value: !lambda "return private_key.length() == 32;"
62 | - lambda: |-
63 | if (private_key.length() == 32)
64 | private_key.copy(id(stored_decryption_key), 32);
65 | id(dsmr_instance).set_decryption_key(private_key);
66 |
67 | ota:
68 | platform: esphome
69 |
70 | dashboard_import:
71 | package_import_url: github://zuidwijk/dsmr/slimmelezer.yaml@main
72 | import_full_config: true
73 |
74 | web_server:
75 | port: 80
76 |
77 | uart:
78 | baud_rate: 115200
79 | rx_pin: D7
80 | rx_buffer_size: 1700
81 |
82 | globals:
83 | - id: has_key
84 | type: bool
85 | restore_value: yes
86 | initial_value: "false"
87 | - id: stored_decryption_key
88 | type: char[32]
89 | restore_value: yes
90 |
91 | dsmr:
92 | id: dsmr_instance
93 | max_telegram_length: 1700
94 | # For Luxembourg users set here your decryption key
95 | #decryption_key: !secret decryption_key // enable this when using decryption for Luxembourg; key like '00112233445566778899AABBCCDDEEFF'
96 |
97 | sensor:
98 | - platform: dsmr
99 | energy_delivered_lux:
100 | name: "Energy Consumed Luxembourg"
101 | energy_delivered_tariff1:
102 | name: "Energy Consumed Tariff 1"
103 | energy_delivered_tariff2:
104 | name: "Energy Consumed Tariff 2"
105 | energy_returned_lux:
106 | name: "Energy Produced Luxembourg"
107 | energy_returned_tariff1:
108 | name: "Energy Produced Tariff 1"
109 | energy_returned_tariff2:
110 | name: "Energy Produced Tariff 2"
111 | power_delivered:
112 | name: "Power Consumed"
113 | accuracy_decimals: 3
114 | power_returned:
115 | name: "Power Produced"
116 | accuracy_decimals: 3
117 | electricity_failures:
118 | name: "Electricity Failures"
119 | icon: mdi:alert
120 | electricity_long_failures:
121 | name: "Long Electricity Failures"
122 | icon: mdi:alert
123 | voltage_l1:
124 | name: "Voltage Phase 1"
125 | voltage_l2:
126 | name: "Voltage Phase 2"
127 | voltage_l3:
128 | name: "Voltage Phase 3"
129 | current_l1:
130 | name: "Current Phase 1"
131 | current_l2:
132 | name: "Current Phase 2"
133 | current_l3:
134 | name: "Current Phase 3"
135 | power_delivered_l1:
136 | name: "Power Consumed Phase 1"
137 | accuracy_decimals: 3
138 | power_delivered_l2:
139 | name: "Power Consumed Phase 2"
140 | accuracy_decimals: 3
141 | power_delivered_l3:
142 | name: "Power Consumed Phase 3"
143 | accuracy_decimals: 3
144 | power_returned_l1:
145 | name: "Power Produced Phase 1"
146 | accuracy_decimals: 3
147 | power_returned_l2:
148 | name: "Power Produced Phase 2"
149 | accuracy_decimals: 3
150 | power_returned_l3:
151 | name: "Power Produced Phase 3"
152 | accuracy_decimals: 3
153 | gas_delivered:
154 | name: "Gas Consumed"
155 | gas_delivered_be:
156 | name: "Gas Consumed Belgium"
157 | - platform: uptime
158 | name: "SlimmeLezer Uptime"
159 | - platform: wifi_signal
160 | name: "SlimmeLezer Wi-Fi Signal"
161 | update_interval: 60s
162 |
163 | text_sensor:
164 | - platform: dsmr
165 | identification:
166 | name: "DSMR Identification"
167 | p1_version:
168 | name: "DSMR Version"
169 | p1_version_be:
170 | name: "DSMR Version Belgium"
171 | # timestamp:
172 | # name: "Timestamp"
173 | - platform: wifi_info
174 | ip_address:
175 | name: "SlimmeLezer IP Address"
176 | ssid:
177 | name: "SlimmeLezer Wi-Fi SSID"
178 | bssid:
179 | name: "SlimmeLezer Wi-Fi BSSID"
180 | - platform: version
181 | name: "ESPHome Version"
182 | hide_timestamp: true
183 |
--------------------------------------------------------------------------------