[Gelöst] Niedrigere Wert von zwei Temperatursensoren in Dummy ausgeben

Begonnen von Andiarbeit, 08 Oktober 2017, 16:50:19

Vorheriges Thema - Nächstes Thema

Andiarbeit

Hi Zusammen,

bin noch relativ neu in der FHEM-Welt und habe eine Frage.
An verschiedenen Außenwänden meiner Wohnung befindet sich zwei Temperatursensoren.
Eigentlich kann man ja davon ausgehen, dass immer die niedrige Temperatur die korrekte ist, da dort wahrscheinlich die Sonne nicht darauf scheint.
Wie kann ich es am besten definieren, dass als Außentemperatur der niedrige Wert angezeigt wird?

Viele Grüße
Andi

C0mmanda

Moin,

es gibt wie immer mehrere Wege.
notify, at, DOIF, userreadings....

Wo soll die Temperatur denn angezeigt werden?
Etwas Info zu den Sensoren könnte auch helfen.

grtz

Andiarbeit

Hi,

hätte gernen einen Screenshot angehängt aber das geht hier scheinbar nicht.

Ich habe eine readingsGroup angelegt für alle LaCrosse Sensoren.
Dort wird dann die Temperatur und Luftfeuchtigkeit angezeigt.
Überwiegend sind es Technoline TX 29 DTH die Temperatur und Luftfeuchtigkeit übertragen sowie ein TX 25 mit Extrasensor, den ich zu einem Regensensor umgebaut habe. Dieser gibt also einmal die Außentemperatur aus und eine Bestimmte Gradzahl bei der es regnet.
In der Readingsgroup brauche ich dann aber nur den ersten Wert (also die Temperatur). Zusätzlich habe ich noch einen "richtigen" Außensensor, der wie die anderen Sensoren in der Wohnung, Temperatur und Luftfeutigkeit anzeigt. 
Hätte also gerne den niedrigeren Wert der beiden Außensensoren + die Luftfeuchtigkeit.

Hoffe das ist jetzt verständlich.

CBSnake

Hi,

müsste mit nem DOIF gehen:

define doif_niedriger DOIF ([ersterlacrosse:temperatur] < [zweiterlacrosse:temperature])(setreading zweiterlacrosse temperature [ersterlacrosse:temperature])
DOELSEIF
([zweiterlacrosse:temperatur] < [ersterlacrosse:temperature])(setreading ersterlacrosse temperature [zweiterlacrosse:temperature])


Mit den Attributen musste halt noch spielen aber so als Basis müsste das gehen ;-)

Alternativ kannst auch einen Dummy anlegen und dort immer die niedrigere Temperatur reinschreiben lassen

Grüße
Achim
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

Andiarbeit

Danke Achim.

Habe das mal angepasst:

DEF    
([Draussen.Temp:temperature] < [Regen.Sensor:temperature])(setreading Regen.Sensor temperature [Draussen.Temp:temperature]) DOELSEIF ([Regen.Sensor:temperature] < [Draussen.Temp:temperature])(setreading Draussen.Temp temperature [Regen.Sensor:temperature])

Irgendetwas stimmt noch nicht. State ist cmd_1


Ich bekomme folgende Readings:

Device         Regen.Sensor                        2017-10-08 21:35:34
cmd             1                                          2017-10-08 21:21:40
cmd_event   Regen.Sensor                        2017-10-08 21:21:40
cmd_nr        1                                          2017-10-08 21:21:40
e_Draussen.Temp_temperature     11.2      2017-10-08 21:33:02
e_Regen.Sensor_temperature       11.8      2017-10-08 21:35:34
state           cmd_1                                   2017-10-08 21:21:40

C0mmanda

Zitat von: Andiarbeit am 08 Oktober 2017, 21:42:45

Irgendetwas stimmt noch nicht. State ist cmd_1

state cmd_1 ist doch korrekt. Draussen.Temp ist geringer als Regen.Sensor Temp.

Zitat
e_Draussen.Temp_temperature     11.2      2017-10-08 21:33:02
e_Regen.Sensor_temperature       11.8      2017-10-08 21:35:34

Hast du mal im Device Regen.Sensor direkt geschaut ob das Reading geschrieben wurde?

grtz

Andiarbeit

Im Device Regen.Sensor ist das aktuelle reading
temperature 10.7   2017-10-08 22:16:01

Im Devices Draussen.Temp
temperature  9.9    2017-10-08 22:19:51

Sollte der das Regen.Sensor reading von dem draussen.temp reading nicht überschrieben werden??

C0mmanda

Ja, sollte es.
Ich vermute aber mal dass das Reading direkt wieder vom Device selbst überschrieben wird.

(Du überschreibst das temperature-Reading, sobald sich der Regen.Sensor aktualisiert nimmt er wieder "seine eigene" Temperatur an.).

Also entweder ein eigenes Reading nehmen (z.b. temperature_low) oder ein dummy Device anlegen.

Ich würde es an deiner Stelle erstmal mit einem Dummy und dem DOIF probieren.
Hilft evtl. auch dem Verständnis.


define d.Aussentemperatur dummy
attr d.Aussentemperatur setList temperature
attr d.Aussentemperatur readingList temperature


dazu kannst du das DOIF umbauen:


DEF   
([Draussen.Temp:temperature] < [Regen.Sensor:temperature])(set d.Aussentemperatur temperature [Draussen.Temp:temperature]) DOELSEIF ([Regen.Sensor:temperature] < [Draussen.Temp:temperature])(set d.Aussentemperatur temperature [Regen.Sensor:temperature])


ungetestet.

grtz

Andiarbeit

#8
1000 Dank für die Unterstützung.

Habe jetzt einen Wert im Dummy stehen. Leider wird dieser nicht aktuallisiert.

Im Doif sind die beiden Reading: e_Draussen.Temp_temperature und e_Regen.Sensor_temperature jeweils mit dem aktuellen Wert und Zeitstempel.
Die Reading cmd, cmd_event, cmd_nr und state haben jeweils den Zeitstempel mit der Zeit vom Anlegen des Dummys.
Kann es sein, dass der Dummy zur Zeit nur aktualisiert, wenn das Thermometer gewechselt wird?
Wie bekomme ich die aktuelle Temperatur in den Dummy?

Viele Grüße
Andi

C0mmanda

Moin,

ja das kann gut sein.

Das meinte "CBSnake" mit den Attributen weiter oben.
Zugegeben, die command-ref zum DOIF ist seeehr lang, aber es steht dort drin ;).

Dein DOIF triggert aktuell einmal "cmd_1" und bleibt dann solange dort (und tut nichts) bis "cmd_2" eintritt und bleibt solange dort bis wieder "cmd_1" eintritt usw.

Probiere mal attr <device> do always
Dann sollte das DOIF auf jedes Event triggern.

grtz

CBSnake

Moin,

ja do always sollte helfen, dann müsste auch das DOIF funktionieren, welches direkt die Werte in den Sensoren überschreibt.
In den Sensoren dann noch das event-on-change reading aktivieren

attr dein_sensor event-on-change humidity,temperature,battery,dewpoint
Ansonsten bekommst du alle 4 Sekunden erstmal unnötig viele Events und der Wert wird permanent überschrieben

Grüße
Achim
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

Andiarbeit


wthiess

Jetzt wäre noch einen Zusammenfassung inkl. funktionierendem Code ein Hit.
lg
Wolfgang
Raspberry Pi 3; 8xRelais; Aptodec Nano V3.0 Pro; FS1000a; RF-5V; Hama TS33C; 3x Brennerstuhl FunkSteckdosen; 9x Dooya funk Rollo; KWL Systemair VR400; Thermokon Modbusthermostat; diverse China Modbus Thermostate; 1-wire Bus; Telegram; QuickFhem; FhemNative; Firmata; Alexa ......

Andiarbeit

Zusammenfassung:

Ich wollte von zwei Temperatursensoren immer den niedrigeren Wert haben.
Gelöst wurde dies über ein DOIF und ein dummy (in das der Wert am Ende geschrieben wird).

Das DOIF sieht so aus:
define doif_niedriger DOIF ([Sensor1:temperature] < [Sensor2:temperature])(set d.temperaturniedriger temperature [Sensor1:temperature]) DOELSEIF ([Sensor2:temperature] < [Sensor1:temperature])(set d.temperaturniedriger temperature [Sensor2:temperature])
attr doif_niedriger do always


Der Dummy:
define d.temperaturniedriger dummy
attr d.temperaturniedriger setList temperature
attr d.temperaturniedriger readingList temperature
attr d.temperaturniedriger stateFormat {sprintf("%.1f °C &emsp; %.1f %%", ReadingsVal("d.temperaturniedriger","temperature",0), ReadingsVal("Sensor1","humidity",0))}


In den beiden Sensoren noch:
attr Sensor1 event-on-change humidity,temperature,battery,dewpoint
attr Sensor2 event-on-change humidity,temperature,battery,dewpoint

Damian

Das geht auch eleganter als Einzeiler ohne Dummy und ohne weitere Attribute:

define S_niedriger DOIF init {set_State (sprintf("%.1f °C", ::minNum([Sensor1:temperature],[Sensor2:temperature])))}


Im Status des Devices S_niedriger ist immer der niedrigere Wert (auch wenn noch keiner der Sensoren ein Event produziert hat :) )

Das Ganze ist auch noch effizienter, weil kein FHEM-Interpreter zur Laufzeit ausgeführt werden muss

Die Bedeutung der Syntax kann man hier nachlesen: https://fhem.de/commandref_DE.html#DOIF_Perl_Modus
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF