Invert event-on-update-reading

Begonnen von Virsacer, 08 August 2015, 23:20:13

Vorheriges Thema - Nächstes Thema

Virsacer

Hey, ich würde gerne bei mehreren Devices ein Reading von den Events ausschließen.

Aber statt bei jedem Device alle anderen Readings in "event-on-update-reading" aufzulisten, müsste es doch auch möglich sein, die Regex zu invertieren?
Zitat von: Virsacer am 07 August 2015, 23:42:32Also irgendwie so in der Art: (?!aesCommToDev)
Leider wird dann überhaupt kein Event mehr ausgelöst :/

Ellert

Ich denke der reguläre Ausdruck müsste eine Liste zurückgeben mit allen Readings, die noch ein Ereignis erzeugen sollen.

Wenn a,b,c alle Readings eines Devices sind und b kein Ereignis erzeugen soll, dann muss Regex(b) a,c als a|c zurückgeben. Ob das durch Invertieren zu erreichen ist, halte ich für fraglich. Woraus sollte Regex(b) a und c ableiten?

Sunny

Moin Virsacer,

es ist wohl nicht, das was Du suchst.  ;)

Ich habe es für mich z.B. so:define Geschirr FBDECT hh_FB7390_AHA:20000 switch
attr Geschirr IODev hh_FB7390_AHA
attr Geschirr event-min-interval Volt:600,powerFactor:0,energy:900
attr Geschirr event-on-change-reading Watt,energy,Ampere,state,
attr Geschirr event-on-update-reading Volt,energy

gelöst.

Und in meiner DBLog, taucht kein Reading "powerFactor" auf...

Viele Grüße
Sunny
FHEM 6.0 (RPi's 1b-4,CeleronM,Odroid C1+)
1-Wire (DS18B20,DS2406) |miniCUL|miniCUL868WLAN|HM|IT(-1500,LR-3500) |FB6591,FB7490,FB7580|DECT200|Powerline546E|520E|openwrt
Anfänger: Linux,FHEM+Perl

Virsacer

Zitat von: Ellert am 12 August 2015, 18:03:39
Ich denke der reguläre Ausdruck müsste eine Liste zurückgeben mit allen Readings, die noch ein Ereignis erzeugen sollen.

Wenn a,b,c alle Readings eines Devices sind und b kein Ereignis erzeugen soll, dann muss Regex(b) a,c als a|c zurückgeben. Ob das durch Invertieren zu erreichen ist, halte ich für fraglich. Woraus sollte Regex(b) a und c ableiten?
Eine Liste zurückgeben? Der Reguläre Ausdruck wird doch auf die gerade stattfindenden Events gematcht, ob diese propagiert werden sollen!?
Und eigentlich sollte der doch auch auf alles passen, was nicht durch das negative lookahead explizit ausgenommen wird...

Zitat von: Sunny am 12 August 2015, 20:36:27
es ist wohl nicht, das was Du suchst.  ;)

Ich habe es für mich z.B. so:define Geschirr FBDECT hh_FB7390_AHA:20000 switch
attr Geschirr IODev hh_FB7390_AHA
attr Geschirr event-min-interval Volt:600,powerFactor:0,energy:900
attr Geschirr event-on-change-reading Watt,energy,Ampere,state,
attr Geschirr event-on-update-reading Volt,energy

gelöst.

Und in meiner DBLog, taucht kein Reading "powerFactor" auf...
Ja, ich wollte halt die Logik umkehren, sodass ich nur die aufliste, die nicht zu einem Event führen sollen, anstatt bei jedem Device n-1 viele einzugeben, die dann noch bei jedem unterschiedlich sind/sein können...
...oder sich gar noch erweitern können, ohne dass man es mitbekommt :-\

Sunny

Moin Virsacer,

Zitat von: Virsacer am 12 August 2015, 22:22:07
... sodass ich nur die aufliste, die nicht zu einem Event führen sollen, ...
Schau Dir doch mal:
http://www.fhemwiki.de/wiki/DbLog#Einschr.C3.A4nkung_.C3.BCber_die_jeweiligen_Devices
an.

Vielleicht kommst Du damit zum Ziel. ;)

Viele Grüße
Sunny
FHEM 6.0 (RPi's 1b-4,CeleronM,Odroid C1+)
1-Wire (DS18B20,DS2406) |miniCUL|miniCUL868WLAN|HM|IT(-1500,LR-3500) |FB6591,FB7490,FB7580|DECT200|Powerline546E|520E|openwrt
Anfänger: Linux,FHEM+Perl

chris1284

Zitat von: Sunny am 12 August 2015, 20:36:27
Und in meiner DBLog, taucht kein Reading "powerFactor" auf...
dafür gibt es extra  DbLogExclude und DbLogInclude

Ellert

Ja, ich hatte mehr an eine Funktion gedacht die das Attribut event-on-change-reading mit einem regulären Ausdruck beschreibt.

Ich beschäftige mich erst kurz mit regulären Ausdrücken und bin heute morgen auf die Möglichkeit gestossen Zeichenklassen zu negieren, das könnte für Dein Beispiel vielleicht so aussehen:

.*[^a][^e][^s][^C][^o][^m][^m][^T][^o][^D][^e][^v].*

Virsacer

Zitat von: Sunny am 12 August 2015, 23:34:33
Schau Dir doch mal:
http://www.fhemwiki.de/wiki/DbLog#Einschr.C3.A4nkung_.C3.BCber_die_jeweiligen_Devices
an.

Vielleicht kommst Du damit zum Ziel. ;)
Danke, aber hilft mir nicht wirklich weiter...

Zitat von: Ellert am 13 August 2015, 10:05:24
Ja, ich hatte mehr an eine Funktion gedacht die das Attribut event-on-change-reading mit einem regulären Ausdruck beschreibt.

Ich beschäftige mich erst kurz mit regulären Ausdrücken und bin heute morgen auf die Möglichkeit gestossen Zeichenklassen zu negieren, das könnte für Dein Beispiel vielleicht so aussehen:

.*[^a][^e][^s][^C][^o][^m][^m][^T][^o][^D][^e][^v].*
Ja, die Idee hatte ich auch schon - finde sie halt etwas unpraktisch :-\
Dein Regulärer Ausdruck würde zum Beispiel auch alles ausschließen, was kürzer als 12 Zeichen ist und noch so einiges, was halt auch diese Buchstaben enthält ;D
Ich habs jetzt vorhin mal so gemacht:([^a]|a[^e]|ae[^s]).*

Sunny

@ Virsacer,

Zitat von: Virsacer am 13 August 2015, 10:57:41
Ich habs jetzt vorhin mal so gemacht:([^a]|a[^e]|ae[^s]).*
freut mich, das Du eine Lösung gefunden hast !
Wenn ich Sie, auch noch nicht verstehe.  :-[

< OT an >
@ chris1284,

Zitat von: chris1284 am 13 August 2015, 09:21:34
dafür gibt es extra  DbLogExclude und DbLogInclude
Danke, das ist mir bewusst, nur möchte ich auch noch eine Filelog kompatible Lösung behalten.
Da ich noch nicht genau weiß, wie ich mein "Hauptprojekt" realisieren kann / möchte.
( Fernwartung einer alten Öl-Heizungsanlage, ca. 300km von meinem Wohnort entfernt ).
< OT aus >

Viele Grüße
Sunny
FHEM 6.0 (RPi's 1b-4,CeleronM,Odroid C1+)
1-Wire (DS18B20,DS2406) |miniCUL|miniCUL868WLAN|HM|IT(-1500,LR-3500) |FB6591,FB7490,FB7580|DECT200|Powerline546E|520E|openwrt
Anfänger: Linux,FHEM+Perl

Virsacer

Zitat von: Sunny am 13 August 2015, 12:37:23
freut mich, das Du eine Lösung gefunden hast !
Wenn ich Sie, auch noch nicht verstehe.  :-[
Naja, ist eigentlich ganz simpel:
Es wird alles gematcht, was entweder nicht mit a anfängt oder mit a anfängt, aber als zweites Zeichen kein e hat usw.
==> Passt auf alles, was nicht mit "aes" anfängt :)

Nur wenn da jetzt noch ein weiteres Exclude hinzukäme, wird es wohl unendlich kompliziert :-\

Sunny

Moin Virsacer,

recht herzlichen Dank für Deine Erklärung !
Wer weiß, wofür ich das mal gebrauchen kann.
( Bin ja noch in der Testphase, dieser tollen "Eisenbahn" FHEM.  ;D )

Viele Grüße & schönen Tag
Sunny

FHEM 6.0 (RPi's 1b-4,CeleronM,Odroid C1+)
1-Wire (DS18B20,DS2406) |miniCUL|miniCUL868WLAN|HM|IT(-1500,LR-3500) |FB6591,FB7490,FB7580|DECT200|Powerline546E|520E|openwrt
Anfänger: Linux,FHEM+Perl

Ellert

Die nachstehende Perlfunktion gibt alle Readings eines Gerätes zurück, die ein Event erzeugen sollen. Damit kannst Du das Attribut event-on-update-reading füttern.

Die Funktion kommt in die 99_myUtils.pm.

sub ReadingsOhne($$) {
my @re = keys $defs{$_[0]}{READINGS};
my $reo;
for(my $i = 0; $i < @re; $i++){
if (!($_[1] =~ $re[$i])){
    $reo = $reo.$re[$i].",";
        }
}
    $reo = substr($reo, 0, length($reo)-1);
    return $reo;
}


In der Befehlszeile folgendes eingeben:
{ReadingsOhne("DeinGerätename", "Auszuschließende Readings durch Leerzeichen getrennt")}

Für dein konkretes Beispiel:
{ReadingsOhne("DeinGerätename", "aesCommToDev")}


Virsacer

Interessante Idee 8)

Schade, dass man das nicht direkt im Attribut aufrufen kann...
Müsste dann halt auch regelmäßig ausgeführt werden, falls sich was geändert hat...

Ellert

Warum nicht?
sub ReadingsOhne($$) {
my @re = keys $defs{$_[0]}{READINGS};
my $reo;
for(my $i = 0; $i < @re; $i++){
if (!($_[1] =~ $re[$i])){
    $reo = $reo.$re[$i].",";
        }
}
    fhem "attr ".$_[0]." event-on-update-reading ".substr($reo, 0, length($reo)-1);
}


Dann must Du nur noch ein notify dafür schreiben und Dir ein passendes globales Ereignis aussuchen.

Virsacer

Ich meinte so:
attr Device event-on-update-reading {ReadingsOhne("Device", "aesCommToDev")}
Da ist mir FHEM gecrashed...
Wäre aber von der performance her wohl auch nicht so gesund...

Aber ja, als notify kann man das natürlich machen :)