Hallo zusammen,
ich brauche mal wieder Hilfe. Ich versuche, die Plotabrisse durch die Funktion addLog abzufangen. Leider erhalte ich in allen FHT-Logs die Meldung "invalid readings". Ich vermute, dass in meiner Syntax irgendwo der Wurm steckt, weil ich versuche, alle sechs Devices, die mit "FHT_" anfangen mit einem Befehl zu behandeln jeweils die Temperatur- und Actuatorwerte auszulesen.
define addLog at +*01:00 {addLog("FHT.*","actuator");;addLog("FHZ.*","desired-temp");;addLog("FHT.*","measured-temp");;addLog("Schlafz_Fenster","Window");;addLog("WG_Tuer","Window");;}
attr addLog room 99_System
Wie man an dem Log-Auszug sieht, funktioniert das addLog für die zwei weiteren Einzeldevices "Schlafz_Fenster" und "WG_Tuer", jedoch nicht für die anderen FHZ-Devices, obwohl ich in jedem der sechs Logfiles die "invalid readings"-Einträge stehen habe. Geht das so nicht oder schlägt da wieder meine mangelnde Perl-Kenntnis zu?
2013-11-15_14:08:43 FHT_Wintergarten desired-temp: 20.5
2013-11-15_14:09:49 WG_Tuer Window: Open
2013-11-15_14:18:01 WG_Tuer Window: Open
2013-11-15_14:18:19 FHT_Wintergarten measured-temp: 22.1
2013-11-15_14:22:07 WG_Tuer Window: Open
2013-11-15_14:23:55 FHT_Wintergarten actuator: addLog: invalid reading << addLog
2013-11-15_14:23:56 FHT_Wintergarten measured-temp: addLog: invalid reading << addLog
2013-11-15_14:23:56 WG_Tuer Window: Open << addLog
2013-11-15_14:38:31 WG_Tuer Window: Open
2013-11-15_14:39:23 FHT_Wintergarten measured-temp: 22.0
2013-11-15_14:42:37 WG_Tuer Window: Open
Es wäre super, wenn mir jemand dabei auf die Sprünge helfen könnte.
Danke und Gruß,
Werner
Hallo,
ZitatWie man an dem Log-Auszug sieht, funktioniert das addLog für die zwei weiteren Einzeldevices "Schlafz_Fenster" und "WG_Tuer"
Jep.
Zitatjedoch nicht für die anderen FHZ-Devices
Da kann ich jetzt nur raten das addLog mit regexp nicht klar kommt.
Ich verwende addLog z.B. so:
addLog("Keller_Gaestezimmer_Heizung","desired-temp");;addLog("EG_Eingang_Heizung","desired-temp")
und das sind nur 2 meiner 11 FHT.
Also kurz gesagt: Ich habe meine FHT ausgeschrieben und nicht mit regexp in der Definition.
Grüße
Edith: Grad gesehen. addLog scheint wohl doch mit regexp zurecht zu kommen :o
Versuch mal ohne regexp ob du immer noch den Fehler hast sonst evtl. mal ein update anwerfen.
Edith2: Wobei im Log aber die FHZ.*-Meldungen fehlen und nur die FHT_Wintergarten erscheint.
Hallo,
Ich bin mir nicht sicher ob addLog mit regexp klar kommt. Die in addLog aufgerufene Funktion ReadingsVal unterstützt nämlich keine regexp. Wenn du mit regexp arbeiten willst musst du addLog anpassen, so sollte es funktionieren:
sub
addLog($$) {
my ($logdevice, $reading) = @_; # device and reading to be used
foreach my $l (sort keys %defs) {
if($l=~m/^$logdevice/) {
my $logentry = ReadingsVal($l,$reading,"addLog: invalid reading");
if ($reading =~ m,state,i) {
fhem "trigger $logdevice $logentry << addLog";
} else {
fhem "trigger $logdevice $reading: $logentry << addLog";
}
}
}
}
Grüße,
ChrisD
@ Puschel74
ich bin deinem Rat gefolgt und habe die Langform eingesetzt. Jetzt habe ich alle Einträge korrekt in den Logs. Bei dem FHZ-Eintrag, den du vermisst hattest, hat es sich um einen Tippfehler gehandelt - sorry.
@ ChrisD
ich habe addLog mal entsprechend deinem Listing geändert und bekomme dann folgendes Ergebnis (für jedes FHZ entsprechend):
2013-11-15_20:11:40 WG_Tuer Window: Closed
2013-11-15_20:13:01 FHT_Wintergarten actuator: 100% << addLog
2013-11-15_20:13:01 FHT_Wintergarten actuator: 0% << addLog
2013-11-15_20:13:02 FHT_Wintergarten actuator: 0% << addLog
2013-11-15_20:13:02 FHT_Wintergarten actuator: 2% << addLog
2013-11-15_20:13:02 FHT_Wintergarten actuator: 0% << addLog
2013-11-15_20:13:03 FHT_Wintergarten actuator: 64% << addLog
2013-11-15_20:13:03 FHT_Wintergarten desired-temp: 23.0 << addLog
2013-11-15_20:13:04 FHT_Wintergarten desired-temp: 18.0 << addLog
2013-11-15_20:13:04 FHT_Wintergarten desired-temp: 19.0 << addLog
2013-11-15_20:13:04 FHT_Wintergarten desired-temp: 19.0 << addLog
2013-11-15_20:13:05 FHT_Wintergarten desired-temp: 14.0 << addLog
2013-11-15_20:13:05 FHT_Wintergarten desired-temp: 23.0 << addLog
2013-11-15_20:13:08 FHT_Wintergarten measured-temp: 21.9 << addLog
2013-11-15_20:13:08 FHT_Wintergarten measured-temp: 20.6 << addLog
2013-11-15_20:13:09 FHT_Wintergarten measured-temp: 20.3 << addLog
2013-11-15_20:13:09 FHT_Wintergarten measured-temp: 19.1 << addLog
2013-11-15_20:13:10 FHT_Wintergarten measured-temp: 18.0 << addLog
2013-11-15_20:13:10 FHT_Wintergarten measured-temp: 23.1 << addLog
2013-11-15_20:13:10 WG_Tuer Window: Closed << addLog
Allem Anschein nach werden jetzt die Werte aller FHTs in alle Logfiles eingetragen.
Eigentlich sollten aber nur die Werte eines jeden FHTs in den zugehörigen Logfile eingetragen werden.
Das obige Listing ist nur von einem FHT-Logfile, enthält aber die Werte aller FHTs.
Wenn das nicht sehr aufwendig ist, wäre es nett, wenn du eine entsprechende Änderung noch einbauen könntest.
Ich traue mir dies leider nicht zu, versuche aber gerne durch den Unterschied die Routine zu verstehen.
Wenn aufwendig, kann ich aber auch mit der Version, die Puschel74 vorgeschlagen hat, ganz gut leben.
Euch beiden auf jeden Fall schon mal herzlichen Dank für eure Hilfe.
Gruß, Werner
Hallo,
Du hast Recht, in dem Code ist noch ein Fehler, so sollte es korrekt sein:
sub
addLog($$) {
my ($logdevice, $reading) = @_; # device and reading to be used
foreach my $l (sort keys %defs) {
if($l=~m/^$logdevice/) {
my $logentry = ReadingsVal($l,$reading,"addLog: invalid reading");
if ($reading =~ m,state,i) {
fhem "trigger $l $logentry << addLog";
} else {
fhem "trigger $l $reading: $logentry << addLog";
}
}
}
}
Grüße,
ChrisD
Hallo ChrisD,
nach der Korrektur sieht das Ganze sehr gut aus.
Vielen Dank für die Mühe.
Gruß, Werner
Hallo,
juhuuu - endlich kann ich meine addLog-Definition abspecken ;D
Vielen Dank ChrisD.
Grüße
Hallo,
Ich möchte nur hinzufügen dass in der aktuellen Version regexp nur beim Device möglich ist, beim Attribut geht es (noch) nicht.
{addLog("FHT.*",".*temp")}
ist also nicht möglich.
Grüße,
ChrisD
Hallo,
es macht mir aber bereits einen Unterschied ob ich 33 Einträge habe oder 3 (desired-temp, measured-temp und actuator).
Das (noch) von dir lässt mich (uns) aber hoffen das es bald auf 2 schrumpft :D
Grüße
Edith: Ich habe addLog nun erstmal soweit umgestellt:
addLog {addLog(".*_Heizung","desired-temp");;addLog(".*_Heizung","measured-temp");;addLog(".*_Heizung","actuator")}
Ein
trigger addLog
hat mir das notify OG_Heizung_Bad_Auto getriggert :o
Was hab ich den nun wieder falsch gemacht?
Hallo,
Ich glaube nicht dass du etwas falsch gemacht hast. Versuche die Zeile
if($l=~m/^$logdevice/) {
durch
if($l=~m/^$logdevice$/) {
zu ersetzen. Damit sollte deine regexp funktionieren.
Ich habe die Funktion erweitert, so dass auch regexps bei den Attributen möglich sind, allerdings möchte ich erst mal abwarten ob die obige Änderung den Fehler bei dir behebt.
Grüße,
ChrisD
Hallo,
if($l=~m/^$logdevice$/) {
eingefügt aber nach einem trigger addLog
per sudo nano wieder zurück gebaut da FHEM abgeschmiert ist und nichtmehr starten wollte.
Grüße
Hallo,
Ich sehe den Fehler im Moment nicht. Kannst du die Funktion
sub altest($$) {
my ($logdevice, $reading) = @_; # device and reading to be used
Log 0,"al: $logdevice, $reading";
foreach my $l (sort keys %defs) {
if($l=~m/^$logdevice$/) {
Log 0,"al: $l";
}
}
}
hinzufügen, nach einem Reload mit
{altest(".*_Heizung","desired-temp");;altest(".*_Heizung","measured-temp");;altest(".*_Heizung","actuator")}
aufrufen und mir die Zeilen aus der FHEM-Logdatei die mit al: beginnen zuschicken zur Diagnose ?
Ich befürchte dass deine regexp auf ein anderes Objekt passt (z.B. Filelog) was dann mit der Fehlermeldung "addLog: invalid reading" getriggert wird wodurch es zum Absturz führt. In der erweiterten Version mit regexps für Attribute habe ich das Triggern mit der Fehlermeldung bereits abgeschaltet, stattdessen wird sie in die globale Logdatei geschrieben.
Grüße,
ChrisD
Edit: Hier eine angepasste Version, über einen zusätzlichen optionalen Parameter kann der Loglevel für die Meldung in der globalen Logdatei übergeben werden. Es wird nur noch getriggert wenn das Attribut auch existiert.
sub
addLog($$;$) {
my ($logdevice, $reading,$ll) = @_; # device and reading to be used
$ll=6 if(!defined($ll));
foreach my $l (sort keys %defs) {
if($l=~m/^$logdevice$/) {
my $logentry = ReadingsVal($l,$reading,undef);
if(defined($logentry)) {
if ($reading =~ m,state,i) {
fhem "trigger $l $logentry << addLog";
} else {
fhem "trigger $l $reading: $logentry << addLog";
}
} else {
Log $ll,"addLog: invalid reading $l $reading";
}
}
}
}
Hallo,
Zitat2013.11.17 14:45:18 0: al: .*_Heizung, desired-temp
2013.11.17 14:45:18 0: al: DG_Bad_Heizung
2013.11.17 14:45:18 0: al: DG_Lern_Heizung
2013.11.17 14:45:18 0: al: DG_Schlaf_Heizung
2013.11.17 14:45:18 0: al: EG_Eingang_Heizung
2013.11.17 14:45:18 0: al: EG_Kueche_Heizung
2013.11.17 14:45:18 0: al: EG_WC_Heizung
2013.11.17 14:45:18 0: al: EG_Wohnzimmer_Heizung
2013.11.17 14:45:18 0: al: Keller_Gaestezimmer_Heizung
2013.11.17 14:45:18 0: al: OG_Badezimmer_Heizung
2013.11.17 14:45:18 0: al: OG_Schlafzimmer_Heizung
2013.11.17 14:45:18 0: al: OG_Zimmer_Heizung
2013.11.17 14:45:18 0: al: .*_Heizung, measured-temp
2013.11.17 14:45:18 0: al: DG_Bad_Heizung
2013.11.17 14:45:18 0: al: DG_Lern_Heizung
2013.11.17 14:45:18 0: al: DG_Schlaf_Heizung
2013.11.17 14:45:18 0: al: EG_Eingang_Heizung
2013.11.17 14:45:18 0: al: EG_Kueche_Heizung
2013.11.17 14:45:18 0: al: EG_WC_Heizung
2013.11.17 14:45:18 0: al: EG_Wohnzimmer_Heizung
2013.11.17 14:45:18 0: al: Keller_Gaestezimmer_Heizung
2013.11.17 14:45:18 0: al: OG_Badezimmer_Heizung
2013.11.17 14:45:18 0: al: OG_Schlafzimmer_Heizung
2013.11.17 14:45:18 0: al: OG_Zimmer_Heizung
2013.11.17 14:45:18 0: al: .*_Heizung, actuator
2013.11.17 14:45:18 0: al: DG_Bad_Heizung
2013.11.17 14:45:18 0: al: DG_Lern_Heizung
2013.11.17 14:45:18 0: al: DG_Schlaf_Heizung
2013.11.17 14:45:18 0: al: EG_Eingang_Heizung
2013.11.17 14:45:18 0: al: EG_Kueche_Heizung
2013.11.17 14:45:18 0: al: EG_WC_Heizung
2013.11.17 14:45:18 0: al: EG_Wohnzimmer_Heizung
2013.11.17 14:45:18 0: al: Keller_Gaestezimmer_Heizung
2013.11.17 14:45:18 0: al: OG_Badezimmer_Heizung
2013.11.17 14:45:18 0: al: OG_Schlafzimmer_Heizung
2013.11.17 14:45:18 0: al: OG_Zimmer_Heizung
Etwas spät aber doch 8)
Grüße
Edith: Die angepasste Version löst kein Event mehr aus - perfekt. Danke dir.
Edith1: Zu früh gefreut :(
addLog habe ich so in der Konfig:
addLog {addLog(".*_Heizung","desired-temp");;addLog(".*_Heizung","measured-temp");;addLog(".*_Heizung","actuator");;addLog("EG_.*","state");;
addLog("OG_.*","state");;addLog("DG_.*","state");;addLog("Keller_.*","state");;
addLog("WZ_.*","state");;(".*_Lader","state")}
nach einem
trigger addLog
erhalte ich im Logfile:
Zitat2013.11.17 18:42:12 3: FS20 set OG_Flur_Licht on-for-timer 5
2013.11.17 18:42:13 3: FS20 set OG_Zimmer_Ventilator on-for-timer 1920
2013.11.17 18:42:14 3: FS20 set OG_Badezimmer_Ventilator on-for-timer 1920
2013.11.17 18:42:17 3: FS20 set WZ_Deckenlicht off
2013.11.17 18:42:17 3: FS20 set WZ_Fernsehlicht off
Danke für die Daten aus der Logdatei, ich habe aber leider den Fehler nicht finden können und sehe im Moment auch nicht wo er sein könnte.
Was die zusätzlichen FS20-Einträge betrifft, so ist mir nicht klar wo sie herkommen. Der Aufruf addLog("OG_.*","state") passt u.a. auf das Device OG_Flur_Licht, in addLog wird der aktuelle Zustand abgefragt (on-for-timer 5) und erneut getriggert. Die dabei verwendete Funktion 'trigger' sollte aber den Aktor nicht schalten und keinen Eintrag in die Logdatei einfügen.
Erhältst du auch einen Eintrag wenn du in der Kommandezeile von FHEM{addLog("OG_Flur_Licht","state")}
eingibst ?
Hast du notifys auf den Geräten ?
In deiner Definition vom addLog fehlt im letzten Ausdruck ((".*_Lader","state")) ein addLog, dies sollte aber nicht der Grund für das merkwürdige Verhalten sein.
Grüße,
ChrisD
Hallo,
ZitatErhältst du auch einen Eintrag wenn du in der Kommandezeile von FHEM
Nein.
Wenn ich die state-Abfragen in addLog in der Langform verwende, also OG_Zimmer_Licht oder OG_Flur_Licht, dann werden die Stati mit addLog abgefragt aber das Device nicht getriggert.
Erst wenn ich OG_.* verwende werden im Obergeschoss die Geräte geschaltet.
Selbiges auch im Wohnzimmer (WZ_.*).
ZitatHast du notifys auf den Geräten ?
Die Geräte sind alle in notifys eingebaut.
Im Obergeschoss weiss ich auswendig das ich ein notify auf OG_Flur_Bewegungsmelder habe welches mir das das Licht im Flur mit on-for-timer einschaltet.
Ein weiteres notify reagiert auf einen S300TH (OG_Badezimmer) welcher mir bei überschreiten der Luftfeuchte die Ventilatoren (OG_Badezimmer_Ventilator und OG_Zimmer_Ventilator) mit einem on-for-timer einschaltet.
ZitatIn deiner Definition vom addLog fehlt im letzten Ausdruck ((".*_Lader","state")) ein addLog
Jep. Ist mir durch die Lappen gegangen.
Grüsse
Hallo,
Das Schalten der Aktoren kommt wahrscheinlich von den notifys. Zumindest beim Bewegungsmelder OG_Flur_Bewegungsmelder führt ein addLog("OG_.*","state") dazu dass der aktuelle Wert erneut getriggert wird und dadurch die notifys auch erneut ausgeführt werden. Wenn du {addLog("OG_Flur_Bewegungsmelder","state")}
eingibst sollte dies auch zum Schalten des Aktors führen.
Eine Möglichkeit dies zu verhindern ist das notify so anzupassen dass es nichts macht wenn der Text '<< addLog' im Event enthalten ist. Wenn dein notify so aussieht:define n_OG_Flur_Licht notify OG_Flur_Bewegungsmelder:on.* set OG_Flur_Licht on-for-timer 5
sollte dies funktionieren:define n_OG_Flur_Licht notify OG_Flur_Bewegungsmelder:on.*(?<!addLog) set OG_Flur_Licht on-for-timer 5
Kannst du die Definition des notifys auf OG_Flur_Bewegungsmelder posten ?
Grüße,
ChrisD
Hallo,
ZitatKannst du die Definition des notifys auf OG_Flur_Bewegungsmelder posten ?
Bitteschön:
define OG_Flur_Licht notify OG_Bewegungsmelder_Flur_Bad:on.* {
Ich werd mal deinen Vorschlag ausprobieren.
Danke schonmal für die Hilfe.
Grüße
Edith: Mal 2 Screenshots dabei - erklären wäre etwas schwierig.
Erster Screenshot ist das (beinahe) komplette notify mit Code und am zweiten Screenshot was in FHEM nach einfügen von (?<!addLog) übrig bleibt.
Hallo,
Das Ganze ist nur ein kosmetisches Problem, wenn du auf DEF klickst wird der Code korrekt angezeigt. Das Problem tritt generell beim Verwenden von '<' (und diversen anderen Zeichen) auf da es im HTML-Code nicht durch < ersetzt wird. Für den Browser ist es somit ein HTML-Tag welches mit <addLog beginnt. Das Anzeigeergebnis ist wahrscheinlich abhängig vom Browser.
Für die korrekte Darstellung muss 01_FHEMWEB geändert werden. In der Version 4251 ist es in Zeile 1923:
FW_pO "<div class=\"dval\" id=\"disp\">$eval</div>";
müsste in
FW_pO "<div class=\"dval\" id=\"disp\">".FW_htmlEscape($eval)."</div>";
geändert werden. Da ich aber nicht weiß ob diese keine anderen Nebenwirkungen hat solltest du dies besser mit dem Entwickler abklären.
Grüße,
ChrisD
Hallo,
sorry für die etwas späte Rückmeldung aber
ZitatWenn du
{addLog("OG_Flur_Bewegungsmelder","state")}
eingibst sollte dies auch zum Schalten des Aktors führen.
So habe ich das für alle Device im addLog definiert (also die Langform) und das notify wird eben nicht getriggert.
Ok. Nur bei dem einen hab ich es nicht versucht aber bis auf die Heizung hab ich momentan noch alle "state"-Abfragen in Langform definiert da ja eben die notify "zünden" wenn ich ein
trigger addLog
abschicke.
Ich habe vorhin mal deinen Vorschlag "durchgezogen" und bei einem notify
(?<!addLog)
eingetragen.
Das notify sah dann so aus:
define OG_Flur_on notify OG_Flur_Bewegungsmelder:on.*(?<!addLog) {
und nach Eingabe von
trigger addLog
habe ich das vorgefunden (siehe Screenshot).
addLog ist zu diesme Zeitpunkt so angelegt gewesen:
addLog {addLog(".*_Heizung","desired-temp");;addLog(".*_Heizung","measured-temp");;addLog(".*_Heizung","actuator");;addLog("EG_.*","state");;addLog("OG_.*","state");;addLog("DG_.*","state");;addLog("WZ_.*","state");;addLog(".*_Lader","state");;addLog("Ladestation_.*","state")}
Nun bin ich grad meinen Versuchs RasPi am umschreiben und ein paar notify am erstellen die auf einen Dummy "lauschen" um dann zu schauen was passiert.
Wenn noch Ideen rumschwirren dann bitte nur her damit.
Grüße
Hallo,
Ich habe mir den Code noch einmal genauer angesehen, kann aber den Grund für das von dir beobachtete Verhalten nicht finden.
Der Zusatz (?<!addLog) ist Bestandteil der Regexp und führt dazu dass das notify nicht ausgeführt wird wenn im Event der Text addLog enthalten ist. Wie der Text in den state vom S300TH gelangt ist weiß ich nicht.
Kannst du die Funktion altest durch diese ersetzen:
sub altest($$) {
my ($logdevice, $reading) = @_; # device and reading to be used
Log 0,"al: $logdevice, $reading";
foreach my $l (sort keys %defs) {
if($l=~m/^$logdevice$/) {
my $logentry = ReadingsVal($l,$reading,undef);
Log 0,"al: $l - ".defined($logentry)." - $defs{$l}{TYPE}";
}
}
}
und die Ausgabe des Aufrufes
{altest("OG_.*","state")}
aus der FHEM-Logdatei posten ?
Grüße,
ChrisD
Hallo,
und mal wieder sorry für der späte Rückmeldung.
Unter der Woche hab ich selten bis keine Zeit um an meiner Installation zu "schrauben".
Anbei der Logauswurf:
Zitat2013.12.06 22:41:58 0: al: OG_.*, state
2013.12.06 22:41:58 0: al: OG_Bad_hum - 1 - dummy
2013.12.06 22:41:58 0: al: OG_Bad_hum_last - 1 - dummy
2013.12.06 22:41:58 0: al: OG_Badezimmer - 1 - CUL_WS
2013.12.06 22:41:58 0: al: OG_Badezimmer_Fenster - - CUL_FHTTK
2013.12.06 22:41:58 0: al: OG_Badezimmer_Heizung - 1 - FHT
2013.12.06 22:41:58 0: al: OG_Badezimmer_Heizung_Ventil - - notify
2013.12.06 22:41:58 0: al: OG_Badezimmer_Tuer - - CUL_FHTTK
2013.12.06 22:41:58 0: al: OG_Badezimmer_Ventil - 1 - dummy
2013.12.06 22:41:58 0: al: OG_Badezimmer_Ventilator - 1 - FS20
2013.12.06 22:41:58 0: al: OG_Badezimmer_Ventilator_automatisch - - notify
2013.12.06 22:41:58 0: al: OG_Bewegungsmelder_Flur_Bad - 1 - FS20
2013.12.06 22:41:58 0: al: OG_Flur_Licht - 1 - FS20
2013.12.06 22:41:58 0: al: OG_Flur_on - - notify
2013.12.06 22:41:58 0: al: OG_Gang_Dunkel - 1 - FS20
2013.12.06 22:41:58 0: al: OG_Gang_Hell - - FS20
2013.12.06 22:41:58 0: al: OG_Gang_Hell_Dunkel_Pruef - - notify
2013.12.06 22:41:58 0: al: OG_Heizung_Bad - 1 - FS20
2013.12.06 22:41:58 0: al: OG_Heizung_Bad_An - - notify
2013.12.06 22:41:58 0: al: OG_Heizung_Bad_Auto - - notify
2013.12.06 22:41:58 0: al: OG_Heizung_Bad_Auto_An - - at
2013.12.06 22:41:58 0: al: OG_Heizung_Bad_onoff - - notify
2013.12.06 22:41:58 0: al: OG_Licht_Gang - 1 - dummy
2013.12.06 22:41:58 0: al: OG_Schlaf_Charly - 1 - FS20
2013.12.06 22:41:58 0: al: OG_Schlaf_Licht - 1 - FS20
2013.12.06 22:41:58 0: al: OG_Schlaf_Roli - 1 - FS20
2013.12.06 22:41:58 0: al: OG_Schlafzimmer - 1 - CUL_WS
2013.12.06 22:41:58 0: al: OG_Schlafzimmer_Fenster - - CUL_FHTTK
2013.12.06 22:41:58 0: al: OG_Schlafzimmer_Heizung - 1 - FHT
2013.12.06 22:41:58 0: al: OG_Schlafzimmer_Heizung_Ventil - - notify
2013.12.06 22:41:58 0: al: OG_Schlafzimmer_Tuer - - CUL_FHTTK
2013.12.06 22:41:58 0: al: OG_Schlafzimmer_Ventil - 1 - dummy
2013.12.06 22:41:58 0: al: OG_Ventilator_Aus - - FS20
2013.12.06 22:41:58 0: al: OG_Ventilator_Ein - 1 - FS20
2013.12.06 22:41:58 0: al: OG_Ventilatoren_off - - notify
2013.12.06 22:41:58 0: al: OG_Ventilatoren_on - - notify
2013.12.06 22:41:58 0: al: OG_ZimmerHeizung_addLog - - at
2013.12.06 22:41:58 0: al: OG_Zimmer_Fenster - - CUL_FHTTK
2013.12.06 22:41:58 0: al: OG_Zimmer_Heizung - 1 - FHT
2013.12.06 22:41:58 0: al: OG_Zimmer_Heizung_Ventil - - notify
2013.12.06 22:41:58 0: al: OG_Zimmer_Rollo - 1 - FS20
2013.12.06 22:41:58 0: al: OG_Zimmer_Rollo_50 - - notify
2013.12.06 22:41:58 0: al: OG_Zimmer_Rollo_75 - - notify
2013.12.06 22:41:58 0: al: OG_Zimmer_Rollo_Ab - - notify
2013.12.06 22:41:58 0: al: OG_Zimmer_Rollo_Auf - - notify
2013.12.06 22:41:58 0: al: OG_Zimmer_Rollo_Taster - - FS20
2013.12.06 22:41:58 0: al: OG_Zimmer_Ventil - 1 - dummy
2013.12.06 22:41:58 0: al: OG_Zimmer_Ventilator - 1 - FS20
2013.12.06 22:41:58 0: al: OG_Zimmer_Ventilator_Zeit - 1 - FS20
2013.12.06 22:41:58 0: al: OG_Zimmer_Ventilator_on - - notify
Grüße
Hallo,
Danke für die Daten. Ich befürchte dass es keine einfache Lösung für das Problem gibt. Die Regexp OG_.*,state triggert wahrscheinlich diverse Notifys welche dann die von dir beobachteten Schaltvorgänge auslösen. Folgende Geräte werden bei OG_.* getriggert:
ZitatOG_Bad_hum
OG_Bad_hum_last
OG_Badezimmer
OG_Badezimmer_Heizung
OG_Badezimmer_Ventil
OG_Badezimmer_Ventilator
OG_Bewegungsmelder_Flur_Bad
OG_Flur_Licht
OG_Gang_Dunkel
OG_Heizung_Bad
OG_Licht_Gang
OG_Schlaf_Charly
OG_Schlaf_Licht
OG_Schlaf_Roli
OG_Schlafzimmer
OG_Schlafzimmer_Heizung
OG_Schlafzimmer_Ventil
OG_Ventilator_Ein
OG_Zimmer_Heizung
OG_Zimmer_Rollo
OG_Zimmer_Ventil
OG_Zimmer_Ventilator
OG_Zimmer_Ventilator_Zeit
Rufst du im Moment für jedes dieser Geräte addLog (mit state) einzeln auf ?
Eine Möglichkeit wäre beim Aufruf der addLog-Funktion sämtliche Notifys zu deaktivieren, die Trigger abzusetzen und die Notifys wieder zu aktivieren. Nachteil ist hierbei dass Events die während der Ausführung der Funktion eintreffen keine Notifys auslösen da diese abgeschaltet sind.
Ein weitere Möglichkeit wäre die Geräte bei denen ein addLog gewünscht ist zu markieren, z.B. durch einen Eintrag im Kommentarfeld. So könnte die Regexp weiterhin benutzt werden, allerdings würden nur die Geräte getriggert bei denen zusätzlich eine Markierung vorhanden ist.
Grüße,
ChrisD
Hallo,
ZitatRufst du im Moment für jedes dieser Geräte addLog (mit state) einzeln auf ?
Ja. Momentan sieht mein addLog so aus:
addLog {addLog(".*_Heizung","desired-temp");;addLog(".*_Heizung","measured-temp");;addLog(".*_Heizung","actuator");;addLog("EG_Eingang_Licht_innen","state");;addLog("OG_Badezimmer_Ventilator","state");;addLog("OG_Flur_Licht","state");;addLog("OG_Zimmer_Ventilator","state");;addLog("OG_Bewegungsmelder_Flur_Bad","state");;addLog("Ladestation_GZ","state");;addLog("Ladestation_Bar","state");;addLog("EG_Eingang_Bewegungsmelder","state");;addLog("EG_Vorraum_Licht","state");;addLog("Laptop_Lader","state");;addLog("Tablet_Lader","state");;addLog("WZ_Deckenlicht","state");;addLog("WZ_Fensterbeleuchtung","state");;addLog("WZ_Fernsehlicht","state");;addLog("DG_Bad_LED","state");;addLog("DG_Bad_Licht","state");;addLog("DG_Bad_Schmink","state");;addLog("DG_Bad_Ventilator","state");;addLog("DG_Lern_Licht","state");;addLog("DG_Schlaf_Halogen","state");;addLog("DG_Schlaf_LED","state");;addLog("DG_Schlaf_Licht","state");;addLog("DG_Schlaf_Ventilator","state")}
Und hier werden die notify eben nicht getriggert daher ging ich davon aus das es auch mit dem regexp klappen sollte und war etwas irritiert das im Badezimmer der Ventilator losgelaufen ist und das Licht angegangen ist.
Eigenartigerweise habe ich auch notifys auf die FHT-Ventilstellung (actuator) und diese triggern aber anscheinend auch nicht :o
Danke schonmal für deine Geduld ;D
Grüße
Hallo,
Hier kommt eine weitere Version die zuerst alle Notifys abschaltet bevor getriggert wird. Meine Aussage im vorherigen Beitrag
ZitatNachteil ist hierbei dass Events die während der Ausführung der Funktion eintreffen keine Notifys auslösen da diese abgeschaltet sind.
ist falsch, zumindest solange wie alles in einem Thread abläuft.
Ich habe die Funktion umbenannt um sie in Ruhe testen zu können:
sub
addLogN($$;$) {
my ($logdevice, $reading,$ll) = @_; # device and reading to be used
$ll=6 if(!defined($ll));
my @no=devspec2array("TYPE=notify");
foreach(@no) {
my $da=AttrVal($_,"disable",-1);
if ($da<=0) {
$attr{$_}{disable}=1;
$defs{$_}->{addLog}=$da;
}
}
foreach my $l (sort keys %defs) {
if($l=~m/^$logdevice$/) {
my $logentry = ReadingsVal($l,$reading,undef);
if(defined($logentry)) {
if ($reading =~ m,state,i) {
Log $ll,"addLog: trigger $l $logentry << addLog";
fhem "trigger $l $logentry << addLog";
} else {
Log $ll,"addLog: trigger $l $reading: $logentry << addLog";
fhem "trigger $l $reading: $logentry << addLog";
}
} else {
Log $ll,"addLog: invalid reading $l $reading";
}
}
}
@no=devspec2array("TYPE=notify");
foreach(@no) {
if(defined($defs{$_}->{addLog})) {
if($defs{$_}->{addLog}==-1) {
delete($attr{$_}{disable});
} else {
$attr{$_}{disable}=0;
}
delete($defs{$_}->{addLog});
}
}
}
Zum Testen kannst du
{addLogN("OG_.*","state")}
verwenden. Dabei sollten keine Events mehr ausgelöst werden.
Grüße,
ChrisD
Hallo,
die notifys "zünden" nicht mehr aber ...
siehe Screenshot
Mit dem nächsten übermitteln der Werte ist dann wieder alles normal.
siehe 2. Screenshot und 3. Screenshot
So wie ich gesehen habe sind aber nur die CUL_WS betroffen.
Ich starte nochmal einen Test mit den CUL_WS im Keller.
Danke nochmal für Deine Hilfe.
Grüße
Hallo,
Bei meinen CUL_WS tritt der Effekt nicht auf, verwendest du bei den CUL_WS die Attribute stateFormat oder eventMap ? Wenn ja kannst du die Definition davon posten ?
Grüße,
ChrisD
Hallo,
eventMap bei einem CUL_WS?
Nein.
Eigentlich verwende ich nur event-on-change-reading - siehe Screenshot.
Grüße
Hallo,
Kannst du diese Version ausprobieren:
sub
addLogN($$;$) {
my ($logdevice, $reading,$ll) = @_; # device and reading to be used
$ll=6 if(!defined($ll));
my @no=devspec2array("TYPE=notify");
foreach(@no) {
my $da=AttrVal($_,"disable",-1);
if ($da<=0) {
$attr{$_}{disable}=1;
$defs{$_}->{addLog}=$da;
}
}
foreach my $l (sort keys %defs) {
if($l=~m/^$logdevice$/) {
my $logentry = ReadingsVal($l,$reading,undef);
if(defined($logentry)) {
if ($reading =~ m,state,i) {
Log $ll,"addLog: trigger $l $logentry << addLog";
fhem "trigger $l $logentry";
} else {
Log $ll,"addLog: trigger $l $reading: $logentry << addLog";
fhem "trigger $l $reading: $logentry << addLog";
}
} else {
Log $ll,"addLog: invalid reading $l $reading";
}
}
}
@no=devspec2array("TYPE=notify");
foreach(@no) {
if(defined($defs{$_}->{addLog})) {
if($defs{$_}->{addLog}==-1) {
delete($attr{$_}{disable});
} else {
$attr{$_}{disable}=0;
}
delete($defs{$_}->{addLog});
}
}
}
Sie hängt den Zusatz '<< addLog' nicht an wenn 'state' getriggert wird.
Grüße,
ChrisD
Hallo,
auch wenn hier lang nichts mehr passiert ist.
Wäre es möglich, addlog den devicetyp beizubiegen ? (zb. TYPE=FHT)?
So wie ich das sehe, benutzen die meisten Addlog doch um zb. bei FHTs die desired-temp zu loggen oder ähnliches ...
Liebe grüsse aus Dinslaken
Hallo,
Eine Version von addLog mit Device-Typ könnte so aussehen:
sub
addLogD2A($$) {
my ($devspec, $reading) = @_; # device and reading to be used
my @no=devspec2array($devspec);
foreach my $l (@no) {
if(defined($defs{$l})) {
my $logentry = ReadingsVal($l,$reading,"addLog: invalid reading");
if ($reading =~ m,state,i) {
fhem "trigger $l $logentry << addLog";
} else {
fhem "trigger $l $reading: $logentry << addLog";
}
}
}
}
Aufrufen kannst du sie z.B. mit
{addLog("TYPE=FHT","measured-temp")}
Grüße,
ChrisD