Autor Thema: ELERO Unidirektional (VarioTel Plus)  (Gelesen 592 mal)

Offline cpramhofer

  • Jr. Member
  • **
  • Beiträge: 55
ELERO Unidirektional (VarioTel Plus)
« 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

Offline Billy

  • Hero Member
  • *****
  • Beiträge: 1081
Antw:ELERO Unidirektional (VarioTel Plus)
« Antwort #1 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. :)
« Letzte Änderung: 11 August 2018, 21:34:27 von Billy »
FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink 13x PCA 301;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 1x KFM100, 3x HM-LC-SW1-PL2, ESP8266, Sonoff, Mqtt*

Offline tomi_cc16

  • New Member
  • *
  • Beiträge: 8
Antw:ELERO Unidirektional (VarioTel Plus)
« Antwort #2 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

Offline Billy

  • Hero Member
  • *****
  • Beiträge: 1081
Antw:ELERO Unidirektional (VarioTel Plus)
« Antwort #3 am: 09 September 2018, 11:13:25 »
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 13x PCA 301;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 1x KFM100, 3x HM-LC-SW1-PL2, ESP8266, Sonoff, Mqtt*

 

decade-submarginal