z-master42 / solarflow

Integrate your Zendure products (Hub 1200, Hub 2000, Hyper 2000 and Ace 1500) into Home Assistant via MQTT. My attempt at instructions.
44 stars 4 forks source link

Batterie Temperatur in Home Assistant Einbinden #7

Closed Murphy613 closed 10 months ago

Murphy613 commented 11 months ago

Moin

Kann man die Batterie Temperatur eigentlich auch auf die Weise in Home Assistant Einbinden ?

Meine versuche schlugen bisher leider fehl.

Die Daten werden ja in Kelvin übertragen und müssen nur umgerechnet werden.

z-master42 commented 11 months ago

Unter welchem Topic wird denn die Temperatur eines/des Akkus veröffentlicht?

Murphy613 commented 11 months ago

Das hatte ich noch gespeichert.... Müsste sonst morgen nochmal den MQTT Explorer laufen lassen, wenn noch etwas fehlt.

{ "unique_id": "packData", "state_topic": "//state", "command_topic": "//packData/set", "name": "packData", "value_template": "{{ value_json.packData}}" }


Die Werte werden denn für jeden Akku einzeln ausgegeben

"packData": [ { "maxTemp": 277.1, "sn": "1234567" } ]

z-master42 commented 11 months ago

Achso, ja da, ok. Der Temperaturwert ist aber nicht die aktuelle Temperatur, sondern wie der Name schon vermuten lässt ein Höchstwert. Ich habe nur leider keine Ahnung, wieso es diesen überhaupt gibt und auf welchen Zeitraum der sich überhaupt bezieht. So kann man mit der Temperatur jedenfalls nichts sinniges anfangen.

Murphy613 commented 11 months ago

Ich hatte es so verstanden das es die aktuell höchste Temperatur der Batteriezellen sein soll. 277.1 Kelvin sind ja 3,9 Grad Celsius und das würde mit der Zendure App passen. Sonst werde ich morgen nochmal den MQTT Explorer etwas laufen lassen und denn mit der App vergleichen.

z-master42 commented 11 months ago

Hmm, das kommt wohl hin. Dann fehlt noch eine möglichst vollständige Auflistung was in packData alles enthalten ist. Ich habe bisher:

Theoretisch sollte es noch:

geben.

Murphy613 commented 11 months ago

Ich bekomme bisher folgende "packData" Werte:

"packData": [ { "maxVol": 324, "maxTemp": 276.1, "socLevel": 99, "minVol": 323, "sn": "123456" }


socLevel: Battery level (%) maxTemp: Battery temperature (Kelvin) maxVol: Maximum battery voltage minVol: Minimum battery voltage sn: Battery serial number

Bei minVol/maxVol vermute ich mal das es die Spannung der einzelnen Zellen sind (3,23V-3,24V)

z-master42 commented 11 months ago

Ja korrekt, das ist die Zellenspannung.

Um die Daten per MQTT auszulesen sollte es an und für sich reichen wenn das value_template so aussieht als Beispiel: "{{ value_json.packData.maxTemp | int - 273.15 }}" Wobei man vorher natürlich die Seriennummer abfragen muss, damit man bei mehreren Akkus die Werte auch richtig zuordnet.

Hatte jetzt nur noch nicht die Zeit, das konkret auszuprobieren, bzw. die Anleitung zu ergänzen.

Murphy613 commented 11 months ago

Weißt Du wie man die Seriennummer vorher abfragen kann ? Ohne Abfrage kann Home Assistant wohl nichts damit anfangen, ich hatte es so versucht:

- name: "Pack Temp"
  unique_id: "deviceIDpackData"
  state_topic: "appKey/deviceID/state"
  value_template: "{{ value_json.packData.maxTemp | int - 273.15 }}"
  unit_of_measurement: "C"
  state_class: "measurement"
  device: 
    name: "SolarFlow"
    identifiers: "HubSeriennummer"
    manufacturer: "Zendure"
    model: "SmartPV Hub 1200 Controller"
z-master42 commented 10 months ago

Ich hab zumindest eine Idee im Kopf, konnte sie nur noch nicht ausprobieren, bzw. habe noch nicht die Zeit gefunden sie zu testen. Komme ich ggf. innerhalb der nächsten Tage zu.

z-master42 commented 10 months ago

Also so funktioniert es. Auch mit den anderen Werten in packData.

    - name: "Batterie <Nr> maxTemp"
      unique_id: "<deviceID>Batterie<Nr>maxTemp"
      state_topic: "<appKey>/<deviceID>/state"
      value_template: >
        {% for i in value_json.packData %}
          {% if i.sn == "<EureBatterieSeriennummer>" %}
            {{ (i.maxTemp | float - 273.15) | round(2) }}
          {% endif %}
        {% endfor %}
      unit_of_measurement: "°C"
      device_class: "temperature"
      device: 
        name: "SolarFlow"
        identifiers: "<EurePVHubSeriennummer>"
        manufacturer: "Zendure"
        model: "SmartPV Hub 1200 Controller"
ragman11 commented 10 months ago

Hi, ich denke beim socLevel Code fehlt eine Klammer nach int, zumindest ohne hatte ich einen Fehler original: {{ (i.socLevel | int }} working : {{ (i.socLevel | int) }}

Murphy613 commented 10 months ago

Ja, das hatte ich auch festgestellt, bei minVol und maxVol auch, aber jetzt funktioniert es Perfekt.

Vielen Dank nochmal ;-)

{{ (i.maxVol | float / 100 }} {{ (i.maxVol | float / 100) | round(2) }}

{{ (i.minVol | float / 100 }} {{ (i.minVol | float / 100) | round(2) }}

z-master42 commented 10 months ago

Dann waren das wohl Copy & Paste Fehler in der Eile 😉 Wird korrigiert.

fr43nk commented 8 months ago

Hi, auch wenn der Issue hier schon beendet ist, habe ich zu diesem packData noch eine Frage: Die Werte ändern sich ja sehr schnell, zumindest ist es bei mir so, das die Messwerte zur Verfügung stehen und nach kurzer Zeit durch entweder einen leeren Wert oder durch eine andere Datenstruktur überschrieben werden. Dadurch habe ich die einzelnen Werte nur kurz auf meinem Dashboard und schnell wieder ein unavailable oder unknown oder etwas ähnliches. Wie könnte man da eine Datenstruktur aufbauen, bei der nur die einzelnen Werte aktualisiert werden, also Temp, soclevel und Spannung?

Zum Beispiel werden erst diese Daten geliefert:

{
  "electricLevel": 20,
  "packData": [
    {
      "maxVol": 330,
      "maxTemp": 283.1,
      "socLevel": 21,
      "minVol": 329,
      "sn": "***************"
    }
  ],
  "sn": "*********"
}

Nach ein paar Sekunden kommt dann

{
  "electricLevel": 20,
  "packData": [
    {
      "sn": "***************"
    },
    {
      "sn": "***************"
    }
  ],
  "sn": "*********"
}

und überschreibt somit die vorherigen Werte.

Danke und Gruß, Frank

z-master42 commented 8 months ago

Für jeden Wert der in packData enthalten ist, einen eigenen Sensor anlegen, so oder so ähnlich wie die Beispiele in der mqtt.yaml.

fr43nk commented 8 months ago

Ok, danke. So in etwa habe ich das auch dastehen. Im Endeffekt ist für mich das Problem, das sich der Inhalt der packData Struktur immer mal ändert und es scheinbar keine Möglichkeit gibt zu sagen: packData hat sich verändert, maxVol (als Beispiel) kam darin jetzt aber nicht vor, also, lasse den Wert stehen wie er war und setze den nicht auf unavailable. Vielleicht habe ich auch etwas übersehen, das man das irgendwie erreichen kann.

fr43nk commented 8 months ago

Für das Problem mit den sich ständig ändernden Werten habe ich eine Lösung gefunden. Ob das so im Sinne des Erfinders ist, weiß ich aber nicht. Zusätzlich zum eigentlichen Template Sensor, habe ich einen Zweiten angelegt, der im Falle eines ungültigen states auf sich selbst verweist.

{% set v = states('sensor.solarflow_packdata_maxtemp_1') %}

{% if states('sensor.packdata') not in ['', 'unknown', 'unavailable'] and v not in ['', 'unknown', 'unavailable'] %}
  {{states('sensor.solarflow_packdata_maxtemp_1')}}
{% else %}
  {{ states('sensor.solarflow_packdata_maxtemp_1_preserve') }}
{% endif %}

Interessanter Weise funktioniert das.

z-master42 commented 8 months ago

Ja, sowas habe ich für andere Sensoren auch schon gemacht. Das mit dem packData muss ich mir noch mal in Ruhe angucken. Als ich das getestet habe, sind da keine Sensoren auf unavailable gegangen.

z-master42 commented 7 months ago

So, ich hab das jetzt anhand des SOC-Level noch mal getestet. Bei mir gibt es da keine Einbrüche o. ä. Habe die Konfiguration so wie ich sie hier angelegt habe einfach übernommen.