Elemente einer ReadingGroup in eine Variable/Array umleiten.

Begonnen von Domek, 04 Januar 2026, 10:30:54

Vorheriges Thema - Nächstes Thema

Domek

Guten Morgen zusammen,

ich würde gerne mit durch ein Notify mir offene Fenster vorlesen lassen.

Der Status der Fenster wird in den einzelnen Readings in einem Dummy-Objekt von meiner Alarmanlage aktuell gehalten:

Internals:
   FUUID      5c47501d-f33f-6825-f515-d6f033f32c018576
   NAME       LUPUSEC
   NR         81
   STATE      Haupttür: Zu, 2026-01-04 09:49:19
   TYPE       dummy
   eventCount 331
   READINGS:
     2026-01-01 22:31:56   LUPUSEC-2OGF    Zu
     2025-01-20 18:05:39   LUPUSEC-ALARM   An
     2026-01-02 22:55:37   LUPUSEC-BZF     Zu
     2026-01-04 09:49:19   LUPUSEC-ET      Zu
     2026-01-03 14:27:46   LUPUSEC-GARAGET Zu
     2026-01-04 09:56:19   LUPUSEC-GWCF    Zu
     2026-01-03 15:53:10   LUPUSEC-Z1F    Zu
     2026-01-04 08:58:03   LUPUSEC-KF      Zu
     2026-01-01 22:22:48   LUPUSEC-Z2F    Zu
     2026-01-04 05:29:59   LUPUSEC-STATUS  Disarm
     2026-01-04 08:50:36   LUPUSEC-SZF     Zu
     2026-01-04 09:50:01   LUPUSEC-WZT     Auf
Attributes:
   event-on-change-reading .*
Ich grupiere die Readings mit folgende ReadingGroup:
Internals:
   DEF        LUPUSEC
   FUUID      675eada6-f33f-aab9-a86e-cb6195674ae63f5d
   NAME       rg_lupusecFTAuf
   NR         644
   NTFY_ORDER 50-rg_lupusecFTAuf
   STATE      Initialized
   TYPE       readingsGroup
   changed    0
   mayBeVisible 1
   CONTENT:
     LUPUSEC    1
   CONTENT2:
   DEVICES:
     ARRAY(0x55fbd604f220)
   fhem:
     lastDefChange 44
     last_update 1767452799.04196
   helper:
     DEF       
     valueFormat { return $VALUE if ( $VALUE eq "Auf" );; return undef;; }
     mapping:
    ...
     LUPUSEC.LUPUSEC-WZT Fenster Wohnzimmer
    ...
     positions:
       [b]LUPUSEC.LUPUSEC-WZT 1:1[/b]
     values:
       formated:
         undef
         ARRAY(0x55fbd36b40f8)
       orig:
         undef
         ARRAY(0x55fbd4baf898)
       prefixsuffix:
         undef
         ARRAY(0x55fbd67d6c70)
Attributes:
   group      Fensterkontakt
   room       2.2_Sicherheit
   valueFormat { return $VALUE if ( $VALUE eq "Auf" );; return undef;; }

Meine Fragen
1.Wie kann ich nur die gemapte Elemente(Readings) hier im Beispiel "Fenster Wohnzimmer" in eine Variable/Array umleiten?
2. Wenn das nicht geht, wie kann ich folgende Code anpassen?

my $devhash = $defs{"LUPUSEC"};; #name des devices
my $testreading = $devhash ->{READINGS};; ## ich möchte nur Readings mit dem Zustand "Auf"
my @areadings = ( keys %{$testreading} );; # enthält alle readings des devices
Danke voraus







FHEM auf einem INTEL NUC mit Ubuntu-Server, nanoCUL 433, Conbee 2

betateilchen

Für mich ist da eine readingsgroup der falsche Ansatz.

Solche Aufgaben löst man am einfachsten über devspec2array, womit man sich die offenen Fenster automatisch selektieren lassen kann und als Ergebnis ein array mit den deviceName zurückerhält.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!


Domek

Hallo,
Danke für Hinweise.

ich bin weiter, aber immer noch nich soweit.

Mit folgendem Code kann ich alle Readings von meiner Alarmanlage auslesen:

my $devhash = $defs{"LUPUSEC"};; #name des devices
my $testreading = $devhash ->{READINGS};;
my @areadings = ( keys %{$testreading} );; # enthält alle readings des devices

foreach ( @areadings )
{
     Log (1, $_);
}

Die Ausgabe:

2026.01.04 14:16:30 1: LUPUSEC-GWCF
2026.01.04 14:16:30 1: LUPUSEC-WZT
2026.01.04 14:16:30 1: LUPUSEC-GARAGET
2026.01.04 14:16:30 1: LUPUSEC-ALARM
2026.01.04 14:16:30 1: LUPUSEC-SZF
2026.01.04 14:16:30 1: LUPUSEC-KF
2026.01.04 14:16:30 1: LUPUSEC-STATUS
2026.01.04 14:16:30 1: LUPUSEC-2OGF
2026.01.04 14:16:30 1: LUPUSEC-ET
2026.01.04 14:16:30 1: LUPUSEC-BZF

Frage
Wie kann ich die Ausgabe "filtern", d.h nur Readings mit dem Status "Auf" ausgeben?


FHEM auf einem INTEL NUC mit Ubuntu-Server, nanoCUL 433, Conbee 2

betateilchen

#4
Zitat von: Domek am 04 Januar 2026, 14:32:38Wie kann ich die Ausgabe "filtern", d.h nur Readings mit dem Status "Auf" ausgeben?

Na, wenn Du die Werte sowieso schon in einem hash hast, ist das doch ziemlich trivial:

  my $devhash = $defs{"LUPUSEC"};; #name des devices
  my $testreading = $devhash ->{READINGS};;

  map {Debug($_) if ($testreading->{$_}->{VAL} eq "Auf")} (keys %{$testreading});

Danach sollten die entsprechenden readings im Logfile stehen.
Statt "Debug" kannst Du natürlich auch eine andere Funktion benutzen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Domek

Hallo,

Vielen Dank, wieder ein Schritt weiter
>Statt "Debug" kannst Du natürlich auch eine andere Funktion benutzen.
Wie kann ich das Ergebniss von:

map {Debug($_) if ($testreading->{$_}->{VAL} eq "Auf")} (keys %{$testreading});

in eine Variable umleiten?

So funktioniert nicht:
my @areadings = map {($_) if ($testreading->{$_}->{VAL} eq "Auf")} (keys %{$testreading});

FHEM auf einem INTEL NUC mit Ubuntu-Server, nanoCUL 433, Conbee 2

betateilchen

Im konkreten Fall geht es um "Arbeiten mit Arrays", sowohl bei map als auch bei push().
Die Frage, wie man ein Element an ein Array anfügt, gehört m.E. zu den perl Grundlagen.
Und die Vermittlung von perl Grundlagen ist grundsätzlich nicht Gegenstand dieses Forums, dafür gibt es jede Menge hervorragende Dokumentation im Internet und in Buchhandlungen.

my @areadings = ();
map {push(@areadings,$_) if ($testreading->{$_}->{VAL} eq "Auf")} (keys %{$testreading});

Bevor Du weitere Fragen zu perl stellst, solltest Du Dir bitte ein paar perl Grundlagen aneignen, denn das ist nichts FHEM-spezifisches.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Domek

FHEM auf einem INTEL NUC mit Ubuntu-Server, nanoCUL 433, Conbee 2