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
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
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");
}
@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
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
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