FHEM Forum

FHEM - Entwicklung => Wunschliste => Thema gestartet von: FHEMAN am 29 August 2016, 00:23:31

Titel: [gelöst] set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 29 August 2016, 00:23:31
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.
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: justme1968 am 29 August 2016, 01:11:36
probier malset Rollo.* {(ReadingsVal(...))}oder sogar
set Rollo.* [$NAME:oldValue]
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 29 August 2016, 01:22:46
Leider nein. $NAME / $name wird in beiden Fällen leider leider nicht erkannt.
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: justme1968 am 29 August 2016, 09:09:27
versuch es bitte mal mit $name.

gruss
  andre
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 29 August 2016, 10:51:09
Moin Andre, $name hatte ich ebenfalls versucht. Leider vergeblich.
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: Puschel74 am 29 August 2016, 19:58:35
$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.
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 29 August 2016, 21:51:38
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
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: justme1968 am 30 August 2016, 00:26:45
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 :).
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 30 August 2016, 00:39:17
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.
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: justme1968 am 30 August 2016, 00:46:58
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.
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 30 August 2016, 01:05:26
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))}


:)
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: justme1968 am 30 August 2016, 01:09:15
$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.
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 30 August 2016, 01:12:51
Auweia, noch ein neuer Platzhalter. Aber verstehe, macht ja Sinn. Danke für die Info. Jetzt funktioniert's prächtig!
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 04 September 2016, 23:55:21
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
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: justme1968 am 05 September 2016, 00:01:33
das ist schon längst im release
Titel: Antw:set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 05 September 2016, 00:23:25
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
Titel: [gelöst] set Devices ReadingsVal(...)
Beitrag von: justme1968 am 05 September 2016, 00:24:15
genau da sollte es auch sein.

funktioniert es nicht?

welche fhem version hast du? was gibt version aus?
Titel: Antw:[gelöst] set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 05 September 2016, 00:40:23
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?
Titel: Antw:[gelöst] set Devices ReadingsVal(...)
Beitrag von: justme1968 am 05 September 2016, 09:31:25
es ist nur an eine andere stelle gewandert. es ist drin und geht.

schau in zeile 1569.

gruss
  andre
Titel: Antw:[gelöst] set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 10 September 2016, 22:20:43
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?
Titel: Antw:[gelöst] set Devices ReadingsVal(...)
Beitrag 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.
- bei variante 2 musst du darauf achten die " nicht zu verschachteln. also so:fhem("set Rollo.* {(ReadingsVal($DEV, 'oldValue', -1))}");

gruss
  andre
Titel: Antw:[gelöst] set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 12 September 2016, 23:23:18
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
Titel: Antw:[gelöst] set Devices ReadingsVal(...)
Beitrag von: justme1968 am 12 September 2016, 23:31:28
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
Titel: Antw:[gelöst] set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 12 September 2016, 23:54:12
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\"))}")}
Titel: Antw:[gelöst] set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 16 September 2016, 21:41:11
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.
Titel: Antw:[gelöst] set Devices ReadingsVal(...)
Beitrag von: justme1968 am 16 September 2016, 21:45:36
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
Titel: Antw:[gelöst] set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 16 September 2016, 22:00:23
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.
Titel: Antw:[gelöst] set Devices ReadingsVal(...)
Beitrag von: justme1968 am 16 September 2016, 22:04:42
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
Titel: Antw:[gelöst] set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 16 September 2016, 22:23:56
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.
Titel: Antw:[gelöst] set Devices ReadingsVal(...)
Beitrag von: FHEMAN am 05 Januar 2017, 23:13:06
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