"Unter-" Attribute aus einer Entität filtern und darstellen

Guten Abend (Moin) in die Runde,

ich möchte mein HA im Sektor Energiemanagement ausbauen. Ich habe meine Solaranlage integriert, meinen Zähler (bin Tibber-Kunde mit stündlicher Abrechnung) und eine “Ertragsvorhersage” für mein Wohngebiet als Entitäten.
Nun würde ich gerne eine Automation erstellen welche mir bei: wenig Sonne, wenig “Vorhersage” und günstiger “Netzenergie” meinen Wechselrichter sagt, das er mit der Energie aus dem Netz meine Batterien füllen darf! (in der Regel Nachts…)
Eine Vorhersage der Preise des kommenden Tages bekomme ich täglich gegen 13Uhr.
Dazu habe ich mir einen Sensor gebaut welcher die Preise “abholt” und mir einer Apex-Grafik darstellt.

In der Entität sind dieses aber “nur” Attribute mit “Unterattributen” welche wie in den Bilder aussehen…



Jetzt weiss ich nicht, wie ich dort nun die 3 günstigsten, aufeinanderfolgenden Preisstunden bei tomorrow herausfiltere.
(3Stunden für 100%Akku!)

Danke

Moin,
ich bin mir nicht sicher ob es funktioniert, aber so in der Art würde ich es probieren:

{% set s0 = (state_attr('sensor.tibber_prices', 'tomorrow')[0].total) %}
{% set s1 = (state_attr('sensor.tibber_prices', 'tomorrow')[1].total) %}
{% set s2 = (state_attr('sensor.tibber_prices', 'tomorrow')[2].total) %}
{% set s3 = (state_attr('sensor.tibber_prices', 'tomorrow')[3].total) %}
{% set s4 = (state_attr('sensor.tibber_prices', 'tomorrow')[4].total) %}
{% set s5 = (state_attr('sensor.tibber_prices', 'tomorrow')[5].total) %}
{% set s02 = (s0 + s1 + s2) %}
{% set s13 = (s1 + s2 + s3) %}
{% set s24 = (s2 + s3 + s4) %}
{% set s35 = (s3 + s4 + s5) %}
{% set low = ([s02, s13, s24, s35] | min) %}
{% if low == s02 %}
    0-3Uhr
{% elif low == s13 %}
    1-4Uhr
{% elif low == s24 %}
    2-5Uhr
{% elif low == s35 %}
    3-6Uhr
{% endif %}

kannst ja mal in den Entwicklerwerkzeugen gucken was bei raus kommt bzw. ob es überhaupt funktioniert😅
Bin kein Tibber Kunde und hab den Sensor nicht deswegen kann ich es grade nicht so gut testen.

Edit:

Habe es bei mir mit Festen Werten getestet und da wird der Günstigste rausgesucht:

{% set s02 = 1.4 %}
{% set s13 = 1.3 %}
{% set s24 = 1.5 %}
{% set s35 = 1.6 %}
{% set low = ([s02, s13, s24, s35] | min) %}
{% if low == s02 %}
    0-3Uhr
{% elif low == s13 %}
    1-4Uhr
{% elif low == s24 %}
    2-5Uhr
{% elif low == s35 %}
    3-6Uhr
{% endif %}

Edit 2:
wenn das oben funktioniert kannst du ein Template Sensor mit trigger erstellen den du dann in einer Automation benutzen kannst.

template:
  - trigger:
      - platform: time
        at: "15:00:00"
    sensor:
      - name: "Günstige Ladestunden"
        unique_id: gunstige_ladestunden_tibber
        state: >
          {% set s0 = (state_attr('sensor.tibber_prices', 'tomorrow')[0].total) %}
          {% set s1 = (state_attr('sensor.tibber_prices', 'tomorrow')[1].total) %}
          {% set s2 = (state_attr('sensor.tibber_prices', 'tomorrow')[2].total) %}
          {% set s3 = (state_attr('sensor.tibber_prices', 'tomorrow')[3].total) %}
          {% set s4 = (state_attr('sensor.tibber_prices', 'tomorrow')[4].total) %}
          {% set s5 = (state_attr('sensor.tibber_prices', 'tomorrow')[5].total) %}
          {% set s02 = (s0 + s1 + s2) %}
          {% set s13 = (s1 + s2 + s3) %}
          {% set s24 = (s2 + s3 + s4) %}
          {% set s35 = (s3 + s4 + s5) %}
          {% set low = ([s02, s13, s24, s35] | min) %}
          {% if low == s02 %}
              0-3Uhr
          {% elif low == s13 %}
              1-4Uhr
          {% elif low == s24 %}
              2-5Uhr
          {% elif low == s35 %}
              3-6Uhr
          {% endif %}

Ich hab den Trigger für den Sensor mal auf 15 Uhr gesetzt damit dazwischen noch ein bisschen Pufferzeit ist.
Edit 3:
Fehler im Code Behoben
LG
Tobi

1 „Gefällt mir“

Moin,

danke für die schnelle Antwort!
Leider funktioniert das noch nicht…

Ich will das mal versuchen etwas besser zu erklären wie bzw. was ich im Moment habe und worauf ich hinaus möchte…

Also, neben meinem Energiedashboard habe ich mir auch eine eigene Ansicht im Dashboard angelegt:

Die Daten beziehe ich zum einem aus meinem Wechselrichter über ESPHome, dann über mein Tibber Account (Gerät Tibber Pulse) welcher mir die Daten meines Zählers ausliest und auch die Kosten zur Verfügung stellt und dann noch die Integration: Forecast.Solar welche mir eine geschätzte Vorhersage meines Ertrages liefert.

Der ESP an meinem Wechselrichter macht es mir möglich mein WR-Modell auch aus der ferne her zu steuern und zwar in diesem Fall sogar insgesamt 6 “Ladezeiten” bzw. nennt sich das dort Batterienutzungszeiten bei welchem ich dem WR auch sagen kann das auch das Laden aus dem Netz möglich ist das sieht dann so bei mir aus:

Im Moment stelle ich die Ladezeit immer händisch im ersten Slot ein (Siehe Karte unter der Apex-Chart-Karte)
Wobei die Zeiteingabe dann z.B. heißt: 100=1Uhr oder 2.200=22Uhr und die SoC (State of Charge) die Prozent der Ladegrenze darstellt (wenn wie z.B. dargestellt Von 100 bis 300 100% da steht wird von 1-3Uhr Nachts bis max. 100% geladen. Ist der Schalter "Laden, was laden aus dem Netz darstellen soll, aus, so wird nur ggf. von der PV geladen und bis 10% entladen.)

Und genau diese stelle ist es genau das, welches ich automatisieren möchte.

Ich hoffe das hilft ein wenig weiter um mich zu verstehen was genau ich versuche…

Danke!

Habe gerade nochmal genau hingeschaut und in deinem code war tommorrow falsch geschrieben (tomorrow).
Habe dieses abgeändert und jetzt funktioniert das schonmal

BESTEN DANK!!!

Nur, wie bekomm ich die Zeit jetzt in meine WR-Entitäten?
Dieses sind immer die Startat Zeiten. die sehen so aus:

:crayon:by HarryP: Zusammenführung Doppelpost.

Whoops einmal falsch geschrieben und dann schön copy paste :rofl: (habs abgeändert :slight_smile: )

Du kannst doch eine Automation machen ungefähr so:

description: "Ladezeit setzen"
mode: single
trigger:
  - platform: state
    entity_id:
      - sensor.gunstige_ladestunden_tibber
condition: []
action:
  - choose:
      - conditions:
          - condition: state
            entity_id: sensor.gunstige_ladestunden_tibber
            state: 0-3Uhr
        sequence:
          - ###hier die werte setzen für die Ladezeit 0-3
      - conditions: []
          - condition: state
            entity_id: sensor.gunstige_ladestunden_tibber
            state: 1-4Uhr
        sequence:
          - ###hier die werte setzen für die Ladezeit 1-4
usw...

Stimmt auch, sorry sehe den Wald vor lauter Bäume etc…, wird definitiv Zeit für mich für eine Pause…

Danke, werde ich morgen direkt probieren und berichten!

Für heute mach ich Schluss bevor noch “schlimme” Fehler passieren :see_no_evil:

Gute Nacht!

Und nochmal: BESTEN DANK bis hier!

1 „Gefällt mir“

So, Hallo,

nun frisch dabei…

Also, der Sensor funktioniert Tip-Top!

nun würde ich das ganze aber gerne nicht in die configuration.yaml schreiben sondern in eine extra sensor.yaml…
Aber irgendetwas übersehe ich da, bzw. habe ich noch nicht gelernt…

Ich habe mir diese schon angelegt und dort auch einige template Sensoren eingefügt die auch super funktionieren. Der Anfang sieht so aus:


Da steht auch der Sensor drin, welcher mir die kommenden Strompreise abholt!
Und genau darunter würde ich jetzt auch den Ladezeitensensor einbinden wollen. In etwa so:

So wird dieses aber abgelehnt:

Ich weiss, mit Sicherheit ein Denkfehler von mir. Ist bei mir alles “learning by doing” sorry.

Danke!

Die plattform: time gehört doch zum Trigger und nicht zum Sensor.

Versuch es mit

- platform: template
  sensor.......

Bzw. setze es oben unter die anderen.

das muss wenn in die template.yaml
du musst das in der configuration.yaml stehen haben:

template: !include template.yaml

und dann in der template.yaml:

- trigger:
    - platform: time
      at: "15:00:00"
  sensor:
    - name: "Günstige Ladestunden"
      unique_id: gunstige_ladestunden_tibber
      state: >
        {% set s0 = (state_attr('sensor.tibber_prices', 'tommorrow')[0].total) %}
        {% set s1 = (state_attr('sensor.tibber_prices', 'tommorrow')[1].total) %}
        {% set s2 = (state_attr('sensor.tibber_prices', 'tommorrow')[2].total) %}
        {% set s3 = (state_attr('sensor.tibber_prices', 'tommorrow')[3].total) %}
        {% set s4 = (state_attr('sensor.tibber_prices', 'tommorrow')[4].total) %}
        {% set s5 = (state_attr('sensor.tibber_prices', 'tommorrow')[5].total) %}
        {% set s02 = (s0 + s1 + s2) %}
        {% set s13 = (s1 + s2 + s3) %}
        {% set s24 = (s2 + s3 + s4) %}
        {% set s35 = (s3 + s4 + s5) %}
        {% set low = ([s02, s13, s24, s35] | min) %}
        {% if low == s02 %}
          0-3Uhr
        {% elif low == s13 %}
          1-4Uhr
        {% elif low == s24 %}
          2-5Uhr
        {% elif low == s35 %}
          3-6Uhr
        {% endif %}

LG
Tobi

Um noch einen anderen möglichen Ansatz zu liefern: Ich hatte mir vor einiger Zeit dies hier installiert:
GitHub - mampfes/ha_epex_spot: Adds EPEX Spot data to Home Assistant.

Habe es dann aber vergessen und nicht weiter geschaut, was damit alles möglich ist. :thinking:

Ja, das hatte ich mir auch gedacht und so versucht ie du sagst, das hat aber auch nicht funktioniert…

@totow
aber habe ich mit: - platform: template nicht genau das schon oben vorgegeben?
Als ich den code ohne den trigger druntersetzen wollte hat dieses auch nicht funktioniert…

Ich probiere das mal mit der template.yaml. Aber wie ich diese benenne sollte doch eigentlich egal sein oder?

Würde meine ganzen Tibber Sensoren nämlich eigentlich gerne in eine z.B. strom.yaml
zusammen fassen…

das ist die alte Schreibweise:

Legacy Sensor configuration format

This format still works but is no longer recommended. Use modern configuration.

Du kannst auch gleich ganze Ordner einbinden und für jeden Sonsor eine eigene Datei machen.
So sieht z.B. meine configuration.yaml aus:

template:
  sensor: !include_dir_merge_list template/sensor/
  binary_sensor: !include_dir_merge_list template/binary_sensor/
mqtt:
  cover: !include_dir_merge_list mqtt/cover/
  sensor: !include_dir_merge_list mqtt/sensor/
  binary_sensor: !include_dir_merge_list mqtt/binary_sensor/
rest: !include_dir_merge_list rest/

LG

Ah, super! Ich habe jetzt deinen ersten Vorschlag mit der template.yaml realisiert. Das funktioniert dann auch

nur hab ich jetzt noch ein paar kleine fragen. (eher im Moment da fragen schneller geht wie lesen… das mach ich dann morgen :see_no_evil: genau wie die Geschichte mit den Ordnern, das wäre mittlerweile ggf. eine gute Alternative!)

Und zwar gibt mir der Studio Code Server nur in der tamplate.yaml rote balken an. Ist das auch neu?

und könnte ich die anderen Sensoren denn jetzt in die template.yaml bekommen?


Danke!