"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!

Hallo
ich hoffe, das ältere Thema nochmals beleben zu können und möchte deine Lösung für price_level adaptieren und letztlich auch anzeigen.
Aber deine Set-Befehle habe ich leider nicht verstanden, insbesondere da ich keine Ergebnisse angezeigt bekomme,

Moin,

heisst deine Entität die du über Tibber abfragst auch : sensor.tibber_prices? Und sind dort auch Werte hinterlegt?
magst du den kompletten Template-Editor mal zeigen? So wie in de Screenshot kann auch kein Ergebnis erscheinen, ohne Berechnung kein Ergebnis…

So wie du es in den Entwicklerwerkzeugen eingefügt hast, kann es dir auch nichts anzeigen, da du nur den set durchführst.

Um das Ergebnis anzuzeigen, muss du dann die entsprechende variable auswählen

{{ s0 }}
{{ s1 }}
{{ s2 }}

Die eingefügte Definition von dir ist für die Template.yaml.
Das Entwicklerdashboard interessiert nur der Bereich zwischen den geschweiften Klammern.

Hi
man muss nur richtig koperen und nicht zum Test einen kleinen Auszug.
Deine Logik ist genial! :grinning:

Du bildest 3 Stunden Blöcke. Oft ist es aber nur eine Stunde oder 2 Stunden. Wie ist deine Erfahrung mit den 3 Stunden?

Für das anuelle Einschalten von Waschmaschine etc ist es genau das was ich immer gesucht habe.

Eine Automation startest du dann über den Preislevel, oder?

Jup, stimmt. Dazu muss ich aber jetzt ein ganz klein wenig ausholen…
Ich wollte bzw. realisiere damit eine Netzladung meines Akkusystems (mittlerweile 15kW) aus dem Netz bei “lohnenden” Stromkosten im Winter bzw. zu schwachem Ertrag der PV-Anlage.
Um meinen Speicher über meinen WR komplett aus dem Netz zu laden benötigt das System etwas weniger als 3Std.
Daher meine Wahl zu 3Stunden Blöcke. Die Berechnung kannst du aber natürlich auch mit 1,2,oder auch 5 Stunden machen (In dieser Berechnung aber immer nur aufeinander folgende Stunden)
Die Automatisierung(en) starte ich dann mit den sich daraus ergebenen Entitäten und deren Werte, richtig.

Bei mir sieht nach knapp 1Jahr das template aber auch schon anders aus, da diese Grundlage zwar gut aber leider auch in der Berechnungslogik bzw. der Datenattribute mit unter etwas Fehlerhaft.

So sieht es in meinem aktuellen template aus:

# Günstigste Ladekosten #
- trigger:
    - platform: state
      entity_id: sensor.strompreis_verfugbar
      from: "false"
      to: "true"
      for: "00:00:30"
  sensor:
    - name: "Günstige Ladekosten"
      unique_id: gunstige_ladekosten
      unit_of_measurement: "EUR/kWh"
      state: >
        {% set today_prices = state_attr('sensor.tibber_prices', 'today') %}
        {% set tomorrow_prices = state_attr('sensor.tibber_prices', 'tomorrow') %}
        
        {% if today_prices is not none and tomorrow_prices is not none %}
        
          {% set h22 = today_prices[22].total %}
          {% set h23 = today_prices[23].total %}
          {% set m0 = tomorrow_prices[0].total %}
          {% set m1 = tomorrow_prices[1].total %}
          {% set m2 = tomorrow_prices[2].total %}
          {% set m3 = tomorrow_prices[3].total %}
          {% set m4 = tomorrow_prices[4].total %}
          {% set m5 = tomorrow_prices[5].total %}
          {% set m6 = tomorrow_prices[6].total %}
          {% set m7 = tomorrow_prices[7].total %}
          {% set m8 = tomorrow_prices[8].total %}
          {% set m9 = tomorrow_prices[9].total %}
          {% set m10 = tomorrow_prices[10].total %}
          {% set m11 = tomorrow_prices[11].total %}
          {% set m12 = tomorrow_prices[12].total %}
          {% set m13 = tomorrow_prices[13].total %}
          {% set m14 = tomorrow_prices[14].total %}
          {% set m15 = tomorrow_prices[15].total %}
          {% set m16 = tomorrow_prices[16].total %}
          {% set m17 = tomorrow_prices[17].total %}
          {% set m18 = tomorrow_prices[18].total %}
          {% set m19 = tomorrow_prices[19].total %}
          {% set m20 = tomorrow_prices[20].total %}
          {% set m21 = tomorrow_prices[21].total %}
          {% set m22 = tomorrow_prices[22].total %}
          {% set m23 = tomorrow_prices[23].total %}
          
          {% set periods = [
            ("22-1Uhr", h22 + h23 + m0),
            ("23-2Uhr", h23 + m0 + m1),
            ("0-3Uhr", m0 + m1 + m2),
            ("1-4Uhr", m1 + m2 + m3),
            ("2-5Uhr", m2 + m3 + m4),
            ("3-6Uhr", m3 + m4 + m5),
            ("4-7Uhr", m4 + m5 + m6),
            ("5-8Uhr", m5 + m6 + m7),
            ("6-9Uhr", m6 + m7 + m8),
            ("7-10Uhr", m7 + m8 + m9),
            ("8-11Uhr", m8 + m9 + m10),
            ("9-12Uhr", m9 + m10 + m11),
            ("10-13Uhr", m10 + m11 + m12),
            ("11-14Uhr", m11 + m12 + m13),
            ("12-15Uhr", m12 + m13 + m14),
            ("13-16Uhr", m13 + m14 + m15),
            ("14-17Uhr", m14 + m15 + m16),
            ("15-18Uhr", m15 + m16 + m17),
            ("16-19Uhr", m16 + m17 + m18),
            ("17-20Uhr", m17 + m18 + m19),
            ("18-21Uhr", m18 + m19 + m20),
            ("19-22Uhr", m19 + m20 + m21),
            ("20-23Uhr", m20 + m21 + m22),
            ("21-0Uhr", m21 + m22 + m23)
          ] %}
          
          {% set min_period = periods | min(attribute=1) %}
          
          {% set min_value = min_period[1] / 3 %}
          
          {{ min_value }}
          
        {% else %}
          Fehler beim Abrufen der Preise.
        {% endif %}

Im Dashboard dann so:

Hut ab!

Nochmals optimiert mit Preisangaben Klasse.

Das Netz ist ja voll mit den Diskussionen bezüglich Ladeverlust bei dieser Zwangsladung des Speichers (und bei Speicher in Wechselstrom).
Bei deiner intensiven Nutzung des Speicherladens hast du da Erfahrungen gemacht bezüglich Ladeverlusten?

Darf ich auch noch fragen, wie du die Automatisierung zum Laden triggerst?

So, ja, das Thema ist jetzt nicht ganz so einfach, vor allem nicht so einfach wie es sich manche im Netz machen wollen… Das fängt als aller erstes mit den verbauten Komponenten an, geht dann über die Lade-/Entladetechnik und endet bei der Nutzung…

Ich für meinen Teil kann sagen, das ich im Moment bei einer prozentualen Verlustleistung, wenn über Sonne geladen wird, von ca. 3,5% und wenn über Netz geladen wird von ca. 6% bin. Aber wie gesagt, das ist im Moment so, wenn wir 15Jahre weiter sind sieht auch das bestimmt noch wieder anders aus!

So, zurück zum Thema HA, wie man bei mir auf der Karte sehen kann ermittele ich auch den 75% Wert des Tagesdurchschnittspreises. Ich habe für mich errechnet/festgelegt, das es sich für mich erst dann wirklich lohnen würde den Akku auch zu 100% aus dem Netz zu laden.
Die ganzen Werte werden errechnet, sobald der Strompreis für morgen vorhanden ist.

# Strompreis Morgen verfügbar #
- sensor:
  - name: "Strompreis verfügbar"
    unique_id: strompreis_verfugbar
    state: >
        {% if state_attr('sensor.tibber_prices', 'tomorrow') is defined and state_attr('sensor.tibber_prices', 'tomorrow')|length > 0 %}
            true
        {% else %}
            false
        {% endif %}

Dann lasse ich sowohl die günstigsten 3 “Ladestunden” als auch den damit verbundenen “Ladepreis pro kWh” errechnen.
Jetzt habe ich bei meinem Wechselrichter(WR) die Möglichkeit die dann errechneten Stunden als Anfangs und Endwert im WR eintragen zu lassen und auch bis wieviel Prozent aus dem Netz geladen werden soll. (Die Eintragung passiert dann in der Nacht zum nächsten Tag)

Die ermittelten Zeiten vergleiche ich in 2 Automationen (für eine Automation war der Vergleich zwischen 24Stunden zu groß) und lasse dann die Anfangs-/Endzeit im WR eintragen.

Der Sensor für den Preis funktioniert super.

Leider habe ich ein merkwürdiges HA-Verhalten festgestellt:
Ich woller einmal sehen, welches Ergebnis “{{ min_period }}” bringt. Und siehe da:

Aber leider sieht das Ergebnis über template.yaml anders aus: