FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: urseigner am 23 Februar 2024, 13:06:50

Titel: ESP32 Cam notify Schleife
Beitrag von: urseigner am 23 Februar 2024, 13:06:50
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
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: fz55 am 23 Februar 2024, 17:27:54
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
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: urseigner am 23 Februar 2024, 18:49:38
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
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: Beta-User am 23 Februar 2024, 18:53:04
FHEM-sleep ist bekannt, nehme ich an? Wohl schon, wenn sogar InternalTimer() verwendet wird...
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: urseigner am 26 Februar 2024, 09:39:44
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
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: Beta-User am 26 Februar 2024, 11:19:00
Zitat von: urseigner am 26 Februar 2024, 09:39:44
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
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.
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: betateilchen am 26 Februar 2024, 17:53:25
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.
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: urseigner am 27 Februar 2024, 11:18:41
Zitat von: betateilchen am 26 Februar 2024, 17:53:25
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.

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?
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: betateilchen am 27 Februar 2024, 18:52:49
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.
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: betateilchen am 27 Februar 2024, 18:58:12
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.
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: urseigner am 27 Februar 2024, 23:11:49
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.
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: fz55 am 27 Februar 2024, 23:55:49
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
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: betateilchen am 28 Februar 2024, 08:24:40
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.
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: betateilchen am 28 Februar 2024, 08:33:13
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?

Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: fz55 am 28 Februar 2024, 08:54:16
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!
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: urseigner am 28 Februar 2024, 16:44:13
@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

Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: betateilchen am 28 Februar 2024, 17:00:31
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?
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: urseigner am 28 Februar 2024, 17:29:21
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
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: betateilchen am 28 Februar 2024, 17:38:10
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.
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: urseigner am 28 Februar 2024, 18:02:40
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?
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: betateilchen am 28 Februar 2024, 18:07:20
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.
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: urseigner am 28 Februar 2024, 18:40:51

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?
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: urseigner am 28 Februar 2024, 18:48:38
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.
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: betateilchen am 28 Februar 2024, 19:00:52
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.
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: betateilchen am 28 Februar 2024, 19:06:42
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.
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: urseigner am 28 Februar 2024, 19:09:20
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.
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: betateilchen am 28 Februar 2024, 19:17:04
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 ...
 :)
Titel: Aw: ESP32 Cam notify Schleife
Beitrag von: urseigner am 28 Februar 2024, 19:25:12
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