FHEM Forum

FHEM => Frontends => TabletUI => Thema gestartet von: Eddy am 20 Januar 2018, 20:16:18

Titel: offene Fenster und Türen
Beitrag von: Eddy am 20 Januar 2018, 20:16:18
Hallo Leute,

ich würde gerne alle offenen Türen und Fenster in Form einer Liste darstellen.

Hat mir jemand einen Tipp wie man das realisieren kann? Meine Suche war hier leider nicht erfolgreich.

Grüße,
Eddy
Titel: Antw:offene Fenster und Türen
Beitrag von: eisman am 21 Januar 2018, 15:42:08
hi,

schaue mal in wiki
https://wiki.fhem.de/wiki/ReadingsGroup (https://wiki.fhem.de/wiki/ReadingsGroup)

gruss

Titel: Antw:offene Fenster und Türen
Beitrag von: octek0815 am 21 Januar 2018, 19:57:55
Hallo,

ich mache das so...

DOIF um auf entsprechendes Event zu reagieren...

defmod diWindowDoorOpenCount DOIF ([".*:(open|tilted|closed)$"]) ({WindowDoorOpenCount("$DEVICE", "$EVENT")})
attr diWindowDoorOpenCount do always


Code für 99_myutils.pm (Der Code ist nicht von mir, sondern hier aus dem Forum, jedoch angepasst)...

# - START - Anzahl offener Fenster und Türen Zählen
sub WindowDoorOpenCount($$) {
    #Als Parameter muss der device-Name übergeben werden
    my ($dev,$event)=@_;
   
    #Der dummy der verwendet wird, um die offenen Tueren nachzuhalten
    my $dummyDoor = 'dTueren_Gesamtstatus';
#Der dummy der verwendet wird, um die offenen Fenster nachzuhalten
    my $dummyWindow = 'dFenster_Gesamtstatus';
   
    #Erst mal prüfen, ob das übergebene device überhaupt existiert
    if ($dev =~ /[Tt]uersensor/ && $dev ne 'Wohnzimmer_EG_Terrassentuersensor' && $defs{$dev})
    {
        my $model=AttrVal($dev,'model','');
        if ($model eq 'HM-SEC-SCo' || $model eq 'HM-Sec-SC-2')
        {
            #hole die liste der Fenster, die gerade offen sind
            my $openDoors = ReadingsVal($dummyDoor, 'openDoors', '');
            my @parts;
            @parts = split(/,/, $openDoors) if ($openDoors ne '-');

            # wenn die aktuelle Tuer noch nicht in der liste ist -> hinzufuegen
            if ($event eq 'open') {
                # add element to array if not already there
                push(@parts, $dev) unless grep{$_ eq $dev} @parts;
            }
            elsif ($event eq 'closed') {
                # remove element from array
                @parts = grep {$_ ne $dev} @parts;
            }
           
            # aktualisiere die Readings des dummies
            my $openDoorsCount = scalar(@parts);
            if ($openDoorsCount > 0) { $openDoors = join(',', @parts); }
            else                       { $openDoors = '-';               }
            fhem("setreading $dummyDoor openDoors $openDoors");
            fhem("setreading $dummyDoor openDoorsCount $openDoorsCount");
        }
    } elsif ($dev =~ /[Ff]enstersensor|Terrassentuersensor/ && $defs{$dev})
    {
        my $model=AttrVal($dev,'model','');
        if ($model eq 'HM-SEC-SCo' || $model eq 'HM-SEC-RHS')
        {
            #hole die liste der Fenster, die gerade offen sind
            my $openWindows = ReadingsVal($dummyWindow, 'openWindows', '');
            my @parts;
            @parts = split(/,/, $openWindows) if ($openWindows ne '-');

            # wenn das aktuelle Fenster noch nicht in der liste ist -> hinzufuegen
            if ($event eq 'open' || $event eq 'tilted') {
                # add element to array if not already there
                push(@parts, $dev) unless grep{$_ eq $dev} @parts;
            }
            elsif ($event eq 'closed') {
                # remove element from array
                @parts = grep {$_ ne $dev} @parts;
            }
           
            # aktualisiere die Readings des dummies
            my $openWindowsCount = scalar(@parts);
            if ($openWindowsCount > 0) { $openWindows = join(',', @parts); }
            else                       { $openWindows = '-';               }
            fhem("setreading $dummyWindow openWindows $openWindows");
            fhem("setreading $dummyWindow openWindowsCount $openWindowsCount");
        }
    }
}
# - STOP - Anzahl offener Fenster und Türen Zählen


Dazu noch die notwendigen Dummys...

defmod dFenster_Gesamtstatus dummy
attr dFenster_Gesamtstatus devStateIcon open:fts_window_1w@red closed:fts_window_1w
defmod dTueren_Gesamtstatus dummy
attr dTueren_Gesamtstatus devStateIcon closed:fts_door_right open:fts_door_right@red


Code für Tablet UI...

<div data-type="popup" id="fenster" data-height="300px" data-width="820px" data-return-time="30" data-draggable="false">
<div data-type="symbol" data-device="dFenster_Gesamtstatus" data-get-on='["closed","open"]' data-icons='["oa-fts_window_1w","oa-fts_window_1w blink"]' data-warn="dFenster_Gesamtstatus:openWindowsCount" data-warn-color="#ffffff" data-on-colors='["white","Crimson"]' style="font-size:175%; margin-top:2px;"></div>
<div class="dialog">
<header style="background-color:#202020;">
<div class="sheet">
<div class="left" style="margin-left:15px; margin-top:17px; margin-bottom:15px; font-size:20px; color:white;">FENSTER</div>
<div data-type="link" data-color="white" data-icon-left="fa-times" class="right big" style="margin-top:10px;" onclick="$('.dialog-close').trigger('click');"></div>
</div>
</header>
<div class="inline">
<div data-type="symbol" data-device="Badezimmer_OG_Dachfenstersensor" data-get-on='["open","closed"]' data-icons='["oa-fts_window_roof_open_2","oa-fts_window_roof"]' data-on-colors='["Crimson","white"]' class="bigger"></div>
<div class="big top-narrow">Bad oben</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Badezimmer_EG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Bad unten</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Arbeitszimmer_OG_Fenstersensor1" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Büro links</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Arbeitszimmer_OG_Fenstersensor2" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Büro rechts</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Kinderzimmer2_OG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Kind2</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Flur_OG_Dachfenstersensor" data-get-on='["open","closed"]' data-icons='["oa-fts_window_roof_open_2","oa-fts_window_roof"]' data-on-colors='["Crimson","white"]' class="bigger"></div>
<div class="big top-narrow">Flur</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Kinderzimmer1_OG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Kind1</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="HWR1_EG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">HWR1</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="HWR2_EG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">HWR2</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Kueche_EG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Küche</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Schlafzimmer_EG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["fs-fts_door_right_open","fs-fts_door_tilt","fs-fts_door_right"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Schlafzimmer</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Wohnzimmer_EG_Terrassentuersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_2w_open_l","oa-fts_window_2w_tilt_l","oa-fts_window_2w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Terrasse</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Wohnzimmer_EG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Wohnzimmer</div>
</div>
</div>
</div>


Anbei noch zwei Beispielbilder.

Grüße
Olli


Titel: Antw:offene Fenster und Türen
Beitrag von: Eddy am 23 Januar 2018, 22:33:20
Super, vielen Dank für das Beispiel.
Titel: Antw:offene Fenster und Türen
Beitrag von: Eddy am 25 Februar 2018, 18:28:09
Ich habe das nun erfolgreich in Betrieb. Allerdings habe ich das Problem, dass in der FTUI das Widget nicht aktualisiert.

hier die Einbindung in FTUI:

                <div class="cell">
                <div data-get="STATE" data-type="readingsgroup" data-device="RG"></div>
                </div>


Hier die ReadingsGroup:

Internals:
   CFGFN     
   DEF        (Fenster|Tuer).*:state
   NAME       RG
   NR         7671
   NTFY_ORDER 50-RG
   STATE      Initialized
   TYPE       readingsGroup
   mayBeVisible 1
   CONTENT:
     Fenster_Ankleide_EG 1
     Fenster_Bad_EG 1
     Fenster_Gaestezimmer_West_EG 1
     Fenster_Kueche_EG 1
     Fenster_Toilette_EG 1
     Fenster_Vorratsraum_UG 1
     Fenster_Wohnzimmer_Sued_EG 1
     Tuer_Flur_EG 1
     Tuer_Keller_UG 1
     Tuer_Wohnzimmer_Wintergarten_EG 1
   CONTENT2:
   DEVICES:
     ARRAY(0x3a74f08)
     ARRAY(0x3974120)
     ARRAY(0x3a99d68)
     ARRAY(0x37c8ff8)
     ARRAY(0x3a405c0)
     ARRAY(0x34d6a60)
     ARRAY(0x34facf8)
     ARRAY(0x3b4e608)
     ARRAY(0x39272e8)
     ARRAY(0x379d3c8)
   fhem:
     lastDefChange 41
     last_update 1519494863.63082
   helper:
     DEF       
     mapping    %ALIAS
     valueFormat {$VALUE !~ m/^(closed|off)$/?$VALUE:undef}
     positions:
       Fenster_Toilette_EG.state 5:1
     valueIcon:
       state.closed fts_door_right@green
       state.open fts_door_right_open@red
       state.tilted fts_door_tilt@yellow
     values:
       formated:
         undef
         ARRAY(0x366fc68)
       orig:
         undef
         ARRAY(0x3a67150)
       prefixsuffix:
         undef
         ARRAY(0x3bdafc8)
Attributes:
   mapping    %ALIAS
   valueFormat {$VALUE !~ m/^(closed|off)$/?$VALUE:undef}
   valueIcon  {'state.open' => 'fts_door_right_open@red','state.tilted'=>'fts_door_tilt@yellow','state.closed'=>'fts_door_right@green'}
Titel: Antw:offene Fenster und Türen
Beitrag von: juemuc am 25 Februar 2018, 20:59:35
Hallo zusammen,
meine readingsgroup werden auch nicht automatisch aktualisiert. Ich muss immer erst F5 drücken. Schalter, Uhrzeit usw. werden aktualisiert.
Wer kann helfen?

Viele Grüße
Jürgen
Titel: Antw:offene Fenster und Türen
Beitrag von: Nogga am 25 Februar 2018, 22:08:37
...habe exakt das gleiche Problem mit meiner ReadingsGroup :-(
Titel: Antw:offene Fenster und Türen
Beitrag von: sinus61 am 26 Februar 2018, 10:45:45
Das Problem gibt es bei ReadingsGroup zusammen mit FTUI eigentlich schon immer, daher lassen die sich hier auch nicht sinnvoll nutzen.

Ich hab meine Fenster und Türen einzeln als Symbole eingebunden. Für eine Sammelmeldung kann man ja auch eine Structure nutzen.
Titel: Antw:offene Fenster und Türen
Beitrag von: TomLee am 26 Februar 2018, 11:16:30
Hallo,

vielleicht bringt euch der hier (https://forum.fhem.de/index.php/topic,71404.msg630714.html#msg630714) erwähnte JS-Schnipsel von Andre weiter.

Gruß

Thomas
Titel: Antw:offene Fenster und Türen
Beitrag von: Mumpitz am 10 Mai 2020, 19:17:18
Zitat von: octek0815 am 21 Januar 2018, 19:57:55
Hallo,

ich mache das so...

DOIF um auf entsprechendes Event zu reagieren...

defmod diWindowDoorOpenCount DOIF ([".*:(open|tilted|closed)$"]) ({WindowDoorOpenCount("$DEVICE", "$EVENT")})
attr diWindowDoorOpenCount do always



Code für 99_myutils.pm (Der Code ist nicht von mir, sondern hier aus dem Forum, jedoch angepasst)...

# - START - Anzahl offener Fenster und Türen Zählen
sub WindowDoorOpenCount($$) {
    #Als Parameter muss der device-Name übergeben werden
    my ($dev,$event)=@_;
   
    #Der dummy der verwendet wird, um die offenen Tueren nachzuhalten
    my $dummyDoor = 'dTueren_Gesamtstatus';
#Der dummy der verwendet wird, um die offenen Fenster nachzuhalten
    my $dummyWindow = 'dFenster_Gesamtstatus';
   
    #Erst mal prüfen, ob das übergebene device überhaupt existiert
    if ($dev =~ /[Tt]uersensor/ && $dev ne 'Wohnzimmer_EG_Terrassentuersensor' && $defs{$dev})
    {
        my $model=AttrVal($dev,'model','');
        if ($model eq 'HM-SEC-SCo' || $model eq 'HM-Sec-SC-2')
        {
            #hole die liste der Fenster, die gerade offen sind
            my $openDoors = ReadingsVal($dummyDoor, 'openDoors', '');
            my @parts;
            @parts = split(/,/, $openDoors) if ($openDoors ne '-');

            # wenn die aktuelle Tuer noch nicht in der liste ist -> hinzufuegen
            if ($event eq 'open') {
                # add element to array if not already there
                push(@parts, $dev) unless grep{$_ eq $dev} @parts;
            }
            elsif ($event eq 'closed') {
                # remove element from array
                @parts = grep {$_ ne $dev} @parts;
            }
           
            # aktualisiere die Readings des dummies
            my $openDoorsCount = scalar(@parts);
            if ($openDoorsCount > 0) { $openDoors = join(',', @parts); }
            else                       { $openDoors = '-';               }
            fhem("setreading $dummyDoor openDoors $openDoors");
            fhem("setreading $dummyDoor openDoorsCount $openDoorsCount");
        }
    } elsif ($dev =~ /[Ff]enstersensor|Terrassentuersensor/ && $defs{$dev})
    {
        my $model=AttrVal($dev,'model','');
        if ($model eq 'HM-SEC-SCo' || $model eq 'HM-SEC-RHS')
        {
            #hole die liste der Fenster, die gerade offen sind
            my $openWindows = ReadingsVal($dummyWindow, 'openWindows', '');
            my @parts;
            @parts = split(/,/, $openWindows) if ($openWindows ne '-');

            # wenn das aktuelle Fenster noch nicht in der liste ist -> hinzufuegen
            if ($event eq 'open' || $event eq 'tilted') {
                # add element to array if not already there
                push(@parts, $dev) unless grep{$_ eq $dev} @parts;
            }
            elsif ($event eq 'closed') {
                # remove element from array
                @parts = grep {$_ ne $dev} @parts;
            }
           
            # aktualisiere die Readings des dummies
            my $openWindowsCount = scalar(@parts);
            if ($openWindowsCount > 0) { $openWindows = join(',', @parts); }
            else                       { $openWindows = '-';               }
            fhem("setreading $dummyWindow openWindows $openWindows");
            fhem("setreading $dummyWindow openWindowsCount $openWindowsCount");
        }
    }
}
# - STOP - Anzahl offener Fenster und Türen Zählen


Dazu noch die notwendigen Dummys...

defmod dFenster_Gesamtstatus dummy
attr dFenster_Gesamtstatus devStateIcon open:fts_window_1w@red closed:fts_window_1w
defmod dTueren_Gesamtstatus dummy
attr dTueren_Gesamtstatus devStateIcon closed:fts_door_right open:fts_door_right@red


Code für Tablet UI...

<div data-type="popup" id="fenster" data-height="300px" data-width="820px" data-return-time="30" data-draggable="false">
<div data-type="symbol" data-device="dFenster_Gesamtstatus" data-get-on='["closed","open"]' data-icons='["oa-fts_window_1w","oa-fts_window_1w blink"]' data-warn="dFenster_Gesamtstatus:openWindowsCount" data-warn-color="#ffffff" data-on-colors='["white","Crimson"]' style="font-size:175%; margin-top:2px;"></div>
<div class="dialog">
<header style="background-color:#202020;">
<div class="sheet">
<div class="left" style="margin-left:15px; margin-top:17px; margin-bottom:15px; font-size:20px; color:white;">FENSTER</div>
<div data-type="link" data-color="white" data-icon-left="fa-times" class="right big" style="margin-top:10px;" onclick="$('.dialog-close').trigger('click');"></div>
</div>
</header>
<div class="inline">
<div data-type="symbol" data-device="Badezimmer_OG_Dachfenstersensor" data-get-on='["open","closed"]' data-icons='["oa-fts_window_roof_open_2","oa-fts_window_roof"]' data-on-colors='["Crimson","white"]' class="bigger"></div>
<div class="big top-narrow">Bad oben</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Badezimmer_EG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Bad unten</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Arbeitszimmer_OG_Fenstersensor1" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Büro links</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Arbeitszimmer_OG_Fenstersensor2" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Büro rechts</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Kinderzimmer2_OG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Kind2</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Flur_OG_Dachfenstersensor" data-get-on='["open","closed"]' data-icons='["oa-fts_window_roof_open_2","oa-fts_window_roof"]' data-on-colors='["Crimson","white"]' class="bigger"></div>
<div class="big top-narrow">Flur</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Kinderzimmer1_OG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Kind1</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="HWR1_EG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">HWR1</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="HWR2_EG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">HWR2</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Kueche_EG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Küche</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Schlafzimmer_EG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["fs-fts_door_right_open","fs-fts_door_tilt","fs-fts_door_right"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Schlafzimmer</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Wohnzimmer_EG_Terrassentuersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_2w_open_l","oa-fts_window_2w_tilt_l","oa-fts_window_2w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Terrasse</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="Wohnzimmer_EG_Fenstersensor" data-get-on='["open","tilted","closed"]' data-icons='["oa-fts_window_1w_open","oa-fts_window_1w_tilt","oa-fts_window_1w"]' data-on-colors='["Crimson","Orange","white"]' class="bigger"></div>
<div class="big top-narrow">Wohnzimmer</div>
</div>
</div>
</div>


Anbei noch zwei Beispielbilder.

Grüße
Olli

Hallo

Ich wollte diesen Beitrag in meiner Installation einfügen und zum laufen bringen. Leider scheitere ich jedoch am Anfang der sub, welche in die myUtils eingefügt wird:

    #Erst mal prüfen, ob das übergebene device überhaupt existiert
    if ($dev =~ /[Tt]uersensor/ && $dev ne 'Wohnzimmer_EG_Terrassentuersensor' && $defs{$dev})


Hier wird geprüft, ob das Device überhaupt existiert. Bei mir heissen die Fensterkontakte allesamt Fenster_ und dann den Raumnamen. Wie kann ich das auf meine Bedürfnisse anpassen?

Besten Dank für Eure Antworten