In grote lijnen doet het continu een voorspelling van waar de piek van dat kwartier naar toe gaat. Als die te hoog of groter dan het vorige max wordt krijg je een notification in je HA app op je mobiel. Vanzelfsprekend, hoe dichter tegen het einde van het kwartier, hoe nauwkeuriger de voorspelling wordt.
Sensoren en andere:
Code: Selecteer alles
sensor:
- platform: derivative
#Derivative op basis van gemeten vermogen met time window van 15 minuten. Dit geeft een W/min waarde (de richtingscoëfficiënt/trend).
source: sensor.shellyem3_channel_a_power
name: Kwartier piek trend
round: 2
unit_time: min
time_window: "00:15:00"
- platform: statistics
name: "Vermogen net 15min average"
entity_id: sensor.shellyem3_channel_a_power
unique_id: grid_average_15min_window
state_characteristic: average_linear
max_age:
minutes: 15
sampling_size: 30 #groot genoeg zetten zodat alle samples genomen binnen kwartier genomen worden
precision: 1
utility_meter:
elek_energieverbruik_kwartier:
source: sensor.shellyem3_channel_a_energy
cycle: quarter-hourly
input_number:
piek_elek_kwartier_min_remaining:
name: Piek elek min remaining in kwartier
min: 0
max: 900.0
step: 1
mode: box
unit_of_measurement: "min"
piek_elek:
name: Piek elek afname
min: 0
max: 500.0
step: 0.001
mode: box
unit_of_measurement: "kW"
piek_elek_prediction:
name: Piek elek voorspelling
min: 0
max: 500.0
step: 0.001
mode: box
unit_of_measurement: "kW"
piek_elek_01:
name: Piek elek januari
min: 0
max: 10.0
step: 0.001
mode: box
unit_of_measurement: "kW"
piek_elek_02:
name: Piek elek februari
min: 0
max: 10.0
step: 0.001
mode: box
unit_of_measurement: "kW"
piek_elek_03:
name: Piek elek maart
min: 0
max: 10.0
step: 0.001
mode: box
unit_of_measurement: "kW"
piek_elek_04:
name: Piek elek april
min: 0
max: 10.0
step: 0.001
mode: box
unit_of_measurement: "kW"
piek_elek_05:
name: Piek elek mei
min: 0
max: 10.0
step: 0.001
mode: box
unit_of_measurement: "kW"
piek_elek_06:
name: Piek elek juni
min: 0
max: 10.0
step: 0.001
mode: box
unit_of_measurement: "kW"
piek_elek_07:
name: Piek elek juli
min: 0
max: 10.0
step: 0.001
mode: box
unit_of_measurement: "kW"
piek_elek_08:
name: Piek elek augustus
min: 0
max: 10.0
step: 0.001
mode: box
unit_of_measurement: "kW"
piek_elek_09:
name: Piek elek september
min: 0
max: 10.0
step: 0.001
mode: box
unit_of_measurement: "kW"
piek_elek_10:
name: Piek elek oktober
min: 0
max: 10.0
step: 0.001
mode: box
unit_of_measurement: "kW"
piek_elek_11:
name: Piek elek november
min: 0
max: 10.0
step: 0.001
mode: box
unit_of_measurement: "kW"
piek_elek_12:
name: Piek elek december
min: 0
max: 10.0
step: 0.001
mode: box
unit_of_measurement: "kW"
Code: Selecteer alles
alias: Cap tarief - Set Seconds remaining
description: set seconds
trigger:
- platform: state
entity_id:
- sensor.kwartier_piek_trend
action:
- choose:
- conditions:
- condition: template
value_template: "{{ currectSecondInHour > (45 * 60) }}"
sequence:
- service: input_number.set_value
target:
entity_id: input_number.piek_elek_kwartier_min_remaining
data:
value: "{{ ((60*60) - currectSecondInHour)|float(0) / float(60)}}"
- conditions:
- condition: template
value_template: "{{ currectSecondInHour > (30 * 60) }}"
sequence:
- service: input_number.set_value
target:
entity_id: input_number.piek_elek_kwartier_min_remaining
data:
value: "{{ ((45*60) - currectSecondInHour)|float(0) / float(60)}}"
- conditions:
- condition: template
value_template: "{{ currectSecondInHour > (15 * 60) }}"
sequence:
- service: input_number.set_value
target:
entity_id: input_number.piek_elek_kwartier_min_remaining
data:
value: "{{ ((30*60) - currectSecondInHour)|float(0) / float(60)}}"
default:
- service: input_number.set_value
target:
entity_id: input_number.piek_elek_kwartier_min_remaining
data:
value: "{{ ((15*60) - currectSecondInHour)|float(0) / float(60)}}"
mode: parallel
variables:
currectSecondInHour: "{{ now().minute * int(60) + now().second }}"
Code: Selecteer alles
alias: Cap tarief - set prediction
description: set prediction
trigger:
- platform: state
entity_id:
- sensor.kwartier_piek_trend
action:
- service: input_number.set_value
target:
entity_id: input_number.piek_elek_prediction
data:
value: >-
{{ (currentAveragePower +
(states("input_number.piek_elek_kwartier_min_remaining")|float(0) *
trend / float(1000)))|round(3)}}
mode: parallel
variables:
maand: "{{ now().strftime(\"%m\") }}"
currentAveragePower: "{{ states(\"sensor.vermogen_net_15min_average\")|float(0) / float(1000)}}"
trend: "{{ states(\"sensor.kwartier_piek_trend\")|float(0) }}"
Code: Selecteer alles
alias: Cap tarief - 15min W peak trend threshold crossing warning
description: 15min W peak trend threshold crossing warning
trigger:
- platform: state
entity_id:
- input_number.piek_elek_prediction
condition:
- condition: and
conditions:
- condition: template
value_template: >
{{ currentAveragePower > 0 and
states("sensor.kwartier_piek_trend")|float(0) > 0 }}
- condition: template
value_template: >
{{ states("input_number.piek_elek_prediction")|float(0) >
states("input_number.piek_elek_"~maand)|float(0) }}
- condition: template
value_template: >
{{ states("input_number.piek_elek_prediction")|float(0) > float(2.5)
}}
- condition: template
value_template: >
{{ states("input_number.piek_elek_kwartier_min_remaining")|float(0) <
float(12) }}
action:
- service: notify.mobile_app
data:
message: >
Vorige maandpiek van {{
states("input_number.piek_elek_"~maand)|float(0)|round(2) }}kW gaat
mogelijks {{
states("input_number.piek_elek_prediction")|float(0)|round(2) }}kW
worden. Nog
{{states("input_number.piek_elek_kwartier_min_remaining")|float(0)|round(2)}}
minuten over.
- delay:
hours: 0
minutes: 2
seconds: 0
milliseconds: 0
variables:
maand: "{{ now().strftime(\"%m\") }}"
currentAveragePower: "{{ states(\"sensor.vermogen_net_15min_average\")|float(0) / float(1000)}}"
Niet gelinkt aan de voorspelling, maar handig:
Op basis van mede userbaser, zetten huidige piek en notification in HA app.
Code: Selecteer alles
alias: Cap tarief - Piek15m hoogste van deze maand
description: ""
trigger:
- platform: state
entity_id: sensor.elek_energieverbruik_kwartier
condition:
- condition: template
value_template: |
{{ piek > states("input_number.piek_elek_"~maand) | float(0) }}
action:
- service: input_number.set_value
target:
entity_id: input_number.piek_elek_{{ maand }}
data:
value: "{{ piek }}"
- if:
- condition: template
value_template: |
{{ piek > float(2.5) }}
then:
- service: notify.mobile_app
data:
message: |
Nieuwe maandpiek van {{ piek|round(2) }}kW.
mode: parallel
variables:
maand: "{{ now().strftime(\"%m\") }}"
piek: "{{ states(\"sensor.elek_energieverbruik_kwartier\")|float(0) * 4}}"
Code: Selecteer alles
alias: Cap tarief - Maximum piek nieuwe maand op 0
description: ""
trigger:
- platform: template
value_template: "{{ (as_timestamp(now()))|timestamp_custom('%d', true) | int(0) == 1 }}"
action:
- service: input_number.set_value
target:
entity_id: input_number.piek_elek_{{ maand }}
data:
value: 0.1
variables:
maand: "{{ now().strftime(\"%m\") }}"
Er is zeker mogelijkheid tot verbetering, bv. niet werken op basis van trend op basis sliding window van 15min, maar beter window nemen vanaf start begonnen kwartier.