Use of uninitialized value in read at ./FHEM/49_IPCAM.pm line 452.

Begonnen von mkress, 14 August 2014, 15:51:53

Vorheriges Thema - Nächstes Thema

siggi85

Meine IP Cam liegt seit dem eher rum. :P
Aber eine Lösung wäre natürlich schön, gerade weil der Bildaufruf ja funktioniert über Browser. Schwer zu verstehen, dass es über Perl nicht möglich sein soll. ;)

betateilchen


Die Variable $camURI sieht bei mir gut aus:
Code: [Auswählen]
http://USER:PASS@192.168.50.70/snapshot.cgi


Was bekommst Du denn zurück, wenn Du per wget diese URL aufrufst?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

siggi85

Zitat von: betateilchen am 05 Dezember 2014, 13:16:59

Die Variable $camURI sieht bei mir gut aus:
Code: [Auswählen]
http://USER:PASS@192.168.50.70/snapshot.cgi


Was bekommst Du denn zurück, wenn Du per wget diese URL aufrufst?

Das werde ich heute nachmittag testen wenn ich zu Hause bin und melde mich dann wieder.

siggi85

Anscheinend funktioniert die Authorisierung nicht vernünftig.


root@homeserver:~# wget -S http://admin:123456@192.168.50.70/snapshot.cgi
--2014-12-05 15:48:54--  http://admin:*password*@192.168.50.70/snapshot.cgi
Verbindungsaufbau zu 192.168.50.70:80... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort...
  HTTP/1.1 401 Unauthorized
  Server: GoAhead-Webs
  Date: Fri Dec  5 14:48:54 2014
  WWW-Authenticate: Digest realm="GoAhead", domain="",qop="auth", nonce="d703861747b3422efb854261f55a21c4", opaque="5ccc069c403ebaf9f0171e9517f40e41",algorithm="MD5", stale="FALSE"
  Pragma: no-cache
  Cache-Control: no-cache
  Content-Type: text/html
Fehler beim Schreiben der HTTP-Anforderung: Ungültiger Dateideskriptor.
Erneuter Versuch.


Auch ein manuelles angeben per Option funktioniert nicht.

wget --user=admin --password=123456 http://192.168.50.70/snapshot.cgi

Hast du ne Idee?

peterk_de

#19
siggi, also das is bei der cam "normal". Du musst die Authentifizierung da definitiv an die URL anhängen, HTTP-Auth kann die nicht. Und dann geht das auch per WGet:


[root@cubie:/home/peterk]# wget -S "http://192.168.178.23/snapshot.cgi?user=admin&pwd=123456"
--2014-12-05 16:45:00--  http://192.168.178.23/snapshot.cgi?user=admin&pwd=123456
Connecting to 192.168.178.23:80... connected.
HTTP request sent, awaiting response...
  HTTP/1.1 200 OK
  Server: GoaHead
  Tue, 12 Jun 2012 01:56:34 GMT
  Content-Type:image/jpeg
  Content-Length:4760
  Connection: close
Length: 4760 (4.6K) [image/jpeg]
Saving to: `snapshot.cgi?user=admin&pwd=123456.4'

100%[====================================================================================================================================================================================================>] 4,760       --.-K/s   in 0s

2014-12-05 16:45:00 (51.5 MB/s) - `snapshot.cgi?user=admin&pwd=123456.4' saved [4760/4760]


Geht auch im Browser und sonstewo, nur per IPCAM-Modul leider nicht ... hab schon viel gesucht und versucht. irgendwo hab ich mal den tipp gelesen, den GetFileFromURLQuiet()-Call durch einen get()-call aus dem Paket LWP::Simple zu ersetzen, das lässt aber mein FHEM sofort kommentarlos sterben (obwohl das Paket per cpan installiert ist) ...

Danke auch für den Tipp mit dem Workaround, ist aber bei der Cam nicht drin - die kann nur dauerhaft oder per Alarm-Eingang getriggert Bilder irgendwo per FTP hinschieben, Bewegungserkennung hat die nicht. Und da noch nen Funkschaltaktor dranzuhängen würde ihren Wert verdoppeln ;-) - kann sie doch, werde ich erstmal so machen :-)
Ich würd mir aber auch nur ungern ne teurere in den Keller hängen, sonst ist die beim nächsten Einbruch gleich mit weg :-D

Edit: nochmal mit wget -S ausgeführt
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

peterk_de

Könnte das Problem vielleicht der falsche Zeitstempel sein, den der Webserver in der Cam mitschickt? Die Uhr in der Kamera ist richtig eingestellt (im Webinterface steht die korrekte Zeit, NTP ist eingetragen), aber das was als Antwort auf das wget kommt (oben im Posting)  liegt mehrere Jahre daneben ...
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

siggi85

#21
Zitat von: peterk_de am 05 Dezember 2014, 16:49:42
Könnte das Problem vielleicht der falsche Zeitstempel sein, den der Webserver in der Cam mitschickt? Die Uhr in der Kamera ist richtig eingestellt (im Webinterface steht die korrekte Zeit, NTP ist eingetragen), aber das was als Antwort auf das wget kommt (oben im Posting)  liegt mehrere Jahre daneben ...

Die Zeit im wget liegt genau eine Stunde zurück. Die Zeit wird durch NTP aktuell gehalten und auf dem Webinterface korrekt angezeigt. Keine Ahnung, warum der HTTP Request was anderes ausspuckt, da habe ich mich auch schon gewundert.

Zitat von: peterk_de am 05 Dezember 2014, 16:42:18
siggi, also das is bei der cam "normal". Du musst die Authentifizierung da definitiv an die URL anhängen, HTTP-Auth kann die nicht. Und dann geht das auch per WGet:

In Firefox funktioniert der Link in der Syntax:
http://USER:PASS@192.168.50.70/snapshot.cgi
Das ist die gleiche Syntax die die Variable $camURI im Modul benutzt. Es funktioniert tatsächlich, wenn ich user und pass als CGI Parameter übergebe. Dass die "falsche" Syntax in Firefox funktioniert verwirrt natürlich etwas. Wahrscheinlich nimmer der Browser einem hier etwas Denkarbeit ab und korrigiert den Aufruf?!

Liegt hier der Hase im Pfeffer begraben? Ich glaube irgendwie nicht, dass die Lösung so einfach ist. :P Wenn doch, dann müsste man im Modul eine Art Authentifizierungsattribut haben. http-auth oder cgi-params. Je nachdem wird dann die Variable $camURI in einer anderen Syntax gespeichert und genutzt.

EDIT: Nicht dass es sowas schon gibt... *erst mal schnell commandref durchles*
EDIT2: Dafür ist anscheinend das Path Attribut da. Ich bin der Meinung ich hatte das damals bereits probiert und das hat auch nicht zum Erfolg geführt, genauso wie eben.

siggi85

Habe noch mal kurz vor dem Snapshot ein Log eingebaut. Mit meinem neuen Path Attribut und ohne basic auth Attribut (keine Ahnung ob das auch eine Auswirkung hatte), sieht die Variable folgendermaßen aus:
2014.12.05 18:29:47 1: Variable camURI: http://192.168.50.70/snapshot.cgi?user=admin&pwd=123456
2014.12.05 18:29:47 1: IPCAM myipcam Wrong or not supported image format: error while reading source image:


Die Variable schaut jetzt also korrekt aus. Der Fehler bleibt trotzdem der gleiche.
Ein wget allerdings funktioniert, die runtergeladene Datei ist ein Bild. Nur der Aufruf "GetFileFromURLQuiet($camURI);" will irgendwie nicht.
wget "http://192.168.50.70/snapshot.cgi?user=admin&pwd=123456"

Müsste ein wget im Modul anstelle der GetFileFromURLQuiet() Routine nicht funktionieren? (ggf. muss die über wget runtergeladene Datei dann noch umbenannt werden)
Also ggf. einstellbar über ein Attribut oder eine Bedingung --> falls "GetFileFromURLQuiet()" ein "myipcam_snapshot.error while reading source image:" Fehler zurück gibt, dann halt wget durchführen?!?

peterk_de

Zitat von: siggi85 am 05 Dezember 2014, 18:41:54
2014.12.05 18:29:47 1: Variable camURI: http://192.168.50.70/snapshot.cgi?user=admin&pwd=123456
2014.12.05 18:29:47 1: IPCAM myipcam Wrong or not supported image format: error while reading source image:

Die Variable schaut jetzt also korrekt aus. Der Fehler bleibt trotzdem der gleiche.
Ein wget allerdings funktioniert, die runtergeladene Datei ist ein Bild. Nur der Aufruf "GetFileFromURLQuiet($camURI);" will irgendwie nicht.

Jupp, genau das meinte ich - bei mir exakt dieselbe Beobachtung; nun sind wir also wohl schon 3 ;-) wget über einen System-Call da einzubauen würde vermutlich gehen, ist aber reichlich unschön, das müsste schon mit Perl-Mitteln geschehen. Hast du schonmal die Methode per LWP::Simple --> get($camURI); probiert? Klappt bei mir allerdings auch nicht und ist ähnlich schwer zu debuggen, da FHEM kommentarlos zu geht.
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

siggi85

Zitat von: peterk_de am 05 Dezember 2014, 20:05:25
Hast du schonmal die Methode per LWP::Simple --> get($camURI); probiert? Klappt bei mir allerdings auch nicht und ist ähnlich schwer zu debuggen, da FHEM kommentarlos zu geht.

Ne habe ich noch nicht probiert. Werde ich demnächst mal machen, aber da es bei dir auch nicht funktioniert hat, habe ich keine große Hoffnung. ;-)

siggi85

Besser spät als nie.  :P

Also auf der Bash kann ich über folgenden Befehl ein Bild extrahieren. Ich weiß leider nicht genau, wie ich das nun ins IPCAM Modul bauen kann, aber es sieht so aus, als wenn man es mit LWP::Simple extrahieren kann.

perl -MLWP::Simple -e 'getprint "http://192.168.50.70/snapshot.cgi?user=admin&pwd=123456"' >test.jpg

siggi85

Gibt es hierzu weiterhin keine Lösung?
Wie bereits beschrieben, ist es möglich über Perl ein Bild auch von "unseren problematischen" IP Cams zu ziehen. Allerdings müsste das noch irgendwie ins Modul eingebaut werden. Ggf. mit einer Art "Kompatibilitätsmodus" welchen man über ein Attribut im IPCAM Modul steuern kann.

Wer ist denn der Maintainer vom IPCAM Modul. Oder noch besser, wie finde ich das selber raus? ;) Habe mein FHEM gerade nicht griffbereit.

peterk_de

Ich hab das jetzt erstmal außerhalb von FHEM mit einem System-Call gelöst. Die folgende Funktion kommt in die 99_myUtils.pm, nimmt curl (das installiert sein muss - sudo apt-get install curl) und man kann der Funktion eine Dauer in Sekunden übergeben, solange wird dann ein Videoclip aufgezeichnet ... Von daher ist ein korrigiertes IP-Cam modul für mich erstmal nicht mehr so interessant ;-(


sub record_webcam_flur($) {
    my ($duration_sec) = @_;
    my ($csec,$cmin,$chour,$cmday,$cmon,$cyear,$cwday,$cyday,$cisdst) = localtime();

    my $filename = sprintf("%04d-%02d-%02d %02d-%02d-%02d Flur.mpg",$cyear+1900,$cmon+1,$cmday,$chour,$cmin,$csec);

    my $ret = system("curl --max-time $duration_sec -s -o \"/var/webcam/$filename\" \"http://192.168.178.23/videostream.cgi?loginuse=admin&loginpas=passworthiereinsetzen\" &");
    $ret =~ s,[\r\n]*,,g;
    Log 3, "Aufzeichnung Kamera Flur für $duration_sec s in Datei $filename gestartet - Rückgabe $ret";
}
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

Patrik.S

Wie grade im Thread zum IPCam Modul https://forum.fhem.de/index.php/topic,10772.msg558326.html#msg558326 von mir geschrieben, habe ich diesen Fehler bei mir durch eine simple Timeout Erhöhung beheben können. Fhem wartet nicht lange genug, bis die IP-/Web-Cam das Bild liefert.

In der fhem/FHEM/49_IPCAM.pm in der Zeile 380 den Aufruf von
$snapshot = GetFileFromURLQuiet($camURI);
ändern auf 10 Sekunden
$snapshot = GetFileFromURLQuiet($camURI, 10, "", 1, 5);

Das Fhem Wiki gibt Auskunft zu der Operation GetFileFromURLQuiet()
https://wiki.fhem.de/wiki/HttpUtils#GetFileFromURLQuiet



heikoh81

Hallo Patrik,

Zitat von: Patrik.S am 10 Januar 2017, 22:41:26
habe ich diesen Fehler bei mir durch eine simple Timeout Erhöhung beheben können. Fhem wartet nicht lange genug, bis die IP-/Web-Cam das Bild liefert.

In der fhem/FHEM/49_IPCAM.pm in der Zeile 380 den Aufruf von
$snapshot = GetFileFromURLQuiet($camURI);
ändern auf 10 Sekunden
$snapshot = GetFileFromURLQuiet($camURI, 10, "", 1, 5);

Tausend Dank für diesen Hotfix!!!!
Seit 2,5 Jahren (!!!) "lebe" ich mit diesem Problem, v.a. bei Raspberry No-Ir Außen-Kameras, die mein Gebäude bei völliger Dunkelheit mit "Langzeitbelichtung" fotografieren und ziemlich viel aus dem Restlicht rausholen. Da hatte ich oft, aber nicht immer, das WRONG IMAGE FORMAT.
Jetzt funktioniert es.

Viele Grüße,
Heiko