Loxone und TFE AGFEO über Fritzbox

Hier erklären wir, wie man seine vorhandene TFE Agfeo oder jede beliebige analoge TFE im Zusammenhang mit einer FritzBox für die Loxone Türsteuerung fit macht. Allerdings ist der Miniserver hier nur an einer Nebenstelle möglich, weil bei der TFE nur ein Klingeltaster den potentialfreien Ausgang sinnvoll belegen kann. Somit ist es bei unserer Konfiguration nur für eine Wohnung möglich, den Loxone Miniserver und die APP zu nutzen. Die 3 weiteren Nebenstellen funktionieren wie bisher.

Ausgangspunkt für diese Konfiguration ist eine schon etwas länger vorhandene TFE mit 4 Klingeltaster, eine vorhandene FritzBox und die Tatsache, dass die Haustür und der Miniserver von Loxone zu weit auseinander liegen um ein Kabel zu ziehen, aber 1x Ethernet vorhanden ist.

Was wird benötigt?

  • 1. Loxone Miniserver
  • 2. analoge TFE Türstation (Agfeo oder anderer Hersteller)
  • 3. Windows Rechner im Netzwerk 24/24
  • 4. Arduino (hier ein Mega, stromversorgung am USB der FritzBox)
  • 5. Relais 1 Port für 5 Volt

Die TFE wir als analoges Endgerät an die FritzBox installiert und konfiguriert, hierbei ist es wichtig, dass die TFE nicht als Türsprechstation eingerichtet wird, sondern als normals analoges Endgerät, das hat den Hintergrund, dass man der TFE sonst keine Rufnummer zuordnen kann! Ein weiteres Problem der TFE ist, dass diese keine internen Nummern der Fritzbox anwählen kann z.B. **620. Um dieses Problem zu umgehen haben wir, weil eh ein Server im Netzwerk ist, der 24 Stunden online ist, eine SIP Telefonanlage für Windows installiert - SIP Telefonanalge 3CX. Die 3CX ist in der kostenlosen Variante mehr als ausreichend für unser Projekt. Jede andere SIP Anlage wie Asterisk auf einem Raspberry usw. sollte genau so gut funktionieren. In der 3CX muss neben den Nebenstellen noch eine Ausgehende Regel erstellt werden.

  • 1. Regelname - frei definibar
  • 2. Anrufe Präfix - 0
  • 3. Anrufe Nebenstellen - 100-200

Somit weiss die 3CX, dass alle Anrufe ohne 0 intern gewertet werden und man unter den einzelnen Nebenstellen telefonieren. In der 3CX muss man jetzt nur noch unter der Nebenstelle (100) für die TFE eine SIP-ID hinterlegen. Der Name ist frei definierbar (bei uns Loxoen), dann kann die Loxone APP die TFE anrufen und das Hauptproblem der analogen TFE wurde umgangen.

Nachdem die 3CX installiert ist und 4 Nebenstellen angelgt wurden (1x TFE und jede weitere Klingeltaste eine Nebenstelle), werden die Nebenstellen in der Fritzbox als SIP Rufnummern registriert. Wir haben die Nummern 100-103 vergeben, die 100 wurde der TFE zugeordnet und 101-103 den internen Telefonen in den Wohnungen. Wichtig beim registrieren der Nummern in der Fritzbox ist, dass Rufnummer für die Anmeldung und Interne Rufnummer in der Fritz!Box identisch sind, da die 3cx sonst die Nummern nicht verarbeiten kann und kein Gesprächsaufbau möglich ist. Zudem muss im Rufnummernformat jeweils bei Landes und Ortsvorwahl die Option keine angewählt werden.

Der TFE müssen jetzt die einzelnen Rufnummern (101-103) zugeordnet werden um die einzelnen Geräte in den Wohnungen zu erreichen. Wird jetzt eine Taste an der TFE gedrückt, vermittelt die FritzBox das Gespräch an die 3CX und von dort wieder zurück an das jeweilige Endgerät an der Fritzbox. Wenn man an dieser Stelle SIP fähige Endgerät in den Wohnungen hat, kann man diese direkt an der 3CX registrieren und hat sich den Umweg gespart. Da wir hier aber eine komplette Installation mit analogen bzw. DECT Telefonen hatten und diese weiter benutzt werden sollten, ist dieser Umweg notwendig und zudem auch unproblematisch. Vom drücken der Klingeltaster bis zur Signalisierung an den Endgeräten dauert es 1-2 Sekunden, was absolut ok ist.

Im Loxone Miniserver wird ein Baustein Türsteuerung eingefügt und unter Host für Audio (intern) die IP (192.168.xxx.xxx) der 3CX angegeben und im Benutzername den Wert für die zuvor definierte SIP-IP (Loxone) eingetragen werden. Ab jetzt ist es möglich, die TFE per APP anzurufen. Der Nebenstelle, für die wir keine Rufnummer an der TFE programmiert haben, wird der potentialfreie Ausgang zugeordnet. Das ist notwendig, weil wir die TFE von der Loxone App aus nicht anrufen können während die TFE versucht ein Gespräch aufzubauen.

An dieser Stelle kommt der Arduino ins Spiel. Der Arduino ist so programmiert, dass er beim drücken des Klingeltasters, welchem der potentialfreie Kontakt zugeordnet wurde, ein UDP Paket an den Loxone Miniserver schickt (Pin 8). Am Miniserver wurde ein Virtueller Eingang (Klingel) angelegt, der dass vom Arduino geschickte UDP Paket als Türklingel interpretiert und an den Türsteuerungsbaustein angehängt. Zudem wird eine Prowl Pushnachricht vom Loxone Miniserver verschickt. Eine weitere Aufgabe, die der Arduino zu erledigen hat, ist das Auslösen des Türöffners. Dazu wurde im Loxone Miniserver ein Virtueller Ausgang definiert. Dieser Ausgang (Pin 9) öffnet im Hintergrund die Webseite des Arduinos und schaltet über den Pin ein Relais und betätigt den Türöffner.

Hier der Sketch:

 
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
boolean reading = false;
 
// PIN Settings
#define Klingeltaster 8
 
// Variable Declaration
char KlingelState = 0;
 
// Network Settings
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 222);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
 
EthernetServer server = EthernetServer(80);
 
// Local UDP port to listen on
unsigned int localPort = 7002;
 
// Recipient IP
IPAddress RecipientIP(192, 168, 0, 27);
 
// Recipient UDP Port
unsigned int RecipientPort = 7007;
 
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
 
// An EthernetUDP instance to send and receive packets over UDP
EthernetUDP Udp;
 
void setup()
{
  // for debug only
  Serial.begin(9600);
 
  // start Ethernet
  Ethernet.begin(mac,ip);
  server.begin();
 
  // Start UDP
  Udp.begin(localPort);
 
  // Klingeltaster
  digitalWrite(9, HIGH);
  pinMode(Klingeltaster, INPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  //pinMode(8, OUTPUT); -> weil oben als Klingeltaster INPUT
  pinMode(9, OUTPUT);
 
  // send UDP Ready 
  sendUDP("UDP Ready");
}
 
void loop()
{
 
// warten auf Anfragen von Clients
  checkForClient();
 
// Klingeltaster (Send)
  if (digitalRead(Klingeltaster) == LOW &amp;&amp; KlingelState != 0)
  {
    sendUDP("Klingel=0");
    KlingelState = 0;
  }
 
  if (digitalRead(Klingeltaster) == HIGH &amp;&amp; KlingelState != 1)
  {
    sendUDP("Klingel=1");
    KlingelState = 1;
  }
 
delay(20);
}
 
// Function to send UDP packets
void sendUDP(String text)
{
    Udp.beginPacket(RecipientIP, RecipientPort);
    // Udp.write("Test");
    Udp.print(text);
    Udp.endPacket();
    delay(10);
}
 
void checkForClient(){
 
  EthernetClient client = server.available();
 
  if (client) {
 
 
    boolean currentLineIsBlank = true;
    boolean sentHeader = false;
 
    while (client.connected()) {
      if (client.available()) {
 
        if(!sentHeader){
          // HTML senden 
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
 
          client.println("<HTML>");
          client.println("<HEAD>");
          client.println("<TITLE>Arduino</TITLE>");
          client.println("</HEAD>");
          client.println("<BODY>");
          client.println("Arduino IO control <br>");
          client.println("<br>");
          client.println("</a>");
 
          client.println("Out 03");
          client.println("<a href=\"/?c\" target=\"inlineframe\">ON</a>"); 
          client.println("<a href=\"/?d\" target=\"inlineframe\">OFF</a><br>");
 
          client.println("Out 04");
          client.println("<a href=\"/?e\" target=\"inlineframe\">ON</a>"); 
          client.println("<a href=\"/?f\" target=\"inlineframe\">OFF</a><br>");
 
          client.println("Out 05");
          client.println("<a href=\"/?g\" target=\"inlineframe\">ON</a>"); 
          client.println("<a href=\"/?h\" target=\"inlineframe\">OFF</a><br>");
 
          client.println("Out 06");
          client.println("<a href=\"/?i\" target=\"inlineframe\">ON</a>"); 
          client.println("<a href=\"/?j\" target=\"inlineframe\">OFF</a><br>");
 
          client.println("Out 07");
          client.println("<a href=\"/?k\" target=\"inlineframe\">ON</a>"); 
          client.println("<a href=\"/?l\" target=\"inlineframe\">OFF</a><br>");
 
          client.println("Out 08");
          client.println("<a href=\"/?m\" target=\"inlineframe\">ON</a>"); 
          client.println("<a href=\"/?n\" target=\"inlineframe\">OFF</a><br>");
 
          //client.println("Out 09");
          //client.println("<a href=\"/?o\" target=\"inlineframe\">ON</a>"); 
          //client.println("<a href=\"/?p\" target=\"inlineframe\">OFF</a><br>");
 
          client.println("<br>");
          client.println("</a>");
 
          client.println("<a href=\"/?cegikmo\" target=\"inlineframe\">all ON</a>"); 
          client.println("<a href=\"/?dfhjlnp\" target=\"inlineframe\">all OFF</a><br>");
 
          client.println("<IFRAME name=inlineframe style=\"display:none\" >");          
          client.println("</IFRAME>");
 
          client.println("</BODY>");
          client.println("</HTML>");
          sentHeader = true;
        }
//auslesen der Eingabe
 
        char c = client.read();
 
        if(reading &amp;&amp; c == ' ') reading = false;
        if(c == '?') reading = true; //found the ?, begin reading the info
 
        if(reading){
 
//schalten der Ausgänge
 
           switch (c) {
 
            case 'c':
            //add code here to trigger on 4
              digitalWrite(3, HIGH);
              break;
            case 'd':
            //add code here to trigger on 5
              digitalWrite(3, LOW);
              break;
            case 'e':
            //add code here to trigger on 6
              digitalWrite(4, HIGH);
              break;
            case 'f':
            //add code here to trigger on 7
              digitalWrite(4, LOW);
              break;
            case 'g':
            //add code here to trigger on 8
              digitalWrite(5, HIGH);
              break;
            case 'h':
            //add code here to trigger on 9
              digitalWrite(5, LOW);
              break;  
              case 'i':
            //add code here to trigger on 2
              digitalWrite(6, HIGH);
              break;
            case 'j':
            //add code here to trigger on 3
              digitalWrite(6, LOW);
              break;
            case 'k':
            //add code here to trigger on 4
              digitalWrite(7, HIGH);
              break;
            case 'l':
            //add code here to trigger on 5
              digitalWrite(7, LOW);
              break;
            case 'm':
            //add code here to trigger on 6
              digitalWrite(8, HIGH);
              break;
            case 'n':
            //add code here to trigger on 7
              digitalWrite(8, LOW);
              break;
            case 'o':
            //add code here to trigger on 8
              digitalWrite(9, LOW);
              break;
            case 'p':
            //add code here to trigger on 9
              digitalWrite(9, HIGH);
              break;
          }
 
        }
 
        if (c == '\n' &amp;&amp; currentLineIsBlank)  break;
 
        if (c == '\n') {
          currentLineIsBlank = true;
        }else if (c != '\r') {
          currentLineIsBlank = false;
        }
 
      }
    }
 
    delay(1); // pause für den Browser
    client.stop(); // Verbindung trennen
 
  } 
 
}
 

Da die Anforderung hier lediglich die Aufschaltung der vorhandenen TFE inkl. Endgeräte war und die vorhandenen Geräte wie der Loxone Miniserver, der Windows Rechner im Netzwerk und die Fritzbox benutzt werden konnten, musste lediglich in den Arduino und das dazugehörige Ethernetshield investiert werden - 20,- Euro.

Eine vorhandene Vivotek Kamera an der Hasutür wurde ebenfalls in dieses Projekt verbaut und eine vollwertige Türstation geschaffen. Ein ebenfalls vorhandenes iPad stellt die Loxone App zur Verfügung, über das unter Anderem die Türsteuerung läuft.

Link zu:

Agfeo TFE

3CX

Arduino