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