August 1, 2018

Automatisch Hek met Cardin PRG852, Domoticz en ESP2866 Relais

domotica esp2866 domoticz

Introductie

Aan het begin van mijn oprit heb ik een hek dat automatisch open en dicht kan. Dit hek wordt aangestuurd met een Cardin PRG852 kast die twee poorten aanstuurt. De bediening gaat met behulp van losse afstandsbedieningen die op 433,92 MHz. werkt. Na verschillende pogingen ben ik tot de conclusie gekomen dat deze niet vanuit Domoticz aan te sturen is.

Toch wilde ik mijn hek opnemen bij de rest van de domotica die door Domoticz op een Raspberry Pi 3 wordt aangstuurd. Door gebruik te maken van een dubbel relais dat door een ESP2866 chip wordt aangstuurd is dat gelukt. Hieronder een beschrijving van het prototype dat werkt.

Gebruikte onderdelen

Hardware

Software

Beoogde oplossing

Uit de handleiding van de Cardin PRG852 blijkt dat het mogelijk is om met een aantal poorten op het bord het hekwerk aan te sturen. Er is een signaal om het hek dicht te doen en een signaal om het hek open te doen. Het doel is dat het mogelijk is om vanuit Domoticz de signalen voor openen en sluiten te kunnen sturen.

ESP8266 Relais van LCTech

In mijn zoektocht naar een geschikt relais heb ik de oplossingen van LCTech bekeken. Het product met twee relais, dat op 5V werkt, met en ESP8266 WiFi chip leek te passen en heb ik besteld via Banggood.

Cardin PRG852

Het automatische hek werkt met twee armen/motors die aangestuurd worden door een Cardin PRG852 kast. Dit apparaat is een aantal jaren oud en inmiddels niet meer leverbaar door de leverancier. Online zijn wel nog handleidingen te vinden waarin te lezen is met welke externe signalen het hek aan te sturen is. In de handleiding staat o.a. dat een pulse vanuit twee aansluitingen 19 (Openen, TA) en 20 (Sluiten, TC) het hek kan besturen. Het signaal kan gegeven worden door een korte verbinding van een van de poorten met aansluiting 5 (GND). Ik heb ervoor gekozen om deze verbinding met een relais te maken dat over Wifi wordt aangestuurd.

Schakeling

Het relais van LCtech wordt ingezet om het hek open en dicht te laten gaan. Er worden twee relais gebruikt. Een om het hek te openen, een ander om het hek te sluiten. Vanuit beide relais worden de standaard open contacten verbonden met de contacten (5, 19 en 20) in de Cardin-kast. Het relais is te benaderen via Wifi doordat op de ESP8266 een kleine webserver draait.
Het openen of sluiten van het hek wordt vanuit de software gedaan door een opengate of een closegate signaal gegeven. Na die signaal schakelt het betreffende relais gedurende 1 seconde. Dit is genoeg om het signaal aan de Cardin-kast te geven om het hek open of dicht te laten gaan.

Om te testen of alles ook werkt, heb ik het relais tijdelijk in een plastic doosje gedaan. Het wordt voorzien van een voeding van 5V en is verder verbonden met de poorten in de schakelkast. Verbinding met Domoticz gaat via Wifi.

LUA-script

Om verbinding te maken met het relais moet er nieuwe software geladen worden in het bordje van LCTech. Dit kun je het makkelijkste doen met de Arduino IDE. Deze is beschikbaar voor Windows, Mac OS en Linux.

Het script bestaat uit drie onderdelen:

De code die gebruikt is om het hek vanuit Domoticz aan te sturen is staat hieronder en is te downloaden van Github

#include <ESP8266WiFi.h>

// Define the local Wifi network to connect to
const char* ssid="XXXX";
const char* password="XXXX";

// Define what relay performs Open or Close action
const byte RelayOpen  = 0;
const byte RelayClose = 1;

WiFiServer server(80);

void setup() {
  // Setup code
 
  Serial.begin(115200);
  Serial.println();
  Serial.print("Wifi connecting to: ");
  Serial.println( ssid );
  
  WiFi.begin(ssid,password);

  // Hide SSID from nodemcu module
  WiFi.mode(WIFI_STA);
 
  Serial.println();
  Serial.print("Connecting");

  // config static IP
  IPAddress ip(XX, XX, XX, XX); // where xx is the desired IP Address
  IPAddress gateway(XX, XX, XX, X); // set gateway to match your network
  IPAddress subnet(255, 255, 255, 0); // set subnet mask to match your network
  WiFi.config(ip, gateway, subnet);
    
  while( WiFi.status() != WL_CONNECTED ){
      delay(500);
      Serial.print(".");
  }

  if( WiFi.status() == WL_CONNECTED ){
      Serial.println(); 
      Serial.print("Connected to: ");
      Serial.println( ssid );
      Serial.println(WiFi.localIP());
  }

  server.begin();         // start the web server on port 80
  printWifiStatus();      // you're connected now, so print out the status
}

void loop() {
  // Main code here, runs repeatedly

  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("new client");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("<b>To Open or Close gate</b><br>");
            client.print("Click <a href=\"/opengate\">here</a> Open gate<br>");
            client.print("Click <a href=\"/closegate\">here</a> Close gate<br>");

            // The HTTP response ends with another blank line:
            client.println();
            
            // break out of the while loop:
            break;
          } else {    // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /opengate" or "GET /closegate":
        if (currentLine.endsWith("GET /opengate")) {
          switchRelay(RelayOpen,1);
          delay(1000);
          switchRelay(RelayOpen,0);
        }
        if (currentLine.endsWith("GET /closegate")) {
          switchRelay(RelayClose,1);
          delay(1000);
          switchRelay(RelayClose,0);
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

void printWifiStatus() {
  // print the SSID of the network you're attached to
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
  // print where to go in a browser:
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);
}

void switchRelay(int relayNum, int relayState) {
    // Switch Relay to open or close the gate
    
    Serial.write(0xA0);
    Serial.write((0x01 + relayNum));
    Serial.write((0x00 + relayState));
    Serial.write((0xA1 + relayState + relayNum));
    Serial.flush();
    delay(1);
}

Instellen van Domoticz

Nu het hek via een eenvoudig HTTP-request is aan te sturen, is het mogelijk om dit ook vanuit Domoticz te doen. Maak handmatig een nieuwe dummy schakelaar aan.

Klik in de nieuwe schakelaar op Aanpassen en geef de commando’s/HTTP-requests in om het hek te openen en om het hek te sluiten. Het is belangrijk dat de URL’s exact gelijk zijn aan de waarden die in het script staan.

http://ip-adres-van-hek/opengate    //open van het hek
http://ip-adres-van-hek/closegate   //sluiten van het hek

Aanpassingen in de nieuwe dummy-switch om het hek te besturen.