HTML-Box für Synology-API-Funktionen

Hallo,

ich bastle schon die ganze Zeit daran, Funktionen für meine IP-Cams im IPS zu steuern. Snapshots und auch das Aufnehmen in Abhängigkeit von einem Homematic-Bewegungsmelder würde prinzipiell funktionieren, wenn sich HTML-Boxen bei Änderung ihres Inhalts refreshen würden. Leider schaffe ich das immer nur über ein Reload der gesamten Seite im Browser, was nicht gerade komfortabel ist. Ich habe bereits andere Thrads hierzu im Forum gefunden (teilweise schon 4 Jahre alt) aber nirgends eine Lösung des Problems.
Also wie gesagt, die Web-APIs laufen prinzipiell, aber wenn die HTML-Box nicht refreshed wird, dann wird die Funktion nicht ausgeführt.

chrissiboy

Also wenn Du ein Skript zum befüllen der HTML-Box nutzt und dieses startest sollte auch der Inhalt neu aufgebaut werden.

Ich zeige mal, wie ich es umgesetzt habe:

<?

$id_stream = 14336 /*[ Test\Teststream]*/;

if(isset($IPS_EVENT))
   {
   $Event = IPS_GetEvent($IPS_EVENT);
   $Event_Trigger_ID = $Event['TriggerVariableID'];
   $Bewegung = GetValueBoolean(IPS_GetObjectIDByName('Bewegungsstatus', IPS_GetParent($Event_Trigger_ID)));

   $stream = '<iframe width="640pixel" height="480pixel" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://10.0.0.251:82/user/Syn_Sign_On.php"></iframe>';
	SetValue($id_stream, $stream);

   if ($Bewegung == true)
      $stream = '<iframe width="640pixel" height="480pixel" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://10.0.0.251:82/user/Syn_Rec_On_Cam2.php"></iframe>';
	else
      $stream = '<iframe width="640pixel" height="480pixel" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://10.0.0.251:82/user/Syn_Rec_Off_Cam2.php"></iframe>';

	SetValue($id_stream, $stream);
   }
?>

folgende Scripte liegen im webfront\user:

Syn_Sign_On.php

<?

$Cam_Stream_URL = "http://10.0.0.2:5000/webapi/auth.cgi?api=SYNO.API.Auth&version=2&method=Login&session=SurveillanceStation&account=xxxxx&passwd=xxxxx";

echo "<div class=\"centered\"><img src=$Cam_Stream_URL style=\"width:auto;height:auto;\" /></div>";

?>

Syn_Rec_On_Cam2.php

<?

$Cam_Stream_URL = "http://10.0.0.2:5000/webapi/SurveillanceStation/extrecord.cgi?api=SYNO.SurveillanceStation.ExternalRecording&method=Record&version=1&cameraId=2&action=start";

echo "<div class=\"centered\"><img src=$Cam_Stream_URL style=\"width:auto;height:auto;\" /></div>";

?>

Syn_Rec_Off_Cam2.php

<?

$Cam_Stream_URL = "http://10.0.0.2:5000/webapi/SurveillanceStation/extrecord.cgi?api=SYNO.SurveillanceStation.ExternalRecording&method=Record&version=1&cameraId=2&action=stop";

echo "<div class=\"centered\"><img src=$Cam_Stream_URL style=\"width:auto;height:auto;\" /></div>";

?>

wenn ich nach jedem Befehl manuell die Seite neu lade funktioniert es - sonst leider nicht - in der $id_stream steht jedoch der richtige Inhalt jeweils drin…

… bei Snapshot sieht es ganauso aus - obwohl ich den API-Befehl absetze ändert sich das Bild erst, wenn ich einen Reload auf die gesamte Seite mache…

Ok. Ich habe nicht den User-Code in der HTML-Box sondern schreibe ein iFrame in die Stringvariable.

Jedesmal wenn mit SetValue die Variable neu beschrieben wird aktualisiert sich auch die Box.

Benötige ich aber nur wenn das WfE gerade den Stream nich anzeigen will.

Kann dir nachher mal die Codezeilen posten.

habe jetzt auch nochmal herumgespielt - mit einem WFC_Reload klappts das ganze…aber zum einen muss dazu das IPS-Tab offen sein und zum anderen ist das sowieso nicht unbedingt die eleganteste Lösung, zumal ich ja bei der Aufnahmesteuerung überhaupt nichts anzeigen will, sondern nur die API benutzen möchte.
Ich habe mich in das Thema gerade erst etwas eingelesen und bin meilenweit vom Status eines Fachmanns in diesem Thema entfernt. Aber vlt. hat noch jemand anderes eine Idee.

So setze ich den Content für die beiden Cameras.

<?
// Konfiguration
$user = "xxxxxxxx";  // Synology Benutzer mit Berechtigung die Kamera anzuzeigen
$pass = "xxxxxxxx";  // Passwort zu eben eingegebenem Benutzer
$ip = "192.168.x.x";  // IP-Adresse eures Synology-NAS
$port = "5000";  // default Port der Surveillance Station
$cameraID1 = "1";  // ID der Kamera, welche angezeigt werden soll
$cameraID2 = "4";  // ID der Kamera, welche angezeigt werden soll
$iOS = "<meta name=\"viewport\" content=\"width=device-width\" />";
// Authentifizierung an Synology Surveillance Station WebAPI und auslesen der SID
$json = Sys_GetURLContent('http://'.$ip.':'.$port.'/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=3&account='.$user.'&passwd='.$pass.'&session=SurveillanceStation&format=sid');
$obj = json_decode($json, true);
@$sid = $obj["data"]["sid"];
$Cam1_Stream_URL = 'http://'.$ip.':'.$port.'/webapi/SurveillanceStation/videoStreaming.cgi?api=SYNO.SurveillanceStation.VideoStream&version=1&method=Stream&cameraId='.$cameraID1.'&format=mjpeg&_sid='.$sid;
$Cam2_Stream_URL = 'http://'.$ip.':'.$port.'/webapi/SurveillanceStation/videoStreaming.cgi?api=SYNO.SurveillanceStation.VideoStream&version=1&method=Stream&cameraId='.$cameraID2.'&format=mjpeg&_sid='.$sid;
//print_r($json);
//echo $sid;
//echo "
".$Cam1_Stream_URL;
//echo "<div class=\"centered\"><img src=$Cam1_Stream_URL style=\"width:auto;height:auto;\" /></div>";
SetValue(59384 /*[Test\Synology\Cam 1]*/, $iOS."<div class=\"centered\"><img src=$Cam1_Stream_URL style=\"width:320px;height:240px\" /></div>");
SetValue(50256 /*[Test\Synology\Cam 2]*/, $iOS."<div class=\"centered\"><img src=$Cam2_Stream_URL style=\"width:320px;height:240px;\" /></div>");
?>


Immer wenn ich diese Skript aufrufe wird auch der Inhalt der beiden String-Variablen neu aufgebaut.

So wie ich das sehe müsste ein Aufruf deines ersten Skriptes den Inhalt auch regenerieren.

ok - das ist ja ein Stream … und klar, wenn der mal läuft, läuft er, aber klappt das auch bei Snapshots, d.h. bei jedem Aufruf wird ein neuer Snapshot erzeugt ?
Das Script steht dann sicher auch im User-Verzeichnis

Du könntest dir einen Button „Aktualisieren“ in oder unter die HTMLBox bauen…und damit einfach ein Script auslösen, welches den Snapshot aktualisiert und auch die HTMLBox Variable dann neu setzt und so einen Reload auslöst. Habe ich auch irgendwo so gemacht.

Grüße,
Chris

den Aktualisierungs-Button soll ja der Bewegungsmkelder darstellen. Sobald der auf true springt, wird der Snapshot-Befehl aufgerufen … aber so wie hier aktualisert sich das nur bei einem WFC_Reload.

Hatte ich überlesen…ja gut, wo ist dann dein Problem genau? Grad nochmal getestet, HTMLBox neu setzen = automatischer Reload der HTMLBox im WebFront. Trigger ist ja dann egal was es ist.

Grüße,
Chris

Das verstehe ich auch noch nicht. Ein setzen der HTML-Box sollte eigentlich ausreichend sein

:confused::confused::confused:
Jetzt verstehe ich es auch nicht mehr…jetzt funktioniert das mit den Snapshots und die Bilder werden refreshed. Irgendwie ist mir das noch nicht so klar, warum diese Scripts mit dem

echo "<div class=\"centered\"><img src=$Cam_Stream_URL style=\"width:auto;height:auto;\" /></div>";

in das user-Verzeichnis müssen.

Jetzt habe ich es so gemacht:

<?

if(isset($IPS_EVENT))
   {
   $Event = IPS_GetEvent($IPS_EVENT);
   $Event_Trigger_ID = $Event['TriggerVariableID'];
   $Bewegung = GetValueBoolean(IPS_GetObjectIDByName('Bewegungsstatus', IPS_GetParent($Event_Trigger_ID)));
   $IP_Adresse_ID =  IPS_GetObjectIDByName('IP-Adresse', IPS_GetParent($Event_Trigger_ID));
   $Kamera_ID = substr(GetValueString($IP_Adresse_ID), -1);
   $Position_ID = IPS_GetObjectIDByName('Position', IPS_GetParent($Event_Trigger_ID));
   $Standbild_ID = IPS_GetObjectIDByName('Standbild', IPS_GetParent($Event_Trigger_ID));
   
   if ($Bewegung == true)
		{
      SetValueString(29338, 'http://10.0.0.2:5000/webapi/SurveillanceStation/camera.cgi?api=SYNO.SurveillanceStation.Camera&version=1&method=getSnapshot&cameraId='.$Kamera_ID);
      $stream = '<iframe width="320pixel" height="240pixel" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://10.0.0.251:82/user/Synology_execute.php"></iframe>';
		SetValueString($Standbild_ID,$stream);
      If (GetValueInteger($Position_ID) == GetValueInteger(22308 /*[Kameras\Hauptfenster-Auswahl]*/))     /* Auch im Hauptfenster ? */
			{
	      $stream = '<iframe width="640pixel" height="480pixel" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://10.0.0.251:82/user/Synology_execute.php"></iframe>';
         SetValueString(35866 /*[Kameras\Hauptfenster-Standbild]*/,$stream);
         }
      }

   }

?>

und im user-verzeichnis Synology_execute.php:

<?

$Cam_Stream_URL = GetValueString(29338);

echo "<div class=\"centered\"><img src=$Cam_Stream_URL style=\"width:auto;height:auto;\" /></div>";

?>

Aber irgendwie stimmt noch was mit der Dimensionierung der Bilder noch nicht… ich sehe nur einen ganz kleinen Ausschnitt - es wird also nicht in die 320/240-Pixel herunterskaliert.

Dann schau dir mal diese Zeile an, dann solltest du erkennen, warum das Script da liegen muss…denn es wird da „gesucht“ :wink: :slight_smile:

$stream = '<iframe width="640pixel" height="480pixel" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://10.0.0.251:82/user/Synology_execute.php"></iframe>'; 

…die URL wird ja quasi „extern“ aufgerufen über den IPS-Webserver…

Grüße,
Chris

hm - ist schon klar, dass der Pfad da mit rein muss, aber für was an dem „externen“ Script ist es wichtig, dass es nicht im script-Verzeeichnis stehen kann ?

Hast du noch eine Idee, warum die Bilder nicht herunterscaliert werden bzw. was die „width/height = auto“-Anweisungen bewirken ?

:eek: … das ist echt der Wahnsinn… jetzt bekomme ich irgendwelche Bilder von vor einer Woche angezeigt ! Hat die Synology irgendwo einen Cache oder so etwas ? Wenn ich den Snapshop direkt von der Kamera hole ist er aktuell.
Also diese API-Zugriffe haben schon ihre Tücken …

Ich habe weniger die API im Verdacht, als eher den Anwender :wink: :stuck_out_tongue: :smiley:

Liegt es vlt. am Cache deines Browsers? Schwer zu lösen aus der Ferne…

Grüße,
Chris

hm…kann natürlich auch sein :smiley: … von dem HTML-Zeug habe ich wirklich nicht allzuviel Ahnung, aber wenn es mit dem Browser-Cache zu tun hat, müsste es doch auch Möglichkeiten geben, diese Seite vorher rauszuwerfen, um immer einen neuen Stand zu bekommen… aber Tatsache ist auch, dass ich mit meinem angelesenen Wissen so ziemlich jede wichtige API auf irgendeine Weise zum Laufen bekommen habe…außer den Livestream. Hierbei sehe ich allerdings auch noch das Problem, dass die IP310PI m.E. nicht ordentlich in der SS implementiert ist, denn eigtl. hat die Kamera 2 Streams und die SS stellt nur einen zu Verfügung…aber was soll ich mit einem 3Mbit-Stream wenn ich unterwegs bin ?

tatta - Chris, du hattest Recht…es lag am Anwender :stuck_out_tongue:
Eine Session-ID wirkt als echt Wunder :smiley: … es funktioniert sogar ohne dass ich ein Script im user-Verzeichnis ablegen muss. Jetzt mache ich mich noch an den Livestream.

ps. Hast du eine Idee, wie man ein Snapshot speichern kann ? Ich würde diese gerne auf dem Server-Laufwerk ablegen.

Grüße Frank

Es geht alles, man muss es nur machen :smiley: Wie hast du es jetzt umgesetzt?

Snapshots…klappen bei mir auch :stuck_out_tongue: :wink: Du hattest die Surveillance Station v6 oder v7?

Grüße,
Christoph