├── .gitignore
├── screenshots
├── opend_dtu_rest_example.JPG
├── opendtu_rest_integation.JPG
├── opendtu_visualisation_example.JPG
└── SCREENSHOTS.md
├── examples
├── api_eventlog_status.json
├── api_power_status.json
├── api_limit_status.json
├── api_ntp_status.json
├── api_network_status.json
├── api_mqtt_status.json
├── api_system_status.json
├── api_livedata_status.json
└── api_livedata_status_inverter0.json
├── docs
├── HARDWARE.md
├── SERVER.md
├── INTEGRATION.md
└── HOMEASSISTANT.md
├── src
├── configuration.yaml
├── opendtu
│ ├── opendtu_eventlog_per_inverter.yaml
│ ├── opendtu_status_per_inverter.yaml
│ ├── opendtu_livedata.yaml
│ ├── opendtu_livedata_inverter0.yaml
│ ├── opendtu_livedata_inverter1.yaml
│ ├── opendtu_livedata_inverter2.yaml
│ └── opendtu_status.yaml
└── dashboard
│ ├── opendtu_inverters.yaml
│ └── opendt.yaml
├── LICENSE
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | /.idea/
2 | *.iml
3 |
4 |
--------------------------------------------------------------------------------
/screenshots/opend_dtu_rest_example.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/berndwaibel/HomeAssistantOpenDTU/HEAD/screenshots/opend_dtu_rest_example.JPG
--------------------------------------------------------------------------------
/screenshots/opendtu_rest_integation.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/berndwaibel/HomeAssistantOpenDTU/HEAD/screenshots/opendtu_rest_integation.JPG
--------------------------------------------------------------------------------
/screenshots/opendtu_visualisation_example.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/berndwaibel/HomeAssistantOpenDTU/HEAD/screenshots/opendtu_visualisation_example.JPG
--------------------------------------------------------------------------------
/examples/api_eventlog_status.json:
--------------------------------------------------------------------------------
1 | {
2 | "count": 1,
3 | "events": [
4 | {
5 | "message_id": 1,
6 | "message": "Inverter start",
7 | "start_time": 20977,
8 | "end_time": 20977
9 | }
10 | ]
11 | }
--------------------------------------------------------------------------------
/examples/api_power_status.json:
--------------------------------------------------------------------------------
1 | {
2 | "123456789001": {
3 | "power_set_status": "Ok"
4 | },
5 | "123456789002": {
6 | "power_set_status": "Ok"
7 | },
8 | "123456789003": {
9 | "power_set_status": "Ok"
10 | }
11 | }
--------------------------------------------------------------------------------
/examples/api_limit_status.json:
--------------------------------------------------------------------------------
1 | {
2 | "123456789001": {
3 | "limit_relative": 88,
4 | "max_power": 300,
5 | "limit_set_status": "Ok"
6 | },
7 | "123456789002": {
8 | "limit_relative": 88,
9 | "max_power": 300,
10 | "limit_set_status": "Ok"
11 | },
12 | "123456789003": {
13 | "limit_relative": 88,
14 | "max_power": 300,
15 | "limit_set_status": "Ok"
16 | }
17 | }
--------------------------------------------------------------------------------
/examples/api_ntp_status.json:
--------------------------------------------------------------------------------
1 | {
2 | "ntp_server": "opendtu.pool.ntp.org",
3 | "ntp_timezone": "CET-1CEST,M3.5.0,M10.5.0/3",
4 | "ntp_timezone_descr": "Europe/Berlin",
5 | "ntp_status": true,
6 | "ntp_localtime": "Sunday, February 23 2025 22:25:53",
7 | "sun_risetime": "Sunday, February 23 2025 06:03:00",
8 | "sun_settime": "Sunday, February 23 2025 19:00:00",
9 | "sun_isSunsetAvailable": true,
10 | "sun_isDayPeriod": false
11 | }
--------------------------------------------------------------------------------
/docs/HARDWARE.md:
--------------------------------------------------------------------------------
1 | # OpenDTU and Shelly for photovoltaic systems - Integration into HomeAssistant
2 |
3 | ## Hardware
4 |
5 | My photovoltaic system consists off:
6 | * 3 x 400 Watt panels
7 | * 3 x 300 Watt Hoymiles inverter (limited to 800 Watt at all)
8 | * 3 * mount stand for the panels
9 | * extended cable from inverter to electrical outlet
10 | * 1 x Shelly Plus 1pm for measuring of the power outlet
11 | * 1 x OpenDTU for configuration of the inverters, and alos for measuring of the power outlet
12 | * 1 x Synology NAS DS224+ with 16 GByte memory extension as server for home assisant (running as virual machine=
13 |
14 |
--------------------------------------------------------------------------------
/examples/api_network_status.json:
--------------------------------------------------------------------------------
1 | {
2 | "sta_status": true,
3 | "sta_ssid": "FRITZ!Box 7560 SH",
4 | "sta_bssid": "C0:25:06:CE:04:03",
5 | "sta_rssi": -60,
6 | "network_hostname": "OpenDTU-28C110",
7 | "network_ip": "192.168.178.15",
8 | "network_netmask": "255.255.255.0",
9 | "network_gateway": "192.168.178.1",
10 | "network_dns1": "192.168.178.1",
11 | "network_dns2": "0.0.0.0",
12 | "network_mac": "B0:A7:32:28:C1:10",
13 | "network_mode": "Station",
14 | "ap_status": false,
15 | "ap_ssid": "OpenDTU-2670864",
16 | "ap_ip": "192.168.4.1",
17 | "ap_mac": "B0:A7:32:28:C1:11",
18 | "ap_stationnum": 0
19 | }
--------------------------------------------------------------------------------
/src/configuration.yaml:
--------------------------------------------------------------------------------
1 | # Loads default set of integrations. Do not remove.
2 | default_config:
3 |
4 | # Load frontend themes from the themes folder
5 | frontend:
6 | themes: !include_dir_merge_named themes
7 |
8 | automation: !include automations.yaml
9 | script: !include scripts.yaml
10 | scene: !include scenes.yaml
11 |
12 | # Added for REST Api Integration for OpenDTU
13 | # The integration name "rest:" must appear hear, but belongs to the opendtu.yaml
14 | rest: !include_dir_merge_list opendtu/
15 |
16 | # Add cloudflare for VPN Tunnel using cloudflared add-on
17 | # The trusted proxy is the local docker network
18 | http:
19 | ip_ban_enabled: true
20 | login_attempts_threshold: 5
21 | use_x_forwarded_for: true
22 | trusted_proxies:
23 | - 172.30.33.0/24
24 |
--------------------------------------------------------------------------------
/screenshots/SCREENSHOTS.md:
--------------------------------------------------------------------------------
1 | # OpenDTU Screenshots
2 | Here are some unsorted screenshots as example.
3 |
4 | ---
5 |
6 | You need to install the REST integration, which should look like this:
7 | 
8 |
9 | ---
10 |
11 | Some visualisation added:
12 |
13 | Btw: You could see, that my 3rd panel is not fully exposed to the sun, it is "shaded" and produces less Watt than possible.
14 | This shows me, that I should move the panel to another position (without shade).
15 |
16 | 
17 |
18 | ---
19 |
20 | The direct call (without Home Assistant) to your OpenDTU should show something like this:
21 |
22 | Btw: The "limit_relative" shown here is 88%, which ist 264 Watt.
23 | In germany you are allowed 800 Watt at all, so 3*264=792 is below 800 Watt.
24 | You could set this limit using OpenDTU, but I did not include this into the integration currently.
25 |
26 | 
27 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025 Bernd Waibel
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/examples/api_mqtt_status.json:
--------------------------------------------------------------------------------
1 | {
2 | "mqtt_enabled": false,
3 | "mqtt_hostname": "",
4 | "mqtt_port": 1883,
5 | "mqtt_clientid": "OpenDTU-2670864",
6 | "mqtt_username": "",
7 | "mqtt_topic": "solar/",
8 | "mqtt_connected": false,
9 | "mqtt_retain": true,
10 | "mqtt_tls": false,
11 | "mqtt_root_ca_cert_info": "cert. version : 3\nserial number : 82:10:CF:B0:D2:40:E3:59:44:63:E0:BB:63:82:8B:00\nissuer name : C=US, O=Internet Security Research Group, CN=ISRG Root X1\nsubject name : C=US, O=Internet Security Research Group, CN=ISRG Root X1\nissued on : 2015-06-04 11:04:38\nexpires on : 2035-06-04 11:04:38\nsigned using : RSA with SHA-256\nRSA key size : 4096 bits\nbasic constraints : CA=true\nkey usage : Key Cert Sign, CRL Sign\n",
12 | "mqtt_tls_cert_login": false,
13 | "mqtt_client_cert_info": "",
14 | "mqtt_lwt_topic": "solar/dtu/status",
15 | "mqtt_publish_interval": 5,
16 | "mqtt_clean_session": true,
17 | "mqtt_hass_enabled": false,
18 | "mqtt_hass_expire": true,
19 | "mqtt_hass_retain": true,
20 | "mqtt_hass_topic": "homeassistant/",
21 | "mqtt_hass_individualpanels": false
22 | }
--------------------------------------------------------------------------------
/src/opendtu/opendtu_eventlog_per_inverter.yaml:
--------------------------------------------------------------------------------
1 | ## Read the state objects of OpenDTU using REST Integration
2 | ## Each inverter needs to be listed here by serial numer (inv=*) !!!
3 | ## See also: https://www.opendtu.solar/firmware/web_api/
4 | ## The integration name "rest:" must appear in configuration.yaml, but belongs here, so it is not used here
5 | ## rest:
6 | - resource: http://192.168.178.15/api/eventlog/status?inv=112182216512
7 | method: GET
8 | scan_interval: 60
9 | headers:
10 | content-type: "application/json"
11 | sensor:
12 | ## EventLog
13 | - name: "OpenDTU event log inverter 1"
14 | value_template: "{{ value_json.count }}"
15 | json_attributes_path: "$[]"
16 | json_attributes:
17 | - events
18 | - resource: http://192.168.178.15/api/eventlog/status?inv=112182217151
19 | method: GET
20 | scan_interval: 60
21 | headers:
22 | content-type: "application/json"
23 | sensor:
24 | ## EventLog
25 | - name: "OpenDTU event log inverter 2"
26 | value_template: "{{ value_json.count }}"
27 | json_attributes_path: "$[]"
28 | json_attributes:
29 | - events
30 | - resource: http://192.168.178.15/api/eventlog/status?inv=112182217437
31 | method: GET
32 | scan_interval: 60
33 | headers:
34 | content-type: "application/json"
35 | sensor:
36 | ## EventLog
37 | - name: "OpenDTU event log inverter 3"
38 | value_template: "{{ value_json.count }}"
39 | json_attributes_path: "$[]"
40 | json_attributes:
41 | - events
42 |
--------------------------------------------------------------------------------
/examples/api_system_status.json:
--------------------------------------------------------------------------------
1 | {
2 | "hostname": "OpenDTU-28C110",
3 | "sdkversion": "v4.4.7-dirty",
4 | "cpufreq": 240,
5 | "cputemp": 58.33334,
6 | "heap_total": 283112,
7 | "heap_used": 132952,
8 | "heap_max_block": 106484,
9 | "heap_min_free": 94724,
10 | "psram_total": 0,
11 | "psram_used": 0,
12 | "sketch_total": 1966080,
13 | "sketch_used": 1753712,
14 | "littlefs_total": 196608,
15 | "littlefs_used": 24576,
16 | "chiprevision": 3,
17 | "chipmodel": "ESP32-D0WD-V3",
18 | "chipcores": 2,
19 | "flashsize": 4194304,
20 | "task_details": [
21 | {
22 | "name": "IDLE0",
23 | "stack_watermark": 432,
24 | "priority": 0
25 | },
26 | {
27 | "name": "IDLE1",
28 | "stack_watermark": 552,
29 | "priority": 0
30 | },
31 | {
32 | "name": "wifi",
33 | "stack_watermark": 4412,
34 | "priority": 23
35 | },
36 | {
37 | "name": "tiT",
38 | "stack_watermark": 1404,
39 | "priority": 18
40 | },
41 | {
42 | "name": "loopTask",
43 | "stack_watermark": 5596,
44 | "priority": 1
45 | },
46 | {
47 | "name": "async_tcp",
48 | "stack_watermark": 12084,
49 | "priority": 10
50 | },
51 | {
52 | "name": "mqttclient",
53 | "stack_watermark": 5880,
54 | "priority": 1
55 | }
56 | ],
57 | "resetreason_0": "Software reset CPU",
58 | "resetreason_1": "Software reset CPU",
59 | "cfgsavecount": 50,
60 | "config_version": "0.1.29",
61 | "git_hash": "v25.2.3",
62 | "pioenv": "generic_esp32",
63 | "uptime": 9062,
64 | "nrf_configured": true,
65 | "nrf_connected": true,
66 | "nrf_pvariant": true,
67 | "cmt_configured": false,
68 | "cmt_connected": false
69 | }
--------------------------------------------------------------------------------
/examples/api_livedata_status.json:
--------------------------------------------------------------------------------
1 | {
2 | "inverters": [
3 | {
4 | "serial": "112182216512",
5 | "name": "PV Garage links vorne",
6 | "order": 0,
7 | "data_age": 9139,
8 | "poll_enabled": true,
9 | "reachable": false,
10 | "producing": false,
11 | "limit_relative": 0,
12 | "limit_absolute": -1,
13 | "radio_stats": {
14 | "tx_request": 1135,
15 | "tx_re_request": 0,
16 | "rx_success": 0,
17 | "rx_fail_nothing": 1135,
18 | "rx_fail_partial": 0,
19 | "rx_fail_corrupt": 0,
20 | "rssi": -127
21 | }
22 | },
23 | {
24 | "serial": "112182217151",
25 | "name": "PV Garage rechts vorne",
26 | "order": 1,
27 | "data_age": 9139,
28 | "poll_enabled": true,
29 | "reachable": false,
30 | "producing": false,
31 | "limit_relative": 0,
32 | "limit_absolute": -1,
33 | "radio_stats": {
34 | "tx_request": 1135,
35 | "tx_re_request": 0,
36 | "rx_success": 0,
37 | "rx_fail_nothing": 1135,
38 | "rx_fail_partial": 0,
39 | "rx_fail_corrupt": 0,
40 | "rssi": -127
41 | }
42 | },
43 | {
44 | "serial": "112182217437",
45 | "name": "PV Garage links hinten",
46 | "order": 2,
47 | "data_age": 9139,
48 | "poll_enabled": true,
49 | "reachable": false,
50 | "producing": false,
51 | "limit_relative": 0,
52 | "limit_absolute": -1,
53 | "radio_stats": {
54 | "tx_request": 1133,
55 | "tx_re_request": 0,
56 | "rx_success": 0,
57 | "rx_fail_nothing": 1132,
58 | "rx_fail_partial": 0,
59 | "rx_fail_corrupt": 0,
60 | "rssi": -127
61 | }
62 | }
63 | ],
64 | "total": {
65 | "Power": {
66 | "v": 0,
67 | "u": "W",
68 | "d": 1
69 | },
70 | "YieldDay": {
71 | "v": 0,
72 | "u": "Wh",
73 | "d": 0
74 | },
75 | "YieldTotal": {
76 | "v": 0,
77 | "u": "kWh",
78 | "d": 3
79 | }
80 | },
81 | "hints": {
82 | "time_sync": false,
83 | "radio_problem": false,
84 | "default_password": false,
85 | "pin_mapping_issue": false
86 | }
87 | }
--------------------------------------------------------------------------------
/docs/SERVER.md:
--------------------------------------------------------------------------------
1 | # OpenDTU and Shelly for photovoltaic systems - Integration into HomeAssistant
2 |
3 | ## Integration using a own server hardware and HomeAssistant
4 | For running HomeAssistant you need to have a dedicated server. The following options are possible:
5 | 1. a Rasperry Device with external disk storage and power supply
6 | 2. a ThinClient als server
7 | 3. a Synology NAS (oder a QNap NAS) with support for virual machines.
8 |
9 | ### Rasperry
10 | For using **Rasperry** I need to attach an external storage, and a power supply.
11 | However, I would like to have a case for the device.
12 | That seems to be possible, but to install this permanently would be time consuming.
13 | Using the Home Assistant Blue/Green/Yellow would be an option. But this seems to get more expensive than expected.
14 |
15 | ### Thin Clients
16 | I thought about using a used **Thin Clients**, as this should be not to expensive.
17 | They normally are not consuming much energy, as they have passive cooling. And it comes with a case.
18 | The hardware will run 24/7, so should not be energy consuming.
19 | After some time searching the internet, I could not figure out which hardware would be useful for mee,
20 | so I skipped this idea.
21 |
22 | ### NAS System
23 | I decided to use a **Synology NAS**, because I would also need to setup a permanent data backup solution.
24 | On work I used Synology before, so I decided to buy one. QNap would be fine, too.
25 | Important for the usage for HomeAssistant is, that the NAS need to support virtual machines.
26 |
27 | So I bought a DS224+. The "plus" is important, as the plus models could be extended with memory.
28 | The included 2GB standard memory is completely used by the NAS itself, so it could not be used for any virtual machine.
29 | So I extended it with 16 GByte more. There is a good video about, and I used exactly the RAM he recommeded.
30 |
31 | See: Synology DS224+ RAM Upgrade by Daniel Medic: https://www.youtube.com/watch?v=PdeafJfMXdw
32 |
33 | The installation of the virtual maschine for Home Assistant is described on the website from Home Assistant,
34 | and I just followed exactly the steps described there. For the Synology I used the "HAOS" on "other systems",
35 | and loaded the OVA file. See https://www.home-assistant.io/installation/alternative
36 |
--------------------------------------------------------------------------------
/src/opendtu/opendtu_status_per_inverter.yaml:
--------------------------------------------------------------------------------
1 | ## Read the state objects of OpenDTU using REST Integration
2 | ## Each inverter needs to be listed here by serial numer (inv=*) !!!
3 | ## See also: https://www.opendtu.solar/firmware/web_api/
4 | ## The integration name "rest:" must appear in configuration.yaml, but belongs here, so it is not used here
5 | ## rest:
6 | - resource: http://192.168.178.15/api/power/status
7 | method: GET
8 | scan_interval: 60
9 | headers:
10 | content-type: "application/json"
11 | sensor:
12 | ## Power Status - Value is for each inverter if the state is set (ok)
13 | - name: "OpenDTU power status inverter 1"
14 | value_template: "{{ value_json['112182216512'].power_set_status }}"
15 | - name: "OpenDTU power status inverter 2"
16 | value_template: "{{ value_json['112182217151'].power_set_status }}"
17 | - name: "OpenDTU power status inverter 3"
18 | value_template: "{{ value_json['112182217437'].power_set_status }}"
19 | - resource: http://192.168.178.15/api/limit/status
20 | method: GET
21 | scan_interval: 60
22 | headers:
23 | content-type: "application/json"
24 | sensor:
25 | ## Limit Status - Value is each inverter
26 | - name: "OpenDTU limit_relative inverter 1"
27 | value_template: "{{ value_json['112182216512'].limit_relative }}"
28 | unit_of_measurement: "%"
29 | device_class: power_factor
30 | - name: "OpenDTU max_power inverter 1"
31 | value_template: "{{ value_json['112182216512'].max_power }}"
32 | unit_of_measurement: "W"
33 | device_class: power
34 | - name: "OpenDTU limit_set_status inverter 1"
35 | value_template: "{{ value_json['112182216512'].limit_set_status }}"
36 | # device_class: None
37 | ## Limit Status - Value is each inverter
38 | - name: "OpenDTU limit_relative inverter 2"
39 | value_template: "{{ value_json['112182217151'].limit_relative }}"
40 | unit_of_measurement: "%"
41 | device_class: power_factor
42 | - name: "OpenDTU max_power inverter 2"
43 | value_template: "{{ value_json['112182217151'].max_power }}"
44 | unit_of_measurement: "W"
45 | device_class: power
46 | - name: "OpenDTU limit_set_status inverter 2"
47 | value_template: "{{ value_json['112182217151'].limit_set_status }}"
48 | # device_class: None
49 | ## Limit Status - Value is each inverter
50 | - name: "OpenDTU limit_relative inverter 3"
51 | value_template: "{{ value_json['112182217437'].limit_relative }}"
52 | unit_of_measurement: "%"
53 | device_class: power_factor
54 | - name: "OpenDTU max_power inverter 3"
55 | value_template: "{{ value_json['112182217437'].max_power }}"
56 | unit_of_measurement: "W"
57 | device_class: power
58 | - name: "OpenDTU limit_set_status inverter 3"
59 | value_template: "{{ value_json['112182217437'].limit_set_status }}"
60 | # device_class: None
61 |
--------------------------------------------------------------------------------
/docs/INTEGRATION.md:
--------------------------------------------------------------------------------
1 | # OpenDTU and Shelly for photovoltaic systems - Integration into HomeAssistant
2 |
3 | ## Possible integrations
4 | The integraton of the photovoltaic system is my first home automation project.
5 | As I would like to know, how much energy will be delivered, I had a look at the following integrations:
6 | Da ich auch wissen möchte, wie viel Strom ich erzeuge, habe ich folgende Integrationen mir angesehen:
7 | 1. Shelly Cloud
8 | 2. IOBroker
9 | 3. MQBroker or MQTT
10 | 4. Home Assistant
11 |
12 | ### Integration using Shelly devices and the Shelly Cloud
13 | At first I bought a Shelly1PM and integrated it into the power connection.
14 | The shelly device could be controlles with an handy app, which does a very good visualization of the data,
15 | also the controlling of the shelly devices is really easy (using the app or simply by using the homepage of the device.)
16 |
17 | The app uses the (chinese) Shelly cloud, but the software in the Shelly device, and also the app is perfect.
18 | Also, the long-running power summery in the app is a wonderful feature.
19 | The Shelly device come with an open api, so you do not need to use the cloud.
20 |
21 | At all, I like the shelly devices, and the software running on them, because they are open, well-designed and
22 | they are very flexible. The fact that the app is using the cloud is not a problem for me, as I use different clouds every day.
23 | But as it is not necessary, I used the solution with home assistant.
24 |
25 | Sometimes there seems to be a lag when using the app, cause the network connection from my phone to the cloud
26 | may not be always as stable as i which.
27 | After all, I decided to integrate the Shelly device directly into Home Assistant.
28 |
29 | ### Integration using ioBroker
30 | The integration using [ioBroker](https://www.iobroker.net/) seems more complex than Home Assistant,
31 | and maybe more limited. As I also want to integrate more and more devices (like doorbells, cameras, etc.)
32 | I deciced not to use ioBroker.
33 | Maybe I will set up this on my NAS sometimes.
34 |
35 | ### Integration using MQBroker or MQTT
36 | The integration using [MQTT](https://mqtt.org/) seems also to be limited.
37 | For visualization I need to setup Elastic and Grafana, which would be no problem, but is a little more effort,
38 | even for long time storage of the metrics. I use grafana and ELK on work.
39 | So I would like to do it, as it is interesting, but due to the effort I skipped this.
40 | Maybe I will set up this on my NAS sometimes.
41 |
42 | ### Integration using Home Assistant
43 | The integration using [Home Assistant](https://www.home-assistant.io/) seems to be the easiest way to solve the problem, and visualize the data
44 | even for longer time periods. So I set up Home Assistant as virual machine on my PC first.
45 | For Home Assistant there are a lot of integrations, so I decided to go on with this.
46 | The way of work is described on the page [HOMEASSISTANT.md](./HOMEASSISTANT.md)
47 |
--------------------------------------------------------------------------------
/examples/api_livedata_status_inverter0.json:
--------------------------------------------------------------------------------
1 | {
2 | "inverters": [
3 | {
4 | "serial": "112182216512",
5 | "name": "PV Garage links vorne",
6 | "order": 0,
7 | "data_age": 5,
8 | "poll_enabled": true,
9 | "reachable": true,
10 | "producing": false,
11 | "limit_relative": 0,
12 | "limit_absolute": -1,
13 | "radio_stats": {
14 | "tx_request": 1,
15 | "tx_re_request": 0,
16 | "rx_success": 0,
17 | "rx_fail_nothing": 0,
18 | "rx_fail_partial": 0,
19 | "rx_fail_corrupt": 0,
20 | "rssi": -127
21 | },
22 | "AC": {
23 | "0": {
24 | "Power": {
25 | "v": 0,
26 | "u": "W",
27 | "d": 1
28 | },
29 | "Voltage": {
30 | "v": 0,
31 | "u": "V",
32 | "d": 1
33 | },
34 | "Current": {
35 | "v": 0,
36 | "u": "A",
37 | "d": 2
38 | },
39 | "Frequency": {
40 | "v": 0,
41 | "u": "Hz",
42 | "d": 2
43 | },
44 | "PowerFactor": {
45 | "v": 0,
46 | "u": "",
47 | "d": 3
48 | },
49 | "ReactivePower": {
50 | "v": 0,
51 | "u": "var",
52 | "d": 1
53 | }
54 | }
55 | },
56 | "DC": {
57 | "0": {
58 | "name": {
59 | "u": ""
60 | },
61 | "Power": {
62 | "v": 0,
63 | "u": "W",
64 | "d": 1
65 | },
66 | "Voltage": {
67 | "v": 0,
68 | "u": "V",
69 | "d": 1
70 | },
71 | "Current": {
72 | "v": 0,
73 | "u": "A",
74 | "d": 2
75 | },
76 | "YieldDay": {
77 | "v": 0,
78 | "u": "Wh",
79 | "d": 0
80 | },
81 | "YieldTotal": {
82 | "v": 0,
83 | "u": "kWh",
84 | "d": 3
85 | }
86 | }
87 | },
88 | "INV": {
89 | "0": {
90 | "Power DC": {
91 | "v": 0,
92 | "u": "W",
93 | "d": 1
94 | },
95 | "YieldDay": {
96 | "v": 0,
97 | "u": "Wh",
98 | "d": 0
99 | },
100 | "YieldTotal": {
101 | "v": 0,
102 | "u": "kWh",
103 | "d": 3
104 | },
105 | "Temperature": {
106 | "v": 0,
107 | "u": "°C",
108 | "d": 1
109 | },
110 | "Efficiency": {
111 | "v": 0,
112 | "u": "%",
113 | "d": 3
114 | }
115 | }
116 | },
117 | "events": 0
118 | }
119 | ],
120 | "total": {
121 | "Power": {
122 | "v": 0,
123 | "u": "W",
124 | "d": 1
125 | },
126 | "YieldDay": {
127 | "v": 0,
128 | "u": "Wh",
129 | "d": 0
130 | },
131 | "YieldTotal": {
132 | "v": 0,
133 | "u": "kWh",
134 | "d": 3
135 | }
136 | },
137 | "hints": {
138 | "time_sync": false,
139 | "radio_problem": false,
140 | "default_password": false,
141 | "pin_mapping_issue": false
142 | }
143 | }
--------------------------------------------------------------------------------
/docs/HOMEASSISTANT.md:
--------------------------------------------------------------------------------
1 | # OpenDTU and Shelly for photovoltaic systems - Integration into HomeAssistant
2 |
3 | ## Integration using own hardware and HomeAssistant
4 | So I decide to user Home Assistant. For running Home Assistant you need to have a self hosted server.
5 | For hardware I decided to us a Synology NAS, details are described here: [SERVER.md](./SERVER.md).
6 |
7 | ## Integration of the devices into HomeAssistant
8 |
9 | At least I need to integrate to devices into Home Assistant:
10 | 1. Shelly 1PM
11 | 2. OpenDTU
12 |
13 | Both devices could measure the energy, which is produced by the photovoltaic systems. So they do the same, and
14 | one would be enough. But the OpenDTU could also be used to configure the Hoymiles inverters.
15 | It costs about 40 Euro, but the DTU from Hoymiles is about 100 Euro.
16 | As I would not like to have a bad looking case, I bought the OpenDTU pre-configured including a case.
17 | See here for details: https://shop.blinkyparts.com/de/OpenDTU-NRF-Deine-Auswertung-fuer-deine-Balkonsolaranlage-kompatibel-zu-Hoymiles-HM-Serie-NRF-Modul/blink237542
18 |
19 | ### Integration of the Shelly devices into HomeAssistant
20 | **Shelly** could be easily integrated into Home Assistant, including discovery.
21 | As there is not much to do, I do not describe the work I did for this.
22 |
23 | ### Integration of the OpenDTU device into HomeAssistant
24 | The **OpenDTU** device could not be easily integrated into Home Assistant, except via the MQTT protocol.
25 | As I would not like to measure only the energy, but also want to show some static data about the device,
26 | I decided to set up this project. The aim is to describe the concept and the solution,
27 | as there is limited context about this on the internet.
28 |
29 | At first, I tried to find a "plugin" or "integration" for the OpenDTU into Home Assistant.
30 | As I ordered und soldered the OpenDTU hardware for configure the inverters, I decided to integrate them.
31 |
32 | There are the following possibilities to integrate the OpenDTU into Home Assistant.
33 | 1. Integration using MQTT
34 | 2. Integration using a scrapping of the GUI of the device (https://www.home-assistant.io/integrations/scrape/)
35 | 3. Integration using the REST API of the OpenDTU device
36 | 4. Integration using Prometheus of the OpenDTU device
37 | 5. Integration using a self written plugin or integration module.
38 |
39 | The **Integration using MQTT** is good documented, so I will not describe it here.
40 | But I think, that there is only a measurement of the energy. Not showing any static data about the device.
41 | Generally the OpenDTU sends events via MQTT to the Home Assistant Server (push mode).
42 |
43 | The **Scrapping of the GUI** is nothing I would like, as this is very depending on the GUI.
44 | Also the GUI does only send calls to the REST API of the device, which I could ask directly.
45 | So I decide not to use the scraping integration.
46 |
47 | As the **REST API of the OpenDTU** is very well documented and very comprehensive, I decided to use this.
48 | The API is not considered to be stable and could change in future releases without announcement, but this is okay.
49 | The work I did is mainly to work through the API and find out how to configure the values in the REST Integration.
50 | See here for the API: * OpenDTU Web API: https://www.opendtu.solar/firmware/web_api/
51 |
52 | ### Integration of the OpenDTU device into HomeAssistant using REST API calls
53 |
54 | The kind of integration i used, to integrate the device into Home Assistant, is via the flexible REST Module described
55 | here: https://www.home-assistant.io/integrations/rest/ and here: https://www.home-assistant.io/integrations/sensor#device-class
56 |
57 | So to integrate the device you only need to write a YAML file, not using any programming language (as python).
58 | For me this is good, and the yaml file is described under the "src" folder.
59 | The REST API is called every 60 seconds, so in contrast to MQTT this is a pull mode.
60 |
61 | There are some limits using this YAML file and the REST API:
62 | * The REST API is fixed when using the sensor, so each inverter (in my case 3) need to be listed in the file.
63 | * There is no discovery and no dynamic listing of inverters
64 | * I do not use the "push" methods, as they require authentication (and I do not need these methods)
65 |
66 | ### Integration of the OpenDTU device into HomeAssistant using Prometheus
67 | I discovered, that one of the REST APIs of OpenDTU is delivering Prometheus data.
68 | Maybe this could also be a way to integrate the data into Home Assistant.
69 |
70 | ### Integration of the OpenDTU device into HomeAssistant using a new plugin
71 | The best way would be to have a **Integration using a new plugin**, but this would need to dive deeper into HAOS.
72 | Maybe I will try this.
73 |
74 | A plugin would be extend the possibilities:
75 | 1. Dynamic discovery of inverters and modules.
76 | 2. Templates for visualization
77 | 3. Controlling of the OpenDTU (instead configuring POST requests)
78 | 4. Configure the integration (e.g. User and Passwort)
79 | 5. Maybe mix the pull (REST API) and the push (MQTT) mode parallel.
80 | 6. Discovery of OpenDTU devices inside the network
81 | 7. ...
82 |
83 | ### Further work
84 | Maybe a mix of MQTT (push), REST API (pull) and Prometheus would be good.
85 | Also, I would like to write a plugin, but I am not sure if I could find time doing that.
86 |
87 |
--------------------------------------------------------------------------------
/src/opendtu/opendtu_livedata.yaml:
--------------------------------------------------------------------------------
1 | ## Read the state objects of OpenDTU using REST Integration
2 | ## See also: https://www.opendtu.solar/firmware/web_api/
3 | ## The integration name "rest:" must appear in configuration.yaml, but belongs here, so it is not used here
4 | ## rest:
5 | - resource: http://192.168.178.15/api/livedata/status
6 | method: GET
7 | scan_interval: 60
8 | headers:
9 | content-type: "application/json"
10 | sensor:
11 | ## OpenDTU total values (all inverters together)
12 | - name: "OpenDTU total Power"
13 | value_template: "{{ value_json.total.Power.v | round(1) }}"
14 | unit_of_measurement: "W"
15 | device_class: power
16 | - name: "OpenDTU total YieldDay"
17 | value_template: "{{ value_json.total.YieldDay.v | round(0) }}"
18 | unit_of_measurement: "Wh"
19 | device_class: energy
20 | - name: "OpenDTU total YieldTotal"
21 | value_template: "{{ value_json.total.YieldTotal.v | round(3) }}"
22 | unit_of_measurement: "kWh"
23 | device_class: energy
24 | ## Inverter values for inverter 0
25 | - name: "OpenDTU global inverters 0 serial"
26 | value_template: "{{ value_json.inverters[0].serial }}"
27 | # device_class: None
28 | - name: "OpenDTU global inverters 0 name"
29 | value_template: "{{ value_json.inverters[0].name }}"
30 | # device_class: None
31 | - name: "OpenDTU global inverters 0 order"
32 | value_template: "{{ value_json.inverters[0].order }}"
33 | # device_class: None
34 | - name: "OpenDTU global inverters 0 data_age"
35 | value_template: "{{ value_json.inverters[0].data_age }}"
36 | # device_class: None
37 | - name: "OpenDTU global inverters 0 limit_relative"
38 | value_template: "{{ value_json.inverters[0].limit_relative }}"
39 | unit_of_measurement: "%"
40 | device_class: power_factor
41 | - name: "OpenDTU global inverters 0 limit_absolute"
42 | value_template: "{{ value_json.inverters[0].limit_absolute }}"
43 | unit_of_measurement: "V"
44 | device_class: voltage
45 | ## Inverter values for inverter 1
46 | - name: "OpenDTU global inverters 1 serial"
47 | value_template: "{{ value_json.inverters[1].serial }}"
48 | # device_class: None
49 | - name: "OpenDTU global inverters 1 name"
50 | value_template: "{{ value_json.inverters[1].name }}"
51 | # device_class: None
52 | - name: "OpenDTU global inverters 1 order"
53 | value_template: "{{ value_json.inverters[1].order }}"
54 | # device_class: None
55 | - name: "OpenDTU global inverters 1 data_age"
56 | value_template: "{{ value_json.inverters[1].data_age }}"
57 | # device_class: None
58 | - name: "OpenDTU global inverters 1 limit_relative"
59 | value_template: "{{ value_json.inverters[1].limit_relative }}"
60 | unit_of_measurement: "%"
61 | device_class: power_factor
62 | - name: "OpenDTU global inverters 1 limit_absolute"
63 | value_template: "{{ value_json.inverters[1].limit_absolute }}"
64 | unit_of_measurement: "V"
65 | device_class: voltage
66 | ## Inverter values for inverter 2
67 | - name: "OpenDTU global inverters 2 serial"
68 | value_template: "{{ value_json.inverters[2].serial }}"
69 | # device_class: None
70 | - name: "OpenDTU global inverters 2 name"
71 | value_template: "{{ value_json.inverters[2].name }}"
72 | # device_class: None
73 | - name: "OpenDTU global inverters 2 order"
74 | value_template: "{{ value_json.inverters[2].order }}"
75 | # device_class: None
76 | - name: "OpenDTU global inverters 2 data_age"
77 | value_template: "{{ value_json.inverters[2].data_age }}"
78 | # device_class: None
79 | - name: "OpenDTU global inverters 2 limit_relative"
80 | value_template: "{{ value_json.inverters[2].limit_relative }}"
81 | unit_of_measurement: "%"
82 | device_class: power_factor
83 | - name: "OpenDTU global inverters 2 limit_absolute"
84 | value_template: "{{ value_json.inverters[2].limit_absolute }}"
85 | unit_of_measurement: "V"
86 | device_class: voltage
87 | binary_sensor:
88 | ## Hints for the OpenDTU at all
89 | - name: "OpenDTU hints time_sync"
90 | value_template: "{{ value_json.hints.time_sync }}"
91 | device_class: running
92 | - name: "OpenDTU hints radio_problem"
93 | value_template: "{{ value_json.hints.radio_problem }}"
94 | device_class: problem
95 | - name: "OpenDTU hints default_password"
96 | value_template: "{{ value_json.hints.default_password }}"
97 | device_class: problem
98 | - name: "OpenDTU hints pin_mapping_issue"
99 | value_template: "{{ value_json.hints.pin_mapping_issue }}"
100 | device_class: problem
101 | ## Inverter data for inverter 0
102 | - name: "OpenDTU global inverter 0 poll_enabled"
103 | value_template: "{{ value_json.inverters[0].poll_enabled }}"
104 | device_class: running
105 | - name: "OpenDTU global inverter 0 reachable"
106 | value_template: "{{ value_json.inverters[0].reachable }}"
107 | device_class: running
108 | - name: "OpenDTU global inverter 0 producing"
109 | value_template: "{{ value_json.inverters[0].producing }}"
110 | device_class: running
111 | ## Inverter data for inverter 1
112 | - name: "OpenDTU global inverter 1 poll_enabled"
113 | value_template: "{{ value_json.inverters[1].poll_enabled }}"
114 | device_class: running
115 | - name: "OpenDTU global inverter 1 reachable"
116 | value_template: "{{ value_json.inverters[1].reachable }}"
117 | device_class: running
118 | - name: "OpenDTU global inverter 1 producing"
119 | value_template: "{{ value_json.inverters[1].producing }}"
120 | device_class: running
121 | ## Inverter data for inverter 2
122 | - name: "OpenDTU global inverter 2 poll_enabled"
123 | value_template: "{{ value_json.inverters[2].poll_enabled }}"
124 | device_class: running
125 | - name: "OpenDTU global inverter 2 reachable"
126 | value_template: "{{ value_json.inverters[2].reachable }}"
127 | device_class: running
128 | - name: "OpenDTU global inverter 2 producing"
129 | value_template: "{{ value_json.inverters[2].producing }}"
130 | device_class: running
131 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # OpenDTU and Shelly for photovoltaic systems - Integration into HomeAssistant
2 |
3 | ## Short way to use
4 | What do you need to connect to your OpenDTU:
5 | 1. You need to install the REST integration in HA (the base for connection to your opendtu using HTTP REST)
6 | 2. You need to download and copy the src/opendtu/*.yml files to your system (into a directory named opendtu)
7 | 3. You need to edit the lines with the ip address in the files
8 | 4. You need to edit the lines with the serial numbers in the files
9 | 5. You need to link from your local configuration.yml to include the files in the opendtu directory
10 |
11 | For editing the files in HA, you could use one of the following add-ons (i am using both):
12 | * File Editor
13 | * Studio Code Server
14 |
15 | After that you can create visualisations for the entities (which is not described here)
16 |
17 | ## Setup
18 | I am currently using OpenDTU Version v25.2.3.
19 |
20 | As it is now allowed in germany to use "plug-and-play" photovoltaic systems with limit of 800 Watt,
21 | I decided to build this on my garage. The hardware I used is listed here: [HARDWARE.md](./docs/HARDWARE.md).
22 |
23 | After installing the PV, I decided to integrate this into a new home automation system.
24 | The possibilities I found, are described here: [INTEGRATION.md](./docs/INTEGRATION.md).
25 |
26 | Last but not least I decided to use "Home Assistant".
27 | Details are described here [HOMEASSISTANT.md](./docs/HOMEASSISTANT.md)
28 |
29 | ## Aim
30 |
31 | The aim of this documentation is to delivery the sources, and describe the decisions and some experience.
32 |
33 | The content:
34 | * In [src](./src) folder you could find the configuration.yml to include the opendtu directory.
35 | * In [src/opendtu](./src/opendtu) folder you could find working YAML files for integration into Home Assistant.
36 | * In [src/dashboard](./src/dashboard) folder you could find working YAML files of my 2 dashboards with every entity.
37 | * In [examples](./examples) folder you could find json data generated by my devices (some data are anonymized)
38 | * In [docs](./docs) folder you could find background informations
39 |
40 | The implementation uses the REST API of the OpenDTU as described here: https://www.opendtu.solar/firmware/web_api/.
41 |
42 | The following APIs are covered by the YAML file:
43 | * http://192.168.178.15/api/eventlog/status?inv=112182216512
44 | * http://192.168.178.15/api/limit/status
45 | * http://192.168.178.15/api/livedata/status
46 | * http://192.168.178.15/api/livedata/status?inv=112182216512
47 | * http://192.168.178.15/api/mqtt/status
48 | * http://192.168.178.15/api/network/status
49 | * http://192.168.178.15/api/ntp/status
50 | * http://192.168.178.15/api/power/status
51 | * http://192.168.178.15/api/system/status
52 |
53 | The following APIs are not covered by the YAML file:
54 | * http://192.168.178.15/api/prometheus/metrics
55 | * All APIs which require authentication (as I do not need them currently)
56 | * All POST APIs.
57 |
58 | The Integration of the OpenDTU is described here:
59 | * [Integration into HomeAssistant](./docs/HOMEASSISTANT.md)
60 |
61 | ## Usage
62 | How to use my work?
63 | 1. You could read what I did, just for experience.
64 | 2. You could copy the files from the "opendtu" directory to you HA. Then use it by doing the following steps:
65 | 1. Change the IP addresses inside the files to your ip address.
66 |
Global replace all occurrences of "192.168.178.15" with your OpenDTU IP address.
67 | 2. Change the serial numbers of the inverters in the files to your inverter numbers.
68 |
Global replace all occurrences of "112182216512" with your first inverter serial number.
69 |
Global replace all occurrences of "112182217151" with your second inverter serial number.
70 |
Global replace all occurrences of "112182217437" with your third inverter serial number.
71 | 3. If you have not exactly 3 inverters, you need to delete or copy some parts of the YAML files.
72 | 4. If you have not exactly 1 string per inverter, you need to delete or copy some parts of the YAML files.
73 | 3. The configuration.yaml is only an example, you have your own, adjust it:
74 | 1. Add the row starting with "rest:", and change the directory name (opendtu) if necessary.
75 | 2. If the "rest:" line is in configuration.yaml, you do not need to repeat it in the files.
76 | 4. Contact me in case of questions, I will try to answer. Please give me time for answering.
77 |
78 | ## Links
79 | This work is based on the following guides, which I could recommend and for which I thank a lot:
80 | * Shelly
81 | * Shelly Parts and good video descriptions: https://shellyparts.de/
82 | * Synology
83 | * Synology DS224+ RAM upgrade by Daniel Medic: https://www.youtube.com/watch?v=PdeafJfMXdw
84 | * OpenDTU
85 | * OpenDTU: https://github.com/tbnobody/OpenDTU
86 | * OpenDTU Web API: https://www.opendtu.solar/firmware/web_api/
87 | * The OpenDTU Soldering Tutorial: https://binary-kitchen.github.io/SolderingTutorial/OpenDTU_Breakout/manual/OpenDTU_Breakout_de.pdf
88 | * Ready-to-use OpenDTU Hardware: https://shop.blinkyparts.com/de/OpenDTU-NRF-Deine-Auswertung-fuer-deine-Balkonsolaranlage-kompatibel-zu-Hoymiles-HM-Serie-NRF-Modul/blink237542
89 | * Home Assistant
90 | * Tutorial by Simon42 https://www.simon42.com/home-assistant-template-sensoren-hilfsentitaten/#wechselrichter-anbinden-mit-restapi
91 | * Home Assistant Integration REST API: https://www.home-assistant.io/integrations/rest/
92 | * Home Assistant Device Classes: https://www.home-assistant.io/integrations/sensor#device-class
93 | * Debug Tool for JSON data: https://jsonpath.com/
94 | * The Home Assistant Core for developing: https://github.com/home-assistant/core
95 | * OpenHab - not used till now, but an option in future
96 | * OpenHab for developing: https://github.com/openhab/openhab-core
97 |
98 | ## Update notes
99 | The following updates are done:
100 | * v25.2.3: From version v23.6.28 to v25.2.3 the OpenDTU API changed:
101 | * The AC/DC/INV values for the inverters are now requested per serial number.
102 | * There are some new values, but not much relevant.
103 | * The big opendtu.yml file has been splitted into smaller files, and the whole directory is now included.
104 | * The firmware image on the OpenDTU device needed to be upgraded, please see the update notes in OpenDTU.
105 |
106 | # About me
107 | My daily work is as an IT architect in different software projects, mainly programming with Java.
108 | I do use different cloud solutions, most of the time kubernetes based. So ELK, Grafana, and so on is not new to me.
109 | Home automation is new, and just a hobby.
110 |
111 | I am living in germany, so the sources are sometimes in german language. Beg you pardon. :-)
112 |
--------------------------------------------------------------------------------
/src/opendtu/opendtu_livedata_inverter0.yaml:
--------------------------------------------------------------------------------
1 | ## Read the state objects of OpenDTU using REST Integration
2 | ## See also: https://www.opendtu.solar/firmware/web_api/
3 | ## The integration name "rest:" must appear in configuration.yaml, but belongs here, so it is not used here
4 | ## rest:
5 | - resource: http://192.168.178.15/api/livedata/status?inv=112182216512
6 | method: GET
7 | scan_interval: 60
8 | headers:
9 | content-type: "application/json"
10 | sensor:
11 | ## Inverter values for one inverter
12 | - name: "OpenDTU inverters 0 serial"
13 | value_template: "{{ value_json.inverters[0].serial }}"
14 | # device_class: None
15 | - name: "OpenDTU inverters 0 name"
16 | value_template: "{{ value_json.inverters[0].name }}"
17 | # device_class: None
18 | - name: "OpenDTU inverters 0 order"
19 | value_template: "{{ value_json.inverters[0].order }}"
20 | # device_class: None
21 | - name: "OpenDTU inverters 0 data_age"
22 | value_template: "{{ value_json.inverters[0].data_age }}"
23 | # device_class: None
24 | - name: "OpenDTU inverters 0 limit_relative"
25 | value_template: "{{ value_json.inverters[0].limit_relative }}"
26 | unit_of_measurement: "%"
27 | device_class: power_factor
28 | - name: "OpenDTU inverters 0 limit_absolute"
29 | value_template: "{{ value_json.inverters[0].limit_absolute }}"
30 | unit_of_measurement: "V"
31 | device_class: voltage
32 | - name: "OpenDTU inverters 0 events"
33 | value_template: "{{ value_json.inverters[0].events }}"
34 | # device_class: None
35 | ## Inverter AC for one inverter
36 | - name: "OpenDTU inverters 0 AC Power"
37 | value_template: "{{ value_json.inverters[0].AC['0'].Power.v | round(1) }}"
38 | unit_of_measurement: "W"
39 | device_class: power
40 | - name: "OpenDTU inverters 0 AC Voltage"
41 | value_template: "{{ value_json.inverters[0].AC['0'].Voltage.v | round(1) }}"
42 | unit_of_measurement: "V"
43 | device_class: voltage
44 | - name: "OpenDTU inverters 0 AC Current"
45 | value_template: "{{ value_json.inverters[0].AC['0'].Current.v | round(2) }}"
46 | unit_of_measurement: "A"
47 | device_class: current
48 | - name: "OpenDTU inverters 0 AC Frequency"
49 | value_template: "{{ value_json.inverters[0].AC['0'].Frequency.v | round(2) }}"
50 | unit_of_measurement: "Hz"
51 | device_class: frequency
52 | - name: "OpenDTU inverters 0 AC PowerFactor"
53 | value_template: "{{ value_json.inverters[0].AC['0'].PowerFactor.v | round(3) }}"
54 | unit_of_measurement: ""
55 | # device_class: none
56 | - name: "OpenDTU inverters 0 AC ReactivePower"
57 | value_template: "{{ value_json.inverters[0].AC['0'].ReactivePower.v | round(1) }}"
58 | unit_of_measurement: "var"
59 | device_class: reactive_power
60 | ## Inverter DC for one inverter
61 | - name: "OpenDTU inverters 0 DC Power"
62 | value_template: "{{ value_json.inverters[0].DC['0'].Power.v | round(1) }}"
63 | unit_of_measurement: "W"
64 | device_class: power
65 | - name: "OpenDTU inverters 0 DC Voltage"
66 | value_template: "{{ value_json.inverters[0].DC['0'].Voltage.v | round(1) }}"
67 | unit_of_measurement: "V"
68 | device_class: voltage
69 | - name: "OpenDTU inverters 0 DC Current"
70 | value_template: "{{ value_json.inverters[0].DC['0'].Current.v | round(2) }}"
71 | unit_of_measurement: "A"
72 | device_class: current
73 | - name: "OpenDTU inverters 0 DC YieldDay"
74 | value_template: "{{ value_json.inverters[0].DC['0'].YieldDay.v | round(0) }}"
75 | unit_of_measurement: "Wh"
76 | device_class: energy
77 | - name: "OpenDTU inverters 0 DC YieldTotal"
78 | value_template: "{{ value_json.inverters[0].DC['0'].YieldTotal.v | round(3) }}"
79 | unit_of_measurement: "kWh"
80 | device_class: energy
81 | ## Inverter INV for one inverter
82 | - name: "OpenDTU inverters 0 INV Power DC"
83 | value_template: "{{ value_json.inverters[1].INV['0']['Power DC'].v | round(1) }}"
84 | unit_of_measurement: "W"
85 | device_class: power
86 | - name: "OpenDTU inverters 0 INV YieldDay"
87 | value_template: "{{ value_json.inverters[0].INV['0'].YieldDay.v | round(0) }}"
88 | unit_of_measurement: "Wh"
89 | device_class: energy
90 | - name: "OpenDTU inverters 0 INV YieldTotal"
91 | value_template: "{{ value_json.inverters[0].INV['0'].YieldTotal.v | round(3) }}"
92 | unit_of_measurement: "kWh"
93 | device_class: energy
94 | - name: "OpenDTU inverters 0 INV Temperature"
95 | value_template: "{{ value_json.inverters[0].INV['0'].Temperature.v | round(1) }}"
96 | unit_of_measurement: "°C"
97 | device_class: temperature
98 | - name: "OpenDTU inverters 0 INV Efficiency"
99 | value_template: "{{ value_json.inverters[0].INV['0'].Efficiency.v | round(3) }}"
100 | unit_of_measurement: "%"
101 | device_class: power_factor
102 | ## Inverter Total for one inverter
103 | - name: "OpenDTU inverters 0 total Power"
104 | value_template: "{{ value_json.total.Power.v | round(1) }}"
105 | unit_of_measurement: "W"
106 | device_class: power
107 | - name: "OpenDTU inverters 0 total YieldDay"
108 | value_template: "{{ value_json.total.YieldDay.v | round(0) }}"
109 | unit_of_measurement: "Wh"
110 | device_class: energy
111 | - name: "OpenDTU inverters 0 total YieldTotal"
112 | value_template: "{{ value_json.total.YieldTotal.v | round(3) }}"
113 | unit_of_measurement: "kWh"
114 | device_class: energy
115 | binary_sensor:
116 | ## Inverter data for one inverter
117 | - name: "OpenDTU inverters 0 poll_enabled"
118 | value_template: "{{ value_json.inverters[0].poll_enabled }}"
119 | device_class: running
120 | - name: "OpenDTU inverters 0 reachable"
121 | value_template: "{{ value_json.inverters[0].reachable }}"
122 | device_class: running
123 | - name: "OpenDTU inverters 0 producing"
124 | value_template: "{{ value_json.inverters[0].producing }}"
125 | device_class: running
126 | ## Inverter hints for one inverter
127 | - name: "OpenDTU inverters 0 hints time_sync"
128 | value_template: "{{ value_json.hints.time_sync }}"
129 | device_class: running
130 | - name: "OpenDTU inverters 0 hints radio_problem"
131 | value_template: "{{ value_json.hints.radio_problem }}"
132 | device_class: problem
133 | - name: "OpenDTU inverters 0 hints default_password"
134 | value_template: "{{ value_json.hints.default_password }}"
135 | device_class: problem
136 | - name: "OpenDTU inverters 0 hints pin_mapping_issue"
137 | value_template: "{{ value_json.hints.pin_mapping_issue }}"
138 | device_class: problem
139 |
--------------------------------------------------------------------------------
/src/opendtu/opendtu_livedata_inverter1.yaml:
--------------------------------------------------------------------------------
1 | ## Read the state objects of OpenDTU using REST Integration
2 | ## See also: https://www.opendtu.solar/firmware/web_api/
3 | ## The integration name "rest:" must appear in configuration.yaml, but belongs here, so it is not used here
4 | ## rest:
5 | - resource: http://192.168.178.15/api/livedata/status?inv=112182217151
6 | method: GET
7 | scan_interval: 60
8 | headers:
9 | content-type: "application/json"
10 | sensor:
11 | ## Inverter values for one inverter
12 | - name: "OpenDTU inverters 1 serial"
13 | value_template: "{{ value_json.inverters[0].serial }}"
14 | # device_class: None
15 | - name: "OpenDTU inverters 1 name"
16 | value_template: "{{ value_json.inverters[0].name }}"
17 | # device_class: None
18 | - name: "OpenDTU inverters 1 order"
19 | value_template: "{{ value_json.inverters[0].order }}"
20 | # device_class: None
21 | - name: "OpenDTU inverters 1 data_age"
22 | value_template: "{{ value_json.inverters[0].data_age }}"
23 | # device_class: None
24 | - name: "OpenDTU inverters 1 limit_relative"
25 | value_template: "{{ value_json.inverters[0].limit_relative }}"
26 | unit_of_measurement: "%"
27 | device_class: power_factor
28 | - name: "OpenDTU inverters 1 limit_absolute"
29 | value_template: "{{ value_json.inverters[0].limit_absolute }}"
30 | unit_of_measurement: "V"
31 | device_class: voltage
32 | - name: "OpenDTU inverters 1 events"
33 | value_template: "{{ value_json.inverters[0].events }}"
34 | # device_class: None
35 | ## Inverter AC for one inverter
36 | - name: "OpenDTU inverters 1 AC Power"
37 | value_template: "{{ value_json.inverters[0].AC['0'].Power.v | round(1) }}"
38 | unit_of_measurement: "W"
39 | device_class: power
40 | - name: "OpenDTU inverters 1 AC Voltage"
41 | value_template: "{{ value_json.inverters[0].AC['0'].Voltage.v | round(1) }}"
42 | unit_of_measurement: "V"
43 | device_class: voltage
44 | - name: "OpenDTU inverters 1 AC Current"
45 | value_template: "{{ value_json.inverters[0].AC['0'].Current.v | round(2) }}"
46 | unit_of_measurement: "A"
47 | device_class: current
48 | - name: "OpenDTU inverters 1 AC Frequency"
49 | value_template: "{{ value_json.inverters[0].AC['0'].Frequency.v | round(2) }}"
50 | unit_of_measurement: "Hz"
51 | device_class: frequency
52 | - name: "OpenDTU inverters 1 AC PowerFactor"
53 | value_template: "{{ value_json.inverters[0].AC['0'].PowerFactor.v | round(3) }}"
54 | unit_of_measurement: ""
55 | # device_class: none
56 | - name: "OpenDTU inverters 1 AC ReactivePower"
57 | value_template: "{{ value_json.inverters[0].AC['0'].ReactivePower.v | round(1) }}"
58 | unit_of_measurement: "var"
59 | device_class: reactive_power
60 | ## Inverter DC for one inverter
61 | - name: "OpenDTU inverters 1 DC Power"
62 | value_template: "{{ value_json.inverters[0].DC['0'].Power.v | round(1) }}"
63 | unit_of_measurement: "W"
64 | device_class: power
65 | - name: "OpenDTU inverters 1 DC Voltage"
66 | value_template: "{{ value_json.inverters[0].DC['0'].Voltage.v | round(1) }}"
67 | unit_of_measurement: "V"
68 | device_class: voltage
69 | - name: "OpenDTU inverters 1 DC Current"
70 | value_template: "{{ value_json.inverters[0].DC['0'].Current.v | round(2) }}"
71 | unit_of_measurement: "A"
72 | device_class: current
73 | - name: "OpenDTU inverters 1 DC YieldDay"
74 | value_template: "{{ value_json.inverters[0].DC['0'].YieldDay.v | round(0) }}"
75 | unit_of_measurement: "Wh"
76 | device_class: energy
77 | - name: "OpenDTU inverters 1 DC YieldTotal"
78 | value_template: "{{ value_json.inverters[0].DC['0'].YieldTotal.v | round(3) }}"
79 | unit_of_measurement: "kWh"
80 | device_class: energy
81 | ## Inverter INV for one inverter
82 | - name: "OpenDTU inverters 1 INV Power DC"
83 | value_template: "{{ value_json.inverters[1].INV['0']['Power DC'].v | round(1) }}"
84 | unit_of_measurement: "W"
85 | device_class: power
86 | - name: "OpenDTU inverters 1 INV YieldDay"
87 | value_template: "{{ value_json.inverters[0].INV['0'].YieldDay.v | round(0) }}"
88 | unit_of_measurement: "Wh"
89 | device_class: energy
90 | - name: "OpenDTU inverters 1 INV YieldTotal"
91 | value_template: "{{ value_json.inverters[0].INV['0'].YieldTotal.v | round(3) }}"
92 | unit_of_measurement: "kWh"
93 | device_class: energy
94 | - name: "OpenDTU inverters 1 INV Temperature"
95 | value_template: "{{ value_json.inverters[0].INV['0'].Temperature.v | round(1) }}"
96 | unit_of_measurement: "°C"
97 | device_class: temperature
98 | - name: "OpenDTU inverters 1 INV Efficiency"
99 | value_template: "{{ value_json.inverters[0].INV['0'].Efficiency.v | round(3) }}"
100 | unit_of_measurement: "%"
101 | device_class: power_factor
102 | ## Inverter Total for one inverter
103 | - name: "OpenDTU inverters 1 total Power"
104 | value_template: "{{ value_json.total.Power.v | round(1) }}"
105 | unit_of_measurement: "W"
106 | device_class: power
107 | - name: "OpenDTU inverters 1 total YieldDay"
108 | value_template: "{{ value_json.total.YieldDay.v | round(0) }}"
109 | unit_of_measurement: "Wh"
110 | device_class: energy
111 | - name: "OpenDTU inverters 1 total YieldTotal"
112 | value_template: "{{ value_json.total.YieldTotal.v | round(3) }}"
113 | unit_of_measurement: "kWh"
114 | device_class: energy
115 | binary_sensor:
116 | ## Inverter data for one inverter
117 | - name: "OpenDTU inverters 1 poll_enabled"
118 | value_template: "{{ value_json.inverters[0].poll_enabled }}"
119 | device_class: running
120 | - name: "OpenDTU inverters 1 reachable"
121 | value_template: "{{ value_json.inverters[0].reachable }}"
122 | device_class: running
123 | - name: "OpenDTU inverters 1 producing"
124 | value_template: "{{ value_json.inverters[0].producing }}"
125 | device_class: running
126 | ## Inverter hints for one inverter
127 | - name: "OpenDTU inverters 1 hints time_sync"
128 | value_template: "{{ value_json.hints.time_sync }}"
129 | device_class: running
130 | - name: "OpenDTU inverters 1 hints radio_problem"
131 | value_template: "{{ value_json.hints.radio_problem }}"
132 | device_class: problem
133 | - name: "OpenDTU inverters 1 hints default_password"
134 | value_template: "{{ value_json.hints.default_password }}"
135 | device_class: problem
136 | - name: "OpenDTU inverters 1 hints pin_mapping_issue"
137 | value_template: "{{ value_json.hints.pin_mapping_issue }}"
138 | device_class: problem
139 |
--------------------------------------------------------------------------------
/src/opendtu/opendtu_livedata_inverter2.yaml:
--------------------------------------------------------------------------------
1 | ## Read the state objects of OpenDTU using REST Integration
2 | ## See also: https://www.opendtu.solar/firmware/web_api/
3 | ## The integration name "rest:" must appear in configuration.yaml, but belongs here, so it is not used here
4 | ## rest:
5 | - resource: http://192.168.178.15/api/livedata/status?inv=112182217437
6 | method: GET
7 | scan_interval: 60
8 | headers:
9 | content-type: "application/json"
10 | sensor:
11 | ## Inverter values for one inverter
12 | - name: "OpenDTU inverters 2 serial"
13 | value_template: "{{ value_json.inverters[0].serial }}"
14 | # device_class: None
15 | - name: "OpenDTU inverters 2 name"
16 | value_template: "{{ value_json.inverters[0].name }}"
17 | # device_class: None
18 | - name: "OpenDTU inverters 2 order"
19 | value_template: "{{ value_json.inverters[0].order }}"
20 | # device_class: None
21 | - name: "OpenDTU inverters 2 data_age"
22 | value_template: "{{ value_json.inverters[0].data_age }}"
23 | # device_class: None
24 | - name: "OpenDTU inverters 2 limit_relative"
25 | value_template: "{{ value_json.inverters[0].limit_relative }}"
26 | unit_of_measurement: "%"
27 | device_class: power_factor
28 | - name: "OpenDTU inverters 2 limit_absolute"
29 | value_template: "{{ value_json.inverters[0].limit_absolute }}"
30 | unit_of_measurement: "V"
31 | device_class: voltage
32 | - name: "OpenDTU inverters 2 events"
33 | value_template: "{{ value_json.inverters[0].events }}"
34 | # device_class: None
35 | ## Inverter AC for one inverter
36 | - name: "OpenDTU inverters 2 AC Power"
37 | value_template: "{{ value_json.inverters[0].AC['0'].Power.v | round(1) }}"
38 | unit_of_measurement: "W"
39 | device_class: power
40 | - name: "OpenDTU inverters 2 AC Voltage"
41 | value_template: "{{ value_json.inverters[0].AC['0'].Voltage.v | round(1) }}"
42 | unit_of_measurement: "V"
43 | device_class: voltage
44 | - name: "OpenDTU inverters 2 AC Current"
45 | value_template: "{{ value_json.inverters[0].AC['0'].Current.v | round(2) }}"
46 | unit_of_measurement: "A"
47 | device_class: current
48 | - name: "OpenDTU inverters 2 AC Frequency"
49 | value_template: "{{ value_json.inverters[0].AC['0'].Frequency.v | round(2) }}"
50 | unit_of_measurement: "Hz"
51 | device_class: frequency
52 | - name: "OpenDTU inverters 2 AC PowerFactor"
53 | value_template: "{{ value_json.inverters[0].AC['0'].PowerFactor.v | round(3) }}"
54 | unit_of_measurement: ""
55 | # device_class: none
56 | - name: "OpenDTU inverters 2 AC ReactivePower"
57 | value_template: "{{ value_json.inverters[0].AC['0'].ReactivePower.v | round(1) }}"
58 | unit_of_measurement: "var"
59 | device_class: reactive_power
60 | ## Inverter DC for one inverter
61 | - name: "OpenDTU inverters 2 DC Power"
62 | value_template: "{{ value_json.inverters[0].DC['0'].Power.v | round(1) }}"
63 | unit_of_measurement: "W"
64 | device_class: power
65 | - name: "OpenDTU inverters 2 DC Voltage"
66 | value_template: "{{ value_json.inverters[0].DC['0'].Voltage.v | round(1) }}"
67 | unit_of_measurement: "V"
68 | device_class: voltage
69 | - name: "OpenDTU inverters 2 DC Current"
70 | value_template: "{{ value_json.inverters[0].DC['0'].Current.v | round(2) }}"
71 | unit_of_measurement: "A"
72 | device_class: current
73 | - name: "OpenDTU inverters 2 DC YieldDay"
74 | value_template: "{{ value_json.inverters[0].DC['0'].YieldDay.v | round(0) }}"
75 | unit_of_measurement: "Wh"
76 | device_class: energy
77 | - name: "OpenDTU inverters 2 DC YieldTotal"
78 | value_template: "{{ value_json.inverters[0].DC['0'].YieldTotal.v | round(3) }}"
79 | unit_of_measurement: "kWh"
80 | device_class: energy
81 | ## Inverter INV for one inverter
82 | - name: "OpenDTU inverters 2 INV Power DC"
83 | value_template: "{{ value_json.inverters[1].INV['0']['Power DC'].v | round(1) }}"
84 | unit_of_measurement: "W"
85 | device_class: power
86 | - name: "OpenDTU inverters 2 INV YieldDay"
87 | value_template: "{{ value_json.inverters[0].INV['0'].YieldDay.v | round(0) }}"
88 | unit_of_measurement: "Wh"
89 | device_class: energy
90 | - name: "OpenDTU inverters 2 INV YieldTotal"
91 | value_template: "{{ value_json.inverters[0].INV['0'].YieldTotal.v | round(3) }}"
92 | unit_of_measurement: "kWh"
93 | device_class: energy
94 | - name: "OpenDTU inverters 2 INV Temperature"
95 | value_template: "{{ value_json.inverters[0].INV['0'].Temperature.v | round(1) }}"
96 | unit_of_measurement: "°C"
97 | device_class: temperature
98 | - name: "OpenDTU inverters 2 INV Efficiency"
99 | value_template: "{{ value_json.inverters[0].INV['0'].Efficiency.v | round(3) }}"
100 | unit_of_measurement: "%"
101 | device_class: power_factor
102 | ## Inverter Total for one inverter
103 | - name: "OpenDTU inverters 2 total Power"
104 | value_template: "{{ value_json.total.Power.v | round(1) }}"
105 | unit_of_measurement: "W"
106 | device_class: power
107 | - name: "OpenDTU inverters 2 total YieldDay"
108 | value_template: "{{ value_json.total.YieldDay.v | round(0) }}"
109 | unit_of_measurement: "Wh"
110 | device_class: energy
111 | - name: "OpenDTU inverters 2 total YieldTotal"
112 | value_template: "{{ value_json.total.YieldTotal.v | round(3) }}"
113 | unit_of_measurement: "kWh"
114 | device_class: energy
115 | binary_sensor:
116 | ## Inverter data for one inverter
117 | - name: "OpenDTU inverters 2 poll_enabled"
118 | value_template: "{{ value_json.inverters[0].poll_enabled }}"
119 | device_class: running
120 | - name: "OpenDTU inverters 2 reachable"
121 | value_template: "{{ value_json.inverters[0].reachable }}"
122 | device_class: running
123 | - name: "OpenDTU inverters 2 producing"
124 | value_template: "{{ value_json.inverters[0].producing }}"
125 | device_class: running
126 | ## Inverter hints for one inverter
127 | - name: "OpenDTU inverters 2 hints time_sync"
128 | value_template: "{{ value_json.hints.time_sync }}"
129 | device_class: running
130 | - name: "OpenDTU inverters 2 hints radio_problem"
131 | value_template: "{{ value_json.hints.radio_problem }}"
132 | device_class: problem
133 | - name: "OpenDTU inverters 2 hints default_password"
134 | value_template: "{{ value_json.hints.default_password }}"
135 | device_class: problem
136 | - name: "OpenDTU inverters 2 hints pin_mapping_issue"
137 | value_template: "{{ value_json.hints.pin_mapping_issue }}"
138 | device_class: problem
139 |
--------------------------------------------------------------------------------
/src/dashboard/opendtu_inverters.yaml:
--------------------------------------------------------------------------------
1 | type: masonry
2 | path: opendtu_inverters
3 | title: OpenDTU Inverters
4 | cards:
5 | - type: vertical-stack
6 | cards:
7 | - type: gauge
8 | entity: sensor.opendtu_inverters_0_ac_current
9 | - type: gauge
10 | entity: sensor.opendtu_inverters_0_ac_power
11 | - type: gauge
12 | entity: sensor.opendtu_inverters_0_ac_voltage
13 | - type: gauge
14 | entity: sensor.opendtu_inverters_0_dc_current
15 | - type: gauge
16 | entity: sensor.opendtu_inverters_0_dc_power
17 | - type: gauge
18 | entity: sensor.opendtu_inverters_0_dc_voltage
19 | - type: gauge
20 | entity: sensor.opendtu_inverters_0_dc_yieldday
21 | - type: gauge
22 | entity: sensor.opendtu_inverters_0_dc_yieldtotal
23 | title: OpenDTU Inverter 0
24 | - type: vertical-stack
25 | cards:
26 | - type: gauge
27 | entity: sensor.opendtu_inverters_1_ac_current
28 | - type: gauge
29 | entity: sensor.opendtu_inverters_1_ac_power
30 | - type: gauge
31 | entity: sensor.opendtu_inverters_1_ac_voltage
32 | - type: gauge
33 | entity: sensor.opendtu_inverters_1_dc_current
34 | - type: gauge
35 | entity: sensor.opendtu_inverters_1_dc_power
36 | - type: gauge
37 | entity: sensor.opendtu_inverters_1_dc_voltage
38 | - type: gauge
39 | entity: sensor.opendtu_inverters_1_dc_yieldday
40 | - type: gauge
41 | entity: sensor.opendtu_inverters_1_dc_yieldtotal
42 | title: OpenDTU Inverter 1
43 | - type: vertical-stack
44 | cards:
45 | - type: gauge
46 | entity: sensor.opendtu_inverters_2_ac_current
47 | - type: gauge
48 | entity: sensor.opendtu_inverters_2_ac_power
49 | - type: gauge
50 | entity: sensor.opendtu_inverters_2_ac_voltage
51 | - type: gauge
52 | entity: sensor.opendtu_inverters_2_dc_current
53 | - type: gauge
54 | entity: sensor.opendtu_inverters_2_dc_power
55 | - type: gauge
56 | entity: sensor.opendtu_inverters_1_dc_voltage
57 | - type: gauge
58 | entity: sensor.opendtu_inverters_2_dc_yieldday
59 | - type: gauge
60 | entity: sensor.opendtu_inverters_2_dc_yieldtotal
61 | title: OpenDTU Inverter 2
62 | - type: entities
63 | entities:
64 | - entity: sensor.opendtu_inverters_0_ac_power
65 | - entity: sensor.opendtu_inverters_0_ac_voltage
66 | - entity: sensor.opendtu_inverters_0_ac_current
67 | - entity: sensor.opendtu_inverters_0_ac_frequency
68 | - entity: sensor.opendtu_inverters_0_ac_reactivepower
69 | - entity: sensor.opendtu_inverters_0_dc_power
70 | - entity: sensor.opendtu_inverters_0_dc_voltage
71 | - entity: sensor.opendtu_inverters_0_dc_current
72 | - entity: sensor.opendtu_inverters_0_dc_yieldday
73 | - entity: sensor.opendtu_inverters_0_dc_yieldtotal
74 | - entity: sensor.opendtu_inverters_0_inv_power_dc
75 | - entity: sensor.opendtu_inverters_0_inv_yieldday
76 | - entity: sensor.opendtu_inverters_0_inv_yieldtotal
77 | - entity: sensor.opendtu_inverters_0_inv_temperature
78 | - entity: sensor.opendtu_inverters_0_inv_efficiency
79 | - entity: binary_sensor.opendtu_inverters_0_hints_time_sync
80 | - entity: binary_sensor.opendtu_inverters_0_hints_radio_problem
81 | - entity: binary_sensor.opendtu_inverters_0_hints_default_password
82 | - entity: binary_sensor.opendtu_inverters_0_hints_pin_mapping_issue
83 | - entity: sensor.opendtu_inverters_0_events
84 | - entity: sensor.opendtu_inverters_0_limit_relative
85 | - entity: sensor.opendtu_inverters_0_limit_absolute
86 | - entity: binary_sensor.opendtu_inverters_0_poll_enabled
87 | - entity: binary_sensor.opendtu_inverters_0_reachable
88 | - entity: binary_sensor.opendtu_inverters_0_producing
89 | - entity: sensor.opendtu_inverters_0_serial
90 | - entity: sensor.opendtu_inverters_0_name
91 | title: OpenDTU Inverter 0
92 | - type: entities
93 | entities:
94 | - entity: sensor.opendtu_inverters_1_ac_power
95 | - entity: sensor.opendtu_inverters_1_ac_voltage
96 | - entity: sensor.opendtu_inverters_1_ac_current
97 | - entity: sensor.opendtu_inverters_1_ac_frequency
98 | - entity: sensor.opendtu_inverters_1_ac_reactivepower
99 | - entity: sensor.opendtu_inverters_1_dc_power
100 | - entity: sensor.opendtu_inverters_1_dc_voltage
101 | - entity: sensor.opendtu_inverters_1_dc_current
102 | - entity: sensor.opendtu_inverters_1_dc_yieldday
103 | - entity: sensor.opendtu_inverters_1_dc_yieldtotal
104 | - entity: sensor.opendtu_inverters_1_inv_power_dc
105 | - entity: sensor.opendtu_inverters_1_inv_yieldday
106 | - entity: sensor.opendtu_inverters_1_inv_yieldtotal
107 | - entity: sensor.opendtu_inverters_1_inv_temperature
108 | - entity: sensor.opendtu_inverters_1_inv_efficiency
109 | - entity: binary_sensor.opendtu_inverters_1_hints_time_sync
110 | - entity: binary_sensor.opendtu_inverters_1_hints_radio_problem
111 | - entity: binary_sensor.opendtu_inverters_1_hints_default_password
112 | - entity: binary_sensor.opendtu_inverters_1_hints_pin_mapping_issue
113 | - entity: sensor.opendtu_inverters_1_events
114 | - entity: sensor.opendtu_inverters_1_limit_relative
115 | - entity: sensor.opendtu_inverters_1_limit_absolute
116 | - entity: binary_sensor.opendtu_inverters_1_poll_enabled
117 | - entity: binary_sensor.opendtu_inverters_1_reachable
118 | - entity: binary_sensor.opendtu_inverters_1_producing
119 | - entity: sensor.opendtu_inverters_1_serial
120 | - entity: sensor.opendtu_inverters_1_name
121 | title: OpenDTU Inverter 1
122 | - type: entities
123 | entities:
124 | - entity: sensor.opendtu_inverters_2_ac_power
125 | - entity: sensor.opendtu_inverters_2_ac_voltage
126 | - entity: sensor.opendtu_inverters_2_ac_current
127 | - entity: sensor.opendtu_inverters_2_ac_frequency
128 | - entity: sensor.opendtu_inverters_2_ac_reactivepower
129 | - entity: sensor.opendtu_inverters_2_dc_power
130 | - entity: sensor.opendtu_inverters_2_dc_voltage
131 | - entity: sensor.opendtu_inverters_2_dc_current
132 | - entity: sensor.opendtu_inverters_2_dc_yieldday
133 | - entity: sensor.opendtu_inverters_2_dc_yieldtotal
134 | - entity: sensor.opendtu_inverters_2_inv_power_dc
135 | - entity: sensor.opendtu_inverters_2_inv_yieldday
136 | - entity: sensor.opendtu_inverters_2_inv_yieldtotal
137 | - entity: sensor.opendtu_inverters_2_inv_temperature
138 | - entity: sensor.opendtu_inverters_2_inv_efficiency
139 | - entity: binary_sensor.opendtu_inverters_2_hints_time_sync
140 | - entity: binary_sensor.opendtu_inverters_2_hints_radio_problem
141 | - entity: binary_sensor.opendtu_inverters_2_hints_default_password
142 | - entity: binary_sensor.opendtu_inverters_2_hints_pin_mapping_issue
143 | - entity: sensor.opendtu_inverters_2_events
144 | - entity: sensor.opendtu_inverters_2_limit_relative
145 | - entity: sensor.opendtu_inverters_2_limit_absolute
146 | - entity: binary_sensor.opendtu_inverters_2_poll_enabled
147 | - entity: binary_sensor.opendtu_inverters_2_reachable
148 | - entity: binary_sensor.opendtu_inverters_2_producing
149 | - entity: sensor.opendtu_inverters_2_serial
150 | - entity: sensor.opendtu_inverters_2_name
151 | title: OpenDTU Inverter 2
152 | icon: mdi:solar-panel
153 |
--------------------------------------------------------------------------------
/src/dashboard/opendt.yaml:
--------------------------------------------------------------------------------
1 | type: masonry
2 | path: opendtu
3 | icon: mdi:solar-power-variant-outline
4 | cards:
5 | - graph: line
6 | type: sensor
7 | entity: sensor.opendtu_total_yieldday
8 | detail: 1
9 | - graph: line
10 | type: sensor
11 | entity: sensor.opendtu_total_yieldtotal
12 | detail: 1
13 | - graph: line
14 | type: sensor
15 | entity: sensor.opendtu_total_power
16 | detail: 1
17 | - type: history-graph
18 | entities:
19 | - entity: sensor.opendtu_total_yieldday
20 | logarithmic_scale: false
21 | fit_y_data: true
22 | - type: history-graph
23 | entities:
24 | - entity: sensor.opendtu_total_yieldtotal
25 | logarithmic_scale: false
26 | fit_y_data: true
27 | - type: history-graph
28 | entities:
29 | - entity: sensor.opendtu_total_power
30 | logarithmic_scale: false
31 | fit_y_data: true
32 | - type: entities
33 | entities:
34 | - entity: sensor.opendtu_global_inverters_0_name
35 | - entity: sensor.opendtu_global_inverters_0_serial
36 | - entity: sensor.opendtu_global_inverters_0_order
37 | - entity: sensor.opendtu_global_inverters_0_data_age
38 | - entity: binary_sensor.opendtu_global_inverter_0_poll_enabled
39 | - entity: binary_sensor.opendtu_global_inverter_0_reachable
40 | - entity: binary_sensor.opendtu_global_inverter_0_producing
41 | - entity: sensor.opendtu_global_inverters_0_limit_relative
42 | - entity: sensor.opendtu_global_inverters_0_limit_absolute
43 | title: OpenDTU Global Inverter 0
44 | - type: entities
45 | entities:
46 | - entity: sensor.opendtu_global_inverters_1_name
47 | - entity: sensor.opendtu_global_inverters_1_serial
48 | - entity: sensor.opendtu_global_inverters_1_order
49 | - entity: sensor.opendtu_global_inverters_1_data_age
50 | - entity: binary_sensor.opendtu_global_inverter_1_poll_enabled
51 | - entity: binary_sensor.opendtu_global_inverter_1_reachable
52 | - entity: binary_sensor.opendtu_global_inverter_1_producing
53 | - entity: sensor.opendtu_global_inverters_1_limit_relative
54 | - entity: sensor.opendtu_global_inverters_1_limit_absolute
55 | title: OpenDTU Global Inverter 1
56 | - type: entities
57 | entities:
58 | - entity: sensor.opendtu_global_inverters_2_name
59 | - entity: sensor.opendtu_global_inverters_2_serial
60 | - entity: sensor.opendtu_global_inverters_2_order
61 | - entity: sensor.opendtu_global_inverters_2_data_age
62 | - entity: binary_sensor.opendtu_global_inverter_2_poll_enabled
63 | - entity: binary_sensor.opendtu_global_inverter_2_reachable
64 | - entity: binary_sensor.opendtu_global_inverter_2_producing
65 | - entity: sensor.opendtu_global_inverters_2_limit_relative
66 | - entity: sensor.opendtu_global_inverters_1_limit_absolute
67 | title: OpenDTU Global Inverter 2
68 | - type: entities
69 | entities:
70 | - entity: binary_sensor.opendtu_system_cmt_configured
71 | - entity: binary_sensor.opendtu_system_cmt_connected
72 | - entity: binary_sensor.opendtu_system_nrf_configured
73 | - entity: binary_sensor.opendtu_system_nrf_connected
74 | - entity: binary_sensor.opendtu_system_nrf_pvariant
75 | - entity: sensor.opendtu_system_cputemp
76 | - entity: sensor.opendtu_system_cpufreq
77 | - entity: sensor.opendtu_system_uptime
78 | - entity: sensor.opendtu_system_hostname
79 | - entity: sensor.opendtu_system_sdkversion
80 | - entity: sensor.opendtu_system_heap_total
81 | - entity: sensor.opendtu_system_heap_used
82 | - entity: sensor.opendtu_system_heap_max_block
83 | - entity: sensor.opendtu_system_heap_min_free
84 | - entity: sensor.opendtu_system_psram_total
85 | - entity: sensor.opendtu_system_psram_used
86 | - entity: sensor.opendtu_system_sketch_total
87 | - entity: sensor.opendtu_system_sketch_used
88 | - entity: sensor.opendtu_system_littlefs_total
89 | - entity: sensor.opendtu_system_littlefs_used
90 | - entity: sensor.opendtu_system_chiprevision
91 | - entity: sensor.opendtu_system_chipmodel
92 | - entity: sensor.opendtu_system_chipcores
93 | - entity: sensor.opendtu_system_flashsize
94 | - entity: sensor.opendtu_system_resetreason_0
95 | - entity: sensor.opendtu_system_resetreason_1
96 | - entity: sensor.opendtu_system_cfgsavecount
97 | - entity: sensor.opendtu_system_config_version
98 | - entity: sensor.opendtu_system_uptgit_hashime
99 | - entity: sensor.opendtu_system_pioenv
100 | title: OpenDTU System
101 | - type: entities
102 | entities:
103 | - entity: sensor.opendtu_power_status_inverter_1
104 | - entity: sensor.opendtu_power_status_inverter_2
105 | - entity: sensor.opendtu_power_status_inverter_3
106 | - entity: sensor.opendtu_limit_relative_inverter_1
107 | - entity: sensor.opendtu_limit_relative_inverter_2
108 | - entity: sensor.opendtu_limit_relative_inverter_3
109 | - entity: sensor.opendtu_max_power_inverter_1
110 | - entity: sensor.opendtu_max_power_inverter_2
111 | - entity: sensor.opendtu_max_power_inverter_3
112 | - entity: sensor.opendtu_limit_set_status_inverter_1
113 | - entity: sensor.opendtu_limit_set_status_inverter_2
114 | - entity: sensor.opendtu_limit_set_status_inverter_3
115 | title: OpenDTU LiveData Power
116 | - type: entities
117 | entities:
118 | - entity: binary_sensor.opendtu_hints_time_sync
119 | - entity: binary_sensor.opendtu_hints_radio_problem
120 | - entity: binary_sensor.opendtu_hints_default_password
121 | - entity: binary_sensor.opendtu_hints_pin_mapping_issue
122 | - entity: sensor.opendtu_total_power
123 | - entity: sensor.opendtu_total_yieldday
124 | - entity: sensor.opendtu_total_yieldtotal
125 | title: OpenDTU Livedata Total
126 | - type: entities
127 | entities:
128 | - entity: sensor.opendtu_event_log_inverter_1
129 | - entity: sensor.opendtu_event_log_inverter_2
130 | - entity: sensor.opendtu_event_log_inverter_3
131 | title: OpenDTU Eventlog
132 | - type: entities
133 | entities:
134 | - entity: binary_sensor.opendtu_network_sta_status
135 | - entity: sensor.opendtu_network_sta_ssid
136 | - entity: sensor.opendtu_network_sta_bssid
137 | - entity: sensor.opendtu_network_sta_rssi
138 | - entity: sensor.opendtu_network_network_hostname
139 | - entity: sensor.opendtu_network_network_ip
140 | - entity: sensor.opendtu_network_network_netmask
141 | - entity: sensor.opendtu_network_network_gateway
142 | - entity: sensor.opendtu_network_network_dns1
143 | - entity: sensor.opendtu_network_network_dns2
144 | - entity: sensor.opendtu_network_network_mac
145 | - entity: sensor.opendtu_network_network_mode
146 | - entity: binary_sensor.opendtu_network_ap_status
147 | - entity: sensor.opendtu_network_ap_ssid
148 | - entity: sensor.opendtu_network_ap_ip
149 | - entity: sensor.opendtu_network_ap_mac
150 | - entity: sensor.opendtu_network_ap_stationnum
151 | title: OpenDTU Network
152 | - type: entities
153 | entities:
154 | - entity: binary_sensor.opendtu_ntp_ntp_status
155 | - entity: binary_sensor.opendtu_ntp_sun_issunsetavailable
156 | - entity: binary_sensor.opendtu_ntp_sun_isdayperiod
157 | - entity: sensor.opendtu_ntp_ntp_server
158 | - entity: sensor.opendtu_ntp_ntp_timezone
159 | - entity: sensor.opendtu_ntp_ntp_timezone_descr
160 | - entity: sensor.opendtu_ntp_ntp_localtime
161 | - entity: sensor.opendtu_ntp_sun_settime
162 | - entity: sensor.opendtu_ntp_sun_risetime
163 | title: OpenDTU NTP
164 | - type: entities
165 | entities:
166 | - entity: binary_sensor.opendtu_mqtt_mqtt_enabled
167 | - entity: sensor.opendtu_mqtt_mqtt_hostname
168 | - entity: sensor.opendtu_mqtt_mqtt_port
169 | - entity: sensor.opendtu_mqtt_mqtt_clientid
170 | - entity: sensor.opendtu_mqtt_mqtt_username
171 | - entity: sensor.opendtu_mqtt_mqtt_topic
172 | - entity: binary_sensor.opendtu_mqtt_mqtt_connected
173 | - entity: binary_sensor.opendtu_mqtt_mqtt_retain
174 | - entity: binary_sensor.opendtu_mqtt_mqtt_tls
175 | - entity: sensor.opendtu_mqtt_mqtt_root_ca_cert_info
176 | - entity: binary_sensor.opendtu_mqtt_mqtt_tls_cert_login
177 | - entity: sensor.opendtu_mqtt_mqtt_client_cert_info
178 | - entity: sensor.opendtu_mqtt_mqtt_lwt_topic
179 | - entity: sensor.opendtu_mqtt_mqtt_publish_interval
180 | - entity: binary_sensor.opendtu_mqtt_mqtt_clean_session
181 | - entity: binary_sensor.opendtu_mqtt_mqtt_hass_enabled
182 | - entity: binary_sensor.opendtu_mqtt_mqtt_hass_expire
183 | - entity: binary_sensor.opendtu_mqtt_mqtt_hass_retain
184 | - entity: sensor.opendtu_mqtt_mqtt_hass_topic
185 | - entity: binary_sensor.opendtu_mqtt_mqtt_hass_individualpanels
186 | title: OpenDTU MQTT
187 | title: OpenDTU
188 |
--------------------------------------------------------------------------------
/src/opendtu/opendtu_status.yaml:
--------------------------------------------------------------------------------
1 | ## Read the state objects of OpenDTU using REST Integration
2 | ## See also: https://www.opendtu.solar/firmware/web_api/
3 | ## The integration name "rest:" must appear in configuration.yaml, but belongs here, so it is not used here
4 | ## rest:
5 | - resource: http://192.168.178.15/api/system/status
6 | method: GET
7 | scan_interval: 60
8 | headers:
9 | content-type: "application/json"
10 | binary_sensor:
11 | ## System Status - value is on/off
12 | - name: "OpenDTU system cmt_connected"
13 | value_template: "{{ value_json.cmt_connected }}"
14 | device_class: connectivity
15 | - name: "OpenDTU system cmt_configured"
16 | value_template: "{{ value_json.cmt_configured }}"
17 | device_class: running
18 | - name: "OpenDTU system nrf_connected"
19 | value_template: "{{ value_json.nrf_connected }}"
20 | device_class: connectivity
21 | - name: "OpenDTU system nrf_configured"
22 | value_template: "{{ value_json.nrf_configured }}"
23 | device_class: running
24 | - name: "OpenDTU system nrf_pvariant"
25 | value_template: "{{ value_json.nrf_pvariant }}"
26 | # device_class: None
27 | sensor:
28 | ## System Status - value is string, numeric or else
29 | - name: "OpenDTU system cputemp"
30 | value_template: "{{ value_json.cputemp }}"
31 | unit_of_measurement: "°C"
32 | device_class: temperature
33 | - name: "OpenDTU system cpufreq"
34 | value_template: "{{ value_json.cpufreq }}"
35 | unit_of_measurement: "Hz"
36 | device_class: frequency
37 | - name: "OpenDTU system uptime"
38 | value_template: "{{ value_json.uptime }}"
39 | - name: "OpenDTU system hostname"
40 | value_template: "{{ value_json.hostname }}"
41 | - name: "OpenDTU system sdkversion"
42 | value_template: "{{ value_json.sdkversion }}"
43 | - name: "OpenDTU system heap_total"
44 | value_template: "{{ value_json.heap_total }}"
45 | unit_of_measurement: "B"
46 | device_class: data_size
47 | - name: "OpenDTU system heap_used"
48 | value_template: "{{ value_json.heap_used }}"
49 | unit_of_measurement: "B"
50 | device_class: data_size
51 | - name: "OpenDTU system heap_max_block"
52 | value_template: "{{ value_json.heap_max_block }}"
53 | unit_of_measurement: "B"
54 | device_class: data_size
55 | - name: "OpenDTU system heap_min_free"
56 | value_template: "{{ value_json.heap_min_free }}"
57 | unit_of_measurement: "B"
58 | device_class: data_size
59 | - name: "OpenDTU system psram_total"
60 | value_template: "{{ value_json.psram_total }}"
61 | unit_of_measurement: "B"
62 | device_class: data_size
63 | - name: "OpenDTU system psram_used"
64 | value_template: "{{ value_json.psram_used }}"
65 | unit_of_measurement: "B"
66 | device_class: data_size
67 | - name: "OpenDTU system sketch_total"
68 | value_template: "{{ value_json.sketch_total }}"
69 | unit_of_measurement: "B"
70 | device_class: data_size
71 | - name: "OpenDTU system sketch_used"
72 | value_template: "{{ value_json.sketch_used }}"
73 | unit_of_measurement: "B"
74 | device_class: data_size
75 | - name: "OpenDTU system littlefs_total"
76 | value_template: "{{ value_json.littlefs_total }}"
77 | unit_of_measurement: "B"
78 | device_class: data_size
79 | - name: "OpenDTU system littlefs_used"
80 | value_template: "{{ value_json.littlefs_used }}"
81 | unit_of_measurement: "B"
82 | device_class: data_size
83 | - name: "OpenDTU system chiprevision"
84 | value_template: "{{ value_json.chiprevision }}"
85 | - name: "OpenDTU system chipmodel"
86 | value_template: "{{ value_json.chipmodel }}"
87 | - name: "OpenDTU system chipcores"
88 | value_template: "{{ value_json.chipcores }}"
89 | - name: "OpenDTU system flashsize"
90 | value_template: "{{ value_json.flashsize }}"
91 | unit_of_measurement: "B"
92 | device_class: data_size
93 | - name: "OpenDTU system resetreason_0"
94 | value_template: "{{ value_json.resetreason_0 }}"
95 | - name: "OpenDTU system resetreason_1"
96 | value_template: "{{ value_json.resetreason_1 }}"
97 | - name: "OpenDTU system cfgsavecount"
98 | value_template: "{{ value_json.cfgsavecount }}"
99 | - name: "OpenDTU system config_version"
100 | value_template: "{{ value_json.config_version }}"
101 | - name: "OpenDTU system uptgit_hashime"
102 | value_template: "{{ value_json.git_hash }}"
103 | - name: "OpenDTU system pioenv"
104 | value_template: "{{ value_json.pioenv }}"
105 | - resource: http://192.168.178.15/api/network/status
106 | method: GET
107 | scan_interval: 60
108 | headers:
109 | content-type: "application/json"
110 | binary_sensor:
111 | ## Network Status - value is on/off
112 | - name: "OpenDTU network sta_status"
113 | value_template: "{{ value_json.sta_status }}"
114 | device_class: connectivity
115 | - name: "OpenDTU network ap_status"
116 | value_template: "{{ value_json.ap_status }}"
117 | device_class: connectivity
118 | sensor:
119 | ## Network Status - value is string, numeric or else
120 | - name: "OpenDTU network sta_ssid"
121 | value_template: "{{ value_json.sta_ssid }}"
122 | - name: "OpenDTU network sta_bssid"
123 | value_template: "{{ value_json.sta_bssid }}"
124 | - name: "OpenDTU network sta_rssi"
125 | value_template: "{{ value_json.sta_rssi }}"
126 | - name: "OpenDTU network network_hostname"
127 | value_template: "{{ value_json.network_hostname }}"
128 | - name: "OpenDTU network network_ip"
129 | value_template: "{{ value_json.network_ip }}"
130 | - name: "OpenDTU network network_netmask"
131 | value_template: "{{ value_json.network_netmask }}"
132 | - name: "OpenDTU network network_gateway"
133 | value_template: "{{ value_json.network_gateway }}"
134 | - name: "OpenDTU network network_dns1"
135 | value_template: "{{ value_json.network_dns1 }}"
136 | - name: "OpenDTU network network_dns2"
137 | value_template: "{{ value_json.network_dns2 }}"
138 | - name: "OpenDTU network network_mac"
139 | value_template: "{{ value_json.network_mac }}"
140 | - name: "OpenDTU network network_mode"
141 | value_template: "{{ value_json.network_mode }}"
142 | - name: "OpenDTU network ap_ssid"
143 | value_template: "{{ value_json.ap_ssid }}"
144 | - name: "OpenDTU network ap_ip"
145 | value_template: "{{ value_json.ap_ip }}"
146 | - name: "OpenDTU network ap_mac"
147 | value_template: "{{ value_json.ap_mac }}"
148 | - name: "OpenDTU network ap_stationnum"
149 | value_template: "{{ value_json.ap_stationnum }}"
150 | - resource: http://192.168.178.15/api/ntp/status
151 | method: GET
152 | scan_interval: 60
153 | headers:
154 | content-type: "application/json"
155 | binary_sensor:
156 | ## NTP Status - value is true/false
157 | - name: "OpenDTU ntp ntp_status"
158 | value_template: "{{ value_json.ntp_status }}"
159 | device_class: connectivity
160 | - name: "OpenDTU ntp sun_isSunsetAvailable"
161 | value_template: "{{ value_json.sun_isSunsetAvailable }}"
162 | #device_class: None
163 | - name: "OpenDTU ntp sun_isDayPeriod"
164 | value_template: "{{ value_json.sun_isDayPeriod }}"
165 | #device_class: None
166 | sensor:
167 | ## NTP Status - value is string, numeric or else
168 | - name: "OpenDTU ntp ntp_server"
169 | value_template: "{{ value_json.ntp_server }}"
170 | - name: "OpenDTU ntp ntp_timezone"
171 | value_template: "{{ value_json.ntp_timezone }}"
172 | - name: "OpenDTU ntp ntp_timezone_descr"
173 | value_template: "{{ value_json.ntp_timezone_descr }}"
174 | - name: "OpenDTU ntp ntp_localtime"
175 | value_template: "{{ value_json.ntp_localtime }}"
176 | - name: "OpenDTU ntp sun_risetime"
177 | value_template: "{{ value_json.sun_risetime }}"
178 | - name: "OpenDTU ntp sun_settime"
179 | value_template: "{{ value_json.sun_settime }}"
180 | - resource: http://192.168.178.15/api/mqtt/status
181 | method: GET
182 | scan_interval: 60
183 | headers:
184 | content-type: "application/json"
185 | binary_sensor:
186 | ## MQTT Status - value is true/false
187 | - name: "OpenDTU mqtt mqtt_enabled"
188 | value_template: "{{ value_json.mqtt_enabled }}"
189 | device_class: running
190 | - name: "OpenDTU mqtt mqtt_connected"
191 | value_template: "{{ value_json.mqtt_connected }}"
192 | device_class: connectivity
193 | - name: "OpenDTU mqtt mqtt_retain"
194 | value_template: "{{ value_json.mqtt_retain }}"
195 | - name: "OpenDTU mqtt mqtt_tls"
196 | value_template: "{{ value_json.mqtt_tls }}"
197 | - name: "OpenDTU mqtt mqtt_tls_cert_login"
198 | value_template: "{{ value_json.mqtt_tls_cert_login }}"
199 | - name: "OpenDTU mqtt mqtt_clean_session"
200 | value_template: "{{ value_json.mqtt_clean_session }}"
201 | - name: "OpenDTU mqtt mqtt_hass_enabled"
202 | value_template: "{{ value_json.mqtt_hass_enabled }}"
203 | - name: "OpenDTU mqtt mqtt_hass_expire"
204 | value_template: "{{ value_json.mqtt_hass_expire }}"
205 | - name: "OpenDTU mqtt mqtt_hass_retain"
206 | value_template: "{{ value_json.mqtt_hass_retain }}"
207 | - name: "OpenDTU mqtt mqtt_hass_individualpanels"
208 | value_template: "{{ value_json.mqtt_hass_individualpanels }}"
209 | sensor:
210 | ## MQTT Status - Value is if string or else
211 | - name: "OpenDTU mqtt mqtt_hostname"
212 | value_template: "{{ value_json.mqtt_hostname }}"
213 | - name: "OpenDTU mqtt mqtt_port"
214 | value_template: "{{ value_json.mqtt_port }}"
215 | - name: "OpenDTU mqtt mqtt_clientid"
216 | value_template: "{{ value_json.mqtt_clientid }}"
217 | - name: "OpenDTU mqtt mqtt_username"
218 | value_template: "{{ value_json.mqtt_username }}"
219 | - name: "OpenDTU mqtt mqtt_topic"
220 | value_template: "{{ value_json.mqtt_topic }}"
221 | - name: "OpenDTU mqtt mqtt_root_ca_cert_info"
222 | value_template: "{{ value_json.mqtt_root_ca_cert_info }}"
223 | - name: "OpenDTU mqtt mqtt_client_cert_info"
224 | value_template: "{{ value_json.mqtt_client_cert_info }}"
225 | - name: "OpenDTU mqtt mqtt_lwt_topic"
226 | value_template: "{{ value_json.mqtt_lwt_topic }}"
227 | - name: "OpenDTU mqtt mqtt_publish_interval"
228 | value_template: "{{ value_json.mqtt_publish_interval }}"
229 | - name: "OpenDTU mqtt mqtt_hass_topic"
230 | value_template: "{{ value_json.mqtt_hass_topic }}"
231 |
--------------------------------------------------------------------------------