[gelöst]Wert eines dummy aus Perl heraus verändern ?

Begonnen von pwlr, 19 September 2017, 10:22:16

Vorheriges Thema - Nächstes Thema

pwlr

Moin,

ich wollte mal was einfaches machen und krieg es trotzdem nicht hin...
Mein Problem:
Ein dummy "Log_write_EMA" soll von einer Sub aus Perl heraus verändert und die Änderung in ein Filelog geschrieben werden. Diese Sub wird von einem userReading aufgerufen (Trigger funktioniert)

.... Auszug
my$text = "Testmessage";

if ($ur01 eq "open" and $ur02 ne "off") {
# fhem("set Log_write_EMA $text");
fhem("set Led_07 led red");
fhem("setreading Log_write_EMA state $text");
};

Per Aufruf mit {userReadings_20("Tuer_EG_Bernd")} aus der Kommandozeile heraus funktioniert die Sub.
Per Aufruf über ein userReading pct:(trigger_cnt.*) {userReadings_20($name)} wird der neue Wert des Dummy offensichtlich nur in einen Puffer geschrieben und erst nach Bildschirmrefresh angezeigt - aber nicht im Filelog geloggt. Erst wenn ich den Dummy manuell in der Kommandozeile einen neuen Wert zuweise, kommen zusätzlich die alten Einträge aus dem Buffer in das Filelog.

Bei beiden Versionen erhalte ich das gleiche Ergebnis
fhem("set Log_write_EMA $text");
fhem("setreading Log_write_EMA state $text");

set Led_07 led red ist nur ein Vergleichstest mit einem physischen Device, der immer funktioniert.

Internals:
   NAME       Log_write_EMA
   NR         1458
   STATE      Testmessage
   TYPE       dummy
   CHANGED:
     08 Test Eingangstuer wurde geoeffnet
     08 Test Eingangstuer wurde geoeffnet
     Testmessage
   CHANGEDWITHSTATE:
   Helper:
     DBLOG:
       state:
         logdb:
           TIME       1505805842.37789
           VALUE      08 Eingangstuer wurde test geoeffnet
   READINGS:
     2017-09-19 10:02:09   state           Testmessage
Attributes:
   DbLogInclude state
   event-on-change-reading .*
   event-on-update-reading state
   group      EMA
   room       B-EMA,Carport


Was mache ich falsch ???? Könnte mir bitte jemand einen Tipp geben ?
Viele Grüße
Bernd

igami

Bau mal ein sleep 0.001 vor dem FHEM Befehlen ein. Notify verhindert das erzeugen von events die das notify selbst auslösen.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Otto123

Der Part aus der Doku dazu  8)
Zitatsetreading

setreading <devspec> <reading> <value>

Der Befehl setzt das Reading <reading> auf den Wert <value> ohne Signale an das betroffene Gerät zu senden, generiert aber Ereignisse und die übliche eventMap und stateFormat Umwandlung wird auch durchgeführt.
Siehe den Abschnitt über Geräte-Spezifikation für Details der <devspec> und die Beschreibung des set Befehls für Ersetzung.

Beispiel:
setreading lampe state on
Achtung: setreading generiert kein Event für ein Gerät X, falls es aus einem notify für Gerät X aufgerufen wurde. In so einem Fall könnte man auf "sleep 0.1; setreading X Y Z" ausweichen.

Außerdem gab es irgendwo noch eine Beschreibung zum FHEMWEB (habe ich gerade nicht parat) welcher Teil in der Oberfläche sofort aktualisiert wird und welcher Teil erst nach Refresh im Browser. Da gibt es Unterschiede!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

pwlr

Gigantisch, ich danke Euch !!!

Also, mein Versuch mit setreading war nix, wer lesen kann ist klar im Vorteil  :D

fhem("set Log_write_EMA $text"); -> state wird aktualisiert, STATE erst nach Bildschirmrefresh und kein Logging im Filelog.

fhem("sleep 0.0001;set Log_write_EMA $text"); -> state wird aktualisiert, STATE erst nach Bildschirmrefresh aber das Logging im Filelog und in DbLog funktionieren.

Mein Ziel ist also erreicht, aber ich verstehe es nicht, da ich die fhem-Internas nicht kenne.
Funktionsablauf:
1. Ein Tür/Fensterkontakt geht auf "open" und triggert sein userReading pct:(trigger_cnt.*) {userReadings_20($name)}
2. In userReadings_20 wird eine Message in state eines Dummy geschrieben.
3. Der Dummy ist einem Filelog zugeordnet.
4. Ende

Also kein Loop nach
ZitatAchtung: setreading generiert kein Event für ein Gerät X, falls es aus einem notify für Gerät X aufgerufen wurde
und eigentlich auch kein notify, oder wird "userReading pct:(trigger_cnt.*)" intern als notify aufgelöst und ausgeführt? Die Funktion ist ja identisch zu einem notify.
Und was macht der sleep, außer der kurzen Wartezeit ?

spannend !

Also, vielen Dank an Euch, Ihr habt mir sehr geholfen !
Bernd