Autor Thema: gelöst: Device soll niedrigsten Wert aus Readings unterschiedl. Devices liefern  (Gelesen 345 mal)

Offline alpha1974

  • Full Member
  • ***
  • Beiträge: 191
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
« Letzte Änderung: 04 Juli 2018, 08:25:01 von alpha1974 »
FHEM/Z-Wave USB-Dongle + div. Devices

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15697
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier
kein Support für cfg Editierer

Offline alpha1974

  • Full Member
  • ***
  • Beiträge: 191
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

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15697
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier
kein Support für cfg Editierer

Offline alpha1974

  • Full Member
  • ***
  • Beiträge: 191
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

Online Beta-User

  • Hero Member
  • *****
  • Beiträge: 3813
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-T5740 mit Debian stretch (i386) + aktuellem FHEM | ConfigDB | VCCU mit einiger HM-Hardware | MySensors seriell (2.3.1-beta@RS485, div. konkrete Hardware, u.a. einige DS18B20) | Milight@ESP-GW | SIGNALduino | MapleCUN

Offline alpha1974

  • Full Member
  • ***
  • Beiträge: 191
@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

Online Beta-User

  • Hero Member
  • *****
  • Beiträge: 3813
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-T5740 mit Debian stretch (i386) + aktuellem FHEM | ConfigDB | VCCU mit einiger HM-Hardware | MySensors seriell (2.3.1-beta@RS485, div. konkrete Hardware, u.a. einige DS18B20) | Milight@ESP-GW | SIGNALduino | MapleCUN

 

decade-submarginal