WeMos D1 mini als WLAN-Sensor/-Aktor

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

segelwinni
Beiträge: 23
Registriert: 01.10.2015, 17:48

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von segelwinni » 09.01.2019, 13:13

Hallo TomT danke für die Antwort.
ich habe weiter oben im Sketch eine Variable deklariert.
String CCU_variable = "D1mini";
Wenn ich die Zeile von Dir einbinde, kommt die Meldung D!mini was not declared in this scope.
Als es dem Kapitän zu dumm wurde, lies er das ganze Schiff über Bord werfen.

PaulM
Beiträge: 319
Registriert: 16.02.2015, 17:05
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 129 Mal
Danksagung erhalten: 35 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von PaulM » 09.01.2019, 13:55

das sieht nach einem Vertipper oben aus:

D!mini

statt

D1mini
Mit Mut und Entschlossenheit gegen Intoleranz

segelwinni
Beiträge: 23
Registriert: 01.10.2015, 17:48

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von segelwinni » 09.01.2019, 14:12

Sorry - der Vertipper kam von mir - es heisst natürlich D1Mini was not declred.
Im Sketch ist aber alles richtig geschrieben und trotzdem der Fehler.
Als es dem Kapitän zu dumm wurde, lies er das ganze Schiff über Bord werfen.

Benutzeravatar
TomT
Beiträge: 565
Registriert: 19.11.2014, 15:13
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 4 Mal
Danksagung erhalten: 4 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von TomT » 10.01.2019, 07:20

Ok :-)
Wenn das der Variablenname ist, dann ist das natürlich klar.
Welche Arduino Version verwendest du?
Welche ESP 8266 Core Version?
Bekommst du beim Kompilieren irgendeinen Fehler angezeigt?

Poste auch zur Not mal den kompletten Code.

Grüße
Tom

segelwinni
Beiträge: 23
Registriert: 01.10.2015, 17:48

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von segelwinni » 10.01.2019, 08:58

Hallo Tom,
die Arduino-Version ist 1.8.8
Wie finde ich die Core-Version des ESP raus?
Vielen Dank im Voraus

Code: Alles auswählen

              /*
 *  WeMos-Schaltaktor (Prototyp)
 *  verbindet sich mit dem vorhandenen WLAN als Server
 *  Steuerung über HTTP-Befehle:
 *     "<IP-Adresse>" gibt eine Status- und Befehlsübersicht aus
 *     "<IP-Adresse>/aus" schaltet das Relais aus
 *     "<IP-Adresse>/ein" schaltet das Relais ein
 *     "<IP-Adresse>/status" gibt den Schaltzustand des Relais als Logikwert ("ein" oder "aus") zurück
 *     "<IP-Adresse>/toggle" toggelt den Schaltzustand des Relais 
 *  Getesteter Aufbau:
 *     WeMos D1 mini
 *     Relay Shield mini
 *     Pin-Belegung:
 *        D1: Steuerleitung Relais
 *  31.Januar 2016 —m.yoda
 */
include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
// ******* Netzwerkeinstellungen, bitte anpassen! *******
const char* ssid     = "XXX"; // SSID des vorhandenen WLANs
const char* password = "XXXXXXXXXX"; // Passwort für das vorhandene WLAN
IPAddress gateway(192,168,0,1); // IP-Adresse des WLAN-Gateways
IPAddress subnet(255,255,255,0);  // Subnetzmaske
IPAddress ip(192,168,0,70); // feste IP-Adresse für den WeMos
const char* host = "192.168.0.10"; // IP-Adresse der CCU (mit Punkten!)
ESP8266WebServer server(80); // Webserver initialisieren auf Port 80
String antwort = "";
String CCU_variable =  "D1mini";  // 
String Zustand; 
String meldung;
String zeitstempel() { // Betriebszeit als Stunde:Minute:Sekunde
  char stempel[10];
  int lfdStunden = millis()/3600000;
  int lfdMinuten = millis()/60000-lfdStunden*60;
  int lfdSekunden = millis()/1000-lfdStunden*3600-lfdMinuten*60;
  sprintf (stempel,"%03d:%02d:%02d", lfdStunden, lfdMinuten, lfdSekunden);
  return stempel;
}
///////////////////////////////////////   es klappt alles bis auf diesen Teil mit der Rückmeldung

void melde_CCU()
{ // Werte an die CCU melden
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) 
  {   return;  }
 Zustand = "----";
  if (digitalRead(D1) == HIGH)
   Zustand = "eingeschaltet";
   else
    Zustand = "ausgeschaltet";
  String url = "/xy.exe?antwort1=dom.GetObject('" + CCU_variable + "').State('" + Zustand + "')";
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
  "Host: " + host + "\r\n" +
  "Connection: close\r\n\r\n");
  delay(100);
}   

////////////////////////////////////////////////

void wurzel_behandlung() { // bei Aufruf des Root-Verzeichnisses
  String temp = zeitstempel();
  antwort = "WeMos Schaltaktor\n\n";
  if (digitalRead(D1) == HIGH)
    antwort = antwort + "Status: eingeschaltet\n";
  else
    antwort = antwort + "Status: ausgeschaltet\n";
  antwort = antwort + "Betriebszeit: " + temp + " (Std:Min:Sek)\n";
  antwort = antwort + "Verbunden mit: " + ssid + "\n";
  int rssi = WiFi.RSSI();
  antwort = antwort + "Signalstaerke: " + String(rssi) + " dBm\n\n";
  antwort = antwort + "HTTP-Befehlsuebersicht:\n";
  antwort = antwort + "\"<IP-Adresse>/toggle\" toggelt das Relais /n";
 
  antwort = antwort + "\"<IP-Adresse>/aus\" schaltet das Relais aus\n";
  antwort = antwort + "\"<IP-Adresse>/ein\" schaltet das Relais ein\n";
  antwort = antwort + "\"<IP-Adresse>/status\" gibt den Schaltzustand des\n  Relais als Logikwert (\"ein\" oder \"aus\") zurueck\n";
  server.send(300, "text/plain", antwort);
  delay(150);
  Serial.println(temp + " unspezifische HTTP-Anfrage");
}

void mach_an() {
  pinMode(D1, OUTPUT);
  digitalWrite(D1, HIGH);
  server.send(200, "text/plain", "WeMos-Schaltaktor ist eingeschaltet");
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP eingeschaltet");
}

void mach_aus() 
{
  pinMode(D1, OUTPUT);
  digitalWrite(D1, LOW);
  server.send(200, "text/plain", "WeMos-Schaltaktor ist ausgeschaltet");
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP ausgeschaltet");
}
void toggle_relais() 
{
    if (digitalRead(D1) == HIGH)
    { pinMode(D1, OUTPUT);
      digitalWrite(D1, LOW);
      server.send(200, "text/plain", "WeMos-Schaltaktor ist ausgeschaltet");
      delay(100);
      Serial.println(zeitstempel() + " ueber HTTP ausgeschaltet");
    }
    else
 {
  pinMode(D1, OUTPUT);
  digitalWrite(D1, HIGH);
  server.send(200, "text/plain", "WeMos-Schaltaktor ist eingeschaltet");
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP eingeschaltet");
 
 }
 
 melde_CCU;
 }


void melde_status() {
  String temp = zeitstempel();
  if (digitalRead(D1) == HIGH)
    antwort = "ein";
  else
    antwort = "aus";
  server.send(200, "text/plain", antwort);
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP Status gemeldet");
}

void setup() {
  pinMode(D1, OUTPUT); // Relais-Pin als Ausgang setzen
  
  // Seriellen Monitor für Kontrollausgaben öffnen
  Serial.begin(9600);
  Serial.println("");
  Serial.println("WeMos-Schaltaktor");
  
  // WLAN-Verbindung herstellen
  WiFi.config(ip, gateway, subnet); // auskommentieren, falls eine dynamische IP bezogen werden soll
  WiFi.begin(ssid, password);
  Serial.print("Verbindungsaufbau");

  // Verbindungsaufbau abwarten
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" erfolgreich!");
  Serial.println("");
  Serial.print("Verbunden mit: ");
  Serial.println(ssid);
  Serial.print("Signalstaerke: ");
  int rssi = WiFi.RSSI();
  Serial.print(rssi);
  Serial.println(" dBm");
  Serial.print("IP-Adresse: ");
  Serial.println(WiFi.localIP());
  Serial.println("");

  // HTTP-Anfragen bearbeiten
  server.on("/", wurzel_behandlung);
  server.on("/ein", mach_an);
  server.on("/aus", mach_aus);
  server.on("/status", melde_status);
  server.on("/toggle", toggle_relais);
  
  // HTTP-Server starten
  server.begin();
  Serial.println(zeitstempel() + " HTTP-Server gestartet");
}

void loop() {
  server.handleClient(); // auf HTTP-Anfragen warten
}
Als es dem Kapitän zu dumm wurde, lies er das ganze Schiff über Bord werfen.

Benutzeravatar
TomT
Beiträge: 565
Registriert: 19.11.2014, 15:13
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 4 Mal
Danksagung erhalten: 4 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von TomT » 10.01.2019, 10:29

8266 Core Version :
Menüleiste im Arduino IDE : Werkzeuge - BOARD : -> Boardverwalter... klicken
Oben im Fenster dann TYp ALLE und im Textfeld ESP8266 eingeben.
Dann zeigt er bei ESP8266 die installierte Version an...

Den Code schau ich mir später mal an....
EDIT
So, den Code mal gerade durch den Arduino 1.8.5 gejagt (ich verwende ESP Core 2.4.1)
und dein geposteter Code kann nicht so funktionieren ohne Fehler....
Ich bekomme ne Fehlermeldung, weil :

Code: Alles auswählen

error: 'include' does not name a type
 include <ESP8266WiFi.h>
Ich weiß zwar nicht, ob die die INCUDE Deklarationen in der neueren Arduino IDE geändert haben (glauben tue ich das allerdings nicht), aber ohne # davor gibt das keinen....

Na was solls....

Hast du mal versucht, den Webrequest per Hand in den Browser einzugeben?
Also den GET komplett mal ohne den ESP senden zu lassen, und klappt damit dann das Ändern der SysVar in der CCU?

Code: Alles auswählen

http://xxx.xxx.xxx.xxx/xy.exe?antwort1=dom.GetObject('D1mini').State('Test')
Ersetze xxx.xxxx.... mit der IP deiner CCU und wenn du den Link dann aufrufst, sollte in der SysVar "D1mini" der String "Test" drin stehen....


Grüße
Tom

segelwinni
Beiträge: 23
Registriert: 01.10.2015, 17:48

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von segelwinni » 10.01.2019, 11:32

Also:
ESP-Daten siehe Grafik
Wenn ich
mit meiner CPU-Adresse eingebe, kommt: 403 FORBIDDEN
Eine Frage zum allgemeinen Ablauf:
Wenn der Request schreibt: WeMos Schaltaktor ist eingeschaltet und ich gehe ja auf D1, dann müsste ich doch an D1 nach Ground ca. 3,3 Volt messen können?
Ich glaube ich verbrenne mein Diplom und werde Bäcker :x
Dateianhänge
ardu.png
Als es dem Kapitän zu dumm wurde, lies er das ganze Schiff über Bord werfen.

Benutzeravatar
TomT
Beiträge: 565
Registriert: 19.11.2014, 15:13
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 4 Mal
Danksagung erhalten: 4 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von TomT » 10.01.2019, 11:53

segelwinni hat geschrieben:
10.01.2019, 11:32
Wenn ich
mit meiner CPU-Adresse eingebe, kommt: 403 FORBIDDEN
OK :-)
Wenn auch das nicht funktioniert...
Deine CCU nimmt das Format so nicht, meine RASPIMATIC schon.
Kommen wir also der Sache näher.

Ich befürchte, es liegt an der CCU Firewall oder an deinem Netzwerkrouter...
Du lässt keinen Zugriff auf die exec auf der CCU zu.

Jetzt bin ich aber leider schon fast raus, weil meine Firmware noch aus Ende 2017 (Raspi 2.29.23 xxxx) stammt und ich keinen blassen Schimmer habe, ob da wirklich was am Zugriff auf die EXEC geändert wurde....

Jedenfalls musst du erst mal sehen, daß der Webrequest per Hand die CCU Variable ändert.
So lange wie das nicht funktioniert, macht ein Suchen in der ESP-Arduino Software keinen Sinn...
Wenn der Request schreibt: WeMos Schaltaktor ist eingeschaltet und ich gehe ja auf D1, dann müsste ich doch an D1 nach Ground ca. 3,3 Volt messen können?
Ja, der digital.write(D1, HIGH); schaltet den Ausgang D1 auf HIGH, also 3,3V...
LOW müsste dann 0V GND Potential haben.



UIUIUI :-) den Core 2.5.0 BETA2 zu nutzen .... Du bist aber mutig :lol:
Grüße
Tom

segelwinni
Beiträge: 23
Registriert: 01.10.2015, 17:48

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von segelwinni » 10.01.2019, 12:03

http://x.x.x.x:8181/xy.exe?antwort1=dom.GetObject(%27D1mini%27).State(%27Test%27)
Dann geht das Schreiben ! ! Es muss der Port 8181 mit übergeben werden.
Ich teste mal weiter.
Als es dem Kapitän zu dumm wurde, lies er das ganze Schiff über Bord werfen.

Benutzeravatar
TomT
Beiträge: 565
Registriert: 19.11.2014, 15:13
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 4 Mal
Danksagung erhalten: 4 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von TomT » 10.01.2019, 12:06

Dann ändere mal :

Code: Alles auswählen

void melde_CCU()
{ // Werte an die CCU melden
  WiFiClient client;
  const int httpPort = 80;
auf

Code: Alles auswählen

void melde_CCU()
{ // Werte an die CCU melden
  WiFiClient client;
  const int httpPort = 8181;

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“