Hallo,
ist es möglich aufeinander aufbauende userReadings einer dummy-variable anzulegen? Soll heissen, ein userReading verwertet den Wert eines anderen, etwa so:
fhem> attr gaszaehler userReadings delta difference { ReadingsVal('gaszaehler', 'state', 0) }, kosten { ReadingsVal('gaszaehler','delta',0)*0.0449 }
Bei mir hat das nicht zuverlässig funktioniert, da die Reihenfolge, in der die Readings ausgewertet werden nicht festgelegt ist.
Lässt sich das trotzdem umsetzen?
Schöne Grüße, Florian
Hallo Florian,
beschreibe doch mal zuerst das dahinter stehende Problem, bevor du mit einer nicht funktionierenden Lösung kommst ... Vlt. gibt es ja schon etwas zur Lösung, halt nur anders ;)
Gruß
Thomas
Hallo Thomas,
gerne. Einen Workaround habe ich allerdings schon, ich habe mich nur gefragt, ob das nicht zu umständlich ist:
Ich habe eine Erfassung meines Gaszählers mit einem FS20 S4M Modul von ELV gebaut. Der sendet einen Impuls bei jedem Durchlauf der letzten Scheibe (Reedkontakt), also bei 0,01m³.
Ich zähle damit eine Dummy-Variable 'Gaszaehlerstand' um jeweils 0.01 hoch.
Nun wird der Durchlauf des Magneten nicht 100%ig erfasst, etwa jeder 100.te geht ohne Kontakt durch. Diese Abweichung will ich erfassen, indem ich manuelle Korrekturen mache und das gesondert in 'korrektur' erfasse. Das habe ich so gemacht:
> define Gaszaehlerstand dummy
> define increaseGaszaehler notify GaszaehlerReed:off { fhem "set Gaszaehlerstand ".(Value('Gaszaehlerstand')+0.01) }
> attr Gaszaehlerstand userReadings delta { sprintf('%0.02f', ReadingsVal('Gaszaehlerstand','state',0)-OldValue('Gaszaehlerstand')) }, \
korrektur { sprintf('%0.02f', ReadingsVal('Gaszaehlerstand','state',0)-OldValue('Gaszaehlerstand')) > 0.01 ? ReadingsVal('Gaszaehlerstand','state',0) : undef }
Das funktioniert zwar (das sprintf ist notwendig, da perl sonst keine korrekten Differenzen liefert), erscheint mir aber recht unelegant, ich hätte das delta lieber in 'korrektur' benutzt, also
> attr Gaszaehlerstand userReadings delta { sprintf('%0.02f', ReadingsVal('Gaszaehlerstand','state',0)-OldValue('Gaszaehlerstand')) }, \
korrektur { ReadingsVal('Gaszaehlerstand','delta',0) > 0.01 ? ReadingsVal('Gaszaehlerstand','state',0) : undef }
Wie im Ursprungsposting beschrieben geht das aber nicht, da 'delta' bei der Auswertung von 'korrektur' offenbar keinen definierten Zustand hat und mal vor und mal nach 'korrektur' ausgewertet wird.
Grüße, Florian
Hallo Florian,
ok, aber das übersteigt meine Kenntnisse. Da müssen die Spezies (nicht die Außerirdischen ;) ) dran. Hoffentlich meldet sich noch jemand.
Gruß
Thomas
Trotzdem danke!
Hallo,
ich habe genau das gleiche Problem: Ich habe einen Dummy mit 4 UserReading der Auswertungsreihenfolge eine Rolle spielt. Zum Hintergrund:
Ich möchte einen Dummy zum Steuern meiner Lüfter nutzen (ein eigenes Modul ist mir momentan zu aufwändig). Den Modus (Hand/Auto) und eine Lüftungsstufe für den Handbetrieb (LevelHand) setzen. Außerdem gibt es ein UserReading LevelAuto, welches mal über eine Automatik gesetzt werden soll. In einem weiteren UserReading SetLevel wird der Level zur Ansteuerung der Lüfter geschrieben. Wenn eines der UserReadings Modus, LevelHand, LevelAuto geändert wird, wird das UserReading SetLevel entsprechend gesetzt (wenn Modus == Hand dann SetLevel = LevelHand sonst SetLevel = LevelAuto). Das funktioniert mittlerweile nachdem ich das zu setztende UserReading von Level zu SetLevel umbenannt habe (vorher stimmte die Reihenfolge anscheinend nicht).
Nun möchte ich jedoch ein weiteres UserReading Flow anlegen, welches aus dem SetLevel einen Durchfluss des Lüfters errechnet. Das funktioniert jedoch nicht, da die Reihenfolge, in welcher die UserReadings ausgewertet werden, nicht passt: es wird erst Flow dann SetLevel ausgewertet, was dazu führt, dass immer der Flow des vorherigen SetLevel errechnet wird :-(
Hat jemand eine Idee, wie ich das Ändern kann?
Hier mal mein Dummy (Mode kennt zusätzlich Force, sollte aber für das Problem nicht relevant sein):
define DG.wz.LU.Control dummy
attr DG.wz.LU.Control room Wohnzimmer
attr DG.wz.LU.Control setList LevelHand:lokal,aus,1,2,3,4,5,6,7,8,9,10 Mode:Auto,Hand,Force
attr DG.wz.LU.Control stateFormat M:Mode, L:SetLevel, F:Flow m³/h
attr DG.wz.LU.Control userReadings Flow { CalcReadingFlow('DG.wz.LU.Control') }, LevelHand:LevelHand { CalcReadingLevelHand('DG.wz.LU.Control') }, Mode:Mode { CalcReadingMode('DG.wz.LU.Control') }, SetLevel:LevelHand|LevelAuto|Mode { CalcReadingLevel('DG.wz.LU.Control') }
attr DG.wz.LU.Control webCmd LevelHand:Mode
Die UserReadings werden des Umfanges wegen in Funktionen ermittelt, die ich bei Bedarf auch posten kann. Ich habe auch schon versucht, den Flow aus der Funktion CalcReadingLevel() mittels fhem("setreading ...") zu setzen, was aber immer zum Absturz von FHEM geführt hat...
Vielen Dank
Ronny