Ich würde gerne ein Fenstersymbol darstellen, das die Anzahl der offenen Fenster als Kreis in der rechten oberen Ecke darstellt. Wie lässt sich das in FTUI umsetzen? Ich habe schon in einigen Screenshots gesehen, dass das möglich ist.
Die Anzahl der offenen Fenster sowie den Gesamtstatus habe ich in einem Dummy Device in 2 Readings stehen:
STATE = "open" oder "closed", je nachdem, ob mindestens 1 Fenster offen ist
COUNT_OPEN = Anzahl der offenen Fenster
			
			
			
				Zitat von: zap am 31 Januar 2016, 15:10:17
Ich würde gerne ein Fenstersymbol darstellen, das die Anzahl der offenen Fenster als Kreis in der rechten oberen Ecke darstellt. Wie lässt sich das in FTUI umsetzen? Ich habe schon in einigen Screenshots gesehen, dass das möglich ist.
Die Anzahl der offenen Fenster sowie den Gesamtstatus habe ich in einem Dummy Device in 2 Readings stehen:
STATE = "open" oder "closed", je nachdem, ob mindestens 1 Fenster offen ist
COUNT_OPEN = Anzahl der offenen Fenster
Moin.
Es würde reichen wenn dein Dummy die Anzahl der offenen Fenster erfasst. Weil bei "0" keine Fenster offen sind.
Also: STATE 5
oder: STATE 0
<div data-type="symbol"
        data-device="DUMMY"
        data-states='["0","^[01]$","^[1-9][0-9]|[2-9]$"]'
        data-icons='["ftui-window","ftui-window warn","ftui-window warn"]'
        data-colors='["#505050","#aa6900","#aa6900"]'
        data-icon="ftui-window" <!-- Das füge ich immer mit ein falls es zu Problemen kommt.-->
</div>
Viel Spaß beim testen :)
Grüße^^
EDITOder du lässt dein Dummy so und liest nur "COUNT_OPEN" aus:
<div data-type="symbol"
        data-device="DUMMY"
        data-get="COUNT_OPEN"
        data-states='["0","^[01]$","^[1-9][0-9]|[2-9]$"]'
        data-icons='["ftui-window","ftui-window warn","ftui-window warn"]'
        data-colors='["#505050","#aa6900","#aa6900"]'
        data-icon="ftui-window" <!-- Das füge ich immer mit ein falls es zu Problemen kommt.-->
</div>
 
			
			
				wie errechnet ihr für den dummy die anzahl offener fenster?
			
			
			
				Mit einer myUtils Funktion.
			
			
			
				Hi zap,
ich mach das wie folgt:
Einen Dummy zum nachhalten des Status:
defmod dummy_OffeneFenster dummy
attr dummy_OffeneFenster stateFormat openWindowsCount
Ein DOIF zum Ausführen der der Funktion aus 99_MyUtils.pm:
defmod doif__winOpen.StartStop DOIF ([".*:(open|tilted|closed)$"]) ({winOpenStartStop("$DEVICE", "$EVENT")})
attr doif__winOpen.StartStop do always
Eine Function in 99_MyUtils.pm:
sub winOpenStartStop($$) {
    #Als Parameter muss der device-Name übergeben werden
    my ($dev,$event)=@_;
    
    #Der dummy der verwendet wird, um die offenen Fenster/Tueren nachzuhalten
    my $dummy = 'dummy_OffeneFenster';
    
    #Erst mal prüfen, ob das übergebene device überhaupt existiert
    if ($dev =~ /[Ff]enster|Tuer/ && $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($dummy, '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 $dummy openWindows $openWindows");
            fhem("setreading $dummy openWindowsCount $openWindowsCount");
        }
    }
}
Und mein FTUI sieht wie folgt aus:
   <div data-type="label" class="cell" >Fenster/Türen geöffnet<>
   <div data-type="symbol" data-device="dummy_OffeneFenster" data-get="openWindowsCount"
       data-get-on='["0", "^[1-9].*"]'
       data-icons='["fa-exclamation-triangle", "fa-exclamation-triangle"]' 
       data-colors='["#444444","#ff0000"]' 
       class="cell grande top-narrow-2x" ><>
   <div data-type="symbol" data-device="dummy_OffeneFenster" data-get="openWindowsCount"
       data-get-on='["0", "^[1-9].*"]'
       data-icons='["fa-exclamation-triangle", "fa-exclamation-triangle warn"]' 
       data-colors='["transparent","transparent"]' 
       class="cell bigger top-narrow-2x" style="margin-top:-188px !important;margin-left:33px !important;"><>
(Achtung: Die closing tags werden durch das Board »zerstört«)
Der FTUI Code besteht aus zwei Teilen, da ich ein möglichst großes Ausrufezeichen haben wollte, aber der warn-Indikator sollte nicht so groß sein. Das geht bestimmt auch einfacher :-).
Ich bestehe nicht darauf, dass der Code optimal ist, aber er funktioniert gut :-)
LG
Christian
			
			
			
				Noch eine alternative Lösung:
Bei mir haben alle Fenster ein UserReading "windowState" welches open, closed, tilted sein kann.
Zusätzlich sind alle Fenster in der Gruppe "Fenster".
Die Anzahl der offenen Fenster bekomme ich dadurch ohne weitere Fallunterscheidungen für Sensormodelle etc. über diese 99_myUtils Funktion:
sub numberOfOpenWindows() {
	my $openWindows = 0;
	
	foreach my $windowName (devspec2array("group=Fenster")) { 
		if (ReadingsVal($windowName, "windowState", "closed") ne "closed") {
			$openWindows++;
		}
	}
	return $openWindows;
}
Für die FTUI Anzeige würde dann ein allgemeines Notify auf open|tilted|closed reichen, welches das DummyReading mit dem Rückgabewert der Funktion belegt.
			
			
			
				Zitat von: CoolTux am 09 Dezember 2016, 08:26:10
Mit einer myUtils Funktion.
hatte ich mir gedacht und die 2 zeilen code in ein notfy gepackt
			
 
			
			
				Zitat von: Thyraz am 10 Dezember 2016, 08:52:51
Noch eine alternative Lösung:
Bei mir haben alle Fenster ein UserReading "windowState" welches open, closed, tilted sein kann.
Zusätzlich sind alle Fenster in der Gruppe "Fenster".
Die Anzahl der offenen Fenster bekomme ich dadurch ohne weitere Fallunterscheidungen für Sensormodelle etc. über diese 99_myUtils Funktion:
sub numberOfOpenWindows() {
	my $openWindows = 0;
	
	foreach my $windowName (devspec2array("group=Fenster")) { 
		if (ReadingsVal($windowName, "windowState", "closed") ne "closed") {
			$openWindows++;
		}
	}
	return $openWindows;
}
Für die FTUI Anzeige würde dann ein allgemeines Notify auf open|tilted|closed reichen, welches das DummyReading mit dem Rückgabewert der Funktion belegt.
hallo,
kannst du das bitte mal komplett mit Anteil in der fhem.cfg , myUtils und dann ftui beschreiben.
Danke Danke
Jörg
			
 
			
			
				Zitat von: choenig am 09 Dezember 2016, 22:57:40
Hi zap,
ich mach das wie folgt:
Einen Dummy zum nachhalten des Status:
defmod dummy_OffeneFenster dummy
attr dummy_OffeneFenster stateFormat openWindowsCount
Ein DOIF zum Ausführen der der Funktion aus 99_MyUtils.pm:
defmod doif__winOpen.StartStop DOIF ([".*:(open|tilted|closed)$"]) ({winOpenStartStop("$DEVICE", "$EVENT")})
attr doif__winOpen.StartStop do always
Eine Function in 99_MyUtils.pm:
sub winOpenStartStop($$) {
    #Als Parameter muss der device-Name übergeben werden
    my ($dev,$event)=@_;
    
    #Der dummy der verwendet wird, um die offenen Fenster/Tueren nachzuhalten
    my $dummy = 'dummy_OffeneFenster';
    
    #Erst mal prüfen, ob das übergebene device überhaupt existiert
    if ($dev =~ /[Ff]enster|Tuer/ && $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($dummy, '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 $dummy openWindows $openWindows");
            fhem("setreading $dummy openWindowsCount $openWindowsCount");
        }
    }
}
Und mein FTUI sieht wie folgt aus:
   <div data-type="label" class="cell" >Fenster/Türen geöffnet<>
   <div data-type="symbol" data-device="dummy_OffeneFenster" data-get="openWindowsCount"
       data-get-on='["0", "^[1-9].*"]'
       data-icons='["fa-exclamation-triangle", "fa-exclamation-triangle"]' 
       data-colors='["#444444","#ff0000"]' 
       class="cell grande top-narrow-2x" ><>
   <div data-type="symbol" data-device="dummy_OffeneFenster" data-get="openWindowsCount"
       data-get-on='["0", "^[1-9].*"]'
       data-icons='["fa-exclamation-triangle", "fa-exclamation-triangle warn"]' 
       data-colors='["transparent","transparent"]' 
       class="cell bigger top-narrow-2x" style="margin-top:-188px !important;margin-left:33px !important;"><>
(Achtung: Die closing tags werden durch das Board »zerstört«)
Der FTUI Code besteht aus zwei Teilen, da ich ein möglichst großes Ausrufezeichen haben wollte, aber der warn-Indikator sollte nicht so groß sein. Das geht bestimmt auch einfacher :-).
Ich bestehe nicht darauf, dass der Code optimal ist, aber er funktioniert gut :-)
LG
Christian
Hi,
auf die Gefahr hin, wie ein völliger Noob zu wirken:
woher kommt die Zahl aus deinem Icon bei offenem Fenster? Ich habe das mal nachgespielt und kann die icon-farbänderung nachvollziehen aus data-type="symbol"  und data-get-on. Ich sehe auch die Platzierung der runden roten zahl mit margin-top und margin-left. Aber woher genau bekommt ftui den Wert  aus dem dummy_OffeneFenster?  Kannst du mir mal nachhilfe in html und div-platzierung geben?
danke,
Friedhelm
			
 
			
			
				Hi Friedhelm,
Zitat von: macfly am 03 Februar 2018, 21:58:24
woher kommt die Zahl aus deinem Icon bei offenem Fenster?
[...]
Aber woher genau bekommt ftui den Wert  aus dem dummy_OffeneFenster? 
ich versteh' die Frage(n) nicht ganz. Durch das »warn« im data-icons verwendet er den Wert des dummys als anzuzeigende Zahl.
Zitat von: macfly am 03 Februar 2018, 21:58:24
Kannst du mir mal nachhilfe in html und div-platzierung geben?
Was hast Du denn für ein Problem in »html und div-platzierung«?
LG
Christian
			
				alles klar, dein Hinweis hat mich zu https://wiki.fhem.de/wiki/FTUI_Widget_Symbol geschickt. Hatte ich garnicht so auf den Schirm, dass das "warn" solche Auswirkungen hat. Ein Beispiel auf der wiki-seite wäre cool gewesen.
Vielen Dank für deine Antwort!
schöne Grüße,
Friedhelm 
			
			
			
				Zitat von: Thyraz am 10 Dezember 2016, 08:52:51
Noch eine alternative Lösung:
Bei mir haben alle Fenster ein UserReading "windowState" welches open, closed, tilted sein kann.
Zusätzlich sind alle Fenster in der Gruppe "Fenster".
Die Anzahl der offenen Fenster bekomme ich dadurch ohne weitere Fallunterscheidungen für Sensormodelle etc. über diese 99_myUtils Funktion:
sub numberOfOpenWindows() {
	my $openWindows = 0;
	
	foreach my $windowName (devspec2array("group=Fenster")) { 
		if (ReadingsVal($windowName, "windowState", "closed") ne "closed") {
			$openWindows++;
		}
	}
	return $openWindows;
}
Für die FTUI Anzeige würde dann ein allgemeines Notify auf open|tilted|closed reichen, welches das DummyReading mit dem Rückgabewert der Funktion belegt.
Hallo zusammen, habe das Userreading "windowState" gesetzt und auch die Funktion in die 99_MyUtils.pm aufgenommen.
Leider stehe ich nun aber bei der Einrichtung des Dummy bzw. Notify völlig auf dem Schlauch.
Kann mir da bitte mal jemand unter die Arme greifen? :-(
			
 
			
			
				
sub numberOfOpenWindows() {
      return devspec2array("group=Fenster:FILTER=STATE!=closed")
}
Sollte Dir die Anzahl der nicht geschlossenen Fenster zurück geben.
			
			
			
				Hallo CoolTux,
vielen Dank erstmal für Dein Feedback.
Wenn ich Dich richtig verstehe, liefert die Funktion nun also die Anzahl der offenen Fenster zurück.
Jetzt würde ich das Ergebnis aber gerne noch in ein Dummy Device schreiben, um dieses anschließend in TabletUI anzuzeigen.
Hast Du noch nen Tipp für mich, wie ich das mache?
Vielen Dank im Voraus.
Marc
			
			
			
				Du machst ein Notify welches auf alle Fenster triggert und startest das im Notify die Funktion. Am besten gleich mit dem set Befehl für den Dummy
Von Vorteil ist wenn man eine vernünftige Namensgebung gewählt hat.
define notifyAnzahlFenster notify FensterKontact.*:(open|tilted|closed) { CommandSet(undef,'dummyname ' . numberOfOpenWindows()) }
Notify triggert auf alle Devices die vom Namen her anfangen mit FensterKontakt und den Event open,tilted oder closed haben und führt einen set dummyname Anzahl_der_offenen_Fenster aus
			
			
			
				Oh je... da bin ich wohl ein hoffnungsloser Fall :-(
Meine Fensterdevices haben alle eine einheitliche Benennung und beginnen mit "Fensterkontakte...".
Da ich diverse unterschiedliche Fenstersensoren verwende, die alle eine andere Schreibweise im Status haben, muss ich vermutlich noch das Event "(open|tilted|closed)" anpassen, aber das im zweiten Schritt.
Konkret bekomme ich es leider noch immer nicht hin :-(
Also ich hab jetzt folgendes eingestellt:
Dummy Device
Internals: 
   CFGFN
   NAME         offeneFenster 
   NR             498 
   STATE        ??? 
   TYPE          dummy 
Attributes:
notify
Internals: 
    DEF                         Fensterkontakt.*:(open|tilted|closed) { CommandSet(undef, ' offeneFenster ' . numberOfOpenWindows()) } 
    NAME                      notifyAnzahlFenster 
    NR                          305 
    NTFY_ORDER          50-notifyAnzahlFenster 
    REGEXP                   Fensterkontakt.*:(open|tilted|closed) 
    STATE                     active 
    TYPE                       notify 
    READINGS:             2018-03-27 12:50:47 state active 
Attributes:
hier noch ein List von einem Beispiel-Fenstersensor
Internals: 
    CHANGED 
    DEF        158d0001daefe8 sensor_magnet.aq2 XiaomiGateway 
    IODev XiaomiGateway 
    LASTInputDev XiaomiGateway 
    MODEL sensor_magnet.aq2 
    MSGCNT 2 
    NAME XMI_158d0001daefe8 
    NR 139 
    SID     158d0001daefe8 
    STATE Status: close<br>Batterie: ok<br>last Change: (2018-02-22 21:42:06) 
    TYPE XiaomiSmartHome_Device 
    VERSION 1.20 
    XiaomiGateway_MSGCNT 2 
    XiaomiGateway_TIME 2018-03-27 12:56:13 
READINGS: 2018-03-27 12:56:13 
     battery ok 2018-03-27 12:56:13 
     battery_level 3 2018-03-27 12:56:13 
     heartbeat 158d0001daefe8 2018-03-27 12:56:13 
     no_close 0 2018-02-22 21:42:06 
     state close 2018-03-27 12:56:13 
     windowState closed 
Attributes: IODev XiaomiGateway 
     alarmDevice Sensor alarmSettings alarm4,|XMI_158d0001daefe8:open|Fenstersensor_SchlafzimmerKeller|on 
     alias Fensterkontakt_SchlafzimmerKeller 
     devStateIcon open:fts_door_open@red close:fts_door@green 
     event-on-change-reading .* 
     group Fenstersensoren 
     icon fts_window_1w 
     room 02_Untergeschoss->01_Schlafzimmer,10_Sonstiges->07_Fenstersensoren,20_DeviceGroups->03_Xiaomi 
     stateFormat { sprintf( "Status: %s<br>Batterie: %s<br>last Change: (%s)", ReadingsVal("XMI_158d0001daefe8", "state","?"), ReadingsVal("XMI_158d0001daefe8", "battery","?"), ReadingsTimestamp("XMI_158d0001daefe8", "state", "0000-00-00 00:00:00") ) } timestamp-on-change-reading state userReadings windowState {if(ReadingsVal("XMI_158d0001daefe8","state","?") eq "close") {return "closed"} elsif (ReadingsVal("XMI_158d0001daefe8","state","?") eq "tilted") {return "tilted"} elsif (ReadingsVal("XMI_158d0001daefe8","state","?") eq "open") {return "open"} else {return "unknown"}}
Dazu dann noch den Code in der Utils:
sub numberOfOpenWindows() {
      return devspec2array("group=Fensterkontakt:FILTER=STATE!=closed")
}
Magst Du mich nochmal ein Stück an die Hand nehmen?
			
			
			
				Das Problem ist das die Namen Deiner Devices nicht Fensterkontakt sind sondern die Aliase.
NAME XMI_158d0001daefe8 
alias Fensterkontakt_SchlafzimmerKeller
Ich empfehle alle mit rename vernünftig um zu benennen. Dann schauen wir weiter.
			
			
			
				Hi nochmal,
also erst nochmal ganz lieben Dank für Deine Geduld und Mühe.
Ich habe die Fenstersensoren jetzt umbenannt.
Beispiel
Internals:
    CHANGED
    DEF                             158d0001daefe8 sensor_magnet.aq2 XiaomiGateway
    IODev                          XiaomiGateway
    LASTInputDev             XiaomiGateway
    MODEL                        sensor_magnet.aq2
    MSGCNT                      6
    NAME                          Fensterkontakt_SchlafzimmerKeller
    NR                              139
    SID                            158d0001daefe8
    STATE                        Status: close<br>Batterie: ok<br>last Change: (2018-02-22 21:42:06)
    TYPE                          XiaomiSmartHome_Device
    VERSION                   1.20
    XiaomiGateway_MSGCNT 6
    XiaomiGateway_TIME 2018-03-27 12:56:13
READINGS: 2018-03-27 12:56:13
     battery ok 2018-03-27 12:56:13
     battery_level 3 2018-03-27 12:56:13
     heartbeat 158d0001daefe8 2018-03-27 12:56:13
     no_close 0 2018-02-22 21:42:06
     state close 2018-03-27 12:56:13
     windowState closed
Attributes: IODev XiaomiGateway
     devStateIcon open:fts_door_open@red close:fts_door@green
     event-on-change-reading .*
     group Fenstersensoren
     icon fts_window_1w
     room 02_Untergeschoss->01_Schlafzimmer,10_Sonstiges->07_Fenstersensoren,20_DeviceGroups->03_Xiaomi
     stateFormat { sprintf( "Status: %s<br>Batterie: %s<br>last Change: (%s)", ReadingsVal("Fensterkontakt_SchlafzimmerKeller", "state","?"), ReadingsVal("Fensterkontakt_SchlafzimmerKeller", "battery","?"), ReadingsTimestamp("Fensterkontakt_SchlafzimmerKeller", "state", "0000-00-00 00:00:00") ) } timestamp-on-change-reading state userReadings windowState {if(ReadingsVal("Fensterkontakt_SchlafzimmerKeller","state","?") eq "close") {return "closed"} elsif (ReadingsVal("Fensterkontakt_SchlafzimmerKeller","state","?") eq "tilted") {return "tilted"} elsif (ReadingsVal("Fensterkontakt_SchlafzimmerKeller","state","?") eq "open") {return "open"} else {return "unknown"}}
Zudem hatte ich noch einen falschen Code für die 99_myUtils gepostet. Hier jetzt wirklich vorhandene:
sub numberOfOpenWindows() {
      return devspec2array("group=Fenstersensoren:FILTER=STATE!=closed")
}
			
			
			
				Sieht schon mal gut aus. Jetzt zeigt Dein state aber close nicht closed. Das bitte im Notify Regex und bei der myUtils beim Filter ändern. 
			
			
			
				ok... da hätte ich jetzt auch selbst drauf kommen können...   ::)
Ist angepasst... aber leider weiterhin ohne Erfolg. Der Wert landet nicht im Dummy.
Zudem stellt sich jetzt natürlich auch wieder die Frage von vorhin:
ZitatDa ich diverse unterschiedliche Fenstersensoren verwende, die alle eine andere Schreibweise im Status haben, muss ich vermutlich noch das Event "(open|tilted|closed)" anpassen, aber das im zweiten Schritt.
Ich müsste also auf verschiedene Schreibweisen - sowohl im Notify als auch in der myUtils reagieren (Bsp. close/closed/Close).
			
				Das kommt noch. Lass uns erstmal eine generelle Funktion herstellen.
triggert denn das Notify? Gib mal bitte ein list vom Notify
			
			
			
				Ok, danke und gerne :-)
Internals:
   DEF        Fensterkontakt.*:(open|tilted|close) { CommandSet(undef, ' offeneFenster ' . numberOfOpenWindows()) }
   NAME       notifyAnzahlFenster
   NR         304
   NTFY_ORDER 50-notifyAnzahlFenster
   REGEXP     Fensterkontakt.*:(open|tilted|close)
   STATE      active
   TYPE       notify
   READINGS:
     2018-03-27 17:21:08   state           active
Attributes:
			
			
			
				triggert nicht.
Mach mal bitte den Eventmonitor auf. Im FHEMWEB ganz unten ganz links
Bei Filter vor dem .* eingeben
Fensterkontakt
so das dann da steht
Fensterkontakt.*
und dann das Fenster mal auf machen und die Ausgabe des Eventmonitors hier posten
			
			
			
				2018-03-27 19:16:56 XiaomiSmartHome_Device Fensterkontakt_SchlafzimmerKeller open
2018-03-27 19:16:56 XiaomiSmartHome_Device Fensterkontakt_SchlafzimmerKeller windowState: open
2018-03-27 19:16:59 XiaomiSmartHome_Device Fensterkontakt_SchlafzimmerKeller close
2018-03-27 19:16:59 XiaomiSmartHome_Device Fensterkontakt_SchlafzimmerKeller windowState: closed
gerne
			
			
			
				
Fensterkontakt.*(open|tilted|close) {  }
Ändere die DEF des Notify bitte so. Ausgeführt wird dann noch nichts aber wir sehen ob er triggert.
Im Internal STATE vom Notify muss dann der Timestamp vom Trigger drin stehen.
			
			
			
				jawohl, STATE wird dann mit dem Timestamp befüllt.
			
			
			
				Sehr schön. Nun zwischen { }
CommandSet(undef, ' offeneFenster ' . numberOfOpenWindows()) 
Fügen.
Und die Funktion erstmal so und die myUtils mit reload neu laden
sub numberOfOpenWindows() {
      return devspec2array("group=Fenstersensoren:FILTER=STATE!=close")
}
			
			
				ok... STATE wird aktualisiert
			
			
			
				Welcher STATE. Von Deinem Fensterzähler Dummy?
Wenn der nicht dann bitte ins Log von FHEM schauen.
			
			
			
				Nee, nur der des notify - so wie vorher auch.
Der Dummy scheint unbeeindruckt :-(
Hab das Loglevel mal hochgesetzt:
2018.03.27 20:17:15 5: XiaomiGateway: Read> Read start
2018.03.27 20:17:15 5: XiaomiGateway: Read> {"cmd":"report","model":"sensor_magnet.aq2","sid":"158d0001daefe8","short_id":52743,"data":"{\"status\":\"close\"}"}
2018.03.27 20:17:15 5: XiaomiGateway: Read> Dispatch {"cmd":"report","model":"sensor_magnet.aq2","sid":"158d0001daefe8","short_id":52743,"data":"{\"status\":\"close\"}"}
2018.03.27 20:17:15 5: XiaomiGateway: dispatch {"cmd":"report","model":"sensor_magnet.aq2","sid":"158d0001daefe8","short_id":52743,"data":"{\\"status\\":\\"close\\"}"}
2018.03.27 20:17:15 4: XiaomiGateway: DEV_Parse> IS DEFINED sensor_magnet.aq2 : 158d0001daefe8
2018.03.27 20:17:15 5: XiaomiGateway: DEV_Read> SID: 158d0001daefe8 XiaomiSmartHome_Device
2018.03.27 20:17:15 3: XiaomiGateway: DEV_Read> Name: Fensterkontakt_SchlafzimmerKeller SID: 158d0001daefe8 Type: sensor_magnet.aq2 Status: close
2018.03.27 20:17:15 5: Starting notify loop for Fensterkontakt_SchlafzimmerKeller, 2 event(s), first is close
2018.03.27 20:17:15 5: Triggering notifyAnzahlFenster
2018.03.27 20:17:15 4: notifyAnzahlFenster exec { CommandSet(undef, ' offeneFenster ' . numberOfOpenWindows()) }
2018.03.27 20:17:15 5: Cmd: >{ CommandSet(undef, ' offeneFenster ' . numberOfOpenWindows()) }
<
2018.03.27 20:17:15 3: notifyAnzahlFenster return value: Please define  first
2018.03.27 20:17:15 5: End notify loop for Fensterkontakt_SchlafzimmerKeller
Sagt Dir das irgendwas?
Vor allem das hier ist vermutlich ein Hinweis:
2018.03.27 20:17:15 3: notifyAnzahlFenster return value: Please define  first
			
			
			
				Da ist ein Leerzeichen rein gerutscht
CommandSet(undef, ' offeneFenster ' . numberOfOpenWindows()) 
Ändern zu
CommandSet(undef, 'offeneFenster ' . numberOfOpenWindows()) 
			
			
			
				2018.03.27 20:30:38 5: XiaomiGateway: Read> Read start
2018.03.27 20:30:38 5: XiaomiGateway: Read> {"cmd":"report","model":"sensor_magnet.aq2","sid":"158d0001daefe8","short_id":52743,"data":"{\"status\":\"close\"}"}
2018.03.27 20:30:38 5: XiaomiGateway: Read> Dispatch {"cmd":"report","model":"sensor_magnet.aq2","sid":"158d0001daefe8","short_id":52743,"data":"{\"status\":\"close\"}"}
2018.03.27 20:30:38 5: XiaomiGateway: dispatch {"cmd":"report","model":"sensor_magnet.aq2","sid":"158d0001daefe8","short_id":52743,"data":"{\\"status\\":\\"close\\"}"}
2018.03.27 20:30:38 4: XiaomiGateway: DEV_Parse> IS DEFINED sensor_magnet.aq2 : 158d0001daefe8
2018.03.27 20:30:38 5: XiaomiGateway: DEV_Read> SID: 158d0001daefe8 XiaomiSmartHome_Device
2018.03.27 20:30:38 3: XiaomiGateway: DEV_Read> Name: Fensterkontakt_SchlafzimmerKeller SID: 158d0001daefe8 Type: sensor_magnet.aq2 Status: close
2018.03.27 20:30:38 5: Starting notify loop for Fensterkontakt_SchlafzimmerKeller, 2 event(s), first is close
2018.03.27 20:30:38 5: Batteriestatus: not on any display, ignoring notify
2018.03.27 20:30:38 5: Triggering notifyAnzahlFenster
2018.03.27 20:30:38 4: notifyAnzahlFenster exec { CommandSet(undef, 'offeneFenster' . numberOfOpenWindows()) }
2018.03.27 20:30:38 5: Cmd: >{ CommandSet(undef, 'offeneFenster' . numberOfOpenWindows()) }
<
2018.03.27 20:30:38 3: notifyAnzahlFenster return value: Please define offeneFenster12 first
2018.03.27 20:30:38 5: End notify loop for Fensterkontakt_SchlafzimmerKeller
			
			
			
				Nur das vordere Leerzeichen. Das hintere lassen
CommandSet(undef, 'offeneFenster ' . numberOfOpenWindows())
			
			
			
				Sind übrigens 12 Fenster auf  ;D
			
			
			
				grmpf.... Da hab ich es nur gut gemeint und wollte den nächsten Fehler direkt mit beheben :-(
So... Teilerfolg...juhhuuu :-) Die 12 stehen jetzt auch im Dummy !!!
Aber... Das kann nicht sein. Liegt aber vermutlich eher an der abweichenden Statusmeldung - wir fragen doch "nur" auf !=close ab, oder?
Damit ist dann "closed" ebenfalls geöffnet :-)
btw: Weißt du auswendig, wie man das Logfile leert? :-)
			
			
			
				wenn ich das richtig versteh, werden doch jetzt auch "nur" alle devices berücksichtigt, die mit "Fensterkontakt" beginnen und in der Gruppe "Fenstersensoren" enthalten sind, oder?
Da hätte ich nämlich insgesamt nur 11 :-)
			
			
			
				Leeren kannst du es über die die Linuxkonsole
> logfilename
Nicht ganz. Triggern tun nur die mit Namen Fensterkontakt. Die Zahl aber kommt aus dem tatsächlichen group=Fenstersensor und die Filter.
 jetzt müssen wir das Filter erweitern.
return devspec2array("group=Fenstersensoren:FILTER=STATE!=close:FILTER=STATE!=closed")
			
			
			
				ok... jetzt sind es nur noch 10 offene Fenster - aktuell immer noch 10 zu viel :-)
Kann ich das direkt folgendermaßen um "Close" erweitern?
devspec2array("group=Fenstersensoren:FILTER=STATE!=close:FILTER=STATE!=Close:FILTER=STATE!=closed")
			
			
			
				Schreib doch den Einzeiler gleich ins notify mit rein...
defmod nty_OffeneFenster notify FENSTER_.*:(open|tilted|closed?) { CommandSet(undef, 'dmy_OffeneFenster '.devspec2array('NAME=FENSTER_.*:FILTER=STATE!=closed?')) }
Und close oder closed sollte mit closed? gehen.
			
			
			
				Zitat von: PingPong am 27 März 2018, 21:01:26
ok... jetzt sind es nur noch 10 offene Fenster - aktuell immer noch 10 zu viel :-)
Kann ich das direkt folgendermaßen um "Close" erweitern?
devspec2array("group=Fenstersensoren:FILTER=STATE!=close:FILTER=STATE!=Close:FILTER=STATE!=closed")
Na dann zeig mal ein list von den anderen Fensterdevices. Wie ist da der STATE? Also das Internal STATE
			
 
			
			
				Du kannst das ganze im übrigen in der Kommandozeile von FHEMWEB mit dem list Befehl testen
Bei mir zum Beispiel
list group=Fenster:FILTER=STATE!=closed:FILTER=STATE!=geschlossen
Und ja man kann es später auch im Notify schreiben wenn man diese Auflistung sonst nicht mehr braucht. Ich zum Beispiel brauche eine Liste aller Fenster die nicht geschlossen sind habe daher eine Funktion in der myUtils welche ich von unterschiedlichen Stellen aufrufe.
			
			
			
				geht noch kürzer
devspec2array("group=Fenstersensoren:FILTER=STATE!=(close|Close|closed)")
			
			
			
				ok...
also das
list group=Fenstersensoren:FILTER=STATE!=closed:FILTER=STATE!=geschlossen
gibt mir genau die 10 Fenster aus... damit kann man vermutlich arbeiten :-)
ok.. ich war faul und hatte vorhin im Rahmen der Umbenennung nur das eine Device aufgeräumt.
Jetzt muss ich aber leider erstmal raus hier. Meine Tochter hat morgen Geburtstag und ich muss noch einiges vorbereiten.
Wenn es Dir nichts ausmacht, bereinige ich dann nachher erstmal noch die anderen Devices, versuche dann hier nochmal ein wenig zu verstehen und melde mich morgen nochmal mit dem aktuellen Stand.
Ich möchte mich an dieser Stelle aber schonmal bedanken, für die Mühe, die Du Dir hier heute mit mir gibst. 
Das finde ich wirklich großartig und außerordentlich. Danke
Dir noch einen schönen Restabend und bis morgen.
VG
Marc
			
			
			
				devspec2array("group=Fenstersensoren:FILTER=STATE!=([Cc]losed?|geschlossen)")  :)
			
			
			
				So, also ich glaube ich hab es  :)
Aktuell wird genau die richtige Anzahl offener Fenster angezeigt.
Werde das jetzt die nächsten Tage einmal beobachten und etwas intensiver testen.
Hier nochmal kurz meine aktuellen Abfragen dokumentiert - vielleicht kann es nochmal jemand gebrauchen...
Nochmal ganz lieben Dank für Eure Mühen und Geduld...
Dummy
Internals:
   NAME       offeneFenster
   NR         305
   STATE      1
   TYPE       dummy
   READINGS:
     2018-03-2
99_myUtils
sub numberOfOpenWindows() {
      return devspec2array("group=Fenstersensoren:FILTER=STATE!=([Cc]losed?|geschlossen)")
}
notify
Fensterkontakt.*([Oo]pen|tilted|[Cc]losed?) { CommandSet(undef, 'offeneFenster ' . numberOfOpenWindows()) }
			
			
			
				Sehr schön
Solltest Du keine Fenster mit Status geschlossen haben, kannst das geschlossen auch entfernen. Das war ja nur ein Beispiel aus meiner Umgebung.
			
			
			
				Ja, ist schon klar. Aber es stört ja auch nicht :-)
Hab aktuell auch kein "tilted".
So.. die nächste Baustelle wartet ... Gerade AMAD eingerichtet.... Ist ja klasse....
Wollte eigentlich meinen EchoDot sprechen lassen, aber da das Tablet eh an der Wand hängt, ... :-)
			
			
			
				Wenn dein echoDot BT zu lässt, verbinde das Tablet doch damit. Dann spricht er. Mache ich mit meinem Google Home auch so.
Freut mich ja das es anscheinend Recht leicht ein zu richten ging  ;D
			
			
			
				Nee, denke dass ich den Dot dann den Kids geben kann... Da reicht dann das Tablet.
Ja, die Einrichtung von AMAD ging wirklich einfach....  :D
			
			
			
				Mal 'ne ganz blöde Frage: Welcher Tür-/Sensor Aktor liefert denn "tilted" ? Ich hab' aktuell erst einen (Hauppauge/Philio 4-in-1 ZWave) im Einsatz und der liefert - soviel ich bisher gesehen habe - nur open und close. Ein Bewegungsende liefert er auch nicht - wenigstens hat er das entsprechende Bit, welches zu setzen wäre bis heute nicht geändert ....
			
			
			
				Der Homematic Fenster-Drehgriff Sensor.
			
			
			
				Homematic hab' ich leider (noch) nicht ... was brauch ich da um Aktoren/Sensoren einzubinden als Minimal-Hardware ?
			
			
			
				https://wiki.fhem.de/wiki/HM-MOD-RPI-PCB_HomeMatic_Funkmodul_für_Raspberry_Pi
Und Sensoren und Aktoren halt. Aber nur rein Homematic kein HomematicIP
			
			
			
				Ich bräuchte was als USB oder LAN, da ich den Pi gerade erst durch einen NUC ersetzt habe
			
			
			
				Dann das HMLan Gateway oder ein USB Cul. Musst Mal im Wiki und Forum suchen.
			
			
			
				ich habe noch den alten weissen USB Adapter am Intel NUC sitzen und in Reserve den HMLAN, falls der USB Adapter die klassische Grätsche macht...!
Ich weiß auch nicht ob es schon ein Ersatz USB gibt der den alten weissen ersetzt, glaube nicht. 
			
			
			
				Hallo,
bei mir funktioniert das ganze mit meinen "Test- Fensterkontakten" Grundsätzlich einwandfrei, allerdings habe ich bei meinen richtigen Fensterkontakten ein kleines Problem mit den Device Namen in Verbindung mit dem erstellen des Notify's.
Meine Fensterkontakte habe ich wie folgt benannt: WZ.Fenster, SZ.Fenster, KU.Fenster usw.
Gibt es eine Möglichkeit, ausser die ganzen Device Namen zu ändern, um ein Notify anzulegen welches auf alle Devices reagiert welche mit .Fenster enden?
Versucht habe ich es bisher mit folgendem Befehl:
define SYS.OpenWindows notify *.Fenster:(open|tilted|closed) { CommandSet(undef,'HOME.OpenWindows ' . numberOfOpenWindows()) }
Allerdings erhalte ich hierbei immer "Bad regexp: starting with *" als Fehler.
Liebe Grüße
Manuel
			
			
			
				
define SYS.OpenWindows notify [A-Z].*.Fenster:(open|tilted|closed) { CommandSet(undef,'HOME.OpenWindows ' . numberOfOpenWindows()) }
			
			
				define SYS.OpenWindows notify .*\.Fenster:(open|tilted|closed) { CommandSet(undef,'HOME.OpenWindows ' . numberOfOpenWindows()) }
Ich glaube den Punkt muss man auch noch escapen.
			
			
			
				Zitat von: CoolTux am 31 März 2019, 00:19:50
define SYS.OpenWindows notify [A-Z].*.Fenster:(open|tilted|closed) { CommandSet(undef,'HOME.OpenWindows ' . numberOfOpenWindows()) }
Ich hänge mich hier auch mal mit an. Den Dummy und die Util hab ich erstellt. Nun sollte ich noch das Notify erstellen. Da es mein erstes ist bin ich mir nicht sicher. Sollte das so aussehen ?
define notifyoffeneFenster notify [A-Z].*_Sensor:(open|tilted|closed) { CommandSet(undef,'offeneFenster ' . numberOfOpenWindows()) }Meine Sensoren liegen alle in der Gruppe Xiaomi und die Sensoren lauten wie folgt. 
ZitatEsszimmer_Sensor
Buero_links_Sensor
usw.
Meine Util sieht so aus :
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}
# Enter you functions below _this_ line.
1;
sub numberOfOpenWindows() {
      return devspec2array("group=Xiaomi:FILTER=STATE!=([Cc]lose?|geschlossen)")EDIT: Ich sehe gerade, ich bekomme dann Probleme mit Türen und Garagentoren. Davon habe ich jeweils 2. Die würden dann die Zahl fälschen, ich würde das gerne auch für Tür und Tor anzeigen lassen. Muss ich diese jetzt umbenennen, oder kann man das noch irgendwie rausfiltern ? Oder ich müsste die umbenennen, FK_Buero,FK_Bad usw. dann TK_Haustuer, TK_Terrasse und das gleiche mit den Toren, GK_gross, und GK_klein. Wäre dann vllt einfacher zu filtern.
Ich müsste dann noch mal 2 Dummys anlegen und 2 weitere Notify's in die Utils muss ich auch noch was eintragen ?
P.S. Was passiert mit meinen Zusammenhängen, wenn ich die Namen ändere ? Ich habe die mit meinen Rollos verbunden zwecks ASC usw. Müsste ich die hier alle neu verbinden miteinander, bzw bei jedem Rollo vom Kontakt die Namen ändern ?
EDIT 2:: 
Also ich habe nun folgendes Notify, bei Dummy wird nun 0 angezeigt und ein TimeStamp. Aber wenn ich Fenster öffne oder schließe, passiert nichts. Es bleibt die 0 drin.
Zitat
 
Internals:
   CFGFN      
   DEF        .*\_Sensor:(open|tilted|close) { CommandSet(undef,'offeneFenster ' . numberOfOpenWindows()) }
   FUUID      5d55c242-f33f-fc62-5f86-2a5b2755d9bd3f56
   NAME       notifyoffeneFenster
   NR         806
   NTFY_ORDER 50-notifyoffeneFenster
   REGEXP     .*\_Sensor:(open|tilted|close)
   STATE      2019-08-15 22:36:39
   TRIGGERTIME 1565901399.68162
   TYPE       notify
   READINGS:
     2019-08-15 22:36:18   state           active
Attributes:
			 
			
			
				Ich habe das mit Monitoring gelöst wie https://forum.fhem.de/index.php?topic=68765.0 (https://forum.fhem.de/index.php?topic=68765.0) vorgeschlagen.
Gleich im ersten Post unter "Globale, flexible Fenster-/Tür-Offen-Meldungen (ähnlich wie im Forum beschrieben)" beschrieben.
Funktioniert bei mir zuverlässig.
Gruß
eurofinder