[gelöst] set Devices ReadingsVal(...)

Begonnen von FHEMAN, 29 August 2016, 00:23:31

Vorheriges Thema - Nächstes Thema

FHEMAN

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) und habe somit immer die Möglichkeit, zur alten, individuellen Rolladenposition zurückzukehren.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

justme1968

probier malset Rollo.* {(ReadingsVal(...))}oder sogar
set Rollo.* [$NAME:oldValue]
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

FHEMAN

Leider nein. $NAME / $name wird in beiden Fällen leider leider nicht erkannt.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

justme1968

versuch es bitte mal mit $name.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

FHEMAN

Moin Andre, $name hatte ich ebenfalls versucht. Leider vergeblich.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

Puschel74

$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.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

FHEMAN

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
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

justme1968

#7
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 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 :).
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

FHEMAN

Zitat von: justme1968 am 30 August 2016, 00:26:45
ich habe hier: 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.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

justme1968

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.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

FHEMAN

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))}


:)
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

justme1968

$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.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

FHEMAN

Auweia, noch ein neuer Platzhalter. Aber verstehe, macht ja Sinn. Danke für die Info. Jetzt funktioniert's prächtig!
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

FHEMAN

Zitat von: justme1968 am 30 August 2016, 00:26:45
ich habe hier: 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
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

justme1968

das ist schon längst im release
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

FHEMAN

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
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

justme1968

genau da sollte es auch sein.

funktioniert es nicht?

welche fhem version hast du? was gibt version aus?
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

FHEMAN

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?
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

justme1968

es ist nur an eine andere stelle gewandert. es ist drin und geht.

schau in zeile 1569.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

FHEMAN

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?
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

justme1968

- 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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

FHEMAN

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
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

FHEMAN

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\"))}")}
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

FHEMAN

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.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

justme1968

#25
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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

FHEMAN

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.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

justme1968

#27
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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

FHEMAN

#28
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.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

FHEMAN

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
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB