ELERO Unidirektional (VarioTel Plus)

Begonnen von cpramhofer, 11 August 2018, 20:03:43

Vorheriges Thema - Nächstes Thema

cpramhofer

Liebes Forum,

nachdem es mich seit langem verfolgt wie ich meine unidirektionalen Elero Rollläden in FHEM integrieren kann habe ich mich einer Inspiration von @Billy dazu entschlossen eine Lösung mit ESP32 und einem zusätzlichen Handsender zu bauen.

Nachdem ich selbst überrascht war von der Einfachheit der Lösung (genau 8 Lötpunkte, keine zusätzliche Hardware) und das Problem hier scheinbar mehrere Personen haben möchte ich meinen Code mit euch teilen:

Das ganze arbeitet bis jetzt sehr stabil da auch der aktuelle Kanal abgefragt wird und dadurch auch bei ausfällen keine falschen Jalousien angesteuert werden.
Wichtig ist den Status der LEDs genau an den Punkten vor dem Widerstand abzugreifen damit der Pegel korrekt erkannt wird.

Was wird benötigt:
1x VarioTel Plus Handsender (Nr. 28 250.0001) (gebraucht um ca. 50€)
1x ESP32 WROOM Dev Board (ca. 10€)
1x Ladestecker (ca. 5€)
8x FF Schaltdraht (oder normaler Schaltdraht)



ESP32 Code:
Man könnte sicher an der ein oder anderen Stelle noch etwas optimieren.
Ich habe mich von der Architektur aber bewusst für diese etwas unelegante Variante entschieden da man so die einzelnen Rollos mit minimalem Aufwand in FHEM ansprechen kann.
#include <WiFi.h>
#include <Wire.h>
#include <PubSubClient.h>
#include <String.h>

#define LED1 2

const char* ssid = "XXXXXXX";
const char* password = "XXXXXXX";

//const char* MQTT_HOST = "m23.cloudmqtt.com"; // Achtung: bei reconnect des Modems kommt es einmal täglich zu ausfällen
//const char* MQTT_USER = "XXXXXX";
//const char* MQTT_PWD = "XXXXXXXX";
//const int MQTT_PORT = 10681;

//const char* MQTT_HOST = "XXXXXXXXXX.com"; // Achtung: bei reconnect des Modems kommt es einmal täglich zu ausfällen
const char* MQTT_HOST = "XXX.X.X.XXX";
const char* MQTT_USER = "XXXXXXXXX";
const char* MQTT_PWD = "XXXXXXX";
const int MQTT_PORT = 1883;

const char* MQTT_CLIENT_ID = "XXXXXXXX_9132_Rollo";

const char* MQTT_Topic = "/XXXXXXX/Rollo/#";
const char*  MQTT_Topic_Alle = "/XXXXXXX/Rollo/Alle/set";
const char*  MQTT_Topic_Christoph_Tuer = "/XXXXXXXX/Rollo/Christoph_Tuer/set";
const char*  MQTT_Topic_Christoph_Fenster = "/XXXXXXX/Rollo/Christoph_Fenster/set";
const char*  MQTT_Topic_Isabella_Tuer = "/XXXXXXX/Rollo/Isabella_Tuer/set";
const char*  MQTT_Topic_Isabella_Fenster = "/XXXXXX/Rollo/Isabella_Fenster/set";
const char*  MQTT_Topic_Buero_Fenster = "/XXXXXXXX/Rollo/Buero_Fenster/set";

const int selPin =  23;          // D1
const int upPin =  22;           // D2
const int stopPin =  19;         // D3
const int downPin =  18;         // D4

const int channel1LedPin =  36;  // D0
const int channel2LedPin =  39;  // D5
const int channel3LedPin =  34;  // D6
const int channel4LedPin =  35;  // D7
const int channel5LedPin =  32;  // D8

WiFiClient net;
PubSubClient client(net);

void setup()
{
  Serial.begin(115200);
  WIFI_connect();
  client.setServer(MQTT_HOST, MQTT_PORT);
  client.setCallback(MQTT_callback);

  pinMode(LED1, OUTPUT);
  pinMode(selPin, OUTPUT);
  pinMode(upPin, OUTPUT);
  pinMode(stopPin, OUTPUT);
  pinMode(downPin, OUTPUT);

  digitalWrite(LED1, LOW);
  digitalWrite(selPin, HIGH);
  digitalWrite(upPin, HIGH);
  digitalWrite(stopPin, HIGH);
  digitalWrite(downPin, HIGH);


  pinMode(channel1LedPin, INPUT);
  pinMode(channel2LedPin, INPUT);
  pinMode(channel3LedPin, INPUT);
  pinMode(channel4LedPin, INPUT);
  pinMode(channel5LedPin, INPUT);
}

void loop() {

  if (!client.connected()) {
    MQTT_connect();
  }
  client.loop();

}


int getChannel()
{
  int channel = -1;
  int val1 = 0;
  int val2 = 0;
  int val3 = 0;
  int val4 = 0;
  int val5 = 0;     
   
  val1 = digitalRead(channel1LedPin);
  val2 = digitalRead(channel2LedPin);
  val3 = digitalRead(channel3LedPin);
  val4 = digitalRead(channel4LedPin);   
  val5 = digitalRead(channel5LedPin);

  if((val1 == 1) && (val2 == 1) && (val3 == 1) && (val4 == 1) && (val5 == 1)) {
    pressChannel();
    delay(100);

    val1 = digitalRead(channel1LedPin);
    val2 = digitalRead(channel2LedPin);
    val3 = digitalRead(channel3LedPin);
    val4 = digitalRead(channel4LedPin);   
    val5 = digitalRead(channel5LedPin);   
  }

  Serial.print("1: "); 
  Serial.println(val1); 
  Serial.print("2: "); 
  Serial.println(val2);
  Serial.print("3: "); 
  Serial.println(val3);   
  Serial.print("4: "); 
  Serial.println(val4);
  Serial.print("5: "); 
  Serial.println(val5);

  if((val1 == 0) && (val2 == 0) && (val3 == 0) && (val4 == 0) && (val5 == 0)) {
    channel = 0;
  }
  else {
    if (val1 == 0)  channel = 1;
    if (val2 == 0)  channel = 2;
    if (val3 == 0)  channel = 3;
    if (val4 == 0)  channel = 4;
    if (val5 == 0)  channel = 5;           
  }

  Serial.print("Channel: "); 
  Serial.println(channel);
  return channel;
}


void setChannel(int channel) {
  while(channel != getChannel()) {
        pressChannel();
  }
}

void pressUp()
{
  Serial.print("Do Keypress UP...");
  digitalWrite(upPin, HIGH);
  delay(50);   
  digitalWrite(upPin, LOW);
  delay(300);   
  digitalWrite(upPin, HIGH);
  Serial.println("...done!"); 
}

void pressStop()
{
  Serial.print("Do Keypress Stop...");
  digitalWrite(stopPin, HIGH);
  delay(50);   
  digitalWrite(stopPin, LOW);
  delay(300);   
  digitalWrite(stopPin, HIGH);
  Serial.println("...done!"); 
}

void pressDown()
{
  Serial.print("Do Keypress Down...");
  digitalWrite(downPin, HIGH);
  delay(50);   
  digitalWrite(downPin, LOW);
  delay(300);   
  digitalWrite(downPin, HIGH);
  Serial.println("...done!"); 
}

void pressChannel()
{
  Serial.print("Do Keypress Channel...");
  digitalWrite(selPin, HIGH);
  delay(50);     
  digitalWrite(selPin, LOW);
  delay(300);   
  digitalWrite(selPin, HIGH);
  Serial.println("...done!"); 
}

void WIFI_connect(void) {

    delay(10);

    // We start by connecting to a WiFi network

    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected.");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
}

void MQTT_connect(void) {
  int retry = 0;
   
  // FIRE UP MQTT
  // Loop until we're reconnected
  while (!client.connected() && (retry < 5)) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(MQTT_CLIENT_ID, MQTT_USER, MQTT_PWD)) {
      Serial.println("connected");
      client.subscribe(MQTT_Topic);     
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 60 seconds before retrying
      delay(10000);
    }
    retry=retry+1;
  }
}

void MQTT_Publish(const char* topic, float value)
{
  char payload[8];


  // build up MQTT Connection
  if (!client.connected()) {
    MQTT_connect();
  }
  client.loop();

  if(value != -100)
  {
    dtostrf (value, -6,2, payload); 
    client.publish(topic, payload);
    Serial.print(topic);
    Serial.print("\t\t");
    Serial.println(value); 
  }
  else
  {
    Serial.print(topic);
    Serial.print("\t\t");
    Serial.println("invalid value; stopped publishing"); 
  }
}

void MQTT_callback(char* topic, byte* payload, unsigned int length)
{
  char msg[length];
  String strTopic(topic);

  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.println("] ");

  for (int i = 0; i < length; i++) {
    msg[i] = (char)payload[i];
  }

  if(strTopic == MQTT_Topic_Alle) setChannel(0);
  if(strTopic == MQTT_Topic_Christoph_Tuer) setChannel(1);
  if(strTopic == MQTT_Topic_Christoph_Fenster) setChannel(2);
  if(strTopic == MQTT_Topic_Isabella_Tuer) setChannel(3);
  if(strTopic == MQTT_Topic_Isabella_Fenster) setChannel(4);
  if(strTopic == MQTT_Topic_Buero_Fenster) setChannel(5);
   
  if(msg[0] == 'U') pressUp(); 
  if(msg[0] == 'S') pressStop(); 
  if(msg[0] == 'D') pressDown();   

}


Fhem Config
define Mosquitto MQTT XX.X.X.XXX:1883
attr Mosquitto room 94_Netzwerk

define Rollo.Christoph.Fenster MQTT_DEVICE
attr Rollo.Christoph.Fenster IODev Mosquitto
attr Rollo.Christoph.Fenster alias Rollo Christoph Fenster
attr Rollo.Christoph.Fenster group Rollo
attr Rollo.Christoph.Fenster icon fts_shutter
attr Rollo.Christoph.Fenster publishSet Up Stop Down /XXXXXXX/Rollo/Christoph_Fenster/set
attr Rollo.Christoph.Fenster room 50_SZ_Christoph
attr Rollo.Christoph.Fenster stateFormat -
attr Rollo.Christoph.Fenster webCmd Up:Stop:Down

Billy

#1
Gratuliere, gut gelöst. :)

Vermute dass das aber nur für eine rein Unidirektionale Verwendung geht?
Ich habe bei mir inzwischen ca. 70/30 %  Uni und Bidirektional.
Muss mal schauen ob das auch für eine VarioTel2 geht?
Aber die Idee ist gut, da du auch noch die Dioden abfragst wenn ich das auf die Schnelle richtig
verstanden habe.

Gruß Billy

So sieht übrigens meine aktuelle Lösung aus.
Ist absolut stabil. :)
FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

tomi_cc16

Sehr interessant aber ich habe leider keine Erfahrungen mit dem ESP32.
Wo ich mir unsicher bin ob es auch damit dem HM-MOD-Re-8 gehen würde?

https://www.elv.de/homematic-8-kanal-empfangsmodul.html

Billy

Zitat von: tomi_cc16 am 09 September 2018, 04:43:02
Wo ich mir unsicher bin ob es auch damit dem HM-MOD-Re-8 gehen würde?
Hier gibt es eine Lösung mit 8-fach homatic aktor (HM-MOD-Re-8)
https://forum.fhem.de/index.php/topic,36041.msg298170.html#msg298170

Mir erscheint die Lösung mit dem ESP32 allerdings moderner.
FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

dschmitt

Hi, vielen Dank für den Code. Funktioniert bei mir tadelos.

Wäre es machbar, das jemand von euch noch ein automatischen WLAN Reconnect einbaut?

Merci

nissty

Hi, super Lösung!! dich ich gerne nachbauen möchte.
Hast du noch ein genaueres Bild von der Belegung am ESP32?

Danke und Grüße

DonMarcello

Hallo zusammen,

auch ich bin ein leidgeplagter der seine unidirektionalen Elero-Rollos nicht ins Smart Home bekommt und froh, dass ich diesen relativ alten Thread gefunden habe, den ich ausgraben möchte  :)

Die Lösung möchte ich angehen und die Frage von nissty aufgreifen: Könnte vielleicht jemand die Belegung des ESP32 und evtl. die vom Handsender nachreichen? Das wäre echt klasse.

Ich habe zwar Grundkenntnisse im programmieren, jedoch habe ich keine Erfahrung mit der Programmierung von GPIOS an Arduinos und Co. Nach Recherche im Internet habe ich folgendes ESP32 Dev Board gefunden:

https://www.az-delivery.de/products/esp32-developmentboard

Hierzu ein paar Fragen:


  • Kann ich dieses für den beschriebenen Code verwenden?
  • Nach meinem Verständnis definiert die Codezeile const int channel2LedPin =  39; den PIN 39. Das Board im Link hat so wie ich das sehe gar keinen Pin 39. Was übersehe ich?
  • Welche Funktion hat der const int selPin =  23;? Bezogen auf das sel.
  • Wie viele Handsender könnte ich mit einem ESP32 Board denn steuern? Ich habe insgesamt 5 Rollos die ich unterbringen müsste. Bzgl. Stromversorung würde ich die Batterie nutzen und nicht den ESP32 anzapfen

Wäre klasse wenn jemand hier unterstützen könnte.

Besten Dank im Voraus!