FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Virsacer am 08 August 2015, 23:20:13

Titel: Invert event-on-update-reading
Beitrag von: Virsacer am 08 August 2015, 23:20:13
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 :/
Titel: Antw:Invert event-on-update-reading
Beitrag 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?
Titel: Antw:Invert event-on-update-reading
Beitrag von: Sunny am 12 August 2015, 20:36:27
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
Titel: Antw:Invert event-on-update-reading
Beitrag von: Virsacer am 12 August 2015, 22:22:07
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 :-\
Titel: Antw:Invert event-on-update-reading
Beitrag von: Sunny am 12 August 2015, 23:34:33
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 (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
Titel: Antw:Invert event-on-update-reading
Beitrag von: chris1284 am 13 August 2015, 09:21:34
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
Titel: Antw:Invert event-on-update-reading
Beitrag 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].*
Titel: Antw:Invert event-on-update-reading
Beitrag von: Virsacer am 13 August 2015, 10:57:41
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 (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]).*
Titel: Antw:Invert event-on-update-reading
Beitrag von: Sunny am 13 August 2015, 12:37:23
@ 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
Titel: Antw:Invert event-on-update-reading
Beitrag von: Virsacer am 13 August 2015, 13:15:40
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 :-\
Titel: Antw:Invert event-on-update-reading
Beitrag von: Sunny am 13 August 2015, 13:22:00
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

Titel: Antw:Invert event-on-update-reading
Beitrag von: Ellert am 13 August 2015, 14:08:03
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")}

Titel: Antw:Invert event-on-update-reading
Beitrag von: Virsacer am 13 August 2015, 17:50:06
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...
Titel: Antw:Invert event-on-update-reading
Beitrag von: Ellert am 13 August 2015, 23:42:16
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.
Titel: Antw:Invert event-on-update-reading
Beitrag von: Virsacer am 14 August 2015, 08:40:47
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 :)
Titel: Antw:Invert event-on-update-reading
Beitrag von: Ellert am 14 August 2015, 09:31:03
In der sub steht eine Zeile, die fängt mit fhem an, sie setzt das Attribut. Im notify muss nur noch die Funktion aufgerufen werden. sonnst wird's wohl wieder crashen.
Titel: Antw:Invert event-on-update-reading
Beitrag von: Virsacer am 14 August 2015, 09:45:51
Schon klar :)
Ich hatte ja auch die Version verwendet, die eine Liste zurückgibt ;)
Titel: Antw:Invert event-on-update-reading
Beitrag von: Virsacer am 29 August 2015, 00:25:52
So, ich hab mal folgendes DOIF gebaut:


(
{
my @devices = devspec2array("TYPE=CUL_HM");;
foreach my $device (@devices){
next if ($device =~ /ActionDetector|VCCU/);;
my $attrib = "";;
my @readings = keys %{$defs{$device}{READINGS}};;
foreach my $reading (@readings){
next if ($reading eq "aesCommToDev");;
$attrib .= $reading . ",";;
}
$attrib =~ s/,$//;;
fhem("attr $device event-on-update-reading $attrib") if($attr{$device}{"event-on-update-reading"} ne $attrib)
}
}
)


Jetzt brauch ich nur noch ein passendes Ereignis...