text_display

Das Plugin dient dazu Nachrichten auf Displays (z.B. KNX-Taster) anzuzeigen.

  • Es gibt Nachrichten**senken**, das sind die jeweiligen Anzeigegeräte, die die Nachrichten anzeigen sollen.

  • Nachrichten werden in den Nachrichten**ringen** verwaltet. Auf jedem Ring gibt es eine feste Anzahl an Slots, für die geprüft wird, ob die Nachricht relevant ist. Die Anzahl wird natürlich aus der Menge der möglichen Nachrichtenquellen automatisch definiert.

  • Ein Nachrichtenring hat Slots in denen die Nachrichten**quellen** verankert sind. Jeder Slot hat zwei Zuordnungen, einen Boolean-Wert, der bestimmt ob die Nachricht gerade relevant ist, und einen Textwert.

  • Nachrichten eines Rings haben die gleiche Priorität. Auf einer Senke lassen sich mehrere Ringe registrieren, die in absteigender Priorität abgearbeitet werden.

  • Für eine Senke kann ein oder mehrere Ringe definiert werden, die die Standardringe erzwungenermaßen verdecken, z.B. für die Anzeige von Anrufen oder Alarmen.

  • Eine Senke kann einen default-Wert haben, auf den zurückgesetzt wird, wenn keine Nachricht gültig ist.

Anforderungen

Das Plugin funktioniert ab Python 3.6, ansonsten existieren keine Anforderungen

Notwendige Software

Keine Abhängigkeiten

Unterstützte Geräte

Im Prinzip funktioniert das Plugin Hardwareunabhängig. Die Anzeige des einen Texts kann zum Beispiel auch in der Visu erfolgen. Zu beachten wäre, dass KNX-Taster nur 13 Zeichen anzeigen können. Es werden nur die ersten 13 Zeichen verschickt, wenn man den knx_dpt: „16.001“ verwendet, der Rest wird „verschluckt“.

Konfiguration

Die Konfiguration erfolgt (abgesehen von der Instantiierung) ausschließlich über Items. Es gibt keine durch Logik auslösbaren Funktionen oder Verknüpfungen mit Logiken.

plugin.yaml

Das Plugin muss nur einmal instantiiert werden. Es ist nicht nötig/möglich mehrere Instanzen zu verwalten.

1text_display:
2    plugin_name: text_display

items.yaml

Bitte die Dokumentation lesen, die aus den Metadaten der plugin.yaml erzeugt wurde. Bzw. das Beispiel unten verstehen…

Beispiele

Die Folgenden Anforderungen werden im nachfolgenden Beispiel umgesetzt:

  • Alle KNX-Taster im Haus sollen die gleichen Texte anzeigen (a.k.a die Meldungen gehen über EINE KNX-GA, es gibt also nur eine Senke).

  • Wenn ein Fenster auf ist, soll die Raum-Innentemperatur des Raumes mit seinem Namen angezeigt werden. (Nachrichtenring „fenster“)

  • Wenn ein Fenster auf ist, soll die Außentemperatur angezeigt werden, aber nur einmal, egal wieviele Fenster auf sind. (Nachrichtenring „fenster“)

  • Wenn eine neue Nachricht auf dem Fritzbox Anrufbeantworter vorliegt, soll die Nachricht „AB prüfen“ angezeigt werden. (Nachrichtenring „wichtiger_als_fenster“)

  • Wenn jemand anruft, soll „T: <Name>“ bzw. „T: <Nummer>“ auf den Displays angezeigt werden, die Anruflogik liegt dabei im AVM-Plugin. (Nachrichtenring „anruf“)

Relevant sind letztlich nur die text_display… Attribute. Letzten Endes werden mit den ganzen Konstruktionen außen herum nur einfache Booleanwerte erzeugt, die aussagen, ob die Nachricht angezeigt werden sollte oder nicht. Damit die Nachrichten noch etwas mehr Informationsgehalt haben, sind einige Nachrichtentexte mit Informationen von anderen Items angereichert worden.

Nachrichtensenke

In diesem Beispiel werden die Nachrichten auf die KNX-GA a/b/c geschickt. Liegt keine Nachricht vor, wird ein Leerzeichen als Text geschickt, damit z.B. auf den MDT Glastastern keine alten Nachrichten stehen bleiben. Lässt man die Default-Konfiguration einfach weg, wird kein Wert gesendet. Auf den MDT-RTR ist das der einfachste Weg, die Nachricht verschwinden zu lassen.

meldung:
     knx_dpt: "16.001"
     knx_send: a/b/c
     knx_reply: a/b/c
     enforce_updates: "yes"
     text_display_default_message: ' '
     text_display_sink_for_rings:
         - "wichtiger_als_fenster"
         - "fenster"
     text_display_sink_rings_with_prio:
         - "anruf"

„Fenster auf“ Nachrichtenquelle

Dies ist die Struktur für einen Raum, das muss dann für jeden Raum wiederholt werden.

schlafzimmer:
    temperatur_im_schlafzimmer:
        type: num
        knx_cache: x/y/z

        anzeige_string:
            type: str
            eval: >
                f"SchlaZi: {sh...():.1f}°C"
            eval_trigger: ..

            display_is_relevant:
                type: bool
                eval: or
                eval_trigger:
                    - .,..irgendein_fenster_im_schlafzimmer_offen
                text_display_target_ring: 'fenster'
                text_display_content_source_item: ..

    irgendein_fenster_im_schlafzimmer_offen:
        type: bool
        eval: or
        eval_trigger:
            - .fenster_zur_strasse
            - .fenster_zum_garten

        fenster_zur_strasse:
            type: bool
            knx_dpt: 1
            knx_cache: x/y/z
        fenster_zur_strasse:
            type: bool
            knx_dpt: 1
            knx_cache: x/y/z

Außentemperatur abhängig von Fensterstatus:

wetter:
    luft_temperatur:
        type: num
        remark: wo auch immer der Wert herkommt (OpenWeatherMap ;-) / Wetterstation)

        message_string:
            type: str
            eval: >
                f"Außen: {sh...():.1f}°C"
            eval_trigger: ..
            display_is_relevant:
                type: bool
                eval: or
                eval_trigger:
                    - schlafzimmer.fenster
                    - kinderzimmer.fenster
                    - buero.fenster
                    - og_bad.fenster
                    - eg_bad.fenster
                    - wohnzimmer.fenster
                text_display_target_ring: 'fenster'
                text_display_content_source_item: ..

AB Prüfen Nachrichtenquelle:

Die Anzahl der neuen Nachrichten auf dem Anrufbeantworter muss über 0 sein, damit immer der gleiche „AB prüfen“ Text angezeigt wird.

fritzbox:
    tam:
        index: 1
        type: bool
        avm_data_type@fritzbox: tam
        new_message_present:
            type: bool
            visu_acl: ro
            eval: sh.fritzbox.tam.message_number_new() > 0
            eval_trigger:
                - fritzbox.tam.message_number_new
            text_display_target_ring: 'wichtiger_als_fenster'
            text_display_content_source_item: .ab_pruefen_text

            ab_pruefen_text:
                type: str
                remark: Klar kann man hier auch die Nachricht dynamisch bauen, z.B. "'AB: {} Nachr.'.format(sh.fritzbox.tam.message_number_new())"
                initial_value: "AB prüfen"

        message_number_new:
            type: num
            visu_acl: ro
            avm_data_type@fritzbox: tam_new_message_number

Anrufer-Meldungen

fritzbox:
    monitor:
        message:
            type: bool
            eval: sh.fritzbox.monitor.incoming.event() == 'ring' and sh.fritzbox.monitor.incoming.is_call_incoming() == True
            eval_trigger:
                - ..incoming.is_call_incoming
                - ..incoming.event
            text_display_target_ring: 'anruf'
            text_display_content_source_item: .message_text
            message_text:
                type: str
                eval: "'T:{}'.format(sh.fritzbox.monitor.incoming.last_caller())"
                eval_trigger: fritzbox.monitor.incoming.last_caller
        incoming:
            is_call_incoming:
                type: bool
                avm_data_type@fritzbox: is_call_incoming
            last_caller:
                type: str
                avm_data_type@fritzbox: last_caller_incoming
            event:
                type: str
                avm_data_type@fritzbox: call_event_incoming

Web Interface

Das Plugin liefert ein WebInterface in dem sich die Nachrichtenringe, mit den gesetzten Slots nachvollziehen lassen. Darüberhinaus werden dort auch die Senken angezeigt. Die Darstellung ist sicher noch Verbesserungsfähig, funktioniert aber fürs Debuggen.