WebCam HD im WF

Hallo zusammen,

nachdem ich hier verschiedene Freds zum Thema WebCam im WF gelesen habe, möchte ich meine bisherigen Erfahrungen zum Besten geben.

Ich habe eine Foscam FI9828W. Ist eine HD-Cam.

Wie ich gelesen habe unterstützen HD-Cams nur H.264 Streams. Bis Dato benötigen alle Browser dafür ein AddOn.

Zumindest bei meiner Foscam, kann man den Secondary/Sustreams aber mit Eingabe folgender URL im Browser auf mjpeg (kein HD) ändern und somit den Stream ohne AddOn anzeigen lassen.
http://ip:port/cgi-bin/CGIProxy.fcgi?usr=user&pwd=passwort&cmd=setSubStreamFormat&format=1‘

Danach kann man dann den mjpeg Stream direkt im Browser unter fogender URL anschauen.
http://ip:port/cgi-bin/CGIStream.cgi?cmd=GetMJStream&usr=user&pwd=passwort‘

Das ganze kann man dann über verschiedene Wege ins WF einbinden:

  • Direkt im WF als URL einer externen Seite. Funktioniert bei mir nur im FireFox. Chrome nicht.
  • Eine einfache HTML erstellen und diese als externe Seite einbinden. Funktioniert mit FF u Chrome.
<html>
<!-- mit interner Adresse -->
    <body>

        <img src="http://ip:port/cgi-bin/CGIStream.cgi?cmd=GetMJStream&usr=user&pwd=passwort"> 

    </body>
</html>

Je nach Netzwerkverbindung / PC-Power stottert der Stream.

Resourcensonender wäre folgende HTML-Seite die alle Sekunde eine Bild aktualisiert. Auch im WF als externe Seite eingebunden (hab irgend wo aus dem Internet). Funktioniert mit FF und Chrome:

<html>
<!-- mit interner Adresse -->
    <body>
    
    <script language="JavaScript" type="text/javascript">

function reload()
{
   setTimeout('reloadImg("refresh")',1000)
};

function reloadImg(id) 
{ 
   var obj = document.getElementById(id); 
   var date = new Date(); 
   obj.src = "http://ip:port/cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=user&pwd=pw&t=" + Math.floor(date.getTime()/1000);    
} 

</script>

<!img src="http://ip:port/cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=user&pwd=pw&t=" name="refresh" id="refresh" onload='reload(this)' onerror='reload(this)'>

    </body>
</html>

!! Manches funktioniert nicht mit https !!

So nun hab ich wie auch immer einen Stream im WF.

Nun möchte ich aber auch - die FI9828W kann PTZ - auch noch diese Funktionen vom WF aus Steuern können.

Hab auch mal IPSCam getestet, war aber nicht meins. Hat nicht gemacht was die Cam kann und ich will, und ich versteh nicht wo ich drehen muss.

Hab dann eine pdf gefunden mit einer für diese Cam passenden cgi-Doku.

Funktioniert auch schon einiges wenn ich die entsprechenden URLs im Browser eingebe.

!! Manches funktioniert nur mit Adminrechten, anderes auch als Gast!!

!! Manches funktioniert nicht mit https !!

Nun meine Frage: Wie kann ich eine URL an die Cam aus einem Script heraus schicken?

Z.B.

  • Abfrage: ‚http://ip:port/cgi-bin/CGIProxy.fcgi?cmd=getPTZPresetPointList&usr=user&pwd=pw‘ User muss admin sein.
    und wie kann ich die Rückgabe im Script als echo/print ausgeben?
    und
  • Befehl: ‚https://ip:port/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=HofEinfahrt&usr=user&pwd=pw‘

!! zum testen die leerzeichen in den URLs entfernen, ip, port, user u. pw anpassen.

Wenn mir das bitte jemand für Dummies erklären könnte?

Dann würde ich, wenn ichs hinbekomme, weitere Scripte posten.

Hallo Wolfgang,
ich hab folgendes im entsprechenden Scipt stehen:

$pos = Sys_GetURLContent("http://$ip/cgi-bin/CGIProxy.fcgi?cmd=ptzMoveDown&usr=$benutzer&pwd=$passwort");

so sieht es im WF aus…

Hallo zusammen,

@ Bernd: danke für die Zeile. Hab mal wieder zu kompliziert gedacht.

Damit kann man ja richtig viel anfangen, und super einfach ists auch noch.

Hier die aktuellste Foscam-CGI-pdf die ich gefunden hab:
ftp://ftp.nadzor.net.ua/Nadzor/FOSCAM/SDK%20CGI/Foscam%20IPCamera%20CGI%20User%20Guide-3518.pdf

Hier mal ein Erfahrungsbericht mit der Foscam FI9828W (nicht um Werbung zu machen, sondern um die Script-Gültigkeit einzuschränken. Was nicht heisst, das die Scripte nicht auch mit anderen Cams der selben Entwicklungsstufe funktionieren) mit Beispielen.

Erfolgreich getestet hab ich:
Pan-Tilt, ZoomIn-Out, Modus setzen, anfahren von PreSets und Kombinationen davon.

Leider funktioniert PanTilt und Zoom nicht mit vorgegebenen Werten die man übergibt. Also z.B. 10° nach rechts u 3° nach oben und Zoom 20%.
Sondern mit: fahre nach rechts bis der Stop-Befehl kommt. …

Für die manuellen PTZ Befehle hab ich daher direkt nach dem eigentlichen Behfehl einen Stopp gesetzt. Für grössere Schritte könnte man ja noch einen sleep() dazwischen hängen. Hab ich so bei kombinierten Befehlen gemacht.

!! Das Absetzen dieser Befehle kann je nach Netzwerkverbindung (bei mir alles LAN) und derzeitigen Zugriffen 1-2-3-x Clients (dabei ist es egal ob alle den selben Stram verwenden oder auf die beiden aufgeteilt sind.), unterschiedliche Ergebnisse bringen, da der Stopp-Befehl verzögert ankommt.
Wenns zu viel wird (auch ohne Aktionen bei zu vielen gleichzeitgen Streams), bricht sogar der Stream ab. Im FF kommt der dann von allein wieder, mit Chrome ist ein WF-Tabwechsel notwendig.
Der mjpg Substream läuft im IPS-WF nur auch einem Client. Bei 2 bricht er regelmässig ab.

Die Latenz beim Streamen H.264 auf WLAN Clients (Bsp. org. Foscam App auf Tablet mit grottenschlechter Verbindung) kann bis zu 13 Sekunden betragen, läuft aber flüssig. Im IPS-WF (mjpeg) ist die Latenz zur selben Zeit nur 1-2 Sekunden im Vergleich mit einem IPS-WF (mjpeg) Stream im LAN.

!! Mitten im testen meiner Presets per Script (erstellt mit dem org. Foscam-WF), hatte ich plötzlich einen Pan-Offset von einigen Graden re. Hab dann die PreSets wieder angepasst. Nach einem Neustart der Kamera hatte ich dann genau den gegenteiligen Offset. -> Wenn ein eingestellter PreSet mal nicht mehr stimmt: erst mal einen Neustart der Kamera machen. Dann stimmts wieder (2x nachvollzogen). Kam aber nur beim, in kurzen intervallen, Wiederholen (evtl auch überschneiden) der Befehle vor. Nach dem ich Alles eingestellt hatte und die Presets nur noch 2x am Tag geändert werden, ists nicht mehr vorgekommen.

Folgende Scripte sind alle ohne ssl und mit Admin-User. Die meisten würden auch als Operator funktionieren.
Die IP, Port, User u PW sind bei mir in der __autoload.php hinterlegt.
Zum Steuern hab ich jeweils Int-Variablen mit den entsprechenden Profilen angelgt und die Scripte als Action-Script hinterlegt.

Setzen der PwrFreq (im Foscam-WF Modus genannt). Hab ich eingebaut, weils versehntl mal verstellt war.
Zwischenablage-1.png

<?

$ValID    = 38272 /*[Logisch\Kameras\CamBirds01\Cambirds01-Foscam-Modus\Modus]*/ ;

setvalue ($ValID, $_IPS['VALUE']);

$Val        = GetValue($ValID);

Switch ($Val)
    {
    Case 0: // 60 Hz
         //echo "60 Hz";
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/CGIProxy.fcgi?cmd=setPwrFreq&freq=0&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Break;
    Case 1: // 50 Hz
         //echo "50 Hz";
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/CGIProxy.fcgi?cmd=setPwrFreq&freq=1&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Break;
    Case 2: // OutDoor
         //echo "OutDoor";
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/CGIProxy.fcgi?cmd=setPwrFreq&freq=2&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Break;
    }
?>


Zoom:
Zwischenablage-2.png

<?

$ValID    = 13865 /*[Logisch\Kameras\CamBirds01\Cambirds01-Foscam-Zoom\Zoom]*/ ;

setvalue ($ValID, $_IPS['VALUE']);

$Val        = GetValue($ValID);

Switch ($Val)
    {
    Case 0: // Birds Zoom 0
         //echo "Birds Zoom in";
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomIn&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
//       sleep(1);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Break;
    Case 1: // Birds Zoom 1
         //echo "Birds Zoom out";
         Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomOut&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
//       sleep(3);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Break;
    }
?>

PanTilt:
Zwischenablage-3.png

<?

$ValID    = 42206 /*[Logisch\Kameras\CamBirds01\Cambirds01-Foscam-PT\PanTilt]*/ ;

setvalue ($ValID, $_IPS['VALUE']);

$Val        = GetValue($ValID);

Switch ($Val)
    {
    Case 0: // up
         //echo "up";
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzMoveUp&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzStopRun&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Break;
    Case 1: // down
         //echo "down";
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzMoveDown&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzStopRun&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Break;
    Case 2: // right
         //echo "right";
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzMoveRight&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzStopRun&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Break;
    Case 3: // left
         //echo "left";
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzMoveLeft&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzStopRun&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Break;
    }
?>

PanTilt und Zoom könnte man sicher auch noch in einer Variablen unterbringen.

PreSets mit individuellen Zooms:
Da der aktuelle Zoom-Status nicht ausgelesen werden kann wird zuerst ganz herausgezoomt und dann schrittweise wieder eingezoomt.
Zwischenablage-4.png

<?

$ValID    = 27763 /*[Logisch\Kameras\CamBirds01\Cambirds01-Foscam-PreSets\PrePos + PTZ]*/;

setvalue ($ValID, $_IPS['VALUE']);

$Val        = GetValue($ValID);

Switch ($Val)
    {
    Case 0: // Birds Zoom 0
         //echo "Birds Zoom 0";
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=Birds02&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomOut&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Break;
    Case 1: // Birds Zoom 1
         //echo "Birds Zoom 1";
         Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=Birds02&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
         Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomOut&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       sleep(3);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
//       sleep(10);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomIn&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
//       sleep(1);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");

       Break;
    Case 2: // Birds Zoom 2
         Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=Birds02&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
         Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomOut&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       sleep(3);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       sleep(5);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomIn&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       sleep(5);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomIn&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       //echo "Birds Zoom 2";
       Break;
    Case 3: // Birds Zoom 3
         Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=Birds02&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
         Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomOut&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       sleep(5);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");

       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomIn&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       sleep(5);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomIn&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       sleep(5);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomIn&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       //echo "Birds Zoom 3";
       Break;
    Case 4: // Birds Zoom 4
       
       echo "Birds Zoom 4";
       Break;
    Case 5: // Hof Zoom 0
         //echo "Hof Zoom 0";
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=HofEinfahrt&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomOut&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Break;
    Case 6: // Hof Zoom 1
         //echo "Hof Zoom 0";
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=HofEinfahrt&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomOut&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       sleep(3);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
//       sleep(10);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomIn&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
//       sleep(1);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Break;
    Case 7: // Hof Zoom 2
         //echo "Hof Zoom 0";
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=HofEinfahrt&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomOut&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       sleep(3);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
//       sleep(10);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomIn&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
//       sleep(1);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomIn&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
//       sleep(1);
       Sys_GetURLContent("http://".$cambirds01_IP.":".$cambirds01_Port."/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=$Cambirds01_AUser&pwd=$Cambirds01_AUserPW");
       Break;
    }
?>

Die Cam wird bei mir 30 Minuten nach Sonnenaufgang auf eins unserer VogelFutterHäuser mit 2x Zoom geschwenkt und 30 Minuten nach Sonnenuntergang auf die Hofeinfahrt ohne Zoom zur Nachüberwachung.


Wie in der PDF ist sicher noch vieles mehr möglich.
Viel Spass damit.