Ich versuche, meine Gebäudeautomatisierung so komfortabel wie möglich zu gestalten mit dem Wunsch, meinen Code leserlich zu halten und möglichst in ein paar Monaten noch auf einem Blick zu verstehen. Dazu wäre folgende Vereinfachung aus meiner Sicht sehr hilfreich:
Anstelle von
fhem("set Rollo.EG.Wohnzimmer " . ReadingsVal("Rollo.EG.Wohnzimmer", "oldValue", -1);
fhem("set Rollo.EG.Bad " . ReadingsVal("Rollo.EG.Bad", "oldValue", -1);
fhem("set Rollo.EG.Schlafzimmer " . ReadingsVal("Rollo.EG.Schlafzimmer", "oldValue", -1);
fhem("set Rollo.EG.Kueche " . ReadingsVal("Rollo.EG.Kueche", "oldValue", -1);
fhem("set Rollo.OG.Kinderzimmer.01 " . ReadingsVal("Rollo.OG.Kinderzimmer.01", "oldValue", -1);
...
einfach nur (ähnlich FILTER)
set Rollo.* Value:r:oldValue
oder ggf. auch
fhem("set Rollo.* " . ReadingsVal("$NAME", "oldValue", -1)
verwenden zu können.
Was macht das set? Es zieht sich für jedes Devices aus dem Reading (r) oldValue den dort hinterlegten Wert und führt ein set aus.
Gruß
Ronny
PS. oldValue als "Saved State" setze ich mittels userReading direkt bei jedem SET (siehe dieser Thread (https://forum.fhem.de/index.php/topic,57172.0.html)) und habe somit immer die Möglichkeit, zur alten, individuellen Rolladenposition zurückzukehren.
probier malset Rollo.* {(ReadingsVal(...))}
oder sogar
set Rollo.* [$NAME:oldValue]
Leider nein. $NAME / $name wird in beiden Fällen leider leider nicht erkannt.
versuch es bitte mal mit $name.
gruss
andre
Moin Andre, $name hatte ich ebenfalls versucht. Leider vergeblich.
$NAME wird in meinen verwendeten notifys einwandfrei aufgelöst und funktioniert somit.
Zitat von: derron am 29 August 2016, 10:51:09
Leider vergeblich.
Ist etwas "dürftig".
Im Logfile sollte eine Meldung auftauchen und diese wäre interessant.
Zitat von: Puschel74 am 29 August 2016, 19:58:35
$NAME wird in meinen verwendeten notifys einwandfrei aufgelöst und funktioniert somit.
Notify? Um das Trigger Device im Notify geht es hier doch gar nicht.
Zitat von: Puschel74 am 29 August 2016, 19:58:35
Ist etwas "dürftig".
Im Logfile sollte eine Meldung auftauchen und diese wäre interessant.
Ausgeführt im WebCMD:
{fhem("set Rollo.* " . ReadingsVal("$NAME", "oldValue", -1)}
Global symbol "$NAME" requires explicit package name at (eval 22281) line 1.
syntax error at (eval 22281) line 1, at EOF
Ausgeführt im WebCMD:
{fhem("set Rollo.* " . ReadingsVal("$name", "oldValue", -1)}
Global symbol "$name" requires explicit package name at (eval 22246) line 1.
syntax error at (eval 22246) line 1, at EOF
Gruß
Ronny
hab gerade etwas im fhem code gestöbert.
aktuell geht es mit keiner der beiden vorgeschlagenen varianten.
ich habe hier: https://forum.fhem.de/index.php/topic,57210.0.html (https://forum.fhem.de/index.php/topic,57210.0.html) einen patch vorgeschlagen mit dem das möglich wird.
gruss
andre
ps: die variante die du probiert hat waren nicht das was ich vorgeschlagen hatte :).
Zitat von: justme1968 am 30 August 2016, 00:26:45
ich habe hier: https://forum.fhem.de/index.php/topic,57210.0.html (https://forum.fhem.de/index.php/topic,57210.0.html) einen patch vorgeschlagen mit dem das möglich wird.
Sehr cool, vielen Dank!
Zitat
ps: die variante die du probiert hat waren nicht das was ich vorgeschlagen hatte.
Wie kommst Du darauf? Habe ich etwas übersehen? Ich hatte Deine beiden Varianten inkl. [Device:Reading] getestet gehabt. Es kam nur keine Fehlermeldung, sondern funktionierte einfach nicht.
die [Device:Reading] variante mal aussen vor.
meine sah so aus:set Rollo.* {(ReadingsVal($NAME,"oldValue",-1))}
deine so:{fhem("set Rollo.* " . ReadingsVal("$NAME", "oldValue", -1)}
ohne strings zusammen bauen und ohne explizit von fhem nach perl nach fhem zu wechseln.
Mir war gar nicht bewusst, dass hierbei "unter der Haube" ein Unterschied existiert.
Ich konnte es nicht abwarten und habe Deine Änderung (+1 Zeile) aus dem verlinkten Thread mal in die fhem.pl getan, aber es ändert sich nichts. Müsste der Aufruf denn nicht schon funktionieren? Getestet via
set Rollo.* {(ReadingsVal($NAME, "oldValue", -1))}
set Rollo.* {(ReadingsVal($name, "oldValue", -1))}
:)
$DEV statt $NAME.
$NAME ist in einem notify für das auslösende device reserviert und das ganze soll ja auch funktionieren wenn das set in einem notify verwendet wird.
Auweia, noch ein neuer Platzhalter. Aber verstehe, macht ja Sinn. Danke für die Info. Jetzt funktioniert's prächtig!
Zitat von: justme1968 am 30 August 2016, 00:26:45
ich habe hier: https://forum.fhem.de/index.php/topic,57210.0.html (https://forum.fhem.de/index.php/topic,57210.0.html) einen patch vorgeschlagen mit dem das möglich wird.
Hi Andre,
da ich mit einem Update gerade die Änderung in der fhem.pl rausgeschmissen habe - wie lange dauert es etwa von der Umsetzung bis ins Release?
Gruß
Ronny
das ist schon längst im release
Oha.. ich hatte es an der gleichen Stelle in der fhem.pl erwartet.
Vielen Dank nochmal, dass Du Dich darum gekümmert hast!
Schönen Abend
Ronny
genau da sollte es auch sein.
funktioniert es nicht?
welche fhem version hast du? was gibt version aus?
Ich sehe um Zeilennummer 1728 nichts von Deiner evalSpecials Anpassung. Das muss dann wohl woanders integriert worden sein?
Server started with 593 defined entities (fhem.pl:12095/2016-08-30 perl:5.020002 os:linux user:fhem pid:17428)
Version gibt aus:
Latest Revision: 12112
File Rev Last Change
fhem.pl 12095 2016-08-30 13:30:50Z rudolfkoenig
Wie komme ich denn zur aktuellen Version?
es ist nur an eine andere stelle gewandert. es ist drin und geht.
schau in zeile 1569.
gruss
andre
Ich krieg es in Perl nicht zum Laufen. Kannst Du mir bitte das Usage einmal an einem Beispiel erläutern?
Folgendes funktioniert:
set Rollo.* {(ReadingsVal("$DEV", "oldValue", -1))}
Folgendes funktioniert nicht
fhem("set Rollo.* {(ReadingsVal("$DEV", "oldValue", -1))}");
fhem("set Rollo.* " . ReadingsVal("$DEV", "oldValue", -1));
Nur letzteres bringt mich weiter, da jedes größere Notify zwangsläufig in Perl Code ausartet. Muss ich die Anführungszeichen noch escapen?
- wenn der code größer wird solltest du es in eine route in 99_myUtils auslagern.
- bei variante 2 musst du darauf achten die " nicht zu verschachteln. also so:fhem("set Rollo.* {(ReadingsVal($DEV, 'oldValue', -1))}");
gruss
andre
Zitat von: justme1968 am 11 September 2016, 11:28:05
- wenn der code größer wird solltest du es in eine route in 99_myUtils auslagern.
Die ist schon voll ;)
Aber ehrlich, das hat doch nichts mit dem Problem hier zu tun?
Zitat von: justme1968 am 11 September 2016, 11:28:05
- bei variante 2 musst du darauf achten die " nicht zu verschachteln. also so:fhem("set Rollo.* {(ReadingsVal($DEV, 'oldValue', -1))}");
Das funktioniert nicht. Auch mein testweises Maskieren der Hochkommas hilft nicht:
set Rollo.* {(ReadingsVal(\"$DEV\", \"oldValue\", \"-1\"))}
Fehlermeldung:
Global symbol "$DEV" requires explicit package name at (eval 137519) line 1.Ich testete die o.g. Aufrufe im CMD Feld.
Gruß
Ronny
myUtils wird nicht so schnell unübersichtlich wie der code im notify. man kann mehr als ein myUtils file haben :)
sorry. mein fehler. du musst dafür sorgen das das $DEV nicht dann ausgewertet wird wenn der fhem aufruf stattfindet sondern später wenn das set selber ausgeführt wird. also sofhem("set Rollo.* {(ReadingsVal(\$DEV, 'oldValue', -1))}");
oderfhem('set Rollo.* {(ReadingsVal($DEV, "oldValue", -1))}');
gruss
andre
Ahh, sehr gut. Es funktioniert jetzt. Hab vielen Dank, Andre.
Aufgrund Deines Hinweises mit dem Dollar Zeichen habe ich mein Nur-Hochkomma-Beispiel jetzt auch erfolgreich testen können:
{fhem("set Rollo.* {(ReadingsVal(\"\$DEV\", \"oldValue\", \"-1\"))}")}
Ich vermute, es nimmt kein Ende.. kann es sein, dass der neue Platzhalter im FILTER nicht funktioniert?
set Rollo.*:FILTER=STATE!={(ReadingsVal(\"\$DEV\", \"oldValue\", 10))} 12
liefert
CMD:
Please define Rollo.*:FILTER=STATE!={(ReadingsVal(\"\$DEV\", first
LOG:
2016.09.16 21:33:38 1: devspec2array Rollo.*:FILTER=STATE!={(ReadingsVal(\"\$DEV\",: Unmatched ( in regex; marked by <-- HERE in m/^({( <-- HERE ReadingsVal(\"\$DEV\")$/ at fhem.pl line 1159.
ja. das geht aus zwei drei gründen nicht:
- devspec erlaubt kein perl code
- die devspec werden ausgewertet bevor die set routinen ausgewertet werden.
d.h. zu diesem zeitpunkt gibt es noch gar kein $DEV das gesetzt sein könnte.
- {(...)} funktioniert nur in den set parametern. nicht in den devspec.
gruss
andre
Hi Andre,
tatsächlich konnte ich eben nach etlichem Rumprobieren durch Concatenation quasi von hinten durch die Brust mein Rollo steuern:
{fhem("set Rollo.*:FILTER=STATE!=".(ReadingsVal('$DEV', 'oldValue', 10))." ".(ReadingsVal('$DEV', 'oldValue', 10)))}
Schön geht zwar anders (?), aber ich komme damit freudigerweise zum Ziel.
ich glaube nicht das das wirklich macht was du willst.
$DEV ist nicht definiert. das fällt nur nicht auf weil '$DEV' auf grund der einfachen ' nicht interpoliert wird. du versuchst ein reading eines device namens $DEV zu lesen. das gibt es nicht und du bekommst immer den default 10 zurück.
ich weiß ja nicht wie viele rollos du hast und wie wahrscheinlich es ist das sie
gerade auf dem oldvalue stehe. aber ich würde den filter einfach weg lassen.
gruss
andre
Du hast leider recht! Ich kann gerade nicht resümieren, was da vorhin wie ging.
Jedenfalls wird nicht einmal der Defaultwert gelesen bei
{fhem("set Rollo.*:FILTER=STATE!=" . (ReadingsVal('$DEV', 'oldValue', 10)) . " 55")}
Es passiert gar nichts, nicht einmal ein Fehler im Log.
(Edit: Es wird der Default Wert genommen, wie Du schon sagtest)
Aber ich stimme Dir zu, den fehlenden Filter kann ich verschmerzen. Ich wollte einfach nur Funkverkehr und das Klackern in den Tastern reduzieren.
Müsste Folgendes nicht auch funktionieren?
{fhem("set LL.* {(OldValue(\"\$DEV\"))}")}
Ich bekomme hier zwar keinen Fehler, aber der STATE meiner Dummies LL1 und LL2 ändert sich nicht.
Gruß
Ronny