Grundsätzliches

Bei Custom Apps ist es, je nach Anwendungsfall, sinnvoll das MQTT-Flag retain: true zu setzen. Nur so ist gewährleistet, dass eine Custom App den Neustart der Pixelclock übersteht und persistent angezeigt wird. Custom Apps leben ansonsten nur im RAM des ESP32 und werden bei einem Neustart gelöscht. Das Retain-Flag bewirkt, dass der MQTT-Broker bei einer Neuverbindung der Pixelclock erneut, die zuletzt gesendete Message an diese übermittelt.

Wann macht es Sinn das Retain-Flag zu nutzen:
Wenn Sensor Daten sich nicht häufig aktualisieren und somit der Trigger in Homeassistant nicht häufig auslöst. Startet man in diesem Fall die Pixelclock neu, kann es unter Umständen sehr lange dauern, bis ein neuer Wert gesendet wird. Die Custom App wäre bis zu diesem Zeitpunkt nicht aktiv.

Wann macht es keinen Sinn das Retain-Flag zu setzen:
Wenn Custom Apps automatisch bei einem Trigger X entfernt werden, siehe Beispiel der Spotify App. Es macht keinen Sinn die letzten Wiedergabeinformationen eines Songs am Broker vorzuhalten, da diese Info flüchtig ist und sich häufig ändert und der Song ggf. gar nicht mehr abgespielt wird, wenn die Pixelclock neugestartet wird.

Custom Apps

Folgend eine List an Custom App, die im Zusammenspiel mit Homeassistant an die Pixelclock gesendet werden können. Alle Daten werden direkt aus Homeassistant generiert und benötigen keinerlei externe Add-Ons, wie bspw. Node Red.

Zu jeder Custom App ist ein Logo von der LaMetric Developer Webseite verlinkt. Der nachfolgende Dateiname entspricht der Benennung im Filesystem der Pixelclock.

Spotify

Dargestellt wird der aktuell abgespielte Künstler und Songname, sowie ein Fortschrittsanzeige (Progressbar) für den aktuell abgespielten Song. Die Progressbar wird aus zwei Attributen des Media-Players errechnet. Der Name des Media-Players muss entsprechend an den Namen der eigenen Entity in Homeassistant angepasst werden.

Die App wird automatisch entfernt, wenn der State des Media-Player auf idle oder paused wechselt und keine Wiedergabe mehr erfolgt.

Animated GIF of currently played song on Spotify shown on Pixelclock
LaMetric Icon 18207 / spotify.jpg
Integration Spotify
Sensor media_player.spotify

Automation:

- alias: notify_pixelclock_spotify
  trigger:
    - platform: state
      entity_id: media_player.spotify
  action:
    - choose:
        - conditions:
            - condition: state
              entity_id: media_player.spotify
              state: 'playing'
          sequence:
            - service: mqtt.publish
              data:
                qos: 2
                retain: false
                payload: >-
                  {
                    "text": "{{ state_attr('media_player.spotify', 'media_artist') }} - {{ state_attr('media_player.spotify', 'media_title') }}",
                    "icon": "spotify",
                    "rainbow": false,
                    "duration": 10,
                    "pushIcon": 0,
                    "textCase": 2,
                    "progress": {{ ( states.media_player.spotify.attributes.media_position / states.media_player.spotify.attributes.media_duration * 100 ) | round() }},
                    "progressC": "18B04C"
                  }
                topic: pixelclock/custom/spotify
        - conditions:
            - condition: template
              value_template: "{{ not states.media_player.spotify.state == 'playing' }}"
          sequence:
            - service: mqtt.publish
              data:
                qos: 2
                retain: false
                topic: pixelclock/custom/spotify

pr0gramm

Zeigt den Benis eines beliebigen Accounts auf einem großen deutschen Imageboard, über das niemand spricht. Der Username, beispielhaft horst, muss entsprechend im API-Call angepasst werden.

Pixelclock showing Benis status of pr0gramm
LaMetric Icon 26807 / pr0.jpg
Integration RESTful Sensor
Sensor sensor.pr0

Sensor:

- platform: rest
  scan_interval: 3600
  name: "Pr0 Benis"
  unit_of_measurement: ''
  value_template: '{{ value_json["user"]["score"] | int }}'
  resource: 'https://pr0gramm.com/api/profile/info?name=horst'

Automation:

- alias: notify_pixelclock_pr0
  trigger:
    - platform: state
      entity_id: sensor.pr0
  action:
    - service: mqtt.publish
      data:
        qos: 2
        retain: true
        payload: >-
          {
            "text": "{{ states.sensor.pr0.state }}",
            "icon": "pr0"
          }
        topic: pixelclock/custom/pr0

Wetter

Für diese Custom App sind diverse Icons erforderlich. Das exakte Vorgehen wurde bereits im vorhergehenden Post Ulanzi Smart Pixel Clock TC001 im Detail erläutert. Die Temperatur wird ganzzahlig gerundet dargestellt.

Pixelclock showing current weather
LaMetric Icon Zu viele
Integration Weather
Sensor weather.openweathermap

Automation:

- alias: notify_pixelclock_weather
  trigger:
    - platform: state
      entity_id: weather.openweathermap
    - platform: template
      value_template: "{{ states.weather.openweathermap.attributes.temperature }}"
  action:
    - service: mqtt.publish
      data:
        qos: 2
        retain: true
        payload: >-
          {
            "text": "{{ states.weather.openweathermap.attributes.temperature | round(0) }} {{ states.weather.openweathermap.attributes.temperature_unit }}",
            "icon": "{{ states('weather.openweathermap') }}",
            "rainbow": false
          }
        topic: pixelclock/custom/weather

Bitcoin

Der aktuelle Kursstand des Bitcoins. Der Name des Sensors muss entsprechend angepasst werden.

Pixelclock showing Bitcoin price
LaMetric Icon 10814 / bitcoin.jpg
Integration Bitcoin
Sensor sensor.exchange_rate_1_btc

Automation:

- alias: notify_pixelclock_bitcoin
  trigger:
    - platform: state
      entity_id: sensor.exchange_rate_1_btc
  action:
    - service: mqtt.publish
      data:
        qos: 2
        retain: true
        payload: >-
          {
            "text": "{{ states.sensor.exchange_rate_1_btc.state | round(0) }}",
            "icon": "bitcoin"
          }
        topic: pixelclock/custom/bitcoin

Hochwasserportal

Als echte Nordblume ist der Pegelstand der Ostsee natürlich essentiell. Diese Custom App nutzt eine Custom Integration namens Hochwasserportal, die über HACS installiert werden kann. Drei variable Icons kommen für die Pegelstände zum Einsatz. Bei Hochwasser wird der Text in rot ausgegeben, bei Niedrigwasser in gelb.

Pixelclock showing water level
LaMetric Icon 24114 / water-level-low.gif
LaMetric Icon 24117 / water-level-normal.gif
LaMetric Icon 24120 / water-level-high.gif
Custom Integration Hochwasserportal
Sensor sensor.kiel_holtenau_ostsee_level
- alias: notify_pixelclock_hochwasser
  trigger:
    - platform: state
      entity_id: sensor.kiel_holtenau_ostsee_level
  action:
    - service: mqtt.publish
      data:
      qos: 0
      retain: false
      topic: pixelclock/custom/hochwasser
      payload: >-
        {
          "text": "{{ states.sensor.kiel_holtenau_ostsee_level.state }} cm",
          "textCase": 2,
          "icon": {% if (states.sensor.kiel_holtenau_ostsee_level.state | int <= 379) %} "water-level-low"
                  {% elif (states.sensor.kiel_holtenau_ostsee_level.state | int >= 624) %} "water-level-high"
                  {% else %}"water-level-normal"
                  {% endif %},
          "color":  {% if (states.sensor.kiel_holtenau_ostsee_level.state | int <= 379) %} "#FFFF00"
                    {% elif (states.sensor.kiel_holtenau_ostsee_level.state | int >= 624) %} "#FF0000"
                    {% else %} "#FFFFFF"
                    {% endif %}
        }

Instagram Follower

Angepasst werden muss der Name des Accounts in dem Parameter ressource. Verwendet wird eine Custom Component, die das Scrapen von Webseiten ermöglicht und weitaus mehr Funktionsumfang bietet als die native Scrape Integration von Homeassistant. Die Custom Component kann aus dem HACS Store installiert werden.

Pixelclock showing Instagram follower count
LaMetric Icon 3741 / instagram.jpg
Custom Integration ha-multiscrape
Sensor sensor.instagram_followers_davidhasselhoff

Sensor:

multiscrape:
  - name: intagram_followers
    resource: https://www.picnob.com/profile/davidhasselhoff/
    scan_interval: 1800
    sensor:
      - unique_id: instagram_followers_davidhasselhoff
        name: "D.Hasselhoff Instagram Followers"
        select: ".item_followers > div:nth-child(2)"

Automation:

- alias: notify_pixelclock_instagram
  trigger:
    - platform: state
      entity_id: sensor.instagram_followers_davidhasselhoff
  action:
    - service: mqtt.publish
      data:
        qos: 2
        retain: true
        payload: >-
          {
            "text": "{{ states.sensor.instagram_followers_davidhasselhoff.state | int() }}",
            "icon": "instagram"
          }
        topic: pixelclock/custom/thehoff

Octoprint

Die Custom App zeigt den aktuellen Druckfortschritt in Prozent an. Wenn Octoprint während des Druckvorgangs in einen Fehler läuft, wird eine Nachricht dauerhaft auf der Pixelclock angezeigt, die aktiv durch einen Klick auf den mittleren Button entfernt werden muss. Ist der Druckvorgang beendet, wir die Custom App automatisch entfernt.

Pixelclock showing Octoprint progress
LaMetric Icon 51841 / 3dprinter.jpg
Integration Octoprint
Sensor sensor.octoprint_current_state
Sensor sensor.octoprint_job_percentage
Sensor binary_sensor.octoprint_printing_error

Automation:

- alias: notify_pixelclock_octoprint
  initial_state: True
  trigger:
    - platform: template
      value_template: "{{ not state('sensor.octoprint_current_state') == 'Printing' }}"
      id: "idle"
    - platform: state
      entity_id: sensor.octoprint_job_percentage
      id: "printing"
    - platform: state
      entity_id: binary_sensor.octoprint_printing_error
      state: 'on'
      id: "error"
  action:
    - choose:
      - conditions:
          - condition: trigger
            id: "printing"
          - condition: state
            entity_id: sensor.octoprint_current_state
            state: "Printing"
        sequence:
          - service: mqtt.publish
            data:
              qos: 2
              retain: false
              payload: >-
                {
                  "text": "{{ (states('sensor.octoprint_job_percentage') | round(1) ) }}{{ state_attr('sensor.octoprint_job_percentage', 'unit_of_measurement') }}",
                  "icon": "3dprinter",
                  "duration": 10
                }
              topic: pixelclock/custom/octoprint
      - conditions:
          - condition: trigger
            id: "idle"
        sequence:
          - service: mqtt.publish
            data:
              qos: 2
              retain: false
              topic: pixelclock/custom/octoprint
      - conditions:
          - condition: trigger
            id: "error"
        sequence:
          - service: mqtt.publish
            data:
              qos: 2
              retain: false
              topic: pixelclock/custom/octoprint
          - service: mqtt.publish
            data:
              qos: 2
              retain: false
              payload: >-
                {
                  "text": "Error",
                  "icon": "3dprinter",
                  "textCase": 2,
                  "hold": true
                }
              topic: pixelclock/custom/octoprint

NINA Warnungen

Das Bundesamt für Bevölkerungsschutz und Katastrophenhilfe stellt über die NINA Integration ortsbezogene Warnmeldungen für die Bevölkerung bereit. Diese Custom App prüft, ob eine Warnung vorliegt und nutzt das Indicator Feature von AWTRIX Light. Liegt eine Warnung vor, leuchtet der Indicator so lange über allen anderen Custom Apps rot, bis die Warnung aufgehoben wird. Bei Aufhebung der Warnung wird die Custom App automatisch entfernt.

Pixelclock showing Octoprint progress
LaMetric Icon 9335 / warning.gif
Integration NINA
Sensor binary_sensor.warning_kiel_landeshauptstadt_1

Automation:

- alias: notify_pixelclock_warning
  trigger:
    - platform: state
      entity_id: binary_sensor.warning_kiel_landeshauptstadt_1
  action:
    - choose:
        - conditions:
            - condition: state
              entity_id: binary_sensor.warning_kiel_landeshauptstadt_1
              state: "on"
          sequence:
            - service: mqtt.publish
              data:
                qos: 2
                retain: false
                payload: >-
                  {
                    "text": "{{ state_attr("binary_sensor.warning_kiel_landeshauptstadt_1", "headline") }}",
                    "icon": "warning",
                    "pushIcon": 2
                  }
                topic: pixelclock/custom/nina
            - service: mqtt.publish
              data:
                qos: 2
                retain: false
                payload: >-
                  {
                    "color": [255,0,0]
                  }
                topic: pixelclock/indicator1
        - conditions:
            - condition: state
              entity_id: binary_sensor.warning_kiel_landeshauptstadt_1
              state: "off"
          sequence:
            - service: mqtt.publish
              data:
                qos: 2
                retain: false
                topic: pixelclock/custom/nina
            - service: mqtt.publish
              data:
                qos: 2
                retain: false
                topic: pixelclock/indicator1

Homeassistant Timer

Homeassistant hat eine Timer Integration, die auf dem Eventbus feuert, wenn ein Timer abgelaufen ist. Wie bereits im Post ControllerX und Homeassistant beschrieben, nutze ich diese für meine Waschmaschine. Verwendet wird ein Tradfri Shortcut Button. Wenn der Button einfach gedrückt wird startet ein Timer für eine 40° Wäsche, wird er gedrückt gehalten startet ein Timer für die 60° Wäsche.

Ist einer der beiden Timer abgelaufen lauscht eine Automation auf dem Eventbus

Timer Configuration:

Die Werte müssen entsprechend der Waschdauer des eigenen Geräts angepasst werden.

laundry_40:
  duration: '01:58:00'
laundry_60:
  duration: '02:09:00'

Automation:

- alias: notify_pixelclock_laundy_finished
  trigger:
    - platform: event
      event_type: timer.finished
      event_data:
        entity_id: timer.laundry_40
    - platform: event
      event_type: timer.finished
      event_data:
        entity_id: timer.laundry_60
  action:
    - service: mqtt.publish
      data:
        qos: 2
        retain: false
        payload: >-
          {
            "text": "Fertig",
            "icon": "laundry",
            "hold": true
          }
        topic: pixelclock/notify
LaMetric Icon 26671 / laundry.gif
Integration Timer

Ressources

hivemq.com MQTT Retained Messages