Hallo,
als FHEM-Neuling kämpfe ich gerade mit einem Problem mit der Nutzung des Attributs userReadings und der Funktion setreading. Ich wäre dankbar wenn jemand mit FHEM-Erfahrung mir dazu seine Meinung oder Erklärung geben kann. Es geht darum, dass bei Nutzung der Funktion setreading auf dem gleichen (Dummy-)Device ein mit "differential" definiertes userReading auf Null gesetzt wird.
Beispiel (FHEM-Eingaben mit ->):
-> define TestDevice dummy
-> attr TestDevice userReadings DiffReading differential {ReadingsVal("TestDevice", "state", "0");;}
-> setreading TestDevice state 1
-> setreading TestDevice state 2
Noch ist alles O.K.: DiffReading hat einen Wert ungleich Null und den Timestamp identisch zu state :)
-> setreading TestDevice OtherReading 1
Jetzt ist DiffReading==Null, und der Timestamp ist identisch zu OtherReading :(
Offensichtlich wird beim Setzen von OtherReading das Reading DiffReading neu ausgewertet und auf Null gesetzt (da sich state ja zwischenzeitlich nicht geändert hat).
Ist Das ein Bug oder ein Feature (und wie komme ich drumherum wenn ich sowohl userReadings vom Typ differential als auch die Funktion setreading nutzen möchte?)
Für Ratschläge bin ich dankbar,
Gruß
Frank
P.S.: Es hilft auch nicht, wenn ich versuche mit "attr TestDevice event-on-change-reading state" ungewollte events zu unterdrücken - das differential userReading wird trotzdem ausgewertet und auf null gesetzt.
wenn du nicht über den :<reading> modifier angibst für welches reading dein DiffReadinf getriggert wird wird es bei jeder änderung irgend eines readings aufgerufen.
ich kann dir aber gerade nicht sagen ob :state auch funktioniert. es kann sein das du hierzu erst die events für state aktivieren musst. state ist zwar ein normales reading, was die events angeht aber manchmal speziell.
gruß
andre
Ich habe das gleiche Problem, kann jemand die Erklärung noch ein wenig spezifizieren?
define EXT_DS18B20_00000689d882 cloneDummy GPIO4_DS18B20_00000689d882 temperature
attr EXT_DS18B20_00000689d882 alias WP Vorlauf
attr EXT_DS18B20_00000689d882 room Waermepumpe
attr EXT_DS18B20_00000689d882 stateFormat {sprintf "%.1f °C", ReadingsVal($name, "T", 0)}
attr EXT_DS18B20_00000689d882 userReadings Gradient differential {ReadingsVal("EXT_DS18B20_00000689d882","T",0)}
Mit der "difference" funktioniert das Ganze, also die Syntax und die Sensorendefinition scheinen soweit OK zu sein.
Wo muss ich das Reading weiter spezifizieren, damit kein delta t von 0 sekunden berechnet wird?
Moin,
ich habe das userReading mit "differential" jetzt so weit unter Kontrolle, dass mir der Differenzenquotient berechnet wird.
Logischer Weise immer nur dann wenn sich die Temperatur auch tatsächlich verändert, da sonst delta y = 0.
Dieses Problem würde ich normaler Weise mit "event_on_change_reading" = temperature beheben.
Damit schalte ich aber ja auch das Updaten des userReadings aus.
Wie kann ich jetzt festlegen, dass das userReading nur bei Änderung des temperatur-readings erfolgt?
define GPIO4_DS18B20_00000689d882 GPIO4 28-00000689d882
attr GPIO4_DS18B20_00000689d882 model DS18B20
attr GPIO4_DS18B20_00000689d882 pollingInterval 10
attr GPIO4_DS18B20_00000689d882 room GPIO4
attr GPIO4_DS18B20_00000689d882 userReadings Gradient differential {ReadingsVal("GPIO4_DS18B20_00000689d882","temperature",0)}
Das ist die Definition des Sensors im Slave_Raspberry, dieser ist mit FHEM2FHEM mit dem Master_Raspberry gekopplet.
Momentan gehe ich von hinten durch die Brust ins Auge....
Master_Raspberry
define EXT_DS18B20_00000689d882 cloneDummy GPIO4_DS18B20_00000689d882
attr EXT_DS18B20_00000689d882 alias WP Vorlauf
attr EXT_DS18B20_00000689d882 room Waermepumpe
attr EXT_DS18B20_00000689d882 stateFormat {sprintf "%.1f °C", ReadingsVal($name, "temperature", 0)}
define WP_Vorlauf_Gradient dummy
attr WP_Vorlauf_Gradient room Waermepumpe
define Set_WP_Vorlauf_Gradient DOIF ([EXT_DS18B20_00000689d882:Gradient] != 0 ) (set WP_Vorlauf_Gradient [EXT_DS18B20_00000689d882:Gradient])
attr Set_WP_Vorlauf_Gradient room Waermepumpe
Den WP_Vorlauf_Gradient dummy Logge ich dann in das gleiche LOG wie den Sensor....
2015-02-21_15:14:15 EXT_DS18B20_00000689d882 T: 62.062
2015-02-21_15:14:26 EXT_DS18B20_00000689d882 T: 62.062
2015-02-21_15:14:37 EXT_DS18B20_00000689d882 T: 62
2015-02-21_15:14:37 WP_Vorlauf_Gradient -0.00571955296373518
2015-02-21_15:14:48 EXT_DS18B20_00000689d882 T: 61.937
2015-02-21_15:14:55 EXT_DS18B20_00000689e447 T: 37.062
2015-02-21_15:15:00 EXT_DS18B20_00000689d882 T: 61.812
2015-02-21_15:15:11 EXT_DS18B20_00000689d882 T: 61.687
2015-02-21_15:15:21 EXT_DS18B20_00000689d882 T: 61.625
2015-02-21_15:15:32 EXT_DS18B20_00000689d882 T: 61.5
2015-02-21_15:15:43 EXT_DS18B20_00000689d882 T: 61.375
2015-02-21_15:15:55 EXT_DS18B20_00000689d882 T: 61.25
2015-02-21_15:15:57 EXT_DS18B20_00000689e447 T: 36.875
2015-02-21_15:16:06 EXT_DS18B20_00000689d882 T: 61.187
2015-02-21_15:16:16 EXT_DS18B20_00000689d882 T: 61.125
2015-02-21_15:16:28 EXT_DS18B20_00000689d882 T: 61.125
2015-02-21_15:16:38 EXT_DS18B20_00000689d882 T: 61.125
2015-02-21_15:16:49 EXT_DS18B20_00000689d882 T: 61.187
2015-02-21_15:16:49 WP_Vorlauf_Gradient 0.00560579015189644
2015-02-21_15:16:57 EXT_DS18B20_00000689e447 T: 36.937
2015-02-21_15:17:02 EXT_DS18B20_00000689d882 T: 61.25
2015-02-21_15:17:12 EXT_DS18B20_00000689d882 T: 61.312
2015-02-21_15:17:23 EXT_DS18B20_00000689d882 T: 61.375
Funktionieren tut es, ist aber glaube ich ein sehr umständlicher Weg.....
Hat hier jemand eine bessere Variante im Angebot?