Balkon PV daten auch bei Offline Umrichter nutzbar machen

Moin! Bin der Andre, nutze seit nem Jahr einen Shelly 3EM und habe 2 Balkonsolarmodule (je 200W) mit Bosswerk MI 300 Wechselrichtern am Laufen. Ein Modul Ost, eines Westausrichtung.
Da der Shelly Blödsinn rechnet habe ich dann vor kurzem mit Home Assistant angefangen zu arbeiten. Soweit so gut, einziges Thema nun: Die Wechselrichter gehen abends aus da diese über die PV selbst versorgt werden. Somit habe ich keinen Datenzugriff mehr. Ich möchte allerdings trotzdem dann noch sehen können wie meine Autarkie lag. Im Energydashboard hat er die Tagesproduktion in der Anzeige nur kann ich diesen Wert nicht für mich nutzbar machen.
Dachte dann ich erstelle mit einen Zähler als Helfer der die Solarwerte übernimmt in der Hoffnung dieser verschwindet nicht, aber auch der zeigt unknown wenn keine Daten mehr abrufbar sind.
Nächster Ansatz (zusammenkopiert und angepasst) war eine Automatisierung:
wenn wert sich ändert und nicht unknown bzw 0 ist dann diesen Wert in input_number.pv_garage_tag bzw pv_balkjon_tag schreiben.
Zu triggern scheint es, nur die Daten sind nirgends greifbar/zu sehen/nutzbar…

Hat da jemand ne Idee zur Lösung meines Problems?

code aus automations.yaml

#### Solarerzeugung täglich Werte abspeichern #####
- alias: pv_garage_tag
  description: ""
  trigger:
    - platform: state
      entity_id: sensor.home_pb_solar_energy_today
  condition:
    - condition: template
      value_template: >-
        {{ trigger.to_state.state not in [trigger.from_state.state, 'unknown',
        'unavailable', '0'] }}
  action:
    - service: input_number.set_value
      target:
        entity_id: input_number.pv_garage_tag
      data:
         value: "{{ states('sensor.home_pb_solar_energy_today')  }}"
  mode: single
###
- alias: pv_balkon_tag
  description: ""
  trigger:
    - platform: state
      entity_id: sensor.solar_balkon_today
  condition:
    - condition: template
      value_template: >-
        {{ trigger.to_state.state not in [trigger.from_state.state, 'unknown',
        'unavailable', '0'] }}
  action:
    - service: input_number.set_value
      target:
        entity_id: input_number.pv_balkon_tag
      data:
        value: "{{ states('sensor.solar_balkon_today')  }}"
  mode: single

Gruß André

:crayon:by HarryP: Code-Zeilen in Code-Tag’s überführt

2 „Gefällt mir“

Welchen Sensor hast du im EnergyDashboard eingebunden und wie kommt dieser Sensor zustande?

Wenn Du den Sensor selber generierst, dann wäre folgendes eine Option.

- name: "HM800Power"
  unique_id: "hm800power"
  device_class: power
  unit_of_measurement: "W"
  state: >
    {% if states('sensor.hm_800_power') in ['unavailable', 'unknown', 'none'] %}
      {{ states('sensor.hm800power') |float(0) }}
    {% elif states('sensor.hm_800_power')| int == 0 %}
      {{ states('sensor.hm800power') |float(0) }}
    {% elif states('sensor.hm_800_power')| int < 5 %}
      0
    {% else %}
      {{
        states('sensor.hm_800_power')|float(0)
      }}
    {% endif %}

Was mache ich hier?

ich bekomme einen Wert von Wechselrichter sensor.hm_800_power. Dieser steht mir nur dann zur Verfügung, wenn der Wechselrichter auch “arbeitet”. Also abends/nachts steht dann unknown oder unavailable dort. Dann habe ich keine Werte mehr.

Was ich zusätzlich im Code habe.

  • Mein Ausgangssensor springt manchmal unmotiviert auf den Wert 0. Dann soll der vorige Wert genommen werden
  • Wenn der Wechselrichter unknown, unavailable oder none liefert, wird der vorige Wert des Sensors genommen.
  • Wenn der Wechselrichter weniger als 3,5Watt als Wert liefert, dann ist das i.d.R. keine Stromproduktion mehr, sondern der Eigenverbrauch des Wechselrichters. Da der Wechselrichter nur absolute Werte liefert, wird alles unter 5Watt auf 0 gesetzt.

Am Ende benutze ich diesen Sensor HM800Power in einem Helfer “Riemann Summen Integral Sensor” und wandle den Watt-Sensor in einen Wh Sensor um. Diese habe ich dann im EnergyDashboard eingebunden.

Wenn Du direkt auf Wh-Werte zugreifst, dann sollte das mit den Formeln von mir natürlich trotzdem klappen. Du müsstest nur unit_of_measurement aug Wh oder kWh setzen. Jenachdem was Dein Wechselrichter hier liefert.

Viel Erfolg

Claudius

Hi Claudius,
Sensor den ich nutze stammt direkt aus der Integration der Wechselrichter über den Omnik Zusatz aus der HACS. Der holt die Werte per HTML direkt aus der IP der Wechselrichter.
Ich nutze hier jeweils den Sensor “Energieproduktion-daily”, da bekomme ich hochlaufend die Tagesproduktion in kWh mit Neustart bei Null am nächsten Tag.
Deine Rechnung und Abfrage verstehe ich, die jeweilige YAML Syntax beherrsche ich halt nur nicht :wink:
Die Riemann Summen Intregration beötige ich ja nicht da ich ja schon die Summe der Leistung als Ausgangswert habe.
Frage noch: eingebunden ist das Ganze dann in der configurations.yaml ?

Ja das ist in die configuration.yaml eingebunden.
Mann kann es auch direkt dort ablegen, jedoch versuche ich alles etwas zu strukturieren und lagere so viel als möglich in andere yaml-Dateien aus. Meine configuration.yaml hat so gut wie wie keine Sensoren etc. nur Verlinkungen.

Zurück zu Deinem Problem.
Du kannst den direkt ausgelesenen Wert nicht wirklich “korrigieren”, sondern musst Dir meiner Meinung nach einen eigenen Sensor bauen. HA scheint ja zumindest mit dem täglichen zurücksetzen keine Probleme zu haben. Vielleicht deshalb einfach einen eigenen Sensor mit Wh verwenden und meinen Code anpassen und ausprobieren.
Wenn Du schon Wh hast benötigst du keinen Riemann-Summen-Integral-Sensor.

Viel Erfolg

Claudius

P.S. hast du bereits eine template.yaml oder alles in der configuration.yaml?
Wie lautet Dein Sensor, den du aktuell verwendest?

Also eine template yaml gibt es noch nicht. aber ich vermute mal ich erzeuge einfach eine und und verweise in der configuration.yaml per template: !include xx.yaml direkt darauf. Macht Sinn, hab zwar nicht viel aktuell in der configurations drinnen, aber bei den Möglichkeiten könnte da noch einiges kommen.
So wie ich das verstehe hast du unter Nutzung der Daten von hm_800_power ja auch einen neuen Sensor HM800power erstellt welcher dann die Werte wie gewollt beinhaltet und nicht nachts einfach unknown/0/unavailable ist.
Genau so einen Ansatz habe ich gesucht! Danke dir, werde hier posten wenns getestet ist.

1 „Gefällt mir“

In der template.yamel sollte es dann ungefähr wie folgt aussehen und einfach mal einige Zeit mitlaufen lassen um zu sehen in wieweit es funktioniert oder nicht.

- sensor:
  - name: "sensor.DeinNeuerSensor"
    unique_id: "deinneuersensor"
    device_class: energy
    unit_of_measurement: "Wh"
    state: >
      {% if states('sensor. sensor.DeinAusgelesenerSensor') in ['unavailable', 'unknown', 'none'] %}
        {{ states('sensor. sensor.DeinNeuerSensor') |float(0) }}
      {% elif states('sensor. sensor.DeinAusgelesenerSensor')| int == 0 %}
        {{ states('sensor. sensor.DeinNeuerSensor') |float(0) }}
      {% elif states('sensor. sensor.DeinAusgelesenerSensor')| int < 5 %}
        0
      {% else %}
        {{
          states('sensor.DeinAusgelesenerSensor')|float(0)
        }}
      {% endif %}

folgendes kannst Du im Code drin lassen oder raus nehmen. Wie du möchtest.

      {% elif states('sensor. sensor.DeinAusgelesenerSensor')| int == 0 %}
        {{ states('sensor. sensor.DeinNeuerSensor') |float(0) }}
      {% elif states('sensor. sensor.DeinAusgelesenerSensor')| int < 5 %}
        0

Die Zeilen sind immer als Paar zu sehen.

Viel Erfolg

Claudius

Servus,
erster Test seit gestern abend läuft. Kleines Problem dabei: die Ausgabe meines Sensors ist float mit dem Format x,x kWh.
Die Bedingung Werte kleiner 5 zu ignorieren hab ich entsprechend weggelassen. Über Nacht hat sich gezeigt dass das Schreiben mit 0 scheinbar funktioniert. Kurz vor 21 Uhr hat er da agiert und entsprechend die Nullen jeweils geschrieben. Leider schreibt er aber die kWh Werte nicht. Kann es sein das da irgendwie aufgrund der int == 0 der neue Sensor als integer Typ agiert und somit erst ab 1 kWh etwas anzeigt?`

 - name: "pv_d_garage"
     unique_id: pv_d_garage
     device_class: energy
     unit_of_measurement: kWh
      state: >
        {% if states('sensor.home_pb_solar_energy_today') in ['unavailable', 'unknown', 'none'] %}
          {{ states('sensor.pv_d_garage') |float(0) }}
        {% elif states('sensor.home_pb_solar_energy_today')| int == 0 %}
          {{ states('sensor.pv_d_garage') |float(0) }}
        {% else %}
          {{
            states('sensor.home_pb_solar_energy_today')|float(0)
          }}
        {% endif %}

Unit of measurement kWh wird scheinbar ignoriert und als Wh genutzt. unique_id hab ich mal mit den Anführungszeichen rumgespielt aber das hat keinen Einfluss anscheinend.

Wenn du Nachkommastellen hast, dann mach einfach aus float(0) ein float(2), dann wird er mit 2 Nachkommastellen ausgewertet.
Bei

int

werden alle Nachkommastellen ignoriert. Versuche es dort doch auch mal mit float(2) == 0.00 oder float(2) == 0

Wenn Dein Ausgangssensor stabil ist, dann kannst du diese komplette Bedingung auch raus nehmen.

Viel Erfolg

Claudius

1 „Gefällt mir“

Hi Claudius,
das mit float(2) ist ein guter Tip. Float statt Int bei meinem Sensor zu nutzen und die == 0 Abfrage raus zu nehmen hab ich gestern Abend noch gemacht. MIT ERFOLG! das Ding macht jetzt exakt was es soll :metal:
Danke nochmals für die Hilfe
André

1 „Gefällt mir“