Patch: Events für gemappte Readings in readingsGroup generieren

Begonnen von kaarsten, 31 Oktober 2022, 19:05:54

Vorheriges Thema - Nächstes Thema

kaarsten

Hallo zusammen,

TL;DR: readingsGroup soll alls logische Abstraktion (Device -> Funktion) verwendet werden können

Use Case Beispiel:
- Ich habe >10 verschiedene Temperatursensoren (Hersteller, Modell, ...) in einer readingsGroup
- Ich will den einzelnen Sensoren in der readingsGroup durch ein mapping einzelne Funktionen zuweisen (z.B. Device A -> Schlafzimmer, Device B -> Wohnzimmer, ...)
- Ich will das mapping dynamisch ändern können (z.B. Device A -> Schlafzimmer => Device X -> Schlafzimmer)
- Ich will, dass andere Komponenten (Plots, DOIF, ...) die Sensoren nur durch ihre Funktion (z.B. Schlafzimmer, Wohnzimmer, ...) kennen

Wieso nicht...
...die Devices nach Funktion umbenennen? Device-Namen in der Datenbank müssten geändert werden; Umbenennung in FHEM erfordert oft manuelle Nacharbeit
...ein userReading? Kann AFAIK nicht selbstständig die Readings mehrerer Devices aggregieren
...ein notify mit Mapping-Logik auf ein dummy device? Hohe Kohäsion aber niedrige Kopplung: Der Datenfluss von Device -> notify -> dummy ist schwer nachvollziehbar
...ein neues Modul? Das readingsGroup hat bereits eine voll funktionisfähige und getestete Mapping-Logik

Im Anhang befindet sich ein Patch welcher das beschriebene Verhalten durch das Attribut "generateReadingsForMappings" implementiert.

Hier die Beschreibung aus der CommandRef:

generateReadingsForMappings
1 -> for all valid mappings from the mapping attribute, in addition to the normal update events, generate readings with the mapped reading name
With this attribute, readingsGroup can be used to produce readings as if it were a standalone device. For example, the attribute can be used to store the readingsGroup's readings to DbLog using the mapped name, acting as a proxy-like logical abstraction.

Example:
define rg readingsGroup valve\d:percentage
attr rg mapping {"valve_1:percentage" => "valve_garden", "valve_2:percentage" => "valve_cellar"}
attr rg generateReadingsForMappings 1


Without the generateReadingsForMappings attribute, the readingsGroup produces an event of the format:
valve_1.percentage: 24.0
With the generateReadingsForMappings attribute, the readingsGroup additionally produces a reading of the format:
valve_garden: 24.0

Edit 1: rename mappedTrigger -> generateReadingsForMappings ; use readingsBulkUpdate instead of doTrigger