Snapshot wird erst nach beenden der Funktion aufgerufen

Begonnen von gelbwichtel, 27 Februar 2017, 10:11:53

Vorheriges Thema - Nächstes Thema

gelbwichtel

Hi,
nachdem ich mir jetzt stundenlang den Wolf gesucht habe, möchte ich euch mal um Hlfe bitten.

Szenario:
Über Telegram schicke ich einen Aufruf rein, um mir von einer Kamera einen atuellen Snapshot zu schicken. Dabei wird die Funktion myTelebotSendImage() aufgerufen.
Funktioniert auch alles. Die Crux an der Sache ist nur, dass ich nicht den aktuellen Snpshot bekomme, sondern immer den vorletzten.

minimal Codeauszug:

sub myTelebotSendImage()
{
     fhem ("get CAM1 image");
     sleep 10;                                     # nur im Test, um sicherzugehen, dass Bild vollständig gespeichert wurde
     fhem ("telebot sendImage ./www/snapshots/snapshot.jpg");
}


Es passiert jetzt folgendes:

fhem ("telebot sendImage ./www/snapshots/snapshot.jpg") schickt mir zwar einen snapshot, aber nicht den, der zuvor mit "get CAM1 image" angefordert wurde, sondern den bereits existierenden.

Ich habe sowohl in der Funktion, als auch parallel unter Linux mir mal die Dateien mit Zeitstempel aufgelistet. Dabei kann ich folgendes feststellen:
Solange die Sub durchlaufen wird, bewirkt das Kommando fhem ("get CAM1 image") überhaupt nichts. Die Zeitstempel der snapshots beleiben unverändert. Egal auch wie lange ich das sleep machen würde.
Sobald Sub beendet wurde, ist der Snapshot mit aktuellstem Timestamp da. Rechteprobleme kann ich ausschliessen.

Würde ich also statt beides in eine Funktion zu legen mit 2 Funktionsaufrufen machen

sub myTelebotGetImage()
{
     fhem ("get CAM1 image");
}

sub myTelebotSendImage()
{
     fhem ("telebot sendImage ./www/snapshots/snapshot.jpg");
}


würde der aktuellste Snapshot geschickt werden.

Klar, kann ich machen, um das Problem zu umgehen, aber ich würde hier gerne verstehen, was da schiefläuft.

Ach ja: läuft auf einem raspberryPi, aktuellster FHEM Stand

Danke mal vorab für eure Antworten.

gelbwichtel
cu
gelbwichtel

Thorsten Pferdekaemper

Hi,

ich würde mal vermuten, dass das "get CAM1 image" nur das holen des aktuellen Bilds anstößt, aber das eigentliche Speichern dann über ein "internes at" passiert. So etwas macht man manchmal, um ein Blockieren zu vermeiden. (Genau genommen sollte es gar kein get sein, sondern etwas wie "set CAM1 image get", aber das ist eine andere Diskussion.)
Damit FHEM das "verzögerte" get image wirklich ausführen kann muss es erst einmal wieder die Kontrolle erlangen. Das passiert nicht während Deine Funktion läuft. Das sleep macht es also noch schlimmer.

Mein Lösungsansatz wäre in etwa so: Vermutlich hat das Device CAM1 ein Reading, dass sich ändert, wenn die Datei gespeichert ist. Darauf kannst Du ein notify legen, welches das Bild sendet.
Falls das nicht geht, dann vielleicht so:


sub myTelebotSendImage()
{
     fhem ("get CAM1 image");
     fhem ("define blablablubbblubb at +00:00:10 telebot sendImage ./www/snapshots/snapshot.jpg");
}


Gruß,
   Thorsten
FUIP

CoolTux

Man könnte auch mit FHEM Sleep arbeiten statt mit einem blockierenden Perl Sleep


sub myTelebotSendImage()
{
     fhem ("get CAM1 image; sleep 10; telebot sendImage ./www/snapshots/snapshot.jpg");
}
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

gelbwichtel

@Thorsten Pferdekaemper && @CoolTux:
Danke euch beiden. Ich werde eure Vorschläge heute Abend mal umsetzen und mir auch das mit den Readings der Cam mal näher ansehen.
cu
gelbwichtel
cu
gelbwichtel

Thorsten Pferdekaemper

Zitat von: CoolTux am 27 Februar 2017, 12:21:18
Man könnte auch mit FHEM Sleep arbeiten statt mit einem blockierenden Perl Sleep


sub myTelebotSendImage()
{
     fhem ("get CAM1 image; sleep 10; telebot sendImage ./www/snapshots/snapshot.jpg");
}

Ja, das müsste tatsächlich dasselbe sein. Ich wollte nur nicht erklären müssen, warum das nicht dasselbe ist, wie das, was er vorher versucht hat.
Gruß,
   Thorsten
FUIP

CoolTux

Zitat von: Thorsten Pferdekaemper am 27 Februar 2017, 14:14:49
Ja, das müsste tatsächlich dasselbe sein. Ich wollte nur nicht erklären müssen, warum das nicht dasselbe ist, wie das, was er vorher versucht hat.
Gruß,
   Thorsten

Ach Du weißt ja, der Weg ist das Ziel  ;D
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net