[Gelöst] Verständnisfrage zu Abarbeitung fhem()-Kommando in pm-File

Begonnen von gelbwichtel, 13 Januar 2022, 13:31:22

Vorheriges Thema - Nächstes Thema

gelbwichtel

Hallo,
ich benutze den Telebot u.a. dazu ein Menü zu generieren und je nach Auswahl darauf über Fhem zu reagieren. Dabei ist ein Punkt, der mir explizit einen Snapshot von der IPCam auslesen soll und per Telebot zu Telegramm schicken soll. Funktioniert eigentlich auch ganz gut. Nun ist mir aufgefallen, das ggf. nicht der aktuelle, sondern ein ältere Snapshot gesendet wird. Um dahinterzusteigen, hab ich Debugcode eingebaut und sehe jetzt, dass mein Backup und Umbenennen der jpg-Files und das Warten auf den Snapshot lt. Linux soweit klappt, aber dass das fhem Kommando, das den Snapshot auslösen soll, nicht an der Stelle wo ist codiert abläuft, sondern scheinbar erst dann, wenn meine SubRoutine beendet wird.

Danke vorab
Gelbwichtel


sub myTelebotSendImage()
{
    my $dir  = AttrVal("CAM1","storage","");
my $f    = $dir."/CAM1_snapshot.jpg"; # unklar, wann ohne Nummer oder
my $f1   = $dir."/CAM1_snapshot_1.jpg"; # mit Nummer erstellt wird
my $fbak = $dir."/CAM1_snapshot.bak";
my $f1bak= $dir."/CAM1_snapshot_1.bak";
my $to   = ReadingsVal("telebot","msgPeerId","");
my $istDa= 0;

my $ls = `ls -l ./www/snapshots/`;
Log 3, "Vorher\n$ls";

`sudo test -e $fbak && sudo rm $fbak`; # Backups entfernen
`sudo test -e $f1bak && sudo rm $f1bak`;
`sudo test -e $f && sudo mv $f $fbak`;          # Backup erstellen
`sudo test -e $f1 && sudo mv $f $f1bak`; 

$ls = `ls -l ./www/snapshots/`; `ls -l`;
Log 3, "Nachher\n$ls";

fhem "get CAM1 image";        # Snapshot erstellen; wir leider nicht an dieser Stelle ausgeführt

$ls = `ls -l ./www/snapshots/`;
Log 3, "Nachher2\n$ls";

for ( my $i = 0; $i < 3; $i++ )
       {
if ( -s $f )
{
Log 3, "found $i screenshot $f";
last;
}
else
{
if ( -s $f1 )
{
Log 3, "found $i screenshot $f1";
$f = $f1;
last;
}
else
{
Log 3, "no $i screenshot found";
sleep 1;
}
}
}

if ( -s $f )
{
Log 3, "send screenshot $f";
fhem("set telebot sendImage @".$to." ".$f);
}
else
{
Log 3, "screenshot not found; nothing to do";
}
}


Das ist der relevante Auszug aus dem Logfile


2022.01.13 13:11:51 3: Vorher
total 4
drwxr-xr-x 2 root root 4096 Jan 13 07:24 save

2022.01.13 13:11:53 3: Nachher
total 4
drwxr-xr-x 2 root root 4096 Jan 13 07:24 save

2022.01.13 13:11:53 3: Nachher2
total 4
drwxr-xr-x 2 root root 4096 Jan 13 07:24 save

2022.01.13 13:11:53 3: no 0 screenshot found
2022.01.13 13:11:54 3: no 1 screenshot found
2022.01.13 13:11:55 3: no 2 screenshot found
2022.01.13 13:12:03 3: screenshot not found; nothing to do
2022.01.13 13:12:03 3: ---------------------------> create snapshot
2022.01.13 13:12:03 3: IPCAM (CAM1) - getSnapshot URI: http://user:pw@1xx.1xx.1xx.xx:80/Streaming/channels/1/picture?snapShotImageType=JPEG
2022.01.13 13:12:03 3: IPCAM (CAM1) - Snapshot Image Format: SVG
cu
gelbwichtel

Otto123

Hi,

FHEM ist in der Abarbeitung deiner SUB  :o Du schickst zwar einen Befehl, der wird ausgeführt wenn die Sub fertig ist. FHEM ist erstmal nur single threaded.

Teile das ganze in zwei subs und rufe diese getrennt auf.

Deine ganzen Aufrufe `Befehl ` sind blockierend weil Perl auf das Ergebnis wartet!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

gelbwichtel

Hi,
Danke erst einmal für deine rasche Antwort. Ich hab das versucht auf 2 Funktionen umzustellen, aber das Problem bleibt das gleiche. Ich hab irgendwie die Vermutung, das der Befehl "get Cam1 image" asynchron abgearbeitet wird. Dazu hab ich meine Funktion mal nur auf das nötigste umgestellt und den Filter mitlaufen lassen.
Daraus ist zu sehen, dass das gesendete Bild immer älter ist, als der Snapshot selbst.
Mir gehen langsam die Ideen aus.
Danke

Funktion:

sub myTelebotSendImage()
{
fhem "get CAM1 image";
fhem "set telebot sendImage www/snapshots/CAM1_snapshot.jpg";
}


Ereignisfilter:

2022-01-14 13:19:04 TelegramBot telebot sendImage www/snapshots/CAM1_snapshot.jpg
2022-01-14 13:19:10 IPCAM CAM1 last: CAM1_snapshot.jpg
2022-01-14 13:19:10 IPCAM CAM1 snapshot1: CAM1_snapshot_1.jpg
2022-01-14 13:19:10 IPCAM CAM1 snapshots: 1
cu
gelbwichtel

MadMax-FHEM

Ereignis-Filter?
Du meinst Eventmonitor?

Warum dann kein notify auf z.B.


2022-01-14 13:19:10 IPCAM CAM1 snapshot1: CAM1_snapshot_1.jpg


Und da dann das Bild schicken, dann sollte es ja da sein?!

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

#4
Die SUB ist reichlich sinnlos aber egal
Zitatsub myTelebotSendImage()
{
   fhem "get CAM1 image";                  
   fhem "set telebot sendImage www/snapshots/CAM1_snapshot.jpg";   
}
Du verstehst meinen Einwand nicht!

FHEM ruft Deine SUB auf myTelebotSendImage
Deine SUB sagt fhem "get CAM1 image" FHEM ist aber mit Deiner SUB beschäftigt.
Deine SUB sagt fhem "set telebot sendImage www/snapshots/CAM1_snapshot.jpg" FHEM ist aber mit Deiner SUB beschäftigt.
jetzt ist Dein SUB fertig.
FHEM macht get CAM1 image. das dauert ein paar Momente das CAM1 Modul läuft asynchron (richtig vermutet)
FHEM macht set telebot sendImage www/snapshots/CAM1_snapshot.jpg aber CAM1 hat noch nicht geliefert.

Also mach ohne sub in FHEM (ungetestet auf Joachims Vorschlag aufbauend):
get CAM1 image ; sleep CAM1:snapshot1:.* ; set telebot sendImage www/snapshots/CAM1_snapshot.jpg
von mir aus in einer sub :)
sub myTelebotSendImage()
{
fhem "get CAM1 image ; sleep CAM1:snapshot1:.* ; set telebot sendImage www/snapshots/CAM1_snapshot.jpg";
}


Vielleicht braucht es auch noch einen "Mückenschiss" dann mach noch ein sleep 1; vor set telebot  ;D
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

gelbwichtel

Danke ihr beiden.
Ich denke, es hat jetzt Klick gemacht.
Werde das heute Abend mal ausprobieren.
Schönes Wochenende.
cu
gelbwichtel

gelbwichtel

So,
getestet und funzt.
Nochmal herzlichen Dank für eure Unterstützung. Ich schließe dann auch gleich den Thread.
cu
Gelbwichtel
cu
gelbwichtel