Fritz!Card + AB unter IPS V2.2

Hallo zusammen,

da mir das Auslesen der FritzboxFon so sehr gefallen hat, ich aber nur eine Fritz!Card PCI im Server stecken hab, hab ich ein Tool geschrieben, welches dieselbe Funktionalität ermöglicht. Zusätzlich kann man noch den AB integrieren. Löschen etc. funktioniert alles.
Wenn Interesse besteht, werde ich das Tool, wie schon bei iTunesCtl, konfigurierbar machen und euch zur Verfügung stellen.
Das Tool läuft im Hintergrund und sendet bei Änderungen an der Fritz!-Datenbank Infos an IPS. Diese werden dann weiterverarbeitet. Im Gegenzug kriegt das Tool Änderungen mit, wenn ein Anruf auf dem AB gelöscht werden soll. Der Eintrag wird dann aus der Datenbank als „gelesen“ markiert.
Anbei ein Screenshot. :slight_smile:

Hallo dfhome,

hätte schon interesse. Da ich immer noch eine externe Lösung nutze, könnte ich so etwas gut gebrauchen :wink:

Das sieht ja richtig gut aus.
Ich würde mich auch sehr freuen, wenn Du das posten würdest!
Grüße
Matthias

Ok, dann fang ich mal an, die Objekte in IPS und die Skripte zu posten.
Die Variablen bitte wie im ersten Bild anlegen.
Das Event bei „Neue Nachrichten“ ist nicht zwingend erforderlich. Das hab ich nur, um in einer Variable auf der Home-Seite anzuzeigen, dass neue Nachrichten vorhanden sind. Ich poste das Skript aber trotzdem mal.

Skript „Hinweis“ (Trigger siehe Screenshot):


<?
SetValue(22902 /*[Info\Anrufbeantworter]*/, false); //Boolean-Variable auf dem Home-Screen
if (GetValue(20837 /*[Telefon\Neue_Nachrichten]*/) > 0) {
	$text = strval(GetValue(20837 /*[Telefon\Neue_Nachrichten]*/))." neue Nachricht(en)";
	IPS_SetVariableProfileAssociation("Status_AB", 1, $text, "New_AB"); //Hierfür ein neues Variablenprofil "Status_AB" anlegen (Boolean)
//Der Text für "False" ist immer "Keine neuen Nachrichten".
	SetValue(22902 /*[Info\Anrufbeantworter]*/, true);
}
?>

Skript „Trigger_Steuerung“:


<?
// Arrays erzeugen
$date = explode("|", GetValue(50567 /*[Telefon\Array_Datum]*/));
$number = explode("|", GetValue(12208 /*[Telefon\Array_Nummer]*/));
$fname = explode("|", GetValue(37900 /*[Telefon\Array_Pfad]*/));

switch ($IPS_VALUE) {
	case 0:
		SetValue(43762 /*[Telefon\Anrufbeantworter\Steuerung]*/, 0);
		// Vorherige Nachricht
		if (GetValue(24133 /*[Telefon\Index_Nachricht]*/) > 1) {
		  SetValue(24133 /*[Telefon\Index_Nachricht]*/, GetValue(24133 /*[Telefon\Index_Nachricht]*/) - 1);
		  $index = GetValue(24133 /*[Telefon\Index_Nachricht]*/);
		  // Anzeige aktualisieren
		  SetValue(12130 /*[Telefon\Anrufbeantworter\Nachricht]*/, strval($index)."/".GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/));
		  SetValue(38492 /*[Telefon\Anrufbeantworter\Datum]*/, $date[$index-1]);
		  SetValue(48843 /*[Telefon\Anrufbeantworter\Rufnummer]*/, $number[$index-1]);
		  // Pfad aktualisieren
		  SetValue(12188 /*[Telefon\Pfad_Nachricht]*/, $fname[$index-1]);
		} elseif (GetValue(24133 /*[Telefon\Index_Nachricht]*/) == 1) {
		  SetValue(24133 /*[Telefon\Index_Nachricht]*/, GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/));
		  $index = GetValue(24133 /*[Telefon\Index_Nachricht]*/);
		  // Anzeige aktualisieren
		  SetValue(12130 /*[Telefon\Anrufbeantworter\Nachricht]*/, strval($index)."/".GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/));
		  SetValue(38492 /*[Telefon\Anrufbeantworter\Datum]*/, $date[$index-1]);
		  SetValue(48843 /*[Telefon\Anrufbeantworter\Rufnummer]*/, $number[$index-1]);
		  // Pfad aktualisieren
		  SetValue(12188 /*[Telefon\Pfad_Nachricht]*/, $fname[$index-1]);
		}
		break;
	case 1:
		SetValue(43762 /*[Telefon\Anrufbeantworter\Steuerung]*/, 1);
		// Nachricht abspielen
		$index = GetValue(24133 /*[Telefon\Index_Nachricht]*/);
		SetValue(12569 /*[Telefon\Index_Abgehört]*/, $index-1);
		$file = $fname[$index-1];
		if (GetValue(29255 /*[Telefon\Player\Status]*/) != 2) {
		      WAC_PlayFile(46694 /*[Telefon\Player]*/, $file);
                }
		break;
	case 2:
		if (GetValue(29255 /*[Telefon\Player\Status]*/) == 1) {
			SetValue(43762 /*[Telefon\Anrufbeantworter\Steuerung]*/, 2);
		   WAC_Stop(46694 /*[Telefon\Player]*/);
		}
		break;
	case 3:
		SetValue(43762 /*[Telefon\Anrufbeantworter\Steuerung]*/, 3);
		// Nachricht löschen
		if (GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/) > 0) {
		  $index = GetValue(24133 /*[Telefon\Index_Nachricht]*/);
		  SetValue(54907 /*[Telefon\Index_Löschen]*/, $index-1);
		  if ($index == GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/)) {
		    SetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/, GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/)-1);
		    SetValue(24133 /*[Telefon\Index_Nachricht]*/, GetValue(24133 /*[Telefon\Index_Nachricht]*/)-1);
		    // Eintrag aus Array löschen und String neu setzen
		    unset($date[$index-1]);
		    $date = array_values($date);
		    unset($number[$index-1]);
		    $number = array_values($number);
		    unset($fname[$index-1]);
		    $fname = array_values($fname);
		    if (GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/) > 0) {
		      $tmp = implode("|", $date);
		      SetValue(50567 /*[Telefon\Array_Datum]*/, $tmp);
		      $tmp = implode("|", $number);
		      SetValue(12208 /*[Telefon\Array_Nummer]*/, $tmp);
		      $tmp = implode("|", $fname);
		      SetValue(37900 /*[Telefon\Array_Pfad]*/, $tmp);
		      // Anzeige aktualisieren
		      $index -= 1;
		      SetValue(12130 /*[Telefon\Anrufbeantworter\Nachricht]*/, strval($index)."/".GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/));
		      SetValue(38492 /*[Telefon\Anrufbeantworter\Datum]*/, $date[$index-1]);
		      SetValue(48843 /*[Telefon\Anrufbeantworter\Rufnummer]*/, $number[$index-1]);
			   // Pfad aktualisieren
  			   SetValue(12188 /*[Telefon\Pfad_Nachricht]*/, $fname[$index-1]);
		    } else {
		      SetValue(12130 /*[Telefon\Anrufbeantworter\Nachricht]*/, "0/0");
		      SetValue(38492 /*[Telefon\Anrufbeantworter\Datum]*/, "-");
		      SetValue(48843 /*[Telefon\Anrufbeantworter\Rufnummer]*/, "-");
			 }
		  } elseif ($index < GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/)) {
		    SetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/, GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/)-1);
		    // Eintrag aus Array löschen und String neu setzen
		    unset($date[$index-1]);
		    $date = array_values($date);
		    unset($number[$index-1]);
		    $number = array_values($number);
		    unset($fname[$index-1]);
		    $fname = array_values($fname);
		    if (GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/) > 0) {
		      $tmp = implode("|", $date);
		      SetValue(50567 /*[Telefon\Array_Datum]*/, $tmp);
		      $tmp = implode("|", $number);
		      SetValue(12208 /*[Telefon\Array_Nummer]*/, $tmp);
		      $tmp = implode("|", $fname);
		      SetValue(37900 /*[Telefon\Array_Pfad]*/, $tmp);
		      // Anzeige aktualisieren
		      SetValue(12130 /*[Telefon\Anrufbeantworter\Nachricht]*/, strval($index)."/".GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/));
		      SetValue(38492 /*[Telefon\Anrufbeantworter\Datum]*/, $date[$index-1]);
		      SetValue(48843 /*[Telefon\Anrufbeantworter\Rufnummer]*/, $number[$index-1]);
			   // Pfad aktualisieren
  			   SetValue(12188 /*[Telefon\Pfad_Nachricht]*/, $fname[$index-1]);
		    } else {
		      SetValue(38492 /*[Telefon\Anrufbeantworter\Datum]*/, "-");
		      SetValue(48843 /*[Telefon\Anrufbeantworter\Rufnummer]*/, "-");
		      SetValue(12130 /*[Telefon\Anrufbeantworter\Nachricht]*/, "0/0");
		    }
		  }
		}
		break;
	case 4:
		SetValue(43762 /*[Telefon\Anrufbeantworter\Steuerung]*/, 4);
		// Nächste Nachricht
		if (GetValue(24133 /*[Telefon\Index_Nachricht]*/) < GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/)) {
		  SetValue(24133 /*[Telefon\Index_Nachricht]*/, GetValue(24133 /*[Telefon\Index_Nachricht]*/)+1);
		  $index = GetValue(24133 /*[Telefon\Index_Nachricht]*/);
		  // Anzeige aktualisieren
		  SetValue(12130 /*[Telefon\Anrufbeantworter\Nachricht]*/, strval($index)."/".GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/));
		  SetValue(38492 /*[Telefon\Anrufbeantworter\Datum]*/, $date[$index-1]);
		  SetValue(48843 /*[Telefon\Anrufbeantworter\Rufnummer]*/, $number[$index-1]);
		  // Pfad aktualisieren
		  SetValue(12188 /*[Telefon\Pfad_Nachricht]*/, $fname[$index-1]);
		} elseif (GetValue(24133 /*[Telefon\Index_Nachricht]*/) == GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/)) {
		  SetValue(24133 /*[Telefon\Index_Nachricht]*/, 1);
		  $index = GetValue(24133 /*[Telefon\Index_Nachricht]*/);
		  // Anzeige aktualisieren
		  SetValue(12130 /*[Telefon\Anrufbeantworter\Nachricht]*/, strval($index)."/".GetValue(15183 /*[Telefon\Anzahl_Nachrichten]*/));
		  SetValue(38492 /*[Telefon\Anrufbeantworter\Datum]*/, $date[$index-1]);
		  SetValue(48843 /*[Telefon\Anrufbeantworter\Rufnummer]*/, $number[$index-1]);
		  // Pfad aktualisieren
		  SetValue(12188 /*[Telefon\Pfad_Nachricht]*/, $fname[$index-1]);
		}
		break;
}
?>

Ich hab mir leider nicht die Mühe gemacht, die Variablen oben zu definieren. Also am besten mit nem Texteditor die ID´s ersetzen lassen… :wink:

Skript „Trigger_Status“:


<?
switch ($IPS_VALUE) {
	case 3:
		SetValue(43762 /*[Telefon\Anrufbeantworter\Steuerung]*/, 2);
	break;
}
?>

Das Tool werd ich nachher ändern und dann auch noch posten.

Gruß
dfhome

So, hier das Tool. Konfig über die config.xml.
Viel Spaß! :smiley:

Achso: die Anrufer-Icons bitte in „user/fritz/“ ablegen.

FritzFonCtl.zip (53.8 KB)

Hallo dfhome,

die AB-Abfrage sieht ja super aus!:slight_smile:
Funktioniert das ganze auch mit der Fritz!Box?:confused:

Joachim

Hallo Joachim,

ich kenne leider nicht den Aufbau der FritzBox, aber ich bezweifel es stark… FritzCard läuft über ne dbase-Datenbank und die FritzBox wird das sicher anders gelöst haben. :frowning:

Hallo dfhome,

vielen Dank für Deine Antwort. Irgendwie finde ich aber den Ansatz sehr gut (bin ja auch eher so ein Datenbank-„Fan“ ;))

Vielleicht kann man die Dateien vom Stick der Fritz!Box ja auch in eine Datenbank kopieren, und sie dann hören, löschen usw.?

Mal schauen was mir dazu noch so einfällt…

Joachim

Hallo dfhome,

Vielen Dank für das Tool. Da ich meine alten Anrufbeantworterskripte aus der V1 nicht mehr einsetzen kann wegen dem noch immer vorhandenem „Disconnect“ Problem im ISDN Modul, suche ich schon seit langem an einer Alternative. Ein Lesen der dbase Datenbank hatte ich schon versucht aber direkt von IPS aus über PHP ist es sehr langsam.

Mich würde auch sehr interessieren, den Anrufbeantworter von IPS aus ein und ausschalten zu können, oder die Zeit zur Antwort zu ändern. Wäre das möglich?

Gruss,

Zapp

Puh, da müsste man die API einbinden (wenn es denn da eine gibt…). Kann ich mal bei Gelegenheit schauen.

So, mal geschaut. Da gibt´s nix, was einen Zugriff auf das Programm ermöglicht.

OK, Danke. Ich hatte mir auch gedacht, dass es nicht möglich ist.
Die FritzFon Anwendung hat nicht die Flexibilität, die ich mit Skripts in IPS haben könnte aber ich werde halt damit leben müssen.

Ich habe dein Tool ausprobiert und bekomme eine Fehlermedlung. Die meisten Variablen in IPS werden ausgefüllt aber nach einer Weile stürzt FritzFonCtl ab. Ich muss wohl noch mit den Einstellungen herumprobieren. Ich denke, ich habe den Pfad zum AB nicht richtig definiert. Wie bekomme ich den? Ist das ein Pfad aus der FritzFon Anwendung oder ein eigener, den ich selbst definieren kann?

Gruss,

Zapp

Der Pfad zum AB ist der Pfad zur FritzFon.dbf (die Datenbank). Wenn das übers Netzwerk geht, dann eben als UNC-Pfadangabe. Weiß grad nicht mehr, ob der Slash am Ende mit rein muss oder nicht, sollte aber aus dem oben geposteten Beispiel ersichtlich sein.

Hallo zusammen.

Da klingt ja alles gut.

Meine Rahmenumgebung:

a) IPS-PC mit FritzCardPCI
b) installierte Fritz!-Software
c) Anschluß an einen ISDN-Port der Telefonanlage, so daß ein Teilnehmer eine Rufumleitung bzw. Rufweiterleitung auf die MSN der FritzCard

Welche sonstigen Voraussetzungen brauche ich denn? Eine FritzBoxFon habe ich NICHT! Aus dem Screenshot lese ich auch eine Anrufliste für die Teilnehmer. Ist da richtig?

Vielleicht könnt ihr helfen.

Danke.
Andreas.

Du hast schon alles, mehr brauchst Du nicht. FritzBoxFon brauchst Du nicht. Anruferliste wird aus der Datenbank ausgelesen.

Hallo,

ich habe da eine TK-Anlage mit einem Mehrgeräteanschluß ins Amt. Als Nebenstelle (ISDN) die AVM-Karte dran und nun? Bsp: MSN=123456; Nst. 10 und 11 sind Telefone an der Anlage z.B. analoge, Nst. 20 ist die Nst. für die Fritzcard. Nun werden die Nst. 10+11 über die MSN 123456 von extern angerufen, heben jedoch nicht, weil gerade nicht im Raum.

Wie kann denn die FritzCard feststellen, welchen Anruf wann an welcher Nst. signalisiert wurde? Muß man da was mit Rufumleitung o.ä. machen? Oder verstehe ich da was falsch:confused:?

Andreas.

PS: Läuft die Sache (AVM) als Dienst? Ich lasse das IPS nämlich ohne angemeldeten Benutzer laufen.

Voraussetzung ist nur, dass FritzFon läuft. Das loggt alle Anrufe in der besagten Datenbank mit - und die lese ich einfach aus. Was Du was wie anschließt, ist dem Tool egal.

Das werde ich dann mal ausprobieren. Danke.

Wie ist das mit Faxen? Das sollte doch einem ähnlichen Prinzip folgen, oder? Auch die Änderungen der Datenbank loggen und auswerten. Oder wird bei Faxen keine fritzfax.dbf angelegt?

Hintergrund: Ich würde eingehende Faxe dann an meine Mailadresse versenden wollen.

Danke nochmals
Andreas.

Eingehende Faxe kann Fritzfax selber per Mail versenden.
Es verwendet MAPI, es ist also ein konfigurierter Mailclient (Outlook) notwendig.
Fritzfax muss dazu in den Einstellungen->Benachrichtungen noch konfiguriert werden.

Hallo,

ich habe mal gestern Dein Tool ausprobiert.
Die config.xml habe ich angepast:

<configuration>
	<ips-ip>192.168.2.33</ips-ip>
	<ab-path>C:\Programme\FRITZ!\</ab-path>
	<date-id>44837</date-id>
	<path-id>47069</path-id>
	<number-id>44893</number-id>
	<count-id>28092</count-id>
	<count-new-id>16477</count-new-id>
	<index-id>48946</index-id>
	<list-id>17634</list-id>
	<idx-del-id>20264</idx-del-id>
	<idx-read-id>17402</idx-read-id>
	<ab-msg-id>10229</ab-msg-id>
	<ab-date-id>32737</ab-date-id>
	<ab-number-id>53369</ab-number-id>
</configuration>

Leider bekomme ich „FritzFonCtl hat ein Problem festgestellt und muss beendet werden“.

Muß dieses Tool im IPS-Ordner liegen?
Kann meine Pfadangebe stimmen?

Für eure Hilfe wäre ich sehr dankbar.

Gruß
Christian