OK.
Allereerst de handmatige (eenmalige) handelingen en uitleg.
Aanpassingen op de originele Gielz international automatisering:
1. De Gielz triggert elke 21 seconde, hoger mag, lager niet.
2. Alle factoren in de Gielz heb ik op 75% gezet. Wellicht zijn die niet allemaal nodig maar dat heb ik verder niet uitgezocht.
3. De hoogte van een spike heb ik gezet op 1000W, daarmee kun je spelen.
4. De alternatieve p1 meter sensor (p1_sp_el_sensor) die ik gebruik wordt beperkt in z'n maximale veranderingen. Ik heb dat nu op 500W staan.
5. Er is een template sensor (ik heb een aparte yaml file met templates)
6. Ook een rijtje helpers, waarvan de meeste gebruikt kunnen worden voor debugging, te herkennen aan 'dbg' in de naam.
7. En natuurlijk de automation zelf.
Al deze extra files heb ik in de 'packages' folder staan.
Helpers:
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
| input_number:
p1_last_1:
name: P1 last reading 1 #1
min: -9000
max: 9000
step: 1
mode: box
p1_last_2:
name: P1 last reading 2 #2
min: -9000
max: 9000
step: 1
mode: box
p1_last_3:
name: P1 last reading 3 #3
min: -9000
max: 9000
step: 1
mode: box
p1_sp_el:
name: P1 spike eliminated
min: -9000
max: 9000
step: 1
mode: box
p1_dbg_new_val:
name: P1 debug new_val
min: -9000
max: 9000
step: 1
mode: box
p1_dbg_close_to_l1:
name: P1 debug close_to_l1 (0/1)
min: -9000
max: 9000
step: 1
mode: box
p1_dbg_close_to_l2:
name: P1 debug close_to_l2 (0/1)
min: -9000
max: 9000
step: 1
mode: box
p1_dbg_l1_eff:
name: P1 debug l1_eff (after spike rule)
min: -9000
max: 9000
step: 1
mode: box
p1_dbg_sp_el_unclamped:
name: P1 debug sp_el_unclamped
min: -9000
max: 9000
step: 1
mode: box
p1_dbg_sp_el:
name: P1 debug sp_el (clamped)
min: -9000
max: 9000
step: 1
mode: box
p1_dbg_spike_detected:
name: P1 debug spike detected
min: 0
max: 2
step: 1
mode: box |
Een template:
YAML:
1
2
3
4
5
6
7
| template:
- sensor:
- name: p1_sp_el_sensor
state: "{{ states('input_number.p1_sp_el') | float(0) | round(0) }}"
unit_of_measurement: "W"
device_class: power
state_class: measurement |
en de automation:
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
| automation:
- alias: "P1 spike elimination v8.0"
mode: single
trigger:
- platform: state
entity_id: sensor.homewizard_p1_power
id: p1_power_trigger
- platform: state
entity_id: sensor.zendure_charging_mode
id: modus_trigger
variables:
new_val: "{{ states('sensor.homewizard_p1_power') | float(0) }}"
last_1: "{{ states('input_number.p1_last_1') | float(0) }}"
last_2: "{{ states('input_number.p1_last_2') | float(0) }}"
last_3: "{{ states('input_number.p1_last_3') | float(0) }}"
sp_el_old: "{{ states('input_number.p1_sp_el') | float(0) }}"
spike_range: 1000
max_delta: 500
nv_close_to_l1: >-
{{ ((new_val - last_1) | abs) }}
nv_close_to_l2: >-
{{ ((new_val - last_2) | abs ) }}
spike_detected: >-
{{
1
if (
((nv_close_to_l2 | float(0)) * 2)
< (spike_range | float(0))
and
(nv_close_to_l1 | float(0))
> (spike_range | float(0))
)
else 0
}}
l1_eff: >-
{% if spike_detected | int(0) == 1 %}
{{ new_val | float(0) }}
{% else %}
{{ last_1 | float(0) }}
{% endif %}
sp_el_unclamped: >-
{% if nv_close_to_l1 > spike_range %}
{% set nv = last_1 %}
{% else %}
{% set nv = new_val %}
{% endif %}
{% if spike_detected | int(0) == 1 %}
{{ sp_el_old | float(0) }}
{% else %}
{% set solar = states('sensor.solaredge_i1_ac_power') | float(0) %}
{{
(
nv
- solar * 0.3
) | round(0)
}}
{% endif %}
sp_el: >-
{% set delta = sp_el_unclamped - sp_el_old %}
{% if delta > max_delta %}
{{ sp_el_old + max_delta }}
{% elif delta < -max_delta %}
{{ sp_el_old - max_delta }}
{% else %}
{{ sp_el_unclamped }}
{% endif %}
action:
- service: input_number.set_value
target:
entity_id: input_number.p1_dbg_sp_el_unclamped
data:
value: "{{ (sp_el_unclamped | float(0)) }}"
- service: input_number.set_value
target:
entity_id: input_number.p1_dbg_sp_el
data:
value: "{{ (sp_el | float(0)) }}"
- service: input_number.set_value
target:
entity_id: input_number.p1_dbg_new_val
data:
value: "{{ new_val }}"
- service: input_number.set_value
target:
entity_id: input_number.p1_dbg_close_to_l2
data:
value: "{{ nv_close_to_l2 }}"
- service: input_number.set_value
target:
entity_id: input_number.p1_dbg_close_to_l1
data:
value: "{{ nv_close_to_l1 }}"
- service: input_number.set_value
target:
entity_id: input_number.p1_dbg_spike_detected
data:
value: "{{ spike_detected | int(0) }}"
- service: input_number.set_value
target:
entity_id: input_number.p1_dbg_last_1
data:
value: "{{ last_1 }}"
- service: input_number.set_value
target:
entity_id: input_number.p1_dbg_last_2
data:
value: "{{ last_2 }}"
- service: input_number.set_value
target:
entity_id: input_number.p1_dbg_l1_eff
data:
value: "{{ l1_eff }}"
- service: input_number.set_value
target:
entity_id: input_number.p1_last_3
data:
value: "{{ last_2 }}"
- service: input_number.set_value
target:
entity_id: input_number.p1_last_2
data:
value: "{{ last_1 }}"
- service: input_number.set_value
target:
entity_id: input_number.p1_last_1
data:
value: "{{ new_val }}"
- service: input_number.set_value
target:
entity_id: input_number.p1_sp_el
data:
value: "{{ sp_el }}" |
en nogmaals, alles waar 'dbg' in de naam staat is voor de werking niet relevant, alleen voor debugging.
Daarvoor heb ik dit in een dashboard gezet:
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
| type: entities
entities:
- entity: sensor.homewizard_p1_power
- entity: input_number.p1_last_1
- entity: input_number.p1_last_2
- entity: input_number.p1_last_3
- entity: sensor.p1_sp_el_sensor
- entity: input_number.p1_dbg_spike_detected
- entity: input_number.p1_dbg_close_to_l1
name: nv_close_l1
- entity: input_number.p1_dbg_close_to_l2
name: nv_close_l2 |
Succes! En ik hoor graag of het bij anderen ook netjes werkt.