FHEM Forum

FHEM => Automatisierung => Thema gestartet von: alpha1974 am 04 Juli 2018, 07:05:20

Titel: gelöst: Device soll niedrigsten Wert aus Readings unterschiedl. Devices liefern
Beitrag von: alpha1974 am 04 Juli 2018, 07:05:20
Guten Morgen liebe FHEM-Gemeinde,

ich komme - womöglich hitzebedingt - mit einem kleinen Problem nicht weiter, dessen Lösung vermutlich trivial ist, sich bei meinen bisherigen Recherchen jedoch erfolgreich verborgen hat:

Ich habe zwei Temperatursensoren, die unterschiedliche Werte liefern:

Sensor1:Temp = 23.3
Sensor2:Temp = 27.4

Ich möchte nun ein drittes Devices anlegen (Readingsproxy? Dummy?), das als einziges Reading den niedrigsten Temp-Wert ausgibt. Über ein DOIF könnte man sicher ein Dummy-Device entsprechend "befüttern", aber ist das nicht mit Kanonen auf Spatzen geschossen? Gibt es keine knackigere Lösung?

Hintergrund: Meine Außentemperatur-Sensoren hängen an verschiedenen Stellen ums Haus. Die "Schattenplätze" werden leider doch gelegentlich für kurze Zeit von der Sonne angestrahlt - dann soll möglichst simpel auf den jeweils niedrigsten Wert zurückgegriffen werden können.

Vielen Dank für etwaige Denkanstöße,
alpha1974
Titel: Antw:gelöst: Device soll niedrigsten Wert aus Readings unterschiedl. Devices liefern
Beitrag von: CoolTux am 04 Juli 2018, 08:06:02
Auszug aus der Commandref zu 99_Utils.pm
Zitat
minNum(num1, num2, ...) returns the lowest value from a given list (sorted numeric)
Titel: Antw:gelöst: Device soll niedrigsten Wert aus Readings unterschiedl. Devices liefern
Beitrag von: alpha1974 am 04 Juli 2018, 08:24:10
Danke CoolTux, der Hinweis auf minNum hat mein Problem gelöst. Ein Dummy-Device gibt jetzt per stateFormat den niedrigsten Wert aus:

defmod Temp_Aussen_Min dummy
attr Temp_Aussen_Min stateFormat {minNum( ReadingsNum("Temp_Haustuer","state",20), ReadingsNum("Temp_Terrasse","state",20)) }

Titel: Antw:gelöst: Device soll niedrigsten Wert aus Readings unterschiedl. Devices liefern
Beitrag von: CoolTux am 04 Juli 2018, 08:32:10
Zitat von: alpha1974 am 04 Juli 2018, 08:24:10
Danke CoolTux, der Hinweis auf minNum hat mein Problem gelöst. Ein Dummy-Device gibt jetzt per stateFormat den niedrigsten Wert aus:

defmod Temp_Aussen_Min dummy
attr Temp_Aussen_Min stateFormat {minNum( ReadingsNum("Temp_Haustuer","state",20), ReadingsNum("Temp_Terrasse","state",20)) }


Wenn ich mich nicht ganz täusche dürfte das aber nur der Fall sein wenn Du die Seite wo sich der Dummy befindet neu lädst. Wenn zum Beispiel per telnet aus liest oder über TabletUI dürfte glaube immer der letzte Wert stehen den Du gesehen hast.
Titel: Antw:gelöst: Device soll niedrigsten Wert aus Readings unterschiedl. Devices liefern
Beitrag von: alpha1974 am 04 Juli 2018, 09:21:54
Oh ja, du hast Recht: Das Dummy-Device aktualisiert sich nicht automatisch. Also muss ich wohl noch ein Notify-Device anlegen, das auf die Temperatur-Sensoren reagiert und dann das Dummy-Device aktualisiert....

Ich habe auch an ein ReadingsProxy-Device für die Aufgabenstellung gedacht. Habe es aber nicht hinbekommen, ein solches Device per RegEx mittels minNum (aus Readings unterschiedlicher Devices) zu definieren. Bin mir auch nicht sicher, ob sich ein ReadingsProxy überhaupt so definieren lässt.
Titel: Antw:gelöst: Device soll niedrigsten Wert aus Readings unterschiedl. Devices liefern
Beitrag von: Beta-User am 04 Juli 2018, 09:31:55
Mach' doch das userreading an den Temp-Sensor, der in der Regel den niedrigsten Wert hat (und halbwegs regelmäßig sendet). Und dann auf dieses Reading einen ReadingsProxy. (Ungeprüft:) Dann wird das userreading (bzw. der Proxy) zwar nur aktualisiert, wenn sich an dem einen Temp-Sensor was ändert, aber das sollte eigentlich genügen, oder?
Titel: Antw:gelöst: Device soll niedrigsten Wert aus Readings unterschiedl. Devices liefern
Beitrag von: alpha1974 am 04 Juli 2018, 16:38:34
@Beta-User: Habe deine Anregung nun auch umgesetzt. Funktioniert und spart ein Notify-Device zur Aktualisierung eines Dummy.

Der Temp-Sensor auf der Nordseite ist ein in eine Außenlampe eingebauter ESP8266 mit BME280. Er sendet alle fünf Minuten. Das dazugehörige Device hat jetzt ein UserReading, das mittels MinNum den jeweils niedrigsten Wert aller Temp-Sensoren anzeigt. Dieses Reading wird per ReadingsProxy separiert und aktualisiert sich im selben Rhythmus wie der Temp-Sensor, also alle fünf Minuten. Wenn innerhalb dieser Zeitspanne ein anderer Sensor einen niedrigeren Wert liefert, brauche ich dafür keine sofortige Reaktion. Es geht ja nur um die Außentemperatur.

Allerdings bleibt noch das "Gefühl", dass die Ermittlung des Mindestwerts von verschiedenen Sensoren eigentlich abstrahiert / losgelöst von einem einzelnen Sensor erfolgen müsste. Hauptsache ist aber, dass es zuverlässig läuft.

Nochmals vielen Dank für die guten Tipps!
Titel: Antw:gelöst: Device soll niedrigsten Wert aus Readings unterschiedl. Devices liefern
Beitrag von: Beta-User am 04 Juli 2018, 16:54:39
Wenn es "abstrakt" von den einzelnen devices sein soll, bliebe nur der Weg über einen Event-Handler (z.B. notify), der auf alle relevanten Temp-Readings reagiert und dann immer den aktuellen Min-Wert irgendwo hin schiebt (dummy oder was auch immer). So ein Vorgehen vervielfacht aber die Zahl der Events, daher diese zeitliche Vereinfachung ;) .