FHEM Forum

FHEM - Hausautomations-Systeme => Sonstige Systeme => Thema gestartet von: cpramhofer am 11 August 2018, 20:03:43

Titel: ELERO Unidirektional (VarioTel Plus)
Beitrag von: cpramhofer am 11 August 2018, 20:03:43
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
Titel: Antw:ELERO Unidirektional (VarioTel Plus)
Beitrag von: Billy am 11 August 2018, 20:46:10
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. :)
Titel: Antw:ELERO Unidirektional (VarioTel Plus)
Beitrag von: tomi_cc16 am 09 September 2018, 04:43:02
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
Titel: Antw:ELERO Unidirektional (VarioTel Plus)
Beitrag von: Billy am 09 September 2018, 11:13:25
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 (https://forum.fhem.de/index.php/topic,36041.msg298170.html#msg298170)

Mir erscheint die Lösung mit dem ESP32 allerdings moderner.
Titel: Antw:ELERO Unidirektional (VarioTel Plus)
Beitrag von: dschmitt am 12 August 2020, 20:00:29
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
Titel: Antw:ELERO Unidirektional (VarioTel Plus)
Beitrag von: nissty am 03 Oktober 2020, 13:11:18
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
Titel: Antw:ELERO Unidirektional (VarioTel Plus)
Beitrag von: DonMarcello am 09 April 2022, 12:33:10
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:


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

Besten Dank im Voraus!