Modul IPCAM überarbeitet

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

Vorheriges Thema - Nächstes Thema

speex

Ja es ist das Problem der HTML Seite die durch das CGI erzeugt wird allerdings finde ich im Backend meiner Cam keine möglichkeit das anzufassen ich kann praktisch nur die Qualität für das jpeg bestimmen weitere Einstellungen werden dort nicht geboten.

Auf der HTML Seite ist das Bild in einem IMG Tag eingebunden mit folgender src:
http://<ip>/image/jpeg.cgi

Gibt es dafür noch eine Alternative, ich habe probiert den Code mit dem normalen IPCam modul zu vergleichen aber das ist gerade noch eine Nummer zu hoch für mich mit der Hoffnung der Sache weiter auf die Spur zu kommen da ich mit einem get IPCam image ein Bild bekomme.

Frage mich halt was dort an der Stelle unterschiedlich läuft...

marvin78

#91
Ich habe ja geschrieben, dass meine subs nicht überall funktionieren werden. Man müsste schauen, was GetFileFromURLQuiet und darin HttpUtils_BlockingGet anders macht, als die NonBlocking Variante.

speex

#92
Ich habe mir die Subs angesehen allerdings wie bereits erwähnt ist das momentan noch eine Nummer zu hoch, ich habe probiert die subs im HTTPUtils zu verändern mit dem Resultat das FHEM nach einem Neustart nicht mehr durchstartet. Da lass ich also erstmal lieber noch die finger von. :)

sub
HttpUtils_NonblockingGet($)
{
  my ($hash) = @_;
  $hash->{hu_blocking} = 0;
  my ($isFile, $fErr, $fContent) = HttpUtils_File($hash);
  return $hash->{callback}($hash, $fErr, $fContent) if($isFile);
  my $err = HttpUtils_Connect($hash);
  $hash->{callback}($hash, $err, "") if($err);
}

#################
# Parameters same as HttpUtils_NonblockingGet up to callback
# Returns (err,data)
sub
HttpUtils_BlockingGet($)
{
  my ($hash) = @_;
  $hash->{hu_blocking} = 1;
  my ($isFile, $fErr, $fContent) = HttpUtils_File($hash);
  return ($fErr, $fContent) if($isFile);
  my $err = HttpUtils_Connect($hash);
  return ($err, undef) if($err);
 
  my ($buf, $ret) = ("", "");
  $hash->{conn}->timeout($hash->{timeout});
  for(;;) {
    my ($rout, $rin) = ('', '');
    vec($rin, $hash->{conn}->fileno(), 1) = 1;
    my $nfound = select($rout=$rin, undef, undef, $hash->{timeout});
    if($nfound <= 0) {
      undef $hash->{conn};
      return ("$hash->{displayurl}: Select timeout/error: $!", undef);
    }

    my $len = sysread($hash->{conn},$buf,65536);
    last if(!defined($len) || $len <= 0);
    $ret .= $buf;
    last if(HttpUtils_DataComplete($ret));
  }
  return HttpUtils_ParseAnswer($hash, $ret);
}


Meine Fähigkeiten sind hier momentan noch begrenzt, aber was mir auffällt das sich die sub`s ab den returns jeweils unterscheiden und die nonblocking sub natürlich viel kürzer ist, jedoch erschliessen sich mir die funktionalen unterschiede nicht da ich es einfach nicht verstehe was da passiert. :)

Mexx_007

Hi

habe eine Wansview NCB 545W IP cam , habe sie auch ins Fhem eingebunden bekomme auch ein Live Bild .... kann mir jemand sage wie ich die Steuerung der Cam realisieren kann.
hab was gelesen das man die cgi befehle braucht , leider finde ich im Netz keine bzw. Was von einer anderen Cam selber Marke

cgi in camera file                  cgi used in webui

backup_params.cgi
   
camera_control.cgi                       camera_control.cgi
check_user2.cgi    
check_user.cgi                      check_user.cgi
comm_write.cgi    
decoder_control.cgi                     decoder_control.cgi
erase_allparams.cgi    
get_camera_params.cgi            get_camera_params.cgi
get_factory_ddns.cgi    
get_forbidden.cgi    
get_log.cgi                           get_log.cgi
get_misc.cgi                          get_misc.cgi
get_p2p.cgi    
get_params.cgi                 get_params.cgi
get_realip.cgi                          get_realip.cgi
get_smarteye.cgi                  get_smarteye.cgi
get_status.cgi                           get_status.cgi
get_wifi_scan_result.cgi               get_wifi_scan_result.cgi
reboot.cgi                                 reboot.cgi
restore_factory.cgi                                 restore_factory.cgi
restore_factory_ddns.cgi    
restore_params.cgi    
set_alarm.cgi    
set_alias.cgi    
set_datetime.cgi                          set_datetime.cgi
set_ddns.cgi                                  set_ddns.cgi
set_decoder.cgi                             set_decoder.cgi
set_devices.cgi                            set_devices.cgi
set_factory_ddns.cgi    
set_forbidden.cgi    
set_ftp.cgi                                     set_ftp.cgi
set_mac.cgi    
set_mail.cgi                                     set_mail.cgi
set_misc.cgi                                       set_misc.cgi
set_msn.cgi    
set_network.cgi                               set_network.cgi
set_p2p.cgi    
set_pppoe.cgi                                            set_pppoe.cgi
set_smarteye.cgi                                 set_smarteye.cgi
set_smarteye_factory_params.cgi          set_smarteye_factory_params.cgi
set_upnp.cgi                                          set_upnp.cgi
set_users.cgi                                          set_users.cgi
set_wifi.cgi                                          set_wifi.cgi
snapshot.cgi                                          snapshot.cgi
test_ftp.cgi                                         test_ftp.cgi
test_mail.cgi                                         test_mail.cgi
upgrade_firmware.cgi                       upgrade_firmware.cgi
upgrade_htmls.cgi                               upgrade_htmls.cgi
video.cgi    
videostream.cgi                               videostream.cgi
wifi_scan.cgi                                       wifi_scan.cgi


kann mir jemand weiter Helfen

Danke ;-)

gruß

Andy

nhetzke

Hallo @All,

ich habe da ein Problem beim holen der Bilder mittels
get <Dev> image
Ich habe zwei IP-WLAN Cams. Die Konfig sieht so aus:
Cam1:

define IPCamTreppenhaus IPCAM 192.168.0.158:81
attr IPCamTreppenhaus delay 0
attr IPCamTreppenhaus event-on-update-reading snapshots
attr IPCamTreppenhaus path snapshot.cgi?loginuse=admin&loginpas=&user=admin&pwd=&
attr IPCamTreppenhaus snapshots 10
attr IPCamTreppenhaus storage /opt/fhem/IPCom
attr IPCamTreppenhaus timestamp 1


Cam2:

define IPCamKueche IPCAM 192.168.0.100:8080
attr IPCamKueche delay 0
attr IPCamKueche event-on-update-reading snapshots
attr IPCamKueche path shot.jpg
attr IPCamKueche snapshots 10
attr IPCamKueche storage /opt/fhem/IPCom
attr IPCamKueche timestamp 1


Die Cams sollen nun bei einem Notify quasi parallel die eingestellten 10 Bilder holen. Das Resultat ist aber das es in Summe nicht 20 Bilder sind. Die Anzahl variiert hier bei. Es sind auch nicht immer gleich viele pro Kamera.
Die Antwortzeiten je Kamera, getestet mittels wget liegen unter 1s.
Entwickler, Projekt und Qualitätsmanager
RasPi1b & FHEM & HM-CFG-USB

marty29ak

Hallo,
ich habe mir an der Haustüre eine günstige Wansview NCM628D02 Kamera installiert.
Im Flur ist ein All in One PC (MSI Wind Top AE1900) mit Windows 7 Home Premium an der Wand.
Die Verbindung zum Lan läuft über die interne Wlankarte.
Als Browser nutze ich Chrome im Kiosk Modus.

Soweit funktioniert alles perfekt bis auf den Umstand das die Kamera nach einer gewissen Zeit nur noch ein Standbild anzeigt. Ich muss dann erst die Webseite neu laden, dann geht es wieder für eine gewisse Zeit.
Das ist natürlich blöd wenn man mal im vorbei gehen, oder wenn es klingelt, kurz drauf schauen möchte.
Energiespareinstellungen für das Wlan sind alle aus und die Icons für Schalter, Licht und Fensterkontakte werden auch weiterhin zuverlässig aktualisiert. Nur eben die Kamera nicht.
Lediglich die Festplatte und der Bildschirm wird nach 15Min abgeschaltet.
Ich vermute ja das der Fehler in den Einstellungen von Windows liegt, finde aber keinen Ansatz dazu. Evtl. das abschalten von Bildschirm? Den möchte ich aber aus Stromspargründen ungern durchlaufen lassen.
Alternativ wäre eine Notfall Lösung wenn man auf das Kamerabild oder einen Button darunter klicken könnte um nur die Kamera auf die schnelle zu aktualisieren. Wäre sowas denn möglich?

DEF iframe http://192.168.178.38/cgi-bin/hi3510/mjpegstream.cgi?-chn=12&-usr=admin&-pwd=xxxxxxx
LINK          http://192.168.178.38/cgi-bin/hi3510/mjpegstream.cgi?-chn=12&-usr=admin&-pwd=passat35
NAME        IP_Camera_Anzeige
NR            133
STATE       initialized
TYPE         weblink
WLTYPE    iframe

Attributes
fp_Erdgeschoss          10,1050,0,
fp_Obergeschoss        10,1050,0,
fp_Terminal                3,730,1,
htmlattr                      width="640" height="360"
room                           I_Kamera



Gruß Martin

frank

ZitatIch vermute ja das der Fehler in den Einstellungen von Windows liegt, finde aber keinen Ansatz dazu. Evtl. das abschalten von Bildschirm? Den möchte ich aber aus Stromspargründen ungern durchlaufen lassen.
zum testen würde ich den bidschirm mal laufen lassen.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

marty29ak

Danke, habe den Fehler evtl. gefunden. Der Mini PCI Anschluss hat nochmal eine eigene Energieeinstellung, nachdem ich diese auch abgeschaltet habe scheint es (bis jetzt) zu funktionieren.
Gruß Martin

Tompsg

Ich versuche hier nochmal eine Lösung für das Problem "Wrong or not supported image format: unknown" zusammen zu fassen und hoffe, dass es Verzweifelten hilft  :)

Zunächst gilt es festzustellen, ob das Problem mit der hier beschriebenen Lösung umgangen werden kann. Da das Modul 49_IPCAM hierfür keine Debug-Option hat, muss es von Hand erweitert werden. Dies wurde weiter oben im Thread bereits angeregt.

Also im fhem/FHEM-Verzeichnis die Datei 49_IPCAM.pm öffnen und folgende Stelle suchen (Zeile 380)


...
  $timestamp =~ s/(:|-)//g;

  $snapshot = GetFileFromURLQuiet($camURI);

  $imageFormat = IPCAM_guessFileFormat(\$snapshot);

  my @imageTypes = qw(JPEG PNG GIF TIFF BMP ICO PPM XPM XBM SVG);
...


Dort die beiden beiden Debug-Ausgaben einfügen:


...
  $timestamp =~ s/(:|-)//g;

  $snapshot = GetFileFromURLQuiet($camURI);
  Log 1, "IPCAM $name URI: $camURI";
  Log 1, "IPCAM $name Snapshot: $snapshot";

  $imageFormat = IPCAM_guessFileFormat(\$snapshot);

  my @imageTypes = qw(JPEG PNG GIF TIFF BMP ICO PPM XPM XBM SVG);
...


Jetzt in FHEM ein "reload 49_IPCAM" eingeben und mit "get camname image" einen neuen snapshot anfordern. Im Log findet Ihr nun die Ausgaben, die wir benötigen. Interessant ist die zweite Zeile, den hier erwartet das Modul eigentlich das Kamerabild. Steht hier ein solcher oder ähnlicher Text, dann findet Ihr weiter unten eine Lösung dazu. Ansonsten die beiden oben eingefügten Zeilen wieder entfernen, da der Bildinhalt im Log nicht schön ist.


2015.07.13 22:00:48.629 1: IPCAM Kamera1 URI: http://192.168.1.1:88/cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=guest&pwd=guest
2015.07.13 22:00:48.637 1: IPCAM Kamera1 Snapshot: <html><body><img src="../snapPic/Snap_20150713-220101.jpg"/></body></html>
2015.07.13 22:00:48.639 1: IPCAM Kamera1 Wrong or not supported image format: unknown


Die Lösung ist nun den Link anzupassen und erneut an die Funktion GetFileFromURLQuiet zu senden. Dazu schneiden wir den relevanten Teil aus dem String heraus, indem wir Startpunkt und die Länge ermitteln.


          1         2
01234567890123456789012345
<html><body><img src="../snapPic/Snap_20150713-220101.jpg"/></body></html>
                                  1         2         3
                         12345678901234567890123456789012



Hier also ab Position 25 mit einer Länge von 32 Zeichen. Nun erweitern wir die 49_IPCAM.pm um folgende Kommandos.


...
  $timestamp =~ s/(:|-)//g;

  $snapshot = GetFileFromURLQuiet($camURI);
  Log 1, "IPCAM $name URI: $camURI";
  Log 1, "IPCAM $name Snapshot: $snapshot";

  $snapshot="http://$camAuth/".substr($snapshot,25,32);
  Log 1, "IPCAM $name SnapshotNeu: $snapshot";

  $snapshot = GetFileFromURLQuiet($snapshot);

  $imageFormat = IPCAM_guessFileFormat(\$snapshot);

  my @imageTypes = qw(JPEG PNG GIF TIFF BMP ICO PPM XPM XBM SVG);
...


Nun wieder reload und get image und dann solltet ihr in der Debug-Ausgabe eine korrekt formatiere URL sehen. Damit sollte das Modul jetzt arbeiten können. Der Nachteil ist, dass nun unterschiedliche Kameras nicht mehr laufen. Daher wäre es prima die Funktion als Option im Modul einzubauen.

Viele Grüße,
Thomas

coh3r3nt

Hallo zusammen,

bie mir läuft die Edimax IC-3115W mit dem Modul.


define IC3115W IPCAM 192.x.x.x
attr IC3115W basicauth user:geheim
attr IC3115W path snapshot.jpg


Wer eine andere Edimax-Cam hat, kann sich den paramter für path hier raussuchen: https://www.ispyconnect.com/man.aspx?n=Edimax raussuchen.

Ich hätte auch noch einen Wunsch für das Modul. Könnte man als Kommando auch das Bild (get IC3115W image) machen lassen, zB.:

attr IC3115W webCmd image


So könnte man im Frontend das speichern eines Bildes antriggern durch klick auf das webCmd.

greets,
coh3r3nt
Fhem auf RPi 2 unter Raspbian
Busware SCC, JeeLink, HomeMatic und Intertechno-Sensoren, FB7362SL

Calle78

docb ich hatte das gleiche Problem. Mit

attr Cam1 pathPanTilt decoder_control.cgi?
ging es auch mit der Instar 3010 und 3011

hier meine ganze Definition:

define Cam1 IPCAM IP:PORT
attr Cam1 basicauth user:pass
attr Cam1 cmdPanLeft command=4
attr Cam1 cmdPanRight command=6
attr Cam1 cmdPos01 command=31
attr Cam1 cmdPos02 command=33
attr Cam1 cmdPos03 command=35
attr Cam1 cmdPos04 command=37
attr Cam1 cmdPos05 command=39
attr Cam1 cmdPos06 command=41
attr Cam1 cmdStep onstep
attr Cam1 cmdTiltDown command=2
attr Cam1 cmdTiltUp command=0
attr Cam1 pathPanTilt decoder_control.cgi?
attr Cam1 delay 0
attr Cam1 group Kamera
attr Cam1 icon it_camera
attr Cam1 path snapshot.cgi
attr Cam1 room Security
attr Cam1 snapshots 1
attr Cam1 storage /opt/fhem/www/snapshots/cam1
6,RPi4,Buster,HMLAN,HMIP,HUE,ZigBee,piVCCU,C868,C433,JEELINK,ESA2000,IRT1500,HMSECSC2,HMCCTC,HMSECSD,HM132030,HMSCI3FM,HMPB2WM55-2,FHT80,FBAHA,WithingsWS50,Jalousien,Siri,HMS100WD,Fritzbox,Harmony,Twilight,Weather,PushBullet,FHT-9998,HM-CC-TC,Trackr,RolloPort

Todo:ZWave(MieleOfen),LEDWIFI

franky08

#101
Hallo, mich würde interessieren wie ihr euch die snapshot's (hier als jpg) anzeigen lasst? Direkt in der fhem GUI mittels weblink oder wie macht ihr das?

P.S. ein
weblink image /opt/snapshot/ipcam_snapshot.jpg

Internals:
   DEF        image /opt/snapshot/ipcam_snapshot.jpg
   LINK       /opt/snapshot/ipcam_snapshot.jpg
   NAME       Bilder
   NR         2009
   STATE      initialized
   TYPE       weblink
   WLTYPE     image
Attributes:
   DbLogExclude .*
   htmlattr   width="720" height="480"
   room       Flur


funktioniert leider nicht obwohl unter /opt/snapshot die Bilder zu finden sind und Benutzer/Gruppe von /opt/snapshot fhem.dialout ist und Schreib-Lesezugriff besteht

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

marvin78

#102
Dein Pfad stimmt auch? Was genau funktioniert nicht? Gibt es Fehler? Ich würde die snapshots relativ zum fhem Pfad speichern.

Ich mache sowas (um es dynamisch zu halten):

sub last_pics($;$$$)
{
my ($cam,$w,$c) = @_;
my $c=6 if (!defined($c));
my $w=450 if (!defined($w));
my ($s, $i, $j, $o);
$s="<tr><td>";
for ($i=1; $i<=$c; $i++)
{
    $o=$i-1;
    $j  = $i."p";
    $s .="  <script>
    \$(function() {
      \$( '#pic_".$j."_dialog' ).dialog({
          autoOpen: false,
          closeOnEscape: true,
          width: 820,
       });
      \$( '#pic_".$j."_link' ).click(function() {
        \$( '#pic_".$j."_dialog' ).dialog( 'open' );
        return false;
      });
    });
    </script>";
    if ($o % 2==0) {$s .= "</td></tr><tr><td>";}
    elsif ($o!=0) {$s .= "</td><td>";}
    $s .="<a id='pic_".$j."_link' href='#'><img src='/fhem/";
    $s .= qx(ls -1t ./www/snapshots/$cam/* | sed -n $j);
    $s .= "' width='$w' /></a>";
    $s .= "<div id='pic_".$j."_dialog' title='Pic'><img src='/fhem/";
    $s .= qx(ls -1t ./www/snapshots/$cam/* | sed -n $j);
    $s .= "' width='800' /></div>";
}
$s.= "</td></tr>";
$s = "<table>".$s."</table>";
return $s;
}


Das ganze aus dem Weblink (htmlCode) mit dem IPCAM-Devicenamen als Parameter (+ möglicherweise Anzahl der letzten Fortos und Breite) aufrufen und man hat eine kleine Galerie.

franky08

#103
@marvin78
Habe es über HTTPSRV gelöst, funktioniert top. Zugriff dann über weblink image ...

https://forum.fhem.de/index.php/topic,54819.0.html

Zitataufrufen und man hat eine kleine Galerie.
gefällt mir  :)

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

franky08

#104
Irgendwie bekomme ich die Foscam FI8918W nicht dazu gespeicherte Positionen anzufahren. Habe mir auf der Foscam Seite mal die cgi Befehle zu Gemüte geführt und damit müsste es eigentlich funktionieren.

Hier mal ein list:
Internals:
   AUTHORITY  192.168.2.64:88
   DEF        192.168.2.64:88
   NAME       ipcam
   NR         2008
   SEQ        0
   STATE      last: 2016-06-27 18:41:46
   TYPE       IPCAM
   Readings:
     2016-06-27 18:41:46   last            ipcam_snapshot.jpg
     2016-06-27 18:41:38   snapshot1       ipcam_snapshot_1.jpg
     2016-06-27 18:41:39   snapshot2       ipcam_snapshot_2.jpg
     2016-06-27 18:41:40   snapshot3       ipcam_snapshot_3.jpg
     2016-06-27 18:41:41   snapshot4       ipcam_snapshot_4.jpg
     2016-06-27 18:41:42   snapshot5       ipcam_snapshot_5.jpg
     2016-06-27 18:41:43   snapshot6       ipcam_snapshot_6.jpg
     2016-06-27 18:41:44   snapshot7       ipcam_snapshot_7.jpg
     2016-06-27 18:41:45   snapshot8       ipcam_snapshot_8.jpg
     2016-06-27 18:41:46   snapshot9       ipcam_snapshot_9.jpg
     2016-06-27 18:41:46   snapshots       9
Attributes:
   DbLogExclude .*
   cmdPos01   command=39&user=xxxxxx&pwd=xxxxxxxx
   cmdPos02   command=41&user=xxxxxx&pwd=xxxxxxxx
   delay      1
   path       cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=xxxxxxx&pwd=xxxxxxxx 
   pathPanTilt decoder_control.cgi?
   room       Flur,Kamera
   snapshots  9
   storage    ./www


oder müsste in pathPanTilt der komplette Pfad?

Das funktioniert leider auch nicht:

Internals:
   AUTHORITY  192.168.2.64:88
   DEF        192.168.2.64:88
   NAME       ipcam
   NR         2008
   SEQ        0
   STATE      Defined
   TYPE       IPCAM
   Readings:
     2016-06-28 08:29:14   last            ipcam_snapshot.jpg
     2016-06-28 08:29:06   snapshot1       ipcam_snapshot_1.jpg
     2016-06-28 08:29:07   snapshot2       ipcam_snapshot_2.jpg
     2016-06-28 08:29:08   snapshot3       ipcam_snapshot_3.jpg
     2016-06-28 08:29:09   snapshot4       ipcam_snapshot_4.jpg
     2016-06-28 08:29:10   snapshot5       ipcam_snapshot_5.jpg
     2016-06-28 08:29:11   snapshot6       ipcam_snapshot_6.jpg
     2016-06-28 08:29:12   snapshot7       ipcam_snapshot_7.jpg
     2016-06-28 08:29:13   snapshot8       ipcam_snapshot_8.jpg
     2016-06-28 08:29:14   snapshot9       ipcam_snapshot_9.jpg
     2016-06-28 08:29:14   snapshots       9
Attributes:
   DbLogExclude .*
   cmdPos01   command=39
   cmdPos02   command=41
   cmdPos03   command=31
   delay      1
   path       cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=xxxxxxx&pwd=xxxxxxx
   pathPanTilt decoder_control.cgi?usr=xxxxxxxx&pwd=xxxxxxxx
   room       Kamera,Wohnzimmer
   snapshots  9
   storage    ./www


Hat jemand eine Tipp?

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...