Fritzbox eingehender Ruf, Musik oder TV auf Pause

Alle Skripte die ich bisher gefunden habe konnte ich mir nicht so hinbauen, dass ich nur die Info habe, dass es klingelt bzw. ein Gespräch geführt wird.
Vielleicht kann mir hier jemand helfen ein passendes Skript zu bauen.

Ich möchte mir nur eine Variable einrichten, die auf True geht, wenn es klingelt und so lange auf True bleibt bis ich aufgelegt habe. Dann auf False umspringt.
Das sollte eigentlich mit der Fritzbox klappen.

Damit kann ich dann meinen Samsung TV auf Pause (Timeshift) oder meinen Radio pausieren lassen.

Wäre euch sehr dankbar.

Gruß
joschi

Nur mal auf die schnelle, der Callmonitor muss installiert sein und der passende Client-Socket mit Register Variable angelegt.

Ist alles aus einem (weis echt nimmer welchem) Fritzbox-Script entnommen. Macht dann imho genau das was du möchtest.

<?
$callmonitor = explode(";", $IPS_VALUE);

print $IPS_VALUE;

if ($callmonitor[1] == "RING")
{
//Snarl_ShowMessage("192.168.0.100",1886,"Anruf", $callmonitor[3],5);
}

if ($callmonitor[1] == "DISCONNECT")
{
IPS_RunScript(25706 /*[Dashboard\Fritzbox\Ausleseskript]*/);
}

?>

gruß
goran

Hallo, ich habe das auch gemacht, dass die Musik leiser wird bei einem Anruf. Das habe ich mit dem Skript aus dem Beitrag 11 „Rufnummer suchen“ von Rainer gemacht. Vorteil, du brauchst kein Callmonitor!!

http://www.ip-symcon.de/forum/threads/8267-Fritzbox-7270-Wlan-Repeater-Scripts

In den beiden Case „Ring“ und „Disconnect“ ergänzt du dann die Befehle fürs leiser stellen, bzw. wieder lauter. Ggf. die bisherige Lautstärke zuerst in eine Variable schreiben, dass nach dem Call wieder die bisherige Lautstärke eingestellt werden kann. Du brauchst nicht unbedingt eine Zwischenvariable true/false. Einfach direkt deine Befehle für Samsung eintragen…

Wenns nicht klappt melde dich noch mal.

Nebeneffekt du kanns dir gleich auch den eingehenden Call anzeigen lassen, ansonsten diese Teile aus dem Script löschen. Aber mich begeister es dass sogar Anruferdaten bei Klicktel geholt werden und echt häufig gefunden werden.

Viel Spaß und auch Danke an Rainer und die tollen sonstigen FritzBox Skripte

Hallo,

leider komme ich mit den ganzen Skripten nicht klar. Ich habe es hinbekommen, dass das Anrufjournal angezeigt wird, aber ich habe es nicht hinbekommen, dass mein TV bei eingehenden Ruf auf Pause geht.

Ich habe hier mal mein Script das den TV auf Pause stellt.

Vielleicht kann mir jemand hier etwas helfen, wie ich das hinbekomme.


<? $src = "192.168.0.10"; # ip des IPS $mac = "xxxxxx"; # mac des IPS $remote = "Perl Samsung Remote"; $dst = "192.168.148.12"; # ip of tv $app = "iphone..iapp.samsung"; $tv = "UE46C6500"; # iphone.UE55C6700.iapp.samsung $key = "KEY_PAUSE"; #auszuführende Taste error_reporting(0); $ping = Sys_Ping($dst, 1000); if ($ping ==false){ echo "
FERNSEHER REAGIERT NICHT
"; die(); } $samsungstatus = IPS_GetInstance(40088 /*[Client Socket Samsung]*/); if ($samsungstatus['InstanceStatus']>102){ CSCK_SetOpen(40088 /*[Client Socket Samsung]*/, true); IPS_ApplyChanges(40088 /*[Client Socket Samsung]*/); $samsungstatus = IPS_GetInstance(40088 /*[Client Socket Samsung]*/); if ($samsungstatus['InstanceStatus']>102){ echo "
FERNSEHER REAGIERT NICHT
"; die(); } } CSCK_SetOpen(40088 /*[Client Socket Samsung]*/, true); $msg = chr(0x64).chr(0x00).chr(strlen(base64_encode($src))).chr(0x00).base64_encode($src).chr(strlen(base64_encode($mac))).chr(0x00).base64_encode($mac).chr(strlen(base64_encode($remote))).chr(0x00).base64_encode($remote); $pkt = chr(0x00).chr(strlen($app)).chr(0x00).$app.chr(strlen($msg)).chr(0x00).$msg; CSCK_SendText(40088 /*[Client Socket Samsung]*/,$pkt); $msg = chr(0x00).chr(0x00).chr(0x00).chr(strlen(base64_encode($key))).chr(0x00).base64_encode($key); $pkt = chr(0x00).chr(strlen($tv)).chr(0x00).$tv.chr(strlen($msg)).chr(0x00).$msg; CSCK_SendText(40088 /*[Client Socket Samsung]*/,$pkt); CSCK_SetOpen(40088 /*[Client Socket Samsung]*/, false); ?>



Hi,
ich weis jetzt nicht welches Anrufjournal du meinst,vielleicht kannst dazu noch was sagen. Aber wenn du das mit dem Skript von Rainer gemacht hast, dann kannst ja in dem Case „RING“ ggf. dein fertiges Skript für die Pause einfach nur aufrufen.
Das machst du mit dem Befehl IPS_RunScript http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/ablaufsteuerung/ips-runscript/

in dem moment wo der RING kommt, wird dann zusätzlich dein Skript gestartet.

Das Skript von Rainer könnte dann z.B. an dieser Stelle so aussehen: (Ich kann das nicht testen und deshalb gibts auch keine Garantie ob das klappt… :wink: lt. der Dokumentation sollten ja dann beide Skripte paralell laufen. )



switch($daten[1])
{
    case "RING":

//  ***   hier kommt deine zusätzliche Zeile  ***

IPS_RunScript(12345 /*[dein Skript für die Pause]*/);  //hier die ID deines Skriptes für die Pause eintragen!

   $Rufnummer = $daten[3];
    if(in_array($Rufnummer, $array["Nummer"]))
   {
       $intern = array_search($Rufnummer, $array["Nummer"]);
       SetValue(30996 /*[Fritzbox\Anrufe\Eingehender Anruf]*/, "am ".datetime. " von ".$array["Name"][$intern]);
       SetValue(27227 /*[Fritzbox\Anrufe\Letzter Anruf]*/, "am ".datetime. " von ".$array["Name"][$intern]);
       echo "Anruf am ".datetime. " von ".$array["Name"][$intern];
       return;
   }
   else
   {
      $Rufnummer = SucheNummer($Rufnummer);
   }
   break;

Hey helhau

danke für Deine Hilfsbereitschaft. Also ich habe es jetzt versucht mit deinem Tipp, doch leider irgendwie bekomm ich das nicht hin.

Ich habe folgendes Script bei mir am laufen:

von:
bruns8234

Ich habe schon gesucht, wo ich nun mein PauseScript mit der Zeile:
IPS_RunScript(12345)
Einbauen könnte.

Ich muss dann nur diese Zeile einbauen und die ID von meinem Pause Script einsetzen?

Danke

Das Script von bruns wertet „nachträglich“ die Anrufliste aus. Es reagiert aber nicht auf eingehende Anrufe. Somit kannst du dein Pause-Kommando dort nicht sinnvoll einbauen.

Ich habe nun dieses Script eingebaut. Es läuft durch aber was macht das eigentlich.
Ist das zweite Script von Rainer unter: http://www.ip-symcon.de/forum/threads/8267-Fritzbox-7270-Wlan-Repeater-Scripts
Habe hier die Dll Dateien wie beschrieben reinkopiert und neu gestartet.

<?
if ($IPS_SENDER == "WebFront")
{
    $fritzbox_ip = 'fritz.box';
    $fritzgui    = 'http://fritz.box/cgi-bin/webcm';
    $fritzseite  = '../html/de/menus/menu2.html';
    $password    = 'xxxxx';
    $ein         = '1';
    $aus         = '0';

    $ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $login = curl_exec($ch);
    $session_status_simplexml = simplexml_load_string($login);

    if ($session_status_simplexml->iswriteaccess == 1)
    {
       $SID = $session_status_simplexml->SID;
    }
    else
    {
       $challenge = $session_status_simplexml->Challenge;
       $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $password, "UCS-2LE", "UTF-8"));
        curl_setopt($ch, CURLOPT_POSTFIELDS, "login:command/response={$response}&getpage=../html/de/menus/menu2.html");
        preg_match('/name="sid" value="([0-9a-f]*)"/', curl_exec($ch), $matches);
       if (isset($matches[1]) && $matches[1] != '0000000000000000')
       {
          $SID = $matches[1];
       }
       else
       {
          echo "Fehler: Login fehlgeschlagen";
          return;
        }
    }

    if($IPS_VALUE)
    {
        curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&tam:settings/TAM1/Active={$ein}");
        curl_exec($ch);
    }
    else
    {
       curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&tam:settings/TAM1/Active={$aus}");
       curl_exec($ch);
    }
    curl_close($ch);
    SetValue($IPS_VARIABLE, $IPS_VALUE);
}

?>

Ich bräuchte nur ein Script, dass mir eine Variable beim klingeln und telefonieren auf True stellt. Bei auflegen wieder auf False.

Gibt es da irgenwas?

Danke

Das ist so eine art beispielscript, damit kommst nicht weiter. Aber du bist schon näher drann. Gehst in dem Thread weiter nach unten zu nr. 11 „Rufnummern suchen“ und baust das mal ein wie ich es schon weiter oben geschrieben habe.
Auch wenn das etwas verwirrt, das script ist perfect für dein Vorhaben. Glaubs mir!!

Denn das script fängt in diesem Moment, wo ein Anruf kommt zu arbeiten und macht auch am ende wieder etwas. Mit einer kleinen Modifikation ist dein Vorhaben dann erledigt!!

Also schau dir das noch mal an und binde das ein. Wichtig mit Registervariable, Dummymodul, so dass es genau so wie in den beiden Screenshots aussieht, das bekommst bestimmt hin, Schritt für Schritt.

Wenn das dann läuft, wird die Variable eingehender Anruf geändert und du hättest dann sogar schon deine Variable die du willst!!! Und das dann die Nummer noch angezeigt wird ist doch ein schöner Nebeneffekt!!

Gib bescheid wie du vorankommst!!

Den Client Socket hatte ich bereits mit der Fritzbox schon angelegt.
Dann habe ich das Skript angelegt,
dann habe ich 3 Variable angelegt als ~Text Variable
Dann die ganzen IDs der Variablen und des Client Sokets im Skript abgehändert.

Folgenden Fehler erhalte ich:

Notice: Undefined variable: IPS_VALUE in C:\IP-Symcon\scripts\46495.ips.php on line 4
Notice: Undefined offset: 1 in C:\IP-Symcon\scripts\46495.ips.php on line 25

Ich weiss nicht was ich in Zeile 4 Eingeben muss.

Anbei noch einen Screenshot von IPS.

Achja, wo muss sich eigentlich die Benutzerdaten für die Fritzbox eingeben?


<?

// Daten aus Registervariable lesen
$daten = explode(";", $IPS_VALUE);

// Datum/Uhrzeit mit ausgeben
define ("datetime", $daten[0]);

// Nummern ohne Eintrag im öffentlichen Telefonbuch welche aber bekannt sind und übertragen werden ($intern).
// unendlich erweiterbar
  $array["Nummer"][1] = "xxxxxx";
  $array["Name"]  [1] = "Rainer";
  $array["Nummer"][2] = "xxxxxxx";
  $array["Name"]  [2] = "Gabi";
  $array["Nummer"][3] = "xxxxxx";
  $array["Name"]  [3] = "Rainer Handy";
  $array["Nummer"][4] = "xxxxx";
  $array["Name"]  [4] = "Rainer Firma";
  $array["Nummer"][5] = "";
  $array["Name"]  [5] = "Unbekannt";
  $array["Nummer"][6] = "xxxxxx";
  $array["Name"]  [6] = "Ernst ";

// Daten aus Registervariable auswerten
switch($daten[1])
{
    case "RING":
   $Rufnummer = $daten[3];
    if(in_array($Rufnummer, $array["Nummer"]))
   {
       $intern = array_search($Rufnummer, $array["Nummer"]);
       SetValue(48286 /*[Media\FritzBox\Register Variable\Dummy Module\Eingehender Anruf]*/, "am ".datetime. " von ".$array["Name"][$intern]);
       SetValue(31208 /*[Media\FritzBox\Register Variable\Dummy Module\Letzter Anruf]*/ , "am ".datetime. " von ".$array["Name"][$intern]);
       echo "Anruf am ".datetime. " von ".$array["Name"][$intern];
       return;
   }
   else
   {
      $Rufnummer = SucheNummer($Rufnummer);
   }
   break;

   case "CALL":
   $interneNummer = $daten[4];
   if ($interneNummer == 982966)
   {
      $interneNummer = "Rainer";
    }
    else
    {
       $interneNummer = "Gabi";
    }
    $externeNummer = $daten[5];
    SetValue(17623 /*[Media\FritzBox\Register Variable\Dummy Module\Ausgehender Anruf]*/  , "von ".$interneNummer." zu ".$externeNummer);
   break;

   case "DISCONNECT":
   RegVar_SetBuffer(13659 /*[Client Socket Fritzbox]*/, "");
   SetValue(48286 /*[Media\FritzBox\Register Variable\Dummy Module\Eingehender Anruf]*/, "");
   SetValue(17623 /*[Media\FritzBox\Register Variable\Dummy Module\Ausgehender Anruf]*/ , "");
   return;
   break;
}

function SucheNummer($Rufnummer)
{
   $url_orig="http://www.klicktel.de/inverssuche/index/search?method=searchSimple&_dvform_posted=1&phoneNumber=#TEL#";
   $url = str_replace("#TEL#", $Rufnummer, $url_orig);
   $Ausgabe = fopen($url, "r");
   if (!$Ausgabe)
    {
      echo("ERROR : Kann URL nicht öffnen : $url
");
   }
   $lineNb     = 0;
   $searchTag0 = 'namelink';
   $searchTag1 = '<strong>';
   $searchTag2 = '</strong>';
   $gefunden   = 0;
   while(!$gefunden && !feof($Ausgabe))
   {
       $lineNb++;
        $buffer = fgets($Ausgabe);
      if (strpos($buffer, $searchTag0) != false)
      {
            $gefunden = 1;
            $startLN = strpos($buffer, $searchTag1) + strlen($searchTag1);
          $endeFN = strpos($buffer, $searchTag2) ;
            $Name = substr($buffer, $startLN, $endeFN - $startLN) ;
            $Name = html_entity_decode($Name);
            SetValue(48286 /*[Media\FritzBox\Register Variable\Dummy Module\Eingehender Anruf]*/, "am ".datetime. " von ".$Name);
            SetValue(31208 /*[Media\FritzBox\Register Variable\Dummy Module\Letzter Anruf]*/ , "am ".datetime. " von ".$Name);
            echo "Anruf am ".datetime. " von ".$Name;
      }
   }
   fclose($Ausgabe);
   return $Name;
}

?>

Hast du wenn du die Register Variable öffnest als Ziel Skript dein Skript ausgewählt und als übergordnete Instanz dein Client Socket der Fritz box ausgewählt?

Das bedeutet dann wenn die Fritz Box Daten eines Anrufes sendet empfängt das die Registervariable von dem Clientsocket und führt dann dein Skript automatisch aus!! Die Daten der Fritz Box werden in der Variable $IPS_VALUE an dein Skript übergeben und können entsprechend ausgewertet werden. Das macht dann dein Skript.

Da die Fehlermeldung kommt vermute ich du hast das Skript Manuell aufgerufen. Das geht nicht, dann hat das Skript ja die Daten nicht!! Deshalb klappt das ganze dann nur wenn auch wirklich ein Anruf kommt und das Skript dann automatisch startet!!
Also immer mit einem tatsächlichen Anruf testen was passiert!

Wenn du dann die Registervariable noch mal öffnest und auf den Reiter Debug gehst während ein Anruf reinkommt, müßtest du die Daten sehen die von der Fritz Box gesendet werden!

Das ist alles recht kompliziert, aber wenn man mal die Logik drin hat, ist das kein Problem mehr, das dauert immer lang am Anfang. Aber dann machts richtig Spaß… Ich hoffe jetzt ists ein bischen klarer.

langsam komme ich der Sache näher. Also in dem Log von der Register Variable ist was zu erkennen.

RegisterVar.JPG

Nur in den Variablen Eingehender, Ausgehender und Letzter Anruf steht nix drin. Allerdings die Uhrzeit unter Aktualisiert hat sich geändert. Es steht nur noch bei Letzter Anruf N/A drin.

dann kommen wir der Sache jetzt tatsächlich näher. Die Variable eingehender und ausgehender Anruf ist nur gefüllt während der Aktuelle Anruf ausgeführt wird. Nach dem Beenden (also dem Disconnect Befehle siehe Register Variable, es wird dann das Case " Disconnect" ausgeführt) werden diese beiden Variablen geleert und es steht nur noch etwas in letzter Anruf drin vorausgesetzt die Nummer bzw. der Name wurde gefunden!!.

Also trage mal im Skript fast ganz oben in den Array Zeilen deine eingene Nummer und dein Name ein. Dann sollte dein Name beim Anruf kommen! Das ist sozusagen dein eigenes Telefonbuch wo du Namen hinterlegen kannst die angezeigt werden sollen.

Und da ja dann das Skript läuft, kannst jetzt im Skript direkt nach der Zeile: Case „RING“: deinen Aufruf für dein Pausenskript einfügen: IPS_RunScript(12345 /[dein Skript für die Pause]/);

Gib bescheid ob das soweit klappt.
Gruß Helmut

PS: noch mal zum Verständnis: das skript wird jedesmal wenn die Fritz Box daten an die RegisterVariable sendet ausgeführt. In deinem Log siehst ja was die Fritz Box sendet. Kommt der Befehl RING, dann wird nur das Case"RING" ausgeführt. Kommt der Befehl Disconnect… wird das Skript wieder ausgeführt aber nur das Case"Disconnect" abgearbeitet usw.

Jetzt habe ich es hinbekommen. :slight_smile:

Vielen Dank an alle und vor allem auch Danke an helhau.

Sorry, war zu schnell! Frage hat sich aus diesem Thread klar ergeben!

hardlog

Hallo,

trotz eingeschaltetem CallMonitor kommt über den bisher tadellos funktionierenden ClientSocket an 192…1:1012 nichts mehr in der Registervariable an. Liegt das auch am neuen FritzOS 5.5?

hardlog

Habs hinbekommen:
ClientSocket getrennt und neu verbunden… geht.

hardlog