AXA Remote 2.0 raamopener bedienen vanuit Domoticz

Last Updated on 10 juli 2023 by Syds

AXA Remote Controller

Al eens eerder geprobeerd om met een breadboard, linbus chip, wemos d1 mini en wat dupont kabeltjes om mijn Axa Remote 2.0 raamopeners vanuit Domoticz te kunnen bedienen. Na diverse pogingen en configuraties en even zoveel mislukkingen het project maar gestopt. Kreeg het gewoon niet werkend.

Heb nu besloten om het wat “professioneler” op te pakken en een PCB er voor te laten maken zodat alle componenten netjes vast gesoldeerd kunnen worden. Als basis hiervoor heb ik een schema van “Galagaking” gebruikt welke je op github kunt vinden: https://github.com/galagaking/espaxa

Onderdelenlijst

AantalOnderdeelTe bestellen bijKosten
1Wemos D1 miniwww.aliexpress.com€ 2,75
1MCP2003-E/Phttps://nl.rs-online.com/web/p/products/7154542/€ 1,48
18-voudige IC fittingReichelt.nl€ 0,25
1RJ12 6P6C PCB connectorwww.aliexpress.com1,66 (10 stuks)
11K weerstandwww.aliexpress.com2,09 (100 stuks)
24,7K weerstandwww.aliexpress.com2,09 (100 stuks)
222K weerstandwww.aliexpress.com2,09 (100 stuks)
247uF condensatorwww.aliexpress.com0,76 (20 stuks)
1220uf condensatorwww.aliexpress.com0,76 (20 stuks)
1MT3608 step-up convertertinytronics.nl2,00
1HLK-10M05 AC-DC Power moduletinytronics.nl7,00
1ApparaatsnoerUit rommeldoos
12-pair terminal blockwww.aliexpress.com0,78 (10 stuks)
38-pin header malewww.aliexpress.com2,54 (10 male en 10 female 40-pins)
28-pin header female
1PCBwww.pcbgogo.com13,86 (5 stuks)

Benodigdheden

  • Soldeerbout + tin

Stap 1. PCB ontworpen

Op basis van het schema van Galagaking heb ik in Autodesk Eagle (CAD software voor het ontwerpen van PCB’s) mijn eigen versie ontworpen. Verschillen tussen mijn versie en die van Galagaking zijn dat ik de BMP280 temperatuur sensor heb weggelaten, deze was toch al optioneel en had ik functioneel gezien niet nodig. Verder heb ik male pin headers toegevoegd om de Wemos D1 mini eventueel eenvoudig te vervangen als deze onverhoopt stuk zou gaan. Tot slot heb ik een terminal block toegevoegd waarop ik het netsnoer kan vastschroeven.

Mijn schema ziet er dan als volgt uit:

Vervolgens dit schema m.b.v. Eagle vertaald naar een PCB layout:

Om er vervolgens bij een PCB fabrikant PCB’s van te kunnen laten maken moet je de PBC layout omzetten naar Gerber files. Ook daar voorziet Eagle gelukkig in.

Bovenstaande bestanden zijn allemaal te downloaden:

FileDownload link
ESP-AXA schemahttps://drive.google.com/file/d/17iCXOf9cLjG3Lpdgb4l2OiBh3aCuGRlI/view?usp=sharing
ESP-AXA board layouthttps://drive.google.com/file/d/1wCj4GhY7TiSYAlz64zEiAJRm_esP_vcL/view?usp=sharing
Gerber fileshttps://drive.google.com/file/d/1lJNUNVePfZpi6XMxlKLSYAB-virB7SNv/view?usp=sharing

Stap 2. PCB’s besteld bij pbcgogo.com

De PCB’s besteld via de menuoptie “PCB Instant Quote”->”PCB Manufactoring Calculator” met de volgende instellingen:

In de volgende stap de Gerber files (gezipt) geuploaded. De gerber files worden automatisch gereviewed waarna je vervolgens de bestelling kunt afronden en betalen. Om de kosten laag te houden heb ik gekozen voor verzending via China Post. Tevens de andere onderdelen, voor zover ik ze niet op voorraad had, besteld bij Aliexpress&TinyTronics.nl.

Dit is het resultaat:

Ziet er professioneel uit toch. Paar kleine punten ter verbetering:

  • De gaatjes voor de weerstanden zitten wel heel dicht op elkaar, bij het maken van een volgend ontwerp iets bredere layout kiezen.
  • Daarentegen zijn de gaatjes voor de condensators weer heel wijd van elkaar geplaatst, bij het maken van een volgende ontwerp iets smallere layout kiezen.
  • Bij condensator C3 is een type-foutje er in geslopen, moet zijn 220nF.

Stap 3. Raamopener toevoegen aan Domoticz

Kies binnen Domoticz voor Instellingen->Hardware en selecteer bij de plugin Virtuele sensoren voor de optie Maak virtuele sensoren . Het volgende scherm verschijnt:

Geef het device een zinvolle naam, en kies voor Sensor Type : Keuzeschakelaar. Het virtuele device wordt aangemaakt. Kies nu voor Schakelaars en zoek het net aangemaakte device op, waarschijnlijk staat die helemaal onderaan.

Klik op Aanpassen , het volgende scherm verschijnt:

Vul hier de volgende (niet default) waarden in:

AttribuutWaardeToelichting
NaamZinvolle naam
Schakelaar TypeSelectorBiedt een meerkeuze optie
Schakelaar IcoonKies een betekenisvol icoonZie https://www.domoticz.com/wiki/Custom_icons_for_webinterface
Keuzeniveaus10 Open
20 Stop
30 Close
AXA Remote commando s
Selectie acties10 http://<hostname>/open
20 http://<hostname>/stop
30 http://<hostname>/close
URL s van AXA Remote commando s, vul voor hostname de door jou gekozen hostname in (zie ook de volgende stap).

In mijn geval ziet het er dan zo uit:

En de schakelaar:

Noteer de IDX van je device, die heb je nodig in de volgende stap.

Stap 4. Arduino sketch op de Wemos D1 mini installeren

In afwachting van de onderdelen kan wel alvast de Wemos D1 mini van firmware worden voorzien. Helaas kan ik hiervoor niet de EspHome oplossing van Galagaking hergebruiken, deze werkt namelijk alleen samen met HomeAssistant, en niet met Domoticz. Gelukkig vond ik op internet een Arduino sketch die van je Wemos D1 mini een webserver maakt en /open, /close en /stop als http commando’s accepteert. Het originele script vind je hier: https://www.letscontrolit.com/forum/viewtopic.php?t=2245. Ik heb dit script enigszins aangepast zodat het ook het http commando /status ondersteund, en de status van de raamopener terug gecommuniceerd kan worden naar je Domoticz device. Hieronder het aangepaste script:

/*
* Author: Syds Post
* www.sydspost.nl
* version 1.0
*
* This sketch reads a command through a http connection
* depending on the text received it will send open, stop, close or status
* commands to the Esp8266. the ESP8266 is connected to the Axa Remote 2.0 electric window opener
* Incase of the command status it will actualisize the current state of the Domoticz device defined by IDX
* Add the linux command curl -d "" http://<hostname>/status to your crontab file to check the
* status with a certain interval, for example *5 * * * * curl -d "" http://<hostname>/status
* for a refresh of the status every 5 minutes
* You can enable/disable sending debug messages to your syslog server by setting SYSLOG_ENABLED in config.h true (default)
* and set the FQDN of IP-address and Port number of your syslog server
*/

#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <ESP8266HTTPClient.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <Syslog.h>
#include "arduino_secrets.h"
#include "config.h"
#include <SoftwareSerial.h>

int Debug = 0;                           // 1: Debug on, 0: Debug off
#define ssRX 12                          // D6, GPIO12
#define ssTX 13                          // D7, GPIO13
char ssid[] = SECRET_SSID;
char pass[] = SECRET_PASS;

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

// Create a new syslog instance with LOG_KERN facility
WiFiUDP UDP;
Syslog syslog(UDP, SYSLOG_SERVER, SYSLOG_PORT, sHostname.c_str(), APP_NAME, LOG_KERN);

// Start HttpClient
HTTPClient http;

// Create SoftwareSerial port
SoftwareSerial mySerial(ssRX, ssTX);

void setup() {
  mySerial.begin(19200, SWSERIAL_8N2);
  mySerial.setTimeout(5000);           // Set timeout for status response from AXA 
  Serial.begin(19200);                 // Debugging purpose
  delay(10);
  // Connect to WiFi network
  WiFi.mode(WIFI_STA);
  WiFi.hostname(sHostname.c_str());
  WiFi.setHostname(sHostname.c_str());
  WiFi.begin(ssid, pass);
  if (!MDNS.begin(sHostname.c_str()) && Debug == 1) {
    Serial.println("Error setting up MDNS responder!");
  }
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  // Start the server
  server.begin();
  
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  while(!client.available()){
    delay(1);
  }

  // Read the first line of the request
  String req = client.readStringUntil('\r');
  if (SYSLOG_ENABLED)
  {
    syslog.log(LOG_INFO, req);
  }
  if (Debug == 1) {Serial.println(req);}
  client.flush();

  // Match the request
  int val;
  if (req.indexOf("/open") != -1)
    open_axa();
  else if (req.indexOf("/close") != -1)
    close_axa();
  else if (req.indexOf("/stop") != -1)
    stop_axa();
  else if (req.indexOf("/status") != -1)
    status_axa();
  else {
    if (Debug == 1) {Serial.println("invalid request");}
    client.stop();
    return;
  }
  
  client.println("HTTP/1.1 200 OK");
  client.println("Content-type:text/html");
  client.println();
}

void open_axa() {
  mySerial.print("O");
  delay(20);
  mySerial.print("P");
  delay(20);
  mySerial.print("E");
  delay(20);
  mySerial.print("N");
  mySerial.println("\r");
  delay(2000);

  if (SYSLOG_ENABLED)
  {
    syslog.log(LOG_INFO, "Send OPEN to AXA remote");
  }
  if (Debug == 1) {Serial.println("Send OPEN to AXA remote");}
}

void close_axa() {
  mySerial.print("C");
  delay(20);
  mySerial.print("L");
  delay(20);
  mySerial.print("O");
  delay(20);
  mySerial.print("S");
  delay(20);
  mySerial.print("E");
  mySerial.println("\r");
  delay(2000);

  if (SYSLOG_ENABLED)
  {
    syslog.log(LOG_INFO, "Send CLOSE to AXA remote");
  }
  if (Debug == 1) {Serial.println("Send CLOSE to AXA remote");}
}

void stop_axa() {
  mySerial.print("S");
  delay(20);
  mySerial.print("T");
  delay(20);
  mySerial.print("O");
  delay(20);
  mySerial.print("P");
  delay(20);
  mySerial.println("\r");
  delay(2000);  

  if (SYSLOG_ENABLED)
  {
    syslog.log(LOG_INFO, "Send STOP to AXA remote");
  }
  if (Debug == 1) {Serial.println("Send STOP to AXA remote");}
}

void status_axa() {
  String url = url_prefix;

  mySerial.print("S");
  delay(20);
  mySerial.print("T");
  delay(20);
  mySerial.print("A");
  delay(20);
  mySerial.print("T");
  delay(20);
  mySerial.print("U");
  delay(20);
  mySerial.print("S");
  delay(20);
  mySerial.println("\r");
  delay(2000);

  if (SYSLOG_ENABLED)
  {
    syslog.log(LOG_INFO, "Send STATUS to AXA remote");
  }
  if (Debug == 1) {Serial.println("Send STATUS to AXA remote");}
  String res = mySerial.readStringUntil('\r');
  if (SYSLOG_ENABLED)
  {
    syslog.log(LOG_INFO, res);
  }
  if (Debug == 1) {Serial.println("res");}
  
  if (res == "OPEN") {
    url = url + "/json.htm?type=command&param=udevice&idx=" + IDX + "&nvalue=0&svalue=0";
  }
  else if (res == "CLOSE") {
    url = url + "/json.htm?type=command&param=udevice&idx=" + IDX + "&nvalue=1&svalue=100";
  }  
  if (Debug == 1) {Serial.println(url);}

  if (SYSLOG_ENABLED)
  {
    syslog.log(LOG_INFO, url);
  }
  WiFiClient client;
  http.begin(client, url.c_str());
  http.addHeader("Content-Type", "text/plain");

  int httpResponseCode = http.GET();

  if (httpResponseCode>0 && Debug == 1){
    String response = http.getString();   
   
    if (SYSLOG_ENABLED)
    {
      syslog.log(LOG_INFO, response);
    }

    if (Debug == 1) 
    {
      Serial.println(httpResponseCode);
      Serial.println(response); 
    }      
  }
  else if (Debug == 1) {
    if (SYSLOG_ENABLED)
    {
      syslog.log(LOG_INFO, url);
    }

    if (Debug == 1)
    {    
      Serial.print("Error on sending GET Request: ");
      Serial.println(httpResponseCode);
    }
  }
 
  http.end();
}

De SSID en het WiFi password kun je kwijt in de file arduino_secrets.sh, verander deze naar jou situatie:

#define SECRET_PASS "<jou WiFi password>"
#define SECRET_SSID "<jou SSID>"

De variabelen zijn opgenomen in een aparte config.h file, verander deze naar jou situatie. Vul bij IDX de IDX van jou device in uit de vorige stap en compileer en upload vervolgens de 3 files naar je Wemos D1 mini.

// Config.h
// Change values according to your situation
//

String sHostname = "<jou gewenste hostname>";     // DNS hostname

// Domoticz settings
String IDX = "<IDX van jou raamopener>";           // IDX of Domoticz device
String url_prefix = "<hostname en poortnummer van jou Domoticz server>";    // hostname:port of Domoticz server

// Set Syslog server
const bool SYSLOG_ENABLED = true;                  // Set to False to disable syslogging
#define SYSLOG_SERVER "<hostname en poortnummer van jou syslog server>"               // Change to FQDN of IP-Address of your syslog server
#define SYSLOG_PORT 514                            // Change to port of your syslog server
#define APP_NAME "<jou gewenste app_name>"         // Change application name here

Heb je nog nooit eerder een Wemos D1 Mini met Arduino IDE geflashed, voer dan eerst de stappen in deze instructie uit: https://averagemaker.com/2018/03/wemos-d1-mini-setup.html

De Axa Remote sketch is afhankelijk van de volgende bibliotheken:

  • ESP8266WiFi.h
  • WiFiClient.h
  • ESP8266HTTPClient.h
  • ESP8266mDNS.h

Installeer deze bibliotheken, voor zover je dat nog niet gedaan hebt, via de optie Manage Libraries.

Open nu drie tabbladen in Arduino IDE, geef ze de filenamen AXA Remote 2.0.ino, arduino_secret.h en config.h en kopieer hier bovenstaande C++ programmacode. Pas de variabelen en WiFi codes aan in arduino_secret.h en config.h. Sluit de Wemos D1 Mini middels een USB kabel aan op je laptop. En kies binnen Arduino IDE voor Sketch->Upload.

Testen:

Kies binnen Arduino IDE voor Serial monitor. Open een browser window en open de url http://<hostname of ip-address van jou Wemos D1 mini>/open, in mijn geval bijv. http://raamopener_links.sydspost.nl/open

Als het goed is reageert de Wemos D1 mini in de Serial monitor van Arduino IDE met het commando OPEN. Op dezelfde wijze kun je ook /stop en /close testen. Nadat we in de volgende stap de verschillende componenten op de AXA Remote printplaat hebben gesoldeerd kunnen het /status commando testen.

Stap 5. AXA Remote printplaat van componenten voorzien

We beginnen uiteraard met de kale printplaat en de verschillende componenten:

Eerst solderen we hier de weerstanden R1, R2, R3, R4 en R6 op, en de consensatoren C1, C2 en C3. Even op een rijtje:

  • R1: 22K Ohm weerstand
  • R2: 22K Ohm weerstand
  • R3: 4.7K Ohm weerstand
  • R4: 1K Ohm weerstand
  • R6: 4.7K Ohm weerstand
  • C1: 47uF ELCO
  • C2: 47uF ELCO
  • C3: 220nF keramische condensator

Tussenresultaat:

22K weerstanden moesten nog binnenkomen

Daarna zijn de headers en IC fitting aan de beurt, even op een rij:

  • U2: 8-voudige IC fitting
  • SV3 en SV4: 8 voudige male header
  • U$1: 1 voudige male header op IN + en -, en OUT + en –

Tussenresultaat:

Daarna voeding, step-up converter en terminal voor de 230v aansluiting. Op een rij:

  • U$2: 2 voudige terminal
  • U$1: MT3608 Step-up converter
  • HLK10M05: HLK10M05

Let op dat je de step-up converter op de juiste wijze plaatst, dus VIN+ en VIN- op IN+ en IN-, VOUT+ en VOUT- op OUT+ en OUT-.

En tot slot de RJ12 connector en de Wemos D1 mini. Wacht nog even met MCP2003-E/P in de IC fitting te plaatsen, eerst gaan we step-up converter nog instellen zodat deze 8v afgeeft. Let erop dat je de Wemos D1 mini op de juiste wijze op de headers plaatst, dus met de USB-aansluiting naar de rand van de printplaat toe. Sluit een apparaatsnoer aan op de terminal, rechts de fase, links neutraal en pak een heel klein platte schroevendraaier.

<<Let op, wees voorzichtig, 230v kan levensgevaarlijk zijn !!>> Stop de stekker in het stopcontact en meet met een multimeter de voltage tussen de OUT+ en OUT- van de step-up converter. Draai het kleine schroefje op de Bones 3288 potentiometer van de step-up converter naar links of naar rechts totdat je een voltage van 8v meet.

Plaats nu de MCP2003-E/P in de IC fitting, let er goed op dat de uitholling in de bovenkant van de IC overeenstemt met de uitholling in de IC fitting. Het eindresultaat ziet er dan als volgt uit:

<foto nog toevoegen>

Stap 6. Casing voor de ESP-AXA printen

5 gedachten over “AXA Remote 2.0 raamopener bedienen vanuit Domoticz

  1. Sebas zegt:

    Ik zou wel adviseren geen lood finish te nemen. Deze voldoet niet aan europese regelgeving RoHS.

    Beantwoorden
    1. Syds zegt:

      Sebas, dank, dat wist ik niet. Zal hier in het vervolg rekening mee houden wanneer ik PCB’s bestel in China. Ben overigens van plan om zelf BCB’s te gaan maken. Leuk experiment voor komende winter. Heb overigens de aansturing van de AXA nog niet werkende. Verdenk de MCP2003, heb die waarschijnlijk beschadigd bij eerdere pogingen. Overigens 3 exemplaren geproduceerd, geen van allen gaf een werkend resultaat. Dus kan ook een andere oorzaak hebben.

      Beantwoorden
  2. Damien zegt:

    Beste Syds,

    Kan het zijn dat jij geen softserial hebt geïnstalleerd en daarmee de verkeerde pin (D6 en D7) gesoldeerd hebt (en niet Tx en Rx)?
    Als ik kijk naar de code van ESPAXA wordt daar aangegeven dat ze specifiek een uart op D6 en D7 hebben. Verder zat ik ook te kijken naar Remote 2.0 bedienen / klimaat regeling (homey) en ook hier geven ze in de code aan welke pin ze gebruiken in een stuk code (in dit geval een softserial).
    Dus ik denk dat het probleem ligt in het feit dat je Tx en Rx niet hebt gesoldeerd of dat je in de code nog moet aangeven dat D6 (GPIO12) en D7 (GPIO13) als serial port fungeren.
    zou dit kunnen werken?

    #include
    #include
    #include
    #include
    #include
    #include “arduino_secrets.h”
    #include “config.h”

    ;int Debug = 0; // 1: Debug on, 0: Debug off
    char ssid[] = SECRET_SSID;
    char pass[] = SECRET_PASS;

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

    // Start HttpClient
    HTTPClient http;

    SoftwareSerial softSerial(12, 13); // RX = D6, TX = D7 Verbind deze pinnen met de linbus converter

    void setup() {
    // Initialiseer seriële communicatie via usb poort en voor linbus controller
    Serial.begin(115200); //Initialiseer serial port via usb
    softSerial.begin(19200, SWSERIAL_8N2); // Initialiseer software serial port voor linbus

    // Connect to WiFi network
    WiFi.mode(WIFI_STA);
    WiFi.hostname(sHostname.c_str());
    WiFi.setHostname(sHostname.c_str());
    WiFi.begin(ssid, pass);
    if (!MDNS.begin(sHostname.c_str()) && Debug == 1) {
    Serial.println(“Error setting up MDNS responder!”);
    }
    while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    }
    // Start the server
    server.begin();

    }

    void loop() {

    Beantwoorden
    1. Syds zegt:

      Damien,

      Dat van SoftwareSerial had ik zelf ook al ontdekt, en de code daarop aangepast (maar nog niet in m’n blog verwerkt, nu wel). Maar nog steeds werkt het bij mij niet. Zie het groene statuslampje van de AXA wel even knipperen als ik bijv. het close commando stuurt, maar daar blijft het ook bij. Krijg het niet werkend, maar blijf proberen.

      Syds

      Beantwoorden

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *