offene Fenster und Türen

Begonnen von Eddy, 20 Januar 2018, 20:16:18

Vorheriges Thema - Nächstes Thema

Eddy

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

eisman

1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian, Homematic,ZigBee         / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian,MQTT                               / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

octek0815

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



Eddy

Super, vielen Dank für das Beispiel.

Eddy

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'}

juemuc

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
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Nogga

...habe exakt das gleiche Problem mit meiner ReadingsGroup :-(

sinus61

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.

TomLee

Hallo,

vielleicht bringt euch der hier erwähnte JS-Schnipsel von Andre weiter.

Gruß

Thomas

Mumpitz

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