[Gelöst] Dummy mit Weather:temperature setzen und auslesen

Begonnen von HansDampfHH, 14 Januar 2016, 20:16:05

Vorheriges Thema - Nächstes Thema

HansDampfHH

Hallo, ich versuche aktuell folgendes:
Ich möchte über das Weather-Modul die aktuelle Temperatur auslesen und bei Frost eine Pushover-Nachricht erhalten.


define Wetter Weather 656958 600 de
attr Wetter event-on-change-reading temperature

define AussenTemperatur dummy
define Frost_Message at *07:00:00 {checkFrost(ReadingsVal("AussenTemperatur","state",""))}


Wenn ich AussenTemperatur manuell setze funktioniert das ganze soweit schon einmal für eine morgendliche Nachricht um 07:00 Uhr:
set AussenTemperatur 3.4

Nun soll aber der Dummy eigentlich immer automatisch gesetzt werden wenn es ein change-event gibt.
Und da stehe ich auf dem Schlauch. Folgendes möchte ich am Ende umgesetzt bekommen:
-bei einem change-event den Dummy AussenTemperatur setzen
-ein DOIF wenn der Wert < 4 dann versende eine Nachricht mit der Temperatur
-um 07:00 Uhr eine Nachricht versenden wenn die Temperatur < 4 (das habe ich ja bereits)

Das DOIF würde ich so versuchen:


define Frost DOIF (ReadingsVal("AussenTemperatur","state","") < 4 {checkFrost(ReadingsVal("AussenTemperatur","state",""))})


Aber ich gehe davon aus, dass das nicht der optimale Weg ist ;-)
Ich wäre für Hinweise dankbar.
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

Ellert

Schau mal in die Commandref, da ist beschrieben wie Du auf Readings zugreifen kannst damit sie auch triggern, kleiner Hinweis: http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung und http://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung

Hilft Dir das erstmal weiter?

Warum greifst Du um 07:00 nicht gleich auf das Reading im Wettermodul zu?

HansDampfHH

Hm, ja. Ich kann natürlich auch direkt auf das Wetter zugreifen.
Keine Ahnung warum ich so umständlich gedacht habe.

Eigentlich wäre die komplexe Lösung ja:
Wenn die Temperatur morgens zB 3.4 Grad beträgt werde ich informiert.
Aktuell erreicht die Temperatur im Laufe des Tages ja durchaus hier wieder 5-7 oder mehr Grad.
Wenn dann zum Abend hin wieder unter 4 Grad werden würde ich eigentlich wieder eine Nachricht haben.

Aber eben nur einmalig wenn die Temperatur wieder unter 4 Grad gefallen ist.
Und nicht bei jeden event-change. Wenn die Temperatur von zB 3.4 auf 2.8 Grad weiter fällt will ich ja nicht wieder und wieder und wieder eine Nachricht erhalten.

Daher hatte ich gedacht diese Zustände über Dummies festzuhalten.

Am wichtigsten scheint mir die Nachricht am Morgen  zu sein.
Und die habe ich ja eigentlich gelöst. Lese jetzt noch direkt das Reading aus und fertig ;-)

Danke für Deinen Hinweis.
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

Ellert

ZitatAber eben nur einmalig wenn die Temperatur wieder unter 4 Grad gefallen ist.
Und nicht bei jeden event-change. Wenn die Temperatur von zB 3.4 auf 2.8 Grad weiter fällt will ich ja nicht wieder und wieder und wieder eine Nachricht erhalten.

Etwa so?
DOIF ([07:00] and [?Wetter:temperature] < 4  ) (<sende Nachricht>)
DOELSEIF ([Wetter:temperature] < 4) (<sende Nachricht>)
DOELSEIF ([Wetter:temperature] > 6)

Du erhälst um 7 Uhr eine Nachricht, wenn die Temperatur unter 4 °C ist
und Du erhälst die Nachricht, wenn die Temperatur unter 4 °C sinkt
das wird erst wiederholt, wenn die Temperatur einmal über 6 °C steigt.

HansDampfHH

Also Deine Beschreibung stimmt mit dem Überein was ich möchte, aber im Code kann ich das leider nicht erkennen.

DOIF ([07:00] and [?Wetter:temperature] < 4  ) (<sende Nachricht>)


Das ist klar: MACH WENN 07:00 Uhr und Temperatur < 4


DOELSEIF ([Wetter:temperature] < 4) (<sende Nachricht>)


Das verstehe ich als: MACH SONST WENN Temperatur < 4
Aber hier verstehe oder sehe ich die Bedingung nicht, dass das NUR einmalig passieren soll.

Wenn ich das richtig verstehe sendet Weather ja bei on-change-reading immer einen Wert wenn der sich verändert.

  • Wenn die Temperatur also von 4.2 auf 3.6 fällt trifft die Bedingung zu und ich bekomme eine Nachricht.
  • Wenn die Temperatur dann bei einem weiteren on-change-reading von 3.6 auf 2.8 fällt bekomme ich ja wieder eine Nachricht.
Da bekomme ich an einem Tag ja 20 Nachrichten ;-)

Ich möchte nur einmalig eine Nachricht wenn die Temperatur unter 4 Grad fällt.
Anwendungsfall (ich bin Motorradfahrer, das ganze Jahr!):

  • Ich wache morgens auf, Temperatur 3.2 Grad -> Nachricht
  • Die Temperatur steigt tagsüber auf 5.8 Grad -> alles gut
  • Zum Nachmittag hin, wenn bald Feierabend ist, fällt die Temperatur wieder auf unter 4 Grad -> Nachricht

Wie gesagt, das wäre perfekt. Aber mit der morgendlichen Erinnerung kann ich auch ganz gut leben ;-)
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

Ellert

ZitatAber hier verstehe oder sehe ich die Bedingung nicht, dass das NUR einmalig passieren soll.
Hast Du dies http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung nicht gelesen? 1. Absatz nach dem 1. Beispiel, Hast Du da noch Fragen zu?

ZitatDa bekomme ich an einem Tag ja 20 Nachrichten ;-)
Hier noch eine kleine Optimierung, damit Du kurz nach sieben keine 2. Nachricht bekommst:

define Frost DOIF ([07:00] and [?Wetter:temperature] < 4  ) (<sende Nachricht>)
DOELSEIF ([Wetter:temperature] < 4 and [Frost] eq "cmd_3") (<sende Nachricht>)
DOELSEIF ([Wetter:temperature] > 6)


Mit and [Frost] eq "cmd_3" wird eine Nachricht vom 2. Bedingungszweig nur gesendet, wenn der 3. Zweig geschaltet hat.

HansDampfHH

#6
Okay, das hatte ich nicht gelesen.
Ich werde das jetzt so testen. Vielen Dank für Deinen Input.
Wobei ich anmerken muss, dass das schon nicht so leicht aufzunehmen ist:

Mit and [Frost] eq "cmd_3" wird eine Nachricht vom 2. Bedingungszweig nur gesendet, wenn der 3. Zweig geschaltet hat.


Wenn ich das mit klassischen If/else/while/doWhile aus PHP und dazugehöriger Programmlogik vergleiche, fällt mir das echt schwer.
Und natürlich muss ich die 4 Grad auch mal anpassen, darf ruhig kälter sein ;-)
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

Ellert

ZitatWenn ich das mit klassischen If/else/while/doWhile aus PHP und dazugehöriger Programmlogik vergleiche, fällt mir das echt schwer.
Ja, dass kann ich nachvollziehen. DOIF ist von der Struktur her vergleichbar, aber die Funktion ist wesentlich komplexer.

HansDampfHH

Hm, muss mich doch noch einmal melden.
Die ersten beiden Tage lief die Funktionalität wie gewollt.
Nun haben wir seit einigen Tagen allerdings IMMER minus-Grade.
Von daher spring das DOELSEIF > 6 nicht mehr an. Das ist grundsätzlich ja okay.
Aber es wird auch keine Nachricht morgens um 07:00 Uhr verschickt.

Die möchte ich ja auf jeden Fall bekommen, auch wenn es wochenlang -12 Grad wären.
Die morgendliche Erinnerung schärft die Sinne ;-)

Kannst du da einen Fehler oder eine Ursache erkennen?
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

Ellert

ZitatIch möchte nur einmalig eine Nachricht wenn die Temperatur unter 4 Grad fällt.
Diese Funktionalität hattest Du ausdrücklich bestellt, das ist kein Fehler ;)

Aber, bei einem DOIF kannst Du fast alles einstellen, Du hast es auch schon gelesen http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung (do always)




HansDampfHH

So, noch einmal Feedback abschließend!
Dank Deiner Hinweise und Hilfe funktioniert die Logik wie ich es mir vorstelle seit einigen Wochen.

TOP - Vielen Dank. Auch wenn mir ganz schwindelig wird wenn ich an den Abschnitt DOIF in der commandref denke ;-)
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink