Ist es irgendwie möglich ein Userreading nur bei erfüllter Bedingung zusetzen und sonst unverändert zu lassen.
Statt es unverändert zu lassen, könnte ich es natürlich wieder mit dem alten Wert füllen - was allerdings auch wieder ein event auslöst. Das wiederrum könnte ich ich mit event-on-change abfangen .... aber "schöner" wäre natürlich das Userreading gar nicht erst anzufassen.
Hintergrund:
Ein simpler Bodenfeuchtesensor an einem analogen Eingang eines Firmata-Arduinos. Der liefert natürlich kontunierlich Werte (immer 0), zur Feuchtemessung wird aber nur periodisch für kurze Zeit eine Spannung angelegt - und auch nur diese Werte sollen übernommen werden.
def analogA0 FRM_AD 14
attr analogA0 userReadings moisture:reading { ReadingsVal($name,'reading',0)==0 ? ReadingsVal($name,'moisture',0) : ReadingsVal($name,'reading',0) }
Der Code funktioniert soweit, nur wäre es schöner statt bei jeder Nullmessung statt sich selbst mit seinem alten Wert zu überschreiben, das UserReading moisture gar nicht erst neu zu setzen.
Oder gibt es einen ganz anderen Ansatz die "Nullmessungen" zu ignorieren?
Kann man das irgendwie im UserReading implementieren?
ich würde die "nullmessungen" auf jedenfall an der quelle stoppen. das ist ja sozusagen datenmüll, der unnötigerweise das ganze system belastet.
Die Quelle ist ja "doof" .. und soll auch so bleiben ;)
Auf dem Aurduino ist der Standard-Firmata-Sketch ... und weitere Änderungen/Logik wollte ich da auch nicht reinbringen, das soll alles zentral in FHEM verbleiben.
Das Einschalten der Spannung zur Messung erfolgt ja auch von FHEM aus gesteuert über einen Ausgabepin FRM_OUT.
Vieleicht habe ich das Problem ja nicht verstanden, aber warum geht ein
{ ReadingsVal($name,'reading',0)!=0 ? ReadingsVal($name,'reading',0) }
nicht?
Gruß
Hans
Error evaluating analogA0 userReading moisture: syntax error at (eval 240) line 1, at EOF
Schon irgndwie klar ... das userReading erwartet ja einen Wert den es setzen soll ... und wenn ich den einfach weglasse (also : und den else-wert) dann fehlt ihm natürlich was.
Ja klar, sorry.
Gruß
Hans
ZitatDas Einschalten der Spannung zur Messung erfolgt ja auch von FHEM aus gesteuert über einen Ausgabepin FRM_OUT.
mit diesem signal lässt sich die messung nicht steuern, also start/stop? zb über ein attr disable, sodass die quelle der messungen (wahrscheinlich FRM_AD) ruhig bleibt.
Den Gedanken hatte ich auch schon, aber FRM_AD hat leider kein disable-Attribut.
wenn du es wirklich nicht stoppen kannst, was ich für eine lücke im modul halten würde, sollte folgendes funktionieren:
attr analogA0 userReadings moisture:reading { ReadingsVal($name,'reading',0)!=0 ? ReadingsVal($name,'reading',0):undef }
bei einem fensterkontakt hat folgendes gerade funktioniert:
test:contact {
my $val = ReadingsVal($name,"contact","hallo");
return (($val =~ "open")?"offen":undef);
}
Wunderbar ... undef als else-Wert funktioniert.
Die Werte stimmen und es kommen keine Fehlermeldungen :)
Danke!