Funk & WLAN Markisensteuerung mit ESP8266 und Arduino

Wir haben an unserem Haus zwei elektrische Markisen angebaut. Dabei handelt es sich um eine klassische Markise auf einer Terassenüberdachung. Dazu kommt eine zweite, senkrechte Markise, um Nachmittags und Abends die Sonne wegzuhalten. Für diese beiden Markisen habe ich mit einer ESP8266 & Arduino Kombination eine Steuerung gebaut, die per WLAN und 433MHz Funkfernbedienung ansprechbar ist. Das Konzept ist auch für elektrische Rolladen verwendbar.

Für die Ansteuerung der nötigen Relais kommt ein Arduino Nano zum Einsatz. Dieser bietet genügend Ausgänge. Weiterhin habe ich einen Empfänger für den 433MHz an den Arduino angeschlossen. Ein ESP8266 dient als WLAN Interface und stellt einen Webserver bereit. Der ESP8266 könnte im Prinzip auch die gesamte Steuerung vornehmen. Die üblichen, günstigen ESP8266 Boards bieten aber nur 2 Ein/Ausgangspins. Durch die Kombination des Arduinos mit dem ESP8266 bekommen wir genügend Pins. Beide Mikrocontroller sind bei ebay für jeweils unter 3 Euro zu bekommen.

Steuerung der Markisen mit einem Relaisboard & Arduino
Markisen wie auch Rolladen werden typischerweise durch zwei Anschlüsse für die Phase angesteuert. Ganz trivial: einmal einfahren, einmal ausfahren. Meistens sind die Kabel dafür schwarz und braun (dazu blau für die Erde und grün/gelb für die Schutzerde).
Die beiden Phasen darf man nicht gleichzeitig anschließen. Da es sich häufig um Konsensatormotoren handelt, darf man mehrere Motoren auch nicht parallel an einen Schalter anschließen. Die Gründe dazu findet man leicht per Suchmaschine. Ich erwähne es hier nur kurz als Randbedingung des Designs.

Wir wollen als 3 Zustände schalten können:
1. Beide Phasen stromlos.
2. Braune Phase angeschlossen.
3. Schwarze Phase angeschlossen.
Das bestromen beider Phasen soll ausgeschlossen sein. Weiterhin muss im Code vermieden werden, dass die Motorrichtung direkt gewechselt wird. In diesem Fall liegt auf dem Motorkondensator noch Spannung an. Eine Umpolung kann dann die Relais überlasten.

Die einfachste Variante zur Lösung ist die Steuerung eines Motors mit Hilfe von zwei Relais. Dabei schaltet Relais 1 die Phase und Relais 2 die Richtung. Relais 2 muss als ein Umschalter sein. Die Relais werden wie folgt verschaltet:
Markisensteuerung_Relaisboard
Man kann ein passendes Relaisboard selbst bauen. Über ebay kann man ein passendes Board mit 8 Relais für ca. 7 Euro inkl. Versand bekommen. Dafür lohnt sich ein Selbstbau nicht. 4 Relais bleiben frei und können für künftige Erweiterungen genutzt werden (z.B. Licht).
Die entsprechenden Relaisboards sind mit Treibertransistoren, Freilaufdioden und Optokopplern ausgerüstet und können direkt an einen Arduino angeschlossen werden. Zu beachten ist eigentlich nur, dass die Relais typischerweise auf 0V/low am Eingang schalten.
Markise_Relaisboard
Im konkreten Fall habe ich die 8 Eingänge des Relaisboards an die Arduino Pins A0..A7 angeschlossen.

433 MHz Empfänger für die Funkfernbedienung
Für die Ansteuerung mit einem 433 MHz Sender habe ich den zuvor in einem anderen Beitrag beschriebenen Funkwandschalter verwendet (klick). Es sollten die meisten 433MHz Funkwandschalter funktionieren. Ebenso die meisten Fernbedienungen von Funksteckdosen.
1_Multi Comfort FSS-2

Update 20.09.2015:
Als Empfänger hatte ich zunächste einen der vielen 433MHz Empfänger verwendet, die unter der Bezeichnung „433 MHz Empfänger für Arduino“ angeboten werden. Solche Empfänger findet man ab 1 Euro bei ebay. Ich musste lernen, dass der ESP8266 auf kurze Distanz zuviel Störungen in den 433MHz Empfänger einstreut. Deshalb habe ich den Empfänger gegen einen Empfänger des Typs RXB12 (basierend auf einem SYN470R Chip) ersetzt. Dieser Emfänger ist ein Superhet und kann die Störungen des naheliegenden ESP sehr gut herausfiltern. Entsprechende Empfänger gibt es für ca. 1.50€ bei ebay. Die Pinbelegung beider Empfänger ist gleich.

Für diese Art von Empfängern gibt es die Arduino Library RCSwitch. Der Datenpin des Empfängers muss an einen interrupt-fähigen Pin angeschlossen werden. Deshalb habe ich Pin D2 gewählt. Die Stromversorgung erfolgt über den Arduino mit 5V.

ESP8266 für WLAN & Webserver
In diesem Projekt habe ich den ESP8266 als kleinen Webserver analog zu diesem Beispiel programmiert (klick). Die Webseite des ESP8266 ist unter http://markise/ erreichbar oder alternativ unter der IP, die der ESP im Netzwerk bekommt. Für die beiden Markisen werden die Knöpfe „einfahren“, „stop“ und „ausfahren“ angeboten.
Markise_Webinterface
Ein Druck auf den jeweiligen Knopf erzeugt eine Ausgabe auf der seriellen Schnittstelle, z.B. „MOTOR1STOP“. Diese seriellen Ausgaben werden auf dem Arduino eingelesen und damit die Ausgänge entsprechend geschaltet.
Beim elektrischen Anschluss ist zu beachten, dass der ESP8266 nur mit 3.3V läuft. Deshalb wird zunächst eine Versordungsspannung von 3.3V mit Hilfe eines LM1117 3.3V hergestellt. Da der ESP8266 über sehr kurze Zeiträume bis zu 200mA ziehen kann, habe ich noch einen Elko verbaut.
Für die serielle Schnittstelle habe ich die Softserial Library auf dem Arduino verwendet. Diese funktioniert bei 9600 Baud zuverlässig. Auf diese Weise bleibt die Möglichkeit erhalten, auf der USB Schnittstelle (verwendet die Hardware basierte serielle Schnittstelle) für Debug Zwecke weiter zu verwenden. Die Arduino Pins D3 und D4 werden für die Verwendung mit Softserial konfiguriert. Weiterhin kann über den Arduino Pin D5 ein Reset des ESP8266 ausgelöst werden.
Um die Signale zwischen Arduino (5V) und ESP8266 (3.3V) zu konvertieren, kann man einen Levelshifter nehmen. Es geht aber auch ganz trivial per Spannungsteiler (siehe Schaltplan). Der TX Pin des ESP8266 geht direkt an den Arduino; 3.3V langen für ein high aus. Der RX Pin wird ebenso wie der Reset-Pin über einen Spannungsteiler an den Arduino angeschlossen.

Schaltplan
Der gesamte Schaltplan ergibt sich somit wie folgt. Das Relaisboard wird über ein 10-poliges Kabel angeschlossen.
Markisensteuerung
Auf dem Relaisboard steuern Relais 1 (an/aus) & Relais 2 (Richtung) den Motor der ersten Markise. Relais 3&4 steuern die zweite Markise (Verkabelung siehe oben).

Software
Die Softwarelösung besteht aus zwei Teilen: 1x Arduino, 1x ESP8266
Wie schon beschrieben orientiert sich die Lösung für den ESP8266 stark an dem Beispiel, das ich vor einigen Wochen gepostet habe (klick). Sie wird mit Hilfe einer erweiterten Arduino IDE auf den ESP8266 programmiert. Das entsprechende Vorgehen habe ich hier beschrieben (klick). Wer den Code verwenden möchte, muss vor der Benutzung noch SSID und Passwort des WLANs eintragen, in das sich die Markisensteuerung verbinden soll.

Die Arduino Software besteht im wesentlichen aus 3 Teilen:
1. Einlesen von Kommandos von der Softserial Schnittstelle
2. Einlesen von Kommandos von dem 433MHz Empfänger.
3. Steuern der Relais/Motoren in die richtige Richtung schalten und nach 2 Minuten wieder abschalten. Dann sollte die Markise am jeweiligen Endschalter angekommen sein.

Die Codes für die 433 MHz Fernbedienung müssen im Arduino Sourcecode eingetragen werden. Am einfachsten ist es, die gesendeten Codes mit dem seriellen Monitor in der Arduino IDE mitzuloggen und dann in den Sourcecode einzutragen. Wer den 433MHz Teil nicht einbauen will, kann diesen Sourcecodeteil einfach ignorieren.

Die Sourcecodes stehen hier zum Download bereit: Sourcecode Markisensteuerung

Stromversorgung
Die Stromversorgung erfolgt einfach über den USB Port des Arduino. Alternativ kann man auch 5V direkt auf den Vin Pin geben. Ich habe ein altes Handy Ladegerät verwendet. Um dem Stromverbrauch der Relais Rechnung zu tragen, sollte ein Relais mit einer Belastbarkeit von 1000mA zum Einsatz kommen.

Einbau in einen Gehäuse
Für die nötige Außenmontage habe ich im Baumarkt einen großen IP54 Schaltkasten gekauft (ca. 8€). In diesen Schaltkasten habe ich mittels zwei Sperrholzbrettchen 3 Ebenen erzeugt. Der gesamte Aufbau sieht dann wie folgt aus.

Hauptplatine ohne Arduino/ESP8266 (der LM1117 sitzt auf der Rückseite). Der zusätzliche Platinenstreifen hat keine elektrische Funktion. Er dient nur als Distanzhalter für den Einbau.
Markise_Platine_leer

Hauptplatine mit Arduino/ESP8266 und 433MHz Empfänger:
Markise_Platine_gesamt

Das Gehäuse:
Markise_Gehaeuse_BM

Bestücktes Gehäuse vor der Montage:
Markise_Gehaeuse

P.S.: Eine Integration in fhem ist problemlos möglich. Falls das Probleme bereitet, hinterlasst einen Kommentar. Die Ansteuerung klappt dann auch mit der passenden Android App andFHEM.

72 Gedanken zu „Funk & WLAN Markisensteuerung mit ESP8266 und Arduino

  1. Stephan Janßen

    Hallo. Interessantes Projekt. Meine Frage. Gibt es mittlerweile ein Projekt für eine Markiesensteuerung via Funk?
    Ich habe Simu Handsender für Somfy Funkmotoren. Frequenz ist 433,42 Mhz.

    Ich würde gerne alle Aussenjalusien über mein Tab mit einer dem entsprechnenden Benutzeroberfläche einzel oder gesammt auf und zu fahren können. Gruss

    Antworten
    1. ST Artikelautor

      Out of the box gibt es da meines Wissens keine Lösung. Hier wären zwei Denkrichtungen dazu:

      1. Die Motoren direkt ansteuern:
      Soweit ich weiss (ich bin kein Somfy Experte) können die Funkmotoren auch ganz normal angesteuert werden. Wenn dem bei den Somfys auch so ist, wäre das Projekt direkt applikabel.

      2. WLAN auf 433 MHz umsetzen
      Man könnte die Schaltung auch so abändern, dass ein 433MHz Sender gesteuert wird. Dann stellt sich die Frage, ob die Somfy Sender Wechselcodes verwenden oder ob sie mit der Arduino 433MHz Lib angesteuert werden können. Falls es keine Wechselcodes sind würde es in diese Richtung hier gehen:
      http://www.arduino-tutor.de/funksteckdosen-heimsteuerung/
      https://blog.thesen.eu/433mhz-und-rfid-sniffer-auf-arduino-basis/

      Falls es Wechselcodes sind, müßte man wohl zusätzliche Somfy Handsender kaufen und so umbasteln, dass sie von einem Arduino angesteuert werden können. Etwas ähnliches habe ich in dem Codeschloss Projekt gemacht:
      https://blog.thesen.eu/teil-1-rfid-codeschloss-fuer-den-keymatic-abus-funk-tuerschlossantrieb-ersatz-fuer-km300-cac-cft-1000/

      Gruss Stefan

      Antworten
  2. David

    Hi,

    warum nimmst du für den ESP nicht die 3,3V Stromversorgung vom Arduino? Mit dem Elko unterstütz. Dann kannst du den Stepdown weglassen. Ich betreibe den ESP nur darüber. Es funktioniert sehr gut.

    Ein bauteil weniger… 🙂

    Antworten
  3. David

    Hi,

    danke für die gute Projektbeschreibung! Das ist alles sehr gut und einfach erklärt. Und insteriert mich für einige eigene Ideen.

    Eine Frage: Schaltet die Markiese automatisch ab wenn sie aus-/eingefahren ist? Kann ich die Relais immer für eine Bestimmte zeit angezogen lassen um sicherzugehen das die Markiese eingefahren ist?

    Gut Arbeit,
    David

    Antworten
    1. ST Artikelautor

      Hallo David,

      danke für das Lob. Der Code schaltet die Markisen in dem Beispiel hier nach 2 Minuten ab. Es gibt dazu im Arduino Code den #define EVENT_MS.

      Gruss Stefan

      Antworten
      1. David

        Also kann man die Relais angezogen lassen und die Markiese schaltet bei Anschag automatisch ab.

        Weißt du welche Spannungen geschaltet werden müssen muss und wie viel last? Ich hab überlegt solid state Relais zu verwenden.

        Und ob man die anliegende Spannung auch als Stromversorgung nutzen könnte.

        Antworten
        1. ST Artikelautor

          Hallo David,

          die Markisen, die ich kenne haben alle Endschalter. Das heißt Du kannst sie mit manuellen Schaltern nicht fehlbedienen. Die Endschalter schalten ab. Die kommerziellen Steuerungen lassen entweder die jeweilige Richtung (ein/ausfahren) dauerhaft stehen. Oder sie nehmen nach 2-3 Minuten den Strom weg; so wie dieses Projekt.
          Du musst bei Markisenmotoren mit einem relativ hohen Blindstromanteil rechnen. Es werden Kondensatormotoren verwendet, da diese bürstenfrei sind. Bedenke dies bei Solid State Relais. Ich sehe für Solid States aber offen gesagt keinen Grund. Nimm z.B. Relais für 250V/10A. Das dürfte lange halten.
          Als Spannung wird in aktuellen Systemen 230V Wechselstrom verwendet. Falls bei Dir irgendeine Kleinspannung verwendet wird (24V o.ä.), kannst Du Dich prinzipiell daran klemmen. Du musst die Spannung aber stabilisieren und Herunterregeln. Wenn Dir das alles nix sagt, dann nimm lieber ein 5V 1A Handynetzteil.

          Gruss Stefan

          Antworten
    1. ST Artikelautor

      HI Daniel,

      über das Webinterface stoppst Du die Markisen/Rollos durch den „Stop“-Button. Wenn Du die Markise/Rollo über einen 433MHz Funkschalter fährst und Du drückst auf oder ab für diesen Motor während der Fahrt, so hält der Motor an.

      Im Code:
      // drive motor
      // motor already running? – then stop
      if (iMotorState[ii]!=MOTOR_STOP)
      {
      SetMotor(ii,MOTOR_STOP);
      }
      else if (ij==0) { SetMotor(ii,MOTOR_UP); }
      else if (ij==1) { SetMotor(ii,MOTOR_DOWN); }

      Gruss Stefan

      Antworten
  4. Daniel

    Hallo Stefan,
    Wie Trage ich hier meinen RF Code ein?
    Wenn mein Code so aussieht: 0F0F0FFFFF 0F F0

    // define RF receiver codes – place your codes here, if you want 433MHz support

    RFCode[0][0]=123456701; // left switch off
    RFCode[1][0]=123456702; // right switch off
    RFCode[0][1]=123456703; // left switch on
    RFCode[1][1]=123456704; // right switch on

    Gruß Daniel

    Antworten
    1. ST Artikelautor

      Hallo Daniel,

      wo hast Du denn den Code her? – Man kann die Codes in unterschiedlichen Formaten notieren. Das sieht aus wie eine Elro Notation bei der jemand statt 1 ein F geschrieben hat und die abschließenden zwei 2er Blöcke das An- und das Auskommando sind. Mein Tipp: Schau einfach in den seriellen Log der Markisensteuerung und Du bekommst alle empfangenen Codes angezeigt. Dann sendest Du und trägst den richtigen Code ein. Somit brauchst Du über Codeumwandlungen etc nicht nachzudenken.

      Gruss Stefan

      Antworten
  5. Daniel

    Hallo,
    Ja das ist ein Elro Code der vom Cul in Fhem geloggt worden ist.
    Danke für den tip mit dem auslesen. Kann sie aber erst ausprobieren wenn meine Hardware aus China da ist. Wenn dann noch Probleme oder Fragen auftauchen melde ich mich nochmal.
    Gruß Daniel

    Antworten
  6. ST

    HI Daniel,

    das wird schon klappen. Wenn Du näher in die Codeformate einsteigen willst, suche mal nach „elro Code Umrechner“ im Netz. In meinem Code Beispiel für den 433MHz Sniffer habe ich ein Stück Code drin, der prüft, ob es sich bei dem empfangenen Rohcode um einen Elro Code handelt und diesen in eine Elrokodierung umrechnet. Du bräuchtest dazu die Umkehrlogik.
    Irgendwann haben mich die ganzen Code Umrechnungen genervt und dann habe ich den Sniffer gebaut. Und deshalb habe ich auch in der Markisensteuerung eingebaut, dass jeder empfange Code auf die Serielle geloggt wird.

    Gruss Stefan

    Antworten
  7. Daniel

    Hi Stefan,

    Habe hier noch ein Arduino Uno gefunden. Den wollte ich jetzt mit deiner Software flashen, aber ich bekomme folgende fehlermeldung :
    Arduino: 1.6.7 (Windows 10), Board: „Arduino/Genuino Uno“

    D:\Markise_Source\Markise_Source\Arduino\Markisensteuerung\Markisensteuerung.ino:24:22: fatal error: RCSwitch.h: No such file or directory

    #include

    ^

    compilation terminated.

    exit status 1
    Fehler beim Kompilieren.

    Gruß Daniel

    Antworten
    1. ST Artikelautor

      Du musst die RCSwitch Library installieren. Google einfach mal nach RCSwitch. Die Library ist auf github.com verfügbar.

      Antworten
  8. Daniel

    Hi Stefan,
    habe ein Problem bei der Ansteuerung per FHEM. Ich benutze einen nanoCUL 433MHZ mit dem ich super meine IT Funksteckdosen schalten kann. Nur der Arduino empfängt kein Signal , mit der Fernbedienung geht es problemlos. Hast du vielleicht eine Idee was das sein kann?
    Gruß Daniel

    Antworten
    1. Dominik

      Hi Stefan,

      beim stöbern im Netz zum Thema Rolladensteuerung mit fhem habe ich deinen interessanten blog gefunden.

      Da die Kabel meiner Rolladenmotoren alle unmittelbar neben meinem Raspberry Pi aus der Wand kommen werden stelle ich mir die Frage ob es überhaupt nötig ist per Arduino zu steuern – ich kann das Relais-Board ja direkt an die Gpio´s des Raspi anschließen. Spricht da aus deiner Sicht etwas dagegen?

      Grüße
      Dominik

      Antworten
      1. ST Artikelautor

        Geht, kein Problem. Habe ich auch schon gemacht. Die typischen Relaisboards kommen mit 3.3V Signalpegel klar. Einfach beim Pi an 5V und GND und einen Gpio. WiringPi installieren und los geht’s.

        Antworten
        1. Dominik

          Klasse, dann bin ich ja doch nicht komplett auf dem Holzweg. Fhem ist neu für mich..und bei ungefähr 5000 verschiedenen Möglichkeiten…

          Darüber hast Du nicht zufällig einen Blog-Eintrag geschrieben?

          Bin nun schon soweit das ich die Relais über das Webinterface einzeln schalten kann – nun versuche ich mal die Logik einzubauen. Wobei ich momentan noch am „EventMap“ scheitere 🙂

          Gruß

          Antworten
  9. Rob

    Hallo Stefan,

    vielen Dank für diesen tollen Code. Ich habe für ein Beleuchtungsprojekt mit dem ESP8266 eine stabile Webserver Vorlage gesucht, grade weil ich mit der Webserver-Klasse und HTML überhaupt nicht vertraut bin. Hab das ganze Copy,Cut&Paste ein paar Ansprüchen anpassen können und bin bisher super zufrieden!

    Einen Tipp zum Arduino- die kleinen Boards können nur um die 20mA pro GPIO- laut dem undurchsichtigen Angaben von SainSmart zum Relais-Board werden die bei der Ansteuerung der Relais bereits erreicht.

    Ich hab den tatsächlichen Strom noch nicht nachgemessen, da meine Relais noch in der Post sind- sollte es aber wirklich so viel sein könnte der yC bei Ansteuerung von mehreren Relais gleichzeitig überhitzen.
    Mehrere GPIOs sind da immer auf einen Power-In zusammengefasst, der Summenstrom könnte da auch gefährlich hoch werden. Deshalb habe ich ein Arduino Mega 2560 verwendet, welches via I2C mit dem ESP8266 spricht.

    Grüße nach Bayern!

    Antworten
    1. ST Artikelautor

      Hallo Rob,

      prima, dass Du mit dem Code weiter gekommen bist. Der Strombedarf auf dem Steuerpin eines SainSmart Relaisboards wundert mich. Ich kenne das konkrete Relaisboard nicht. Die typischen 5V Relaisboards mit Optokoppler liegen unter 1mA auf dem Steuerpin. Da besteht keinerlei Gefahr. Das Relaisboard selbst hat einen höheren Strombedarf. Ich würde mal auf 20-30mA pro Relais tippen. Das muss die Stromversorgung mit abdecken. Der ESP merkt dann davon nichts weiter.

      Gruss Stefan

      Antworten
      1. Rob

        Im Prinzip sehen die SainSmart Boards aus wie jedes andere Relais Board auch. Ich vermute fast, das die alle von demselben Band kommen.

        „5V 8-Channel Relay interface board, and each one needs 15-20mA Driver Current“ kopiert von:
        http://www.sainsmart.com/8-channel-dc-5v-relay-module-for-arduino-pic-arm-dsp-avr-msp430-ttl-logic.html

        Weiterhin entnehme ich aus dem Datenblatt:
        „Power Supply: 5VDC/ 400mA (relay all ON)“

        Nun, 400mA/8 wären 50mA pro Relais wenn alle angezogen wären. Deswegen vermute ich das die 15-20mA zum Optokoppler gehören (nur eine Vermutung!). Ich kann leider zur Zeit nicht nachmessen, die Relais liegen noch beim Zoll. Für ein absolut ineffizientes Leuchtmittel könnte das aber hinkommen?

        Letzten Endes liefert das MEGA-Board alles was es braucht. 5VDC-DC mit ausreichend Kapazität, 3.3V Spannungsregler den man für den ESP anzapfen kann und ne Menge „robuster“ GPIOs- der Einfachheit halber hab ich den dann genommen. Wenn man natürlich noch kompakter bauen kann kommt ein Nano oder Mini mit in die Dose..

        Grüße, Robin

        Antworten
        1. Rob

          Kleiner Nachtrag: Mir ist aufgefallen, das Optokoppler und eine Status-LED auf dem Board in Reihe geschaltet sind, d.H. yC-Pin muss beide versorgen. Das könnte natürlich auch noch für Durchsatz sorgen. Nützt alles nichts, ich messe mal nach wenn das Board eingetroffen ist

          Antworten
          1. ST Artikelautor

            Hallo Rob,

            ich habe mal bei meinen Relaisboards nachgemessen. Deine Sorgen sind unbegründet – jedenfalls bei meinen 3 getesteten Relaisboards.
            Die Boards schalten das Relais auf low durch und sind als Standard high. Zwischen GND und dem Steuerpin fließen bei den 3 Relaisboards: 970Mikro(!)Ampere , 4mA und 5mA.
            Der in der Sainsmart Anleitung angegebene Driver Current ist nicht der Strom des Steuerpins. Es ist offenbar der Strom, den das Board braucht, um das Relais anzutreiben. Weiterhin scheint es doch erstaunlich große Unterschiede in zwischen den Relaisboards zu geben.

            Gruss Stefan

  10. Markus

    Hallo, ich habe ein Frage. Wie wird verhindert das beide Relais gleichzeitig anziehen?
    Ich habe aktuell das Problem das beim einschalten des ESP (habe keine Arduino dran)
    die Relais beide kurz angehen.

    Lieben Dank Markus

    Antworten
  11. Markus

    Und mich würde noch interessieren ob man auch nur mit dem ESP auskommt, also ohne Arduino um nur einen Motor zu steuern.

    Lieben dank Markus

    Antworten
    1. ST

      Hallo Markus,

      die Antwort lautet wohl: im Prinzip ja
      Du kannst mit dem ESP direkt Relais steuern und mit einem ESP12 hast Du auch genug GPIOs. Allerdings musst Du die beiden Codeteile von Arduino und ESP zusammenbringen. Das ist nicht unmöglich aber im Detail etwas aufwändiger.
      Ich nehme hier den ESP als Webserver, der mit dem Arduino per serieller Schnittstelle spricht. Der ESP kann sich also völlig auf sein Webserver-Dasein bzw Frontend konzentrieren. Der Arduino agiert im Prinzip wie ein Backend-Prozess und steuer die Motoren & hat die Statemachine. Man kann das alles auf eine singlethreaded CPU bringen. Du musst die Codes dann aber so umbauen, dass beispielsweise während eines WIFI Connects nicht die Statemachine der Motorsteuerung außer Kraft gesetzt wird oder keine 433MHz Codes mehr Empfangen werden können. Ebenso hast Du im Webserver Code Warteschleifen.

      Also: Möglich = ja. Wenn ich ein kommerzielles Produkt realisieren wollte und jeden Euro COGS zweimal umdrehen müsste, dann würde ich es tun. Als Privatprojekt kostet mich ein Arduino Nano 2,50€ on top und der Code ist einfacher und bug-freier 🙂

      Gruss Stefan

      Antworten
      1. Markus

        Hey Stefan, danke für diese tolle Antwort mit Erklärung. Das ist heutzutage nicht mehr selbstverständlich.
        Ich bin aktuell dabei meinen alten FS20 Kram zu entsorgen. Den 433 Mhz Kram brauche ich eigentlich nicht und ich möchte es möglichst klein und einfach haben.
        Der ESP8266-01 mit 2GPIOs schaltet auch schon die Relais so weit, die Nacht war kurz 😉
        Gruß und Dank Markus

        Antworten
      2. Markus

        Hey Stefan, ich nochmal. Kannst du bitte einmal erklären wie du die Markisen Steuerung in FHEM integriert hast. Danke.

        Antworten
  12. Gisbert

    Hallo Stefan,
    vielen Dank für dein äußerst interessantes Projekt. Mit Schaltern von Homematic ließe sich das auch darstellen, allerdings ist man dann mit 50 Euro pro Rollladen/Markise dabei.
    Da ich vorhabe deine Lösung auch in Fhem zu nutzen, wäre ich wie Markus daran interessiert, deine Steuerung in Fhem zu integrieren. Kannst du eine Lösung dafür entwickeln?

    @Markus,
    ich habe auch vor die Schaltung alleine mit dem ESP8266-01 zu machen.
    Wie sieht deine Programmierung und die bisherige Erfahrung dazu aus?

    Vielen Dank und viele Grüße
    Gisbert

    Antworten
    1. ST Artikelautor

      Hallo Gisbert,

      ich habe die Markisen mit einem Dummy Device in fhem integiert; Codeschnipsel hängen unten an. Damit sind meine Markisen steuerbar. Allerdings wird so die Rückmeldung nicht verarbeitet; wäre also das WLAN Gerät Markise offline, würde fhem das nicht merken. Ebenso merkt fhem nicht, wenn man die Markise per 433MHz einfährt. Dazu müsste man den Syntax eines bestehendes Devices nachahmen oder einen eigenes Device in fhem einhängen. Wenn jemand von Euch den fhem Teil macht, können wir gerne überlegen, wie wir das hinbekommen.

      Gruss Stefan

      Einbindung per Dummy

      ### HAUPTMARKISE ###
      define HauptMarkise dummy
      attr HauptMarkise devStateIcon ein:shutter_2 stop:shutter_4 aus:shutter_6
      attr HauptMarkise eventMap on:ein stop:stop off:aus
      attr HauptMarkise setList on stop off
      attr HauptMarkise webcmdDevice true
      attr HauptMarkise group Markisen
      attr HauptMarkise icon icoAUSSENBEREICH
      attr HauptMarkise room Haussteuerung
      attr HauptMarkise webCmd ein:stop:aus

      define HauptMarkiseNA notify HauptMarkise:aus "wget -qO /dev/null http://192.168.178.32/?pin=MOTOR1DOWN"
      define HauptMarkiseNS notify HauptMarkise:stop "wget -qO /dev/null http://192.168.178.32/?pin=MOTOR1STOP"
      define HauptMarkiseNE notify HauptMarkise:ein "wget -qO /dev/null http://192.168.178.32/?pin=MOTOR1UP"

      Antworten
      1. Gisbert

        Hallo Stefan,
        vielen Dank für deinen Beitrag.
        Da ich noch mit einem anderen Projekt (Steuerung der Fußbodenheizung mit 1-Wire-Sensoren und ESP / Arduino-Steuerung der Stellantriebe) beschäftigt bin, werde ich noch Zeit brauchen, deinen Vorschlag umzusetzen. Ich werde mich aber melden, wenn ich soweit bin.
        Fhem kann ich aber auch noch nicht so gut, so dass die Rückmeldung, ob die Schaltung ausgeführt wurde, problematisch sein dürfte.
        Viele Grüße
        Gisbert

        Antworten
  13. Markus

    Hey Stefan, vielen Dank für die Erklärung mit fhem. Habe es getestet und es funktioniert gut.
    Eine Frage noch zu den 433Mhz Codes das verstehe ich im Code noch nicht, dein Code:
    // RFCode[0][0]=123456701; // left switch off
    // RFCode[1][0]=123456702; // right switch off
    // RFCode[0][1]=123456703; // left switch on
    // RFCode[1][1]=123456704; // right switch on
    Mein Sniffer zeigt so etwas:
    Received 263505 / 24bit Protocol: 1
    Elro coding possible – DIP: 1101110000
    Received 263508 / 24bit Protocol: 1
    Elro coding possible – DIP: 1101110000
    Ist ein Sender mit 5 Dip Switches. Wie muss ich meine Code bei dir eintragen?
    Gruß und Dank für deine Mühe

    Antworten
    1. ST Artikelautor

      Hallo MArkus,

      dann scheint doch alles zu funktionieren 🙂
      Mit dem Kommentar über dem Codeschnipsel habe ich versucht folgendes zu sagen:
      1. Nimm die Kommentare in den folgenden 4 Zeilen weg
      2. Trage die Codes ein, die Du mit Deiner Fernbedienung empfängst.

      Konkret für Dich also:
      RFCode[0][0]=263505; // left switch off
      RFCode[0][1]=263508; // left switch on

      Damit sollte der erste Motor auch per 433MHz Fernbedienung fahren. Du kannst auch einen anderen Sender nehmen oder den Elro Sender umkodieren. Dann musst Du die RFCode Einträge entsprechend anpassen.

      Gruss Stefan

      Antworten
      1. Markus

        Stefan, vielen Dank. Dann habe ich ja alles richtig gemacht. Hat aber nicht funktioniert. Konnte es auch nicht, wenn man einen Sender anstelle eines Empfängers einbaut 😉

        Nun geht es.

        Gruß und Dank Markus

        Antworten
  14. Markus

    @Gisbert: Meine Erfahrungen sind in meinem Testaufbau sehr gut. Ich schalte mit einem 2fach Relais aktuell nur LEDs die das auf und ab der Rolladen darstellen sollen. Geht prima.

    Gruß Markus

    Antworten
  15. Gisbert

    Hallo Stefan,
    hallo Markus,

    ich möchte das Projekt Markisen/Rolladensteuerung alleine auf einem ESP8266-01 laufen lassen.
    Gründe:
    Ich hab noch etliche von der 01-Version übrig. Sie waren für die Temperaturübertragung zur Steuerung einer Fußbodenheizung vorgesehen. Ich hab die Temperatursensoren (DS18B20) dann aber über ESPEasy angeschlossen. Das hat sogar mit normalen Kupferkabeln funktioniert, allerdings hab ich nur maximal 4 Fühler an einen ESP8266-01 anschließen können. Das hat trotzdem meinen Bedarf von 14 geplanten Stück (2 x 6 Räume/Fühler + 2x für die Kommunikation mit einem Arduino / Relais für die thermoelektrischen Schalter) auf nur noch insgesamt 6 Stück reduziert.
    Der weit wichtigere Grund ist aber, dass ich die komplette Rollladenschaltung in eine Unterputzdose unterbringen will.
    Dazu gehört auch neben einem ESP8266, einem 2-fach Relais, ein Trafo (230V –> 3.3V) und ein DC-DC-Booster (3.3 –> 5V) für ein 5V-Relais. Der Platz dürfte vermutlich trotzdem eng werden. Wenn der vorhandene Platz nicht reicht, müsste ich zur Not nach „hinten“ verlängern. An die Rolladenkästen, wo massig Platz wäre, komme ich aber nicht so leicht ran, da die Revisionsöffnungen übertapeziert sind; man lernt halt nie aus.

    Da meine Programmierkenntnisse sich im Wesentlichen auf das Befolgen von Anleitungen beschränken (so wie gelegentliche trial-und-error-Versuche), bin ich auf ein funktionierendes Programm angewiesen.
    Es wäre deshalb schön, wenn aus den beiden Programm eines für den ESP8266 werden könnte.

    Auf ewig, aber zumindest bis zum nächsten größeren Projekt währender Dank wäre euch gewiss 🙂
    Viele Grüße
    Gisbert

    Antworten
    1. Gisbert

      Hallo Stefan,
      hallo Markus,
      bei dem obigen Kommentar hab ich vergessen zu erwähnen, dass ich nur die Wlan-Anbindung plane und nicht den Funkmodus. Das würde sonst mit den 2 GPIO’s des ESP nicht funktionieren.
      Viele Grüße
      Gisbert

      Antworten
      1. Markus

        Hallo Gisbert, hinterlasse mal deine email Adresse. Dann können wir uns über diesen Weg weiter unterhalten.

        Markus

        Antworten
  16. mweb

    Hallo Stefan,

    vielen Dank für die Anleitung. Habe es in etwas abgewandelter Form nachgebaut (Ethernet statt Wifi/433)
    Jedoch habe ich ein fieses Problem. Beim Erreichen der Endstellung stop der Motor automatisch. Zu diesem Zeitpunkt stürzt mein Arduino ab und reagiert nicht mehr. Ich habe schon viel gelesen (Selbstinduktion, Schutzbeschaltung von Motoren). Ich wundere mich dass das bei Dir nicht auftritt… Könnte es am Motor liegen? Stromversorgung für das Handyladegerät sowie die Motoren sind am selben 230v Kabel…
    Wenn ich den Arduino incl Relais mit einer USB Powerbank mit Strom versorge, tritt das Problem nicht auf.

    Bin für alle Hinweise dankbar!

    Antworten
    1. ST Artikelautor

      Hallo Marko,

      bei mir ist es definitiv stabil und es läuft seit dem ursprünglichen Post in 05/2015. Durch die Relais sind die Motoren vom Arduino galvanisch getrennt. Da kommt nichts durch.
      Ich vermute mal, dass das Handynetzteil einen schlechten Job macht. Wenn der Motor abgeschaltet wird, entsteht eine Spannungsspitze. Das ist unvermeidbar, weil der Motor eine induktive Last ist. Der Motor sollte diesen Effekt mit Entstörkondensatoren mindern. Hier sind sicherlich nicht alle Motoren gleich gut. Wenn diese Spannungsspitzen als Spannungsschwankung (ggf auch kurzzeitige Überspannung) auf den Arduino durchschlagen, dann kann das den Effekt erklären. Es erklärt auch, warum der Effekt bei einer Powerbank ausbleibt.
      Als Abhilfe könntest Du Folgendes probieren (in dieser Reihenfolge):
      – Besseres (Marken-)Handynetzteil mit höherer Belastbarkeit (mehr mA).
      – Dicken Elko (ca 2000uF) und parallel einen kleinen Keramikkondensator (100nF) nehmen und die Eingangsspannung des Arduino stabilisieren.
      – Entstörring aus Ferrit zwischen Netzteil und Arduino einbauen.
      – Rolladen/Markisenmotor mit zusätzlichen Entstörkondensatoren ausrüsten.

      Gruss Stefan

      Antworten
  17. Gerhard

    Habe gesehen daß du mit dem ESP8266 auf du bist. Ich habe eine PIC Controller Lösung und kämpfe mit dem ESP; Betreibe den ESP in AT+CWMODE=2 ; Bei AT+RST kommt er mit ERROR; WLAN Netz wird erzeugt jedoch mit AT+CWSAP? meldet dieser wieder „enter error“ ; AT+CIPSTATUS wird auch mit ERROR quittiert
    AT+CIFSR auch mit ERROR

    Antworten
    1. ST Artikelautor

      Hallo Gerhard,

      Genau solche Probleme sind der Grund, warum ich nichts mehr mit der AT Firmware mache. Instabil, dauernde Syntax Änderungen im Detail, schlechte Möglichkeit der Fehler Behandlung.
      Ich rate Dir, den Esp8266 über die Arduino IDE mit C/C++ zu programmieren. Dazu findest Du hier die Anleitung und Beispielcodes.
      Viel Erfolg
      Stefan

      Antworten
      1. Gisbert

        Hallo Stefan, und hallo Markus,
        vielen lieben Dank an euch beide.

        Ich hab die ESP only Variante in einer Testumgebung (ohne Last an den Relais) umgesetzt, es läuft super.
        Der nächste Schritt ist dann mit 230V und Lampen als Verbraucher. Wenn das Ganze dann stabil läuft, versuche ich es in einer UP-Dose unterzubringen.
        Es bleibt spannend.
        Viele Grüße
        Gisbert

        Antworten
        1. Gisbert

          Hallo Stefan,

          in Fhem gibt es Modul ROLLO, das ich gerne nutzen möchte. Die Befehle zum Steuern hast Du ja schon beschrieben, z.B. „wget -qO /dev/null http://192.168.178.32/?pin=MOTOR1DOWN“
          Dieser Befehl funktioniert in der Befehlszeile in Fhem, aber nicht als Befehl in dem Modul ROLLO.
          Ich glaube es liegt an den Leerzeichen im Befehl.
          Eine Frage im Fhem-Forum hab ich bereits gestellt, allerdings ist noch keine Lösung sichtbar.
          Vielleicht hast Du eine Idee.
          Viele Grüße
          Gisbert

          Antworten
  18. ST Artikelautor

    Hallo Gisbert,

    ich kenne das Rollo Modul nicht. Mal kurz gegoogelt: Es scheint von einem FS20 Modul auszugehen. Funktioniert die Einbindung per dummy Device, die ich in einem der vorherigen Kommentare angegeben hatte?

    Gruss Stefan

    Antworten
  19. Gisbert

    Hallo Stefan,
    ich hab heute morgen deine Anleitung hier im Blog ausprobiert – und die hat den gleichen Fehler produziert, zunächstmal.
    Da meine Programmierkünste sich auf copy und paste im Wesentlichen beschränken, hab ich das mit deiner Anleitung ebenso gemacht, natürlich IP-Adresse etc. geändert.
    Auch mit den Anführungszeichen „wget -qO /dev/null http://192.168.178.32/?pin=MOTOR1DOWN“, die aber nicht Fhem, bzw. Perl kompatibel sind, denn es werden folgende Zeichen erwartet: “ und am Ende wieder: „.
    Das ist natürlich meinem Unvermögen geschuldet, aber ich habs dennoch geschafft.
    Trozdem vielen Dank, denn ohne deine Vorlagen wäre ich gar nicht erst so weit gekommen.
    Viele Grüße
    Gisbert

    Antworten
  20. Gisbert

    Ich sehe, dass bei der Formatierung hier im Blog die Anführungszeichen entgegen meiner Eingabe verändert wurde, es muss sich um hochgestellte Anführungszeichen handeln.

    Antworten
    1. ST Artikelautor

      Danke für den Hinweis. Das hat wohl die automatische Formatierung des Blogs verbockt. Es müssen natürlich hochgestelle Anführungszeichen sein. Ich habe das in dem Kommentar oben geändert.

      Antworten
  21. Kabumdada

    Hallo,
    ich hätte mal eine Frage zum Access Point und Netzwerk mit Arduinos.
    Kurz zur Erklärung was in unserem Projekt passieren soll:

    1. Wir arbeiten mit dem Pretzel Board (IoT Wifi Board / NanoESP) und RFID Modul RC522
    2. Soll ein Board an einen Laptop angeschlossen werden und als Access Point funktionieren
    3. Es gibt 6 andere Boards die jeweils an einer Arbeitsstation integriert sind.
    4. Gesamt Ablauf:
    – Über den Laptop wird angezeigt welche Farbe als nächstes kommt ( Rot, Blau oder Gelb)
    – An Station 1 wird eine RFID-Karte aufgelegt und dieser Karte soll die vom Laptop gesendete Farbe zugewiesen werden. Zusätzlich wird die Zeit gestoppt solange die RFID-Karte auf der Station liegt.
    – Danach soll die Karte weggenommen werden und auf der nächsten Station aufgelegt werden.
    Dabei soll die der RFID-Karte zugeschriebene LED leuchten und die Zeit der Station 1 an den Laptop übergeben werden. Ebenfalls soll hier eine Zeit aufgenommen werden.
    – Für die nächsten Stationen geht es dann im Prinzip genauso weiter.

    Nun zu meiner eigentlichen Frage:
    Wie bekomme ich eine solche Kommunikation mit den Boards hin ohne dabei auf eine Webseite oder ähnliches zurückzugreifen?
    Ist es möglich das ich im Programmcode einfüge:
    Sende Gelb von Laptop an Station 1
    Sende Zeit1von Station1 an Laptop
    …….
    Leider finde ich zu Kommunikation und Steuerung über W-Lan immer nur Programme die über eine Webseite irgendwelche LED´s steuern oder ähnliches.

    Die Frage dreht sich rein um die Kommunikation. Die Elektronik und das Programm zum Zeitmessen, RFID auslesen usw. steht schon.

    Vielen Dank im Voraus schonmal.

    Antworten
    1. ST Artikelautor

      Hallo Kabumdada,

      ich gehe mal davon aus, dass Du den ESP Teil mit der Arduino IDE programmierst und nicht mit AT Kommandos & der AT Firmware. Von letzerem kann ich nur abraten.
      Wenn Du auch den ESP Teil mit der Arduino IDE programmierst, dann schau mal der Serial2Telnet Beispiel an. Da werden Bytes per read/write Kommando hin und hergesendet. Im Prinzip brauchst Du nicht mehr.

      Gruss Stefan

      Antworten
  22. Kabumdada

    Hallo Stefan,
    vielen Dank für die schnelle Antwort.
    Werde es nächste Woche mal ausprobieren und mich dann nochmal melden ob mein Problem damit gelöst ist.
    Möchte Tatsächlich den Großteil der Datenübertragung mit dem Arduino IDE programmieren.
    Lediglich die Farben der LED´s sollen über die serielle Schnittstelle am Access Point in das „System“ eingespielt werden.

    Grüße Marcel

    Antworten
  23. Markus

    Hey Stefan,

    die ersten Rollos laufen nun schon erfolgreich. Danke nochmal für deine super Beschreibung und deine Hilfe.

    Nun dachte ich mir meine alte FS20 4fach Außen Steckdose auch mit dem ESP8266 umzubauen.
    Leider bekomme ich deinen Code nicht so umgebaut, das es funktioniert.

    Hast du vielleicht einen Tipp oder einen Code Schnipsel für mich.
    Also auf dem ESP die 4 Knöpfe für jeweils EIN / AUS funktioniert soweit, aber auf der Arduino Seite
    weiß ich leider nicht weiter.

    Gruß und Dank Markus

    Antworten
    1. ST Artikelautor

      Hallo Markus,

      ich gehe mal davon aus, dass Du den Markisencode weiterentwickelt hast. Wenn Du 4 Knöpfe hast, dann hast Du vermutlich die Parameter angepasst, die bei dem jeweiligen Button beim Klick verwendet werden. Diese Parameter werden dann durch den Webserver Code per serieller Schnittstelle an den Arduino gegeben.
      Schau Dir also erst mal den seriellen Output des ESP an, wenn Du die Knöpfe im Webinterface drückst. Wenn die Knöpfe dort einen ordentlichen und sinnvoll unterscheidbaren seriellen Output erzeugen, gehst Du zum Arduino Code über.
      Im Arduino Code wird die serielle Schnittstelle ausgelesen und anhand des empfangenen Parameter Strings werden dann die Ausgänge geschaltet. Direkt am Anfang des main loop() wird der String auseinander genommen. So wie der Code implementiert ist, gehen bis zu 9 Motoren.

      Gruss Stefan

      Antworten
  24. Gisbert

    Hallo Stefan,
    ich hatte Probleme mit der Spannungsversorgung, die jetzt aber Dank eines engagierten Fhem’lers (Marcus) behoben sind.
    Was ich jetzt feststelle ist, das beim ersten Anlegen von 230V an den Trafo, zwar Alles wie gewünscht hochfährt, aber die beiden Relais kurz anziehen, d.h. sie klacken kurz und die Dioden leuchten kurz auf. Danach ist alles ok.
    Nach einer Stromunterbrechung wäre es wünschenswert, dass nichts passiert, so kriegt der Rollladen einen kurzen Impuls zum Runterfahren.
    Ich bin dankbar für jede Idee, bzw. für Hinweise wie es bei dir aussieht.
    Viele Grüße
    Gisbert

    Antworten
    1. ST Artikelautor

      Hallo Gisbert,

      probier mal einen Pullup Widerstand (10k, wenn das nicht klappt 1k). Wenn’s dann noch kurz „klackt“ , nimm einen ESP12 und andere GPIOs. Da gibt es welche, die nicht vom Framework vorbelegt sind.

      Gruss Stefan

      Antworten
      1. Gisbert

        Hallo Stefan,
        vielen Dank für die Anregung.
        Ich habe diese auch schon von anderer Seite bekommen, jedoch weiß ich nicht genau, wie ich den Widerstand einbauen soll. Google habe ich bereits intensiv befragt, aber ich werde nicht schlau daraus.
        GPIO0 und 2 sind mit den beiden Eingängen des Relais verbunden. Wo gehört das eine Ende des Widerstands (je Relais ein Widerstand) angeschlossen, und wo das andere Ende?
        Viele Grüße
        Gisbert

        Antworten
        1. ST Artikelautor

          Hallo Gisbert,

          den Widerstand machst Du zum Einen am Pin fest, der das Relais steuert. Die andere Seite kommt an 3.3V. Deswegen heisst es Pullup Widerstand, weil es den Pin „hochzieht“. Das Ziel ist es, den Pin im hochohmigen Zustand (Eingang) ein hohes Potential zu geben, damit das Relais nicht schaltet.

          Gruss Stefan

          Antworten
  25. Joachim Müller

    Hallo,
    sehr cool. Ich habe auch so etwas gebaut. Nach dem aber im Arduino ein Fehler aufgetreten ist (nach 7 Wochen stabilen Betrieb) ist der Motor abgefackelt, da Strom auf beide Fahrtrichtungen anlag. Ich habe dann doch noch Sperrrelais eingebaut. Die neue Version arbeitet mit Logic-IC’s um sicher zu stellen, das auch nur 1 Ausgang auf HIGH ist.

    Antworten
  26. Michael

    Hallo Gisbert,

    genau wie du möchte ich die Steuerung einer Rolllade in einer Schaltdose unterbringen.
    Aber außer einer Vision und ein wenig Geschicke kann ich zur Lösung nichts beitragen.
    Dafür lernt man jedoch kurz vor der Rente noch die Berechnung von Minuszinsen.
    Wärest du so nett und würdest mir deine Lösung zukommen lassen.
    Ich schaffe es trotz ewiger Leserei auch ansatzweise keine Prgrammierlösung zu finden.

    Das wäre echt klasse!

    VG
    Michael

    Antworten
    1. ST Artikelautor

      Hallo Pete,
      Das geht sicherlich ist aber viel zu kompliziert und teuer. Man kann einfach Taster (oder einen normalen Rolladenschalter) an die Arduino Eingänge machen, diese abfragen und dann die Motoren über das Relaisboard steuern.
      Gruß Stefan

      Antworten
      1. Pete

        Ich meinte natürlich auch ohne das ganze Eltako dingens.
        Den Wandschalter habe ich schon, daher dachte ich an eine parallele Schaltung zu den Relaiskontakten. Also entweder der Schalter bringt Strom auf Phase einfahren/ausfahren oder eben der Arduino.

        Antworten
        1. ST Artikelautor

          Bloß nicht parallel. Wenn Du die Markisen per Wandschalter fährst und parallel der Arduino, dann hast Du ggf ein Problem. Phase auf rauf und runter gleichzeitig killt Kondensatormotoren.

          Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.