debold / HA-MaxxiCharge

Home Assistant Sensoren für MaxxiCharge und PowerOpti
4 stars 0 forks source link

https://github.com/debold/HA-MaxxiCharge #1

Open Reptail2 opened 1 month ago

Reptail2 commented 1 month ago

Guten Tag, vielen Dank für dieses wirklich gut beschriebene Tutorial, nach dem ich Home Assit neu startet wurde auch im Dasbaorad (REST) gefunden leider werden hier keine Sensoren angegeben. Die Log-in-Daten prüfte ich mehrere male leider finde ich den Fehler nicht. Was kann ich bei Copy and paste falsch gemacht haben? Das Home Assist ist mittels Docker auf einem Raspberry pi 3 eingebunden HACS wurde bereits installiert. Muss ich im Home Assistant selbst noch etwas einbinden? Unter Entitäten finde ich nur die Maxxisun IP vonseiten der Fritz.Box.

Reptail2 commented 1 month ago

Die Datei "maxxicharge_system.yaml" musste etwas überarbeitet werden. . .

`# MaxxiCharge Bearer Token retrieval

debold commented 1 month ago

Hallo Reptail2,

danke für die Info. Ich habe mal deine Modifikationen versucht herauszufinden, so wie ich das sehe, hast du effektiv "nur" die Anführungszeichen in den Headers hinzugefügt (und ein paar unnötige Leerzeichen entfernt). Ist das korrekt? Wenn ja, würde ich das so übernehmen. Seltsam nur, dass es bei mir so funktioniert ...

Aktuell: Accept: application/json, text/plain, */* User-Agent: Home Assistant content-type: application/json

Modifiziert: Accept: "application/json, text/plain, */*" User-Agent: "Home Assistant" content-type: "application/json"

Reptail2 commented 1 month ago

Hallo debold, ja es lag augenscheinlich nur an den Anführungszeichen. Soweit ist nun alles außer Bildschirmfoto vom 2024-09-28 19-48-34 in Funktion.

Leider werden die Sensoren aber nicht im Energie Management erkannt, Bildschirmfoto vom 2024-09-28 19-50-55

Nur die Battery (siehe Bild) wird erkannt und selbst das macht Probleme

Bildschirmfoto vom 2024-10-01 11-33-21

Weitere Fehler

Logger: homeassistant.helpers.template Quelle: helpers/template.py:2667 Erstmals aufgetreten: 11:31:31 (15 Vorkommnisse) Zuletzt protokolliert: 11:31:31

Template variable error: 'value_json' is undefined when rendering '{{ (value_json.PV_power_total - value_json.Pccu) | round(0, 0, 0) }}'
Template variable error: 'value_json' is undefined when rendering '{% if ((value_json.PV_power_total - value_json.Pccu) | round(0, 0, 0)) > 0 %} Charging {% else %} Discharging {% endif %}'
Template variable error: 'value_json' is undefined when rendering '{% if ((value_json.PV_power_total - value_json.Pccu) | round(0, 0, 0)) > 0 %} mdi:battery-arrow-up-outline {% else %} mdi:battery-arrow-down-outline {% endif %}'
Template variable error: 'value_json' is undefined when rendering '{{ (value_json.Pr - state_attr('sensor.poweropti', 'Watt')) | round(0, 0, 0) }}'
Template variable error: 'value_json' is undefined when rendering '{% if ((value_json.Pr - state_attr('sensor.poweropti', 'Watt')) | round(0, 0, 0)) > 0 %} mdi:gauge-full {% else %} mdi:gauge-empty {% endif %}'

Logger: homeassistant.helpers.sensor Quelle: helpers/trigger_template_entity.py:204 Erstmals aufgetreten: 11:31:31 (3 Vorkommnisse) Zuletzt protokolliert: 11:31:31

Error rendering icon template for sensor.maxxichargev2_soc: UndefinedError: 'value_json' is undefined Error rendering icon template for sensor.maxxichargev2_batterycharging: UndefinedError: 'value_json' is undefined Error rendering icon template for sensor.maxxichargev2_powerreadingdeviation: UndefinedError: 'value_json' is undefined

PS: Sollte jemand die gleichen Probleme wie ich haben und das hier lesen, der Ordner "rest" wird im Ordner Config wo auch die Config.yaml und sercrets.yaml liegen eingepflegt.

Logger: homeassistant.components.rest.util Quelle: components/rest/util.py:37 Integration: RESTful (Dokumentation, Probleme) Erstmals aufgetreten: 11:31:31 (2 Vorkommnisse) Zuletzt protokolliert: 11:31:31 REST result could not be parsed as JSON

Reptail2 commented 1 month ago

maxxicharge_auth.yaml


> # MaxxiCharge Bearer Token retrieval
- method: POST
  resource: "https://maxxisun.app:3000/api/authentication/log-in"
  verify_ssl: false
  scan_interval: 1740 # 29 minutes
  timeout: 60
  headers:
    Accept: "application/json, text/plain, */*"
    User-Agent: "Home Assistant"
    content-type: "application/json"
  payload: !secret maxxicharge_login_payload
  sensor:
    - name: MaxxiCharge_Auth_JWT
      unique_id: MaxxiCharge_Auth_JWT
      icon: mdi:code-json
      value_template: >
        {{ value_json.jwt if value_json is defined else 'Unknown' }}

    - name: MaxxiCharge_Auth_CCU
      unique_id: MaxxiCharge_Auth_CCU
      icon: mdi:barcode
      value_template: >
        {% if value_json.jwt is defined %}
          {% set value_array = value_json.jwt.split('.') %}
          {% if value_array[1] is defined %}
            {% set body = (value_array[1] + "===") | base64_decode | from_json %}
            {{ body.data.ccu if body.data.ccu is defined else 'Unknown' }}
          {% else %}
            'Unknown'
          {% endif %}
        {% else %}
          'Unknown'
        {% endif %}

    - name: MaxxiCharge_Auth_Email
      unique_id: MaxxiCharge_Auth_Email
      icon: mdi:email-outline
      value_template: >
        {% if value_json.jwt is defined %}
          {% set value_array = value_json.jwt.split('.') %}
          {% if value_array[1] is defined %}
            {% set body = (value_array[1] + "===") | base64_decode | from_json %}
            {{ body.data.email if body.data.email is defined else 'Unknown' }}
          {% else %}
            'Unknown'
          {% endif %}
        {% else %}
          'Unknown'
        {% endif %}

    - name: MaxxiCharge_Auth_ExpiresIn
      unique_id: MaxxiCharge_Auth_ExpiresIn
      icon: mdi:clock-alert-outline
      value_template: >
        {% if value_json.jwt is defined %}
          {% set value_array = value_json.jwt.split('.') %}
          {% if value_array[1] is defined %}
            {% set body = (value_array[1] + "===") | base64_decode | from_json %}
            {{ body.expiresIn if body.expiresIn is defined else 'Unknown' }}
          {% else %}
            'Unknown'
          {% endif %}
        {% else %}
          'Unknown'
        {% endif %}

    - name: MaxxiCharge_Auth_IssuedAt
      unique_id: MaxxiCharge_Auth_IssuedAt
      icon: mdi:calendar
      device_class: timestamp
      value_template: >
        {% if value_json.jwt is defined %}
          {% set value_array = value_json.jwt.split('.') %}
          {% if value_array[1] is defined %}
            {% set body = (value_array[1] + "===") | base64_decode | from_json %}
            {{ body.iat | timestamp_local if body.iat is defined else 'Unknown' }}
          {% else %}
            'Unknown'
          {% endif %}
        {% else %}
          'Unknown'
        {% endif %}

    - name: MaxxiCharge_Auth_Response
      unique_id: MaxxiCharge_Auth_Response
      icon: mdi:check
      value_template: >
        {{ value_json.response if value_json is defined else 'Unknown' }}

    - name: MaxxiCharge_Auth_CreatedDate
      unique_id: MaxxiCharge_Auth_CreatedDate
      icon: mdi:calendar
      device_class: timestamp
      value_template: >
        {{ value_json.data.createdDate | as_datetime if value_json.data is defined and value_json.data.createdDate is defined else 'Unknown' }}

    - name: MaxxiCharge_Auth_LastLogin
      unique_id: MaxxiCharge_Auth_LastLogin
      icon: mdi:calendar
      device_class: timestamp
      value_template: >
        {{ value_json.data.lastLogin | as_datetime if value_json.data is defined and value_json.data.lastLogin is defined else 'Unknown' }}

    - name: MaxxiCharge_Auth_CreatedIP
      unique_id: MaxxiCharge_Auth_CreatedIP
      icon: mdi:network-outline
      value_template: >
        {{ value_json.data.createdIp if value_json.data is defined and value_json.data.createdIp is defined else 'Unknown' }}

maxxicharge_system.yaml)


# Maxxicharge v2
- method: GET
  resource: https://maxxisun.app:3000/api/last
  verify_ssl: false
  headers:
    Authorization: "Bearer {{ states('sensor.MaxxiCharge_Auth_JWT') }}"
    Accept: application/json, text/plain, */*
    User-Agent: Home Assistant
  scan_interval: 10
  timeout: 30
  sensor:
    # Device ID / Name - does not change
    - name: MaxxiChargeV2_DeviceId
      unique_id: MaxxiChargeV2_DeviceId
      icon: mdi:information-outline
      value_template: >
        {{ value_json.deviceId if value_json is defined else 'Unknown' }}
    # Battery state of charge in %
    - name: MaxxiChargeV2_Soc
      unique_id: MaxxiChargeV2_Soc
      device_class: battery
      state_class: measurement
      icon: >
        mdi:battery-{{ (value_json.SOC | int(0) / 10) | round(0, 0, 0) * 10 if value_json is defined else 0 }}
      value_template: >
        {{ value_json.SOC if value_json is defined else 0 }}
      unit_of_measurement: '%'
    # WIFI signal strength
    - name: MaxxiChargeV2_WifiStrength
      unique_id: MaxxiChargeV2_WifiStrength
      device_class: signal_strength
      state_class: measurement
      icon: mdi:wifi
      value_template: >
        {{ value_json.wifiStrength if value_json is defined and value_json.wifiStrength is not none else 0 }}
      unit_of_measurement: dBm
    # Power delivered by MaxxiCharge to the circuit
    - name: MaxxiChargeV2_PowerOut
      unique_id: MaxxiChargeV2_PowerOut
      device_class: power
      state_class: measurement
      icon: mdi:power-plug-battery-outline
      value_template: >
        {{ value_json.Pccu | round(0, 0, 0) if value_json is defined else 0 }}
      unit_of_measurement: W
    # Power meter reading by MaxxiCharge
    - name: MaxxiChargeV2_PowerReading
      unique_id: MaxxiChargeV2_PowerReading
      device_class: power
      state_class: measurement
      icon: mdi:gauge
      value_template: >
        {{ value_json.Pr | round(0, 0, 0) if value_json is defined else 0 }}
      unit_of_measurement: W
    # Total solar power delivered to the MaxxiCharge
    - name: MaxxiChargeV2_PowerSolar
      unique_id: MaxxiChargeV2_PowerSolar
      device_class: power
      state_class: measurement
      icon: mdi:solar-power-variant
      value_template: >
        {{ value_json.PV_power_total if value_json is defined else 0 }}
      unit_of_measurement: W
    # Firmware version of MaxxiCharge
    - name: MaxxiChargeV2_FirmwareVersion
      unique_id: MaxxiChargeV2_FirmwareVersion
      icon: mdi:information-outline
      value_template: >
        {{ value_json.firmwareVersion if value_json is defined else 'Unknown' }}
    # Time of last data recorded by MaxxiCharge cloud service
    - name: MaxxiChargeV2_LastUpdate
      unique_id: MaxxiChargeV2_LastUpdate
      icon: mdi:calendar
      value_template: >
        {{ (value_json.date / 1000) | timestamp_local if value_json is defined else 'Unknown' }}
    # Battery capacity of 1st battery
    - name: MaxxiChargeV2_BatteryCapacity
      unique_id: MaxxiChargeV2_BatteryCapacity
      device_class: energy 
      state_class: total
      icon: >
        mdi:battery-{{ (states('sensor.MaxxiChargeV2_Soc') | int(0) / 10) | round(0, 0, 0) * 10 }}
      value_template: >
        {% if value_json is defined and value_json.batteriesInfo is defined and value_json.batteriesInfo | length > 0 %}
          {{ value_json.batteriesInfo[0].batteryCapacity | round(2, 0, 0) }}
        {% else %}
          0
        {% endif %}
      unit_of_measurement: Wh
    # Computed sensors
    # Solar power used to charge battery
    - name: MaxxiChargeV2_PowerBattery
      unique_id: MaxxiChargeV2_PowerBattery
      value_template: >
        {% if value_json is defined and value_json.PV_power_total is not none and value_json.Pccu is not none %}
          {{ (value_json.PV_power_total - value_json.Pccu) | round(0, 0, 0) }}
        {% else %}
          0
        {% endif %}
      unit_of_measurement: W
      device_class: power
      state_class: measurement
      icon: mdi:battery-charging-outline
    # Indicator for battery charging or draining
    - name: MaxxiChargeV2_BatteryCharging
      unique_id: MaxxiChargeV2_BatteryCharging
      value_template: >
        {% if value_json is defined and value_json.PV_power_total is not none and value_json.Pccu is not none %}
          {% if (value_json.PV_power_total - value_json.Pccu) | round(0, 0, 0) > 0 %}
            Charging
          {% else %}
            Discharging
          {% endif %}
        {% else %}
          Discharging
        {% endif %}
      icon: >
        {% if value_json is defined and value_json.PV_power_total is not none and value_json.Pccu is not none %}
          {% if (value_json.PV_power_total - value_json.Pccu) | round(0, 0, 0) > 0 %}
            mdi:battery-arrow-up-outline
          {% else %}
            mdi:battery-arrow-down-outline
          {% endif %}
        {% else %}
          mdi:alert
        {% endif %}
    # Calculates the difference in power reading between MaxxiCharge and PowerOpti
    - name: MaxxiChargeV2_PowerReadingDeviation
      unique_id: MaxxiChargeV2_PowerReadingDeviation
      unit_of_measurement: W
      device_class: power
      state_class: measurement
      value_template: >
        {% if value_json is defined and value_json.Pr is not none %}
          {% set poweropti = state_attr('sensor.poweropti', 'Watt') %}
          {% if poweropti is not none %}
            {{ (value_json.Pr - poweropti) | round(0, 0, 0) }}
          {% else %}
            0
          {% endif %}
        {% else %}
          0
        {% endif %}
      icon: >
        {% if value_json is defined and value_json.Pr is not none %}
          {% set poweropti = state_attr('sensor.poweropti', 'Watt') %}
          {% if poweropti is not none %}
            {% if (value_json.Pr - poweropti) | round(0, 0, 0) > 0 %}
              mdi:gauge-full
            {% else %}
              mdi:gauge-empty
            {% endif %}
          {% else %}
            mdi:alert
          {% endif %}
        {% else %}
          mdi:alert
        {% endif %}
    # Legacy sensors
    # Lists all JSON data for MaxxiCharge system context
    - name: MaxxiCharge_System
      unique_id: maxxicharge_system
      value_template: Ok
      json_attributes:
        - deviceId
        - wifiStrength
        - Pr
        - PV_power_total
        - SOC
        - Pccu
        - firmwareVersion
        - date
      icon: mdi:file-document-outline
    # Lists all JSON data for MaxxiCharge battery context
    - name: MaxxiCharge_Battery
      unique_id: maxxicharge_battery
      value_template: Ok
      json_attributes_path: $.batteriesInfo[0]
      json_attributes:
        - batteryCapacity
      icon: mdi:file-document-outline

In der Zwischenzeit habe ich Home Assist komplett neu aufgespielt (Docker Version) und HACS installiert. Der Rest ist nach Anleitung und dann mit viel Zeit und Hilfe von Chat GPT soweit gut geworden. Ich würde wenn möglich weiter um Hilfe bitten das dass Energie Dashboard auch die Solarleistung etc. anzeigt. Bis jetzt kann ich nur die Batterie einbinden. Im Rest des Dashboardes laufen die Sensoren nach meinem Erachten gut.

Es gelang mir mit

Einstellungen-GeräteDienste-Helfer (Menü ganz oben Mitte) - Helfer Erstellen-Integralsensor-(Metrisches Präfix=k, Zeiteinheit Stunden, Trapezregel, Genauigkeit zwischen 1-10,Zeitintervall bitte selbst wählen die Sensoren in das Energie Dashboard zu bringen

Ben1176 commented 3 weeks ago

Hallo,

danke für die Integration hat bisher sehr gut geklappt. Die Konfigurationen oben habe ich übernommen. HA hat noch an ein paar Stellen gemeckert, aber die lassen sich mit den Entwicklerwerkzeugen schnell finden.

Aktuell hänge ich auch an dem Thema, dass ich die Batterie in das Energieboard nicht einbinden kann.

Aus meiner Sicht müssten diese beiden Sensoren eingetragen werden:

image

Sehe ich das richtig, allerdings lässt sich das so nicht speichern.

Wozu brauche ich den/die Helfer und welche Sensoren sollen damit eingerichtet werden? Danke für die Arbeit und kurze Rückmeldung.

Viele Grüße

Reptail2 commented 3 weeks ago

Hallo Ben, über die Helfer kannst du die Sensor die die Energieflüsse messen in das Energydashboard bringen. Ich habe es so verstanden das die Energiemenge die die Sensoren des Maxxicharge liefern zu klein ist um genutzt zu werden. Hier kommen die Helfer ins Spiel sie gaukeln einen Sensor vor der die Originalwerte Hochrechnet un nutzbare Werte daraus macht.

Du kannst hier im Grunde frei probieren bei einer Konstellation gab es sogar einen Messwert der mir sagte zu wie viel % ich Autark sei. Die nun folgenden Einstelllungen machten aber für mich den meisten Sinn. Bildschirmfoto vom 2024-10-15 14-20-14

Wie du hier sehen kannst habe ich den Sensor der Batterie doppelt mit Helfer eingepflegt. Wenn du einen Sensor doppelt verwendest sagt er es wäre ein Fehler, das bin ich mit Helfer umgangen (Batterie2)

Bildschirmfoto vom 2024-10-15 14-19-22

Ach ja solltest du das Programm Forcast.Solar nutzen hilft es wenn du unter Entwicklerwerkzeuge -Template im Editor den Code gegen diesen tauschst. ` {## Imitate available variables: ##} {% set my_test_json = { "temperature": 25, "unit": "°C" } %}

The temperature is {{ my_test_json.temperature }} {{ my_test_json.unit }}.

{% if 'sun.sun' in states and is_state("sun.sun", "above_horizon") %} The sun rose {{ relative_time(states.sun.sun.last_changed) }} ago. {% else %} {% if state_attr("sun.sun", "next_rising") is not none %} The sun will rise at {{ as_timestamp(state_attr("sun.sun", "next_rising")) | timestamp_local }}. {% else %} The next rising time is not available. {% endif %} {% endif %}

For loop example getting entity values in the weather domain:

{% for state in states.weather %} {%- if loop.first %}The {% elif loop.last %} and the {% else %}, the {% endif -%} {{ state.name | lower }} is {{ state.state_with_unit }} {% endfor %}. `

Solltest du so wie ich mehrere Helfer generiert haben und diese wieder loswerden wollen geht das über https://forum.heimnetz.de/threads/ha-helfer-lassen-sich-nicht-loeschen.4031/

Ben1176 commented 3 weeks ago

Danke für die Schnelle Rückmeldung, Ich habe be mir die Helfer mit diesen Sensoren belegt: sensor.maxisun_powerout (Strom, der aktuell in das Hausnetz fließt) und sensor.maxxisun_powerin (Strom der zum Laden der Batterie genutzt wird).

Was hat es denn mit dem Forcast aufsich? und Sorry wo kann ich das ändern?

Viele Grüße

Reptail2 commented 3 weeks ago

https://www.home-assistant.io/integrations/forecast_solar

Soll Helfen bei der Berechnung der Solareingänge.

Du kannst es finden unter Einstellungen-Geräte&Dienste + Integration (Forecast.Solar)

Selbst habe ich noch nicht die Zeit gehabt mich damit zu befassen. Es wurde mir bei meiner ersten Nutzung des Maxxicharge hinzu installiert.

Liebe Grüße

Ben1176 commented 3 weeks ago

Ok, jetzt habe ich es begriffen, hatte ich bereits vor einiger aktiviert, nutze es aber aktuell noch nicht wirklich, da die großen Verbaucher noch nicht smart sind.