Modul IPCAM überarbeitet

Begonnen von Martin Fischer, 01 Februar 2013, 20:30:37

Vorheriges Thema - Nächstes Thema

marvin78

Dann müsste ich zu viel zensieren. ;) Aber folgender path funktioniert:

cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=USER&pwd=PWD

Wichtig ist snapPicture2. Das liefert ein JPEG.

Michi240281

Genau das habe ich ja auch, aber es liefert scheinbar kein JPG!!!! :(
FHEM 5.6 auf RPi2 / HM LAN Adapter / diverse HM-Devices
FHEM-Remote-App
QNAP 419P / Onkyo TX-SR 608
DM500HD / GM Spark One
Sony 52HX905

marvin78


Michi240281

Jo die Firmware und auch die Application Firmware sind auf dem neusten Stand!

Im Log steht immer folgendes:

2015.07.13 22:00:48.629 1: IPCAM Kamera_Hauseingang URI: http://192.168.188.90:88/cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=gast&pwd=test
2015.07.13 22:00:48.637 1: IPCAM Kamera_Hauseingang Snapshot: <html><body><img src="../snapPic/Snap_20150713-220101.jpg"/></body></html>
2015.07.13 22:00:48.639 1: IPCAM Kamera_Hauseingang Wrong or not supported image format: unknown
FHEM 5.6 auf RPi2 / HM LAN Adapter / diverse HM-Devices
FHEM-Remote-App
QNAP 419P / Onkyo TX-SR 608
DM500HD / GM Spark One
Sony 52HX905

HolyMoly

Ich würde an deiner stelle mal den FOSCAM support damit beglücken. Die sollen ganz ordentlich sein.
FHEM auf Raspi2 & Radxa Rock

crazystone

Zitat von: marvin78 am 13 Juli 2015, 21:10:35
Also hier läuft das Modul auch prima mit den Foscam HD-Cams (9821W V2). Ich habe jetzt den Thread nicht gelesen und weiß nicht, was dein Problem ist aber sowohl bei Instar HD Cams, als auch Foscam HD Kameras habe ich mit den Snapshots kein Problem.

Marvin, bitte verrätst du uns, welche INSTAR HD du verwendet hast? Bei mir steht auch eine Neuanschaffung an...

Vielen Dank!

marvin78

Instar habe ich wieder abgeschafft. Die Außenkam und auch zwei gleiche Austauschgeräte hatten jeweils nach einer Nacht draußen tief unter dem Dach, sehr viel Feuchtigkeit (eine Pfütze) zwischen Linse und Glas. Scheint ein generelles Problem zu sein. Ich bin auf, leider etwas teurere, Vivotek Kameras umgestiegen. Von der Qualität her nicht vergleichbar mit Foscam oder Instar. Eine andere Liga. Und sie lassen sich auch prima mit dem IPCAM Modul steuern. Nur die Fotos hole ich mir mittlerweile mit einer eigenen Sub, da IPCAM nicht Non-Blocking ist.


Jojo11

Hallo,

könntest Du diese sub evtl mal erklären? Die Blockade von fhem ist mir auch schon aufgefallen.
Meine IN-5907 ist bisher dicht und funktioniert gut.

schöne Grüße
Jo


marvin78

#53
Von der Kamera habe ich 3 Stück zurück gesendet, die alle das gleiche Problem hatten. Vielleicht eine Serie, es führt aber dazu, dass ich die Marke meide ;)

Hier sind 3 subs, die man am besten in eine eigene myUtils packt (ein Teil davon ist aber aus dem IPCAM Modul "geklaut". Dabei geht es um den Filetype):


## Kamera Bilder holen
sub getCamPicSave($;$$) {
    my ($dv,$snaps,$delay) = @_;
  my @devs=();
  if ($dv eq "all") {
         @devs=devspec2array("TYPE=IPCAM");
  }
  else {
      @devs=split(",",$dv);
  }
  foreach my $dev (@devs) {
      my $ip=InternalVal($dev,"AUTHORITY","-");
      my $auth=AttrVal($dev,"basicauth","-");
      my $path=AttrVal($dev,"path","-");
      my $storage=AttrVal($dev,"storage","-");
      my $camDevice=AttrVal($dev,"camDevice","-");
      $snaps=AttrVal($dev,"snapshots",0) unless defined($snaps);
      $delay=AttrVal($dev,"delay",2) unless defined($delay);
      if ($ip ne "-" && $path ne "-" && $storage ne "-" && $camDevice ne "-" && Value($camDevice) eq "present") {
              my $camURI="http://".$ip."/".$path;
        my $seqWait=0;
        my $seqDelay=$delay;
        my $count=0;
        for (my $i=0;$i<$snaps;$i++) {
            $count=$i+1;
          my $param = {
            url        => $camURI,
            timeout    => 7,
            storage         => $storage,
            dev        => $dev,
            count         => $count,
            callback   => \&StoreCamFile,
          };
          InternalTimer(gettimeofday()+$seqWait, "HttpUtils_NonblockingGet", $param, 0);
          $seqWait = $seqWait + $seqDelay;
        }                       
      }
      else {
          my $error="CamPic-Error(s): ";
          $error.="Device ($dev) not available. " if ($ip eq "-");
        $error.="Device ($dev) has no path attribut. " if ($path eq "-");
        $error.="Device ($dev) has no camDevice attribut. " if ($camDevice eq "-");
        $error.="Could not fetch picture. Cam-Device ($dev) not present. " if (Value($camDevice) ne "present");   
        Log 3, $error;
        fhem("setreading $dev lastError $error");
      }
  }
  return undef;
}


sub StoreCamFile($$$)
{
  my ($hash, $err, $data) = @_;
  my $dev = $hash->{dev};
  my $dev_hash=$defs{$dev};
  readingsBeginUpdate($dev_hash);
  if ($err) {
      Log 3,"CamPic-Error: Image could not be fetched";
    readingsBulkUpdate( $dev_hash, 'lastError', $err );
  }
  else {
    my @imageTypes = qw(JPEG PNG GIF TIFF BMP ICO PPM XPM XBM SVG);
    my $imageFormat = camPicGuessFileFormat(\$data);
    if( ! grep { $_ eq "$imageFormat"} @imageTypes) {
        Log 3, "CamPic-Error: Wrong File-Format";
      readingsBulkUpdate( $dev_hash, 'lastError', 'CamPic-Error: Wrong File-Format' );
    }
    else {
          my $storage = $hash->{storage};
          my $count = $hash->{count};
          my $dateTime = TimeNow();
          my $timestamp = $dateTime;
          $timestamp =~ s/ /_/g;
          $timestamp =~ s/(:|-)//g;
      $imageFormat = "JPG" if($imageFormat eq "JPEG");
          my $filename=$dev."_".$timestamp.".".lc($imageFormat);
          open(FH, ">$storage/$filename");
          print FH $data;
          close(FH);
        readingsBulkUpdate( $dev_hash, 'snapshot'.$count, $filename );
        readingsBulkUpdate( $dev_hash, 'last', $filename );
            readingsBulkUpdate( $dev_hash, 'snapshots', $count );
    }
  }
  readingsEndUpdate( $dev_hash, 1 );
}


sub camPicGuessFileFormat($) {
  my ($src) = shift;
  my $header;
  my $srcHeader;

  open(my $s, "<", $src) || return "can't open source image: $!";
  $src = $s;

  my $reading = read($src, $srcHeader, 64);
  return "error while reading source image: $!" if(!$reading);

  local($_) = $srcHeader;
  return "JPEG" if /^\xFF\xD8/;
  return "PNG"  if /^\x89PNG\x0d\x0a\x1a\x0a/;
  return "GIF"  if /^GIF8[79]a/;
  return "TIFF" if /^MM\x00\x2a/;
  return "TIFF" if /^II\x2a\x00/;
  return "BMP"  if /^BM/;
  return "ICO"  if /^\000\000\001\000/;
  return "PPM"  if /^P[1-6]/;
  return "XPM"  if /(^\/\* XPM \*\/)|(static\s+char\s+\*\w+\[\]\s*=\s*{\s*"\d+)/;
  return "XBM"  if /^(?:\/\*.*\*\/\n)?#define\s/;
  return "SVG"  if /^(<\?xml|[\012\015\t ]*<svg\b)/;
  return "unknown";
}


Hier wird auf die Konfiguration (Pfade) eines IPCAM Devices zugegriffen (DEVICENAME).

Aufgerufen wird sie per

{getCamPicSave("DEVICENAME", "ANZAHLSNAPS", "DELAY")}

Damit werden non-blocking ANZAHLSNAPS Bilder im Abstand von DELAY Sekunden geholt und die Readings im entsprechenden IPCAM-Device aktualisiert. Gibt man ANZAHLSNAPS und DELAY nicht an, wird das jeweils aus dem IPCAM Device geholt. Das ist alles nicht sehr elegant und schnell hin gebaut aber es funktioniert.

Jojo11

Das werde ich auf jeden Fall mal bei mir testen. Vielen Dank!
Was mich an der Instar stört, ist die fixe Video-Aufzeichnungsdauer. 30 oder 40 Sekunden wären hier und da manchmal besser.

schöne Grüße
Jo


Brockmann

Zitat von: marvin78 am 25 August 2015, 09:50:15
Hier sind 3 subs, die man am besten in eine eigene myUtils packt (ein Teil davon ist aber aus dem IPCAM Modul "geklaut". Dabei geht es um den Filetype):

Vielen Dank dafür!
Habe es gleich mal ausprobiert, hat aber nicht auf Anhieb geklappt. Der Grund dafür ist das Attribut camDevice, dass es so bei mir nicht gibt. Hast Du da noch irgendwie PRESENCE mit eingebunden?

Ich habe für mich die entsprechenden Abfragen rausgenommen, dann klappt es, also anstatt
if ($ip ne "-" && $path ne "-" && $storage ne "-" && $camDevice ne "-" && Value($camDevice) eq "present") {
nur
if ($ip ne "-" && $path ne "-" && $storage ne "-") {

marvin78

#56
Ah stimmt sorry. Ich habe mir noch ein userattr camDevice  in die IPCAM Devices gepackt. Dort trage ich ein emtsprechendes PRESENCE Device ein, sodass vor dem Fotos machen nachgeschaut werden kann, ob die Kamera überhaupt verfügbar ist und die Anfragen nicht ins leere laufen. Meine Innenkameras sind nämlich nur an, wenn wir weg sind oder Nachts.

Das kommt davon, wenn man den Quick and Dirty Quellcode nicht kommentiert ;)

Diese Zeile in meinem Code ist falsch:


my $camDevice=AttrVal($dev,"camDevice",0);


Es müsste lauten

my $camDevice=AttrVal($dev,"camDevice","-");

Dann klappt es auch mit komplettem Filter. Ich habe das oben geändert.

Brockmann

Zitat von: marvin78 am 25 August 2015, 14:50:18
my $camDevice=AttrVal($dev,"camDevice","-");

Dann klappt es auch mit komplettem Filter. Ich habe das oben geändert.

Aber auch dann klappt es nur, wenn man das userattr camDevice überhaupt verwendet. Ansonsten bekommt man auch eine Fehlermeldung. Halt nur eine etwas aussagekräftigere...

marvin78

Hm. Es mag sein, dass wenn es gar nicht vorhanden ist, dass es dann nicht funktioniert. AttrVal funktioniert also etwas anders, als ich dachte, das macht aber auch durchaus Sinn. Verwendet werden muss es aber nicht.

Jojo11

Hallo,

sehr seltsam, bei mir klappt der code mit einer Foscam aber bei meiner INSTAR wird ein falsches image Format als Fehler ausgegeben. Verstehe ich gerade nicht, weil das IPCAM_Modul mit dieser Kamera auch funktioniert und der code eigentlich identisch ist (zumindest die entsprechenden Zeilen). Allerdings versuche ich das gerade noch zu prüfen.

schöne Grüße
Jo