gelöst: Device soll niedrigsten Wert aus Readings unterschiedl. Devices liefern

Begonnen von alpha1974, 04 Juli 2018, 07:05:20

Vorheriges Thema - Nächstes Thema

alpha1974

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
FHEM/Z-Wave USB-Dongle + div. Devices

CoolTux

Auszug aus der Commandref zu 99_Utils.pm
Zitat
minNum(num1, num2, ...) returns the lowest value from a given list (sorted numeric)
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

alpha1974

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)) }

FHEM/Z-Wave USB-Dongle + div. Devices

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

alpha1974

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.
FHEM/Z-Wave USB-Dongle + div. Devices

Beta-User

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?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

alpha1974

@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!
FHEM/Z-Wave USB-Dongle + div. Devices

Beta-User

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 ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files