E-Mail-Versand zu schnell nacheinander?

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

Antworten
Hawkeye
Beiträge: 2
Registriert: 20.06.2018, 21:58

E-Mail-Versand zu schnell nacheinander?

Beitrag von Hawkeye » 20.06.2018, 22:53

Hallo,
das Neuaufsetzen meiner Homatic nutze ich für die Optimierung des ganzen Systems. So steige ich beim E-Mail-Versand auf den CUxD um. Anstelle von

Code: Alles auswählen

string stdout;
string stderr;
system.Exec("/etc/config/addons/email/email 02", &stdout, &stderr);
heißt es jetzt

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("/etc/config/addons/email/email 02");
Die Skripte meiner Bewegungsmelder in der alten, nicht CUxD-Version
Ist der Alarmstatus scharf und wird eine Bewegung registriert, so wird für jeden Bewgungsmelder das folgende Skript aufgerufen:

Code: Alles auswählen

! Alarm-Weitergabe Variable für den Flur setzen
dom.GetObject("Bewegungsmelder_Flur").State("true");

! Text der Status-E-Mail
dom.GetObject("EMail_Betreff").State("Im Flur hat der Bewegungsmelder eine Bewegung registriert [AAAAAAAA]");
string vText = 
"Im Flur hat der Bewegungsmelder eine Bewegung registriert. [BBBBBBBB]";
dom.GetObject("EMail_Text").State(vText);

! Status-E-Mail versenden
string stdout;
string stderr;
system.Exec("/etc/config/addons/email/email 02", &stdout, &stderr);
Das Setzen der Variable 'Bewegungsmelder_Flur' am Anfang löst dabei ein zweites Skript aus, das den eigentlichen Alarm abhandelt:

Code: Alles auswählen

! Alarm-Weitergabe Variablen zurück setzen
dom.GetObject("Bewegungsmelder_Flur").State("false");

! Text der Status-E-Mail
dom.GetObject("EMail_Betreff").State("Alarm Stufe 3 ausgelöst [CCCCCCCC]");
string vText = 
"Alarm Stufe 3 ausgelöst. [DDDDDDDD]";
dom.GetObject("EMail_Text").State(vText);

! Status-E-Mail versenden
string stdout;
string stderr;
system.Exec("/etc/config/addons/email/email 02", &stdout, &stderr);
(Ich hab die Programme jetzt etwas vereinfacht. Die Buchstabenketten dienen der besseren Wiedererkennung des Textes in dieser Beschreibung)

Soweit hat bisher alles bestens funktioniert. Ich bekomme eine Meldung wer auslöst

Code: Alles auswählen

Betreff: [SmartHome] Im Flur hat der Bewegungsmelder eine Bewegung registriert [AAAAAAAA]
Im Flur hat der Bewegungsmelder eine Bewegung registriert. [BBBBBBBB]
und eine zweite Meldung dass auch der Alarm eingeleitet wurde

Code: Alles auswählen

Betreff: [SmartHome] Alarm Stufe 3 ausgelöst [CCCCCCCC]
Alarm Stufe 3 ausgelöst. [DDDDDDDD]
Nach dem Umstieg auf CUxD sehen die Skripte so aus:

Code: Alles auswählen

! Text der Status-E-Mail
dom.GetObject("EMail_Betreff").State("Im Flur hat der Bewegungsmelder eine Bewegung registriert [AAAAAAAA]");
string vText = 
"Im Flur hat der Bewegungsmelder eine Bewegung registriert. [BBBBBBBB]";
dom.GetObject("EMail_Text").State(vText);

! Status-E-Mail versenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("/etc/config/addons/email/email 02");

! Alarm-Weitergabe Variable für den Flur setzen
dom.GetObject("Bewegungsmelder_Flur").State("true");
und

Code: Alles auswählen

! Alarm-Weitergabe Variablen zurück setzen
dom.GetObject("Bewegungsmelder_Flur").State("false");

! Text der Status-E-Mail
dom.GetObject("EMail_Betreff").State("Alarm Stufe 3 ausgelöst [CCCCCCCC]");
string vText = 
"Alarm Stufe 3 ausgelöst. [DDDDDDDD]";
dom.GetObject("EMail_Text").State(vText);

! Status-E-Mail versenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("/etc/config/addons/email/email 02");
Beim ersten Skript habe ich dabei schon in einer 'verbesserten' Version die Weitergabe der Bewegung (Setzen einer Variable) ans Ende verschoben, damit die zweite E-Mail so spät wie möglich ausgelöst wird.

Jetzt bekomme ich aber nur noch eine E-Mail mit folgendem Inhalt:

Code: Alles auswählen

Betreff: [SmartHome] Alarm Stufe 3 ausgelöst [CCCCCCCC]
Alarm Stufe 3 ausgelöst. [DDDDDDDD]
Gestern Abend hab ich sogar folgende E-Mail bekommen (ebenfalls nur eine). Es ließ sich aber heute leider nicht mehr reproduzieren.

Code: Alles auswählen

Betreff: [SmartHome] Alarm Stufe 3 ausgelöst [CCCCCCCC]
Im Flur hat der Bewegungsmelder eine Bewegung registriert. [BBBBBBBB]
(ok, es war schon spät und ich war müde, vielleicht hab ich auch noch was anderes gemacht ... ;-) )
Auf alle Fälle: Nach dem Umstieg auf den E-Mail-Versand mit CUxD klappen beide E-Mails hintereinander nicht mehr richtig. Hat vielleicht jemand von Euch eine Ahnung was ich falsch mache bzw. besser machen könnte? (Ich muss an verschiedenen Stellen direkt nacheinander mehrere E-Mails verschicken, d.h. bessere Vorschläge der Alarmbehandlung helfen mir hier auch nur bedingt weiter.)

LG Hawkeye

P.S.: Ich würde es gerne bei den zwei Meldungen belassen. Das erste Skript behandelt individuell den jeweiligen Sensor und ich weiß wo etwas los ist. Das zweite Skript behandelt für alle Sensoren die Reaktion und ich weiß, dass auch die geklappt hat. Inzwischen hab ich mich an das zweistufige außerdem gewöhnt ...

Benutzeravatar
uwe111
Beiträge: 4807
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 240 Mal
Kontaktdaten:

Re: E-Mail-Versand zu schnell nacheinander?

Beitrag von uwe111 » 21.06.2018, 11:33

Ich bin jetzt kein HM-Script Experte, aber kurz aufeinander folgende Befehlsaufrufe sollten mittels CUxD kein Problem sein.

Vielleicht sind Deine alten Scripts noch parallel aktiv?

Wenn Du den CUxD Aufruf prüfen möchtest, dann kannst Du die Aufruf-Zeile in Deinem Script einfach verdoppeln:

Code: Alles auswählen

! Status-E-Mail versenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("/etc/config/addons/email/email 02");
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("/etc/config/addons/email/email 02");
Viele Grüße

Uwe
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

Hawkeye
Beiträge: 2
Registriert: 20.06.2018, 21:58

Re: E-Mail-Versand zu schnell nacheinander?

Beitrag von Hawkeye » 24.06.2018, 13:05

Hallo,
ich habe jetzt dazu noch einige Versuche gemacht. Bei der oben verwendeten Methode des E-Mail-Versands arbeitet CUxD die E-Mails nicht der Reihe nach ab, sondern 'reagiert einfach' auf die Ereignisse, ohne dass ein Eingangsbuffer zu existieren scheint. Ähnliche Erfahrungen hat auch ein Bekannter von mir gemacht.

Ein Telefonat mit der HomeMatic Hotline (die natürlich CUxD nicht unterstützen) brachte das Ergebnis, dass sie anraten die Skripte mit 3 Sekunden Zeitunterschied abzusetzen. Und von diesem Wert nach unten kleinere Werte zu testen.

Das Ganze funktioniert natürlich nur, wenn nur ein Ergebnis nach dem anderen ein Ereignis auslöst. Werden zwei oder mehrere Ereignisse ausgelöst, so können sie sich erneut in die Quere kommen.

Ich habe mich jetzt überhaupt nicht mit den 'inneren Werten' des CUxD beschäftigt. Im Moment hab ich dazu auch leider gar keine Zeit. Über einen weiteren Tipp bin ich also jederzeit dankbar. Umgekehrt der Vorschlag aber auch von mir: Kann man dem Mailversand einen Eingangspuffer programmieren?

Viele Grüße
Hawkeye

Benutzeravatar
uwe111
Beiträge: 4807
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 240 Mal
Kontaktdaten:

Re: E-Mail-Versand zu schnell nacheinander?

Beitrag von uwe111 » 24.06.2018, 15:48

Hawkeye hat geschrieben:ich habe jetzt dazu noch einige Versuche gemacht. Bei der oben verwendeten Methode des E-Mail-Versands arbeitet CUxD die E-Mails nicht der Reihe nach ab, sondern 'reagiert einfach' auf die Ereignisse, ohne dass ein Eingangsbuffer zu existieren scheint. Ähnliche Erfahrungen hat auch ein Bekannter von mir gemacht.
Ich kenne Deine Versuche nicht, aber CUxD führt die Befehle nach dem Beschreiben der Datenpunkte auch in der Reihenfolge des Setzens dieser Datenpunkte durch die Logikschicht der CCU aus. Erst danach laufen die mittels CMD_EXEC aufgerufenen Befehlszeilen als parallele Prozesse im Hintergrund.
Hawkeye hat geschrieben:Ich habe mich jetzt überhaupt nicht mit den 'inneren Werten' des CUxD beschäftigt. Im Moment hab ich dazu auch leider gar keine Zeit. Über einen weiteren Tipp bin ich also jederzeit dankbar. Umgekehrt der Vorschlag aber auch von mir: Kann man dem Mailversand einen Eingangspuffer programmieren?
Mittels SYSLOG-Geräteparameter kannst Du die CMD_EXEC Aufrufe loggen. Vielleicht hilft das weiter.

Viele Grüße

Uwe
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

Thialf
Beiträge: 20
Registriert: 25.09.2013, 10:44
Hat sich bedankt: 1 Mal
Danksagung erhalten: 4 Mal

Re: E-Mail-Versand zu schnell nacheinander?

Beitrag von Thialf » 29.03.2022, 23:32

Cuxd bekommt zwar nacheinander den Trigger die beiden Emails zu versenden, aber abgearbeitet wird es parallel via Multitasking. Damit kann jedoch das TCL-Emailskript nicht umgehen.
Zum gleichen Fehler führt ein natives bash-Skript (ohne cuxd und ohne homematic-Skript):

Code: Alles auswählen

/etc/config/addons/email/email 01 'Test 1' '111' &
/etc/config/addons/email/email 01 'Test 2' '222' &
Es kommt immer recht zufällig nur die Test 1 oder Test 2 Email an.
Wenn man in einem Homematic-Programm ist, braucht man das zwar nicht zu forken, eine Ausführung hintereinander würde das Problem auch lösen:

Code: Alles auswählen

email 01; email 01;
Aber bei mir werden manche Homematic-Programme simultan ausgelöst und es sollen 2 unabhängige Emails versendet werden, was nicht funktioniert.
Gelöst hab ich das Problem mit flock. Damit wird auf der CCU das Email-Programm in nur einer Instanz laufen, alle folgenden Aufrufe werden hinten angestellt:

Code: Alles auswählen

datapoints.Get("CUxD.CUX2801001:1.CMD_EXEC").State("(flock -w40 99;/etc/config/addons/email/email 01 'Test 1' '111')99>/tmp/email.lock");
Hier wird max. 40s gewartet. Wenn dann Filelock nicht freigegeben werden sollte, wird Email trotzdem ausgeführt. Nur um sicher zu gehen, falls evtl. ein unlock mal fehlgeschlagen ist. Letzteres hab ich allerdings noch nie beobachtet. Da email.lock in /tmp/ liegt, kann das auch nicht durch Ausstecken der CCU passieren. /tmp liegt im RAM und der filelock wäre nach einem Neustart wieder weg.

Ich kenne mich leider mit TCL nicht gut aus, aber flock gäbe es auch für TCL direkt, sodass der Umweg über bash nicht notwendig wäre. Aber das müsste jemand ins Emailaddon einbauen, der sich damit auskennt:
https://wiki.tcl-lang.org/page/flock

Vielleicht noch als kurze Info für meinen Aufruf oben: Betreff und Emailtext über Systemvariablen zu schreiben, ist mir zu aufwändig und zu unsicher was die Synchronisation angeht. Ich benutze deshalb das TCL-Skript, um Betreff&Text direkt via Parameter zu übergeben:

Code: Alles auswählen

set betreff [encoding convertfrom utf-8 [lindex $argv 1]]
set text [encoding convertfrom utf-8 [lindex $argv 2]]
Zuletzt geändert von uwe111 am 04.04.2022, 20:12, insgesamt 1-mal geändert.
Grund: CODE in CODE Tags

Antworten

Zurück zu „CUxD“