Ben er toch nog wat meer mee gaan stoeien om een mooiere integratie met Home Assistant te krijgen. Met live meetwaarden en dagelijkse, maandelijkse, jaarlijkse en totale yield als sensoren die gebruik kunnen worden in de lovelace.
Hiervoor HACS geïnstalleerd, en PythonScriptsPro
En dan in configuration.yaml
in sensor.yaml
In template.yaml
De koppeling naar PVOutput in shell_command.yaml
En tenslotte de automation die iedere 5 minuten bovenstaande shell command uitvoert
Mocht iemand hier een complete 1-click integratie voor willen maken, mag dat uiteraard.
Hiervoor HACS geïnstalleerd, en PythonScriptsPro
En dan in configuration.yaml
YAML:
1
2
3
4
5
6
7
| sensor: !include sensor.yaml template: !include template.yaml shell_command: !include shell_command.yaml python_script: requirements: - bs4 |
in sensor.yaml
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
| - platform: rest resource: http://192.168.1.134/measurements.xml json_attributes: - root - Measurements name: solar_inverter scan_interval: 10 value_template: "OK" - platform: python_script name: solar_yield_day_script scan_interval: 10 unit_of_measurement: "kWh" device_class: energy source: | import requests from bs4 import BeautifulSoup steca_ip = '192.168.1.134' yield_url = f'http://{steca_ip}/gen.yield.day.chart.js' yield_response = requests.get(yield_url) yield_data = yield_response.text energy = float(yield_data[yield_data.find('labelValueId') + 28:yield_data.find('labelValueId') + 36].strip()) self.state = energy - platform: python_script name: solar_yield_month_script scan_interval: 10 unit_of_measurement: "kWh" device_class: energy source: | import requests from bs4 import BeautifulSoup steca_ip = '192.168.1.134' yield_url = f'http://{steca_ip}/gen.yield.month.chart.js' yield_response = requests.get(yield_url) yield_data = yield_response.text energy = float(yield_data[yield_data.find('labelValueId') + 28:yield_data.find('labelValueId') + 36].strip()) self.state = energy - platform: python_script name: solar_yield_year_script scan_interval: 10 unit_of_measurement: "kWh" device_class: energy source: | import requests from bs4 import BeautifulSoup steca_ip = '192.168.1.134' yield_url = f'http://{steca_ip}/gen.yield.year.chart.js' yield_response = requests.get(yield_url) yield_data = yield_response.text energy = float(yield_data[yield_data.find('labelValueId') + 28:yield_data.find('labelValueId') + 36].strip()) self.state = energy - platform: python_script name: solar_yield_total_script scan_interval: 10 unit_of_measurement: "MWh" device_class: energy source: | import requests from bs4 import BeautifulSoup steca_ip = '192.168.1.134' yield_url = f'http://{steca_ip}/gen.yield.total.chart.js' yield_response = requests.get(yield_url) yield_data = yield_response.text energy = float(yield_data[yield_data.find('labelValueId') + 28:yield_data.find('labelValueId') + 36].strip()) self.state = energy |
In template.yaml
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
| - sensor: - name: "Solar Yield Today" unique_id: RearuKnxdgFzYjaK state: "{{ states('sensor.solar_yield_day_script') }}" state_class: total_increasing unit_of_measurement: kWh device_class: energy icon: mdi:solar-power - name: "Solar Yield This Month" unique_id: dtMNNGRtNKtkUECN state: "{{ states('sensor.solar_yield_month_script') }}" state_class: total_increasing unit_of_measurement: kWh device_class: energy icon: mdi:solar-power - name: "Solar Yield This Year" unique_id: jLpAosxbezeCcqSv state: "{{ states('sensor.solar_yield_year_script') }}" state_class: total_increasing unit_of_measurement: kWh device_class: energy icon: mdi:solar-power - name: "Solar Yield Total" unique_id: sxpKrjSDAoVcqgMw state: "{{ states('sensor.solar_yield_total_script') }}" state_class: total_increasing unit_of_measurement: MWh device_class: energy icon: mdi:solar-power - name: "Solar AC Voltage Phase 1" unique_id: XNNswihybtxBbAjq state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[0]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[0]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: V device_class: voltage - name: "Solar AC Voltage Phase 2" unique_id: QrkrQWbDAtwoPHdB state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[1]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[1]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: V device_class: voltage - name: "Solar AC Voltage Phase 3" unique_id: xGqFmhZDkfduuaFS state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[2]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[2]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: V device_class: voltage - name: "Solar AC Current Phase 1" unique_id: NCpTpjrsoEKGYhvq state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[3]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[3]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: A device_class: current - name: "Solar AC Current Phase 2" unique_id: GnCZSBjuTjgyLpfQ state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[4]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[4]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: A device_class: current - name: "Solar AC Current Phase 3" unique_id: pbaMwmzuRHgprLgu state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[5]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[5]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: A device_class: current - name: "Solar AC Power" unique_id: zcBJGXvKEcmFqsbP state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[6]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[6]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: W device_class: power - name: "Solar AC Power Phase 1" unique_id: QFwaCwHDAFpvKFjZ state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[7]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[7]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: W device_class: power - name: "Solar AC Power Phase 2" unique_id: weFieCejxoVPCNXm state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[8]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[8]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: W device_class: power - name: "Solar AC Power Phase 3" unique_id: shLnaJEDuRPEgggv state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[9]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[9]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: W device_class: power - name: "Solar AC Frequency Phase 1" unique_id: DtKCvNYdQNaPMkoX state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[10]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[10]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: Hz device_class: frequency - name: "Solar AC Frequency Phase 2" unique_id: bveguBApjXMDeeRM state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[11]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[11]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: Hz device_class: frequency - name: "Solar AC Frequency Phase 3" unique_id: fJmyiHCuetPjTjgm state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[12]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[12]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: Hz device_class: frequency - name: "Solar DC Voltage" unique_id: aHrqVfYUTbUCXSMG state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[13]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[13]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: V device_class: voltage - name: "Solar DC Current" unique_id: jdCeACRToqjujnHe state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[14]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[14]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: A device_class: current - name: "Solar DC Power" unique_id: TQmEichrHsBVCwDQ state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[15]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[15]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: W device_class: power - name: "Solar System Temperature" unique_id: PSEzDFEUTSJBgGLP state: > {% set root = state_attr('sensor.solar_inverter', 'root') %} {% if root.Device.Measurements.Measurement[16]["@Value"] != "-nan" %} {{ root.Device.Measurements.Measurement[16]["@Value"]}} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: °C device_class: temperature - name: "Solar AC/DC Conversion Efficiency" unique_id: cbKRaTGcYGXAJvfE state: > {% if states('sensor.solar_ac_power') > '0' and states('sensor.solar_dc_power') > '0'%} {{ states('sensor.solar_ac_power') | int / states('sensor.solar_dc_power') | int * 100 }} {% else %} 0 {% endif %} state_class: measurement unit_of_measurement: "%" icon: mdi:shuffle |
De koppeling naar PVOutput in shell_command.yaml
YAML:
1
2
3
4
5
6
7
8
9
10
| steca2pvoutput: > curl -d "d={{now().strftime("%Y%m%d")}}" -d "t={{now().strftime("%H:%M")}}" -d "v1={{ (states('sensor.solar_yield_today') | float * 1000) | int }}" -d "v2={{ states('sensor.solar_ac_power') }}" # -d "v5={{ states('sensor.thuis_outdoor_temperature') }}" # (hiervoor gebruik ik de buitentemperatuursensor van mijn Remeha Elga Ace) -d "v6={{ states('sensor.solar_dc_voltage') }}" -H "X-Pvoutput-SystemId: 102069" -H "X-Pvoutput-Apikey: knipperdeknip" https://pvoutput.org/service/r2/addstatus.jsp |
En tenslotte de automation die iedere 5 minuten bovenstaande shell command uitvoert
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| alias: Steca2PVOutput description: "Uploads solar sensor data to PVOutput every 5 minutes" trigger: - platform: homeassistant event: start condition: [] action: - repeat: sequence: - service: shell_command.steca2pvoutput data: {} - delay: hours: 0 minutes: 5 seconds: 0 milliseconds: 0 while: - condition: state entity_id: automation.steca2pvoutput state: "on" mode: single |
Mocht iemand hier een complete 1-click integratie voor willen maken, mag dat uiteraard.

:strip_exif()/f/image/8pToduNxMtAdKyQ60IspW9Xi.jpg?f=fotoalbum_large)
:no_upscale():strip_icc():strip_exif()/f/image/GAqZdFj2Zt7fdeTqOeE2IcXe.jpg?f=user_large)
:strip_exif()/f/image/sOyRgvkk72WyuOUm5wpVvW5q.jpg?f=fotoalbum_large)
:strip_exif()/f/image/i6zCL7w0BSQDVs4q1aiFfpKj.jpg?f=fotoalbum_large)
/f/image/mC5R3wimDEowRp75V24tgK8W.png?f=fotoalbum_large)
/f/image/ZKG1kPTDg4PyBEfvGQPL0gSa.png?f=fotoalbum_large)
/f/image/yyRj9QeJSS2tgPQwjsS6iDKt.png?f=fotoalbum_large)