Rozšíření - Senzory drátové

Následující návod vám nabídne rozšíření základní instalace OpenHAB o nepřeberné množství drátových senzorů kompatibilních s deskami Arduino. Jako základ vám ukážeme použitelný kód pro sbírání informací ze senzorů teploty, vlhkosti a pohyboveho senzoru (PIR).   


Co budeme potřebovat:

Základ - OpenHAB na Raspberry Pi

Arduino Mega /DIN držák

KRONE svorky /DIN držák

Senzory kompatibilní s Arduinem (např. DHT22 - teplota, vlhkost, DS18B30 - teplota, waterproof, HC-SR501- pohybový senzor atp.)

Arduino je pro náš otevřený systém inteligentního domu kritickým prvkem. Díky velkému množství aplikací a kompatibilního hardware jsou možnosti rozšíření téměř neomezené. Navíc samotná deska a kompatibilní senzory jsou cenově bezkonkurenční. Konkrétně doporučujeme desku Arduino Mega s Ethernet shieldem. Je vybavena až 50 piny pro vstup/výstup a hravě zvládá komunikaci po protokolu MQTT prostřednictvím LAN připojení.

Napájení a propojení

Pi-Home - chytrý dům a senzory teplot, vlhkosti, pohybu

Software

V následující části naleznete sketch a makefile pro Arduino se vzorovým kódem čidel DHT22 a HC-SR501 a DS18B30 na jednom Arduinu. Sketch je kus kódu, který je po uploadu na Arduino cyklicky opakován.

Ukázkový sketch

V tomto jednoduchém sketchi jsou použité knihovny SPI.h, Ethernet.h, DHT.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 DHT
include /usr/share/arduino/Arduino.mk



Vzorový sketch " Sensors.ino"

  /*
 Script to get informations from PIR, DHT22, DS18B30 via MQTT
 
  - connect to MQTT server
  - publishes "Hello world - Arduino XYZ" to the topic "relay"
  - multiple arduino's with same generic sketch can run parallel to each other
  - multiple arduino's need each to have a unique ip-address, unique mac address and unique MQTT client-ID
  - tested on arduino-mega with W5100 ethernet shield
*/

//MQTT
#include <PubSubClient.h>
#include <Ethernet.h>

//DHT+DS18b30
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>

//Time loop
unsigned long time_now = 0;


//***DHT22***//
#define DHT1 9
#define DHT2 8  
#define DHTTYPE DHT22         

DHT dht1(DHT1, DHTTYPE);
DHT dht2(DHT2, DHTTYPE);


//Temperature variable (DHT22)
char buff_roomtemp1[10];
char buff_roomtemp2[10];

//Humidity variable (DHT22)
char buff_roomhum1[10];
char buff_roomhum2[10];


//***DS18B20***//
#define ONE_WIRE_BUS 28
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 
float DS1=0;
float DS2=0;

char buff_floortemp1[10];
char buff_floortemp2[10];

// if you know MAC of your sensor, fill it below and set request form specific MAC in code below
//DeviceAddress DSTS11mac = { 0x28, 0xAA, 0x4C, 0xF2, 0x37, 0x14, 0x01, 0x1E};


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

    // 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, 0xCF, 0x06, 0xCB, 0x19, 0x00 };  

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


    // 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) {
 
}


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

//***PIR***//
int pir1 = 16;    
int pir2 = 17;    
 
// No motion detected at start
int valpir1 = 0;
int valpir2 = 0;

//Last values
int lastpir1 = LOW;
int lastpir2 = LOW;


// Setup
void setup() {
  // For programming DS18B30 only - if you want to know MAC adress of the sensors
  //Serial.begin(115200);
  //DS18B20   
  sensors.begin();
 
  //DHT22   
  dht1.begin();
  dht2.begin();
 
  // Setup ethernet connection to MQTT broker
  Ethernet.begin(mac, ip);
  if (client.connect("arduino_3", "openhabian", "HESLO K MQTT BROKERU")) {
    client.publish("pir","Hello world - here Arduino 3 with IP 192.168.4.33");
  }
 
  //PIR 5V
  pinMode(pir1, INPUT);
  pinMode(pir2, INPUT);
 
}

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

boolean reconnect() {
 if (client.connect("arduino_3", "openhabian", "HESLO K MQTT BROKERU")) {
    // Once connected, publish an announcement...
    client.publish("pir","Arduino 3 - reconnected");
  }
  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();
}

 
   
/*
if(millis() >= time_now2 + 5000){
   time_now2 += 5000;
 
//DS18B30 - only if you want to know MAC addresses if you have multiple DS18B30 sensors
//Print all physical addresses for oneWire to Serial port
     byte i;
     byte addr[8];
     int id=0;     
     
     
     
     while(oneWire.search(addr))
     {
         Serial.print(id);
         Serial.print(": ");
       for( i = 0; i < 8; i++) {      
         Serial.print(addr[i], HEX);
         Serial.print(" ");
         }    
         Serial.println("");      
       id++;   
     }
     oneWire.reset_search();
    
}
*/
client.publish("temp/hmm","hmm");
// Collect sensor data every 30 sec
if(millis() >= time_now + 30000){
   time_now += 30000;  
   
   //=============DS18B20 sensors temperature (waterproof)==================
    
      sensors.requestTemperatures();
      //DS1 = sensors.getTempC(DS1mac); //if you want to get temp from specific MAC instead of index number (index number can change in time)
      DS1 = sensors.getTempCByIndex(0);
      //Filter logical values only
      if ((DS1 >=-10) && (DS1<= 100)){
      dtostrf(DS1,3, 1, buff_floortemp1);      
      client.publish("temp/floortemp1", buff_floortemp1);
      }
            
      
      
         
   //============DHT22 Sensors - Temperature + Humidity============

   
      //TS11 DHT22  
      float h1 = dht1.readHumidity();
      if ((h1 >=2) && (h1<= 99)){
      dtostrf(h1,3, 1, buff_roomhum1);
      client.publish("temp/roomhum1", buff_roomhum1);     
      }   
      float t1 = dht1.readTemperature();
      if ((t1 >=-30) && (t1<= 140)){
      dtostrf(t1,3, 1, buff_roomtemp1);
      client.publish("temp/roomtemp1", buff_roomtemp1);  
      }
      
      //TS12 DHT22  
      float h2 = dht2.readHumidity();
      if ((h2 >=2) && (h2<= 99)){
      dtostrf(h2,3, 1, buff_roomhum2);
      client.publish("temp/roomhum2", buff_roomhum2);     
      }   
       float t2 = dht2.readTemperature();
      if ((t2 >=-30) && (t2<= 140)){
      dtostrf(t2,3, 1, buff_roomtemp2);
      client.publish("temp/roomtemp2", buff_roomtemp2);  
      }
      
      
}   
   
//================PIR SENSORS====================================



  //PIR1
  valpir1 = digitalRead(pir1);
  if (valpir1 != lastpir1) {  
   if (valpir1 == HIGH) {
    client.publish("pir","pir1on");
   }
  }
  lastpir1 = valpir1;   
 
  //PIR2
  valpir2 = digitalRead(pir2);
  if (valpir2 != lastpir2) {  
   if (valpir2 == HIGH) {
    client.publish("pir","pir2on");
   }
  }
  lastpir2 = valpir2;      
 
   
delay(500);  
 
}
 

OpenHAB

V OpenHAB vytvořte soubor sensors.items kde bude seznam hodnot. Můžete klidně rozdělit teploty a pir do samostatných souborů.  Jde hlavně o tvar MQTT zprávy, ze které bude OpenHAB číst.

Vzor relay.items

  /* Zde jsou items pro senzory DHT22, DS18B30 a PIR z Arduina */


/* DHT22 */
/*Roomtemp1*/ Number RoomTemp1    "Teplota 1                    [%.1f °C]" (Temperature)    {mqtt="<[mosquitto:temp/roomtemp1:state:default]"}
/*Roomtemp2*/ Number RoomTemp2    "Teplota 2                    [%.1f °C]" (Temperature)    {mqtt="<[mosquitto:temp/roomtemp2:state:default]"}
/*Roomhum1*/  Number RoomHum1     "Vlhkost 1                    [%.1f %]" (Humidity)    {mqtt="<[mosquitto:temp/roomhum1:state:default]"}
/*Roomhum2*/  Number RoomHum2     "Vlhkost 2                    [%.1f %]" (Humidity)    {mqtt="<[mosquitto:temp/roomhum2:state:default]"}

/* DS18B30 */
/*Floortemp1*/ Number FloorTemp1    "Teplota podlahy 1                   [%.1f °C]" <mar>   (Temperature)    {mqtt="<[mosquitto:temp/floortemp1:state:default]"}
/*Floortemp2*/ Number FloorTemp2    "Teplota podlahy 2                   [%.1f °C]" <mar>   (Temperature)    {mqtt="<[mosquitto:temp/floortemp2:state:default]"}

/* PIR sensors */
/*Triggers */    
Switch pir1  "PIR 1 TRIGGER"    (PIR)          {mqtt="<[mosquitto:pir:command:ON:pir1on]",expire="20s,command=OFF"}
Switch pir2  "PIR 2 TRIGGER"    (PIR)          {mqtt="<[mosquitto:pir:command:ON:pir2on]",expire="20s,command=OFF"}

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 senzory a jejich hodnoty. Toto řešení lze neomezeně rozšířit.

Tip: Chcete-li mít možnost přizpusobovat chování PIR v aplikaci, přečtěte si článek v blogu Pokročilé nastavení PIR čidel pro řízení světel v OpenHAB.

Komentáře

Your profile picture

dfdfdf

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.