Rozšíření - Žaluzie/rolety

Motorové žaluzie a rolety jsou nezbytností v moderních stavbách s nízkou spotřebou energie a prosklennými plochami. Můžeme zde zařadit i motorové markízy. V tomto článku se dozvíte jak lze motor připojit k smart home postaveném na OpenHAB, jak žaluzie rozdělit do skupin a pár tipů jak je ovládat. Máme zkušenost s motory Somfy J4 WT nicméně princíp fungování je stejný i pro většinu ostatních motorů.

 

Co budeme potřebovat:

Základ - OpenHAB na Raspberry Pi

Motorové žaluzie/rolety/markíza a napájení motorů vyvedené v rozvaděči

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í

K motoru natáhneme 4 nebo 5-ti žilový kabel např. CYKY 5x1,5 mm2. Každá žaluzie bude potřebovat dvojici Arduino relé a potažmo dvojici silnoproudých relé. Jedná fáze je pro pohyb nahorů a druhá dolů. Připojením obou fází se nastavují dorazy a nesmí během používaní dojít k sepnutí obou relé současně! Lamely se otevřou při zdvihu a naopak zavřou při sesouvání. Pro natočení lamel je tedy možné použít krátky impuls nahoru nebo dolu dle potřeby.

Pi-Home - Ovládání žaluzíí a rolet v chytrém domě

Software

Pro ovládaní Arduino relé dáváme k dispozici jednoduchý sketch, který odposloucháva MQTT komunikaci, podobně jako u silových vývodů (světel, zásuvek). Změna je v oštření kódu tak, že nemůže dojít k sepnutí obou fází najednou.  V případě specifického tvaru topicu a hodnoty se zapne relé a tímto uzavře okruh. Doporučuji mít relé pro žaluzie a rolety 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 " Shutters.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 SH1_1 = 30;
    int SH1_2 = 31;
    int SH2_1 = 32;
    int SH2_2 = 33;
    int SH3_1 = 34;
    int SH3_2 = 35;
    int SH4_1 = 36;
    int SH4_2 = 37;
    
    // Set variables to act as virtual switches
    // Set variable values initially to LOW (and not HIGH)

     //Rele board X1
    int ValueSH1_1 = LOW;
    int ValueSH1_2 = LOW;
    int ValueSH2_1 = LOW;
    int ValueSH2_2 = LOW;
    int ValueSH3_1 = LOW;
    int ValueSH3_2 = LOW;
    int ValueSH4_1 = LOW;
    int ValueSH4_2 = 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, 0xFF, 0x06, 0xCB, 0x19, 0x00 };  

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


    // 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 ----------------------------
      //Rele board X1
      if (content == "SH1_1on") {    ValueSH1_2 =  LOW; ValueSH1_1 =  HIGH; }
      if (content == "SH1_1off"){    ValueSH1_1 =  LOW;  }
      if (content == "SH1_2on") {    ValueSH1_1 =  LOW; ValueSH1_2 =  HIGH; }
      if (content == "SH1_2off"){    ValueSH1_2 =  LOW;  }
      
      if (content == "SH2_1on") {    ValueSH2_2 =  LOW; ValueSH2_1 =  HIGH; }
      if (content == "SH2_1off"){    ValueSH2_1 =  LOW;  }
      if (content == "SH2_2on") {    ValueSH2_1 =  LOW; ValueSH2_2 =  HIGH; }
      if (content == "SH2_2off"){    ValueSH2_2 =  LOW;  }
      
      if (content == "SH3_1on") {    ValueSH3_2 =  LOW; ValueSH3_1 =  HIGH; }
      if (content == "SH3_1off"){    ValueSH3_1 =  LOW;  }
      if (content == "SH3_2on") {    ValueSH3_1 =  LOW; ValueSH3_2 =  HIGH; }
      if (content == "SH3_2off"){    ValueSH3_2 =  LOW;  }
      
      if (content == "SH4_1on") {    ValueSH4_2 =  LOW; ValueSH4_1 =  HIGH; }
      if (content == "SH4_1off"){    ValueSH4_1 =  LOW;  }
      if (content == "SH4_2on") {    ValueSH4_1 =  LOW; ValueSH4_2 =  HIGH; }
      if (content == "SH4_2off"){    ValueSH4_2 =  LOW;  }
      
    
      


      // Set digital pin states according to virtual switch settings
      digitalWrite(SH1_1, ValueSH1_1);  
      digitalWrite(SH1_2, ValueSH1_2);
      digitalWrite(SH2_1, ValueSH2_1);
      digitalWrite(SH2_2, ValueSH2_2);
      digitalWrite(SH3_1, ValueSH3_1);
      digitalWrite(SH3_2, ValueSH3_2);
      digitalWrite(SH4_1, ValueSH4_1);
      digitalWrite(SH4_2, ValueSH4_2);
      

    }

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


    void setup()
    {
      digitalWrite(SH1_1, HIGH);
           pinMode(SH1_1,OUTPUT);
      digitalWrite(SH1_2, HIGH);
           pinMode(SH1_2,OUTPUT);
      digitalWrite(SH2_1, HIGH);
           pinMode(SH2_1,OUTPUT);
      digitalWrite(SH2_2, HIGH);
           pinMode(SH2_2,OUTPUT);
      digitalWrite(SH3_1, HIGH);
           pinMode(SH3_1,OUTPUT);
      digitalWrite(SH3_2, HIGH);
           pinMode(SH3_2,OUTPUT);
      digitalWrite(SH4_1, HIGH);
           pinMode(SH4_1,OUTPUT);
      digitalWrite(SH4_2, HIGH);
           pinMode(SH4_2,OUTPUT);

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


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

    boolean reconnect() {
      if (client.connect("arduino2", "openhabian", "HESLO K MQTT BROKERU")) {
        // Once connected, publish an announcement...
        client.publish("shutters","reconnected");
        // ... and resubscribe
        client.subscribe("shutters");
      }
      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 shutters.items kde bude seznam žaluzií (typ rollershutter) a přiřazení názvu, skupiny a hlavně tvaru MQTT správy, na kterou bude Arduino reagovat. Všimněte si, že na konci je expire="60s,command=STOP" co značí, že se napájení motoru vypne po 60 vteřinách (v této době už bude pohyb rolety/žaluzie automaticky ukončen dorazem. Pro používaní "expire" je nutné mít v OpenHAB Addons nainstalovaný Expire Binding.

Vzor shutters.items

   /* Zde jsou žaluzie ovládaná pomocí relé */
    
 /*SH1*/        Rollershutter SH1       "SH1   Pracovna"            (GroundFloor,  Rollershutters)   {mqtt=">[mosquitto:shutters:command:UP:SH1_1on],>[mosquitto:shutters:command:DOWN:SH1_2on],>[mosquitto:shutters:command:STOP:SH1_1off],>[mosquitto:shutters:command:STOP:SH1_2off]", expire="60s,command=STOP"}           
 /*SH2*/        Rollershutter SH2       "SH2   Obývací pokoj"       (GroundFloor,  Rollershutters)   {mqtt=">[mosquitto:shutters:command:UP:SH2_1on],>[mosquitto:shutters:command:DOWN:SH2_2on],>[mosquitto:shutters:command:STOP:SH2_1off],>[mosquitto:shutters:command:STOP:SH2_2off]", expire="60s,command=STOP"}           
 /*SH3*/        Rollershutter SH3       "SH3   Kuchyně"             (GroundFloor,  Rollershutters)   {mqtt=">[mosquitto:shutters:command:UP:SH3_1on],>[mosquitto:shutters:command:DOWN:SH3_2on],>[mosquitto:shutters:command:STOP:SH3_1off],>[mosquitto:shutters:command:STOP:SH3_2off]", expire="60s,command=STOP"}           
 /*SH4*/        Rollershutter SH4       "SH4   Dětský pokoj"        (GroundFloor,  Rollershutters)   {mqtt=">[mosquitto:shutters:command:UP:SH4_1on],>[mosquitto:shutters:command:DOWN:SH4_2on],>[mosquitto:shutters:command:STOP:SH4_1off],>[mosquitto:shutters:command:STOP:SH4_2off]", expire="60s,command=STOP"}           

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 4 žaluzie a můžete zkusit pustit žaluzii nahoru/dolů anebo zastavit v čase prostřední ikonou.

Tip: Můžete do shutters. items přidat řádek

/*Obývací pokoj*/   Rollershutter SH_Living      "Skupina žaluzií obývací pokoj" 

pak vytvořte v OpenHAB ve složce Rules položku shutters.rules, kde můžete při akci na skupinu aktivovat několik žaluzíí najednou

Vzor shutters.rules

/*Obývací pokoj - otevřít*/
rule "Shutters living room open"
when
 Item SH_Living changed to 0
then
 sendCommand(SH1, UP)
 sendCommand(SH2, UP)
end

/*Obývací pokoj - stop*/
rule "Shutters living room open"
when
 Item SH_Living changed to 10
then
  sendCommand(SH1, STOP)
  sendCommand(SH2, STOP)
end    

/*Obývací pokoj - zavřít*/
rule "Shutters living room close"
when
 Item SH_Living changed to 100
then
  sendCommand(SH1, DOWN)
  sendCommand(SH2, DOWN)
end  

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.