Hallo zusammen,
ich habe noch ein Problemchen mit meiner Fotofalle mittels ESP32 Cam. Eine einzelne Aufnahme, mit Zeitverzögerung zwischen Aufnahme und Senden des Bildes per Telegram funktioniert einwandfrei:
Hier meine DEF im NOTIFY:
ESP32CAM_Ausloeser:push {
my $name = "ESP32CAM";
fhem "get $name image";
InternalTimer(gettimeofday()+2, "fhem", "set teleBot sendImage ./www/snapshots/${name}_snapshot.jpg", 0);
}
Ich bekomme es aber leider schon länger nicht hin, das vernünftig in einer Schleife abzuarbeiten. Es sollen am Ende drei Bilder gesendet werden. Bei Bewegung natürlich verschiedene ;-). Ich bitte um Unterstützung.
Viele Grüße
Urs
Hallo Urs,
wenn die Kamera über das Modul IPCAM eingebunden ist, kannst du imageWithCalback verwenden (ungetestet):
fhem "get ESP32CAM imageWithCallback set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg";
Das geht allerdings nur für eine Aufnahme.
Grüsse
fz55
Danke für die Antwort fz55. imageWithCallback ist sehr cool, bringt in meinem Fall aber nichts, da ich, wie von Dir auch angemerkt, nur ein Bild senden kann.
Ich hätte jedoch gerne in kurzen Abständen drei Bilder. So erhöhe ich die Wahrscheinlichkeit, dass ich denjenigen, der die Fotofalle ausgelöst hat, auf einem der Bilder sehe.
VG
Urs
FHEM-sleep ist bekannt, nehme ich an? Wohl schon, wenn sogar InternalTimer() verwendet wird...
Zitat von: Beta-User am 23 Februar 2024, 18:53:04FHEM-sleep ist bekannt, nehme ich an? Wohl schon, wenn sogar InternalTimer() verwendet wird...
Ja, hatte ich ebenfalls erfolglos probiert. Diesbezüglich hatte ich gelesen, dass FHEM-sleep das ganze System kurz pausiert, was ich (ohne wirklich Ahnung davon zu haben) als eher unvorteilhaft empfand. Aber vielleicht sehe ich das auch falsch. Könntest Du mir mal ein Beispiel-Snippet zeigen, wie Du es angehen würdest?
Vielen Dank und beste Grüße
Urs
Zitat von: urseigner am 26 Februar 2024, 09:39:44Zitat von: Beta-User am 23 Februar 2024, 18:53:04FHEM-sleep ist bekannt, nehme ich an? Wohl schon, wenn sogar InternalTimer() verwendet wird...
Ja, hatte ich ebenfalls erfolglos probiert. Diesbezüglich hatte ich gelesen, dass FHEM-sleep das ganze System kurz pausiert, was ich (ohne wirklich Ahnung davon zu haben) als eher unvorteilhaft empfand. Aber vielleicht sehe ich das auch falsch. Könntest Du mir mal ein Beispiel-Snippet zeigen, wie Du es angehen würdest?
Vielen Dank und beste Grüße
Urs
Perl-sleep hält FHEM an, FHEM-sleep definiert intern einen InternalTimer...
Du musst jede "Indirektion" halt "escapen", also die Strichpunkte verdoppeln. Leider habe ich dazu grade kein Beispiel zur Hand.
Zitat von: urseigner am 23 Februar 2024, 18:49:38Ich hätte jedoch gerne in kurzen Abständen drei Bilder.
Warum denn dann so umständlich denken und alles selbst machen wollen, anstatt einfach die Möglichkeiten nutzen, die FHEM schon out-of-the-box bietet?
ESP32CAM_Ausloeser:push define temp_at at +*{3}00:00:02 get ESP32CAM image;;;; set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg
Ergibt drei Bilder im Abstand von 2 Sekunden.
Zitat von: betateilchen am 26 Februar 2024, 17:53:25Zitat von: urseigner am 23 Februar 2024, 18:49:38Ich hätte jedoch gerne in kurzen Abständen drei Bilder.
Warum denn dann so umständlich denken und alles selbst machen wollen, anstatt einfach die Möglichkeiten nutzen, die FHEM schon out-of-the-box bietet?
ESP32CAM_Ausloeser:push define temp_at at +*{3}00:00:02 get ESP32CAM image;;;; set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg
Ergibt drei Bilder im Abstand von 2 Sekunden.
Danke für die Antwort. Das Klingt ja super. Leider erhalte ich in Telegram keine Bilder, wenn ich das vorhandene DEF im NOTIFY durch Deins ersetze. Wie erwähnt, geht das eingangs gezeigte Snippet. Es liegt also nicht an der Cam oder an Telegram. Bei Deinem Beispiel erscheint nach jedem Auslösen oben links in der FHEM-Weboberfläche das rote Fragezeichen. Im Logfile steht dann dies:
temp_at: Unknown argument image;, choose one of image imageWithCallback last snapshots
Hängt das vielleicht mit den ganzen Semikolons zusammen?
Die Fehlermeldung ist ja eigentlich eindeutig.
Du kannst versuchen, die Semikolon zu reduzieren. Es kommt darauf an, wie bzw. wo Du das define des notify eingibst.
Zitat von: urseigner am 27 Februar 2024, 11:18:41Bei Deinem Beispiel erscheint nach jedem Auslösen oben links in der FHEM-Weboberfläche das rote Fragezeichen.
Darum kümmern wir uns später.
Das hier in der Definition des notify funktioniert:
ESP32CAM_Ausloeser:push define temp_at1 at +*00:00:02 get ESP32CAM image; set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg
Wenn ich nun ein weiteres notify anlege und das hier reinschreibe:
ESP32CAM_Ausloeser:push define temp_at2 at +*00:00:06 get ESP32CAM image; set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg
funktioniert das zwar, dass ich zwei Bilder bekomme. Der zeitliche Verzug scheint aber nicht zu passen. Selbst wenn ich auf 20 Sekunden stelle, kommen die Bilder fast zeitgleich. Deine Version sah eleganter aus. Dafür drei notifies anzulegen wäre dagegen echt unschön. Bzgl. Verzögerung funktioniert es damit dann nicht einmal.
Vielleicht hilft imageWithCallback hier doch:
ESP32CAM_Ausloeser:push {
fhem "get ESP32CAM imageWithCallback set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg";
fhem "defmod temp_at1 at +00:00:04 get ESP32CAM imageWithCallback set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg";
fhem "defmod temp_at2 at +00:00:08 get ESP32CAM imageWithCallback set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg";
}
Grüße
fz55
fhem "get ESP32CAM imageWithCallback set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg";
Das funktioniert auf keinen Fall. Du kannst nicht einfach zwei FHEM Befehle im Ausführungsteil eines at hintereinander schreiben, ohne diese durch Semikolon zu trennen. Dabei spielt es keine Rolle, ob man "image" oder "imageWithCallback" verwendet.
Zitat von: urseigner am 27 Februar 2024, 23:11:49Das hier in der Definition des notify funktioniert:
ESP32CAM_Ausloeser:push define temp_at1 at +*00:00:02 get ESP32CAM image; set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg
Damit (+*00:00:02) kommen aber unbegrenzt viele Bilder im Abstand von 2 Sekunden, sobald das notify einmal getriggert wurde.
Deshalb hatte ich +*{3}00:00:02 verwendet, um die Ausführung des at auf 3 Mal zu begrenzen.
Nachdem Dein notify zumindest einmal funktioniert hat, hattest Du denn dann die Begrenzung mit {3} wieder eingefügt und getestet? Gibt es da Fehlermeldungen im Log?
Zitat von: betateilchen am 28 Februar 2024, 08:24:40fhem "get ESP32CAM imageWithCallback set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg";
Das funktioniert auf keinen Fall. Du kannst nicht einfach zwei FHEM Befehle im Ausführungsteil eines at hintereinander schreiben, ohne diese durch Semikolon zu trennen. Dabei spielt es keine Rolle, ob man "image" oder "imageWithCallback" verwendet.
Das geht sehr wohl. Es werden nicht zwei Befehle abgesetzt, denn alles was nach imageWithCallback kommt, wird als Parameter übergeben. Siehe Doku zum Modul IPCAM.
Bei deinem Lösungsvorschlag fehlt eine kleine Pause zwischen Imageerstellung und dem Versenden!
@fz55: Danke für die Idee, das ging bei mir allerdings nicht.
@betateilchen:
Mit dieser DEF im NOTIFY
ESP32CAM_Ausloeser:push define temp_at at +*{3}00:00:02 get ESP32CAM image; set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg
Kommt über Telegram genau ein Bild an.
Im Logfile steht das:
2024.02.28 16:39:07 3: IPCAM (ESP32CAM) - getSnapshot URI: http://192.168.178.198/capture?_cb=1708631745312
2024.02.28 16:39:07 3: IPCAM (ESP32CAM) - ExecuteSnapshotRequest blocking: 0, camUrl: http://192.168.178.198/capture?_cb=1708631745312
2024.02.28 16:39:09 3: IPCAM (ESP32CAM) - Snapshot Image Format: jpg
2024.02.28 16:39:09 3: IPCAM (ESP32CAM) - getSnapshot URI: http://192.168.178.198/capture?_cb=1708631745312
2024.02.28 16:39:09 3: IPCAM (ESP32CAM) - ExecuteSnapshotRequest blocking: 0, camUrl: http://192.168.178.198/capture?_cb=1708631745312
2024.02.28 16:39:09 3: IPCAM (ESP32CAM) - Snapshot Image Format: jpg
2024.02.28 16:39:11 3: IPCAM (ESP32CAM) - getSnapshot URI: http://192.168.178.198/capture?_cb=1708631745312
2024.02.28 16:39:11 3: IPCAM (ESP32CAM) - ExecuteSnapshotRequest blocking: 0, camUrl: http://192.168.178.198/capture?_cb=1708631745312
2024.02.28 16:39:11 3: IPCAM (ESP32CAM) - Snapshot Image Format: jpg
Wie Du im Logfile sehen kannst, wird das Ganze aber korrekt 3 Mal ausgeführt.
Vermutlich bezeichnet 1708631745312 aber in allen drei Fällen immer das gleiche Bild?
Es sieht nach einem Timestamp aus, der sich in Thu Feb 22 2024 19:55:45 GMT+0000 auflösen lässt.
Aber um das korrekt zu interpretieren, kenne ich IPCAM zu wenig.
Hast Du vielleicht ein Rechteproblem, um das in ./www.snapshots/ liegende Bild zu überschreiben?
Hast Du in dem Verzeichnis mal nachgeschaut, ob da wirklich dreimal ein Bild abgelegt wird?
Nein, das hat etwas mit der Bildgröße und Auflösung zu tun.
Die Datei ./www/snapshots/ESP32CAM_snapshot.jpg wird bei jedem Aufruf von http://192.168.178.198/capture?_cb=1708631745312 mit einem neuen Bild überschrieben.
Das eine Bild, welches ich per Telegram bekomme, ändert sich, wenn ich zwischendurch die Kamera bewege.
Könnte es ein Timing-Problem geben? Der Prozess läuft vielleicht zu schnell ab. Allerdings ändert sich nichts, wenn ich die Zeit hochschraube:
ESP32CAM_Ausloeser:push define temp_at at +*{3}00:00:12 get ESP32CAM image; set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg
Wobei es im Logfile dann doch einen Hinweis gibt:
2024.02.28 17:25:46 3: IPCAM (ESP32CAM) - getSnapshot URI: http://192.168.178.198/capture?_cb=1708631745312
2024.02.28 17:25:46 3: IPCAM (ESP32CAM) - ExecuteSnapshotRequest blocking: 0, camUrl: http://192.168.178.198/capture?_cb=1708631745312
2024.02.28 17:25:46 3: IPCAM (ESP32CAM) - Snapshot Image Format: jpg
2024.02.28 17:25:58 3: IPCAM (ESP32CAM) - getSnapshot URI: http://192.168.178.198/capture?_cb=1708631745312
2024.02.28 17:25:58 3: IPCAM (ESP32CAM) - ExecuteSnapshotRequest blocking: 0, camUrl: http://192.168.178.198/capture?_cb=1708631745312
2024.02.28 17:25:58 3: IPCAM (ESP32CAM) - Snapshot Image Format: jpg
2024.02.28 17:26:10 3: IPCAM (ESP32CAM) - getSnapshot URI: http://192.168.178.198/capture?_cb=1708631745312
2024.02.28 17:26:10 3: IPCAM (ESP32CAM) - ExecuteSnapshotRequest blocking: 0, camUrl: http://192.168.178.198/capture?_cb=1708631745312
2024.02.28 17:26:17 0: IPCAM (ESP32CAM) - error while getting snapshot http://192.168.178.198/capture?_cb=1708631745312 - read from http://192.168.178.198:80 timed out
Den Timeout Fehler würde ich in diesem Fall als "Zufall" und nicht im Zusammenhang mit Deinen Experimenten sehen.
Zitat von: urseigner am 28 Februar 2024, 17:29:21Könnte es ein Timing-Problem geben? Der Prozess läuft vielleicht zu schnell ab. Allerdings ändert sich nichts, wenn ich die Zeit hochschraube:
Wenn es ein Timing Problem ist, dann sicher nicht an der Stelle, an der Du jetzt die Zeit verändert hast. Sondern vermutlich eher zwischen dem Abholen des Bildes (get...) und dem Verschicken (set...)
Du könntest versuchen, dazwischen noch ein sleep zu setzen.
ESP32CAM_Ausloeser:push define temp_at at +*{3}00:00:02 get ESP32CAM image; sleep 0.2; set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg
Damit wird 0,2 Sekunden nach dem Befehl zum Abholen des Bildes gewartet, bevor es verschickt wird. Wie lange Deine Kamera braucht, um das Bild zu liefern und abzuspeichern, musst Du bitte selbst rausfinden.
Das ändert nichts. Ich habe das mal in die FHEM-Konsole kopiert und beobachtet, wie sich die Readings von temp_at ändern. Das geht einwandfrei. Sieht man ja auch im Logfile. Allerdings erscheint im DEF von temp_at kein
set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg
Das muss doch mit rein, sonst ist ja klar, dass nur ein Bild geschickt wird. Wie siehst Du das?
Deshalb hatte ich ja ursprünglich mehr als ein ; eingefügt und Dich gebeten, mit der Anzahl der Semikolon zwischen den Befehlen zu experimentieren.
Es sei denn, das IPCAM Modul verwurstet irgendwie den kompletten String nach dem "get..." und entsorgt den Rest, mit dem es nichts anfangen kann. Das kann ich nicht abschätzen.
Wenn ich das nachbaue und zwei andere FHEM Befehle in den Ausführungsteil des temp_at einfüge, funktioniert das problemlos.
Wenn ich es so über die Konsole abschicke, setzt er alles ein:
define temp_at at +*{3}00:00:02 get ESP32CAM image sleep 0.6 set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg;;;
Klar, dann fehlt was.
Sobald ich nach image ein ; setze, wird der Rest abgeschnitten. Kann man die ; escapen?
Zitat von: betateilchen am 28 Februar 2024, 18:07:20Wenn ich das nachbaue und zwei andere FHEM Befehle in den Ausführungsteil des temp_at einfüge, funktioniert das problemlos.
Zeig mal bitte Deinen Nachbau.
Zitat von: urseigner am 28 Februar 2024, 18:40:51Kann man die ; escapen?
ja, indem man zwei ;; setzt.
Zitat von: urseigner am 28 Februar 2024, 18:48:38Zeig mal bitte Deinen Nachbau.
Kann ich jetzt gerade nicht.
defmod test_notify notify ESP32CAM_Ausloeser:push define test_at at +*{3}00:00:02 setreading ESP32CAM_Ausloeser d1 1;;;; setreading ESP32CAM_Ausloeser d2 2
Damit werden im device ESP32CAM_Ausloeser zwei readings d1 und d2 erzeugt.
Funktioniert hier einwandfrei.
Okay, dann haben wir's jetzt:
define temp_at at +*{3}00:00:02 get ESP32CAM image;; set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg;;;
Vielen Dank für die Geduld und Hilfe.
Die drei ;;; am Ende kannst Du weglassen, es sollte trotzdem funktionieren, weil danach ja nix mehr kommt.
Und jetzt entfernen wir - wie versprochen - noch das rote Fragezeichen:
define -temporary temp_at ...
:)
Dass Du Dir das mit dem Fragezeichen noch gemerkt hast.
Das sleep war dann doch noch wichtig, da sonst beim erneuten Auslösen das letzte Bild vom vorherigen Auslösen geschickt wurde. So klappt es aber nun einwandfrei:
ESP32CAM_Ausloeser:push define -temporary temp_at at +*{3}00:00:02 get ESP32CAM image;; sleep 0.3;; set teleBot sendImage ./www/snapshots/ESP32CAM_snapshot.jpg
Nochmals Vielen Dank!
VG
Urs