Rozšíření - Ovládací tlačítka / vypínače

V projektu Pi-Home můžete použít jakékoliv standardní tlačítka a vypínače pro 230 V nebo speciální pro 24 V atp. Velkou výhodu zde má místo klasických vypínačů použití tlačítek. Důvod je zřejmý, na tlačítko můžeme navázat víc ruzných funkcí (opakované stlačení, podržení atd). V naších realizacích máme velmi dobrou zkušenost s klasickými 230 V tlačítky od firmy Hager/Berker, ale samozřejmě je možné použít jakékoliv jiné značky.

Co budeme potřebovat:

Základ - OpenHAB na Raspberry Pi

Klasické vypínače nebo lépe tlačítka - volba dle designu, aby se vám líbily

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

Krone svorky / DIN držák

 

Napájení a propojení

Standardně se k tlačítku tahá UTP kabel. Postačí bohatě CAT5 nebo CAT6. Pro jednotlačítko potřebujeme pouze 2 žíly, pro dvojtlačítko 3 žíly, pro čtyřtlačítko 5 žil. Tam kde tedy bude víc tlačítek lze potáhnout i jeden UTP kabel a zapojit více tlačítek z jednoho kabelu, určitě si ale ponechte rezervu, nikdy nevíte co bude ještě potřeba. Vždy je zapojena země GND a ze všech tlačítek jsou všechny GND pospojované na zemnící Krone svorce - na obrázku červená svorka (má všechny piny pospojené). Jednotlivé tlačítka jsou pak na klasické bílé Krone svorce a jednotlivé vývody jsou pak připojené k pinům desky Arduino Mega. Pře Krone svorku to jde kvůli pořádku a jednotnosti. Samozřejmě lze vyvést UTP žíly přímo na pin Arduina, ale může se to stát rigindní a nepřehledné. Na jednu Arduino Mega desku lze zapojit více než 50 jednotlačítek. 

Pi-Home - zapojení vypínačů OpenHAB

Software

Cílem je aby nám Arduino poslalo přes MQTT protokol informaci, že došlo ke stisku (spojení PIN a GND). Podržíme-li tlačítko bude se informace o stisku opakovat po zvolené časové prodlevě, např. po 1 sekundě. Sketch zapojení tří tlačítek naleznete níže. Informace o stisku je odchycena v OpenHAB kde dojde k updatu u daného tlačítka v seznamu dle konkrétní zprávy z Arduina. Posledním krokem je pak nastavení pravidel (Rules), které řeknou co dělat když dojde k updatu hodnoty u daného tlačítka - jakou akci vyvolat.

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. V sketchi jsou pak deklarované proměnné (piny), na kterých jsou připojeny jednotlivé vypínače nebo tlačítka. Stisknutí tlačítka vyvolá spojení pinu Arduina s GND a zaslání MQTT s informací, že došlo k stisku. Aktualizuje se items tlačítka v OpenHAB a vyvolá se pravidlo ze složky rules, pokud je definované. Vzory sketchů a konfiguráu pro OpenHAB nalezneti níže:

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 " Buttons.ino"



    /*
     Example MQTT-switch-relay-node with buttons  
      - connects to an MQTT server
      - publishes "hello world" to the topic "relay"
      - subscribes to the specific topic
      - sends a specific "on"/"off" to the specific topic when specific button is pressed
      - 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>

    // MAC address of ethernet shield (DHCP automatically set IP)
    byte MAC_ADDRESS[] = {  0xCC, 0xGA, 0x01, 0xCB, 0x19, 0x09 };
    IPAddress ip(192, 168, 4, 42); //added for fixed ip
    IPAddress gateway(192, 168, 4, 1); //added for fixed ip

    // IP address of MQTT server (OpenHAB Server)
    byte MQTT_SERVER[] = { 192, 168, 4, 30 };

    //Pushbuttons
    int but1 = 23;
    int but2 = 24;
    int but3 = 25;
    
    //Classic switches (ON/OFF) - script prevent to send state every second and send state only when state is changed
    int but4 = 26;
    int but5 = 27;
    int but6 = 28;
     
    int state_but4;
    int state_but5;
    int state_but6;
    
    int oldstate_but4;
    int oldstate_but5;
    int oldstate_but6;


    void callback(char* topic, byte* payload, unsigned int length) {
      // handle message arrived (no messages expected though)
    }


    EthernetClient arduino3;  
    PubSubClient client(MQTT_SERVER, 1883, callback, arduino4);

    //-------------------------------------------------------
    //Priprava tlacitek

    void setup(){
      Ethernet.begin(MAC_ADDRESS,ip,gateway);
      if (client.connect("arduino3", "openhabian", "HESLO_K_MQTT_BROKERU")) {
        client.publish("relay", "Arduino 3 connected IP 192.168.4.42");
      }

     pinMode(but1, INPUT);
     digitalWrite(but1, HIGH);
     pinMode(but2, INPUT);
     digitalWrite(but2, HIGH);
     pinMode(but3, INPUT);
     digitalWrite(but3, HIGH);
     pinMode(but4, INPUT);
     digitalWrite(but4, HIGH);
     pinMode(but5, INPUT);
     digitalWrite(but5, HIGH);
     pinMode(but6, INPUT);
     digitalWrite(but6, HIGH);
    }


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

    boolean reconnect() {
      if (client.connect("arduino3", "openhabian", "HESLO_K_MQTT_BROKERU")) {
        // Once connected, publish an announcement...
        client.publish("relay","reconnected");
      }
      return client.connected();
    }
    //----------------------------------------------

    void loop()
    {


    // these are pushbuttons
    if (digitalRead(but1)==LOW){
       client.publish("button/but1","but1");
       delay(1000); // short delay to prevent double click when use in practice, can be shorter
      }
    if (digitalRead(but2)==LOW){
       client.publish("button/but2","but2");
       delay(1000); // short delay to prevent double click when use in practice, can be shorter
      }
    if (digitalRead(but3)==LOW){
       client.publish("button/but3","but3");
       delay(1000); // short delay to prevent double click when use in practice, can be shorter
      }
    
    // these are a normal switches (on/off)
    
    state_but4 = digitalRead(but4); // read the switch State
    if (state_but4 != oldstate_but4) // catch change
    {
        oldstate_but4 = state_but4;
        if (state_but4 == HIGH){
        client.publish("button/but4","but4on");
        }
        else{
        client.publish("button/but4","but4off");
        }    
    }
    
    state_but5 = digitalRead(but5); // read the switch State
    if (state_but5 != oldstate_but5) // catch change
    {
        oldstate_but5 = state_but5;
        if (state_but5 == HIGH){
        client.publish("button/but5","but5on");
        }
        else{
        client.publish("button/but5","but5off");
        }    
    }
    
    state_but6 = digitalRead(but6); // read the switch State
    if (state_but6 != oldstate_but6) // catch change
    {
        oldstate_but6 = state_but6;
        if (state_but6 == HIGH){
        client.publish("button/but6","but6on");
        }
        else{
        client.publish("button/but6","but6off");
        }    
    }
      
          
   
      delay(50);
     
     
     
      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 buttons.items kde bude seznam tlačítek (typ string) a přiřazení názvu, skupiny a hlavně tvaru MQTT zprávy, na kterou bude položka reagovat. V tomto případě budeme pouze aktualizovat hodnotu. U tlačítek vždy posílat stejnou hodnotu, jelikož neznáme stav a u vypínačů klasických pošleme stav při přepnutí, tam jsme schopni poslat on/off.

Vzor buttons.items

String but1   {mqtt="<[mosquitto:button/but1:state:default]"}
String but2   {mqtt="<[mosquitto:button/but2:state:default]"}
String but3   {mqtt="<[mosquitto:button/but3state:default]"}
String but4   {mqtt="<[mosquitto:button/but4:state:default]"}
String but5   {mqtt="<[mosquitto:button/but5:state:default]"}
String but6   {mqtt="<[mosquitto:button/but6:state:default]"}

Dále po odchycení stavu (update nebo změna hodnoty u vypínače) vyvoláme akci. V OpenHAB na to slouží pravidla - rules. Do složky rules vložte soubor buttons.rules. Níže naleznete vzorový obsah.

Vzor buttons.rules

/* Tlačítka */

/*==============================*/
/*Rozsviť světlo v zahradě nebo pokud svítí tak jej zhasni*/
rule "Tlačítko 1"
when
 Item but1 received update
then
 if(Light_Gar_1.state == OFF){
  sendCommand(Light_Gar_1, ON)
  }else{
  sendCommand(Light_Gar_1, OFF)
  }   
end

/*==============================*/
/*Rozsviť světlo na toaletě nebo pokud svítí tak jej zhasni*/
rule "Tlačítko 2"
when
 Item but2 received update
then
 if(Light_Room_4.state == OFF){
  sendCommand(Light_Room_4, ON)
  }else{
  sendCommand(Light_Room_4, OFF)
  }   
end

/*==============================*/
/*Rozsviť světlo v kuchyni nebo pokud svítí tak jej zhasni*/
rule "Tlačítko 3"
when
 Item but3 received update
then
 if(Light_Room_8.state == OFF){
  sendCommand(Light_Room_8, ON)
  }else{
  sendCommand(Light_Room_8, OFF)
  }   
end

/*==============================*/

/* Vypínače */


/*Rozsviť světlo v baru nebo jej zhasni*/
rule "Tlačítko 4"
when
 Item but4 received update
then
 if(but4.state == 'but4on'){
  sendCommand(Light_Room_5, ON)
  }
 if(but4.state == 'but4off'){
  sendCommand(Light_Room_5, OFF)
  }   
end

/*==============================*/

/*Rozsviť světlo ve spíži nebo jej zhasni*/
rule "Tlačítko 5"
when
 Item but5 received update
then
 if(but5.state == 'but5on'){
  sendCommand(Light_Room_6, ON)
  }
 if(but5.state == 'but5off'){
  sendCommand(Light_Room_6, OFF)
  }   
end

/*==============================*/

/*Rozsviť světlo v salónu nebo jej zhasni*/
rule "Tlačítko 6"
when
 Item but6 received update
then
 if(but6.state == 'but6on'){
  sendCommand(Light_Room_3, ON)
  }
 if(but6.state == 'but6off'){
  sendCommand(Light_Room_3, OFF)
  }   
end

A to je vše! Zkuste si nějaké testovací tlačítko zapojit a sledovat log v OpenHAB (v příkladu http://192.168.4.40:9001). Měli by jste po stlačení vidět, že došlo k updatu hodnoty string u tlačítka. Pokud máte i předešlé relay.items z předešlého návodu, měla by se světla v nich uvedená spínat pomocí rules.

Tip: Na jednu desku Arduino Mega s Ethernet shieldem se vejde přes 50 tlačítek.

Přidat komentář

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.