FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: roedert am 31 März 2016, 11:13:44

Titel: Userreading unverändert lassen
Beitrag von: roedert am 31 März 2016, 11:13:44
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?
 
Titel: Antw:Userreading unverändert lassen
Beitrag von: frank am 31 März 2016, 11:31:56
ich würde die "nullmessungen" auf jedenfall an der quelle stoppen. das ist ja sozusagen datenmüll, der unnötigerweise das ganze system belastet.
Titel: Antw:Userreading unverändert lassen
Beitrag von: roedert am 31 März 2016, 11:52:26
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.
Titel: Antw:Userreading unverändert lassen
Beitrag von: Hans Franz am 31 März 2016, 12:20:28
Vieleicht habe ich das Problem ja nicht verstanden, aber warum geht ein
{ ReadingsVal($name,'reading',0)!=0 ? ReadingsVal($name,'reading',0) }
nicht?

Gruß
Hans
Titel: Antw:Userreading unverändert lassen
Beitrag von: roedert am 31 März 2016, 12:28:33
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.
Titel: Antw:Userreading unverändert lassen
Beitrag von: Hans Franz am 31 März 2016, 12:30:57
Ja klar, sorry.

Gruß
Hans
Titel: Antw:Userreading unverändert lassen
Beitrag von: frank am 31 März 2016, 12:45:58
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. 
Titel: Antw:Userreading unverändert lassen
Beitrag von: roedert am 31 März 2016, 12:48:50
Den Gedanken hatte ich auch schon, aber FRM_AD hat leider kein disable-Attribut.
Titel: Antw:Userreading unverändert lassen
Beitrag von: frank am 31 März 2016, 13:52:40
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);
}
Titel: Antw:Userreading unverändert lassen
Beitrag von: roedert am 31 März 2016, 14:06:58
Wunderbar ... undef als else-Wert funktioniert.

Die Werte stimmen und es kommen keine Fehlermeldungen :)

Danke!