Ich würde gerne den Zustand des Heizungsbrenners protokollieren (on|off), anhand eines 18b20 i2c Thermometers (das steckt im Abgasrohr).
Für den Zustand habe ich ein Dummy Device angelegt (BRENNER_STATUS, mit zwei Readings: last für den letzten Temperaturwert und state für den Zustand selbst on|off).
Protokolliert werden sollen Zustandsänderung in der logdb. Um nicht alles zu loggen hatte ich einen Regexp gesetzt:
REGEXP .*:(temperature|valveposition|humidity)
Ich würde gerne diesen Regex erweitern, sodass auch der BRENNER_STATUS geloggt wird, in etwa:
REGEXP (.*:(temperature|valveposition|humidity)|.*BRENNER_STATUS.*:state)
Dann loggt das System aber gar nichts mehr, also stimmt die Syntax oder die Einträge nicht.
Derzeit gelöst habe ich es jetzt so, dass ich alles logge
REGEXP .*:.*
und mittels DbLogExclude dann in jedem Device alles deaktiviert, was nicht geloggt werden soll.
Schöner wäre es wenn es mittels des zentralen Regex funktioniert.
Der Eintrag in der DB sieht dann so aus:
2015-09-17 20:30:51|BRENNER_STATUS|DUMMY|off|state|off|
Internals:
CFGFN
NAME BRENNER_STATUS
NR 390
STATE off
TYPE dummy
Readings:
2015-09-17 19:16:25 last 29.5
2015-09-17 18:49:54 state off
Attributes:
devStateIcon on:Heizung_Hauptschalter.on off:Heizung_Hauptschalter.off
room Brenner
userReadings last
Internals:
CONFIGURATION ./db.conf
DBMODEL SQLITE
DEF ./db.conf (.*:(temperature|valveposition|humidity)|.*BRENNER_STATUS.*:state)
NAME logdb
NR 34
NTFY_ORDER 50-logdb
PID 5811
REGEXP (.*:(temperature|valveposition|humidity)|.*BRENNER_STATUS.*:state)
STATE connected
TYPE DbLog
dbconn SQLite:dbname=/opt/fhem/fhem.db
dbuser
Readings:
2015-09-17 18:36:37 state connected
Attributes:
Internals:
CFGFN
DEF TempEmission:temperature:.* {
Log 3,"Brennerstatus";
my $threshold = 4;
my ($emission, $emission_last, $status) = (
ReadingsVal("TempEmission","temperature",0),
ReadingsVal("BRENNER_STATUS","last",0),
Value("BRENNER_STATUS")||"off"
);
my $time_diff = time()-time_str2num(ReadingsTimestamp("BRENNER_STATUS","last",0));
my $delta = $emission - $emission_last;
if ($time_diff > 60 || abs($delta) > $threshold) {
fhem("setreading BRENNER_STATUS last $emission");
} elsif ($status eq "on" && $delta > 0) {
fhem("setreading BRENNER_STATUS last $emission");
}
if ($delta > $threshold && $status eq "off") { fhem("setreading BRENNER_STATUS state on") }
elsif ($emission < $emission_last && $status eq "on") { fhem("setreading BRENNER_STATUS state off") }
Log 3,"Emission: $emission, $emission_last, $delta, $status, ".Value("BRENNER_STATUS");
}
NAME Brenner
NOTIFYDEV TempEmission
NR 347
NTFY_ORDER 50-Brenner
REGEXP TempEmission:temperature:.*
STATE 2015-09-17 19:16:25
TYPE notify
Readings:
2015-09-17 19:12:01 state active
Attributes:
room Brenner
DB-Werte für TempEmission (Abgastemperatur):
2015-09-17 15:48:53|TempEmission|GPIO4|temperature: 30.5|temperature|30.5|°C
2015-09-17 16:01:16|TempEmission|GPIO4|temperature: 28.5|temperature|28.5|°C
2015-09-17 17:03:43|TempEmission|GPIO4|temperature: 30.875|temperature|30.875|°C
2015-09-17 17:03:51|TempEmission|GPIO4|temperature: 34.187|temperature|34.187|°C
2015-09-17 17:03:59|TempEmission|GPIO4|temperature: 37.5|temperature|37.5|°C
2015-09-17 17:04:08|TempEmission|GPIO4|temperature: 40|temperature|40|°C
2015-09-17 17:04:21|TempEmission|GPIO4|temperature: 42.125|temperature|42.125|°C
2015-09-17 17:04:37|TempEmission|GPIO4|temperature: 44.562|temperature|44.562|°C
2015-09-17 17:04:49|TempEmission|GPIO4|temperature: 46.812|temperature|46.812|°C
2015-09-17 17:05:06|TempEmission|GPIO4|temperature: 49.062|temperature|49.062|°C
2015-09-17 17:05:22|TempEmission|GPIO4|temperature: 51.125|temperature|51.125|°C
2015-09-17 17:05:42|TempEmission|GPIO4|temperature: 53.375|temperature|53.375|°C
2015-09-17 17:06:01|TempEmission|GPIO4|temperature: 55.625|temperature|55.625|°C
2015-09-17 17:06:27|TempEmission|GPIO4|temperature: 58|temperature|58|°C
2015-09-17 17:06:54|TempEmission|GPIO4|temperature: 60.25|temperature|60.25|°C
2015-09-17 17:07:23|TempEmission|GPIO4|temperature: 62.312|temperature|62.312|°C
2015-09-17 17:08:06|TempEmission|GPIO4|temperature: 64.375|temperature|64.375|°C
2015-09-17 17:09:03|TempEmission|GPIO4|temperature: 66.375|temperature|66.375|°C
2015-09-17 17:10:14|TempEmission|GPIO4|temperature: 68.375|temperature|68.375|°C
2015-09-17 17:11:49|TempEmission|GPIO4|temperature: 70.375|temperature|70.375|°C
2015-09-17 17:12:35|TempEmission|GPIO4|temperature: 67.562|temperature|67.562|°C
2015-09-17 17:12:44|TempEmission|GPIO4|temperature: 65.312|temperature|65.312|°C
2015-09-17 17:12:55|TempEmission|GPIO4|temperature: 62.625|temperature|62.625|°C
2015-09-17 17:13:07|TempEmission|GPIO4|temperature: 60.375|temperature|60.375|°C
2015-09-17 17:13:23|TempEmission|GPIO4|temperature: 57.875|temperature|57.875|°C
2015-09-17 17:13:39|TempEmission|GPIO4|temperature: 55.812|temperature|55.812|°C
2015-09-17 17:13:59|TempEmission|GPIO4|temperature: 53.75|temperature|53.75|°C
2015-09-17 17:14:26|TempEmission|GPIO4|temperature: 51.687|temperature|51.687|°C
2015-09-17 17:14:56|TempEmission|GPIO4|temperature: 49.687|temperature|49.687|°C
2015-09-17 17:15:36|TempEmission|GPIO4|temperature: 47.625|temperature|47.625|°C
2015-09-17 17:16:24|TempEmission|GPIO4|temperature: 45.625|temperature|45.625|°C
2015-09-17 17:17:24|TempEmission|GPIO4|temperature: 43.562|temperature|43.562|°C
2015-09-17 17:18:50|TempEmission|GPIO4|temperature: 41.5|temperature|41.5|°C
2015-09-17 17:20:32|TempEmission|GPIO4|temperature: 39.5|temperature|39.5|°C
2015-09-17 17:22:32|TempEmission|GPIO4|temperature: 37.437|temperature|37.437|°C
2015-09-17 17:25:06|TempEmission|GPIO4|temperature: 35.437|temperature|35.437|°C
2015-09-17 17:28:16|TempEmission|GPIO4|temperature: 33.437|temperature|33.437|°C
2015-09-17 17:35:16|TempEmission|GPIO4|temperature: 31.375|temperature|31.375|°C
Derzeit gelöst habe ich es jetzt so, dass ich alles logge
REGEXP .*:.*
und mittels DbLogExclude dann in jedem Device alles deaktiviert, was nicht geloggt werden soll.
Schöner wäre es wenn es mittels des zentralen Regex funktioniert.
Ist somit dann kein spezielles Problem mit dem Dummy Device sondern nur noch ein Problem des Aufgabaus vom REGEXP der dblog.
Hallo TSB,
du kannst das reading 'state' nicht filtern, am besten hierzu einfach beobachten was dir der Event-Monitor anzeigt, und davon ausgehend die RegExp bauen.
d.H. Deine RegEx muss so aussehen:
(.*:(temperature|valveposition|humidity).*|BRENNER_STATUS:.*)
oder alternativ für bestimmte zustände vom reading 'state' beim Br.Status:
(.*:(temperature|valveposition|humidity).*|BRENNER_STATUS:(on|off))
Gruß
Claudiu