Rollladensteuerung mit ESP01 für Schalterdoseneinbau

Begonnen von Papa Romeo, 12 Juni 2018, 18:43:52

Vorheriges Thema - Nächstes Thema

Gisbert

Hallo Papa Romeo,

nochmals vielen Dank für dieses tolle Projekt.

Ich kämpfe im Moment mit dem Sketch ESP01_Rollladen.ino und versuche zu verstehen, wie er funktioniert. Leider steige ich auch hier nicht durch.
Mein Ziel ist es, meine bestehenden Definitionen meiner Rollladendevices weiter zu nutzen, und weiterhin die Sketche, die derzeit auf Sonoff Dual-Geräten laufen.

Für den Automatisierungsteil (Befehle aus Fhem) zum hoch- und runterfahren, etc. ist es vglw. einfach; hier weiß ich, wie ich meinen Sketch ändern müsste, damit er mit deiner Hardware funktioniert.

Die Einbindung des mechanischen Rollladenschalters, und die Interaktion des mechanischen Schalters mit Fhembefehlen und vice versa verstehe ich jedoch gar nicht.
Deshalb möchte ich deinen Sketch benutzen, ihn aber leicht modifizieren, so dass ich meine bestehenden Definitionen in Fhem weiternutzen kann.

Kann das Aussicht auf Erfolg haben?
Da du schreibst, dass du die Sketche notgedrungen zum Testen deiner Projekte benötigst, möchte ich diese Frage auch an andere Mitleser und Bastler stellen.
Ich hätte die Fhem-Definition gerne in einem Device, und nicht in mehreren.
Falls jemand etwas funktionierendes hat, was er teilen möchte, dann bin ich interessiert.

Den Code, den ich bisher auf einem Sonoff Dual benutze:
/*
2-Channel-Relay with ESP8266 on Sonoff Dual

Basic MQTT example with Authentication
- connects to an MQTT server, providing username and password
- publishes to a topic
- subscribes to a topic
*/

#include <SPI.h>
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>


// Counters
unsigned long ulReqcount;
unsigned long ulReconncount;

// Create an instance of the server
// Specify the port to listen on as an argument
WiFiServer server(80);

// Time to wait when turning motor off or changing direction
// Recommended to allow motor capacitor to unload over motor coil
#define MOTORWAIT 300

// Time for direction relay to swtich before power is applied
// Recommended to avoid implicit switch of direction with power on
#define RELAISWAIT 200

// Duration of a motor event
#define EVENT 40000
unsigned long ulMotorEventEnd=0;  // end of current motor event

// Rollladen auf Lücke, von oben
unsigned int ZeitLuecke = 23600;

// Relaisschaltung
void switch_relay(byte b)
{
  if (0<=b && b<=2)
  {
    Serial.write(0xA0);
    Serial.write(0x04);
    Serial.write(b);
    Serial.write(0xA1);
    Serial.flush();
  }
}


const char* mqttServer = "192.168.xx.yy";
const int mqttPort = 1883;
const char* mqttUser = "user";
const char* mqttPassword = "password";

WiFiClient client;
PubSubClient MQTTclient(client);

// Topic für die Subskription der Fahrzeit des Rollladens auf Lücke
char* RollladenLuecke = "/Pub/Rollladen/Gisbert/Luecke";

// Topic für das Publishen des durchgeführten Fahrbefehls
char* RollladenPub = "/Sub/Rollladen/Gisbert";


void reconnect()
{
  while (!MQTTclient.connected())
  {
    Serial.println("Connecting to MQTT...");
    if (MQTTclient.connect("RollladenSchlafzimmerGisbert", mqttUser, mqttPassword))
      {
        Serial.println("connected");
        MQTTclient.publish(RollladenPub,"online");
        MQTTclient.subscribe(RollladenLuecke);
       
      } else
      {
        Serial.print("failed with state ");
        Serial.print(MQTTclient.state());
        delay(2000);
      }
  }
}


// Setup routine

void setup()
{
  ulReqcount=0;
  ulReconncount=0;

  Serial.begin(19200);
 
  // Switch off both relays
  switch_relay(0);
  delay(MOTORWAIT);

  WiFiManager wifiManager;
  wifiManager.autoConnect("AP_Roll_SZ_Gisbert", "configesp");
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  MQTTclient.setServer(mqttServer, mqttPort);
  MQTTclient.setCallback(callback);

  while (!MQTTclient.connected())
  {
    Serial.println("Connecting to MQTT...");
    if (MQTTclient.connect("RollladenSchlafzimmerGisbert", mqttUser, mqttPassword))
      {
        Serial.println("connected"); 
      } else
      {
        Serial.print("failed with state ");
        Serial.print(MQTTclient.state());
        delay(2000);
      }
  }
}


// handle message arrived
void callback(char* topic, byte* payload, unsigned int length)
{
  payload[length] = '\0';
  String sPayload = String((char *)payload);
  String sTopic = String(topic);
    if (sTopic == "/Pub/Rollladen/Gisbert/Luecke")
    {
      ZeitLuecke = sPayload.toInt();
    }
}


void loop()
{
  // Stop motor if required
  if (ulMotorEventEnd<millis())
  {   
    switch_relay(0);
    delay(MOTORWAIT);
  }
   
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client)
  {
    return;
  }
 
  // Wait until the client sends some data
  Serial.println("new client");
  unsigned long ULTIMEOUT = millis()+250;
  while(!client.available() && (millis()<ULTIMEOUT) )
  {
    delay(1);
  }
  if (millis()>ULTIMEOUT)
  {
    Serial.println("client connection time-out!");
    return;
  }
 
  // Read the first line of the request
  String sRequest = client.readStringUntil('\r');
  client.flush();
 
  if (sRequest=="")
  {
    Serial.println("empty request! - stopping client");
    client.stop();
    return;
  }

  if (!MQTTclient.connected())
  {
    reconnect();
  } 
  MQTTclient.loop();
  delay(10);

 
  // Get path; end of path is either space or ?
  // Syntax is e.g. GET /?pin=MOTOR1STOP HTTP/1.1
  String sPath="",sParam="", sCmd="";
  String sGetstart="GET ";
  int iStart,iEndSpace,iEndQuest;
  iStart = sRequest.indexOf(sGetstart);
  if (iStart>=0)
  {
    iStart+=+sGetstart.length();
    iEndSpace = sRequest.indexOf(" ",iStart);
    iEndQuest = sRequest.indexOf("?",iStart);
   
    // Are there parameters?
    if(iEndSpace>0)
    {
      if(iEndQuest>0)
      {
        // There are parameters
        sPath  = sRequest.substring(iStart,iEndQuest);
        sParam = sRequest.substring(iEndQuest,iEndSpace);
      }
      else
      {
        // NO parameters
        sPath  = sRequest.substring(iStart,iEndSpace);
      }
    }
  }
 
// Output command to serial so that we can read it on the Arduino

  if(sParam.length()>0)
  {
    int iEqu=sParam.indexOf("=");
    if(iEqu>=0)
    {
      sCmd = sParam.substring(iEqu+1,sParam.length());
      // Output to serial, which is connceted to the Arduino
      Serial.println(sCmd);
    }
  }
 
// Format the html response

  String sResponse,sHeader;
 
// 404 for non-matching path

  if(sPath!="/")
  {
    sResponse="<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>";

    sHeader  = "HTTP/1.1 404 Not found\r\n";
    sHeader += "Content-Length: ";
    sHeader += sResponse.length();
    sHeader += "\r\n";
    sHeader += "Content-Type: text/html\r\n";
    sHeader += "Connection: close\r\n";
    sHeader += "\r\n";
  }
 
  // Format the html page
 
  else
  {
    ulReqcount++;
    sResponse  = "<html><head><title>SZ.Gisbert</title></head><body>";
    sResponse += "<font color=\"#000000\"><body bgcolor=\"#d0d0f0\">";
    sResponse += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">";
    sResponse += "<h1>Rollladen Schlafzimmer Gisbert</h1>";
    sResponse += "<FONT SIZE=+2>";
    sResponse += "<p><a href=\"?pin=FunctionHoch\"><button>Hoch</button></a>&nbsp;<a href=\"?pin=FunctionStop\"><button>Stop</button></a>&nbsp;<a href=\"?pin=FunctionRunter\"><button>Runter</button></a>&nbsp;<a href=\"?pin=FunctionLuecke\"><button>L&uuml;cke</button></a></p>";

    // React on parameters

    if (sCmd.length()>0)
    {
      // Write received command to html page
      sResponse += "Kommando: " + sCmd + "<BR>";
     
        // Prepare relays - 230 Volt Schaltung Ein / Aus
        // Both relays off
        // switch_relay(0);
        // Relay 1 on
        // switch_relay(1);
        // Relay 2 on
        // switch_relay(2);
        // Both relays on - Das muss bei einer Rolladenschaltung unbedingt vermieden werden, da ansosnsten der Motor zerstört wird !!!
        // switch_relay(3);
        // Relais 1: Runterfahren
        // Relais 2: Hochfahren
             
      if(sCmd.indexOf("FunctionStop")>=0)
      {
        MQTTclient.publish(RollladenPub, "Stop");
        delay(10);
        switch_relay(0);
        ulMotorEventEnd=millis();
        MQTTclient.publish(RollladenPub, "Stop");
      }

      else if(sCmd.indexOf("FunctionRunter")>=0)
      {       
        MQTTclient.publish(RollladenPub, "Runter");
        delay(RELAISWAIT);       
        switch_relay(0);
        delay(MOTORWAIT);
        switch_relay(1);
        ulMotorEventEnd=millis()+EVENT;
        MQTTclient.publish(RollladenPub, "Runter");
      }

      else if(sCmd.indexOf("FunctionLuecke")>=0)
      {       
        MQTTclient.publish(RollladenPub, "L&uuml;cke");
        delay(RELAISWAIT);       
        switch_relay(0);
        delay(MOTORWAIT);
        switch_relay(1);
        ulMotorEventEnd=millis()+ZeitLuecke;
        MQTTclient.publish(RollladenPub, "L&uuml;cke");
      }

      else if(sCmd.indexOf("FunctionHoch")>=0)
      {
        MQTTclient.publish(RollladenPub, "Hoch");
        delay(RELAISWAIT);       
        switch_relay(0);       
        delay(MOTORWAIT);
        switch_relay(2);
        ulMotorEventEnd=millis()+EVENT;
        MQTTclient.publish(RollladenPub, "Hoch");
      }
    }

    sResponse += "<FONT SIZE=-2>";
    sResponse += "<BR>Aufrufz&auml;hler=";
    sResponse += ulReqcount;
    sResponse += " - Verbindungsz&auml;hler=";
    sResponse += ulReconncount;
    sResponse += "<BR>";
    sResponse += "Aktueller Stand<BR>";
    sResponse += "</body></html>";
   
    sHeader  = "HTTP/1.1 200 OK\r\n";
    sHeader += "Content-Length: ";
    sHeader += sResponse.length();
    sHeader += "\r\n";
    sHeader += "Content-Type: text/html\r\n";
    sHeader += "Connection: close\r\n";
    sHeader += "\r\n";
  }


  // Send the response to the client
  client.print(sHeader);
  client.print(sResponse);
  client.stop();

  Serial.println("Client disonnected");
}


Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

riker1

Zitat von: Papa Romeo am 30 Juni 2018, 21:53:19
Hallo Gisbert,

sorry hab deinen Post, vor dem wegen den Relais, völlig überlesen.

Also:

Platinen:               Ich schick dir einen Link, wo ich die Platinen bestellt habe. Dort musst du dann die "shutter.zip" hochladen, Bestellung bestätigen, zahlen...und gut is

Gruß

Papa Romeo

Hallo

wäre auch an dem link für die Platinen interessiert:-)
Danke
FHEM    5.26.1 Ubuntu 18, FHEM    5.26.1 RPI 3 , Actoren: IT ,Tasmota, ESPEasy,
MAX CUBE, MAX HT, MAX WT, Selbstbau nanoCULs, FS 20,Tasmota, Homematic, FTK, SW. DIM, Smoke,KODI,Squeezebox

Gisbert

#77
Hallo,

ich versuche vergeblich den Sketch für die Rollladensteuerung in Betrieb zu nehmen.

Nach dem Flashen taucht der ESP im Wlan auf, ich gehe deshalb davon aus, dass das Flashen mit der Arduino-Software in Ordnung war.
Außerdem habe ich als Test einen einfachen WifiScan-Sketch auf den ESP geflasht, um zu sehen, ob der in Ordnung ist, ist er, d.h. die umliegenden SSIDs kommen rein.

Mein Problem ist, dass ich in Fhem für MQTT einen User und ein Password gesetzt habe.
Der in diesem Thread vorgestellte Sketch hat das aber nicht eingebaut. Ich hab's versucht einzubauen, so wie es bei meinen anderen Geräten/Sketchen nachweislich funktioniert, leider hier ohne Erfolg.
Mit mqttfx lausche ich, ob etwas hereinkommt. Wenn ich auf "#" subskribiere, dann kommen alle Meldungen von allen Geräten rein, jedoch nicht die vom ESP-01 für die Rollladensteuerung.

Deshalb meine Frage: hat jemand den Rollladensketch mit Credentials für MQTT zum Laufen gebracht und lässt mich an seinen Erkenntnissen teilhaben?

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

lewej

Hallo zusammen,

hat jemand schon die Platinen in einer 60er Kaiserdose verbaut? Ich denke gerade nach ob es nicht besser wäre die Lötpunkte durch ein Gehäuse aus dem 3d Drucker zu schützen.

Hat jemand schon in die Richtung gezeichnet?

Gruss

Papa Romeo

Meddie hatte mal was für den Intelligenten Wechselschalter vor....die Platinen sind ja von dem Ummassen her gleich.
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

Papa Romeo

@riker1: ...sorry...hab deinen Post überlesen. 

Hier der Link für die Platinenherstellung: https://jlcpcb.com/
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

lewej

#81
Hallo,

@Papa, muss auf der zwei Schichtigenplatine auch eine Drahtbrücke gesetzt werden? Da wo die roten Pfeile eingezeichnet sind?

Und bei verwendung vom AMS1117, ist das richtig, das auf der Platine der mittlere Pin nicht gelötet wird?


Papa Romeo

Hallo lewej,

auf der doppelseitigen Platine brauchst du keine Brücken mehr löten und der mittlere Anschluss des AMS bleibt frei. Die große Lötfahne gegenüber entspricht dem gleichen Potential.
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

Gisbert

Hallo Papa Romeo,
hallo Forumsmitglieder,

ich versuche mich daran Tasmota auf dem ESP01 zum Laufen zu bringen.
Was funktioniert, ist die Anbindung an Fhem und das Schalten über Rules.

Was nicht funktioniert, ist die Vorortbetätigung über einen Drehschalter (ähnlich wie im beigefügten Bild).
Die GPIO-Belegung in Tasmota sieht wie folgt aus:
Switch1  GPIO2
Switch2  GPIO1
Relais1   GPIO0
Relais2   GPIO3

Wenn ich den Drehschalter betätige, dann wird jeweils ein Relais geschaltet, in Nullstellung sind beide Relais aus.
Wegen der Verschaltung Relais1 (Strom an/aus) und Relais2 (rauf/runter) wird bei Stellung Switch2 gar nichts geschaltet und bei Stellung Switch1 entweder rauf oder runter, je nachdem wie Relais2 gerade steht.
Ich hoffe, ich hab's einigermßen verständlich ausgedrückt. Damit ist keine Vorortbedienung möglich.

Dann ist da noch die Frage nach Pullup-Widerständen, um zu vemeiden, dass dauernd Strom gezogen wird.
Wie sieht das in Tasmota aus?

Meine Frage lautet deshalb:
Hat jemand das Projekt Rollladensteuerung mit Tasmota realisiert und kann mir weiterhelfen?

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

lewej

Zitat von: Papa Romeo am 13 Juli 2018, 10:03:35
...die "Doppelseitigen" Platinen sind Gestern gekommen....

Hallo Papa R..,

ich hab hier die doppelseitige Platine, die Bohrungen/Lötpunkte für
Den HLK-PM01 passen nicht ganz, die liegen ca. 2-3mm zu nah.
In der Antwort 6 hängt ja das Shutter.zip, ist das dort auch noch so?

Ps: die Abstände für die Relais stimmen auf meiner Platine

Ich würde gerne neue Platinen ordern.

Gruss

riker1

Hallo
ich benötige auch einige Platinen....

gibt es eine Sammelbestellung?
FHEM    5.26.1 Ubuntu 18, FHEM    5.26.1 RPI 3 , Actoren: IT ,Tasmota, ESPEasy,
MAX CUBE, MAX HT, MAX WT, Selbstbau nanoCULs, FS 20,Tasmota, Homematic, FTK, SW. DIM, Smoke,KODI,Squeezebox

riker1

Hallo
nochmal ne generelle Frage hierzu.

Gibt es da noch die Probleme mit dem Puya chip?

FHEM    5.26.1 Ubuntu 18, FHEM    5.26.1 RPI 3 , Actoren: IT ,Tasmota, ESPEasy,
MAX CUBE, MAX HT, MAX WT, Selbstbau nanoCULs, FS 20,Tasmota, Homematic, FTK, SW. DIM, Smoke,KODI,Squeezebox

Papa Romeo

@lewej: Die Löcher wo der HLK reinkommt einfach mit 1,5 mm aufbohren, dann geht er leichter rein.

Ob ich das in der Shutter.zip in Antwort 6 schon behoben hatte weiß ich nicht mehr, aber ich habe diese Datei soeben durch die aktuelle Datei ersetzt und da passen dann die Löcher.
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

Papa Romeo

@Gisbert: Dass du das Rollladenmodul mit Tasmota so zu laufen bekommst wie mit dem dafür geschrieben Sketch bezweifle ich. Ich denke mit den ganzen Taster/Schalter-Routinen und Abfragen sowie den Positionsbestimmungen, wird sich Tasmota schwer tun diese abzubilden.
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

Gisbert

#89
Hallo Papa Romeo,

Zitat von: Papa Romeo am 02 November 2018, 12:20:06
@Gisbert: Dass du das Rollladenmodul mit Tasmota so zu laufen bekommst wie mit dem dafür geschrieben Sketch bezweifle ich. Ich denke mit den ganzen Taster/Schalter-Routinen und Abfragen sowie den Positionsbestimmungen, wird sich Tasmota schwer tun diese abzubilden.

Ich gebe dir ja Recht.

Mein Problem ist, dass ich in Fhem Credentials für MQTT benutze; dein Sketch sieht das aber nicht vor. Ohne die Credentials kommt keine Kommunikation zwischen Fhem und dem ESP zustande.
Während des Schreibens fällt mir ein, dass ich einen weiteren Broker ohne Credentials definieren könnte, falls Fhem das zulässt.
Ich probier das aus, obwohl es mir lieber wäre, diesen Minimalschutz aufrechtzuhalten.

Viele​ Grüße​ Gisbert​

PS:
Während des Schreibens fällt mir ein, dass ich einen weiteren Broker ohne Credentials definieren könnte, falls Fhem das zulässt.
Das funktioniert leider nicht.
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome