[gelöst] Notification bei Erreichung eines Temperatur Schwellwertes

Begonnen von Shootdackel, 12 September 2016, 13:32:32

Vorheriges Thema - Nächstes Thema

Shootdackel

Guten Tag Zusammen,

ich habe nun 3 Temperatursensoren (DS18B20) an meinen Pi angeschlossen und diese wie folgt in Fhem definiert:

define Temp_Klima_SR_EG_OLn GPIO4 28-001451df14ff
attr Temp_Klima_SR_EG_OL model DS18B20
attr Temp_Klima_SR_EG_OL room GPIO-Devices
attr Temp_Klima_SR_EG_OL group 1-wire
attr Temp_Klima_SR_EG_OL pollingInterval 300
attr Temp_Klima_SR_EG_OL stateFormat {sprintf "%.1f °C", ReadingsVal($name, "temperature", 0)}


Meine Frage ist jetzt, wie bekomme ich es hin, dass ein bash-Script auf dem Pi ausgeführt wird, sobald die Temperatur auf über 20°C steigt?
Folgendes habe ich hier schon probiert:
Temp_Klima_SR_EG_OL:temperature:16.3* {system('/home/pi/notifytempklima.sh');;}

Es geschieht jedoch nichts, obwohl die Temperatur momentan auf 16,3...°C steht.
Habe ich hier irgendwo noch nen Wurm drinnen, oder ist das ein komplett falscher Ansatz?

Vielen Dank schon mal im Voraus!

Viele Grüße
Simon

DeeSPe

Wenn das ein notify sein soll dann so:
define n_Temp_Klima_SR_EG_OL notify Temp_Klima_SR_EG_OL:temperature.* {system('/home/pi/notifytempklima.sh') if ($EVTPART1 >= 20)}

Allerdings wird das dann immer wieder getriggert wenn die Temperatur ausgelesen wird und über 20°C liegt.
Eventuell wäre ein userreading noch gut einzubauen welches eventuell tempAlarm heißt und dann bei über 20 °C gesetzt wird. Auf dieses userreading dann event-on-change-reading setzen und das notify anpassen auf dieses Reading. Fertig...

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Shootdackel

Hallo Dan,

vielen, vielen Dank für deine Hilfe!
Wie kann ich so ein userreading denn einbauen?(bin sehr neu in Fhem)
Eine weitere Frage ist, ob ich die Variable $EVTPART1 irgendwo definieren muss?!

vielen Dank und viele Grüße!
Simon

Shootdackel

Ich hab das jetzt zum Testen mal wie folgt eingebaut:
Temp_Klima_SR_EG_OL:temperature.* {system('/home/pi/notifytempklima.sh') if ($EVTPART1 >= 16)}

Leider passiert da allerdings nichts.

Viele Grüße
Simon

DeeSPe

Zitat von: Shootdackel am 12 September 2016, 13:47:40
Hallo Dan,

vielen, vielen Dank für deine Hilfe!
Wie kann ich so ein userreading denn einbauen?(bin sehr neu in Fhem)
Eine weitere Frage ist, ob ich die Variable $EVTPART1 irgendwo definieren muss?!

vielen Dank und viele Grüße!
Simon

Lies Dir mal bitte in der commandref die Beschreibungen zu notify durch.
Dort ist das mit den $EVTPART(s) eindeutig erklärt!

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

#5
Zitat von: Shootdackel am 12 September 2016, 13:59:44
Leider passiert da allerdings nichts.

Mit dieser Aussage wird Dir niemand helfen können!!!
Wo genau passiert nichts? Wird das notify nicht aufgerufen?
Funktioniert denn Dein Script wenn Du es als User fhem von der Shell aus startest?
Recht zum Ausführen für User fhem auf dem Script gesetzt?
Muss das Script eventuell mit sudo Rechten aufgerufen werden!

Fragen über Fragen....



userreading wäre z.B. so nutzbar:
attr Temp_Klima_SR_EG_OL userReadings tempAlarm:temperature.* {tempAlarm($name)}

Dann in die 99_myUtils.pm:
sub tempAlarm(;$)
{
  my ($name) = @_;
  $name = "Temp_Klima_SR_EG_OL" if (!$name);
  my $temp = ReadingsNum($name,"temperature",15);
  my $val = "noAlarm";
  $val = "Alarm" if ($temp >= 16);
  return $val;
}


Das erzeugt beim Update der temperature ein userreading namens tempAlarm.
Wenn die temperature >= 16 ist wird dem Reading der Wert "Alarm" zugewiesen, andernfalls "noAlarm".

Dann noch event-on-update-reading auf alle Werte die ein Event beim Update auslösen sollen. z.B.:
attr Temp_Klima_SR_EG_OL event-on-update-reading humidity,state,temperature
Für das Reading tempAlarm aktivierst Du event-on-change-reading, damit eben nur wenn sich dieser Wert verändert das angeschlossene notify getriggert wird.
attr Temp_Klima_SR_EG_OL event-on-change-reading tempAlarm
Das notify würde dann so aussehen:
define n_Temp_Klima_SR_EG_OL notify Temp_Klima_SR_EG_OL:tempAlarm:Alarm.* {system('/home/pi/notifytempklima.sh')}

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Shootdackel

Hallo Dan,

du hast Recht!
Das war ein wenig unglücklich von mir formuliert.
Das notification-command funktioniert aus der Shell heraus.
Die richtigen Rechte sind auch gesetzt.
Deshalb vermute ich, dass das notify nicht aufgerufen wird.

Vielen dank für die Anleitung zu den Readings!
Ich werde das direkt mal probieren!

Viele Grüße
Simon

DeeSPe

#7
Ob das notify aufgerufen wird kannst Du ja ganz leicht herausfinden.
Schau einfach in die Übersicht/Raum der notify(s) und wenn ein TimeStamp hinter diesem notify steht, dann wurde es aufgerufen.

Ich musste aber selber gestern lernen dass es offensichtlich bei useReadings die Variable $NAME nicht gibt, dafür heißt die dort einfach $name. Habe das im Beitrag oben berichtigt!
Du könntest das $name in diesem Falle aber einfach weglassen. Wenn nichts an die Funktion übergeben wird, dann wird ja automatisch Temp_Klima_SR_EG_OL als $name innerhalb der Funktion verwendet (siehe Zeile 4 der Funktion).
Der Rest sollte funktionieren.
Hatte gestern jemand anderes mit ähnlicher Problemstellung auf diesen Beitrag verlinkt und dieser hat es damit hinbekommen. Dadurch war auch aufgefallen dass $NAME nicht funktioniert.

Gruß
Dan

P.S. Mit welchem User hast du den Aufruf des Skripts gestartet? Ich hoffe Dir ist klar dass das der User fhem ausführen können muss.
Hast Du das Skript mit sudo gestartet?
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Shootdackel

Hallo Dan,
Ich werde das $NAME mal rausnehmen/bzw. durch $name ersetzen.
kann es sein, dass wenn die Temperatur auf über 16°C steigt, das notification nur einmal gesendet wird? Oder wird es bei jeder Aktualisierung gesendet?

Mir ist nämlich vorgestern und gestern etwas aufgefallen.
Ich habe in Fhem noch zwei Rauchmelder eingebunden, mit notification.
Die notification sind wie folgt angelegt:
define Noti_RauchmelderPushOn notify FL.Teammelder:smoke-Alarm.* {system('/home/pi/notify.sh');;}
und:
define Noti_RauchmelderPushOff notify FL.Teammelder:off {system('/home/pi/notifyoff.sh');;}

Nachdem ich vorgestern deine Anleitung bearbeitet habe:
define n_Temp_Klima_SR_EG_OL notify Temp_Klima_SR_EG_OL:temperature.* {system('/home/pi/notifytempklima.sh') if ($EVTPART1 >= 20)}

wurde mir nun das notify.sh ausgeführt, welches ich ja eigentlich für den Teamlead der Rauchmelder definiert habe!

Jetzt dachte ich erstmal, das wäre ein dummer Zufall gewesen.

Nachdem ich allerdings deine heutige Anleitung bearbeitet habe, wurde mir das notifyoff.sh ausgeführt!
Da war mir klar, das das alles andere als Zufall sein muss.

Deshalb auch meine Frage von oben, ob das notify nur einmal gesendet wird, sobald der Schwellwert erreicht ist, oder ob es bei jeder Temperaturabfrage, die über dem Schwellwert liegt sendet?

Weil dann wäre meine Vermutung, das das notification durchaus klappt, allerdings das falsche aufgerufen wird, aus welchem Grund auch immer.
Es stand Vorgestern sogar ein Datum hinter dem "Noti_RauchmelderPushOn" und heute hinter dem "Noti_RauchmelderPushOff".

Hast du hier noch eine Idee?  :)


Shootdackel

#9
Hi Dan,

noch ein kurzes Update von mir:

ich habe gerade $NAME in $name umgeändert und siehe da, es wird wieder notifyoff.sh ausgeführt, welches ich ja eigentlich für den Teamlead der Rauchmelder definiert habe!
Das beweißt ja jetzt meine Vermutung aus dem letzten Beitrag, das deine Lösungsvorschläge alle stimmen und funktionieren, jedoch wird das falsche notify ausgeführt.

Das wird die Stelle sein, wo hier irgendwie noch der Wurm drinnen ist!

Viele Grüße
Simon

DeeSPe

Zitat von: Shootdackel am 14 September 2016, 17:05:13
kann es sein, dass wenn die Temperatur auf über 16°C steigt, das notification nur einmal gesendet wird? Oder wird es bei jeder Aktualisierung gesendet?

Ja genau, das ist ja der Sinn dieses userReadings. Oder willst Du bei jedem Mal messen und Wert über 16 eine Notification bekommen? Das wird Dir, denke ich, ganz schnell auf den Sack gehen. Dann würde ich lieber noch ein zweites notify auf noAlarm setzen, damit bekommst Du wieder eine Notification wenn der Wert wieder im "grünen Bereich" ist. Und solange die Entwarnung nicht kommt weißt Du es ist im "roten Bereich".
Du kannst Dir auch das userReading sparen und es so machen wie Du im vorletzten Beitrag erwähnt hattest, dann bekommst Du bei jeder Messung über 20 eine Notification:
Zitat von: Shootdackel am 14 September 2016, 17:05:13
define n_Temp_Klima_SR_EG_OL notify Temp_Klima_SR_EG_OL:temperature.* {system('/home/pi/notifytempklima.sh') if ($EVTPART1 >= 20)}

Warum das falsche Skript bei Deinem notify ausgeführt wird kann ich Dir nicht sagen. Ein notify kann ja nur das ausführen was bei ihm hinterlegt ist. Das notify aus dem letzten Zitat z.B. kann nur "/home/pi/notifytempklima.sh"ausführen! Wie sollte es dazu kommen Skript "xyz.sh" auszuführen? Sicher dass da kein ähnliches notify dazwischenfunkt bei dem der RegEx vielleicht zu weit/groß gesetzt ist?

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

schka17

Für die Schwellwert Überwachung gibts ein einfaches Modul, das nennt sich TRESHOLD, damit kann man sich die ganzen notifies oder DOIFS sparen.


Sent from my iPad using Tapatalk
M: Thinclient x64 Debian | CUL FS20, HMS100WD, HMS100TF, HMS100T, HMS100CO, S300, S555TH | OWServer DS1420, DS18B20, DS2408 | RFXCOM UVN128, THWR800, THGR228N,RTGR328, PCR800 |Jeelink PCA301 EC3000|CUNO+IR|HMLAN|HMUSB|CUL433 Somfy|mySensors|espEasy
S1:Raspberry mit BPM810, Jeelink EC3000

Shootdackel

Hallo Zusammen,

ein Wunder ist geschehen!
Ich bekomme nun die richtige SMS aufs Handy.  ;D

Ich möchte mich an dieser Stelle bei schka17 bedanken für den sehr, sehr hilfreichen Beitrag!
Ein besonderes Dankeschön an Dan, für seine Gedult mit mir über mehrere Tage!  :D

Wie gesagt, ich habe vor einigen Wochen erst mit Fhem angefangen und habe durch diesen Beitrag noch sehr viel dazugelernt.

Viele Grüße
Simon

DeeSPe

Zitat von: Shootdackel am 16 September 2016, 09:15:40
ein Wunder ist geschehen!
Ich bekomme nun die richtige SMS aufs Handy.  ;D

Dann verrate uns (und Anderen) doch bitte wie Du es gelöst hast bzw. was das Problem war.

Danke.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Shootdackel

Hallo Zusammen,

sorry, ich war gerade bei einem Kunden.  :)
Also:


1. Definition eines Moduls vom Typ THRESHOLD:
define notify_Thermostat_Klima THRESHOLD Temp_Klima_SR_EG_OL:temperature:5.0 | {system('/home/pi/notifytempklima.sh')}

Hier definiere ich ein Modul "notify_Thermostat_Klima" von dem Typ "THRESHOLD" und Verknüpfe dieses mit dem Sensor "Temp_Klima_SR_EG_OL". Das ":temperature:5.0" gibt an, dass bei einer Überschreitung der Soll-Temperatur,(wird in Schritt 2 beschrieben) ein Fhem Befehl ausgeführt werden soll. "| {system('/home/pi/notifytempklima.sh')}"

2. Vorgabe eines Sollwertes
set notify_Thermostat_Klima desired 16

Die Folge währe nun, dass bei einer gemessenen Temperatur von 21 °C ein bash-Script ausgeführt wird.

Ich hoffe das hilft euch weiter!

Viele Grüße
Simon