userReadings werden nicht gesetzt

Begonnen von 87insane, 16 September 2019, 17:18:42

Vorheriges Thema - Nächstes Thema

87insane

Keine Sorge... Das hatte ich natürlich auch gemacht. Mittlerweile behaupte ich die Zusammenhänge ein wenig zu verstehen :)

Otto123

Zitat von: 87insane am 17 September 2019, 14:39:55
Keine Sorge... Das hatte ich natürlich auch gemacht. Mittlerweile behaupte ich die Zusammenhänge ein wenig zu verstehen :)
Ich wollte Dir nichts unterstellen :) aber manchmal denkt man ja nicht dran. Vor allem wenn einen das Thema zur Verzweiflung bringt
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

87insane

Hab ich auch nicht so aufgefasst... Bin für jede Hilfe dankbar!

Otto123

Wenn Du sagst die Readings werden gar nicht angelegt, dann bau doch mal zwei notifys auf diesen trigger und mach einfach einen Log Eintrag. Und wenn das geht packst Du den Code mal da rein, mit setreading. Nur zum Test
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

Beta-User

Ok, also nochmal von vorne:

Grundsätzlich würde ich tippen, dass Otto recht hat, mit der Vermutung, dass das "selbsttriggern" eventuell nicht (immer) geht - MQTT2_DEVICE scheint das nur aus irgendeinem Grund nicht zu wissen ;D .

Da du sowieso auf der Perl-Ebene bist, kannst du ggf. mal den Tip aus setreading adaptieren:
ZitatAchtung: 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.
Das müßte dann in den "running"-Code rein.

Zu '"$name"' noch: die Anführungszeichen sind in ReadingsVal() etc. unnötig, aber unschädlich; die werden einfach ignoriert ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

87insane

#20
Habe das ganze Gerät nun gelöscht und neu angelegt...Brachte auch nichts.

Events kommen vom Gerät:
2019-09-17 15:04:02 Global global ATTR s_trockner userReadings total_temp:running:.true { ReadingsNum("$name","total",0) }, gang:running:.false { ReadingsNum("$name","total",0) - ReadingsNum("$name","total_temp",0) }, running:power:.* {(ReadingsNum("$name","power",0) > ReadingsNum("$name","swerta",0)) ? 'true' : 'false'}
2019-09-17 15:04:15 TPLinkHS110 s_trockner on_time: 60
2019-09-17 15:04:15 TPLinkHS110 s_trockner rssi: -77
2019-09-17 15:04:15 TPLinkHS110 s_trockner current: 0.012648
2019-09-17 15:04:15 TPLinkHS110 s_trockner voltage: 237.737219
2019-09-17 15:04:48 TPLinkHS110 s_trockner power: 100
2019-09-17 15:04:48 TPLinkHS110 s_trockner running: true
2019-09-17 15:05:15 TPLinkHS110 s_trockner on_time: 120
2019-09-17 15:05:15 TPLinkHS110 s_trockner rssi: -78
2019-09-17 15:05:15 TPLinkHS110 s_trockner current: 0.013103
2019-09-17 15:05:15 TPLinkHS110 s_trockner power: 0
2019-09-17 15:05:15 TPLinkHS110 s_trockner voltage: 237.585502
2019-09-17 15:05:15 TPLinkHS110 s_trockner running: false
2019-09-17 15:06:15 TPLinkHS110 s_trockner on_time: 180
2019-09-17 15:06:15 TPLinkHS110 s_trockner rssi: -75
2019-09-17 15:06:15 TPLinkHS110 s_trockner current: 0.012743
2019-09-17 15:06:15 TPLinkHS110 s_trockner voltage: 237.812688


Das triggern mache ich über 2 Ecken. Ich sette POWER auf einen Wert über swerta. Dann triggert running auch korrekt und springt auf true. Der Rest passiert dann aber leider nicht. Das geht auch nicht, wenn ich einfach einen Verbraucher an die Zwischendose stecke der mehr braucht als der eingegebene Schwellwert (swerta).

Also bisher alles ein wenig komisch... Wenn "running" angelegt wird, erwarte ich das auch vom Rest. Es muss also ja das triggern funktionieren. Zumindest über meinen Umweg oder aber einen Verbraucher. Was kann ich noch testen?

Oder inkludierst du hier auch das userReadings auch nur ein notify ist und das dieses selbst triggern nicht geht?




Okaaaaaaaayyyy.... Das ist aber nun für mich total komisch!

Wenn ich also setreading s_trockner power auf z.B. 100 setze, setzt er running. Aber nicht total_temp.
Wenn ich nun aber einfach weiter gehe und setreading running true setze, setzt er total_temp.

Passt also zu der Beschreibung die Ihr meint. Aber das kann doch eigentlich nicht so gewollt sein oder? Bei einem Gerät / Protokoll geht das, bei einem anderen nicht?

Otto123

#21
sleep 0.1 oder so einbauen?

ZitatNote: setreading won't generate an event for device X, if it is called from a notify for device X. Use "sleep 0.1; setreading X Y Z" in this case.

@Beta-User
Zitat von: Beta-User am 17 September 2019, 14:58:00
Zu '"$name"' noch: die Anführungszeichen sind in ReadingsVal() etc. unnötig, aber unschädlich; die werden einfach ignoriert ;) .
Da komm ich später nochmal drauf zurück  ::)
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

Beta-User

userReadings ist jedenfalls eng verwandt mit notify. Das setzt intern einen Merker bei jedem auslösenden Gerät, dass es grade in der Eventverarbeitung ist (um Endlosschleifen zu vermeiden).

Da userReadings auch ohne trigger definiert werden können, MUSS es m.E. zwingend so was ähnliches geben, um Endlosschleifen zu verhindern (ohne das jetzt im Code von fhem.pl nachgesehen zu haben).

Zitat von: Otto123 am 17 September 2019, 15:24:52
@Beta-User
Da komm ich später nochmal drauf zurück  ::)
Bin mal gespannt, das ist eher empitische Erfahrung denn theoretisch fundiertes Fachwissen ;D .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

87insane

#23
Was ist denn hier am besten dann zu tun?

In einem MQTT Gerät geht es. Okay
In einem anderem nicht. Komisch oder gewollt....

An welcher stelle sollte der Benutzer/ich das am besten nun setzen? Verursache ich nicht ggf. mit sleep 0,1 im userReading nicht dann wieder neue Probleme?

Ich mag es einheitlich... Gut wäre z.B. etwas wie "setreading xyz 1" um ein Event absichtlich zu generieren oder eben 0 für nicht. Ich habe nun verstanden warum es hier nicht so geht wie ich dachte aber im EventMonitor sehe ich es ja auch. Zeigt der also nun etwas an was nicht stimmt? Ohne Euch wäre ich da so nicht drauf gekommen und ich bin sicher das verwirrt nicht nur mich.

Zurück zum Problem:
running wird getriggert da das ja durch den Power Wert kommt und der ja durch das Gerät direkt geliefert wird. Okay - verstanden - Das kann also so bleiben.

Wie baue ich das denn ins userReadings ein? Eigentlich müsste das ja dann direkt in running und in total_temp aber nicht mit in gang. Ich wüsste aktuell nicht wie ich sleep 0.1 da nun gut mit rein bekomme. Ich weiß, fertigen Code gibt hier keiner so gerne weiter aber das wäre nun echt eine Hilfe, nach der Nummer.

Zu den ganzen Fragen oben, könnte das hin hauen? Will nicht morgen den nächsten Side effect haben. :-\

total_temp:running:.true {sleep 0.1; ReadingsNum("$name","total",0) },
gang:running:.false { ReadingsNum("$name","total",0) - ReadingsNum("$name","total_temp",0) },
running:power:.* {(ReadingsNum("$name","power",0) > ReadingsNum("$name","swerta",0)) ? 'sleep 0.1; true' : 'sleep 0.1; false'}


Wie löst ihr diese Trockner/Waschmaschinen-Geschichte?




ZitatDa komm ich später nochmal drauf zurück  ::)
ZitatBin mal gespannt, das ist eher empitische Erfahrung denn theoretisch fundiertes Fachwissen ;D .

Hattest mir da auch mal ein paar Übungen gegeben :-P --- Ich bin mir auch nicht immer sicher aber meist bekomme ich die Sachen zum laufen. Ob das dann perfekt ist, bezweifel ich. Wenn ihr das ggf. in einem Thread macht, ladet mich direkt mit ein. :)

Otto123

{sleep 0.1; ReadingsNum("$name","total",0) },So wäre auch mein Ansatz :)
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

87insane

Wenn ich nun richtig aufgepasst habe müsste NUR bei running das sleep 0.1 rein, um ein Event zu erzeugen.
Da running die beiden anderen Readings triggert. Das wiederum bekomme ich aber mit ternary IF nicht hin. Geht das überhaupt gleichzeitig darein?

running:power:.* {(ReadingsNum("$name","power",0) > ReadingsNum("$name","swerta",0)) ? 'true' : 'false' }

Beta-User

Vorschlag: In den Code für "running" eine "trigger"-Anweisung für "running" nach einem sleep einbauen; das muß in eine "fhem ..."-Anweisung rein (oder AnalyzeCommandChain()). Also erst: Rückgabewert bestimmen, das "sleep/trigger"-Dingens mit dem gefundenen Rückgabewert aufrufen, dann erst die eigentliche Rückgabe.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

Beta-User: Deinen Vorschlag hab ich jetzt nicht verstanden. ;)

Warum soll das nicht so gehen?
running:power:.* {sleep 0.1;(ReadingsNum("$name","power",0) > ReadingsNum("$name","swerta",0)) ? 'true' : 'false' }

Ich weiß bloß nach wie vor nicht, ob das überhaupt die richtige Lösungsrichtung ist.  ::)

Hast Du mal notify und Log Eintrag probiert? Wird denn überhaupt getriggert? Lassen sich die Werte zu dem Zeitpunkt überhaupt mit deinem Code lesen?
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

87insane

Den Vorschlag von Beta habe ich auch noch nicht verstanden...

Die Idee:
running:power:.* {sleep 0.1;(ReadingsNum("$name","power",0) > ReadingsNum("$name","swerta",0)) ? 'true' : 'false' }
hatte ich auch und das geht leider nicht.

ZitatHast Du mal notify und Log Eintrag probiert? Wird denn überhaupt getriggert? Lassen sich die Werte zu dem Zeitpunkt überhaupt mit deinem Code lesen?
Ich könnte eins bauen, was das macht...
Hatte ja ein paar EventMonitore da gelassen mit dem alten Code. Da sieht man ja was passiert. Weswegen ich nach wie vor etwas verwirrt bin. In meinem langen Beitrag stellte ich dazu ja ein paar Fragen. Mir ist nicht klar wie ich im EventMonitor zwischen wirklichem Event und einem "nicht" wirklichem Event filtern sollte.
Die Werte sollten sich lesen lassen (vermutungs Modus), da es bei dem anderen Gerät auch geht. Auch wenn das andere ein MQTT Gerät ist, sind es ja am Ende des Tages auch nur Readings aber leider kein Trigger (bei nicht MQTT Gerät).

Ich werde heute wohl pausieren. Verstehe nur noch die Hälfte und brauche wohl mal ne Pause. Bin morgen aber wieder dran und freue mich natürlich über jede Hilfe. Hoffe ihr versteht wie das meine mit dem durch sein für heute.... Das war jetzt ein ganzer Tag voller Verzweifelung. :-\

Beta-User

Du nutzt damit aber kein FHEM-sleep, sondern Perl-sleep, oder? Bin nicht sicher, ob das das gewünschte Ergebnis (andere, nachgelagerte Einordnung in die Ereignisverarbeitung...) bewirkt ;) . Das hält nur den gesamten Verkehr auf, oder?
Das sollte bei durch die in den "fhem ..."-Aufruf gekapselter sleep-Anweisung anders sein, da wird ein InternalTimer gesetzt ;) .

running:power:.* {my $ret =(ReadingsNum($name,"power",0) > ReadingsNum("$name","swerta",0)) ? 'true' : 'false';; AnalyzeCommandChain(undef,"sleep 0.1;;trigger $name power $ret");;$ret }
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors