Roborock in Home Assistant: Vacuum Map Card richtig einrichten und Räume gezielt reinigen

👉 Direkt auf YouTube schauen und abonnieren:
Smart Home & More auf YouTube

Einführung

Seit 2019 setze ich Roborock-Saugroboter zuverlässig in meinem Zuhause ein. Von älteren Modellen bis hin zu aktuellen Geräten arbeiten sie täglich für uns – und sind für unsere Familie nicht mehr wegzudenken. Gerade weil wir in jedem Stockwerk einen Roborock nutzen, ist mir eine effiziente Integration in Home Assistant besonders wichtig.

Bereits vor längerer Zeit hatte ich dazu ein Video sowie ein Skript bereitgestellt. Dieses funktionierte zuverlässig, war jedoch an ein grundlegendes Problem gebunden: Es arbeitete auf Geräte-IDs statt Entitäten. Wenn ein neuer Roboter hinzukam, musste das gesamte Skript manuell angepasst werden. Da bei uns immer wieder ein neues Modell seinen Platz findet, wurde diese Anpassung zunehmend unübersichtlich. Aus diesem Grund habe ich eine modernisierte, flexiblere Lösung entwickelt.

In diesem Beitrag zeige ich Schritt für Schritt, wie du:

  • Roborock korrekt in Home Assistant einbindest
  • die Roborock Custom Map Integration installierst
  • die Vacuum Map Card einrichtest
  • Räume sauber konfigurierst
  • die Karte vollständig nutzen kannst

Das Ziel ist, Roborock komfortabel und visuell ansprechend zu steuern – ganz ohne komplexe Skriptanpassungen.

Roborock Vacuum Map Card

Unterstützung des Kanals

Die Erstellung meiner Skripte und Videos ist mit einem erheblichen zeitlichen Aufwand verbunden – von der technischen Vorbereitung und intensiven Recherche bis hin zu Tests, Aufnahmen und Nachbearbeitung. Alle Inhalte stelle ich dir dennoch vollständig kostenlos zur Verfügung.

Aktuell gibt es in den Black Weeks besonders attraktive Angebote. Ich selbst habe mir zu diesen hervorragenden Konditionen einen neuen Roborock-Saugroboter gegönnt – die Preise sind wirklich stark.

Wenn du ebenfalls über den Kauf eines Roborock nachdenkst, kannst du meinen Kanal und meine Arbeit wirkungsvoll unterstützen, indem du den Roboter über meinen Affiliate-Link bestellst. Für dich bleibt der Preis unverändert, aber ein kleiner Anteil des Kaufpreises hilft mir, weiterhin hochwertige Inhalte bereitzustellen. Wenn du vielleicht etwas anderes in den Black Wecks kaufen möchtest, kannst du mich dennoch unterstützen, wenn du meinen allgemeinen amazon Link für deinen Einkauf verwendest.

Angebot
roborock Qrevo Curv Saugroboter mit Wischfunktion&Hebarem Wischmopp, Dual Anti-Tangle-System, AdaptiLift™ Chassis, 18.500Pa, 75℃ Heißwasser-Moppwäsche, Intelligente Schmutzerkennung&Sprachassistent
  • [Dual Anti-Tangle-System] Entdecke das revolutionäre doppelte Verhedderungsschutz-System des roborock Qrevo Curv mit Hauptbürste und Seitenbürste, einfach perfekt für den Umgang mit langen Haaren und für haustierfreundliche Wohnungen. Genieße eine Reinigung ohne verhedderte Haare und ähnliches, die Bürste reinigt sich fast von selbst.
  • [Extreme Saugkraft von 18.500 Pa] Branchenführende 18.500 Pa HyperForce Saugkraft in Kombination mit den Borsten der DuoDivide Bürste garantieren, dass der roborock Qrevo Curv auch anspruchsvolle Stellen wie Teppiche und Lücken in harten Böden gründlich reinigt und dabei selbst die kleinsten Partikel entfernt.
  • [FlexiArm Technologie] Die FlexiArm Arc Seitenbürste und das Kantenwischsystem, die exklusiv von Roborock angeboten werden, ermöglichen eine unvergleichliche Reinigungsabdeckung, da blinde Flecken beseitigt werden und somit kein Schmutz zurückbleibt.
  • [AdaptiLift Chassis] Erreiche ein höheres Niveau bei der Reinigung mit dem AdaptiLift Chassis, einer Premiere in der Branche, bei der viele verschiedene Anhebezustände dank drei unabhängig einstellbarer Räder erreicht werden können. So kann das gesamte Chassis um 10 mm angehoben werden oder nur die vordere, hintere, linke oder rechte Hälfte, damit die Anpassung an deine heimische Umgebung problemlos möglich ist.
  • [75 °C Heißwasser-Moppwäsche] Beseitige problemlos hartnäckige Flecken und fettige Verschmutzungen mit 75 °C heißem Wasser von deinen Mopps, gleichermaßen perfekt für Küchen und Essbereiche. Das heiße Wasser beseitigt über 99,99 % der Bakterien und gewährleistet optimale Hygiene. Mit drei einstellbaren Temperatureinstellungen bist du auf jedes Reinigungsszenario vorbereitet.
Angebot
roborock Saros 10R Saugroboter mit Wischfunktion&angebbarem Wischmopp, 22,000 Pa, 7,98cm Ultra-Slim Design, StarSight System 2.0, Zero-Tangle System
  • 7,98cm Ultraflaches Design – Dank des autonomen StarSight Systems 2.0 der nächsten Generation ist der Saros 10R unglaublich smart und beeindruckend flach. Mit seiner hochentwickelten Positionierungs- und Kartierungsfunktiornen navigiert er mühelos unter Sofas und Betten.
  • Autonomes StarSight System 2.0 – Mithilfe fortschrittlicher Technologie zur Vermeidung seitlicher Hindernisse gleitet er mühelos um unregelmäßig geformte Möbel und Wände herum und reinigt sogar die Umgebung herumliegender Kabel garantiert gründlich.
  • Zero-Tangle-System – Ständige Wartung der Bürste ist für dich kein Thema mehr- dank des revolutionären Anti-Tangle-Systems an Hauptbürste und Seitenbürste. Das System reinigt sich selbst und kommt selbst mit langen Haaren zurecht. Dank HyperForce Saugleistung verschwinden Staub und Schmutz auf verschiedenen Arten von Böden und Teppichen, da auch die kleinsten Partikel spurlos beseitigt werden.
  • FlexiArm Riser Seitenbürste und Mopp – Die FlexiArm Technologie ist die Grundlage der doppelten Roboterarme für die Seitenbürste und den Mopp, damit Schmutz aus Ecken, an Kanten und unter Möbeln gekonnt aufgekehrt wird.
  • AdaptiLift Chassis als Branchenpremiere – Das gesamte Gehäuse kann abgenommen werden. Dabei sind die drei Räder unabhängig voneinander einstellbar. So erreicht dein Roborock auch schwer erreichbarre Stellen wie ein allrad-betriebener Geländewagen – für optimale Reinigungsabdeckung.

Roborock Core Integration installieren

Ich beginne in Home Assistant mit einer sauberen Testumgebung, sodass jeder Schritt nachvollziehbar ist. Die Core Integration lässt sich über Einstellungen → Geräte & Dienste → Integration hinzufügen installieren. Nach Eingabe der E-Mail-Adresse und des Bestätigungscodes erscheinen alle Roborock-Geräte automatisch in der Übersicht.

Roborock Integration

Damit steht das Fundament, auf dem die gesamte spätere Kartenfunktionalität aufbaut.


Custom Map Integration über HACS installieren

Die Vacuum Map Card benötigt spezielle Map-Datenstrukturen. Die normale Roborock-Integration stellt diese jedoch nicht vollständig bereit. Genau dafür dient die Roborock Custom Map Integration.

Roborock Custom Map Integration

Nach dem Öffnen des Repositorys in HACS sucht man nach Roborock Custom Map Integration und drückt auf herunterladen. Anschließend ist ein Neustart von Home Assistant erforderlich. Roborock

Wichtig: Die bisherige Image-Entität des Roboters sollte deaktiviert werden. Die neue Custom-Image-Entität wird später in der Vacuum Map Card genutzt.

Roborock Image deaktivieren

Vacuum Map Card installieren

Die Karte selbst wird ebenfalls über HACS installiert.

Roborock Vacuum Map Card

Ein Neustart ist hier nicht notwendig. Danach kann ich direkt im Dashboard eine neue Karte hinzufügen und folgende Einstellungen setzen:

  • Plattform: Roborock
  • Staubsauger: Eure Sauger Entität
  • Image: die neue, durch die Custom Map Integration erzeugte Map-Entität

Die Karte zeigt nun die vollständige Umgebung an und bildet die Grundlage für die spätere Raumsteuerung.


Räume korrekt einrichten

Damit die Karte weiß, welche Bereiche ausgewählt werden können, müssen die Räume in der Roborock App korrekt definiert bzw. bereinigt werden.

Roborock Handy App

Über Karte bearbeiten → Erstelle Raumkonfiguration wird die Raumkonfiguration ausgelesen und im YAML Code der Karte angelegt. Im Code-Editor kann man dann die Erstellung überprüfen.

Hier zeigt Home Assistant zwar sämtliche Räume an, allerdings meist in mehrfacher Ausführung. Ich lösche alle überflüssigen Einträge und behalte nur diejenigen, die tatsächlich existieren – in meinem Fall Flur, Studio und Büro. Mir ist dabei aufgefallen, wenn man von unten nach oben geht, dann hat man an den letzten Stellen immer die korrekten Räume mit ihren IDs. D.h. ich geht wie im Beispiel Studio, Büro, Flur nach oben und löscht wie im Video gezeigt die überflüssigen Räume

Nach dem Speichern erscheinen die Räume korrekt und lassen sich über die Karte selektieren.


Erweiterte Reinigungsoptionen – ohne Skriptanpassungen

Viele Anwender starten die Reinigung direkt über die Karte und stellen die gewünschten Parameter dort ein. Das funktioniert zuverlässig. Auch Saugleistung, Modi und Wischintensitäten lassen sich dort einstellen.

Da ich selbst häufig erst sauge und anschließend wische, habe ich ein eigenes erweitertes Vorgehen entwickelt. Dieses ermöglicht es mir über ein Skript erst zu saugen und dann zu wischen und gleichzeitig alle relevanten Parameter vorzubelegen.

Die benötigten Entitäten – etwa für Mop-Modus, Wischintensität oder Ventilatorgeschwindigkeit – lassen sich zuvor über die Entwicklerwerkzeuge bestimmen. Wichtig, achtet darauf, dass wir die korrekten Attribute bei der Übergabe an das Skript übernehmt.

Dynamisches Skript für erst Saugen und dann Wischen ( nur für Roborock Saugroboter)

alias: Sauge und Wische Dynamisch
description: ""
mode: parallel
max: 10
fields:
  vacuum_entity:
    name: vacuum_entity
    description: Vacuum-Entität, z.B. vacuum.roborock_s8_pro_ultra
    required: true
    selector:
      entity:
        filter:
          domain: vacuum
  mop_mode_entity:
    name: mop_mode_entity
    description: Select-Entität für Mop-Modus (z.B. select.*_mop_modus)
    required: true
    selector:
      entity:
        filter:
          domain: select
  mop_intensity_entity:
    name: mop_intensity_entity
    description: Select-Entität für Wischintensität (z.B. select.*_wisch_intensitat)
    required: true
    selector:
      entity:
        filter:
          domain: select
  segments:
    name: segments
    description: Segment-IDs aus der Map Card (z.B. [16,17])
    required: true
    selector:
      object: {}
  fan_speed_saugen:
    name: fan_speed_saugen
    description: Lüfterstufe fürs Saugen (z.B. max, turbo, quiet)
    required: false
    default: max
    selector:
      text: {}
  fan_speed_wischen:
    name: fan_speed_wischen
    description: Lüfterstufe fürs Wischen
    required: false
    default: quiet
    selector:
      text: {}
  mop_mode:
    name: mop_mode
    description: Mop-Modus (z.B. standard)
    required: false
    default: standard
    selector:
      text: {}
  mop_intensity_saugen:
    name: mop_intensity_saugen
    description: Wischintensität während Saugen
    required: false
    default: mild
    selector:
      text: {}
  mop_intensity_wischen:
    name: mop_intensity_wischen
    description: Wischintensität während Wischen
    required: false
    default: moderate
    selector:
      text: {}
  saugen:
    name: saugen
    description: Soll gesaugt werden?
    required: false
    default: true
    selector:
      boolean: {}
  wischen:
    name: wischen
    description: Soll gewischt werden?
    required: false
    default: true
    selector:
      boolean: {}
sequence:
  - variables:
      segs: |-
        {% set s = segments %} {% if s is string %}
          {% set s = s | from_json %}
        {% endif %} {{ s | map('int') | unique | list }}
  - if:
      - condition: template
        value_template: "{{ saugen }}"
        alias: Wenn Saugen eingeschaltet ist
    then:
      - alias: Wisch Intensität (Saug-Durchgang)
        action: select.select_option
        target:
          entity_id: "{{ mop_intensity_entity }}"
        data:
          option: "{{ mop_intensity_saugen }}"
      - delay:
          milliseconds: 500
      - alias: Mopp-Modus (Saug-Durchgang)
        action: select.select_option
        target:
          entity_id: "{{ mop_mode_entity }}"
        data:
          option: "{{ mop_mode }}"
      - delay:
          milliseconds: 500
      - alias: Lüfterstufe (Saug-Durchgang)
        action: vacuum.set_fan_speed
        target:
          entity_id: "{{ vacuum_entity }}"
        data:
          fan_speed: "{{ fan_speed_saugen }}"
      - delay:
          milliseconds: 500
      - alias: Starte Saug-Durchgang (Segmente)
        action: vacuum.send_command
        target:
          entity_id: "{{ vacuum_entity }}"
        data:
          command: app_segment_clean
          params: "{{ segs }}"
      - action: persistent_notification.create
        data:
          message: "Sauge: {{ segs }}"
  - alias: Wischen
    if:
      - condition: template
        value_template: "{{ wischen }}"
    then:
      - alias: Wenn Saugen und Wischen aktiv sind
        if:
          - condition: template
            value_template: "{{ saugen }}"
        then:
          - alias: Warte bis Roboter nicht mehr 'docked' ist
            wait_template: "{{ not is_state(vacuum_entity, 'docked') }}"
            timeout: "00:05:00"
            continue_on_timeout: true
          - alias: Warte bis Roboter 1 Minute am Stück 'docked' ist
            wait_template: |-
              {{ is_state(vacuum_entity, 'docked')
                 and (as_timestamp(now())
                      - as_timestamp(states[vacuum_entity].last_changed)) > 60 }}
            timeout: "02:00:00"
            continue_on_timeout: true
          - alias: Prüfe Dock-Status nach Timeout
            if:
              - condition: template
                value_template: "{{ not is_state(vacuum_entity, 'docked') }}"
            then:
              - action: persistent_notification.create
                data:
                  title: Saugskript Hinweis
                  message: >-
                    {{ vacuum_entity }} war nach 2 Stunden noch nicht stabil
                    'docked'. Wisch-Durchgang wird trotzdem gestartet.
      - alias: Lüfterstufe (Wisch-Durchgang)
        action: vacuum.set_fan_speed
        target:
          entity_id: "{{ vacuum_entity }}"
        data:
          fan_speed: "{{ fan_speed_wischen }}"
      - delay:
          milliseconds: 500
      - alias: Mopp-Modus (Wisch-Durchgang)
        action: select.select_option
        target:
          entity_id: "{{ mop_mode_entity }}"
        data:
          option: "{{ mop_mode }}"
      - delay:
          milliseconds: 500
      - alias: Wisch Intensität (Wisch-Durchgang)
        action: select.select_option
        target:
          entity_id: "{{ mop_intensity_entity }}"
        data:
          option: "{{ mop_intensity_wischen }}"
      - delay:
          milliseconds: 500
      - alias: Starte Wisch-Durchgang (Segmente)
        action: vacuum.send_command
        target:
          entity_id: "{{ vacuum_entity }}"
        data:
          command: app_segment_clean
          params: "{{ segs }}"
      - action: persistent_notification.create
        data:
          message: "Wische: {{ segs }}"

Integration in die Vacuum Map Card

Damit die Reinigung komfortabel über einen einzigen Button in der Karte ausgelöst werden kann, erweitere ich die Kartenkonfiguration. Dadurch entsteht ein zusätzlicher Menüpunkt wie „Saugen und Wischen“. Dieser greift auf die zuvor definierten Parameter zu und löst die Reinigungssequenz aus. Roborock

Default Code Ansicht ohne Räume:

YAML Code Ansicht der Vacuum Card, mit den Räumen

type: custom:xiaomi-vacuum-map-card
map_source:
  camera: image.s8_ug_untergeschoss_custom
calibration_source:
  camera: true
entity: vacuum.roborock_s8_pro_ultra
vacuum_platform: Roborock
map_modes:
  - template: vacuum_clean_zone
  - template: vacuum_goto
  - template: vacuum_clean_segment
    predefined_selections:
      - id: "16"
        icon:
          name: mdi:broom
          x: 22850
          "y": 22675
        label:
          text: Flur
          x: 22850
          "y": 22675
          offset_y: 35
        outline:
          - - 19700
            - 20200
          - - 26000
            - 20200
          - - 26000
            - 25150
          - - 19700
            - 25150
      - id: "17"
        icon:
          name: mdi:broom
          x: 22925
          "y": 26825
        label:
          text: Büro
          x: 22925
          "y": 26825
          offset_y: 35
        outline:
          - - 19450
            - 25150
          - - 26400
            - 25150
          - - 26400
            - 28500
          - - 19450
            - 28500
      - id: "18"
        icon:
          name: mdi:broom
          x: 28075
          "y": 26850
        label:
          text: Studio
          x: 28075
          "y": 26850
          offset_y: 35
        outline:
          - - 26250
            - 25200
          - - 29900
            - 25200
          - - 29900
            - 28500
          - - 26250
            - 28500

Um jetzt ein zusätzliches Skript aufzurufen, müssen wir ein paar Parameter im YAML Code ergänzen. Diese fügen wird direkt unterhalb der vorherigen Eintragungen ( bei euch demnach nach euren Räumen mit den Koordinaten ) ein.

Die Parameter fan_speed_saugen, fan_speed_wischen, mop_intensity_saugen. mop_intensity_wischen, sind nach den zuvor ausgelesenen Attributen aus den Entwicklerwerkzeugen einzusetzen. Bitte nicht einfach kopieren, denn jeder Roborock Roboter hat hier unter Umständen andere Namen in den Attributen!

  - name: UG Saugen & Wischen
    icon: mdi:layers-triple
    selection_type: ROOM
    max_selections: 10
    run_immediately: false
    variables:
      fan_speed_saugen: max
      fan_speed_wischen: "off"
      mop_mode: standard
      mop_intensity_saugen: "off"
      mop_intensity_wischen: moderate
    service_call_schema:
      service: script.sauge_und_wische_dynamisch
      service_data:
        vacuum_entity: "[[entity_id]]"
        segments: "[[selection]]"
        saugen: true
        wischen: true
        mop_mode_entity: select.roborock_s8_pro_ultra_mop_modus
        mop_intensity_entity: select.roborock_s8_pro_ultra_wisch_intensitat
        fan_speed_saugen: "[[fan_speed_saugen]]"
        fan_speed_wischen: "[[fan_speed_wischen]]"
        mop_mode: "[[mop_mode]]"
        mop_intensity_saugen: "[[mop_intensity_saugen]]"
        mop_intensity_wischen: "[[mop_intensity_wischen]]"
    predefined_selections:

Jetzt fehlen und bei de predefined_selections: nur noch die Räume. Hier gibt es jetzt zwei Möglichkeiten. Entweder man kopiert sich die „predefined_selections“ aus dem vorherigen Code Abschnitt, oder aber man nutzt einen YAML-Anker. Ich nutze einen YAML-Anker, um Raumdefinitionen nicht doppelt pflegen zu müssen. Das reduziert die Fehleranfälligkeit und erleichtert spätere Anpassungen.

Dazu geht an die erste Stelle mit“ predefined_selections“ im Code.

und fügt dort folgendes nach dem Doppelpunkt ein:

&seg

Dann geht zum letzten Eintrag mit „predefined_selections“, also der Blog, den ihr zuvor eingefügt hattet.

Dort fügt nun nach dem Doppelpunkt ein :

*seg

ein.

Jetzt nur noch auf „Speichern“ drücken. Und der Abschnitt nach eurem letzten „predefined_selections“ wird automatisch mit den Eintragungen aus dem oberen Abschnitt gefüllt. Das Verfahren verringert aus meiner Sicht die Fehleranfälligkeit beim Kopieren und Einfügen.

Um euch die Möglichkeit zu geben eure YAML Konfiguration der Vacuum Map Card abzugleichen, habt ihr hier nochmal den kompletten YAML Code meiner eigenen Konfiguration. Bitte beachtet, dass ihr eure eigene Raumkonfiguration erstellen müsst, da diese in meinem Setup auf unsere Raumkonfiguration in der Roborock App abgestimmt ist!

type: custom:xiaomi-vacuum-map-card
map_source:
  camera: image.s8_ug_untergeschoss_custom
calibration_source:
  camera: true
entity: vacuum.roborock_s8_pro_ultra
vacuum_platform: Roborock
map_modes:
  - template: vacuum_clean_zone
  - template: vacuum_goto
  - template: vacuum_clean_segment
    predefined_selections:
      - id: "16"
        icon:
          name: mdi:broom
          x: 22850
          "y": 22675
        label:
          text: Flur
          x: 22850
          "y": 22675
          offset_y: 35
        outline:
          - - 19700
            - 20200
          - - 26000
            - 20200
          - - 26000
            - 25150
          - - 19700
            - 25150
      - id: "17"
        icon:
          name: mdi:broom
          x: 22925
          "y": 26825
        label:
          text: Büro
          x: 22925
          "y": 26825
          offset_y: 35
        outline:
          - - 19450
            - 25150
          - - 26400
            - 25150
          - - 26400
            - 28500
          - - 19450
            - 28500
      - id: "18"
        icon:
          name: mdi:broom
          x: 28075
          "y": 26850
        label:
          text: Studio
          x: 28075
          "y": 26850
          offset_y: 35
        outline:
          - - 26250
            - 25200
          - - 29900
            - 25200
          - - 29900
            - 28500
          - - 26250
            - 28500
  - name: UG Saugen & Wischen
    icon: mdi:layers-triple
    selection_type: ROOM
    max_selections: 10
    run_immediately: false
    variables:
      fan_speed_saugen: max
      fan_speed_wischen: "off"
      mop_mode: standard
      mop_intensity_saugen: "off"
      mop_intensity_wischen: moderate
    service_call_schema:
      service: script.sauge_und_wische_dynamisch
      service_data:
        vacuum_entity: "[[entity_id]]"
        segments: "[[selection]]"
        saugen: true
        wischen: true
        mop_mode_entity: select.roborock_s8_pro_ultra_mop_modus
        mop_intensity_entity: select.roborock_s8_pro_ultra_wisch_intensitat
        fan_speed_saugen: "[[fan_speed_saugen]]"
        fan_speed_wischen: "[[fan_speed_wischen]]"
        mop_mode: "[[mop_mode]]"
        mop_intensity_saugen: "[[mop_intensity_saugen]]"
        mop_intensity_wischen: "[[mop_intensity_wischen]]"
    predefined_selections:
      - id: "16"
        icon:
          name: mdi:broom
          x: 22850
          "y": 22675
        label:
          text: Flur
          x: 22850
          "y": 22675
          offset_y: 35
        outline:
          - - 19700
            - 20200
          - - 26000
            - 20200
          - - 26000
            - 25150
          - - 19700
            - 25150
      - id: "17"
        icon:
          name: mdi:broom
          x: 22925
          "y": 26825
        label:
          text: Büro
          x: 22925
          "y": 26825
          offset_y: 35
        outline:
          - - 19450
            - 25150
          - - 26400
            - 25150
          - - 26400
            - 28500
          - - 19450
            - 28500
      - id: "18"
        icon:
          name: mdi:broom
          x: 28075
          "y": 26850
        label:
          text: Studio
          x: 28075
          "y": 26850
          offset_y: 35
        outline:
          - - 26250
            - 25200
          - - 29900
            - 25200
          - - 29900
            - 28500
          - - 26250
            - 28500

Praxisbeispiel

Nach der vollständigen Einrichtung lassen sich Räume über die Vacuum Map Card einfach auswählen. Wenn ich einzelne Bereiche oder mehrere Räume zu einer kombinierten Reinigung zusammenfasse, genügt ein Klick auf den jeweiligen Button. Der Roboter fährt die Bereiche nacheinander ab und führt, je nach Einstellung, Saugen und Wischen exakt in dieser Reihenfolge aus. Roborock

Diese Lösung funktioniert zuverlässig mit allen Roborock-Modellen, die von der Core-Integration unterstützt werden.


Fazit

Durch die Kombination aus Roborock Core Integration, Roborock Custom Map Integration und Vacuum Map Card wird Home Assistant deutlich leistungsfähiger. Die Kartenansicht erleichtert die Steuerung im Alltag erheblich und bietet eine sehr klare Übersicht über alle Räume.

Während bei uns zu Hause meine Frau die puristische Ansicht bevorzugt, nutze ich gerne die Vacuum Map Card mit den erweiterten Funktionen. Beide Varianten haben ihre Vorteile – entscheidend ist, was im Alltag besser funktioniert. Den Blogbeitrag zu meiner alten Lösung findet ihr hier:

Blogbeitrag: Roborock in Home Assistant, Core Integration

Wenn du eigene Ideen oder Optimierungen hast, freue ich mich über Rückmeldungen. Ergänzende Dateien und Konfigurationen findest du wie gewohnt auf meiner Blogseite.

Victron SmartShunt installieren – meine Anleitung für Camper, Auto und Smart‑Home

👉 Direkt auf YouTube schauen und abonnieren:
Smart Home & More auf YouTube

Als Technikliebhaber und Camper habe ich mich schon oft gefragt, wie viel Strom eigentlich noch in meiner Batterie steckt. Die Spannung ist ein guter Anhaltspunkt, aber sie verrät nicht immer, wie viel Kapazität wirklich übrig ist. Deshalb habe ich mich entschieden, den Victron SmartShunt zu installieren. Dieser kleine Helfer ersetzt klassische Batteriemonitore, misst Strom und Spannung und berechnet daraus den Ladezustand. In diesem Blogbeitrag nehme ich dich mit auf meine Reise und erkläre dir Schritt für Schritt, wie auch du den Victron SmartShunt installieren kannst, um deine Batterie in Camper, Auto oder Haus zuverlässig zu überwachen.

Ich arbeite mich dabei vom grundsätzlichen Verständnis bis zur vollständigen Integration in Home Assistant vor. Du erhältst Tipps zu verschiedenen Ausführungen des Shunts, zur Verkabelung, zur Einrichtung der Victron‑App und zur Nutzung eines Bluetooth‑Proxys. Außerdem zeige ich dir, wie ich den Victron SmartShunt installieren und anschließend in Home Assistant visualisieren konnte, inklusive einer hübschen Batterieanzeige und nützlichen Automatisierungen.

Warum den Victron SmartShunt installieren?

Als Erstes stellt sich die Frage: Warum sollte ich überhaupt einen Victron SmartShunt installieren? Die Antwort liegt in der präzisen Messung und Visualisierung. Anders als simple Spannungsmesser misst der SmartShunt nicht nur die Spannung, sondern auch den Stromfluss und berechnet daraus den Ladezustand der Batterie. In meinem Camper ermöglicht mir das eine verlässliche Autarkieplanung. Im Auto sehe ich, ob die Starterbatterie bei langen Standzeiten schwächelt, und im Haus kann ich Speicherbatterien von Solaranlagen überwachen. Ein weiterer Vorteil: Durch Bluetooth‑Funktionalität kann ich die Werte drahtlos auslesen und in mein Smart‑Home integrieren.

Wenn du regelmäßig campst oder ein autarkes Setup betreibst, wirst du es zu schätzen wissen, jederzeit zu wissen, wie viel Restkapazität zur Verfügung steht. Auch beim Überwintern des Autos kann es sinnvoll sein, den Victron SmartShunt zu installieren, damit die Batterie nicht unbemerkt tiefentladen wird. In Kombination mit Home Assistant ermöglicht der Shunt außerdem schicke Dashboards und Automationen – etwa eine Benachrichtigung, wenn der Ladezustand kritisch wird.

Funktionsweise des Victron SmartShunt

Bevor ich den Victron SmartShunt installieren konnte, habe ich mich mit seiner Funktionsweise beschäftigt. Der SmartShunt wird in die Masseleitung der Batterie eingebaut und misst den Strom, der hinein- und herausfließt. Zusammen mit der Batteriespannung kann er so die entnommene und zugeführte Energie berechnen und daraus den State of Charge (SoC) ermitteln. Der Vorteil: Du brauchst kein zusätzliches Display, denn die Daten lassen sich per Bluetooth oder über den integrierten VE.Direct‑Port auslesen. Ich habe mich für die Bluetooth Variante entschieden, da sie mir eine nahtlose und einfache Installation in Home Assistant ermöglicht.

Es gibt unterschiedliche Varianten: 300 A, 500 A und 1000 A. Für einen Camper reicht die 300‑A‑Variante zumeist völlig aus. In Hausinstallationen oder bei großen Off‑Grid‑Systemen können auch die größere Varianten sinnvoll sein. Bevor du den Victron SmartShunt* installieren willst, solltest du dir also überlegen, welche Ströme in deinem Setup fließen. Achte darauf, dass die maximale Stromstärke der Verbraucher und der Ladevorgänge im Rahmen des Shunts liegt.

Angebot


Victron Energy SmartShunt Batteriewächter (Bluetooth) – Victron Shunt – Batteriemonitor – 6.5V-70V – 500 Amp

  • VICTRON ENERGY BATTERIEWÄCHTER: Victron Energy SmartShunt zeigt den Ladezustand der Batterie in % an und fungiert als Ladezustandsanzeige für Ihre Batterien
  • ALL-IN-ONE-BATTERIEMONITOR: Victron Energy Smartshunt ist ein hervorragender, einfach einzurichtender All-in-One-Batteriewächter. Es zeichnet Spannung, Strom, Energie und verbleibende Zeit und vieles mehr auf.
  • BLUETOOTH: Verbinden Sie Victron Energy Shunt über Bluetooth mit Ihrem Telefon oder Tablet und ändern Sie einfach die Einstellungen oder überwachen Sie Ihre Batterien – sparen Sie Platz, indem Sie kein eigenes Display verwenden
  • VERBINDEN SIE VICTRON ENERGY GX: Victron Energy GX-Gerät mit einem VE.Direct-Kabel an, um eine zweite Batterie, den Mittelpunkt der Bank oder die Temperatur zu überwachen (möglicherweise sind zusätzliche Teile erforderlich)
  • INSTALLATION: Eine unsachgemäße Installation kann gefährlich sein. Wenden Sie sich an einen Fachmann und befolgen Sie bei der Installation die elektrischen Vorschriften.

Vorbereitung für die Installation des Victron SmartShunt

Auswahl des richtigen Modells und Zubehörs

Bevor ich den Victron SmartShunt installieren konnte, musste ich das richtige Modell auswählen. Für mich war die 500‑A‑Variante passend ( nicht wegen der Leistung, sondern eher, da sie schneller lieferbar war 🙂 ) . Als Zubehör brauchst du außerdem passende Ringkabelschuhe mit einem auf die benötigte Leistung ausgelegten Kabelquerschnitt für die „Minus“ Seite (müssen dazugekauft werden), um die Kabel sicher anzuschließen, sowie eine geeignete Sicherung für den Pluspol ( wird mitgeliefert). Der SmartShunt wird zwar auf der Minus-Seite verbaut, aber der Pluspol des Geräts muss zur Stromversorgung angeschlossen werden.

Für die spätere Integration in Home Assistant habe ich mir außerdem einen ESP32* besorgt. Dieses kleine Modul dient als Bluetooth‑Proxy und leitet BLE‑Daten ins WLAN weiter. Dazu komme ich später noch.

Angebot


M5Stack Atom Lite ESP32 IoT Entwicklungsboards und Kits | Development Kit C008

  • M5Stack SKU: C008
  • ESP32-basiert, RGB-LED (SK6812)
  • Eingebaute Infrarot
  • Erweiterbare Pins & Löcher
  • Programmierplattform: Arduino, UIFlow

Sicherheitshinweise

Bevor du mit der Verkabelung beginnst und den Victron SmartShunt installieren möchtest, solltest du sicherstellen, dass deine Batterie spannungsfrei ist. Entferne gegebenenfalls die Sicherungen oder trenne das System vom Netz. Arbeite mit isoliertem Werkzeug und vermeide Kurzschlüsse. Eine saubere Installation erhöht nicht nur die Sicherheit, sondern sorgt auch für präzise Messwerte.

Verkabelung und Einbau des SmartShunt

Die Verkabelung war einfacher als gedacht, aber dennoch sind ein paar Dinge zu beachten. Um den Victron SmartShunt installieren zu können, wird der Shunt in die Minusleitung der Batterie eingebaut. Alle Verbraucher müssen hinter dem Shunt angeschlossen werden, damit der Stromfluss korrekt gemessen wird.

  1. Minuspol trennen: Ich habe zunächst den Minuspol der Batterie abgeklemmt.
  2. Shunt anschrauben: Der SmartShunt besitzt zwei große Schraubanschlüsse. Eine Seite (Batterieseite) wird direkt mit dem Minuspol der Batterie verbunden, die andere (Lastseite) führt zu den Verbrauchern.
  3. Pluspol des Shunts: Am Gehäuse befindet sich eine kleine Schraubklemme für den Pluspol. Hier habe ich eine Leitung von der Batterie über eine Sicherung angeschlossen. Das versorgt die Elektronik des Shunts.

Hinweis: Achte unbedingt darauf, die Ein- und Ausgangsseite nicht zu vertauschen. Wenn du den Victron SmartShunt installieren möchtest und die Anschlüsse vertauschst, wird der Stromfluss invertiert – die Messwerte sind dann negativ. Du kannst es zwar softwareseitig korrigieren, aber besser ist eine korrekte Installation.

Victron SmartShunt installieren in der Victron‑App

Nachdem der Shunt angeschlossen war, habe ich die Victron‑App aus dem App Store heruntergeladen. Mit ihr lässt sich der SmartShunt via Bluetooth konfigurieren. Der Pairing‑Code lautet standardmäßig 000000, falls du das Gerät noch nicht geändert hast.

Pairing und erste Schritte

Nach dem Öffnen der App hat die App den SmartShunt automatisch gefunden. Ich habe das Gerät ausgewählt und die Verbindung hergestellt. Um den Victron SmartShunt zu installieren, musste ich einige grundlegende Einstellungen vornehmen:

  • Batterie‑Kapazität: Hier habe ich den Wert meiner LiFePo4‑Batterie (200 Ah) eingetragen.
  • Ladeschluss‑Spannung: In meinem Fall 14,1 V.
  • Entladeschwelle: Ich habe 10 % gewählt, um die Batterie zu schützen.
  • Schweifstrom: 0,5 %, damit der Shunt erkennt, wann die Batterie voll ist.
  • Ladewirkungsgrad: 95 %.
  • SOC‑Reset: Es gibt die Möglichkeit, den SoC manuell zurückzusetzen. Das ist nützlich nach einem vollständigen Ladezyklus.

Victron SmartShunt installieren - Batterieeinstellungen

Hinweis: Verwende die zu deiner Batterie passenden Einstellungen. Die hier gezeigten Settings dienen nur als Beispiel!

Die App zeigt auch die MAC‑Adresse und den Verschlüsselungkey an. Letzteren habe ich mir abgeschrieben, denn für die Integration in Home Assistant benötige ich die sogenannte Advertisement‑Key, um die verschlüsselten Daten zu entschlüsseln. Beim Victron SmartShunt installieren solltest du dir diesen Schlüssel unbedingt notieren.

Victron SmartShunt installieren - Key und Mac

Victron SmartShunt installieren und Bluetooth‑Proxy nutzen

Um die Daten des SmartShunts im ganzen Haus verfügbar zu machen, reicht die Bluetooth‑Verbindung allein oft nicht aus, insbesondere wenn der Camper oder die Garage etwas weiter entfernt ist. Deshalb habe ich einen ESP32 als Bluetooth‑Proxy eingerichtet. Damit lassen sich BLE‑Geräte wie der SmartShunt über das WLAN ins Smart‑Home integrieren.

ESP32 als Bluetooth‑Proxy einrichten

Zuerst habe ich den ESP32 per USB an meinen Computer angeschlossen und die ESP‑Home‑Bluetooth Proxy- Installer ‑Seite geöffnet. Über den Wizard lässt sich mit wenigen Klicks ein generisches Bluetooth‑Proxy‑Image flashen. Nachdem der Flash‑Vorgang abgeschlossen war, habe ich den ESP32 mit meinem WLAN verbunden.

Anschließend habe ich den ESP32 direkt mit meinem Home Assistant verbunden. Im Lovelace‑Dashboard erschien ein neues Gerät, das ich „Bluetooth Proxy Video WW“ genannt habe. Nun ist der Victron SmartShunt im wahrsten Sinne des Wortes bereit für die nächste Stufe.

Tipp: Du kannst mehrere Bluetooth‑Proxies im Haus verteilen, wenn du noch andere BLE‑Sensoren hast. Sie erweitern die Reichweite und bringen die Daten zuverlässig ins Netzwerk.

Victron SmartShunt installieren - Bluetooth Proxy

Victron SmartShunt installieren in Home Assistant

Der spannendste Teil für mich war die Integration in Home Assistant. Um die verschlüsselten Daten des SmartShunts auswerten zu können, braucht man eine passende Integration.

HACS installieren und Victron BLE Integration hinzufügen

Zunächst habe ich den Home Assistant Community Store (HACS) eingerichtet. Das ist ein Zusatzmodul, das viele Community‑Integrationen bereitstellt. Über die GitHub‑Seite von Victron BLE habe ich die Integration in HACS hinzugefügt und installiert.

Danach musste Home Assistant neu gestartet werden. Unter „Einstellungen → Geräte und Dienste“ konnte ich „Victron BLE“ als neue Integration auswählen. Es wurde der SmartShunt automatisch gefunden, und ich musste nur noch den vorher notierten Advertisement‑Key eingeben. Hier ist eine typische YAML‑Struktur, mit der der Schlüssel hinterlegt wird:

Nach dem Speichern erschienen neue Sensoren in meinem Home Assistant: Batteriespannung, Ladestrom, Ladezustand und vieles mehr. Damit war der Schritt erledigt und der Victron SmartShunt erfolgreich in Home Assistant integriert.

Dashboard mit Batterieanzeige erstellen

Jetzt wollte ich die Daten nicht nur sehen, sondern auch ansprechend präsentieren. Dafür eignet sich die Button‑Card aus HACS. Mit ihr lässt sich eine Batterieanzeige gestalten, die ihre Farbe abhängig vom Ladezustand ändert.

Button‑Card konfigurieren

Ich habe eine neue Button‑Card im Dashboard erstellt und folgende Konfiguration verwendet:

type: custom:button-card
entity: sensor.shunt_battery
icon: mdi:battery
name: Batterie
show_state: true
show_label: true
label: |
  [[[
    return `${states['sensor.shunt_voltage'].state} V | ${states['sensor.shunt_current'].state} A`
  ]]]
state:
  - operator: <=
    value: 20
    color: red
  - operator: <=
    value: 50
    color: orange
  - operator: ">"
    value: 50
    color: green

Diese Card zeigt mir den aktuellen Ladezustand, die Spannung und den Strom an. Die Farbe des Symbols wechselt bei 20 % auf Rot und bei 50 % auf Orange. Für mich war es wichtig, beim Victron SmartShunt installieren auch eine optische Rückmeldung zu haben, wann die Batterie sich dem Entladungsbereich nähert.

Automatisierungen und Benachrichtigungen

Ein weiterer großer Vorteil beim Victron SmartShunt installieren ist die Möglichkeit, Automatisierungen in Home Assistant zu nutzen. Ich wollte eine Benachrichtigung bekommen, sobald der Ladezustand unter 20 % fällt. Dafür habe ich eine einfache Automation erstellt:

alias: Batteriewarnung
description: ""
triggers:
  - trigger: numeric_state
    entity_id:
      - sensor.shunt_battery
    for:
      hours: 0
      minutes: 1
      seconds: 0
    below: 20
conditions: []
actions:
  - action: notify.mobile_app_iphone_tobias
    metadata: {}
    data:
      message: Batterie ist unter 20 % Achtung !
      title: Batteriewarnung
mode: single

Mit dieser Automation bekomme ich nach einer Minute unterhalb des Schwellenwerts eine Push‑Nachricht. Dadurch kann ich reagieren, bevor die Batterie zu tief entladen wird. Beim Victron SmartShunt installieren gehört für mich eine solche Benachrichtigung unbedingt dazu.

Verlaufdiagramme und Datenanalyse

Neben der aktuellen Anzeige möchte ich auch wissen, wie sich der Ladezustand über längere Zeit verändert. Home Assistant bietet eine Verlaufdiagramm‑Karte. Ich habe für meine Batterie ein Diagramm angelegt, das die letzten 168 Stunden (sieben Tage) darstellt. So kann ich sehen, wann ich besonders viel Strom verbraucht habe und wie sich das Laden und Entladen verhält.

Es wäre auch möglich, die Daten in Grafana auszuwerten oder in ein anderes Dashboard zu exportieren. Das bietet sich an, wenn du den Victron SmartShunt und die Daten langfristig beobachten möchtest.

Alternativ lassen sich Daten auch über Grafana und Influxdb in Home Assistant visualisieren. Darauf bin ich in einem anderen Blog Beitrag genauer eingegangen.

Victron SmartShunt installieren - Verlaufsdiagramm

Weitere Anwendungsmöglichkeiten des Victron SmartShunt

Der Einsatz beschränkt sich nicht nur auf Camper. Auch im Auto kann man den Victron SmartShunt installieren, um die Starterbatterie zu überwachen. So weißt du immer, ob sie nach längerer Standzeit noch genügend Kapazität hat. Im Haus lässt sich der Shunt an Solarspeicher anschließen, um die Effizienz der Anlage zu überwachen.

Ein weiterer Vorteil: Über den VE.Direct‑Port kannst du den SmartShunt auch mit dem Cerbo GX oder anderen Victron‑Systemen verbinden. Das habe ich bisher nicht ausprobiert, es steht aber auf meiner To‑Do‑Liste. Wenn du dazu einen Erfahrungsbericht wünschst, lass es mich in den Kommentaren wissen.

Fazit: Lohnt es sich, den Victron SmartShunt zu installieren?

Für mich war es eine der lohnendsten Erweiterungen meines Campers. Seitdem ich den Victron SmartShunt installieren und in Home Assistant integrieren konnte, habe ich jederzeit einen Überblick über den Ladezustand meiner Batterie. Die Kombination aus präzisen Messwerten, ansprechender Visualisierung und praktischen Benachrichtigungen gibt mir die Sicherheit, länger autark zu bleiben und die Batterie vor Tiefentladung zu schützen.

Weitere Blogbeiträge zum Thema „smarter Camper“

Smarter Camper

Ich hoffe, diese ausführliche Anleitung hilft dir weiter. Falls du Fragen hast oder Anmerkungen, hinterlasse gerne einen Kommentar bei Youtube. Viel Spaß beim Basteln!

Wohnwagen ausrichten mit ESP32 – Neigung digital messen

👉 Direkt auf YouTube schauen und abonnieren:
Smart Home & More auf YouTube

Einleitung Wohnwagen ausrichten mit ESP32

Möchtest du die Neigung deines Wohnwagens oder anderer Geräte präzise messen – ganz ohne klassische Wasserwaage? In diesem Beitrag zeige ich dir, wie du mit einem MPU6050-Sensor, einem ESP32 (z. B. M5 Atom Lite) und ESPHome ein smartes Messsystem aufbaust. Egal, ob für Wohnwagen-Nivellierung, Solaranlagen, Kameraausrichtung – dieses Setup ist vielseitig einsetzbar.

Ein klein wenig Löten gehört dazu, aber keine Sorge: Ich erkläre dir Schritt für Schritt, wie du den Sensor anschließt, die Software einrichtest und die Daten in Home Assistant auswertest. Damit kannst du dein Smart Home noch präziser steuern!

MPU 6050

Wohnwagen ausrichten mit ESP32 - MPU 6050


Was du brauchst*

  • MPU6050 (Gyroskop + Beschleunigungssensor)
  • ESP32 / M5 Atom Lite oder Wemos D1 Mini
  • Jumperkabel
  • ggf. 3D-gedrucktes Gehäuse
  • Lötkolben und Lötzinn (für die Stiftleiste)
  • optional: DC-DC-Wandler für Wohnwagen-Stromversorgung

Angebot


M5Stack Atom Lite ESP32 IoT Entwicklungsboards und Kits | Development Kit C008

M5Stack Atom Lite ESP32 IoT Entwicklungsboards und Kits | Development Kit C008

M5Stack SKU: C008; ESP32-basiert, RGB-LED (SK6812); Eingebaute Infrarot; Erweiterbare Pins & Löcher

16,29 EUR

Amazon Prime

Angebot


ELEGOO Jumper Wire 40 x 20cm Kabel Steckbrücken 28AWG Drahtbrücken für Arduino (3er Set)

ELEGOO Jumper Wire 40 x 20cm Kabel Steckbrücken 28AWG Drahtbrücken für Arduino (3er Set)

√Lieferumfang: 1×40 Female – Female; 1×40 Male – Female; 1×40 Male – Male;; √ Wir sind stets bemüht die Funktion unserer Produkte zu verbessern.

5,94 EUR

Amazon Prime


sourcingmap® 100Stk M2,5x6mm Edelstahl Metall Kreuzschlitz Flachkopf Blechschraube Schraube de

sourcingmap® 100Stk M2,5x6mm Edelstahl Metall Kreuzschlitz Flachkopf Blechschraube Schraube de

Herstellungsland: CHINA; Material: Edelstahl Metall; Reingewicht: 23g; Kopfsart: Flachkopf; Produktname: Blechschraube

8,39 EUR

Amazon Prime

Schritt-für-Schritt-Anleitung

1. Sensor verstehen & Ziel definieren

Der MPU6050 misst Beschleunigung und Drehung auf drei Achsen. Damit lassen sich Pitch und Roll berechnen – ideal, um die Neigung eines Wohnwagens zu visualisieren. Der Berechnung liegt folgende Formel zugrunde.

📏 Pitch-Berechnung (Neigung nach vorne/hinten):

⚙️ Roll-Berechnung (Neigung seitlich):

Ziel: Ich will im Wohnwagen die Ausrichtung sehen, ohne externe Wasserwaage – einfach direkt auf dem Smartphone oder im Home Assistant.


2. Gehäuse vorbereiten und löten

Ich nutze ein 3D-gedrucktes Gehäuse, das mir ein Kollege netterweise konstruiert hat.

STL File:

🔧 Lötarbeiten

  • Abgewinkelte Stiftleiste unten anlöten
  • Platine flach auf Tisch legen, Lötkolben sauber ansetzen
  • Keine Sorge: auch als Lötanfänger bekommst du das hin

Wohnwagen ausrichten mit ESP32 - Löten


3. 3D-Druck vorbereiten

Ich verwende PETG als Material, schwarz, mit Stützstruktur – Druckzeit: ca. 14 Minuten.

Nach dem Druck:

  • Sensor einsetzen
  • Deckel mit zwei M2,5 x 6,5 DIN 7981 Schrauben befestigen


4. Elektronik verbinden

🧩 Verdrahtung

MPU6050 Pin ESP32 (M5 Atom Lite)
VCC 3.3 V
GND GND
SDA GPIO26
SCL GPIO32

Für den Betrieb im Wohnwagen empfehle ich einen DC-DC-Wandler, um aus 12 V → 5 V zu erzeugen.


5. ESPHome konfigurieren

📋 YAML-Konfiguration

  1. Neues Gerät in ESPHome erstellen: Camper Video
  2. Plattform auswählen: ESP32 oder M5 Atom
  3. i2c: Schnittstelle konfigurieren (GPIO26 und GPIO32)
  4. Sensor anlegen (MPU6050, Adresse: 0x68)
  5. Template-Sensoren für Pitch und Roll erstellen
  6. Button zur Kalibrierung hinzufügen

💡 Tipp: Kalibriere auf einer ebenen Fläche, z. B. mit einer Wasserwaage

#####--Dieser Teil wird automatisch generiert --######
esphome:
  name: camper-video
  friendly_name: Camper_Video

esp32:
  board: m5stack-atom
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "eKFfU/O1Bk+XdekfHvXhGIsniLzxDfkQNbtqox78GPQ="

ota:
  - platform: esphome
    password: "2c3c0ff4307677331abdaa79a3be80ee"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Camper-Video Fallback Hotspot"
    password: "9bnmbqdXxG3s"

captive_portal:
#####--Ende automatischer Teil, ab hier kopieren! --######

i2c:
  - id: grove
    sda: 26
    scl: 32

globals:
  - id: pitch_offset
    type: float
    initial_value: '0.0'
    restore_value: true
  - id: roll_offset
    type: float
    initial_value: '0.0'
    restore_value: true

sensor:
  - platform: mpu6050
    address: 0x68
    update_interval: 0.1s
    accel_x:
      name: "MPU6050 Accel X"
      id: accel_x
      internal: true
    accel_y:
      name: "MPU6050 Accel Y"
      id: accel_y
      internal: true
    accel_z:
      name: "MPU6050 Accel Z"
      id: accel_z
      internal: true
    temperature:
      name: "MPU6050 Temperature"
      internal: true
    gyro_x:
      name: "MPU6050 Gyro X"
      internal: true
    gyro_y:
      name: "MPU6050 Gyro Y"
      internal: true
    gyro_z:
      name: "MPU6050 Gyro Z"
      internal: true

  - platform: template
    name: "Neigung Pitch"
    id: pitch
    icon: mdi:caravan
    unit_of_measurement: "°"
    accuracy_decimals: 1
    update_interval: 0.1s
    lambda: |-
      if (isnan(id(accel_x).state) || isnan(id(accel_y).state) || isnan(id(accel_z).state)) {
        return NAN;
      }
      float raw = atan2(id(accel_y).state, sqrt(pow(id(accel_x).state, 2) + pow(id(accel_z).state, 2))) * (180.0 / 3.14159265);
      return raw - id(pitch_offset);
    filters:
      - sliding_window_moving_average:
          window_size: 8
          send_every: 1
      - exponential_moving_average:
          alpha: 0.2

  - platform: template
    name: "Neigung Roll"
    id: roll
    icon: mdi:axis-x-rotate-clockwise
    unit_of_measurement: "°"
    accuracy_decimals: 1
    update_interval: 0.1s
    lambda: |-
      if (isnan(id(accel_x).state) || isnan(id(accel_z).state)) {
        return NAN;
      }
      float raw = atan2(-id(accel_x).state, id(accel_z).state) * (180.0 / 3.14159265);
      return raw - id(roll_offset);
    filters:
      - sliding_window_moving_average:
          window_size: 8
          send_every: 1
      - exponential_moving_average:
          alpha: 0.2

button:
  - platform: template
    name: "Kalibriere Neigung"
    id: calib_button
    on_press:
      then:
        - lambda: |-
            id(pitch_offset) = atan2(id(accel_y).state, sqrt(pow(id(accel_x).state, 2) + pow(id(accel_z).state, 2))) * (180.0 / 3.14159265);
            id(roll_offset) = atan2(-id(accel_x).state, id(accel_z).state) * (180.0 / 3.14159265);
            ESP_LOGI("main", "Kalibrierung durchgeführt: pitch_offset=%.2f, roll_offset=%.2f", id(pitch_offset), id(roll_offset));


6. Sensor kalibrieren

Durch einen Button in ESPHome kannst du mit einem Klick den Sensor nullen. Die aktuellen Werte werden als Offset gespeichert und dauerhaft berücksichtigt.

7. Integration in Home Assistant

Hinweis 02.07.2025 : Aktuell wurde die HACS Bar Card aus dem HACS Repository entfernt. Es gibt allerdings einen Fork, den man genauso verwenden kann. https://github.com/spacerokk/bar-card.

Verwende HACS + Bar Card, um die Neigungsdaten stilvoll anzuzeigen:

Pitch

type: custom:bar-card
title: Pitch
min: -40
max: 40
height: 40px
icon: mdi:caravan
animation:
  state: "off"
  speed: 1
severity:
  - from: -180
    to: -10
    color: red
  - from: -10
    to: -1
    color: yellow
  - from: -1
    to: 1
    color: green
  - from: 1
    to: 10
    color: yellow
  - from: 10
    to: 180
    color: red
positions:
  icon: outside
  indicator: "off"
  name: "off"
  value: inside
entities:
  - entity: sensor.fuellstand_frischwasser_neigung_pitch #hier durch eigenen Sensornamen ersetzen



Roll

type: custom:bar-card
title: Roll
min: -40
max: 40
height: 40px
icon: mdi:axis-x-rotate-clockwise
animation:
  state: "off"
  speed: 1
severity:
  - from: -180
    to: -10
    color: red
  - from: -10
    to: -1
    color: yellow
  - from: -1
    to: 1
    color: green
  - from: 1
    to: 10
    color: yellow
  - from: 10
    to: 180
    color: red
positions:
  icon: outside
  indicator: "off"
  name: "off"
  value: inside
entities:
  - entity: sensor.fuellstand_frischwasser_neigung_roll  #hier durch eigenen Sensornamen ersetzen !


8. Einbau im Wohnwagen

In meinem Wohnwagen war bereits ein Atom M5 Lite für die Füllstandsanzeige installiert – ideal zum Nachrüsten. Die Stromversorgung hole ich vom vorhandenen DC-DC-Wandler ab.


Fazit

Mit wenigen Komponenten und etwas Bastelarbeit bekommst du ein richtig cooles Feature für deinen Camper oder Wohnwagen: digitale Neigungsmessung mit Liveanzeige im Smart Home. Ideal, um sich die Nivellierung zu erleichtern – besonders auf unebenen Stellplätzen.


Komplette Playlist: Home Assistant im Camper

🔒 Cyber Security im Smart Home – Wie sicher ist dein Netzwerk wirklich?

In diesem Video dreht sich alles um die Sicherheit im Smart Home! Ich spreche mit meinem Gast, einem YouTube-Kollegen, der sich intensiv mit der Unifi-Welt auseinandersetzt. Gemeinsam gehen wir auf typische Sicherheitsrisiken ein, teilen praktische Tipps und analysieren echte Angriffsbeispiele.

In der heutigen Zeit haben viele von uns unzählige Geräte im Heimnetzwerk. Doch wie gut sind diese eigentlich geschützt? Welche Maßnahmen kann man ergreifen, um das eigene Smart Home sicherer zu machen? Das Video gibt Antworten auf diese Fragen und bietet wertvolle Einblicke in den Bereich der Smart Home-Sicherheit.

💡 Themen im Video:

  • Sicherheitslücken in typischen Smart Home Setups
  • Tipps zur Absicherung deines Netzwerks
  • UniFi Firewalls & Best Practices
  • Erfahrungen aus der Praxis und ein Blick auf meine eigenen Firewall-Settings

Ob du gerade erst mit Smart Home beginnst oder bereits ein Fortgeschrittener bist – hier ist garantiert etwas für dich dabei!

Schau dir das Video an und lass uns in den Kommentaren wissen, wie du dein Netzwerk absicherst oder ob du noch Fragen hast. Ich freue mich auf den Austausch!

Ein besonderer Dank geht an Jan, der sich sofort bereit erklärt hat, mich mit seiner Expertise in diesem Video zu unterstützen. Schaut gerne mal bei ihm vorbei und abonniert seinen Kanal!

👉 Seinen Kanal findet ihr hier: @JanPoertner

Eine komplette Playlist aller seiner UniFi Videos findet ihr auch hier:
https://youtube.com/playlist?list=PLcKKIJBFoNTEtFXlUC9Sg12RA7v_8JHpg&si=XWu0-KVeMMTSSpxG

Anbei noch ein paar Gateways, die ich für den Einsatz als Firewall empfehlen kann*:

Das Cloud Gateway Ultra ist ein günstiger Einstieg, der aus meiner Sicht alle Netzwerkfunktionen, die man im normalen Hausgebrauch benötigt abdeckt. Ich habe diese Variante selber auch als Backup für meine UDM Pro im Einsatz und bin sehr zufrieden mit der Leistung. Ein Backup der UDM Pro lässt sich ohne Probleme in wenigen Minuten auf das Cloud Gateway Ultra aufspielen.

Wenn man etwas mehr Leistung benötigt, gibt es den größeren Bruder des UCG Ultra, das Cloud Gateway Max. Mehr IPS Durchsatz, Protect etc.. ist damit umsetzbar.

Angebot


UbiQuiti UCG-MAX

  • UbiQuiti
  • Gateway

In der folgenden Tabelle habe ich euch noch ein paar Unifi Produkte aufgelistet, die ich gerne einsetze und wo ich sehr zufrieden mit bin.

📢 Home Assistant Notifications – So wird’s einfacher! 📢

In diesem Video zeige ich dir, wie du Benachrichtigungen in Home Assistant deutlich einfacher verwalten kannst! 🚀 Normalerweise muss man in jeder Automatisierung festlegen, wer welche Nachricht bekommt – sei es die Frau, die Kids oder man selbst. Dazu kommen noch kritische Benachrichtigungen, die extra Aufmerksamkeit erfordern. Ich habe eine Lösung entwickelt, mit der du das Ganze zentral steuern kannst. Selbst wenn sich Geräte ändern, musst du nicht stundenlang deine Automatisierungen anpassen. 🔄

Um das Skript einzufügen, begib dich zu Home Assistant Skripte , lege eine neues Skript an und wähle über die drei Punkte in der rechten oberen Ecke die YAML Bearbeitung aus. Dort kannst du das unten aufgeführte Skript dann einfügen. Wichtig ! Die Dienstnamen für die Benachrichtigungen der Alexa-Media Player Devices oder auch Mobile Geräte müssen in der Variable „targets“ angepasst werden.

sequence:
  - variables:
      push_data: |-
        {% if critical %} {
          "push": {
            "sound": {
             "name": "default",
             "critical": 1,
              "volume": 1.0
             }
          }
        } {% else %} {} {% endif %}
    alias: push_data Variable, um den Channel "Critical" beim Iphone zu abonnieren
  - variables:
      targets: |-
        {% set t = [] %} 
        {% if group_admins %}
          {% set t = t + ["notify.mobile_app_iphone_tobias"] %}
        {% endif %} 
        {% if group_family %}
          {% set t = t + ["notify.mobile_app_iphone_tobias", "notify.mobile_app_slerch","notify.alexa_media_bad_oben"] %}
        {% endif %} 
        {% if alexa %}
          {% set t = t + ["notify.alexa_media_keller"] %}
        {% endif %} 
        {{ t | unique | list }}
    alias: targets für alle gewünschten "notify" Dienste
  - variables:
      alexa_devices: "{{ targets | select('search', 'notify.alexa_media') | list }}"
    alias: "alexa_devices : Filter um nur die alexa Devices für den Dienst zu filtern"
  - variables:
      media_players: >
        {% set media_players = alexa_devices | map('replace',
        'notify.alexa_media_', 'media_player.') | list %} {{ media_players }}
    alias: >-
      media_players: Aus dem Dienst werden automatisch alle Media_Player
      Entitätsnamen abgeleitet.
  - variables:
      volume_level: |
        {% if critical %}
          0.8
        {% else %}
          0.2
        {% endif %}
    alias: >-
      volume_level: Wenn critical aktiviert ist, wir eine andere Lautstärke
      gewählt , anonsten default für die Ausgabe
  - repeat:
      for_each: "{{ media_players }}"
      sequence:
        - action: media_player.volume_set
          metadata: {}
          data:
            volume_level: "{{ volume_level }}"
          target:
            entity_id: "{{ repeat.item }}"
    enabled: true
  - repeat:
      sequence:
        - action: "{{ repeat.item }}"
          data:
            title: "{{ title }}"
            message: "{{ message }}"
            data: "{{ push_data }}"
      for_each: "{{ targets }}"
    enabled: true
  - delay:
      hours: 0
      minutes: 0
      seconds: 5
      milliseconds: 0
  - repeat:
      for_each: "{{ media_players }}"
      sequence:
        - action: media_player.volume_set
          metadata: {}
          data:
            volume_level: 0.1
          target:
            entity_id: "{{ repeat.item }}"
    enabled: true
  - action: persistent_notification.create
    metadata: {}
    data:
      message: "{{ targets }}"
alias: Notify All V2
description: ""
fields:
  message:
    selector:
      text:
        multiline: true
    name: message
  title:
    selector:
      text: null
    name: title
  group_admins:
    selector:
      boolean: {}
    name: group_admins
    required: true
  group_family:
    selector:
      boolean: {}
    name: group_family
    required: true
  critical:
    selector:
      boolean: {}
    name: critical
    required: true
  alexa:
    selector:
      boolean: {}
    name: alexa
    required: true

Folgende Videos kann ich dir als Grundlagenvideos zum Thema Notifications noch empfehlen.

EVCC spricht Home Assistant: So einfach geht’s jetzt mit HACS Integration 🚗⚡

Mit EVCC und Home Assistant wird das Management deines Elektroautos einfacher als je zuvor! 🚗⚡ In diesem Video zeige ich dir, wie du EVCC mit HACS und dem passenden Add-On in Home Assistant integrieren kannst. Egal ob Ladeplanung, Energieoptimierung oder smarte Automatisierungen – mit dieser Anleitung holst du das Maximum aus deinem Smart Home heraus. Schau rein und erfahre, wie simpel die Einrichtung wirklich ist!

HACS Integration: GitHub – marq24/ha-evcc: Home Assistant integration for evcc☀️🚘- optimized charging of electric vehicles, connecting your EV charger with your PV system. The integration use local polling (interval configurable) of the evcc API. Please note, that this integration is not official and not supported by the evcc developers. This project is not affiliated with evcc in any way.

Wichtiger Hinweis !: Im Video habe ich an der Stelle 6:03 benannt, dass ihr die IP Eures Home Assistant Servers (mit dem Port 7070) angeben sollt. Dies ist korrekt, wenn Ihr zusätzlich das HomeAssistant EVCC Addon installiert habt. Sollte Euere EVCC Installation nicht innerhalb von Home Assistant laufen, müsst Ihr hier die Adresse, unter der die EVCC Weboberfläche bei Euch im Netzwerk zu erreichen ist, eintragen. Nochmals der Hinweis, bevor ihr diese Integration über HACS hinzufügt, müsst Ihr EVCC bei Euch installiert haben (hier der link zum Video).

Code zum Bonus im Video:

Hinweis ! Die Entitäten müsst ihr mit den Namen eurer Entitäten im YAML Code ersetzen
Template Sensor Helfer „evcc_Tariff_Level“

{% set current_time = now().replace(minute=0, second=0, microsecond=0) %}
{% set rates = state_attr('sensor.evcc_tariff_forecast', 'result')['rates'] %}
{% set future_rates = rates | selectattr('start', '>=', current_time.isoformat()) | list %}
{% if future_rates | length > 0 %}
  {% set prices = future_rates | map(attribute='price') | list %}
  {% set avg_price = prices | average(0) %}
  {% set min_price = prices | min(0) %}
  {% set max_price = prices | max(0) %}
  {% set current_price = states('sensor.evcc_tariff_grid_2') | float(0) %}
    {# Definiere den Schwellenwert in Prozent (z.B. 80%) #}
  {% set threshold_percent = 10 %}
  
  {# Berechne den Preisunterschied basierend auf dem Schwellenwert #}
  {% set price_diff = avg_price * (threshold_percent / 100) %}

  {# Kategorisiere den aktuellen Preis basierend auf der Berechnung #}
  {% if current_price < (avg_price - price_diff) %}
     günstig
  {% elif current_price > (avg_price + price_diff) %}
     teuer
  {% else %}
     mittel
  {% endif %}
  
{% else %}
    unbekannt
{% endif %}

Bonus Automatisierung:

alias: EVCC_Speicherladung
description: ""
triggers:
  - entity_id:
      - sensor.evcc_battery_soc_2
    for:
      minutes: 1
    trigger: state
  - entity_id:
      - sensor.evcc_tariff_level
    for:
      minutes: 1
    trigger: state
  - entity_id:
      - sensor.solcast_pv_forecast_prognose_verbleibende_leistung_heute
    for:
      minutes: 1
    trigger: state
  - trigger: state
    entity_id:
      - sensor.evcc_tariff_grid_2
    for:
      hours: 0
      minutes: 1
      seconds: 0
conditions: []
actions:
  - if:
      - condition: or
        conditions:
          - condition: state
            entity_id: sensor.evcc_tariff_level
            state: mittel
          - condition: state
            entity_id: sensor.evcc_tariff_level
            state: teuer
          - condition: numeric_state
            entity_id: sensor.evcc_battery_soc_2
            above: 99
          - condition: numeric_state
            entity_id: sensor.solcast_pv_forecast_prognose_verbleibende_leistung_heute
            above: 10
    then:
      - action: number.set_value
        data:
          value: "0.0"
        target:
          entity_id: number.evcc_battery_grid_charge_limit
    else:
      - if:
          - condition: and
            conditions:
              - condition: state
                entity_id: sensor.evcc_tariff_level
                state: günstig
                for:
                  minutes: 1
              - condition: numeric_state
                entity_id: >-
                  sensor.solcast_pv_forecast_prognose_verbleibende_leistung_heute
                below: 10
              - condition: numeric_state
                entity_id: sensor.evcc_battery_soc_2
                below: 100
        then:
          - action: number.set_value
            data:
              value: "{{ states('sensor.evcc_tariff_grid_2') | float(0) }}"
            target:
              entity_id: number.evcc_battery_grid_charge_limit
          - action: input_boolean.turn_on
            metadata: {}
            data: {}
            target:
              entity_id: input_boolean.test_speicherladung
        else:
          - action: number.set_value
            data:
              value: "0.0"
            target:
              entity_id: number.evcc_battery_grid_charge_limit
mode: single

Blogbeitrag und Youtube Video zum Thema dynamischen Strompreis aus EVCC auslesen.

Home Assistant: EVCC-Daten zu dynamischen Strompreisen auslesen, visualisieren und damit rechnen – smarthome & more

Home Assistant: Automatische Lichteffekte ohne Aufwand – Zeit sparen mit diesem Script ! 💡

Beschreibung

Hast du auch Beleuchtungen, die Effekte integriert haben ? Klar, nicht immer will man dieses Lichtspektakel, es gibt aber auch Jahreszeiten, wo man sich darüber freut, dass man mal den einen oder anderen vielleicht „kitschigen“ Effekt laufen lässt. Und dann geht es los. Wie setze ich das um ?

Der erste Gedanke ist, dass man für jeden Effekt eine eigene Szene erstellt.

Aber sind wir mal ehrlich, da hat man innerhalb kürzester Zeit keine Lust mehr. Und genau hier möchte ich euch eine Lösung zeigen, die euch automatisch die Effekte ausliest und entweder einen zufälligen Effekt auswählt, oder aber die Effekte der Reihe nach durchgeht.

Wenn man in die Effektlisten der einzelnen Beleuchtungen schaut, dann können da schnell mal etliche Effekte zusammenkommen.

Um euch das Leben hier einfacher zu machen, habe ich euch ein Skript erstellt, in dem ihr eurer Licht übergebt, ein paar Übergabeparameter setzt und schon könnt ihr eure gewünschten Effekte laufen lassen.

Dieses Skript lässt sich einfach handhaben und in einer Automatisierung umsetzen. Als Beispiel möchte ich euch meine Weihnachtsbaum Automatisierung vorstellen.

Die zu übergebenden Parameter sind:

  • Licht ( beliebige Lichtentität mit Effekten)
  • random ( An / Aus )
  • brigthness ( 0% – 100%)
  • exclude ( Liste von Effekten, die bei der automatischen Selektion ausgeschlossen werden sollen )
  • transition ( Übergangszeit für einen weichen Übergang zum nächsten Effekt ) -> Hinweis: Das wird nicht von jeder Beleuchtung unterstützt. Ist diese Möglichkeit nicht vorhanden, so wird automatisch ohne Transition Time geschaltet.

In der obigen Beispielautomatisierung wird alle 30 Sekunden ein anderer Effekt selektiert. Der Zyklus ist vielleicht etwas kurz, aber hier könnt ihr frei entscheiden.

Gerne stelle ich euch das Script kostenfrei zur Verfügung und würde mich über Kommentare zum Video bei Youtube , aber auch ein Like und vielleicht ein Abo sehr freuen. Auch Anregungen zur sinnvollen Erweiterung finde ich immer sehr Klasse. Ich hoffe euch hilft diese Umsetzung und ihr könnt gerade in der aktuell adventlichen Zeit schnell ein paar schöne Effekte damit leuchten lassen. Wenn ihr dann noch eure Zeit dabei für die Umsetzung spart, dann habe ich mein Ziel schon erreicht.

Ich wünsche euch eine ruhige und besinnliche Adventszeit ( auch, wenn vielleicht mal ein Lichtspektakel dabei ist 🙂 ).

Das Skript ✨ Light Effect Toggle als YAML Code:

alias: ✨ Light Effect Toggle
sequence:
  - action: light.turn_on
    metadata: {}
    data: {}
    target:
      entity_id: " {{ light }} "
    alias: first turn on light
  - variables:
      current_effect: "{{ state_attr(light, 'effect') }}"
      all_effects: >
        {% set exclude_list = (exclude | default('')).split(',') | map('trim') |
        list %} {{ state_attr(light, 'effect_list') | reject('in', exclude_list)
        | list }}
      effect_to_apply: |
        {% if random %}
          {{ all_effects | random }}
        {% else %}
          {% set idx = all_effects.index(current_effect) + 1 %}
          {% if idx >= all_effects | length %}
            {{ all_effects[0] }}
          {% else %}
            {{ all_effects[idx] }}
          {% endif %}
        {% endif %}
    alias: get effect list ( light is on )
  - action: light.turn_on
    metadata: {}
    data:
      effect: "{{ effect_to_apply }}"
      brightness_pct: "{{ brightness }}"
      transition: "{{ transition | default(0) }}"
    target:
      entity_id: "{{light}}"
    alias: apply effect
  - action: logbook.log
    data:
      name: Actual Effect
      message: "actual effect: {{ state_attr(light, 'effect') | default('None') }}"
  - action: logbook.log
    data:
      name: effect to apply
      message: "effect to apply: {{ state_attr(light, 'effect') | default('None') }}"
fields:
  light:
    name: Licht
    description: Die zu steuernde Licht-Entität
    selector:
      entity:
        domain: light
  random:
    selector:
      boolean: {}
    name: random
  brightness:
    selector:
      number:
        min: 1
        max: 100
        step: 1
    name: brightness
    required: true
    default: 50
  exclude:
    selector:
      text: null
    name: exclude
    description: enter the effects you want to exclude here, separated by commas
  transition:
    selector:
      number:
        min: 1
        max: 10
        step: 0.1
    name: transition
    description: time in seconds
    default: 0
description: Toggles the effect of the specified light
mode: parallel
max: 10

🎥 Home Assistant meets Community – Gemeinsam smarter leben!

In der Welt von Home Assistant entstehen ständig neue, kreative Lösungen, um den Alltag smarter und einfacher zu gestalten. In meinem neuesten Video stellen Mitglieder der Home Assistant Community ihre beeindruckenden Automatisierungsprojekte vor. Hier sind einige Highlights, die du nicht verpassen solltest:

🔹 Christian hat ein cleveres Setup für seine Waschmaschine und seinen Trockner entwickelt. Dank Home Assistant bekommt er immer rechtzeitig eine Benachrichtigung, wenn die Wäsche fertig ist – nie wieder zu spät die Maschine ausräumen oder den perfekten Zeitpunkt für den Wechsel verpassen!

🔹 Patrick präsentiert sein selbstgebautes, smartes Schlüsselbrett. Es kombiniert Technik und Kreativität auf eine beeindruckende Weise, die nicht nur praktisch ist, sondern auch stylisch in den Alltag integriert werden kann.

Diese Projekte zeigen, wie vielseitig Home Assistant eingesetzt werden kann – von nützlichen Haushaltshelfern bis hin zu kreativen Ideen, die dein Zuhause einzigartig machen.

Hast du auch spannende Automatisierungen umgesetzt? Teile sie in den Kommentaren oder lass dich von der Community inspirieren! 🚀

Die von Christian erwähnte Pixelclock bekommt ihr hier: Ulanzi TV001 smarte Pixel Uhr *

In diesem Video findet ihr noch weitere Informationen zur Pixelclock mit awtrix 3:

Als zuverlässigen Tür/Fenstersensor auf Zigbee Basis kann ich euch den Sensor von Aqara * empfehlen.

Ulanzi✨ Home Assistant – Awtrix 3/Ulanzi TC001 ❤️ – So funktioniert die perfekte Interaktion 🎛️🚀Ulanzi

👉 Direkt auf YouTube schauen und abonnieren:
Smart Home & More auf YouTube

Beschreibung

Diese Uhr ist nicht nur ein stilvolles Accessoire, sondern auch ein wahres Multitalent im Smart Home. Dank ihrer nahtlosen Integration in Home Assistant kannst du die Ulanzi TC001 ganz nach deinen Wünschen anpassen und automatisieren. Stell dir vor, wie sie dir nicht nur die Uhrzeit anzeigt, sondern auch aktuelle Wetterdaten in lebendigen Animationen präsentiert oder dich rechtzeitig an deine nächsten Termine erinnert. Lass deiner Kreativität freien Lauf und gestalte deine Uhr mit individuellen Designs, die deine Persönlichkeit widerspiegeln. Die Ulanzi TC001 Smart Pixel Uhr ist der Schlüssel, um dein Zuhause intelligenter und stilvoller zu machen. Entdecke die unendlichen Möglichkeiten der modernen Technologie und verwandle dein Zuhause in einen Ort, der sowohl funktional als auch ästhetisch ansprechend ist – mit der Ulanzi TC001 wird jeder Tag zu einem besonderen Erlebnis!

In meinem Video habe ich die Installation von awtrix 3 auf dem Pixel Display nicht vorgestellt. Bei mir geht es um die Kommunikation mit awtrix 3 und Home Assistant. Und zwar ohne dem teilweise bekannten Memory Leak.

Matthias vom Kanal haus:automation hat den Installationsvorgang und das Produkt sehr gut erklärt, so dass ich gerne darauf verweise:
https://youtu.be/hsc_yUWwcVY?si=EMikkCt64jbqckt7

Bis zur Nacht vor der Veröffentlichung lag mir auch noch kein Affiliate Link vor. Aber nach nun einigen Wochen Wartezeit habe auch ich tatsächlich einen Link erhalten, wo ihr das Produkt erwerben könnt. Lag wohl doch nicht an der Kanalgröße 🙂

Bezugsquelle*

Ulanzi TC001 smarte Pixel Uhr

Einleitung

Für die Kommunikation mit dem Pixeldisplay habe ich im Video mehrere Skripte vorgestellt.

Bei der Entwicklung, dem Code und auch beim Bugfixing habe ich mit @Herr Spiegelmann ( Moderator auf meinem Discord Server ) eng zusammengearbeitet. Auch an dieser Stelle meinen herzlichen Dank für die sehr angenehme und konstruktive Zusammenarbeit.

  • awtrix – new app
  • awtrix – delete app
  • awtrix – indicator
  • awtrix – power off
  • awtrix – power on
  • awtrix – reboot

Icons für das Display lassen sich auf der Seite LaMetric Icon Gallery herunterladen. Im Video wurden folgende Icon Numbers verwendet:

  • 3813 – für Tibber
  • 37323 – für PV Leistung
  • 2422 – für Aussentemperatur
  • 389 – für SOC des Hausspeichers
  • 974 – für Youtube Views und Likes
  • 56166 – für Gelbe Tonne
  • 12155 – für Graue Tonne
  • 56626 – für Grüne Tonne

Wichtige Hinweise:

24.01.2025

Ab der Version 0.97 funktionieren die LaMetrics Icon´s wieder.

Zur Müllanzeige gibt es im Video vom 24.01.2025 ( Veröffentlichungszeitpunkt 17:00 Uhr ) ein Update zum Thema. Ihr findet das Video unter: https://youtu.be/3jxeRZBt4u4

16.02.2025

Aktuell lässt sich in der awtrix Weboberfläche von LaMetrics kein Icon auf das Display laden. Aber es gibt eine alternative Lösung. Blueforcer , der Entwickler von awtrix 3 hat eine App für Android und IPhone entwickelt, wo ihr auch eine Icon Gallerie zur Verfügung gestellt bekommt und die Icons direkt auf das Display laden könnt. Die App kostet für iOs weniger als 4€ ( Stand: 16.12.2024), was ich für den Funktionsumfang für absolut gerechtfertigt halte. Es gilt zu beachten, wenn man die Icons von awtrix verwendet, dann müssen die Icon ID´s angepasst werden.

awtrix – new app

Skripte

awtrix – new app

alias: awtrix - new app
sequence:
  - action: mqtt.publish
    metadata: {}
    data:
      evaluate_payload: false
      qos: 0
      retain: false
      topic: awtrix/custom/{{topicname}}
      payload: |-
        {
          "text": "{{text}}",
          "rainbow": {{rainbow|tojson}},
          "duration": "{{duration}}",
          "icon": "{{icon}}",
          "scrollSpeed": 80,
          "textCase": "{{textcase}}",
          "lifetime": "{{lifetime}}"
        }
  - if:
      - condition: template
        value_template: "{{ showimmediately == true or showimmediately == True}}"
    then:
      - action: mqtt.publish
        metadata: {}
        data:
          evaluate_payload: false
          qos: 0
          retain: false
          topic: awtrix/switch
          payload: "{\"name\": \"{{topicname}}\"}"
description: ""
icon: mdi:led-strip
fields:
  topicname:
    selector:
      text: null
    name: topicname
    required: true
    description: Name of the topic - one topic per app
  text:
    selector:
      text: null
    name: text
    required: true
    description: Text to be displayed
  icon:
    selector:
      number:
        min: 0
        max: 100000
    name: icon
    required: true
    description: Icon ID, needs to be present on the awtrix filesystem - default no icon
    default: 1
  rainbow:
    selector:
      boolean: {}
    name: rainbow
    default: false
    required: true
    description: Rainbow text yes/no
  lifetime:
    selector:
      number:
        min: 0
        max: 86400
        step: 1
    name: lifetime
    default: 0
    description: Discard app after X seconds - default 0 (never expire)
  duration:
    selector:
      number:
        min: 1
        max: 180
        step: 1
    name: duration
    default: 3
    description: How many seconds should the message be displayed - default 3
  textcase:
    selector:
      number:
        min: 0
        max: 2
        step: 1
    name: textCase
    default: 0
    description: >-
      Changes the Uppercase setting. 0=global setting, 1=forces uppercase;
      2=shows as it sent - default 0
  showimmediately:
    selector:
      boolean: {}
    name: showImmediately
    required: false
    description: Jumps the queue and displays the message immediately - default false
mode: parallel
max: 10

awtrix – delete app

alias: awtrix - delete app
sequence:
  - action: mqtt.publish
    metadata: {}
    data:
      evaluate_payload: false
      qos: 0
      retain: false
      topic: awtrix/custom/{{topicname}}
      payload: "{}"
description: ""
icon: mdi:led-strip
fields:
  topicname:
    selector:
      text: null
    name: topicname
    required: true
    description: Name of the app to be deleted
mode: parallel
max: 10

awtrix – indicator

Hinweis zur Verwendung: Wenn man den Indikator wieder deaktivieren ( nicht anzeigen ) lassen will, so muss lediglich die Farbe „schwarz“ selektiert werden.

alias: awtrix - indicator
sequence:
  - action: mqtt.publish
    metadata: {}
    data:
      evaluate_payload: false
      qos: 0
      retain: false
      topic: awtrix/indicator{{indicator}}
      payload: "{\"color\":{{colour}}, \"fade\":{{fade}}}"
description: ""
icon: mdi:led-strip
fields:
  indicator:
    selector:
      number:
        min: 1
        max: 3
        step: 1
    name: indicator
    required: true
    description: Index of the indicator
    default: 1
  colour:
    selector:
      color_rgb: {}
    default:
      - 255
      - 0
      - 0
    name: colour
    description: Colour of the indicator
    required: true
  fade:
    selector:
      number:
        min: 500
        max: 3000
        step: 100
    name: fade
    required: true
    default: 0
    description: >-
      Fade the indicator on and off with a fade interval in milliseconds - 0 is
      don't fade
mode: parallel
max: 10

awtrix – power off

alias: awtrix - power off
sequence:
  - action: mqtt.publish
    metadata: {}
    data:
      topic: awtrix/power
      payload: "{\"power\" : false}"
      evaluate_payload: false
      qos: 0
      retain: false
description: power off device
icon: mdi:led-strip
fields: {}
mode: parallel
max: 10

awtrix – power on

alias: awtrix - power on
sequence:
  - action: mqtt.publish
    metadata: {}
    data:
      topic: awtrix/power
      payload: "{\"power\" : true}"
      evaluate_payload: false
      qos: 0
      retain: false
description: power on device
icon: mdi:led-strip
fields: {}
mode: parallel
max: 10

awtrix – reboot

alias: awtrix - reboot
sequence:
  - action: mqtt.publish
    metadata: {}
    data:
      topic: awtrix/reboot
      payload: "{}"
      evaluate_payload: false
      qos: 0
      retain: false
description: reboot device
icon: mdi:led-strip
fields: {}
mode: parallel
max: 10

Müllanzeige

Einleitung

Für die Müllanzeige werden ein Input Button Helfer und ein Template Helfer benötigt.

Der Input Button Helfer übernimmt bei Betätigung einen aktuellen Zeitstempel, welcher im Template „Müllinformation“ verwendet wird.

Das Template Müllinformation liest aus einem Kalender Zeitpunkte für die jeweiligen Müllabholungstermine aus und differenziert in diesem Beispiel nach

  • Gelber Sack
  • Grüne Tonne
  • Graue Tonne

Template Helfer Sensor „Müllinformation“

{% set last_pressed = as_datetime(states('input_button.mulltonne_rausgestellt')).date() %}
{% set start_time = state_attr('calendar.abfall', 'start_time') %}
{% if start_time %}
  {% set event_datetime = as_datetime(start_time) %}
  {% set event_date = event_datetime.date() %}
  {# Wenn der Button innerhalb des gültigen Zeitraums (heute oder gestern) gedrückt wurde und das Ereignis noch nicht vorbei ist #}
  {% if (last_pressed == event_date or last_pressed == event_date - timedelta(days=1))  %}
    Tonne wurde rausgestellt.
  {% else %}
    {# Am Tag vor dem Ereignis #}
    {% if (event_date - now().date()).days == 1 %}
      {{ state_attr('calendar.abfall', 'message') }} rausstellen!

    {# Am Tag des Ereignisses #}
    {% elif event_date == now().date() %}
      {{ state_attr('calendar.abfall', 'message') }} rausstellen!

    {# Ansonsten kein Termin #}
    {% else %}
      Kein Müll
    {% endif %}
  {% endif %}
{% else %}
  Kein Termin
{% endif %}

1 Tag vor dem Abholungstermin bis zum Tag der Abholung, wird der Termin mit der jeweiligen herauszustellenden Tonne über das Template angezeigt. Ich verwende dafür die HACS Mushroom Cards .

Tonne rausstellen (Mushroom Template-Badge)

Yaml Code:

type: custom:mushroom-template-badge
content: "{{ states('sensor.mullinformation') }}"
icon: mdi:trash-can
color: |-
  {% if states('sensor.mullinformation') == 'Gelber Sack rausstellen!' %}
  yellow
  {% elif states('sensor.mullinformation') == 'Grüne Tonne rausstellen!' %}
  green
  {% elif states('sensor.mullinformation') == 'Graue Tonne rausstellen!' %}
  grey
  {% else %}
  white
  {% endif %}

Wurde die Tonne herausgestellt, kann über den Input Button quittiert werden, dass die Mülltonne herausgestellt wurde.

Wird der Vorgang quittiert, wird die Anzeige aktualisiert und auch auf dem Display die Nachricht entfernt.

Müll quittieren ( Mushroom Template-Badge)

type: custom:mushroom-template-badge
content: Müll quittieren
icon: mdi:trash-can
color: >-
  {% set last_pressed =
  as_datetime(states('input_button.mulltonne_rausgestellt')).date() %}

  {% set start_time = state_attr('calendar.abfall', 'start_time') %}

  {% if start_time %}
    {% set event_datetime = as_datetime(start_time) %}
    {% set event_date = event_datetime.date() %}
    {# Wenn der Button innerhalb des gültigen Zeitraums (heute oder gestern) gedrückt wurde und das Ereignis noch nicht vorbei ist #}
    {% if (last_pressed == event_date or last_pressed == event_date - timedelta(days=1))  %}
      green
    {% else %}
      blue
    {% endif %}
  {% endif %}
label: |2-


    
entity: input_button.mulltonne_rausgestellt
tap_action:
  action: toggle
visibility:
  - condition: and
    conditions:
      - condition: state
        entity: sensor.mullinformation
        state_not: Kein Müll
      - condition: state
        entity: sensor.mullinformation
        state_not: Tonne wurde rausgestellt.
      - condition: and
        conditions: []

Die Automatisierung sieht dann wie folgt aus. Hier bitte die eigenen Entitäten verwenden und nicht benötigte Anzeigen entfernen.

alias: awtrix Zustandstrigger
description: ""
triggers:
  - trigger: state
    entity_id:
      - sensor.evcc_tariff_grid
      - sensor.evcc_pv_power
      - sensor.aussentemperatur_ds18b20_temperature
      - sensor.evcc_battery_soc
      - sensor.smart_home_more_views
      - sensor.mullinformation
    for:
      hours: 0
      minutes: 0
      seconds: 10
  - trigger: state
    entity_id:
      - sensor.smart_home_more
    attribute: stars
    for:
      hours: 0
      minutes: 0
      seconds: 10
conditions: []
actions:
  - action: script.awtrix_new_app
    metadata: {}
    data:
      icon: 3813
      rainbow: false
      lifetime: 0
      duration: 5
      textcase: 0
      topicname: Tibber
      text: "{{ states('sensor.evcc_tariff_grid') | round(3) }}"
    alias: "Skript new App : Tibber"
  - action: script.awtrix_new_app
    metadata: {}
    data:
      icon: 37323
      rainbow: false
      lifetime: 0
      duration: 5
      textcase: 0
      topicname: PV
      text: "{{ states('sensor.evcc_pv_power') }}"
    alias: "Skript new App : Solar Power"
  - action: script.awtrix_new_app
    metadata: {}
    data:
      icon: 2422
      rainbow: false
      lifetime: 0
      duration: 5
      textcase: 0
      topicname: Temperatur
      text: "{{ states('sensor.aussentemperatur_ds18b20_temperature') }} °"
    alias: "Skript new App : Aussentemperatur"
  - action: script.awtrix_new_app
    metadata: {}
    data:
      icon: 389
      rainbow: false
      lifetime: 0
      duration: 5
      textcase: 0
      topicname: SOC
      text: "{{ states('sensor.evcc_battery_soc') }} %"
    alias: "Skript new App : SOC Hausspeicher"
  - action: script.awtrix_new_app
    metadata: {}
    data:
      icon: 974
      rainbow: false
      lifetime: 0
      duration: 5
      textcase: 2
      topicname: Youtube
      text: >-
        {{ states('sensor.smart_home_more_views') }} -
        {{state_attr('sensor.smart_home_more', 'stars')}}
    alias: "Skript new App : YT Views und Likes"
  - alias: Indikator für genügend PV oder günstiger Preis
    if:
      - condition: or
        conditions:
          - condition: numeric_state
            entity_id: sensor.evcc_pv_power
            above: 1500
          - condition: numeric_state
            entity_id: sensor.evcc_tariff_grid
            below: 0.28
    then:
      - action: script.awtrix_indicator
        metadata: {}
        data:
          indicator: 1
          colour:
            - 30
            - 255
            - 0
          fade: 0
    else:
      - action: script.awtrix_indicator
        metadata: {}
        data:
          indicator: 1
          colour:
            - 255
            - 0
            - 0
          fade: 0
  - alias: Abfall Anzeige
    choose:
      - conditions:
          - condition: state
            entity_id: sensor.mullinformation
            state: Gelber Sack rausstellen!
        sequence:
          - action: script.awtrix_new_app
            metadata: {}
            data:
              icon: 56166
              rainbow: false
              lifetime: 0
              duration: 10
              textcase: 2
              topicname: Abfall
              text: "{{ states('sensor.mullinformation')}}"
      - conditions:
          - condition: state
            entity_id: sensor.mullinformation
            state: Graue Tonne rausstellen!
        sequence:
          - action: script.awtrix_new_app
            metadata: {}
            data:
              icon: 12155
              rainbow: false
              lifetime: 0
              duration: 10
              textcase: 2
              topicname: Abfall
              text: "{{ states('sensor.mullinformation')}}"
      - conditions:
          - condition: state
            entity_id: sensor.mullinformation
            state: Grüne Tonne rausstellen!
        sequence:
          - action: script.awtrix_new_app
            metadata: {}
            data:
              icon: 56625
              rainbow: false
              lifetime: 0
              duration: 10
              textcase: 2
              topicname: Abfall
              text: "{{ states('sensor.mullinformation')}}"
    default:
      - action: script.awtrix_delete_app
        metadata: {}
        data:
          topicname: Abfall
  - alias: Abfall Anzeige
    choose:
      - conditions:
          - condition: or
            conditions:
              - condition: state
                entity_id: sensor.mullinformation
                state: Gelber Sack rausstellen!
              - condition: state
                entity_id: sensor.mullinformation
                state: Graue Tonne rausstellen!
              - condition: state
                entity_id: sensor.mullinformation
                state: Grüne Tonne rausstellen!
            alias: Wenn eine der Tonnen rausgestellt werden muss
        sequence:
          - action: script.awtrix_new_app
            metadata: {}
            data:
              icon: 56166
              rainbow: false
              lifetime: 0
              duration: 10
              textcase: 2
              topicname: Abfall
              text: "{{ states('sensor.mullinformation')}}"
    default:
      - action: script.awtrix_delete_app
        metadata: {}
        data:
          topicname: Abfall
    enabled: false
  - alias: Reboot, wenn RAM knapp wird
    if:
      - condition: or
        conditions:
          - condition: numeric_state
            entity_id: sensor.awtrix_b3dc90_free_ram
            below: 50000
          - condition: numeric_state
            entity_id: sensor.awtrix_bebc10_free_ram
            below: 50000
    then:
      - action: script.awtrix_reboot
        metadata: {}
        data: {}
mode: single

Für Müll quittieren, verwende ich ein Mushroom Template Badge.

Updates

27.11.2024 – dynamische Wetter-Icons

Das Thema beschäftigt mich weiterhin, so dass ich euch noch weitere Ergänzungen und Updates zum awtrix 3 zur Verfügung stellen möchte.

Angeregt durch einige Kommentare bzgl. einer in Abhängigkeit vom aktuellen Wetter anzuzeigendes Icon , möchte ich euch eine Erweiterung der Automatisierung, bzw. des Skripts vorstellen, so dass ihr ohne eine zusätzliche Automatisierung oder Skript den Zustand des Wetters als Icon ( z.B. Sonnig, Regnerisch, Bewölkt etc.. ) nutzen könnt. Grundvoraussetzung dafür ist eine Wetterintegration wie z.B. der Deutsche Wetterdienst (GitHub – FL550/dwd_weather: Deutscher Wetterdienst integration for Home-Assistant)

Partly Cloudly

Rainy

Snowy

Bei dieser Lösung wird der aktuelle Zustand der Wetter Entität ausgelesen und in der Automatisierung verwendet.

Wir benötigen dazu ein Template, welches den aktuellen Zustand des Wetters ausgibt. Die Ausgaben des Wetter Templates sind in jeder Integration identisch und können auf der Home Assistant Dokumentationsseite nachgelesen werden.

In meinem Beispiel heißt die Entität “ weather.lahr „.

{{ states('weather.lahr') }}

Rückgabe ist in diesem Beispiel bewölkt, also cloudy.

Es gibt nach der Home Assistant Dokumentation 15 unterschiedliche Wetter Zustände. Für jeden der Zustände habe ich uns ein Icon von der Seite LaMetric Icon Gallery herausgesucht und auf der awtrix 3 Weboberfläche heruntergeladen.

ICON-ID Wetter Zustand
2283 cloudy
13505 clear-night
8551 fog
52386 hail
21174 lighting (thunderstorm)
51457 lightning-rainy
2286 partlycloudy
56677 pouring
56548 rainy
58081 snowy
49301 snowy-rainy
11201 sunny
15618 windy
62874 windy-variant
56705 exceptional

Ladet diese Icons über die awtrix 3 Weboberfläche herunter und speichert die Einstellungen.

Nachdem die Icons alle heruntergeladen sind, geht zum Tab Files und lasst euch dort alle Dateien im Verzeichnis ICONS anzeigen.

Dort gebt ihr den Dateien mit der jeweiligen ID den Namen aus der obigen Tabelle.

Die Beispiel ID 2283.gif, wird somit aus der Datei cloudy.gif umbenannt. Dieser Vorgang wird für alle in der Tabelle enthaltenen IDs wiederholt.

Ist der Vorgang abgeschlossen, sollten folgende Bilddaten im Verzeichnis ICONS vorhanden sein.

Im Skript awtrix – new app muss eine Änderung vorgenommen werden.

Unter dem Feld icon, muss Zahl in Text geändert und gespeichert werden.

Ändern in Text:

Nach dem Speichern ist das Skript nun in der Lage ein Icon über einen Namen ( wie z.B. cloudy oder sunny ) zu laden.

überarbeitetes vollständiges Skript awtrix – new app mit dynamischen Wettericons

alias: awtrix - new app
sequence:
  - action: mqtt.publish
    metadata: {}
    data:
      evaluate_payload: false
      qos: 0
      retain: false
      topic: awtrix/custom/{{topicname}}
      payload: |-
        {
          "text": "{{text}}",
          "rainbow": {{rainbow|tojson}},
          "duration": "{{duration}}",
          "icon": "{{icon}}",
          "scrollSpeed": 80,
          "textCase": "{{textcase}}",
          "lifetime": "{{lifetime}}"
        }
  - if:
      - condition: template
        value_template: "{{ showimmediately == true or showimmediately == True}}"
    then:
      - action: mqtt.publish
        metadata: {}
        data:
          evaluate_payload: false
          qos: 0
          retain: false
          topic: awtrix/switch
          payload: "{\"name\": \"{{topicname}}\"}"
description: ""
icon: mdi:led-strip
fields:
  topicname:
    selector:
      text: null
    name: topicname
    required: true
    description: Name of the topic - one topic per app
  text:
    selector:
      text: null
    name: text
    required: true
    description: Text to be displayed
  icon:
    selector:
      text: {}
    name: icon
    required: true
    description: Icon ID, needs to be present on the awtrix filesystem - default no icon
  rainbow:
    selector:
      boolean: {}
    name: rainbow
    default: false
    required: true
    description: Rainbow text yes/no
  lifetime:
    selector:
      number:
        min: 0
        max: 86400
        step: 1
    name: lifetime
    default: 0
    description: Discard app after X seconds - default 0 (never expire)
  duration:
    selector:
      number:
        min: 1
        max: 180
        step: 1
    name: duration
    default: 3
    description: How many seconds should the message be displayed - default 3
  textcase:
    selector:
      number:
        min: 0
        max: 2
        step: 1
    name: textCase
    default: 0
    description: >-
      Changes the Uppercase setting. 0=global setting, 1=forces uppercase;
      2=shows as it sent - default 0
  showimmediately:
    selector:
      boolean: {}
    name: showImmediately
    required: false
    description: Jumps the queue and displays the message immediately - default false
mode: parallel
max: 10

In der Automatisierung kann nun das Skript für die dynamischen Wettericons wie folgt aufgerufen werden, ich verwende es zusammen mit einem Außentemperatursensor und übergebe als Icon den aktuellen Zustand der Wetter Entität.

action: script.awtrix_new_app
metadata: {}
data:
  icon: "{{ states('weather.lahr') }}"
  rainbow: false
  lifetime: 0
  duration: 5
  textcase: 0
  topicname: Temperatur
  text: "{{ states('sensor.aussentemperatur_ds18b20_temperature') }} °"
alias: "Skript new App : Aussentemperatur"

vollständige Automatisierung mit Wettericons

alias: awtrix Zustandstrigger
description: ""
triggers:
  - trigger: state
    entity_id:
      - sensor.evcc_tariff_grid
      - sensor.evcc_pv_power
      - sensor.aussentemperatur_ds18b20_temperature
      - sensor.evcc_battery_soc
      - sensor.smart_home_more_views
      - sensor.mullinformation
      - weather.lahr
    for:
      hours: 0
      minutes: 0
      seconds: 10
  - trigger: state
    entity_id:
      - sensor.smart_home_more
    attribute: stars
    for:
      hours: 0
      minutes: 0
      seconds: 10
conditions: []
actions:
  - action: script.awtrix_new_app
    metadata: {}
    data:
      icon: 3813
      rainbow: false
      lifetime: 0
      duration: 5
      textcase: 0
      topicname: Tibber
      text: "{{ states('sensor.evcc_tariff_grid') | round(3) }}"
    alias: "Skript new App : Tibber"
  - if:
      - condition: numeric_state
        entity_id: sensor.evcc_pv_power
        above: 0
    then:
      - action: script.awtrix_new_app
        metadata: {}
        data:
          icon: 37323
          rainbow: false
          lifetime: 0
          duration: 5
          textcase: 0
          topicname: PV
          text: "{{ states('sensor.evcc_pv_power') }}"
        alias: "Skript new App : Solar Power"
    else:
      - action: script.awtrix_delete_app
        metadata: {}
        data:
          topicname: PV
    alias: "PV Ertrag vorhanden "
  - action: script.awtrix_new_app
    metadata: {}
    data:
      icon: "{{ states('weather.lahr') }}"
      rainbow: false
      lifetime: 0
      duration: 5
      textcase: 0
      topicname: Temperatur
      text: "{{ states('sensor.aussentemperatur_ds18b20_temperature') }} °"
    alias: "Skript new App : Aussentemperatur"
  - action: script.awtrix_new_app
    metadata: {}
    data:
      icon: 389
      rainbow: false
      lifetime: 0
      duration: 5
      textcase: 0
      topicname: SOC
      text: "{{ states('sensor.evcc_battery_soc') }} %"
    alias: "Skript new App : SOC Hausspeicher"
  - action: script.awtrix_new_app
    metadata: {}
    data:
      icon: 974
      rainbow: false
      lifetime: 0
      duration: 5
      textcase: 2
      topicname: Youtube
      text: >-
        {{ states('sensor.smart_home_more_views') }} -
        {{state_attr('sensor.smart_home_more', 'stars')}}
    alias: "Skript new App : YT Views und Likes"
  - alias: Indikator für genügend PV oder günstiger Preis
    if:
      - condition: or
        conditions:
          - condition: numeric_state
            entity_id: sensor.evcc_pv_power
            above: 1500
          - condition: numeric_state
            entity_id: sensor.evcc_tariff_grid
            below: 0.28
    then:
      - action: script.awtrix_indicator
        metadata: {}
        data:
          indicator: 1
          colour:
            - 30
            - 255
            - 0
          fade: 0
    else:
      - action: script.awtrix_indicator
        metadata: {}
        data:
          indicator: 1
          colour:
            - 255
            - 0
            - 0
          fade: 0
  - alias: Abfall Anzeige
    choose:
      - conditions:
          - condition: state
            entity_id: sensor.mullinformation
            state: Gelber Sack rausstellen!
        sequence:
          - action: script.awtrix_new_app
            metadata: {}
            data:
              icon: 56166
              rainbow: false
              lifetime: 0
              duration: 10
              textcase: 2
              topicname: Abfall
              text: "{{ states('sensor.mullinformation')}}"
      - conditions:
          - condition: state
            entity_id: sensor.mullinformation
            state: Graue Tonne rausstellen!
        sequence:
          - action: script.awtrix_new_app
            metadata: {}
            data:
              icon: 12155
              rainbow: false
              lifetime: 0
              duration: 10
              textcase: 2
              topicname: Abfall
              text: "{{ states('sensor.mullinformation')}}"
      - conditions:
          - condition: state
            entity_id: sensor.mullinformation
            state: Grüne Tonne rausstellen!
        sequence:
          - action: script.awtrix_new_app
            metadata: {}
            data:
              icon: 56625
              rainbow: false
              lifetime: 0
              duration: 10
              textcase: 2
              topicname: Abfall
              text: "{{ states('sensor.mullinformation')}}"
    default:
      - action: script.awtrix_delete_app
        metadata: {}
        data:
          topicname: Abfall
  - alias: Reboot, wenn RAM knapp wird
    if:
      - condition: or
        conditions:
          - condition: numeric_state
            entity_id: sensor.awtrix_b3dc90_free_ram
            below: 50000
          - condition: numeric_state
            entity_id: sensor.awtrix_bebc10_free_ram
            below: 50000
    then:
      - action: script.awtrix_reboot
        metadata: {}
        data: {}
mode: single

03.12.2024 Änderbare Textfarbe

Ich habe das Script noch erweitert, so dass auch eine RGB Farbe übergeben werden kann. Defaultwert ist „weiß“ , es muss auch keine Farbe angegeben werden.

Der neue Parameter nennt sich textcolor. Im Beispiel ist die Schriftfarbe auf „rot“ gesetzt worden.

alias: awtrix - new app
sequence:
  - action: mqtt.publish
    metadata: {}
    data:
      evaluate_payload: false
      qos: 0
      retain: false
      topic: awtrix/custom/{{topicname}}
      payload: |-
        {
          "text": "{{text}}",
          "rainbow": {{rainbow|tojson}},
          "duration": "{{duration}}",
          "icon": "{{icon}}",
          "scrollSpeed": 80,
          "textCase": "{{textcase}}",
          "lifetime": "{{lifetime}}",
          "color": {{textcolor or [255, 255, 255] | tojson}}
        }
  - if:
      - condition: template
        value_template: "{{ showimmediately == true or showimmediately == TRUE }}"
    then:
      - action: mqtt.publish
        metadata: {}
        data:
          evaluate_payload: false
          qos: 0
          retain: false
          topic: awtrix/switch
          payload: "{\"name\": \"{{topicname}}\"}"
description: ""
icon: mdi:led-strip
fields:
  topicname:
    selector:
      text: null
    name: topicname
    required: true
    description: Name of the topic - one topic per app
  text:
    selector:
      text: null
    name: text
    required: true
    description: Text to be displayed
  icon:
    selector:
      text: {}
    name: icon
    required: true
    description: Icon ID, needs to be present on the awtrix filesystem - default no icon
  rainbow:
    selector:
      boolean: {}
    name: rainbow
    default: false
    required: true
    description: Rainbow text yes/no
  lifetime:
    selector:
      number:
        min: 0
        max: 86400
        step: 1
    name: lifetime
    default: 0
    description: Discard app after X seconds - default 0 (never expire)
  duration:
    selector:
      number:
        min: 1
        max: 180
        step: 1
    name: duration
    default: 3
    description: How many seconds should the message be displayed - default 3
  textcase:
    selector:
      number:
        min: 0
        max: 2
        step: 1
    name: textCase
    default: 0
    description: >-
      Changes the Uppercase setting. 0=global setting, 1=forces uppercase;
      2=shows as it sent - default 0
  showimmediately:
    selector:
      boolean: {}
    name: showImmediately
    required: false
    description: Jumps the queue and displays the message immediately - default false
  textcolor:
    selector:
      color_rgb: {}
    name: textcolor
    default:
      - 255
      - 255
      - 255
    required: false
    description: set text color
mode: parallel
max: 10

05.12.2024 – Fortschrittsanzeige

Desto mehr man mit dem Display arbeitet, desto mehr Dinge fallen einem ein, was man damit alles realisieren kann. Ich habe das Script ergänzt um eine Fortschrittsanzeige, so dass ihr z.B. den Fortschritt eures Waschvorgangs oder eurer Geschirrspülmaschine anzeigen lassen könnt. Dann hat man im Blick, wann man die Wäsche aufhängen darf, oder das Geschirr ausräumen:-)

In diesem Beispiel habe ich einen Geschirrspüler dargestellt, der gerade ca. 80% seines Vorgangs beendet hat.

Ein neues Feld wurde dazu im Script ergänzt. Im Feld „progress“ übergebt ihr eure Entität , die einen Fortschritt in Prozent enthält ( 0-100% ).

Als Icon habe ich dafür die Nr. 55848 verwendet.

Das Feld muss nicht zwingend übergeben werden, so dass eure Automatisierungen davon nicht betroffen sind. Wird kein Wert übergeben, wird der Default Wert auf -1 gesetzt und kein Fortschritt wird angezeigt.

Das aktualisierte Script awtrix – new app

alias: awtrix - new app
sequence:
  - action: mqtt.publish
    metadata: {}
    data:
      evaluate_payload: false
      qos: 0
      retain: false
      topic: awtrix/custom/{{topicname}}
      payload: |-
        {
          "text": "{{text}}",
          "rainbow": {{rainbow|tojson}},
          "duration": "{{duration}}",
          "icon": "{{icon}}",
          "scrollSpeed": 80,
          "textCase": "{{textcase}}",
          "lifetime": "{{lifetime}}",
          "color": {{textcolor or [255, 255, 255] | tojson}},
          "progress": {{ progress or -1 }}
        }
  - if:
      - condition: template
        value_template: "{{ showimmediately == true or showimmediately == True}}"
    then:
      - action: mqtt.publish
        metadata: {}
        data:
          evaluate_payload: false
          qos: 0
          retain: false
          topic: awtrix/switch
          payload: "{\"name\": \"{{topicname}}\"}"
description: ""
icon: mdi:led-strip
fields:
  topicname:
    selector:
      text: null
    name: topicname
    required: true
    description: Name of the topic - one topic per app
  text:
    selector:
      text: null
    name: text
    required: true
    description: Text to be displayed
  icon:
    selector:
      text: {}
    name: icon
    required: true
    description: Icon ID, needs to be present on the awtrix filesystem - default no icon
  rainbow:
    selector:
      boolean: {}
    name: rainbow
    default: false
    required: true
    description: Rainbow text yes/no
  lifetime:
    selector:
      number:
        min: 0
        max: 86400
        step: 1
    name: lifetime
    default: 0
    description: Discard app after X seconds - default 0 (never expire)
  duration:
    selector:
      number:
        min: 1
        max: 180
        step: 1
    name: duration
    default: 3
    description: How many seconds should the message be displayed - default 3
  textcase:
    selector:
      number:
        min: 0
        max: 2
        step: 1
    name: textCase
    default: 0
    description: >-
      Changes the Uppercase setting. 0=global setting, 1=forces uppercase;
      2=shows as it sent - default 0
  showimmediately:
    selector:
      boolean: {}
    name: showImmediately
    required: false
    description: Jumps the queue and displays the message immediately - default false
  textcolor:
    selector:
      color_rgb: {}
    name: textcolor
    default:
      - 255
      - 255
      - 255
    required: false
    description: set text color
  progress:
    selector:
      number:
        min: 0
        max: 99
        step: 1
    name: progress
    description: "shows a progress bar (value range from 0-100) "
    default: 0
mode: parallel
max: 10

Die Automatisierung dazu habe ich so gestaltet, dass mir die Meldung und der Fortschritt nur dann angezeigt werden, wenn der Fortschritt > 0 % ist. Ansonsten wird die Meldung wieder entfernt. Getriggert wird auf Änderung des Fortschritts.

Der Teilabschnitt für die Wenn/Dann Bedingung unter den Aktionen sieht wie folgt aus:

alias: Geschirrspüler läuft
if:
  - condition: numeric_state
    entity_id: sensor.geschirrspuler_program_progress
    above: 0
then:
  - action: script.awtrix_new_app
    metadata: {}
    data:
      icon: 55848
      rainbow: false
      lifetime: 0
      duration: 5
      textcase: 0
      topicname: Dishwasher
      text: Geschirrspüler läuft!
      progress: "{{ states('sensor.geschirrspuler_program_progress') | int }}"
    alias: "Skript new App : Fortschritt Geschirrspüler"
    enabled: true
else:
  - action: script.awtrix_delete_app
    metadata: {}
    data:
      topicname: Dishwasher

📘 Home Assistant Helfer Kompendium 2/? 📲 [ Statistik]

Optimierung von Home Assistant Automatisierungen mit dem Statistik-Helfer

In meinem heutigen Artikel möchte ich dir zeigen, wie du den Statistik-Helfer in Home Assistant effektiv nutzen kannst, um tiefere Einblicke in deine Smart Home-Daten zu erhalten. Durch die richtigen Berechnungen kannst du deine Automatisierungen noch präziser und smarter gestalten. Hier sind die wichtigsten Charakteristika, die du mit dem Statistik-Helfer auswerten kannst:

1. Absoluter Abstand

Der absolute Abstand zeigt dir den Unterschied zwischen zwei Messwerten, ohne die Richtung zu berücksichtigen. Diese Berechnung ist besonders nützlich, wenn du Schwankungen in einem Wert überwachen möchtest, ohne die genaue Richtung zu verfolgen. Ich nutze diese Methode oft, um schnelle Veränderungen zu erkennen.

2. Abstand von 95% und 99% der Werte

Mit dieser Berechnung kann ich herausfinden, wie sich ein Wert im Vergleich zu den meisten anderen Werten verhält. Der Abstand von 95% und 99% der Werte hilft mir dabei, Ausreißer zu identifizieren und meine Automatisierungen so anzupassen, dass sie nur unter den typischen Bedingungen reagieren.

3. Ältester Zeitpunkt

Der älteste Zeitpunkt zeigt mir, wann der älteste Messwert aufgezeichnet wurde. Das ist besonders nützlich, wenn ich nach älteren Daten suche oder herausfinden möchte, wie lange es her ist, dass ein Wert zuletzt aktualisiert wurde. Diese Information kann wichtige Auswirkungen auf Automatisierungen haben, die sich auf historische Daten stützen.

4. Änderung

Die Änderung zeigt mir, wie stark sich ein Wert verändert hat, sei es positiv oder negativ. Ich verwende diese Berechnung, um zu verstehen, wie schnell oder langsam sich Werte entwickeln, was für zeitkritische Automatisierungen sehr hilfreich ist.

5. Anzahl der Werte

Die Anzahl der Werte gibt mir eine einfache Übersicht darüber, wie viele Messwerte über einen bestimmten Zeitraum hinweg erfasst wurden. Diese Zahl hilft mir dabei, Trends zu erkennen und zu überprüfen, ob die Sensoren korrekt arbeiten.

6. Arithmetisches Mittel

Das arithmetische Mittel (der Durchschnitt) ist eine der grundlegendsten Berechnungen und gibt mir eine Vorstellung vom allgemeinen Trend eines Messwerts. Ich nutze das Mittel, um Automatisierungen zu erstellen, die auf den durchschnittlichen Bedingungen basieren.

7. Durchschnittliche Änderung pro Probe oder Sekunde

Diese Berechnung zeigt mir, wie schnell sich ein Wert im Zeitverlauf verändert. Ich finde diese Kennzahl besonders nützlich bei der Überwachung von Sensoren, die schnelle Reaktionen erfordern, wie zum Beispiel Bewegungsmelder oder Temperaturfühler.

8. Gesamt

Die Gesamtberechnung summiert alle Werte innerhalb eines bestimmten Zeitrahmens. Ich verwende diese Methode oft, um den Gesamtverbrauch von Energie oder die Gesamtzahl von Ereignissen zu ermitteln. Diese Zahl ist besonders nützlich, wenn ich die gesamte Leistung oder Aktivität über einen längeren Zeitraum beobachten möchte.

9. Linearisierter Durchschnitt

Der linearisierte Durchschnitt hilft mir, Daten zu glätten und langfristige Trends zu erkennen. Diese Methode ist besonders hilfreich, wenn ich mit periodischen Schwankungen zu tun habe und die Daten auf eine lineare Skala übertragen möchte, um langfristige Muster besser sichtbar zu machen.


Durch die Nutzung dieser Berechnungen und der Einblicke, die der Statistik-Helfer bietet, kann ich meine Automatisierungen in Home Assistant noch gezielter und effizienter gestalten. Egal, ob du den Abstand zwischen Messwerten überwachen, die Änderungsgeschwindigkeit analysieren oder die Gesamttrends erkennen möchtest – dieser Helfer ist eine wertvolle Unterstützung für jede Home Assistant-Instanz.

In dieser Playlist findest du alle bisherigen und kommenden Videos zum Thema Home Assistant Helfer:

YouTube player