Hallo,
ich möchte Folgendes erreichen:
- FHEM: IPCAM erzeugt 5 Snapshots mit je 1 Sekunde Verzögerung
get TreppenhausKamera image - OS: über convert wird aus den 5 Snapshots 1 animiertes GIF erzeugt
convert -delay 100 -loop 0 /opt/fhem/www/images/webcam/TreppenhausKamera_snapshot_*.jpg /opt/fhem/www/images/webcam/wohnungstuer.gif - FHEM: das erzeugte GIF-File wird als Attachment per Signal verschickt
set signal send &/opt/fhem/www/images/webcam/wohnungstuer.gif Wohnungstür
Die Einzelelemente funktionieren wie gewünscht...
Ich habe diverse Kombinationen ausprobiert, bekomme aber leider meistens das GIF vom vorherigen Lauf versendet.
Vielleicht habe ich lediglich falsch nach der korrekten Verwendung von "sleep" bzw. "wait" gesucht.
Vielen Dank für Hinweise im Voraus,
Carsten
Wie hast Du es denn bis jetzt probiert?
Es giebt mehrere Wege dafür ...
Über Notify...
Versuch 1 (ohne sleep)
defmod notifyFlurTuerOpen notify sc_wohnungstuer:contact:.*open.*|sc_wohnungstuer:open.* {\
my $snapshotPath = "/opt/fhem/";;\
my $snapshotFile = "www/images/webcam/wohnungstuer.gif";;\
\
fhem "get TreppenhausKamera image";;\
qx(convert -delay 100 -loop 0 /opt/fhem/www/images/webcam/TreppenhausKamera_snapshot_*.jpg $snapshotPath$snapshotFile);;\
fhem "set signal send &$snapshotPath$snapshotFile Wohnungstür";;\
}
Versuch 2 (mit sleep nach get image)
defmod notifyFlurTuerOpen notify sc_wohnungstuer:contact:.*open.*|sc_wohnungstuer:open.* {\
my $snapshotPath = "/opt/fhem/";;\
my $snapshotFile = "www/images/webcam/wohnungstuer.gif";;\
\
fhem "get TreppenhausKamera image ; sleep 5";;\
qx(convert -delay 100 -loop 0 /opt/fhem/www/images/webcam/TreppenhausKamera_snapshot_*.jpg $snapshotPath$snapshotFile);;\
fhem "set signal send &$snapshotPath$snapshotFile Wohnungstür";;\
}
Versuch 3 (mit sleep vor convert)
defmod notifyFlurTuerOpen notify sc_wohnungstuer:contact:.*open.*|sc_wohnungstuer:open.* {\
my $snapshotPath = "/opt/fhem/";;\
my $snapshotFile = "www/images/webcam/wohnungstuer.gif";;\
\
fhem "get TreppenhausKamera image";;\
qx(sleep 5 && convert -delay 100 -loop 0 /opt/fhem/www/images/webcam/TreppenhausKamera_snapshot_*.jpg $snapshotPath$snapshotFile);;\
fhem "set signal send &$snapshotPath$snapshotFile Wohnungstür";;\
}
Versuch 4 (komplett in Shell-Script)
defmod notifyFlurTuerOpen notify sc_wohnungstuer:contact:.*open.*|sc_wohnungstuer:open.* {\
`/opt/fhem/getTreppenhausImage.sh`;;\
}
Versuch 4 - Shell Script
#!/bin/bash
perl /opt/fhem/fhem.pl 7072 "get TreppenhausKamera image"
sleep 5
snapshotFile="/opt/fhem/www/images/webcam/wohnungstuer.gif"
convert -delay 100 -loop 0 /opt/fhem/www/images/webcam/TreppenhausKamera_snapshot_*.jpg $snapshotFile
perl /opt/fhem/fhem.pl 7072 "set signal send &$snapshotFile Wohnungstür"
In der Config oder in der FHEM-Weboberfläche so eingegeben?
ist wichtig wegen der Anzahl der ;;
Die defmods sind über "Raw definition" ausgelesen => in der Config definiert.
1.
qx(sleep 5
Das Blockiert Dein FHEM um mindestens 5 Sekunden. Der Vorheriege "fhem-get" dürfte auch erst nach dem Perl-Block abgearbeitet werden (Hinweis: FHEM ist Ereignisorientiert)
2. Das Script weiß doch, wann es beendet wird, warum soll FHEM auf das Script warten (und Blockieren), wenn das Script FHEM Trickern kann? Über Telnet oder Web, gibt genug Hinweise hier im Forum./Wiki (und bei Otto). Dann kann das Sript auch im Hintergrund laufen.
3. Und warum so früh auf die Perl-Ebene?
defmod notifyFlurTuerOpen notify sc_wohnungstuer:contact:.*open.*|sc_wohnungstuer:open.* get TreppenhausKamera image; sleep 5; "scriptname"
und in "scriptname" dann die komplette Ausarbeitung auslagern, also das convert.
Hinweis: Obiges untgetestet und Bitte für Dich nacharbeiten. Ist etwas copy&paste.
Es gibt bei IPCAM auch get imageWithCallback. Vielleicht hilft dir das weiter.
Ich habe gerade nochmal nachgelesen. Leider geht imageWithCallback bei Serienaufnahmen nicht.
Zitat von: Wernieman am 04 Oktober 2023, 17:21:483. Und warum so früh auf die Perl-Ebene?
defmod notifyFlurTuerOpen notify sc_wohnungstuer:contact:.*open.*|sc_wohnungstuer:open.* get TreppenhausKamera image; sleep 5; "scriptname"
und in "scriptname" dann die komplette Ausarbeitung auslagern, also das convert.
Hinweis: Obiges untgetestet und Bitte für Dich nacharbeiten. Ist etwas copy&paste.
Ich habe jetzt Folgenden Ablauf (VIELEN DANK für Deine Anregung! ):
sc_wohnungstuer:open.* get TreppenhausKamera image ; "/opt/fhem/getTreppenhausImage.sh &"
Den
sleep-Befehl habe ich in das Shell-Skript ausgelagert. Dadurch ist FHEM nicht mehr blockiert.
Eigentlich brauchst Du das & nicht, das schon durch das "" es NonBlocking ausgeführt wird.
Und brauchst Du wirklich noch den "sleep"?
"&" ist entfernt - funktioniert!
"sleep" brauche ich bevor das convert die 5 Dateien umwandelt. Ansonsten werden die JPGs vom letzten Lauf ins GIF generiert.