NodeMCU und TR-064 Schnittstelle Fritz!Box

Sooo,
ich hab den Sketch mal etwas umgebaut.
so wie ich das recherchiert habe, brauch ich die WiFiMulti nicht.Mein ich zumindest.

Klingeln will die Fritzbox aber immer noch nicht.

hat wer ne Idee?

//https://tttapa.github.io/ESP8266/Chap07%20-%20Wi-Fi%20Connections.html

#include <Arduino.h>
#include <ESP8266WiFi.h>        // Include the Wi-Fi library
//#include <ESP8266HTTPClient.h>
#include <tr064.h>
#define TASTER D3 

//Wifi network name (SSID) and WLAN-Password
const char* ssid = "FRITZ!Box xxxx"; 
const char* password = "yyyyyyyyyyyyyyyyyyy";

//The username and password you created for login (Anmeldung aus dem Heimnetz mit Benutzername und Passwort)
const char* fuser = "xxxx";
const char* fpass = "yyyyyyyyy";

//IP address of your router. This should be "192.168.178.1" for most FRITZ!Boxes
const char* IP = "192.168.178.1";

//Port of the API of your router. This should be 49000 for all TR-064 devices.
const int PORT = 49000;

TR064 connection(PORT, IP, fuser, fpass);

void setup() {
  Serial.begin(115200);         // Start the Serial communication to send messages to the computer
  delay(10);
  Serial.println('\n');
  
  WiFi.begin(ssid, password);             // Connect to the network
  Serial.print("Connecting to ");
  Serial.print(ssid); Serial.println(" ...");

  int i = 0;
  while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect
    delay(1000);
    Serial.print(++i); Serial.print(' ');
  }

  Serial.println('\n');
  Serial.println("Connection established!");  
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());         // Send the IP address of the ESP8266 to the computer
  delay(2000);
}
   
void loop() { 
int taste = digitalRead(TASTER);
if (digitalRead(TASTER)== LOW) 
{
  //USE_SERIAL.println();
  Serial.println();
  //USE_SERIAL.printf("Taste gedrueckt");
  Serial.println("Taste gedrueckt");
//  callWahlhilfe();
  Serial.println("Initialize TR-064 connection");
  delay(20000);
}
else
{
  //USE_SERIAL.println();
  Serial.println();
  //USE_SERIAL.printf("Taste nicht gedrueckt");
  Serial.println("Taste nicht gedrueckt");
  delay(50);   
  }
  
//delay(100);   
}


int callWahlhilfe() { 
 // Maybe the WLAN connection is lost, so testing an reconnect if needed
 //   if ((WiFiMulti.run() != WL_CONNECTED)) {
 //     WiFiMulti.addAP(wifi_ssid, wifi_password);
 //     while ((WiFiMulti.run() != WL_CONNECTED)) {
 //       delay(100);
 //     }
 //    }
  // (Re-) Initialize the TR-064 library - it is done every time, as maybe the connection has lost before
     
     connection.init();

  String params[][2] = {{"NewX_AVM-DE_PhoneNumber", "**610"}};
  //String params[][2] = {{"X_AVM-DE_DialNumber", "**701"}};
  String req[][2] = {{}};

  connection.action("urn:dslforum-org:service:X_VoIP:1", "X_AVM-DE_DialNumber", params, 1, req, 0);
}

Die ausdokumentierten Zeilen sind Versuche von mir bzw. Teile die ich rausgenommen habe.

Ich weiss z.Zt. nimmer weiter.

Ich vermute, Du bist der erste, der mit tr-064 hier arbeiten will.
Muss die Kurzwahl in der Box vorher eingerichtet werden - ich vermute ja.

Gruß Tommy

naja, einer muss ja der erste sein. bin ich aber bestimmt nicht.

ja, muss vorher eingerichtet werden, ist auch.
Und muss für externe Anwendungen frei geschaltet sein.
Gibts ein Häckchen für.
man kann ne ganze menge Kurzwahlen einrichten, ich weiss gerade nicht wieviel.

aber man kann dann irgendetwas als nebenstelle eintragen.

im einfachsten fall, als türklingel wo dann auch im display Türklingel steht.

oder was ich vorhabe, die WaMa im Keller anzapfen mit der "fertig Meldung" aufs Telefon zu bringen.
also Telefonbucheintrag dann **702 oder **703 (frei wählbar) "WaMa fertig".

sooo, melde Vollzug. Die Vorgestellte Software läuft, meine leider noch nicht.
Schein wohl so zu sein, das die WiFiMulti gebraucht wird. weiss aber nicht warum.

NodeMCU läuft und lässt auf Tastendruck die Telefone der Fritte bimmeln.

war auch wenig Tricky die Fritzbox drauf einzustellen.

Das einzige was z.Zt nicht will, ist die Anwahl über die Kurzwahl, also **70x.
Das löst bei mir , warum auch immer, eine SIPcall aus. Soll so nicht sein. Ich bleib aber dran.

Hab auch mal meine Handy Nr eingetragen. Wird auch braf angerufen.

Kurzwahl Problem auch gelöst.
Die Fritte mag wohl keinen Eintrag eines einzelnen Telefons in der Kurzwahl.
Eintrag**50 als DECT Rundruf oder **9 als Rundruf funzt.
Ok, bin zufrieden.

Heisst für mich: Kurzwahl z.B. **710 dient als Türklingel
**711 meldet mir WaMa fertig über die Fertig LED in der WaMa.

Da gibts bestimmt noch ne Menge weiteren Ideen.

An der Stelle, möchte ich mich beim Autor des Codes bedanken.

Prima, dass es funktioniert und danke für die Rückmeldung.

Gruß Tommy

hier nochmals zum nachbauen:

/**
 * caller.ino
 *  Oliver-André Urban
 * based on
 * home-indicator.ino
 *  by René Vollmer
 *  Example code for the home-indicator-project
 *  
 * many thanks to René for his TR-064 library 
 */

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <tr064.h>

//#define USE_SERIAL Serial

#define TASTER D3 
// Flash Taster - you can connect a seperate button to D3 or an opto-coupler 
// for example: use a resistor and an opto-coupler to connect to a doorbell

ESP8266WiFiMulti WiFiMulti;

//Put your router settings here

//Wifi network name (SSID) and WLAN-Password
const char* wifi_ssid = "xxxxxxxxxx"; 
const char* wifi_password = "yyyyyyyyyyyyyyyyyyy";

//The username and password you created for login (Anmeldung aus dem Heimnetz mit Benutzername und Passwort)
const char* fuser = "aaaaaaaa";
const char* fpass = "bbbbbbbbbbbb";

//IP address of your router. This should be "192.168.178.1" for most FRITZ!Boxes
const char* IP = "192.168.178.1";

//Port of the API of your router. This should be 49000 for all TR-064 devices.
const int PORT = 49000;

//Do not mess with these :)
//TR-064 connection
TR064 connection(PORT, IP, fuser, fpass);


void setup() {
 
  Serial.begin(115200);
  //Wait a few secs for warm-up (dunno why, was in the default code for http connections).
  delay(5000);
 
  //Connect to wifi
  WiFiMulti.addAP(wifi_ssid, wifi_password);

  //Wait for the wifi to connect
  while ((WiFiMulti.run() != WL_CONNECTED)) {
    delay(100);
  }
  pinMode(TASTER, INPUT); // Port as input
}

void loop() {
int taste = digitalRead(TASTER);
if (digitalRead(TASTER)== LOW) 
{
  
  Serial.println();
  Serial.println("Taste gedrückt");
  callWahlhilfe();
  delay(20000);
}
else
{
   Serial.println();
   Serial.println("Taste nicht gedrückt");
  delay(50);   
  }

}


void callWahlhilfe() {
 
 // Maybe the WLAN connection is lost, so testing an reconnect if needed
    if ((WiFiMulti.run() != WL_CONNECTED)) {
      WiFiMulti.addAP(wifi_ssid, wifi_password);
      while ((WiFiMulti.run() != WL_CONNECTED)) {
        delay(100);
      }
     }
  // (Re-) Initialize the TR-064 library - it is done every time, as maybe the connection has lost before
     connection.init();

  String params[][2] = {{"NewX_AVM-DE_PhoneNumber", "**777"}}; // kann jede Kurzwahl genommen werden
  String req[][2] = {{}};

  connection.action("urn:dslforum-org:service:X_VoIP:1", "X_AVM-DE_DialNumber", params, 1, req, 0);
}

viel Spass beim Basteln.

Aus ein paar Codeschnipseln hab ich mal selber was gebastelt, ohne WiFiMulti:

#include <Arduino.h>
#include <ESP8266WiFi.h>        // Include the Wi-Fi library
#include <ESP8266HTTPClient.h>
#include <tr064.h>
#define TASTER D3 

//WLAN Netzwerk Name (SSID) und WLAN-Password
const char* ssid = "xxxxxxxx"; 
const char* password = "yyyyyyyyyyyyyyyyyyyyyy";

//Anmeldung aus dem Heimnetz mit Benutzername und Passwort
const char* fuser = "aaaaaaaaaa";
const char* fpass = "bbbbbbbbbbbbbbbbb";

//IP Adresse fuer den Router: 
const char* IP = "192.168.178.1";

//Port of the API of your router. This should be 49000 for all TR-064 devices.
const int PORT = 49000;

TR064 connection(PORT, IP, fuser, fpass);

void setup() {
   Serial.begin(115200);         // Start the Serial communication to send messages to the computer
  delay(10);
   Serial.println('\n');
  
  WiFi.begin(ssid, password);             // Connect to the network
   Serial.print("Connecting to ");
   Serial.print(ssid); Serial.println(" ...");

  int i = 0;
  while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect
    delay(1000);
    Serial.print(++i); Serial.print(' ');
  }

   Serial.println('\n');
   Serial.println("WLAN Verbindung steht!");  
   Serial.print("IP address:\t");
   Serial.println(WiFi.localIP());         // Send the IP address of the ESP8266 to the computer
  delay(10000);
}
   
void loop() { 
int taste = digitalRead(TASTER);
if (digitalRead(TASTER)== LOW) 
{
   Serial.println();
   Serial.println("Taste gedrueckt");
  callWahlhilfe();
   Serial.println("Initialize TR-064 connection");
  delay(10000);
}
else
{
    Serial.println();
    Serial.println("Taste nicht gedrueckt");
  delay(50);   
  }
  
}

void callWahlhilfe() { 

      
     connection.init();

  String params[][2] = {{"NewX_AVM-DE_PhoneNumber", "**777"}};
  String req[][2] = {{}};

  connection.action("urn:dslforum-org:service:X_VoIP:1", "X_AVM-DE_DialNumber", params, 1, req, 0);
}

funzt genau so.

wenn man sich ein wenig mit dem TR-064 Protokoll der Fritz!Box beschäftig, kann man auf der Basis ne ganze Menge mehr Sachen machen.

Hi.

Ich bastel gerade eine ähnliches Projekt.
Laut der Seriellen Ausgabe wird der Ruf (auf **9,**50,**610) mit 200 bestätigt,
nur leider klingelt das Telefon nicht.

@garagenloeter was hast du in der Fritzbox noch eingestellt?

Gruß.

Hallo,

ich habe das laut c't 17-2018 auch probiert mit einem Wemos D1 mini.
Man muss die .ino konfigurieren laut seinen WLAN Gegebenheiten.
Und man muss die Fritzbox konfigurieren. Dazu gehört TR064 aktivieren und ein virtuelles Telefon einrichten.

Ich habe den ESP anfangs nicht in Sleep geschickt, sondern eine IP zuweisen lassen und diese festgenagelt. Damit sind Fritzbox und ESP bekannt gemacht.

Sketch für Batteriebetrieb - Funkklingel.
Reset löst die Klingel aus.

/*
  Wemos D1 mini
  c't 17-2018 Seite 142
  ct.de/ytg8

  ESP8266 Blink by Simon Peter
  Blink the blue LED on the ESP-01 module
  This example code is in the public domain

  The blue LED on the ESP-01 module is connected to GPIO1
  (which is also the TXD pin; so we cannot use Serial.print() at the same time)

  Note that this sketch uses LED_BUILTIN to find the pin with the internal LED  
*/

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <tr064.h>


const char WIFI_SSID[] = "WLAN-SSID-NAME";            // <-- ändern
const char WIFI_PASSWORD[] = "WLAN-KEY";              // <-- ändern
const char USER[] = "admin";                          // default, ggf. anpassen
const char PASSWORD[] = "xxx";                        // <-- ändern
const char FRITZBOX_IP[] = "192.168.178.1";           // default, ggf. anpassen
const int FRITZBOX_PORT = 49000;

TR064 connection(FRITZBOX_PORT, FRITZBOX_IP, USER, PASSWORD);

const IPAddress STATIC_IP(192, 168, 178, 88);         // feste IP vergeben, Connect ist schneller
const IPAddress GATEWAY(192, 168, 178, 1);            // default, ggf. anpassen
const IPAddress SUBNET(255, 255, 255, 0);             // default
const IPAddress DNS(GATEWAY);

const char DEVICE_NAME[] = "ESP-Klingel"; 


void setup() {
  
  WiFi.hostname(DEVICE_NAME);
  WiFi.config(STATIC_IP, SUBNET, GATEWAY, DNS);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  WiFi.mode(WIFI_STA);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(50);
  }
 
  connection.init();
  
  // Die Telefonnummer **9 ist der Fritzbox-Rundruf.
  String params[][2] = {{"NewX_AVM-DE_PhoneNumber", "**9"}};
 
  String req[][2] = {{}};
  String params1[][2] = {{}};
  connection.action("urn:dslforum-org:service:X_VoIP:1","X_AVM-DE_DialNumber", params, 1, req, 0);
 
  //Hier können Sie die Zeit, die das Telefon klingelt, in Millisekunden einstellen
  delay(4000);
 
  connection.action("urn:dslforum-org:service:X_VoIP:1","X_AVM-DE_DialHangup", params1, 1, req, 0);
 
  ESP.deepSleep(0);
}

void loop(){

}

Doc_Arduino:
Hallo,

ich habe das laut c't 17-2018 auch probiert mit einem Wemos D1 mini.
Man muss die .ino konfigurieren laut seinen WLAN Gegebenheiten.
Und man muss die Fritzbox konfigurieren. Dazu gehört TR064 aktivieren und ein virtuelles Telefon einrichten.

Ich habe den ESP anfangs nicht in Sleep geschickt, sondern eine IP zuweisen lassen und diese festgenagelt. Damit sind Fritzbox und ESP bekannt gemacht.

Sketch für Batteriebetrieb - Funkklingel.
Reset löst die Klingel aus.

Danke!!

Funktionierte auf anhieb mit einer FB 7580.

Ich habe dann noch bissel gespielt, mit Vorauswahl der zweiten Telefonnummer weiß man dann auch das es nicht die Holde ist die anruft.

String params[][2] = {{"NewX_AVM-DE_PhoneNumber", "*122#**702"}};

Vorauswahl für zweite Rufnummer und Kurzwahl für das Handy.

String params[][2] = {{"NewX_AVM-DE_PhoneNumber", "*122#0174*******"}};

Oder Vorauswahl für zweite Rufnummer und direkt die Nummer vom Klingelkasten.

Keine Ahnung ob ich das mal irgendwo verwende, aber gut zu wissen das es geht.

Gruß Fips

Danke für die schnelle Antwort.

Mein Code Schaut ganz ähnlich aus.
in deinem ist ein kleiner "Fehler" drin, der ESP bezieht seine IP trotz config per DHCP(zumindest bei mir). DNS muss vor SUBNET kommen. (war bei auch mir, nach etwas google dann den Fehler gefunden)

  WiFi.config(STATIC_IP, DNS, SUBNET, GATEWAY);

Habe meine Anleitung von hier: https://www.reichelt.de/magazin/how-to/smarte-tuerklingel/ ist quasi fast identisch.

Soweit ist bei mir auch alles korrekt, der ESP (auch ein Wemos D1 mini) meldet sich mit der Richtigen IP
an der FB an, auch mit DCHP, halt nur andere IP, funktioniert es nicht anders.

Die einzelenn Aktionen werden mit 200 quittiert.

Per Serieller Ausgabe bekomme ich das :

[HTTP] begin: 192.168.178.1:49000/upnp/control/wlanconfig1
<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Header><h:InitChallenge xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1"><UserID>ESPKlingel</UserID></h:InitChallenge ></s:Header><s:Body><u:GetGenericAssociatedDeviceInfo xmlns:u='urn:dslforum-org:service:WLANConfiguration:1'><NewAssociatedDeviceIndex>1</NewAssociatedDeviceIndex></u:GetGenericAssociatedDeviceInfo></s:Body></s:Envelope>
[HTTP] POST... SOAPACTION: urn:dslforum-org:service:WLANConfiguration:1#GetGenericAssociatedDeviceInfo
[HTTP] POST... code: 200
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Header>
<h:Challenge xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1">
<Status>Unauthenticated</Status>
<Nonce>xxxxxxxxxxxxxxxxxxxxxx</Nonce>
<Realm>F!Box SOAP-Auth</Realm>
</h:Challenge>
</s:Header>
<s:Body>
<s:Fault>
<faultcode>s:Client</faultcode>
<faultstring>UPnPError</faultstring>
<detail>
<UPnPError xmlns="urn:dslforum-org:control-1-0">
<errorCode>503</errorCode>
<errorDescription>Auth. failed</errorDescription>
</UPnPError>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>
Got the initial nonce: xxxxxxxxxxxxxxxxxxxxxx and the realm: F!Box SOAP-Auth
Your secret is is: ESPKlingel:F!Box SOAP-Auth:xxxxxxx
Your secret is hashed: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
action_3
action_1
The auth token is ###################################
[HTTP] begin: 192.168.178.1:49000/upnp/control/x_voip



<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Header><h:ClientAuth xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1"><Nonce>##################</Nonce><Auth>###################################</Auth><UserID>ESPKlingel</UserID><Realm>F!Box SOAP-Auth</Realm></h:ClientAuth></s:Header><s:Body><u:X_AVM-DE_DialNumber xmlns:u='urn:dslforum-org:service:X_VoIP:1'><NewX_AVM-DE_PhoneNumber>**9#0173xxxxxxx</NewX_AVM-DE_PhoneNumber></u:X_AVM-DE_DialNumber></s:Body></s:Envelope>



[HTTP] POST... SOAPACTION: urn:dslforum-org:service:X_VoIP:1#X_AVM-DE_DialNumber
[HTTP] POST... code: 200



<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Header>
<h:NextChallenge xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1">
<Status>Authenticated</Status>
<Nonce>xxxxxxxxxxxxxxxxxxxxx</Nonce>
<Realm>F!Box SOAP-Auth</Realm>
</h:NextChallenge>
</s:Header>
<s:Body>
<u:X_AVM-DE_DialNumberResponse xmlns:u="urn:dslforum-org:service:X_VoIP:1"></u:X_AVM-DE_DialNumberResponse>
</s:Body>
</s:Envelope>



action_3
action_1
The auth token is xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[HTTP] begin: 192.168.178.1:49000/upnp/control/x_voip



<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Header><h:ClientAuth xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1"><Nonce>xxxxxxxxxxxxxxxxxxx</Nonce><Auth>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</Auth><UserID>ESPKlingel</UserID><Realm>F!Box SOAP-Auth</Realm></h:ClientAuth></s:Header><s:Body><u:X_AVM-DE_DialHangup xmlns:u='urn:dslforum-org:service:X_VoIP:1'></u:X_AVM-DE_DialHangup></s:Body></s:Envelope>



[HTTP] POST... SOAPACTION: urn:dslforum-org:service:X_VoIP:1#X_AVM-DE_DialHangup
[HTTP] POST... code: 200



<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Header>
<h:NextChallenge xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1">
<Status>Authenticated</Status>
<Nonce>xxxxxxxxxxxxxxxxx</Nonce>
<Realm>F!Box SOAP-Auth</Realm>
</h:NextChallenge>
</s:Header>
<s:Body>
<u:X_AVM-DE_DialHangupResponse xmlns:u="urn:dslforum-org:service:X_VoIP:1"></u:X_AVM-DE_DialHangupResponse>
</s:Body>
</s:Envelope>

auffällig ist nur das:

<UPnPError xmlns="urn:dslforum-org:control-1-0">
<errorCode>503</errorCode>
<errorDescription>Auth. failed</errorDescription>
</UPnPError>

upnp ist aktiviert

In der FB habe ch nen extra Benutzer für den ESP angelegt, aber auch admin geht nicht.
Nen IP-Telefon mit dem benutzer lässt es auch nicht besser funktionieren.
auch das update auf das aktuelle Labor, keine Besserung.

Telefone klingeln nicht. :confused:

In der Arduino IDE habe ich die ESP Ver. 2.4.2 installiert

@Doc_Arduino: Was meinst mit Virtuelles Telefon einrichten?

Hat jemand nen Tipp?

Aeggsbaerde:
......nach etwas google dann den Fehler gefunden)

  WiFi.config(STATIC_IP, DNS, SUBNET, GATEWAY);

Irrtum!

In der Esp8266 Lib steht:

//ESP argument order is: ip, gateway, subnet, dns1

Gruß Fips

Danke für den Hinweis.
Ob STATIC_IP, DNS, SUBNET, GATEWAY oder STATIC_IP, GATEWAY, SUBNET, DNS

ist bei dem code erst mal egal wenn

const IPAddress GATEWAY(192, 168, 178, 1);
const IPAddress DNS(GATEWAY);

Fakt ist, dass
WiFi.config(STATIC_IP, SUBNET, GATEWAY, DNS);
nicht funktioniert und der ESP ne IP per DHCP zugewiesen bekomment.
Dieser Fehler ist bei Doc_Arduino wie auch bei Reichelt in meiner Anleitung
enthalten.

Hallo,

immer wieder schön - solche Antworten. :astonished: Behaupten es wäre etwas falsch aber bei einem selbst funktioniert es nicht. Da fehlt mir die Logik. Mach es doch einfach mal so wie man es machen muss. Weder c't noch Reichelt hat deine "richtige" Reihenfolge. Die Config erwartet die Parameter wie angegeben. Nicht wie man denkt. Welchen Zweck die statische IP hat steht im Kommentar und auch bei Reichelt im Text. Sinnlos ist das nicht und falsch erst recht nicht. Wenn du es falsch konfigurierst können wir nichts dafür. Das am Rande.

Virtuelles Telefon. Richte eins ein, Bsp. am "FON2". Kein VoIP einrichten. Dieses dann in der Wählhilfe auswählen und bestätigen. Dieser Name wird im Display angezeigt. Zumindestens bei mir. Fipsi hat das nochmal extra für sich angepasst. Bei mir ist es so das der Name nur angezeigt wird wenn es mindestens 2s klingelt - laut ESP Sketch delay.

Hallo,

immer wieder schön - solche Antworten. :astonished: Behaupten es wäre etwas falsch aber bei einem selbst funktioniert es nicht. Da fehlt mir die Logik. Mach es doch einfach mal so wie man es machen muss. Weder c't noch Reichelt hat deine "richtige" Reihenfolge. Die Config erwartet die Parameter wie angegeben. Nicht wie man denkt. Welchen Zweck die statische IP hat steht im Kommentar und auch bei Reichelt im Text. Sinnlos ist das nicht und falsch erst recht nicht. Wenn du es falsch konfigurierst können wir nichts dafür. Das am Rande.

Eben Bei Reichelt und CT ist Falsch (SUBNET gehört NICHT an 2. sondern an 3. Stelle).
Falsch configuriert bekommt der ESP die IP Dynamisch von der FB zugewiesen.

Ich wollte dir bestimmt nicht auf die Füße treten sonden dich lediglich darauf hinweisen.

In der Esp8266 Lib steht: //ESP argument order is: ip, gateway, subnet, dns1

Mit Anmeldung und IP vergabe habe ich auch keine Probleme, wobei die art der IP (dynamisch/statisch) auch keinen einfluß auf die Funktion an sich hat, nur das halt mit statischer IP schneller gehen soll.

Virtuelles Telefon. Richte eins ein, Bsp. am "FON2". Kein VoIP einrichten. Dieses dann in der Wählhilfe auswählen und bestätigen. Dieser Name wird im Display angezeigt. Zumindestens bei mir. Fipsi hat das nochmal extra für sich angepasst. Bei mir ist es so das der Name nur angezeigt wird wenn es mindestens 2s klingelt - laut ESP Sketch delay.

Danke das werde ich dann mal testen.

Danke! Jetzt funktioniert es.

Virtuelles analoges Telefon angelegt und das dann in der Wählhilfe eingetragen brachte den gewünschten Erfolg.

Gruß Äggsbärde

Hallo,

ich habe das jetzt mit verschiedenen Varianten probiert. Es funktioniert mit allen. :fearful:

WiFi.config(STATIC_IP, SUBNET, GATEWAY, DNS);    // laut c't, Reichelt
WiFi.config(STATIC_IP, GATEWAY, SUBNET, DNS);
WiFi.config(STATIC_IP, DNS, GATEWAY, SUBNET);

Da bin ich stutzig gewurden und habe mich auf die Suche begeben.
Hier steht noch nichts näheres dabei:

https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/station-class.html#config

Aber wenn man in den Libs wühlt, findet man irgendwann die "ESP8266WiFiSTA" .h und .cpp. Hier drin liegt das Geheimnis. C:\Users\Doc\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\libraries

// The argument order for ESP is not the same as for Arduino. However, there is compatibility code under the hood 
// to detect Arduino arg order, and handle it correctly. Be aware that the Arduino default value handling doesn't 
// work here (see Arduino docs for gway/subnet defaults). In other words: at least 3 args must always be given.
bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000);

bzw.

/**
 * Change IP configuration settings disabling the dhcp client
 * @param local_ip   Static ip configuration
 * @param gateway    Static gateway configuration
 * @param subnet     Static Subnet mask
 * @param dns1       Static DNS server 1
 * @param dns2       Static DNS server 2
 */
bool ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress arg1, IPAddress arg2, IPAddress arg3, IPAddress dns2) {

  if(!WiFi.enableSTA(true)) {
      return false;
  }

  //ESP argument order is: ip, gateway, subnet, dns1
  //Arduino arg order is:  ip, dns, gateway, subnet.

  //first, check whether dhcp should be used, which is when ip == 0 && gateway == 0 && subnet == 0.
  bool espOrderUseDHCP = (local_ip == 0U && arg1 == 0U && arg2 == 0U);
  bool arduinoOrderUseDHCP = (local_ip == 0U && arg2 == 0U && arg3 == 0U);
  if (espOrderUseDHCP || arduinoOrderUseDHCP) {
      _useStaticIp = false;
      wifi_station_dhcpc_start();
      return true;
  }

  //To allow compatibility, check first octet of 3rd arg. If 255, interpret as ESP order, otherwise Arduino order.
  IPAddress gateway = arg1;
  IPAddress subnet = arg2;
  IPAddress dns1 = arg3;

  if(subnet[0] != 255)
  {
    //octet is not 255 => interpret as Arduino order
    gateway = arg2;
    subnet = arg3[0] == 0 ? IPAddress(255,255,255,0) : arg3; //arg order is arduino and 4th arg not given => assign it arduino default
    dns1 = arg1;
  }

  //ip and gateway must be in the same subnet
  if((local_ip & subnet) != (gateway & subnet)) {
    return false;
  }

  struct ip_info info;
  info.ip.addr = static_cast<uint32_t>(local_ip);
  info.gw.addr = static_cast<uint32_t>(gateway);
  info.netmask.addr = static_cast<uint32_t>(subnet);

  wifi_station_dhcpc_stop();
  if(wifi_set_ip_info(STATION_IF, &info)) {
      _useStaticIp = true;
  } else {
      return false;
  }
  ip_addr_t d;

  if(dns1 != (uint32_t)0x00000000) {
      // Set DNS1-Server
      d.addr = static_cast<uint32_t>(dns1);
      dns_setserver(0, &d);
  }

  if(dns2 != (uint32_t)0x00000000) {
      // Set DNS2-Server
      d.addr = static_cast<uint32_t>(dns2);
      dns_setserver(1, &d);
  }

  return true;
}

Wenn ich das richtig verstehe prüfen die im Code an welcher Stelle die Subnet steht und entscheiden dann welcher Parameter was ist. Abhängig ob man in der Arduino IDE oder in der der von Espressif programmiert. Irgendwie so.

Einigen wir uns darauf - es gibt kein falsch oder richtig. Es gibt eine Erkennungsautomatik. :slight_smile:
Entschuldigung für meine kleine Überreaktion heute morgen. :confused:
Schön das es jetzt bei dir funktioniert. Das zählt. :wink:

Doc_Arduino:
Weder c't noch Reichelt hat deine "richtige" Reihenfolge. Die Config erwartet die Parameter wie angegeben. Nicht wie man denkt.

Aus Esp8266 Core Version 2.0.0

void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet)

Aus Esp8266 Core Version 2.3.0

bool ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1, IPAddress dns2) {

Aus Esp8266 Core Version 2.4.2

bool ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress arg1, IPAddress arg2, IPAddress arg3, IPAddress dns2) {

Workaround für Arduino aus Esp8266 Core Version 2.4.2

//Arduino arg order is:  ip, dns, gateway, subnet.

So wie ich das aus der Lib rauslese dürfte die Version von c't und Reichelt verkehrt sein.

WiFi.config(staticIP, subnet, gateway, dns);

Habs aber nie getestet. Da bei mir die Static IP von der FritzBox vergeben wird, die ist eh der Master die Interesiert es einen feuchten... welche Static IP im Code steht.

Gruß Fips

Hallo,

nochmal, es gibt hier kein explizit falsch oder richtig. An Hand der Parameter erkennt die Methode was was ist. Eben um die Kompatibilität beizubehalten. Falsch im Sinne wäre wenn der Sketch nicht funktioniert oder der Compiler schon meckert.

IP:
Ohne im Sketch eintragene Static IP wartet dein ESP bis er seine IP zugewiesen bekommt. Die IP im Sketch hat für diesen Sketch hier keine Funktion. Völlig ohne Bedeutung. Er bekommt seine IP weiterhin vom Router zugewiesen. Aber und das ist der Unterschied muss der ESP nicht auf seine IP warten, eben weil er sie nicht benötigt. Du kannst auch 88 eintragen und er bekommt 77 zugewiesen. Völlig ohne Bedeutung. Erst wenn du einen Sketch hast der die IP wirklich verwendet muss die stimmen. Dann würde sich sie aber vom Router immer zuweisen lassen.