Rozšíření - Spínání silových obvodů

Spínání silových obvodů - zásuvek, světel, žaluzií, zavlažování a podobných zařízení na 230V je jedním za základních funkcí inteligentního domu. V Pi-Home používáme Arduino relé 230V/2A, které spína galvanicky oddělené instalační relé 230V/20A. V případě vícefázových okruhu se volí vícefázové relé 230V/20A.

Co budeme potřebovat:

Základ - OpenHAB na Raspberry Pi

Arduino Mega s Ethernet Shieldem (DIN držák)

Arduino SSR relé 8x2A/230V (DIN držák)

Instalační relé EATON Z-R230/S nebo vícefázové EATON Z-R230/4S

Zdroj DC 5V 40W (DIN)

 

Napájení a propojení

Arduino Mega je připojeno k RPi přes USB a pomocí LAN do interní sítě. K pinům Arduina je připojene relé 8x2A/230V. Napětí je zde přivedeno z externího zdroje DC 5V 40W. Dle počtů ovládaných výstupů můžete na DIN lištu umístit potřebné množství těchto relé a propojit je s Arduinem. Relé pak uzavírají okruh s instalačním relé v silové části rozvaděče. Pro vícefázové okruhy/spotřebiče použijte vícefázové relé. Silnoproudů část si nechte naprojektovat od elektrikáře silnoproudu kde je pak samozřejmě nutná revize.

Pi-Home - ovládání silových obvodů

Software

Pro ovládaní Arduino relé je vám k dispozici jednoduchý sketch, který odposloucháva MQTT komunikaci. V případě specifického tvaru topicu a hodnoty se zapne relé a tímto uzavře okruh. Pokud je těchto relé desek více, doporučuji je mít na samostatném Arduinu a nekombinovat na jednom Arduinu senzory, PIR a silnoproudé obvody.

Ukázkový sketch

V tomto jednoduchém sketchi jsou použité knihovny SPI.h, Ethernet.h a PubSubClient.h. V adresáři pro Arduino se musí nacházet Makefile (název souboru) s obsahem níže. Zde je uvedeno, jaké knihovny budeme načítat a kde jsou umístěny. Knihovny můžete vyhledat na internetu a stáhnout. Dále je v Makefile jednoznačná specifikace Arduina, já používám specifický název, jak se Arduino hlásí na cestě /dev/serial/by-id/usb-Arduinoxxxx  Jednoduše jděte do složky a zkuste zapojit/odpojit dané Arduino a zaznamenejte si jaký název se zde objeví. Jmeno zařízení zkopírujte do Makefile níže. V sketchi jsou pak deklarované proměnné (piny), na kterých jsou připojeny jednotlivé relé desky a logika odposlechu MQTT pro akci, nějaký reconnect, atd.

Vzorový "Makefile"

ARDUINO_DIR = /usr/share/arduino
BOARD_TAG    = mega2560
ARDUINO_PORT = /dev/serial/by-id/usb-Arduino__www.arduino.cc__0042_85531303630351119291-if00 (nahraďte vlastním názvem)
USER_LIB_PATH = /usr/share/arduino/libraries
ARDUINO_LIBS = Ethernet SPI pubsubclient
include /usr/share/arduino/Arduino.mk

Vzorový sketch " Relay.ino"

    /*
     Example MQTT-switch-relay script

      - connects to an MQTT server
      - publishes "hello world" to the topic "relay"
      - subscribes to the topic "relay"
      - controls as many relays as defined
      - turns on/off a specific led when it receives a specific "on"/"off" from the "relay" topic
      - multiple arduino's with same generic sketch can run parallel to each other
      - multiple arduino's need each to have a unique ip-addres, unique mac address and unique MQTT client-ID
      - tested on arduino-mega with W5100 ethernet shield
    */

    //------------------------------------------------------------------------------

    #include <SPI.h>
    #include <Ethernet.h>
    #include <PubSubClient.h>

    // Set relay variables to Arduino digital pins

    //Rele board X1
    int Rel_X1_1 = 22;
    int Rel_X1_2 = 23;
    int Rel_X1_3 = 24;
    int Rel_X1_4 = 25;
    int Rel_X1_5 = 26;
    int Rel_X1_6 = 27;
    int Rel_X1_7 = 28;
    int Rel_X1_8 = 29;

    // Set variables to act as virtual switches
    // Set variable values initially to LOW (and not HIGH)

     //Rele board X1
    int ValueX1_1 = LOW;
    int ValueX1_2 = LOW;
    int ValueX1_3 = LOW;
    int ValueX1_4 = LOW;
    int ValueX1_5 = LOW;
    int ValueX1_6 = LOW;
    int ValueX1_7 = LOW;
    int ValueX1_8 = LOW;


    //---------------------------------------------------------------------------

    // Arduino MAC address must be unique for every node in same network
    // To make a new unique address change last letter
    // Arduino 0
    byte mac[]    = { 0xCC, 0xFA, 0x06, 0xCB, 0x19, 0x00 };  

    // Unique static IP address of this Arduino 0
    IPAddress ip(192,168,4,30);


    // IP Address of your MQTT broker (OpenHAB server)
    byte server[] = { 192,168,4,40 };

    // Handle and convert incoming MQTT messages ----------------------------------------

    void callback(char* topic, byte* payload, unsigned int length) {
      // handle message arrived
      String content="";
      char character;
      for (int num=0;num<length;num++) {
          character = payload[num];
          content.concat(character);
      }   

    // Set specific virtual switches on basis of specific incoming messages ----------------------------
      //REL1
      if (content == "X1_1on") {    ValueX1_1 =  HIGH; }
      if (content == "X1_1off"){    ValueX1_1 =  LOW;  }
      if (content == "X1_2on") {    ValueX1_2 =  HIGH; }
      if (content == "X1_2off"){    ValueX1_2 =  LOW;  }
      if (content == "X1_3on") {    ValueX1_3 =  HIGH; }
      if (content == "X1_3off"){    ValueX1_3 =  LOW;  }
      if (content == "X1_4on") {    ValueX1_4 =  HIGH; }
      if (content == "X1_4off"){    ValueX1_4 =  LOW;  }
      if (content == "X1_5on") {    ValueX1_5 =  HIGH; }
      if (content == "X1_5off"){    ValueX1_5 =  LOW;  }
      if (content == "X1_6on") {    ValueX1_6 =  HIGH; }
      if (content == "X1_6off"){    ValueX1_6 =  LOW;  }
      if (content == "X1_7on") {    ValueX1_7 =  HIGH; }
      if (content == "X1_7off"){    ValueX1_7 =  LOW;  }
      if (content == "X1_8on") {    ValueX1_8 =  HIGH; }
      if (content == "X1_8off"){    ValueX1_8 =  LOW;  }
      


      // Set digital pin states according to virtual switch settings
      digitalWrite(Rel_X1_1, ValueX1_1);  
      digitalWrite(Rel_X1_2, ValueX1_2);
      digitalWrite(Rel_X1_3, ValueX1_3);
      digitalWrite(Rel_X1_4, ValueX1_4);
      digitalWrite(Rel_X1_5, ValueX1_5);
      digitalWrite(Rel_X1_6, ValueX1_6);
      digitalWrite(Rel_X1_7, ValueX1_7);
      digitalWrite(Rel_X1_8, ValueX1_8);
      

    }

    // Initiate instances -----------------------------------
    EthernetClient arduino0;
    PubSubClient client(server, 1883, callback, arduino0);
    //-------------------------------------------------------


    void setup()
    {
      digitalWrite(Rel_X1_1, HIGH);
           pinMode(Rel_X1_1,OUTPUT);
      digitalWrite(Rel_X1_2, HIGH);
           pinMode(Rel_X1_2,OUTPUT);
      digitalWrite(Rel_X1_3, HIGH);
           pinMode(Rel_X1_3,OUTPUT);
      digitalWrite(Rel_X1_4, HIGH);
           pinMode(Rel_X1_4,OUTPUT);
      digitalWrite(Rel_X1_5, HIGH);
           pinMode(Rel_X1_5,OUTPUT);
      digitalWrite(Rel_X1_6, HIGH);
           pinMode(Rel_X1_6,OUTPUT);
      digitalWrite(Rel_X1_7, HIGH);
           pinMode(Rel_X1_7,OUTPUT);
      digitalWrite(Rel_X1_8, HIGH);
           pinMode(Rel_X1_8,OUTPUT);

      // Setup ethernet connection to MQTT broker
      Ethernet.begin(mac, ip);
      if (client.connect("arduino0", "openhabian", "HESLO K MQTT BROKERU")) {                                  // change as desired - clientname must be unique for MQTT broker
        client.publish("relay","hello world - here arduino0 ip 192.168.4.40");
        Serial.println("connected");
        client.subscribe("relay");                                        // subscribe to topic "relay"
      }
    }


    //-----------------------------------------------
    long lastReconnectAttempt = 0;

    boolean reconnect() {
      if (client.connect("arduino0", "openhabian", "HESLO K MQTT BROKERU")) {
        // Once connected, publish an announcement...
        client.publish("relay","reconnected");
        // ... and resubscribe
        client.subscribe("relay");
      }
      return client.connected();
    }
    //----------------------------------------------

    void loop()
    {

      if (!client.connected()) {
        long now = millis();
        if (now - lastReconnectAttempt > 5000) {
          lastReconnectAttempt = now;
          // Attempt to reconnect
          if (reconnect()) {
            lastReconnectAttempt = 0;
          }
        }
      } else {
        // Client connected

        client.loop();
    }

    }

    // End of sketch ---------------------------------

OpenHAB

V OpenHAB vytvořte soubor relay.items kde bude seznam vypínačů (typ switch) a přiřazení názvu, skupiny a hlavně tvaru MQTT zprávy, na kterou bude Arduino reagovat. Všimněte si, že v sketchi je tvar "X1_7on" pro zapnutí a "X1_7off" pro vypnutí.

Vzor relay.items

  /* Zde jsou například světla ovládaná pomocí relé */
    
    /*SV1.1*/ Switch Light_Gar_1     "Světlo zahrada"   {mqtt=">[mymosquitto:relay:command:ON:X1_1on],>[mymosquitto:relay:command:OFF:X1_1off]"}
    /*SV1.2*/ Switch Light_Gar_2     "Světlo terasa"    {mqtt=">[mymosquitto:relay:command:ON:X1_2on],>[mymosquitto:relay:command:OFF:X1_2off]"}
    /*SV1.3*/ Switch Light_Room_3    "Světlo salon"     {mqtt=">[mymosquitto:relay:command:ON:X1_3on],>[mymosquitto:relay:command:OFF:X1_3off]"}
    /*SV1.4*/ Switch Light_Room_4    "Světlo toaleta"   {mqtt=">[mymosquitto:relay:command:ON:X1_4on],>[mymosquitto:relay:command:OFF:X1_4off]"}
    /*SV1.5*/ Switch Light_Room_5    "Světlo bar"       {mqtt=">[mymosquitto:relay:command:ON:X1_5on],>[mymosquitto:relay:command:OFF:X1_5off]"}
    /*SV1.6*/ Switch Light_Room_6    "Světlo spíž"      {mqtt=">[mymosquitto:relay:command:ON:X1_6on],>[mymosquitto:relay:command:OFF:X1_6off]"}
    /*SV1.7*/ Switch Light_Room_7    "Světlo vchod"     {mqtt=">[mymosquitto:relay:command:ON:X1_7on],>[mymosquitto:relay:command:OFF:X1_7off]"}
    /*SV1.8*/ Switch Light_Room_8    "Světlo kuchyně"   {mqtt=">[mymosquitto:relay:command:ON:X1_8on],>[mymosquitto:relay:command:OFF:X1_8off]"}
   
  

A to je vše! Zkuste si v prohlížeči přejít na váš OpenHAB (v příkladu http://192.168.4.40:8080) a vyberte BasicUI. Měli by jste vidět 8 vypínačů a přes mobilní telefón je můžete zapnout/vypnout. Toto řešení lze neomezeně rozšířit. Máme zkušenosti s bezproblémovou instalaci až s 200 relé.

Tip: Na jednu desku Arduino Mega s Ethernet shieldem se vejde až 6 kusů 8x SSR relay board co je až 48 světel/zásuvek/čerpadel atd.

Nejlepší články z blogu

Centrální tablet pro chytrý dům
Centrální tablet pro ovládání chytrého domuHodnocení: 
80%

Centrální tablet nebo starší smartphone se perfektně hodí jako centrální ukazatel informací o stavu v domě a také k jeho ovládání. Zpravidla nahrazuje videovrátného a můžete si na něm pustit například oblíbenou hudbu při vaření nebo číst recepty. V článku popíšeme funkční příklad takového "wall" tabletu a jeho nastavení v tzv. kiosk módu, aby nesvítíl po nocích a reagoval jenom když je někdo poblíž.

Persistent linux live USB
Vytvoření persistent live USB LinuxuHodnocení: 
0%

Většina distribucí linuxu existuje v "live" provedení, tz. že po rozbalení jej můžete používat přímo z flash disku nebe externiho SSD. Po uložení práce se vám ale klasická live distribuce znovu uvede to výchozího nastavení. Toto řeší tzv. persistent live instalace. Ukážeme si jak jej vytvořit na Linuxu nebo Windows.

Jabltron propojení s chytrou domácností
Propojení Jablotronu s OpenHABHodnocení: 
0%

V tomto článku si představíme užitečný "binding" pro OpenHAB hlavně v tuzemských instalacích kde je hodně zastoupen alarm od firmy Jablotron. Propojení alarmu s chytrou domácností nám umožní reagovat na stav zakódování/odkodování domu. Typicky při zákodování domu zhasnout všechna světla, zavřít přívod vody, vypnout cirkulaci TUV, vypnout spínáne zásuvky a cokoliv dalšího co nepotřebujete v provozu nejste-li doma.

Thunderbird vs Exchange email and calendar
Thunderbird vs MS ExchangeHodnocení: 
0%

V tomto článku si ukážeme jak provozovat firemní poštu a kalendář postavenou na MS Exchange 20xx s Thunderbirdem na jakḱoliv distribuci Linuxu. Používám toto řešení k spokojenosti přes 8 let od verze Exchange 2013 - 2016 - 2019.

Arduino PIR - možnost deaktivace, časovač a denní doba
Pokročilé nastavení PIR čidel pro řízení světel v OpenHABHodnocení: 
100%

PIR čidlo HC-SR501 obsahuje mechanické nastavení dosahu záběru a délky sepnutí. V inteligentním domě ale chceme mít možnost variabilně parametry PIR měnit. Ukážeme jak PIR čidlo nastavit tak, aby šlo v aplikaci nebo vypínačem deaktivovat a volitelně nastavovat délku svícení.

Konfigurace OpenVPN na MikroTiku
OpenVPN na routerech MikroTikHodnocení: 
90%

Máte-li doma smart-home, NAS atp., je dobré myslet na bezpečný přístup do vaší sítě zvenku. Zde bych aktuálně volil komerční router jako Turris, nebo levnější variantu routerů MikroTik. V tomto článku ukážeme postup, jak si zřídit zabezpečený přístup do domácí sítě z venku jak z počítače tak z mobilu pomocí OpenVPN na routerech MikroTik.

Nastavení OpenVPN v iOS
Nastavení OpenVPN připojení v iOSHodnocení: 
100%

V tomto článku najdete podrobný návod, jak se připojit k OpenVPN v iOS.

Nastavení OpenVPN na Androidu
Nastavení OpenVPN připojení v AndroiduHodnocení: 
100%

V tomto článku najdete podrobný návod, jak se připojit k OpenVPN na Androidu.