Hallo zusammen,
ich habe mal wieder ein Thema an dem ich hänge.
Ich habe eine Waschmaschine und einen Trockner. Beide haben im Eintrag userReadings folgendes stehen:
userReadings
total_temp:running.*true.* { ReadingsVal("$name","total",0) },
gang:running.*false.* { ReadingsVal("$name","total",0) - ReadingsVal("$name","total_temp",0) },
running {(ReadingsVal("$name","power",0) > ReadingsVal("$name","swerta",0)) ? 'true' : 'false'}
Das Reading running, wird bei beiden korrekt gesetzt.
Die Readings gang und total_temp macht nur die Waschmaschine korrekt. Im Trockner passiert da leider nichts.
total_temp sollte nur den aktuellen Wert aus total in total_temp schreiben. Das passiert aber beim Trockner nicht. Deswegen klappt auch die Berechnung von "gang" am Ende nicht.
Wenn ich total auslesen will und das über die Kommandozeile teste, geht es ({ ReadingsVal("s_trockner","total","error") }). Auch wenn ich "s_trockner" im userReading anstelle von "$name" eingebe, geht es nicht.
Wenn ich manuell setreading auf total_temp setze, geht es auch. Ich bin hier ratlos.
Der einzige Unterschied der mir noch einfällt, wäre das eine Gerät (Waschmaschine) ist ein Shelly und kommt über MQTT2 rein. Der Trockner ist ein TPLink Zwischenstecker.
Ich hoffe ich habe einfach nur die ganze Zeit was übersehen. Mir ist nicht klar warum "s_trockner total" nicht ausgelesen werden kann vom userReadings aber über die Kommandozeile schon. Wenn ich mir die Benachrichtigungen (pushbullet) ansehe auf meinem Handy. Bekomme ich nachdem ich total_temp z.B. manuell über setreading setze auch den korrekten Zeitstempel vom Reading ausgelesen. Also wenn das Ding vor 2 Minuten von mir manuell beschrieben wurde, steht in der Nachricht auch die korrekte Zeit. Nur der Inhalt des Readings will nicht. Hoffe ich habe alles gut genug erklärt, bin selber ganz durch den Wind nun.
Anbei mal jeweils ein List der Geräte.
Trockner (GEHT NICHT):
Internals:
CFGFN ./FHEM/Energie.cfg
DEF 192.168.20.20
FUUID 5c443c13-f33f-fcb4-e2e7-1e81da53f8d83f39
HOST 192.168.20.20
INTERVAL 60
NAME s_trockner
NEXTUPDATE Mon Sep 16 17:11:07 2019
NR 38
STATE on
TIMEOUT 1
TYPE TPLinkHS110
OLDREADINGS:
READINGS:
2019-09-16 17:10:07 active_mode schedule
2019-09-16 17:10:07 alias s_trockner
2019-08-13 17:34:17 aname Der Trockner
2019-09-16 17:10:07 current 0.013098
2019-09-16 17:10:07 daily_average 0.45975
2019-09-16 17:10:07 daily_total 0.000
2019-09-16 17:10:07 decode_json ok
2019-09-16 17:10:07 dev_name Wi-Fi Smart Plug With Energy Monitoring
2019-09-16 17:10:07 deviceId 8006874906580C5CE4E5412EEE59F5AF18DFD0AA
2019-09-16 17:10:07 err_code 0
2019-09-16 17:10:07 feature TIM:ENE
2019-09-16 17:10:07 fwId 00000000000000000000000000000000
2019-08-29 12:00:17 gang 0
2019-09-16 17:10:07 hwId 45E29DA8382494D2E82688B52A0B2EB5
2019-09-16 17:10:07 hw_ver 1.0
2019-09-16 17:10:07 icon_hash
2019-09-16 17:10:07 latitude 49.222381
2019-09-16 17:10:07 led_off 1
2019-09-16 17:10:07 longitude 9.984479
2019-09-16 17:10:07 mac 50:C7:BF:BD:86:52
2019-09-16 17:10:07 model HS110(EU)
2019-09-16 17:10:07 monthly_total 7.356
2019-09-16 17:10:07 oemId 3D341ECE302C0642C99E31CE2430544B
2019-09-16 17:10:07 on_time 969388
2019-09-16 17:10:07 power 0
2019-09-16 17:10:07 relay_state 1
2019-09-16 17:10:07 rssi -73
2019-09-16 17:10:07 running false
2019-09-16 17:10:07 state on
2019-09-16 17:10:07 sw_ver 1.2.5 Build 171213 Rel.101523
2019-08-13 17:35:53 swerta 45
2019-08-13 17:36:07 swerte 40
2019-09-16 17:10:07 total 4.054
2019-09-16 17:09:59 total_temp 0
2019-09-16 17:10:07 type IOT.SMARTPLUGSWITCH
2019-09-16 17:10:07 updating 0
2019-09-16 17:10:07 voltage 239.060665
Attributes:
alias Keller Wäsche Trockner
devStateIcon { my $pic = ReadingsVal($name,"running","") eq "true"?'scene_clothes_dryer@green':'scene_clothes_dryer';; my $text = ReadingsVal($name,"running","") eq "true"?"Trockner läuft - Aktuell: ".ReadingsVal($name,"power","")." W":'Standby';; "<div><a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a> ".FW_makeImage($pic)." $text </div>" }
disable 0
event-on-change-reading .*
group Strom
interval 60
room FHEM / Info,Keller
userReadings total_temp:running.*true.* { ReadingsVal("$name","total","error") },
gang:running.*false.* { ReadingsVal("$name","total","error") - ReadingsVal("$name","total_temp","error") },
running {(ReadingsVal("$name","power",0) > ReadingsVal("$name","swerta",0)) ? 'true' : 'false'}
verbose 1
webCmd :
Waschmaschine (GEHT):
Internals:
CID shellyplug_s_040C7E
DEF shellyplug_s_040C7E
DEVICETOPIC MQTT2_shellyplug_s_040C7E
FUUID 5d4c47d9-f33f-fcb4-c859-f484bf00612f2b75
IODev MQTT2_FHEM_Server
LASTInputDev MQTT2_FHEM_Server
MQTT2_FHEM_Server_MSGCNT 58560
MQTT2_FHEM_Server_TIME 2019-09-16 17:11:17
MSGCNT 58560
NAME MQTT2_shellyplug_s_040C7E
NR 382
STATE on
TYPE MQTT2_DEVICE
READINGS:
2019-08-13 17:34:03 aname Die Waschmaschine
2019-09-16 17:02:49 fw_ver 20190821-095311/v1.5.2@4148d2b7
2019-09-15 14:38:32 gang 1.73
2019-09-16 17:02:49 id shellyplug-s-040C7E
2019-09-16 17:02:49 ip 192.168.20.23
2019-09-16 17:02:49 mac 4C11AE040C7E
2019-09-16 17:02:49 new_fw false
2019-09-16 17:02:49 online true
2019-09-16 17:11:17 overtemperature 0
2019-09-16 17:11:17 power 0
2019-09-16 17:11:17 relay0 on
2019-09-16 17:11:17 relay_0_energy 1.77
2019-09-16 17:11:17 running false
2019-09-16 17:10:47 statRelay_0_energy Hour: 0.000000000000000000 Day: 0.010000000000000007 Month: -3.699999999999996625 Year: 0.370000000000030083 (since: 2019-08-16 )
2019-09-16 17:10:47 statRelay_0_energyDay 0.010000000000000007
2019-09-15 23:59:55 statRelay_0_energyDayLast 1.750000000000000000
2019-09-16 16:59:55 statRelay_0_energyLast Hour: 0.000000000000000000 Day: 1.750000000000000000 Month: 4.070000000000030482 Year: - (since: 2019-08-16 )
2019-09-16 17:10:47 statRelay_0_energyMonth -3.699999999999996625
2019-08-31 23:59:55 statRelay_0_energyMonthLast 4.070000000000030482
2019-09-16 17:10:47 statRelay_0_energyYear 0.370000000000030083
2019-09-16 17:11:17 state on
2019-08-13 17:35:21 swerta 4
2019-08-13 17:35:34 swerte 4
2019-09-16 17:11:17 temperature 29.35
2019-09-16 17:11:17 temperature_f 84.83
2019-09-15 11:39:26 total_temp 0.02
helper:
_98_statistics statisticsDEV
Attributes:
IODev MQTT2_FHEM_Server
alias Keller Waschmaschine
devStateIcon { my $amp = ReadingsVal($name,"online","false") eq "false" && ReadingsVal($name,"new_fw","false") eq "false" || ReadingsVal($name,"online","false") eq "false" && ReadingsVal($name,"new_fw","false") eq "true" ? "rot" : ReadingsVal($name,"online","false") eq "true" && ReadingsVal($name,"new_fw","false") eq "true" ? "gelb" : "gruen";; my $pic = ReadingsVal($name,"running","") eq "true"?'scene_laundry_room_fem@green':'scene_laundry_room_fem';; my $text = ReadingsVal($name,"running","") eq "true"?"Waschmaschine läuft - Aktuell: ".ReadingsVal($name,"power","")." W":'Standby';; my $show = "$amp" eq "gelb" ? "<a href=\"/fhem?cmd.dummy=set $name x_update&XHR=1\">".FW_makeImage("10px-kreis-".$amp)."</a>" : "<a href=\"http://".ReadingsVal($name,"ip","none")." \"target=\"_blank\">".FW_makeImage("10px-kreis-".$amp)."</a>";; "<div> $show <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>".FW_makeImage($pic)." $text </div>" }
event-on-change-reading .*
genericDeviceType switch
group Strom
model A_10a_shellyplug
readingList shellies/shellyplug-s-040C7E/relay/0:.* state
shellies/shellyplug-s-040C7E/relay/0:.* relay0
shellies/shellyplug-s-040C7E/input/0:.* input0
shellies/shellyplug-s-040C7E/online:.* online
shellies/shellyplug-s-040C7E/announce:.* { json2nameValue($EVENT) }
shellies/announce:.* { $EVENT =~ m,..id...shellyplug-s-040C7E...mac.*, ? json2nameValue($EVENT) : undef }
shellies/shellyplug-s-040C7E/relay/0/power:.* {'power' => $EVENT > 1 ? $EVENT : '0'}
shellies/shellyplug-s-040C7E/temperature:.* temperature
shellies/shellyplug-s-040C7E/overtemperature:.* overtemperature
shellies/shellyplug-s-040C7E/relay/0/energy:.* {'relay_0_energy' => sprintf("%.2f",$EVENT/60/1000)}
shellies/shellyplug-s-040C7E/temperature_f:.* temperature_f
room FHEM / Info,Keller,MQTT
setList off:noArg shellies/shellyplug-s-040C7E/relay/0/command off
on:noArg shellies/shellyplug-s-040C7E/relay/0/command on
x_update:noArg shellies/shellyplug-s-040C7E/command update_fw
x_mqttcom shellies/shellyplug-s-040C7E/command $EVTPART1
userReadings total_temp:running.*true.* { ReadingsVal("$name","relay_0_energy",0) },
gang:running.*false.* { ReadingsVal("$name","relay_0_energy",0) - ReadingsVal("$name","total_temp",0) },
running {(ReadingsVal("$name","power",0) > ReadingsVal("$name","swerta",0)) ? 'true' : 'false'}
DANKE an alle :)
Leider kann man mit deinen "list" nicht genau feststellen, was passiert ist.
Deine Readings total_temp werden jedes Mal gesetzt, wenn ein Ereignis "running true" kommt.
Die stehen aber in den "list" auf false.
Anscheinend ist beim Trockner running letztes Mal um 17:09:59 true gewesen und dabei war total gleich 0
Und bei der Waschmaschine gestern um 11:39 und dabei war total 0.02 (komischerweise gibt es im Device kein Reading "total" laut list)
Um etwas sagen zu können, muss man die Events aus dem Eventmonitor, oder die Log sehen.
Wer viel schreibt, kann viel vergessen. Uff...sorry.
Hatte erwähnt das es unterschiedliche geräte sind aber vergessen userReadings von der Waschmaschine mit zu senden. Da sind aber auch nur anstelle von "total" das Energy Reading vom shelly drin. Hatte es sogar heute Mittag nochmal hin und her kopiert, weil ich dachte es fehlt ggf nur ein Komma oder so und ich sehe das einfach nicht.
Das der trockner Direkt aus war ist normal. Wenn ich via setreading auf das Energy Reading einen wert gebe, der Running auf True setzt, danach aber relativ schnell ein Status Update des Gerätes dahinter.
Event oder / und log mache ich morgen. Sende ich nach. Danke schon mal :)
Hey und guten Morgen,
hier mal ein EventMonitor Auszug....
2019-09-17 07:57:01 TPLinkHS110 s_trockner power: 100
2019-09-17 07:57:01 TPLinkHS110 s_trockner running: true
2019-09-17 07:57:23 TPLinkHS110 s_trockner on_time: 1022622
2019-09-17 07:57:23 TPLinkHS110 s_trockner current: 0.012649
2019-09-17 07:57:23 TPLinkHS110 s_trockner power: 0
2019-09-17 07:57:23 TPLinkHS110 s_trockner voltage: 237.152871
2019-09-17 07:57:23 TPLinkHS110 s_trockner running: false
Regex zu running sollte also passen. Da das Reading ja eh durch mich erzeugt wurde, sollte es ja auch bei allen Geräten gleich aussehen und reagieren. Hab ja sogar .* genommen. Etwas groß aber so kann eigentlich ja nichts durch rutschen in dem Fall.
ZitatAnscheinend ist beim Trockner running letztes Mal um 17:09:59 true gewesen und dabei war total gleich 0
17:09:59 war total 4.054. total_temp war zu dem Zeitpunt 0. Genau das ist ja mein Problem. Es wird aus einem mir unbekanntem Grund nicht gesetzt. total_temp sollte der Wert aus total, zum Zeitpunkt des Starts vom Trockner sein.
Anbei, vollständigkeitshalber auch nochmal userReadings von der Waschmaschine, separat. Bei der ein genutztes Reading abweicht aber der Rest gleich ist:
total_temp:running.*true.* { ReadingsVal("$name","relay_0_energy",0) },
gang:running.*false.* { ReadingsVal("$name","relay_0_energy",0) - ReadingsVal("$name","total_temp",0) },
running {(ReadingsVal("$name","power",0) > ReadingsVal("$name","swerta",0)) ? 'true' : 'false'}
Ich würde das etwas anders machen:
total_temp:running:.true { ReadingsNum("$name","relay_0_energy",0) },
gang:running:.false { ReadingsNum($name,"relay_0_energy",0) - ReadingsNum($name,"total_temp",0) },
running:(power|swerta):.* {(ReadingsNum($name,"power",0) > ReadingsNum($name,"swerta",0)) ? 'true' : 'false'}
Gruß
Dan
Hi,
habe das mal angepasst. Allerdings habe ich die Regex auf swerta bei running weg gelassen, da dieser Wert sich nicht ändert. Er ist nur da um das Script für alle Geräte einheitlich zu machen. So kann ich bei jedem Gerät einen Schwellwert eintragen ab wann es reagieren soll.
Ist zumindest schneller aufgrund der Eingrenzung. Für den Trockner wäre es dann so:
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'}
Ich frage mich ob ich das Wiki zu ReadingsNum falsch verstehe. Aber es geht damit ja auch, anscheinend.
Die Sache an sich geht aber noch immer nicht.
Anbei das Event Log. Das Verhalten ist noch identisch zu dem Verhalten vorher. (geht nicht).
2019-09-17 09:38:32 TPLinkHS110 s_trockner power: 100
2019-09-17 09:38:32 TPLinkHS110 s_trockner running: true
2019-09-17 09:39:14 TPLinkHS110 s_trockner on_time: 1028733
2019-09-17 09:39:14 TPLinkHS110 s_trockner current: 0.012861
2019-09-17 09:39:14 TPLinkHS110 s_trockner power: 0
2019-09-17 09:39:14 TPLinkHS110 s_trockner voltage: 238.133898
2019-09-17 09:39:14 TPLinkHS110 s_trockner running: false
total_temp wird weiterhin nicht beschrieben. Hätte mich aber auch gewundert. Das alles ist nun etwas schöner (DANKE dafür) aber vom Prinzip her ja noch genau das gleiche.
Hi,
wenn ich das in der FHEM Komandozeile einwerfe:
{my $var="w1";;$var=ReadingsNum($var,"state","Error")}
bekomme ich 29 weil das im state von w1 steht
Wenn ich das mache
{my $var="w1";;$var=ReadingsNum("$var","state","Error")}
Bekomme ich 1 zurück.
Du solltest deinen Code mal in der FHEM Kommandozeile testen ;)
Ich bin selbst nicht nicht ganz sicher wie richtig oder falsch die " " um die Variable herum sind. Ich hatte letztens bei mir einen Fall (set magic) da war das " " um $EVENT notwendig und ich weiß eigentlich nicht warum.
Dan hat es auch mal so und mal so gemacht ;)
Gruß Otto
Hey Otto123,
mich wundert es da es genauso in dem anderem Gerät funktioniert. Der Code ist 1 zu 1 der gleiche. Hatte auch schon mit und ohne "" bei $name getestet. Hatte auch gedacht, dass ich für sowas keinen Thread mehr aufmachen muss aber ich bin echt am Ende mit meinen Ideen. Über die Kommandozeile, war natürlich mein erster Weg...
Ein gutes Beispiel ist zb:
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'}
Das Reading running wird korrekt gesetzt wenn der Wert Power oberhalb des gewünschten Schwellwertes ist. Man sieht direkt wie running auf true springt. Aber die beiden anderen machen leider nix. total_temp müsste als erstes beschrieben werden, mit dem Wert der zu der Zeit in total steht. Wenn ich nun in total_temp via setreading einen Wert rein schreibe und dann POWER über den Schwellwert schicke, müsste da ja irgendwas passieren. Selbst wenn er das Reading nicht kennen würde, müsste dann ja wieder "0" drin stehen, da ja in der Abfrage ReadingsNum("$name","total",0) steht. Mir kommt das vor als wäre dieses eine Reading schreibgeschützt oder so. Hab sogar alle Readings mal aus dem Gerät gelöscht und neu angefangen. Auch ohne Erfolg.
Mir fällt noch auf, das ein userReading (gang) auf dem anderen aufbaut. Ich weiß nicht ob das gut geht. Ich erinnere mich da gab es Fälle, da waren alle zwischenzeitlich "leer"
ZitatAuch ohne Erfolg.
Aber sie werden einmalig angelegt?
In der Waschmaschine werden sie angelegt, berechnet und da geht alles.
Im Trockner wird nur running angelegt. Die beiden anderen Readings leider nicht. Die habe ich zum testen mal rein geworfen (manuell).
Wie sollte es sein?
Running geht auf Wert > swerta und setzt running auf true.
Nun wird das Event für running erzeugt und da wird einfach nur der Wert von total in total_temp geschrieben.
Wenn das Gerät nun fertig ist mit waschen/trocknen wird erst gang berechnet.
Will damit nur sagen das es nicht um ms geht oder so. Ich hatte zum testen auch einfach mal total_temp:running:.true { 666 } oder x andere Varianten getestet. Geht auch nicht. Wo ist der heulende Smilie :-P
EDIT: Gerade nochmal alle Readings aus s_trockner gelöscht. Danach manuell swerta und aname angegeben via Kommandozeile. Danach habe ich POWER auf 100W gesetzt und sofort wurde running angelegt. Der Rest aber nicht... (gang und total_temp).
Und wenn Du mal
Zitatverbose 1
anders setzt? Steht dann etwas Informatives im Log?
Leider nein... Habe sogar global mal auf 5 gesetzt :-\
Schuß in's Blaue: Versuch mal, an den ersten beiden den trigger mit ".*" zu erweitern, und ob der Doppelpunkt da evtl. einen Einfluß hat, kann ich auch nicht sagen.
Also so: 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'}
userReadings
total_temp:running.*true.* { ReadingsVal("$name","total",0) },
gang:running.*false.* { ReadingsVal("$name","total",0) - ReadingsVal("$name","total_temp",0) },
running {(ReadingsVal("$name","power",0) > ReadingsVal("$name","swerta",0)) ? 'true' : 'false'}
Daher komme ich leider.. In der Waschmaschine läuft das auch genau so (beide Varianten)
Hab das ganze auch nochmal in zwei andere Geräte eingegeben. Dort werden die Readings auch sofort erzeugt. Hab zum testen einfach mal ein paar Lampen genommen.
Zitat von: 87insane am 17 September 2019, 13:45:33
Leider nein... Habe sogar global mal auf 5 gesetzt :-\
Das ändert aber nichts an Deinem verbose 1 am Gerät!? Ich will es nur anmerken ;)
Und irgendwie erinnert mich das an den Thread wo es nicht immer Events vom Gerät gab (https://forum.fhem.de/index.php/topic,103377.0.html)? Aber Du sagst ja die kommen ...
Keine Sorge... Das hatte ich natürlich auch gemacht. Mittlerweile behaupte ich die Zusammenhänge ein wenig zu verstehen :)
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
Hab ich auch nicht so aufgefasst... Bin für jede Hilfe dankbar!
Wenn Du sagst die Readings werden gar nicht angelegt, dann bau doch mal zwei notifys auf diesen trigger (https://wiki.fhem.de/wiki/Notify)und mach einfach einen Log Eintrag. Und wenn das geht packst Du den Code mal da rein, mit setreading. Nur zum Test
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 ;) .
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?
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 ::)
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 .
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. :)
{sleep 0.1; ReadingsNum("$name","total",0) },
So wäre auch mein Ansatz :)
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' }
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.
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?
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. :-\
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 }
Zitat von: Beta-User am 17 September 2019, 17:20:27
Du nutzt damit aber kein FHEM-sleep, sondern Perl-sleep, oder?
Oh Mist da hab ich auch wieder nicht dran gedacht, da ist mein Vorschlag für die Tonne
entferne mal die leerzeichen im attr userreading, die hinter den kommas zur trennung der readings existieren.
die liste der readings soll mit "kommas" getrennt werden, nicht mit "kommas plus leerzeichen".
Ich sehe da keine, nur Zeilenumbrüche. :-[
in post #20, im eventmonitor mitschnitt, 1. zeile.
das sieht nach leerzeichen aus, finde ich.
Die sind auch schon in den beiden List im ersten Post zu sehen, aber in beiden Geräten.
Das ist nur die Anzeige im Web.
Alles kopieren einfügen in Notepad++ - da sind keine Leerzeichen nur Kommas und Zeilenumbrüche
Im Eventmonitor sind welche im global. Da ist das bei mir auch so dargestellt obwohl im Original Device keine Leerzeichen sind.
Guten Morgen zusammen,
zu den Leerzeichen: Kommt wohl, wie bereits gesagt wegen der Webansicht. Aktiv sind keine dort. Würde aber bei Problemen auch im LOG auftauchen müssen. Da dort nichts steht und in FHEM keine zu sehen sind....Wurde alles schon gesagt. Danke
Ich habe mir das alles nochmal durch den Kopf gehen lassen.
Da ich einen externen/wirklichen Trigger brauche würde das ganze auch anders gehen, denke ich. Nun ist die Frage, was besser ist.
Zum einen hatte Beta-User gester noch eine gute Sache gepostet und meine Idee ist nun einfach das Power Reading, welches auch "running" triggert zu nutzen.
running reagiert auf power
total_temp könnte ich auch darauf triggern lassen wenn höher als swerta.
gang könnte ich triggern auf unter power unter swerta.
Schreibe später mal wie ich das im Code meine. Die Frage ist nur was besser ist. Mich würde echt mal interessieren wie andere das so lösen....zb. Ihr?
Hey nochmal... Habe einfach mal was getestet und jetzt verstehe ich NICHTS mehr!
running:power:.* {(ReadingsNum($name,"power",0) > ReadingsNum($name,"swerta",0)) ? 'true' : 'false' },
total_temp:power:.* {(ReadingsAge($name,"running",10) < '5') && (ReadingsNum($name,"power",0) > ReadingsNum($name,"swerta",0)) ? ReadingsNum($name,"total",0) : () },
gang:running:.false { ReadingsNum("$name","total",0) - ReadingsNum("$name","total_temp",0) }
running triggert korrrekt (true / false) - War ja vorher auch so
total_temp wird berechnet und rein geschrieben - Ist kein schöner Code aber klappt
gang wird durch running getriggert. - ?????????
Wieso wird denn "gang" getriggert durch "running" wenn es eigentlich kein Event ist. Wenn "running" auf true geht, wird "total_temp" nicht getriggert. Das hatte ich verstanden da setreading kein Event erzeugt. Aber dann dürfte doch "gang" am Ende auch nicht getriggert werden?
EventMonitor:
2019-09-18 09:30:27 TPLinkHS110 s_trockner power: 100
2019-09-18 09:30:27 TPLinkHS110 s_trockner running: true
2019-09-18 09:30:27 TPLinkHS110 s_trockner total_temp: 4.054
2019-09-18 09:31:24 TPLinkHS110 s_trockner on_time: 66489
2019-09-18 09:31:24 TPLinkHS110 s_trockner current: 0.012786
2019-09-18 09:31:24 TPLinkHS110 s_trockner power: 0
2019-09-18 09:31:24 TPLinkHS110 s_trockner voltage: 237.309486
2019-09-18 09:31:24 TPLinkHS110 s_trockner running: false
2019-09-18 09:31:24 TPLinkHS110 s_trockner gang: 0
Das hier 0 rauß kommt, liegt natürlich an der nicht vorhandenen Differenz.... Aber es wird gesetzt!
Jetzt bin ich echt gespannt!
Abend zusammen...
nachdem wir alle nun so viele Infos zusammen getragen haben, will ich euch die letzte nicht vor enthalten. Kann es sein das die Reihenfolge innerhalb von userReadings sehr entscheidend ist?
Nachdem ich diese angepasst habe, geht es nämlich wie gewünscht. Ich habe das nun immer mal wieder angepasst und Dinge probiert. Am ende war es aber jedes mal so, wenn ich das Reading, was die anderen auslöst nach oben setze, ging es. Bei mqtt Geräten scheint das komplett egal zu sein aber hier nicht.
running:power:.* {(ReadingsNum("$name","power",0) > ReadingsNum("$name","swerta",0)) ? 'true' : 'false' },
total_temp:running:.true { ReadingsNum("$name","total",0) },
gang:running:.false { ReadingsNum("$name","total",0) - ReadingsNum("$name","total_temp",0) }
Danke euch allen und ich hoffe es hilft ggf mal jemandem.