Home Assistant + Telegram Bot: PV-/Akku-Status

Schritt-für-Schritt: Bot anlegen, Integration (Polling) einrichten, Befehle /akku & /info mit Balken & Inline-Buttons – inkl. Troubleshooting.

Inhalt

1) Telegram-Bot anlegen 2) Bot zur Gruppe & IDs holen 3) HA: Telegram-Integration (Polling) 4) Senden testen 5) Befehl /akku (mit Balken + Buttons) 6) Befehl /info (PV-Übersicht + Buttons) 7) Troubleshooting (häufige Fehler)

1) Telegram-Bot anlegen (BotFather)

1
In Telegram @BotFather öffnen → /newbot → Namen & Username (z. B. home_1_177_bot) festlegen. Token notieren.
2
Privacy-Mode deaktivieren: /setprivacy → Bot wählen → Disable. (So kommen Befehle in Gruppen an.)
Tipp: Wenn du den Token irgendwo gepostet hast: /revoke und neuen Token via /token holen.

2) Bot zur Gruppe hinzufügen & Chat-IDs holen

  1. Bot in deine Supergruppe einladen (optional Admin machen).
  2. Gruppen-ID holen: @myidbot in der Gruppe → /getgroupid (Format: -100…).
  3. (Optional) Deine User-ID in PM: @myidbot/getid.
Hinweis: Supergruppen-Themen (Topics) können Events blocken. Entweder Themen deaktivieren oder im „Allgemein/General“-Topic schreiben.

3) Home Assistant: Telegram-Integration (Polling)

  1. Einstellungen → Geräte & Dienste → Integration hinzufügen → “Telegram bot”.
  2. Token einfügen → Verbindungsmodus: Polling.
  3. In den Optionen: Allowed chat IDs = -100DEINEGRUPPE (und ggf. deine User-ID). Parse-Modus: HTML.
Webhook aufräumen (falls zuvor gesetzt):
https://api.telegram.org/bot<DEIN_TOKEN>/deleteWebhook?drop_pending_updates=true

4) Test: Kann HA senden?

Einstellungen → Entwicklerwerkzeuge → Aktionen → Dienst telegram_bot.send_message, dann:

target: -100DEINEGRUPPE
message: "HA ↔️ Telegram läuft ✅"
disable_web_page_preview: true
Kommt an? Super – weiter mit den Befehlen.

5) /akku – Batteriestatus mit Balken + Inline-Buttons

In Automationen neue Automation → YAML bearbeiten (kein führendes - am Anfang):

alias: Telegram /akku → Batteriestatus (modern)
mode: single

triggers:
  - trigger: event
    event_type: telegram_command
  - trigger: event
    event_type: telegram_text
  - trigger: event
    event_type: telegram_callback

actions:
  - condition: template
    value_template: >
      {% set cmd = (trigger.event.data.command or '')|lower %}
      {% set txt = (trigger.event.data.text or '')|lower %}
      {% set cb  = (trigger.event.data.data or '')|lower %}
      {{ cmd.startswith('/akku') or txt.startswith('/akku') or txt in ['akku','akku?'] or cb.startswith('/akku') }}

  - choose:
      - conditions: "{{ trigger.event.event_type == 'telegram_callback' and (trigger.event.data.id is defined) }}"
        sequence:
          - action: telegram_bot.answer_callback_query
            data:
              callback_query_id: "{{ trigger.event.data.id }}"
              show_alert: false
              message: "Aktualisiert ✅"
          - delay: "00:00:01"

  - action: telegram_bot.send_message
    data:
      target: "{{ trigger.event.data.chat_id }}"
      parse_mode: html
      disable_web_page_preview: true
      message: >-
        {% set soc = states('sensor.growatt_spf_battery_state_of_charge')|int(0) %}
        {% set filled = (soc // 10) %}
        {% set bar = '█' * filled + '░' * (10 - filled) %}
        {% set icon = '🟥' if soc < 20 else '🟧' if soc < 50 else '🟨' if soc < 80 else '🟩' %}
        🔋 <b>Akku</b> {{ icon }}

        SOC: {{ soc }}%
        <code>[{{ bar }}]</code>
      inline_keyboard:
        - "🔁 Aktualisieren:/akku"
        - "☀️ PV-Info:/info"

Der Balken füllt sich in 10-%-Schritten. Buttons senden telegram_callback Events, daher lauschen wir im Trigger darauf.

6) /info – PV-Übersicht (modern, mit Akku-Balken + Buttons)

Neue Automation → YAML bearbeiten (kein führendes -):

alias: Telegram /info → PV-Status (modern)
mode: single

triggers:
  - trigger: event
    event_type: telegram_command
  - trigger: event
    event_type: telegram_text
  - trigger: event
    event_type: telegram_callback

conditions:
  - condition: template
    value_template: >
      {% set t  = (trigger.event.data.text or '')|lower %}
      {% set c  = (trigger.event.data.command or '')|lower %}
      {% set cb = (trigger.event.data.data or '')|lower %}
      {{ t.startswith('/info') or t in ['info','info?'] or c.startswith('/info') or cb.startswith('/info') }}

actions:
  - choose:
      - conditions: "{{ trigger.event.event_type == 'telegram_callback' and (trigger.event.data.id is defined) }}"
        sequence:
          - action: telegram_bot.answer_callback_query
            data:
              callback_query_id: "{{ trigger.event.data.id }}"
              show_alert: false
              message: "Aktualisiert ✅"
          - delay: "00:00:01"

  - variables:
      chat: "{{ trigger.event.data.chat_id }}"
      pv:   "{{ states('sensor.growatt_spf_pv_power')|float(0)|round(0) }}"
      soc:  "{{ states('sensor.growatt_spf_battery_state_of_charge')|int(0) }}"
      pv1:  "{{ states('sensor.growatt_spf_pv_power_1')|float(0)|round(0) }}"
      pv2:  "{{ states('sensor.growatt_spf_pv_power_2')|float(0)|round(0) }}"
      v1:   "{{ states('sensor.growatt_spf_pv_voltage_1')|float(0)|round(1) }}"
      v2:   "{{ states('sensor.growatt_spf_pv_voltage_2')|float(0)|round(1) }}"
      a1:   "{{ states('sensor.growatt_spf_pv_current_1')|float(0)|round(2) }}"
      a2:   "{{ states('sensor.growatt_spf_pv_current_2')|float(0)|round(2) }}"
      e_tot: "{{ states('sensor.growatt_spf_pv_energy')|float(0)|round(2) }}"
      e_day: "{{ states('sensor.pv_ertrag_heute')|float(0)|round(2) }}"

  - action: telegram_bot.send_message
    data:
      target: "{{ chat }}"
      parse_mode: html
      disable_web_page_preview: true
      message: >-
        {% set filled = (soc // 10) %}
        {% set bar = '█' * filled + '░' * (10 - filled) %}
        <b>☀️ Growatt SPF6000 8kWp</b>

        🔋 <b>Akkustand</b>  {{ soc }}% <code>[{{ bar }}]</code>

        🟧 <b>PV gesamt</b>  {{ pv }} W

        🟦 <b>PV1</b>  {{ pv1 }} W  •  {{ v1 }} V  •  {{ a1 }} A
        🟩 <b>PV2</b>  {{ pv2 }} W  •  {{ v2 }} V  •  {{ a2 }} A

        📊 <b>Energie</b> ges.: {{ e_tot }} kWh
        📅 <b>Heute</b>         : {{ e_day }} kWh
      inline_keyboard:
        - "🔁 Aktualisieren:/info"
        - "🔋 Akku:/akku"

Einheiten/Präzision sind gerundet und gut lesbar. Icons sind rein visuell.

7) Troubleshooting (häufige Stolpersteine)

  • „/akku“ löst nicht aus → In Gruppen /akku@DEIN_BOTNAME schreiben oder Privacy-Mode beim BotFather deaktivieren.
  • Keine Events in HA → Integration im Polling-Modus, Allowed Chat IDs gesetzt, ggf. Bot kurz aus Gruppe entfernen & neu hinzufügen, im PM /start senden.
  • Inline-Buttons „klicken“, aber keine Aktion → In den Automationen muss event_type: telegram_callback als Trigger dabei sein und auf data geprüft werden (siehe YAML oben).
  • Webhook aktiv → Einmal bereinigen: https://api.telegram.org/bot<TOKEN>/deleteWebhook?drop_pending_updates=true
  • „Speichern“-Fehler im UI-Editor → Im UI-Editor kein führendes - vor alias:. In automations.yaml hingegen schon.
Check: Wenn Senden klappt und du im Event-Abo (telegram_text/telegram_command) Events siehst, funktionieren die Automationen mit den Snippets oben sofort.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

This field is required.

This field is required.