├── .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 | ![REST Integration](./opendtu_rest_integation.JPG) 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 | ![REST Integration](./opendtu_visualisation_example.JPG) 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 | ![REST Integration](./opend_dtu_rest_example.JPG) 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 | --------------------------------------------------------------------------------