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
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.
https://wiki.fhem.de/wiki/DevelopmentModuleAPI#devspec2array
https://fhem.de/commandref_modular_DE.html#devspec
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?
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.
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});
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.
Hallo,
perfekt.
Danke.
Gruss