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
hi,
schaue mal in wiki
https://wiki.fhem.de/wiki/ReadingsGroup (https://wiki.fhem.de/wiki/ReadingsGroup)
gruss
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
Super, vielen Dank für das Beispiel.
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'}
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
...habe exakt das gleiche Problem mit meiner ReadingsGroup :-(
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.
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
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