Hallo, ich habe mal eine kleine Frage bezüglich DOIF. Für verschiedene Fenster, deren Zustände in Readings gespeichert sind, habe ich für das Schließen für jedes Fenster ein eigenes DOIF:
define di_Closed_WohnWT DOIF ([oWD:winBad] eq "closed") ( {setValveTempWinClosed("Bad")} )
define di_Closed_WohnV DOIF ([oWD:winWohnV] eq "closed") ( {setValveTempWinClosed("WohnV")} )
define di_Closed_WohnL DOIF ([oWD:winWohnL] eq "closed") ( {setValveTempWinClosed("WohnL")} )
...
Geht das denn nicht eleganter mit einem DOIF? Ich habe verschiedene Schreibweisen aus der CommandRef versucht, habe aber keinen Erfolg gehabt.
define di_Closed DOIF ([oWD:win*] eq "closed") ( {setValveTempWinClosed("???")} )
Wie kann ich dann zu meinem Funktionsargument kommen, das das triggernde Reading angibt?
Es funktioniert zwar mit den 13 DOIFs, aber nur eins wäre eleganter. Vielleicht kennt sich jemand besser aus und kann mir einen Tip geben.
Vielen Dank.
Ich bin ja nicht so in DOIF...
Aber wildcards: *
Ist Dateisystem
Regex: .*
heisst weiteres und unbekannt wieviel davon
Vermutlich könnte das schon helfen...
EDIT: und für "hinten" könnte es $DEVICE für den Gerätenamen sein!?
Gruß, Joachim
Vielen Dank, aber das geht so offenbar nicht, denn im Bedingungsteil vorn schon, aber wie bekomme ich das Funktionsargument, also das Reading für die Funktion?
Und $DEVICE habe ich auch versucht, dann kommt das Device und nicht das auslösende Reading.
Dann poste doch mal ein list der beteiligten Geräte...
Wo kommt denn "Bad", "WohnV" etc. her!?
Sind das Attribute beteiligter/auslösender Geräte!?
Dann Abfragen mit AttrVal...
Gruß, Joachim
Zitat von: manne44 am 29 April 2020, 09:24:01
Und $DEVICE habe ich auch versucht, dann kommt das Device und nicht das auslösende Reading.
Das auslösende Reading sollte $READING sein...
Gruß, Joachim
Ja, das mit dem $READING habe ich in der CommandRef nicht gesehen und werde es mal versuchen. Das Device ist ein Dummy, das ich durch eine Vielzahl von Readings "aufgerüstet" habe, mache ich an vielen Stellen. Wenn ich wüsste wie man sich einen eigenen Typ machen könnte, dann würde ich in diesen Fällen einen eigenen Typ fabrizieren und das so machen, aber ich weiß es nicht.
Zitat von: manne44 am 29 April 2020, 09:30:12
Ja, das mit dem $READING habe ich in der CommandRef nicht gesehen und werde es mal versuchen. Das Device ist ein Dummy, das ich durch eine Vielzahl von Readings "aufgerüstet" habe, mache ich an vielen Stellen. Wenn ich wüsste wie man sich einen eigenen Typ machen könnte, dann würde ich in diesen Fällen einen eigenen Typ fabrizieren und das so machen, aber ich weiß es nicht.
Du kannst auch bestehende Devices "erweitern"...
Mittels userattr für Attribute und setreading "einfach so"...
Ich hatte zu Beginn auch einige Dummy für "solche Dinge".
Gehe aber dazu über auch vorhandene Devices nach Bedarf zu "erweitern"...
Gruß, Joachim
Zitat von: manne44 am 29 April 2020, 03:24:22
Hallo, ich habe mal eine kleine Frage bezüglich DOIF. Für verschiedene Fenster, deren Zustände in Readings gespeichert sind, habe ich für das Schließen für jedes Fenster ein eigenes DOIF:
define di_Closed_WohnWT DOIF ([oWD:winBad] eq "closed") ( {setValveTempWinClosed("Bad")} )
define di_Closed_WohnV DOIF ([oWD:winWohnV] eq "closed") ( {setValveTempWinClosed("WohnV")} )
define di_Closed_WohnL DOIF ([oWD:winWohnL] eq "closed") ( {setValveTempWinClosed("WohnL")} )
...
Geht das denn nicht eleganter mit einem DOIF? Ich habe verschiedene Schreibweisen aus der CommandRef versucht, habe aber keinen Erfolg gehabt.
define di_Closed DOIF ([oWD:win*] eq "closed") ( {setValveTempWinClosed("???")} )
Wie kann ich dann zu meinem Funktionsargument kommen, das das triggernde Reading angibt?
Es funktioniert zwar mit den 13 DOIFs, aber nur eins wäre eleganter. Vielleicht kennt sich jemand besser aus und kann mir einen Tip geben.
Vielen Dank.
z. B. im DOIF-Perl-Mode (geht auch im DOIF-FHEM-Mode):
define di_Closed DOIF {if (["^oWD$:^win",0] eq "closed") {setValveTempWinClosed ($event)}}
Vielen Dank, aber
define di_ClosedWin DOIF {if (["^oWD$:^win",0] eq "closed") {tstWinClosed ($event)}}
triggert überhaupt nicht.
Aber das triggert.
define di_ClosedWin DOIF (["^oWD$:^win",0] eq "closed") ({tstWinClosed ($event)})
Gibt aber Errors:
2020.04.29 10:13:34 1: ERROR evaluating my $NAME='winHolzR';my $EVENT='closed';my $SELF='notify_WinHolzR';my $EVTPART0='closed';my $TYPE='CUL_HM';my $DEV='oWD';{tstWinClosed ($event)}: Global symbol "$event" requires explicit package name (did you forget to declare "my $event"?) at (eval 4389790) line 1.
2020.04.29 10:13:34 2: di_ClosedWin: {tstWinClosed ($event)}: Global symbol "$event" requires explicit package name (did you forget to declare "my $event"?) at (eval 4389790) line 1.
Offenbar existiert eine Variable $event nicht.
In der aufrufenden Funktion soll nur der Name des Funktionsparameters ausgegeben werden:
sub
tstWinClosed($) {
my ($name) = @_;
Log(2,'TEST:'.$name);
}
Aber
define di_ClosedWin DOIF (["^oWD$:^win",0] eq "closed") ({tstWinClosed ($NAME)})
scheint zu funktionieren.
Diese DOIF-Bedingung hatte ich schon versucht, weil sie in der CommandRef beschrieben ist, habe aber den Default-Parameter mit "open" angegeben, weil mir eine 0 da komisch vorkam, und scheiterte.
Ergo:
Es funktioniert und die vielen DOIFs schrumpfen auf eine einzige.
Vielen Dank für die Hilfe.