Ankündigung

Einklappen
Keine Ankündigung bisher.

core: vererbbare Attribute in structs

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    core: vererbbare Attribute in structs

    Moin,

    wir haben schon vor einiger Zeit eine Änderung im Core eingebaut, über die ich noch etwas erzählen möchte.

    Häufig kann man structs aus Plugins importieren, und möchte z.B. einzelne oder alle Items mit cache, database, visu_acl oder ähnlichen versehen.

    Bisher musste dafür der struct-Baum kopiert und ausdrücklich aufgenommen werden, damit man die Attribute den jeweiligen Items zuweisen kann.

    Seit dieser Änderung lassen sich Attribute an das gesamte Struct "vererben" - die definierten Attribute werden auf alle Items im struct angewendet.

    Wenn ich beispielsweise aus dem zigbee2mqtt-Plugin das struct "socket_generic" einbinden möchte:

    Code:
    socket_generic:
        description: generic zigbee socket
        struct: zigbee2mqtt.lqi
    
        state:
            type: bool
            z2m_topic: ..:.
            z2m_attr: state
            z2m_bool_values: ['OFF', 'ON']
    und beide Items im Cache speichern, dann ging das bisher so:

    Code:
    socket1:
        struct: zigbee2mqtt.socket_generic
    
        cache: init
    
        state:
            cache: init
    Mit der neuen Erweiterung geht es einfacher:

    Code:
    socket1:
        struct: zigbee2mqtt.socket_generic:
        - cache: init
    Die resultierenden Itembäume sind identisch.

    Die Syntax ist wichtig:

    1. Hinter dem Namen des structs muss ein Doppelpunkt stehen (weil das in yaml als dict interpretiert wird),
    2. Vor den Attributen muss ein Minus stehen, damit diese als Elemente des dicts erkannt werden.

    Es lassen sich auch umfangreichere Attribut-Pakete "vererben":

    Code:
    socket1:
        struct: zigbee2mqtt.socket_generic:
        - cache: init
        - database: yes
        - visu_acl: rw
        - enforce_updates: true

    Was auch geht, was aber das Debuggen ggf. etwas komplizier macht:

    Code:
    socket1:
        struct: zigbee2mqtt.socket_generic:
        - cache: init
        - subitem:
          - type: bool
          - eval: sh...() != ''
          - eval_trigger: ..
    In diesem Fall würde jedem Item das Attribut "cache: init" zugewiesen werden, und zu jedem Item im struct ein neues Item "subitem" vom Typ bool mit den angegebenen eval-Werten erstellt.
    Falls jemand dafür eine sinnvolle Anwendung findet - gut. Ansonsten ist es nur ein Nebeneffekt des Parsers.

    Ich hoffe, dass damit dem einen oder der anderen geholfen werden kann.

Lädt...
X