Gibt es eine Möglichkeit im DOIF statt auf Internal und Reading auf ein Attribute zuzugreifen? Möchte gerne 3-4 userAttr's als Konfiguration in einer "Bedingung" definieren und auslagern.
Ich habe mir für diesen Fall User-Readings direkt im DOIF Device erzeugt und greife so auf die Values zu.
Zitat von: traxanos am 27 Juli 2015, 20:48:28
Gibt es eine Möglichkeit im DOIF statt auf Internal und Reading auf ein Attribute zuzugreifen? Möchte gerne 3-4 userAttr's als Konfiguration in einer "Bedingung" definieren und auslagern.
z. B. mit
AttrVal("Devicename","Attributname","")
dient nur der Abfrage ohne Triggerung.
Gruß
Damian
So stelle ich mir das vor?
([Waschmaschine.Status:power] < AttrVal("Waschmaschine.Status", "configPowerDone", 3))
Geht das so?
Zitat von: Loredo am 27 Juli 2015, 20:57:35
Ich habe mir für diesen Fall User-Readings direkt im DOIF Device erzeugt und greife so auf die Values zu.
Ja das war auch meine erste Idee. Aber ich finde das später für andere leichter wenn man das direkt bearbeiten kann (ohne setreading)
Ich meinte das Attribut userReading zu nutzen. Dort die Values einfach als {return "value"} hinterlegen. Funktioniert bei mir
Die Variante von Damian geht wunderbar. Die Frage ist, kann ich beim Wait vielleicht auch noch auf ein AttrVal eines anderen Objekts zugreifen?
Zitat von: traxanos am 27 Juli 2015, 21:16:39
Die Variante von Damian geht wunderbar. Die Frage ist, kann ich beim Wait vielleicht auch noch auf ein AttrVal eines anderen Objekts zugreifen?
ja, in der neuen Version des Moduls http://forum.fhem.de/index.php/topic,39070.0.html
z. B.
attr di_modul wait AttrVal("Devicename","Attributname","")
Gruß
Damian
ah ist also noch nicht vorm crash im svn gewesen. ok ich teste. danke
Klappt leider nicht so:
wait AttrVal("Waschmaschine.Status", "configWaitOff", 0):0:0:AttrVal("Waschmaschine.Status", "configWaitDone", 0)
Getestet mit:
md5 Downloads/98_DOIF.pm
MD5 (Downloads/98_DOIF.pm) = 4c1dfc1ce52219d1d434a490d9309e42
Zitat von: traxanos am 27 Juli 2015, 21:43:14
Klappt leider nicht so:
wait AttrVal("Waschmaschine.Status", "configWaitOff", 0):0:0:AttrVal("Waschmaschine.Status", "configWaitDone", 0)
Getestet mit:
md5 Downloads/98_DOIF.pm
MD5 (Downloads/98_DOIF.pm) = 4c1dfc1ce52219d1d434a490d9309e42
ok, es liegt an den Kommas - werde noch etwas nachprogrammieren müssen. Also erst demnächst.
Als kurzfirstige Lösung kannst du AttrVal.. in eigene Routine packen und diese ohne Parameter in wait angeben.
Gruß
Damian
Ich arbeite erstmal ohne und warte. Solange muss der Rest auch warten. Dann kann ich auch noch etwas vertesten.
@Damian
Gibt es hierzu schon Neuigkeiten? Ich habe das Problem übrigens nicht nur im wait sondern auch im DEF.
setreading Trockner.Status totalCost {([Trockner.Status:totalEnergy]/1000*AttrVal("global", "energyCost", 0))},
Zitat von: traxanos am 10 August 2015, 21:08:01
@Damian
Gibt es hierzu schon Neuigkeiten? Ich habe das Problem übrigens nicht nur im wait sondern auch im DEF.
setreading Trockner.Status totalCost {([Trockner.Status:totalEnergy]/1000*AttrVal("global", "energyCost", 0))},
Kann es erst später umsetzen.
Dein Ausdruck geht schon, du musst wegen der Kommas setreading zusätzlich klammern, also
... (setreading Trockner.Status totalCost {([Trockner.Status:totalEnergy]/1000*AttrVal("global", "energyCost", 0))}),...
Wahrscheinlich werde ich Zugriff auf Attribute mit einem Sonderzeichen versehen z. B.
[global:§energyCost]
Das kaufmännische und-Zeichen & habe ich bereits für Internels eingebaut.
Gruß
Damian
Die Idee mit dem § hört sich gut an. Ich frage jetzt mal nicht wann es kommt, nervt mich selber immer wenn ich gefragt werden :D
Zitat von: traxanos am 10 August 2015, 22:40:26
Die Idee mit dem § hört sich gut an. Ich frage jetzt mal nicht wann es kommt, nervt mich selber immer wenn ich gefragt werden :D
ja, die Ferienzeit ist erst mal um, und da muss ich mit anderen Sachen mein Geld verdienen ;)
Das Modul ist nur ein Hobby-Projekt.
Gruß
Damian
Zitat von: Damian am 10 August 2015, 21:43:10
Wahrscheinlich werde ich Zugriff auf Attribute mit einem Sonderzeichen versehen z. B.
[global:§energyCost]
Das kaufmännische und-Zeichen & habe ich bereits für Internels eingebaut.
Hallo Damian, dann war es ja damals eine blöde Idee von mir, dass ? für Abfragen ohne trigger vorzuschlagen, sonst hätte man es wie bei ReadingsGroup machen können, was im Nachhinein bestimmt zu weniger Verwirrung führt.
Aber könnte man nicht auch einfach Texte nehmen? Attr Internal und Readings wie bei AttrVal, InternalVal und ReadingsVal? Das Readings würde dabei ja sowieso schon wegfallen. Sonst muss man in einem Jahr immer erst die Commandref bemühen um zu gucken, welches Sonderzeichen in welchem Modul was bewirkt. Ich vermute auch deswegen sind mal % und @ aus dem notify Modul durch $EVENT und $NAME ersetzt worden.
Grüße
igami
Ich finde das gar nicht so schlecht. Ich verwende ebenfalls viel ? für triggerlose Abfragen. Die Sonderzeichen finde ich ebenfalls nicht so schlimm, da man so relative schnell auf viele Daten zugreifen kann, ohne komplexe Funktionen aufrufen zu müssen. Was wenn überhaupt schade ist, dass es keine Perl Syntax gibt um für komplexere Sachen selber was zu bauen.
Zitat von: igami am 11 August 2015, 17:30:15
Hallo Damian, dann war es ja damals eine blöde Idee von mir, dass ? für Abfragen ohne trigger vorzuschlagen, sonst hätte man es wie bei ReadingsGroup machen können, was im Nachhinein bestimmt zu weniger Verwirrung führt.
Aber könnte man nicht auch einfach Texte nehmen? Attr Internal und Readings wie bei AttrVal, InternalVal und ReadingsVal? Das Readings würde dabei ja sowieso schon wegfallen. Sonst muss man in einem Jahr immer erst die Commandref bemühen um zu gucken, welches Sonderzeichen in welchem Modul was bewirkt. Ich vermute auch deswegen sind mal % und @ aus dem notify Modul durch $EVENT und $NAME ersetzt worden.
Grüße
igami
Alles hat seine Vor- und Nachteile. Fragezeichen finde ich OK für reine Abfragen. Ich habe auch das Fragezeichen für regexp genommen, was im Nachhinein etwas unglücklich war, weil es verwirrend ist, auch wenn es an einer anderen Stelle steht. DOIF ist ein Preprozessor für den Perlinterpreter und alles was in Perl erlaubt ist, versuche ich zu meiden, damit es keine Kollisionen gibt und alle Optionen von Perl weiterhin möglich sind. Damit verbieten sich alle Bezeichnernamen, die insb. für irgendeine Funktion stehen können. Auch $ steht für Variablen und das möchte ich bewusst vermeiden, um mich an dieser Stelle von der Perl-Welt abzugrenzen. Ich habe mich für eckige Klammern entschieden, weil sie in Perl, wenn überhaupt, dann in Verbindung mit Arrays vorkommen und die dürften in DOIF selten vorkommen. Meine Welt ist also auf [...] beschränkt. Andererseits muss es ein Zeichen sein, welches normalerweise in FHEM-Namen nicht vorkommt, damit man es an eine bestimmte Funktion binden kann.
Vorschläge für ein Attribut können hier gerne abgegeben werden. Vielleicht gibt es ein Sonderzeichen, welches intuitiver ist als ein §.
Gruß
Damian
Zitat von: Damian am 11 August 2015, 19:46:37
Vorschläge für ein Attribut können hier gerne abgegeben werden. Vielleicht gibt es ein Sonderzeichen, welches intuitiver ist als ein §.
Ein @ wie @ttribut, kommt auch nur bei Arrays vor.
Viele Sonderzeichen bleiben ja nicht mehr.
Für regexp würde sich auch ~ anbieten, kannst ja einfach beides einbauen, und das ? aus der commandref nehmen.
Grüße
igami
Zitat von: igami am 11 August 2015, 20:45:35
Ein @ wie @ttribut, kommt auch nur bei Arrays vor.
Viele Sonderzeichen bleiben ja nicht mehr.
Für regexp würde sich auch ~ anbieten, kannst ja einfach beides einbauen, und das ? aus der commandref nehmen.
Grüße
igami
Die Idee mit @ ist auch nicht schlecht.
Bei regexp muss man inzwischen kompatibel bleiben, dafür wird das Modul zu oft benutzt, als dass man etwas ändern könnte.
Aber ich hatte sowieso vor irgendwann, so etwas einzubauen:
["regexp für Device":"regexp für Event"]
Gruß
Damian
Zitat von: Damian am 11 August 2015, 21:15:40
Bei regexp muss man inzwischen kompatibel bleiben, dafür wird das Modul zu oft benutzt, als dass man etwas ändern könnte.
Die Idee war auch es zusätzlich einzubauen und nur die Commandref abzuändern, dass ? an der Stelle soll weiterhin funktionieren.
Zitat von: igami am 11 August 2015, 21:43:07
Die Idee war auch es zusätzlich einzubauen und nur die Commandref abzuändern, dass ? an der Stelle soll weiterhin funktionieren.
ja, aber da ich die Anführungszeichen für beliebige Devices einbauen wollte, wären sie auch für Events gut, zumal man regexp in Perl auch in Anführungszeichen angibt.
Gruß
Damian