readingsProxy meldet Events obwohl nichts passiert ist

Begonnen von mc, 28 April 2015, 23:47:31

Vorheriges Thema - Nächstes Thema

mc

Leider verstehe ich das Verhalten von readingsProxy-Devices scheinbar nicht richtig. Ich habe den Eindruck, dass ein readingsProxy Events generiert obwohl nichts passiert. Um das zu verdeutlichen hier ein kleines Beispiel:

Folgendes gebe ich an der Telnet-Schnittstelle ein:
fhem> define atjob at +00:00:03 { Log 1, "Test At-Job" }

fhem> define dummy dummy
fhem> set dummy off
fhem> define rp readingsProxy dummy

fhem> define atjob at +00:00:03 { Log 1, "Test At-Job" }


Folgendes erscheint im Event-Monitor:
2015-04-28 23:29:02 at atjob Next: 23:29:05
2015-04-28 23:29:02 Global global DEFINED atjob
2015-04-28 23:29:05 Global global DELETED atjob

2015-04-28 23:29:13 Global global DEFINED dummy
2015-04-28 23:29:15 dummy dummy off
2015-04-28 23:29:17 readingsProxy rp off
2015-04-28 23:29:17 readingsProxy rp off
2015-04-28 23:29:17 Global global DEFINED rp

2015-04-28 23:29:21 at atjob Next: 23:29:24
2015-04-28 23:29:21 readingsProxy rp off
2015-04-28 23:29:21 Global global DEFINED atjob
2015-04-28 23:29:24 readingsProxy rp off
2015-04-28 23:29:24 Global global DELETED atjob


Für eine bessere Übersicht habe ich zwei Leerzeilen eingefügt.

Zunächst definiere ich einen atjob, der erwartungsgemäß nach 3 Sekunden abgearbeitet wird.
Dann definiere ich einen dummy und einen readingsProxy, der den dummy ausliest.

Hier stellt sich auch schon meine erste Frage:
Wieso gibt es 2 Events "readingsProxy rp off" kurz nacheinander? Ich würde hier maximal 1 Event erwarten.

Noch seltsamer erscheint mir dann das Verhalten nachdem ich erneut einen atjob erzeuge, der überhaupt nichts mit dem dummy oder dem readingsProxy zu tun hat. Hier erzeugt readingsProxy wieder zwei Events.
Wieso erzeugt readingsProxy beim Erstellen und beim Löschen des atjobs jeweils ein Event? Ich würde erwarten, dass hier kein Event vom readingsProxy erzeugt wird.

Ähnliches habe ich auch mit DOIF bebobachtet. Folgendes erzeugt auch ein "readingsProxy rp off"-Event:
define di DOIF ([+00:00:02]) ({ Log 1, "Hallo Welt" })

mc

Hat niemand dazu eine Idee?  :-\
...oder ist mein Überlegung einfach quatsch?

LuckyDay

bei mir geht readingsproxy

deine definition zeigt halt nicht auf ein reading, sondern nur auf das device, obs daran liegt?


Zitatdefine <name> readingsProxy <device>:<reading>

mc

#3
Hallo Hary, danke für deine Antwort.

Prinzipiell funktioniert readingsProxy ja auch bei mir - bis auf das "seltsame" verhalten, womit ich nicht gerechnet hätte (siehe Beschreibung im ersten Beitrag).

Ich habe das gleiche nochmal probiert und dieses Mal folgendermaßen den Proxy eingestellt:
define rp readingsProxy dummy:state

Das Verhalten ändert sich aber nicht.

Immer wenn ich z.B. einen atjob anlegen mit beispielsweise:
define atjob at +00:00:03 { Log 1, "Test At-Job" }
werden scheinbar alle Readings von allen Proxies aktualisiert obwohl es bei dem Device, von dem das Reading kommt, keine Änderung gab.

LuckyDay

2015-05-03 02:00:48.886 at atjob Next: 02:00:51
2015-05-03 02:00:51.883 at atjob Next: 02:00:54
2015-05-03 02:00:54.887 at atjob Next: 02:00:57
2015-05-03 02:00:57.887 at atjob Next: 02:01:00
2015-05-03 02:01:00.025 readingsProxy rp off
2015-05-03 02:01:00.032 readingsProxy rp off
2015-05-03 02:01:00.034 dummy dummy off
2015-05-03 02:01:00.884 at atjob Next: 02:01:03
2015-05-03 02:01:03.885 at atjob Next: 02:01:06
2015-05-03 02:01:06.885 at atjob Next: 02:01:09
2015-05-03 02:01:09.885 at atjob Next: 02:01:12
2015-05-03 02:01:12.884 at atjob Next: 02:01:15

set dummy off
ich kanns nicht nachvollziehen, habe deine definitionen genommen
einzige Änderung war
define atjob at +*00:00:03 { Log 1, "Test At-Job" }

bist du mit Fhem aktuell, worauf läufts usw

kannst mit version abfragen


# $Id: fhem.pl 8448 2015-04-17 16:14:45Z rudolfkoenig $
# $Id: 33_readingsProxy.pm 7737 2015-01-26 16:28:33Z justme1968 $

mc

#5
Danke, dass du es bei dir probiert hast.  :)

Hier mal erst das Einfache (habe gerade noch ein Update gemacht):
# $Id: fhem.pl 8499 2015-04-30 09:49:39Z rudolfkoenig $
# $Id: 33_readingsProxy.pm 7737 2015-01-26 16:28:33Z justme1968 $


Worauf läuft es:
Hardware: Raspberry Pi 2 Model B
Software:
Kernel: Linux pi 3.18.10-v7+ #775 SMP PREEMPT Thu Apr 2 19:01:29 BST 2015 armv7l GNU/Linux
Distribution: Raspbian GNU/Linux 7

Um das ganze nochmal nachzustellen habe ich folgende fhem.cfg genommen:
http://svn.code.sf.net/p/fhem/code/tags/FHEM_5_6/fhem/fhem.cfg
und außerdem die fhem.save-Datei umbenannt damit beim Start alles "frisch" ist.

Nach dem Start habe ich eine Verbindung zur Telnet-Schnittstelle aufgebaut und parallel dazu den Event monitor vom Webinterface anzeigen lassen.








Eingabe an der Telnet SchnittstelleAusgabe vom Event MonitorBemerkung
define atjob at +00:00:03 { Log 1, "Test At-Job" }2015-05-03 19:03:54 at atjob Next: 19:03:57
2015-05-03 19:03:54 Global global DEFINED atjob
2015-05-03 19:03:57 Global global DELETED atjob
Der At-Job wird angelegt, nach 3 Sekunden ausgeführt und wieder gelöscht.
define dummy dummy2015-05-03 19:05:38 Global global DEFINED dummydummy-Device wird erstellt
set dummy off2015-05-03 19:06:28 dummy dummy offState von dummy wird auf off gesetzt.
define rp readingsProxy dummy:state2015-05-03 19:07:23 readingsProxy rp off
2015-05-03 19:07:23 readingsProxy rp off
2015-05-03 19:07:23 Global global DEFINED rp
Der readingsProxy rp für das Device dummy auf das Reading state wird erstellt.
Man sieht, dass es zwei Events gibt, die vom readingsProxy melden, dass der
Status off ist. Das verstehe ich nicht. Warum zwei Mal?
define atjob at +00:00:03 { Log 1, "Test At-Job" }2015-05-03 19:11:42 at atjob Next: 19:11:45
2015-05-03 19:11:42 readingsProxy rp off
2015-05-03 19:11:42 Global global DEFINED atjob
2015-05-03 19:11:45 readingsProxy rp off
2015-05-03 19:11:45 Global global DELETED atjob
Ein neuer At-Job wird angelegt, der nach 3 Sekunden ausgeführt und wieder
gelöscht wird.
Dabei erscheinen aber noch zwei Events, die ich nicht erwartet hätte.
Das readingsProxy Device meldet zwei Mal den Status off,
obwohl sich beim dummy Device-Status nichts geändert hat.
Meine große Frage ist nun:
Warum erzeugt das Device in diesem Fall zwei Events?

Vielleicht verstehe ich auch die Funktionsweise von fhem oder readingsProxy irgendwie falsch, aber ich hätte nicht damit gerechnet, dass Events erzeugt werden obwohl sich scheinbar nichts ändert.

Noch eine kleine Ergänzung zum Hintergrund:
Aufgefallen ist mir das ganze im Zusammenhang mit der Verwendung von valueFn bei readingsProxy um z.B. eine Art Taster mit "Zusatzfunktionen" zu basteln:
define taster readingsProxy i2c20:PortA7
attr taster alias Taster A7
attr taster userattr laston lastoff
attr taster valueFn { my $time=time();; if ($VALUE eq "on") { fhem "attr taster laston $time;;setreading taster state on" } else { fhem "attr taster lastoff $time;;setreading taster state off" } }

Meine Idee war, dass ich darüber im Proxy speichere, wann (Unix Timestamp) der Taster zuletzt gedrückt und zuletzt losgelassen wurde um z.B. berechnen zu können, wie lange ein Taster gedrückt wurde. Damit wollte ich eigentlich eine Art "long-press" Funktionalität umsetzen. Das hat nur leider so nicht funktioniert weil der readingsProxy mehr Events erzeugt, als ich erwartet hatte.