Hauptmenü

ESP32 Cam notify Schleife

Begonnen von urseigner, 23 Februar 2024, 13:06:50

Vorheriges Thema - Nächstes Thema

urseigner

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

fz55

#1
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

urseigner

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

Beta-User

FHEM-sleep ist bekannt, nehme ich an? Wohl schon, wenn sogar InternalTimer() verwendet wird...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

urseigner

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

Beta-User

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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

urseigner

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?

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

urseigner

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.

fz55

#11
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

betateilchen

#12
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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

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?

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

fz55

#14
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!