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\") }}"
 ) dus het kan zijn dat ik in een copy paste bui wat onnodige zaken heb laten staan.
 ) dus het kan zijn dat ik in een copy paste bui wat onnodige zaken heb laten staan.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.
 
					 
  
 

















