Arduino Grow Light Timer Six Switch/Relay Dual on/off Control V3.0 no oled/button version


 //*****************************************************************************************************************  
 //*****************************************************************************************************************  
   
   
 //************<<<< Arduino Nano, DS3231 Real Time Clock & Six Relay Module Lights Timer V3.0 >>>>******************  
   
   
 //*****************************************************************************************************************  
   
 //*****************************************************************************************************************  
 /*  
 Sketch uses 5722 bytes (18%) of program storage space. Maximum is 30720 bytes.  
 Global variables use 286 bytes (13%) of dynamic memory, leaving 1762 bytes for local variables. Maximum is 2048 bytes.  
   
  ************** UPDATED ON Oct 13 2018 *************  
   
 */  
   
   
 // no oled version  
 // six lights/relay control each with two on/off routines  
 // for oled version   
   
 //*****************************************************************************************************************  
   
   
 //*********************<<<< PLEASE VISIT / SUBSCRIBE MY YOUTUBE CHANNEL >>>>***************************************  
   
 // comment for more info  
   
   
 //*********************<<<<  Youtube.com/CrazyGuyOfficial  >>>>*****************************************  
   
   
   
 //*****************************************************************************************************************  
   
   
 //*****************************************************************************************************************  
 // INCLUDE LIBRARIES  
 //*****************************************************************************************************************  
   
   
   
   
   
   
 #include <Time.h>  // Time Manipulation   
 #include <Wire.h>  
 #include <DS1307RTC.h> // DS1307 RTC   
   
   
   
   
   
   
   
   
 //**********************//**********************//**********************  
 //  PINS AND CONNECTIONS  
 //**********************//**********************//**********************  
 const byte lightBlink  = 3 ;  
   
 const byte lightOne   = 5 ;  
 const byte lightTwo   = 6 ;  
 const byte lightThree  = 4 ;  
 const byte lightFour  = 7 ;  
 const byte lightFive   = 2 ;  
 const byte lightSix   = 8 ;  
   
   
   
 // DS3231 RTC "SDA to A4", "SCL to A5" "Vcc to 5V arduino pin Gnd to Gnd"  
 // Add more names/pins for more relays  
   
   
 //##################################################  
   
 // Light Timer ON/OFF Time Settings DEFAULT  
   
 //##################################################  
   
   
   
 byte OnOne1   = 14 ; // Hour when Light 1 will turn ON (24 hr format NO zeros before single digits)  
 byte OffOne1  = 8 ; // Hour when Light 1 will turn OFF (24 hr format NO zeros before single digits)  
 byte OnOne2   = 14 ;  // Hour when Light 1 will turn ON (24 hr format NO zeros before single digits)  
 byte OffOne2  = 8 ;  // Hour when Light 1 will turn OFF (24 hr format NO zeros before single digits)
   
   
 byte OnTwo1   = 20 ;  
 byte OffTwo1  = 8 ;  
 byte OnTwo2   = 20 ;  
 byte OffTwo2  = 8 ;  
   
 byte OnThree1  = 14 ;  
 byte OffThree1 = 8 ;  
 byte OnThree2  = 14 ;  
 byte OffThree2 = 8 ;  
   
 byte OnFour1  = 14 ;  
 byte OffFour1  = 8 ;  
 byte OnFour2  = 14 ;  
 byte OffFour2  = 8 ;  
   
 byte OnFive1  = 14 ;  
 byte OffFive1  = 8 ;  
 byte OnFive2  = 14 ;  
 byte OffFive2  = 8 ;  
   
 byte OnSix1   = 14 ;  
 byte OffSix1  = 8 ;  
 byte OnSix2   = 14 ;  
 byte OffSix2  = 8 ;  
   
   
   
 //*****************************************************************************************************************  
   
 bool RTCerr = 0;  
   
 bool LightOneSts   = 0 ;  
   
 bool LightTwoSts   = 0 ;  
   
 bool LightThreeSts  = 0 ;  
   
 bool LightFourSts  = 0 ;  
   
 bool LightFiveSts  = 0 ;  
   
 bool LightSixSts   = 0 ;  
   
   
 bool ppOne1     = 0 ;  
 bool ppOne2     = 0 ;  
   
 bool ppTwo1      = 0 ;  
 bool ppTwo2      = 0 ;  
   
 bool ppThree1      = 0 ;  
 bool ppThree2      = 0 ;  
   
 bool ppFour1      = 0 ;  
 bool ppFour2      = 0 ;  
   
 bool ppFive1      = 0 ;  
 bool ppFive2     = 0 ;  
   
 bool ppSix1      = 0 ;  
 bool ppSix2      = 0 ;  
   
 unsigned long SecsOne = 0;  
   
   
   
 //##################  
 //## RTC ADDRESS ##  
 //##################  
   
   
 #define DS1307_ID 0x68 // I2c Address of the RTC    
   
 byte zero = 0x00; //workaround for issue #527  
   
 //#################################  
   
   
   
   
   
 //*****************************************************************************************************************  
 // SETUP BEGINS  
 //*****************************************************************************************************************  
   
   
 void setup()  
 {  
  digitalWrite(lightOne,  HIGH);  
  digitalWrite(lightTwo,  HIGH); // turn the relay "OFF" and turning the pin "LOW" turns the relay "ON"  
  digitalWrite(lightThree, HIGH);  
  digitalWrite(lightFour, HIGH);  
  digitalWrite(lightFive, HIGH); // turn the relay "OFF" and turning the pin "LOW" turns the relay "ON"  
  digitalWrite(lightSix,  HIGH);  
   
   
  pinMode(lightBlink, OUTPUT);  
   
  pinMode(lightOne,  OUTPUT);  
  pinMode(lightTwo,  OUTPUT);  
  pinMode(lightThree, OUTPUT);  
  pinMode(lightFour, OUTPUT);  
  pinMode(lightFive, OUTPUT);  
  pinMode(lightSix,  OUTPUT);  
   
  //**********************//**********************//***********************//**********************  
  //Check to see if the RTC is present.if yes then Set the ARDUINO's INTERNAL clock accordingly  
  //**********************//**********************//***********************//**********************  
   
   
  Wire.beginTransmission(DS1307_ID);  
  Wire.write((uint8_t)0x00);  
   
  setSyncProvider(RTC.get);   //Yes it did, Sync the time from the RTC  
  setSyncInterval(20);  
   
   
   
  if (timeStatus() != timeSet)  
   RTCerr = 1;  
  else  
   RTCerr = 0;  
   
   
   
    
   
   
   
  Delay15S();  
   
 }  
   
 //*****************************************************************************************************************  
 //        SETUP END  
 //*****************************************************************************************************************  
   
   
   
 void Delay15S()  
 {  
  delay(1500);  
   
 }  
   
   
 //*****************************************************************************************************************  
   
   
 //     LOOP BEGINS  
   
   
 //*****************************************************************************************************************  
   
   
   
   
 void loop()  
 {  
    
   
   
   
  //#####################################  
  //####### LIGHTs ON/OFF ###############  
  //#####################################  
   
   
   
  //########## LIGHT ONE PP1##########################  
   
  if (OffOne1 > OnOne1)  
  {  
   
   
   if (hour() >= OnOne1 && hour () <= OffOne1 - 1)  
   {  
    TurnLightOneOn1();  
   }  
   
   else  
   {  
    TurnLightOneOff1();  
   
   }  
   
  }  
   
   
  //**********************************************************  
   
   
  if (OffOne1 < OnOne1 )  
  {  
   
   
   if (hour() >= OnOne1 || hour () <= OffOne1 - 1)  
   {  
    TurnLightOneOn1();  
   }  
   
   
   
   else  
   {  
    TurnLightOneOff1();  
   
   }  
  }  
   
   
  //########## LIGHT ONE PP2 ##########################  
   
  if (OffOne2 > OnOne2)  
  {  
   
   
   if (hour() >= OnOne2 && hour () <= OffOne2 - 1)  
   {  
    TurnLightOneOn2();  
   
   
   }  
   
   else  
   {  
    TurnLightOneOff2();  
   
   }  
   
  }  
   
   
  //**********************************************************  
   
   
  if (OffOne2 < OnOne2 )  
  {  
   
   
   if (hour() >= OnOne2 || hour () <= OffOne2 - 1)  
   {  
    TurnLightOneOn2();  
   
   
   }  
   
   
   
   else  
   {  
    TurnLightOneOff2();  
   
   
   }  
  }  
   
  //####################################################################  
   
  //########## LIGHT TWO pp1 ##########################  
   
  if (OffTwo1 > OnTwo1)  
  {  
   
   
   if (hour() >= OnTwo1 && hour () <= OffTwo1 - 1)  
   {  
    TurnLightTwoOn1();  
   
   }  
   
   else  
   {  
   
    TurnLightTwoOff1();  
   
   }  
   
  }  
   
   
  //**********************************************************  
   
   
  if (OffTwo1 < OnTwo1)  
  {  
   
   
   if (hour() >= OnTwo1 || hour () <= OffTwo1 - 1)  
   {  
    TurnLightTwoOn1();  
   
   
   }  
   
   
   
   else  
   {  
    TurnLightTwoOff1();  
   
   
   }  
  }  
  //########## LIGHT TWO pp2 ##########################  
   
  if (OffTwo2 > OnTwo2)  
  {  
   
   
   if (hour() >= OnTwo2 && hour () <= OffTwo2 - 1)  
   {  
    TurnLightTwoOn2();  
   }  
   
   else  
   {  
    TurnLightTwoOff2();  
   
   }  
   
  }  
   
   
  //**********************************************************  
   
   
  if (OffTwo2 < OnTwo2)  
  {  
   
   
   if (hour() >= OnTwo2 || hour () <= OffTwo2 - 1)  
   {  
    TurnLightTwoOn2();  
   
   }  
   
   
   
   else  
   {  
    TurnLightTwoOff2();  
   
   
   }  
  }  
   
   
   
  //####################################################################  
   
  //########## LIGHT THREE pp 1 ##########################  
   
  if (OffThree1 > OnThree1)  
  {  
   
   
   if (hour() >= OnThree1 && hour () <= OffThree1 - 1)  
   {  
    TurnLightThreeOn1();  
   }  
   
   else  
   {  
    TurnLightThreeOff1();  
   
   
   }  
   
  }  
   
   
  //**********************************************************  
   
   
  if (OffThree1 < OnThree1)  
  {  
   
   
   if (hour() >= OnThree1 || hour () <= OffThree1 - 1)  
   {  
    TurnLightThreeOn1();  
   
   }  
   
   
   
   else  
   {  
   
    TurnLightThreeOff1();  
   
   
   
   
   }  
  }  
  //########## LIGHT THREE pp 2 ##########################  
   
  if (OffThree2 > OnThree2)  
  {  
   
   
   if (hour() >= OnThree2 && hour () <= OffThree2 - 1)  
   {  
    TurnLightThreeOn2();  
   }  
   
   else  
   {  
    TurnLightThreeOff2();  
   
   }  
   
  }  
   
   
  //**********************************************************  
   
   
  if (OffThree2 < OnThree2)  
  {  
   
   
   if (hour() >= OnThree2 || hour () <= OffThree2 - 1)  
   {  
    TurnLightThreeOn2();  
   
   }  
   
   
   
   else  
   {  
   
    TurnLightThreeOff2();  
   
   }  
  }  
   
  //####################################################################  
   
  //########## LIGHT FOUR pp1 ##########################  
   
  if (OffFour1 > OnFour1)  
  {  
   
   
   if (hour() >= OnFour1 && hour () <= OffFour1 - 1)  
   {  
    TurnLightFourOn1();  
   }  
   
   else  
   {  
    TurnLightFourOff1();  
   
   
   }  
   
  }  
   
   
  //**********************************************************  
   
   
  if (OffFour1 < OnFour1)  
  {  
   
   
   if (hour() >= OnFour1 || hour () <= OffFour1 - 1)  
   {  
    TurnLightFourOn1();  
   
   }  
   
   
   
   else  
   {  
    TurnLightFourOff1();  
   
   
   }  
  }  
  //########## LIGHT FOUR pp2 ##########################  
  if (OffFour2 > OnFour2)  
  {  
   
   
   if (hour() >= OnFour2 && hour () <= OffFour2 - 1)  
   {  
    TurnLightFourOn2();  
   
   }  
   
   else  
   {  
    TurnLightFourOff2();  
   
   }  
   
  }  
   
   
  //**********************************************************  
   
   
  if (OffFour2 < OnFour2)  
  {  
   
   
   if (hour() >= OnFour2 || hour () <= OffFour2 - 1)  
   {  
    TurnLightFourOn2();  
   
   }  
   
   
   
   else  
   {  
    TurnLightFourOff2();  
   
   
   }  
  }  
   
  //####################################################################  
   
  //########## LIGHT FIVE pp1 ##########################  
   
  if (OffFive1 > OnFive1)  
  {  
   
   
   if (hour() >= OnFive1 && hour () <= OffFive1 - 1)  
   {  
    TurnLightFiveOn1();  
   }  
   
   else  
   {  
    TurnLightFiveOff1();  
   
   
   }  
   
  }  
   
   
  //**********************************************************  
   
   
  if (OffFive1 < OnFive1)  
  {  
   
   
   if (hour() >= OnFive1 || hour () <= OffFive1 - 1)  
   {  
    TurnLightFiveOn1();  
   
   }  
   
   
   
   else  
   {  
    TurnLightFiveOff1();  
   
   }  
  }  
   
  //########## LIGHT FIVE pp2 ##########################  
   
  if (OffFive2 > OnFive2)  
  {  
   
   
   if (hour() >= OnFive2 && hour () <= OffFive2 - 1)  
   {  
    TurnLightFiveOn2();  
   
   }  
   
   else  
   {  
    TurnLightFiveOff2();  
   
   
   
   }  
   
  }  
   
   
  //**********************************************************  
   
   
  if (OffFive2 < OnFive2)  
  {  
   
   
   if (hour() >= OnFive2 || hour () <= OffFive2 - 1)  
   {  
    TurnLightFiveOn2();  
   
   }  
   
   
   
   else  
   {  
    TurnLightFiveOff2();  
   
   
   }  
  }  
   
   
  //####################################################################  
  //########## LIGHT SIX pp1 ##########################  
   
  if (OffSix1 > OnSix1)  
  {  
   
   
   if (hour() >= OnSix1 && hour () <= OffSix1 - 1)  
   {  
    TurnLightSixOn1();  
   }  
   
   else  
   {  
    TurnLightSixOff1();  
   
   
   
   }  
   
  }  
   
   
  //**********************************************************  
   
   
  if (OffSix1 < OnSix1)  
  {  
   
   
   if (hour() >= OnSix1 || hour () <= OffSix1 - 1)  
   {  
    TurnLightSixOn1();  
   
   }  
   
   
   
   else  
   {  
    TurnLightSixOff1();  
   
   }  
  }  
   
  //########## LIGHT SIX pp2 ##########################  
   
  if (OffSix2 > OnSix2)  
  {  
   
   
   if (hour() >= OnSix2 && hour () <= OffSix2 - 1)  
   {  
    TurnLightSixOn2();  
   }  
   
   else  
   {  
   
   
    TurnLightSixOff2();  
   
   
   
   }  
   
  }  
   
   
  //**********************************************************  
   
   
  if (OffSix2 < OnSix2)  
  {  
   
   
   if (hour() >= OnSix2 || hour () <= OffSix2 - 1)  
   {  
    TurnLightSixOn2();  
   
   }  
   
   
   
   else  
   {  
    TurnLightSixOff2();  
   }  
  }  
   
  //####################################################################  
   
   
   
  //#####################################  
  // Blink Led And Call RTC TEST  
  //#####################################  
   
  if (millis() / 1000 - SecsOne > 10 ) //  
  {  
   digitalWrite (lightBlink, HIGH); // blink status LED  
   
   
   rtctest();  
   
   SecsOne = millis() / 1000; // then reset the timer  
   
   
   
  }  
   
   
 }  
   
   
   
   
   
 //**********************//**********************//**********************  
 //        LOOP END  
 //**********************//**********************//**********************  
 void TurnLightOneOn1()  
 {  
  if (!LightOneSts)  
  {  
   digitalWrite(lightOne, LOW);  
   
   LightOneSts = 1 ;  
   
   Delay15S();  
   
  }  ppOne1 = 1 ;  
   
 }  
   
   
   
 void TurnLightOneOff1()  
 {  
  if (!ppOne2)  
  {  
   digitalWrite(lightOne, HIGH);  
   LightOneSts = 0 ;  
  }  
  ppOne1 = 0 ;  
   
   
 }  
   
   
   
   
   
 void TurnLightOneOn2()  
 {  
   
  if (!LightOneSts)  
  {  
   digitalWrite(lightOne, LOW);  
   LightOneSts = 1 ;  
   
   Delay15S();  
   
  }  ppOne2 = 1 ;  
   
   
   
 }  
   
 void TurnLightOneOff2()  
 {  
  if (!ppOne1)  
  {  
   digitalWrite(lightOne, HIGH);  
   LightOneSts = 0 ;  
  }  
  ppOne2 = 0 ;  
 }  
   
   
   
   
   
   
 void TurnLightTwoOn1()  
 {  
  if (!LightTwoSts)  
  {  
   digitalWrite(lightTwo, LOW);  
   
   LightTwoSts = 1 ;  
   
   Delay15S();  
   
  }  ppTwo1 = 1 ;  
   
 }  
   
   
   
 void TurnLightTwoOff1()  
 {  
  if (!ppTwo2)  
  {  
   digitalWrite(lightTwo, HIGH);  
   LightTwoSts = 0 ;  
  }  
  ppTwo1 = 0 ;  
   
   
 }  
   
 void TurnLightTwoOn2()  
 {  
   
  if (!LightTwoSts)  
  {  
   digitalWrite(lightTwo, LOW);  
   LightTwoSts = 1 ;  
   
   Delay15S();  
   
  }  ppTwo2 = 1 ;  
   
 }  
   
   
 void TurnLightTwoOff2()  
 {  
   
  if (!ppTwo1)  
  {  
   digitalWrite(lightTwo, HIGH);  
   LightTwoSts = 0 ;  
  }  
  ppTwo2 = 0 ;  
 }  
   
   
 void TurnLightThreeOn1()  
 {  
   
  if (!LightThreeSts)  
  {  
   digitalWrite(lightThree, LOW);  
   LightThreeSts = 1 ;  
   
   Delay15S();  
   
  }  ppThree1 = 1 ;  
   
 }  
   
   
   
 void TurnLightThreeOff1()  
 {  
  if (!ppThree2)  
  {  
   digitalWrite(lightThree, HIGH);  
   LightThreeSts = 0 ;  
  }  
  ppThree1 = 0 ;  
 }  
   
   
 void TurnLightThreeOn2()  
 {  
   
  if (!LightThreeSts)  
  {  
   digitalWrite(lightThree, LOW);  
   LightThreeSts = 1 ;  
   Delay15S();  
   
  } ppThree2 = 1 ;  
 }  
   
   
 void TurnLightThreeOff2()  
 {  
  if (!ppThree1)  
  {  
   digitalWrite(lightThree, HIGH);  
   LightThreeSts = 0 ;  
  }  
  ppThree2 = 0 ;  
   
 }  
   
 void TurnLightFourOn1()  
 {  
  if (!LightFourSts)  
  {  
   digitalWrite(lightFour, LOW);  
   LightFourSts = 1 ;  
   
   Delay15S();  
   
  }  
  ppFour1 = 1;  
   
 }  
 void TurnLightFourOff1()  
 {  
  if (!ppFour2)  
  {  
   
   digitalWrite(lightFour, HIGH);  
   LightFourSts = 0 ;  
  }  
  ppFour1 = 0;  
   
 }  
 void TurnLightFourOn2()  
 {  
  if (!LightFourSts)  
  {  
   digitalWrite(lightFour, LOW);  
   LightFourSts = 1 ;  
   Delay15S();  
   
  }  ppFour2 = 1;  
   
 }  
   
 void TurnLightFourOff2()  
 {  
  if (!ppFour1)  
  {  
   
   digitalWrite(lightFour, HIGH);  
   LightFourSts = 0 ;  
  }  
  ppFour2 = 0;  
   
 }  
   
 void TurnLightFiveOn1()  
 {  
  if (!LightFiveSts)  
  {  
   digitalWrite(lightFive, LOW);  
   LightFiveSts = 1 ;  
   
   Delay15S();  
   
  }  ppFive1 = 1;  
   
   
   
 }  
   
 void TurnLightFiveOff1()  
 {  
   
   
  if (!ppFive2)  
  {  
   
   
   digitalWrite(lightFive, HIGH);  
   LightFiveSts = 0 ;  
  }  
  ppFive1 = 0;  
   
   
   
   
   
 }  
 void TurnLightFiveOn2()  
 {  
   
  if (!LightFiveSts)  
  {  
   digitalWrite(lightFive, LOW);  
   LightFiveSts = 1 ;  
   Delay15S();  
   
  }  ppFive2 = 1;  
   
 }  
 void TurnLightFiveOff2()  
 {  
  if (!ppFive1)  
  {  
   
   
   digitalWrite(lightFive, HIGH);  
   LightFiveSts = 0 ;  
  }  
  ppFive2 = 0;  
 }  
   
   
   
   
 void TurnLightSixOn1()  
 {  
  if (!LightSixSts)  
  {  
   digitalWrite(lightSix, LOW);  
   LightSixSts = 1 ;  
   
   Delay15S();  
   
  }  
  ppSix1 = 1;  
   
 }  
   
 void TurnLightSixOff1()  
 {  
   
  if (!ppSix2)  
   
  {  
   
   
   digitalWrite(lightSix, HIGH);  
   LightSixSts = 0 ;  
  }  
  ppSix1 = 0;  
   
   
 }  
   
 void TurnLightSixOn2()  
 {  
   
  if (!LightSixSts)  
  {  
   digitalWrite(lightSix, LOW);  
   LightSixSts = 1 ;  
   Delay15S();  
   
  }  ppSix2 = 1;  
   
 }  
 void TurnLightSixOff2()  
 {  
  if (!ppSix1)  
   
  {  
   
   
   digitalWrite(lightSix, HIGH);  
   LightSixSts = 0 ;  
  }  
  ppSix2 = 0;  
   
 }  
   
   
   
 //#####################  
 // RTC Test ##########  
 //#####################  
 void rtctest()  
 {  
    
  if (Wire.endTransmission() == 0) //Did the RTC respond?  
   
  {  
   
   
   
   RTCerr = 0;    // set RTC error status boolean to false  
   digitalWrite (lightBlink, LOW); // blink status LED  
   
  }  
   
  else  
  {  
   
   RTCerr = 1;  
   digitalWrite (lightBlink, HIGH);  
   
  }  
   
 }  
   
   
   

ESP 8266 MQTT Switch for Home Assistant V2.0

   
 /* ################################################################  
   ################################################################  
   ########## ESP 8266 MQTT Switch for Home Assistant V2.0 #######  
   ################################################################  
   ###################*** MOSQUITTO ***############################  
 */  
   
   // UPDATED: SEP 5 2018
   // CHANGE SwitchReset and SwitchResetConfirm to SwitchOta and SwitchOtaConfirm in the .yaml file
 //########################################################################################  
   
 // You Can find this sketch on Home Assistant forum i have just modified it according to my  
 // Requirements as it is just a waste of time trying to re-invent the wheel  
 // so thank you for it random citizen :D  
   
 //** INCLUDE LIBRARIES ** make sure you have all the Libraries installed  
 // Get them from within the Arduino IDE Sketch > Include Libraries > Manage Libraries  
   
 //########################################################################################  
 // Update libraries from library Manager and Boards from Boards Manager to latest  
   
   
 #include <PubSubClient.h>  
 #include <ESP8266WiFi.h>  
 #include <ArduinoOTA.h>  
 #include <ESP8266mDNS.h>  
 #include <WiFiUdp.h>  
   
   
   
 //##################################################################  
   
   
 void callback(char* topic, byte* payload, unsigned int length);  
   
   
   
 #define MQTT_SERVER "192.168.1.6"   // IP of your MQTT Server    
   
   
   
 const char* ssid = "Internet";  // SSID for you Wifi Hotspot  
 const char* password = "12345678qwerty";     // Password for Wifi Hotspot  
   
   
 //########### ESP 8266 GPIO Pins ###########################################  
   
   
 const int switchPin1 = 4;  
 const int switchPin2 = 5;  
 const int switchPin3 = 13;  
 const int switchPin4 = 12;  
   
 unsigned long secs = 0;  
   
 //#########################################################################  
   
   
 // ***** MQTT Topics Defined In Home Assistant's Configuration.yaml file ***  
   
   
 //#########################################################################  
   
 char const* switchTopic1 = "/house/switch1/";   //four switches for relays  
   
 char const* switchTopic2 = "/house/switch2/";  
   
 char const* switchTopic3 = "/house/switch3/";  
   
 char const* switchTopic4 = "/house/switch4/";  
   
   
   
 char const* switchSleep = "/house/switchSleep/"; // fifth for putting the Esp in sleep mode  
   
 char const* switchOta = "/house/switchOta/"; // sixth for updating the Esp  // port 8266 //check firewall 
   
 //##########################################################################  
   
   
   
 WiFiClient wifiClient;  
   
   
 PubSubClient client(MQTT_SERVER, 1883, callback, wifiClient);  
   
   
   
   
   
   
 //#################################################################################  
 //#################################################################################  
   
 //############## SETUP BEGINS #####################################################  
   
 //#################################################################################  
 //#################################################################################  
   
   
   
 void setup()  
 {  
  digitalWrite(switchPin1, LOW);  
   
  digitalWrite(switchPin2, LOW);  
   
  digitalWrite(switchPin3, LOW);  
   
  digitalWrite(switchPin4, LOW);  
   
  // These lines will keep the Relays off during start-up  
   
  // Because i'm Using NPN transistors for  
   
  // switching the relays which are actually  
   
  // LOW-level-trigger type  
   
  // adding the transistor will invert that logic  
   
  // and LOW will be OFF because Transistor is off  
   
   
   
   
  pinMode(switchPin1, OUTPUT);  // Relay Switch 1  
   
  pinMode(switchPin2, OUTPUT);  // Relay Switch 2  
   
  pinMode(switchPin3, OUTPUT);  // Relay Switch 3  
   
  pinMode(switchPin4, OUTPUT);  // Relay Switch 4  
   
   
   
  //####################################################################################  
   
   
   
   
  Serial.begin(115200);  
  delay(100);  
   
   
   
   
   
   
  WiFi.mode(WIFI_STA);    // Set Esp8266 in Station mode  
   
  WiFi.begin(ssid, password);  
   
   
  secs = millis() / 1000 ;  
   
  while (WiFi.waitForConnectResult() != WL_CONNECTED)  
  {  
   
   Serial.println("Waiting for WiFi Connection ...");  
   
   delay(2000);  
   
   /*if (millis() / 1000 - secs > 60)  
   {  
    Serial.println("Going to Sleep for 10 secs ...");  
   
    ESP.deepSleep(10 * 1000000);  
   }  */
  }  
   
   
   
   
  //############################################################################################  
  //############################################################################################  
   
  //############# CHANGE OTA UPDATE PASSWORD ###################################################  
  //############################################################################################  
  //############################################################################################  
   
  ArduinoOTA.setPassword((const char *)"123"); // Password for OTA Update "123"  
  ArduinoOTA.begin();  
   
   
   
   
 }  
   
 //##########################################################################################  
   
 //############ SETUP END ###################################################################  
   
 //##########################################################################################  
   
   
 bool ota_update = false ; // Don't change this manually  
   
   
   
   
   
 //#########################################################################################  
   
 //######### LOOP BEGINS ##################################################################  
   
 //#########################################################################################  
   
   
 void loop()  
 {  
   
  if (!client.connected() && WiFi.status() == 3)  
   
  {  
   
   reconnect(); // Reconnect if connection is lost  
   
  }  
   
   
  client.loop(); // Maintain MQTT connection  
  if (ota_update)    
  {     secs = millis() / 1000 ;  }
   
  delay(10);   // MUST delay to allow ESP8266 WIFI functions to run  
  OTA();  
   
 }  
   
   
 //#########################################################################################  
 //################# WAIT FOR OTA UPDATE ON EVERY START UP #################  
 //#########################################################################################  
 void OTA()  
 {  
  if (ota_update)    
  {  
   Serial.println("Waiting for Ota update");  
   
   while (millis() / 1000 - secs < 20 )  
   {  
    ArduinoOTA.handle() ;  
    delay(10);  
   }  
  }  
 }  
 //#################################################3  
   
   
   
 //#########################################################  
   
   
   
 void callback(char* topic, byte* payload, unsigned int length) {  
   
   
  String topicStr = topic;  
   
   
   
  Serial.println("Callback update.");  
  Serial.print("Topic: ");  
  Serial.println(topicStr);  
   
   
  //################## Switch 1 ################### COPY THESE BLOCKS FOR MORE SWITCHES ####################  
   
  if (topicStr == "/house/switch1/")  
  {  
   
   if (payload[0] == '1')  
   {  
   
    digitalWrite(switchPin1, HIGH);  
   
    client.publish("/house/switchConfirm1/", "1");  
    delay(1000);  
   }  
   
   
   
   else if (payload[0] == '0')  
   {  
   
    digitalWrite(switchPin1, LOW);  
   
    client.publish("/house/switchConfirm1/", "0");  
   
   }  
   
  }  
   
   
   
   
  //################## Switch 2 #####################################################  
   
   
   
   
   
   
  else if (topicStr == "/house/switch2/")  
  {  
   
   
   
   if (payload[0] == '1')  
   {  
   
    digitalWrite(switchPin2, HIGH);  
   
    client.publish("/house/switchConfirm2/", "1");  
    delay(1000);  
   
   }  
   
   
   
   else if (payload[0] == '0')  
   {  
   
    digitalWrite(switchPin2, LOW);  
   
    client.publish("/house/switchConfirm2/", "0");  
   
   }  
   
  }  
   
   
   
  //################## Switch 3 #####################################################  
   
   
   
   
   
   
  else if (topicStr == "/house/switch3/")  
  {  
   
   
   
   if (payload[0] == '1')  
   {  
   
    digitalWrite(switchPin3, HIGH);  
   
    client.publish("/house/switchConfirm3/", "1");  
   
    delay(1000);  
   
   }  
   
   
   
   else if (payload[0] == '0')  
   {  
   
    digitalWrite(switchPin3, LOW);  
   
    client.publish("/house/switchConfirm3/", "0");  
   
   }  
  }  
   
   
   
   
   
  //################## Switch 4 #####################################################  
   
   
   
   
  else if (topicStr == "/house/switch4/")  
  {  
   
   
   if (payload[0] == '1')  
   {  
    digitalWrite(switchPin4, HIGH);  
   
    client.publish("/house/switchConfirm4/", "1");  
   
    delay(1000);  
   
   }  
   
   
   
   else if (payload[0] == '0')  
   {  
    digitalWrite(switchPin4, LOW);  
   
    client.publish("/house/switchConfirm4/", "0");  
   }  
  }  
   
   
  //################## Switch 5 Sleep Mode #######################################  
   
   
  else if (topicStr == "/house/switchSleep/")  
  {  
   
   
   if (payload[0] == '1')  
   {  
   
    client.publish("/house/switchSleepConfirm/", "1");  
   
    Serial.println("going to sleep for 60 secs");  
   
    delay(1000);  
   
    ESP.deepSleep(60 * 1000000);  
   
   
   }  
   
   
   
   else if (payload[0] == '0')  
   {  
    client.publish("/house/switchSleepConfirm/", "0");  
   }  
  }  
   
   
   
   
  //################## Switch 6 ota #######################################  
   
   
  else if (topicStr == "/house/switchOta/")  
  {  
   
   
   if (payload[0] == '1')  
   {  
    client.publish("/house/switchOtaConfirm/", "1");  
   
    ota_update = true ;  
   
   }  
   
   else if (payload[0] == '0')  
   {  
    client.publish("/house/switchOtaConfirm/", "0");  
    ota_update = false ;  
   
   }  
  }  
   
   
   
   
   
   
   
   
   
   
   
 }  
   
   
 //#########################################################################################  
   
 //######### LOOP ENDS ##################################################################  
   
 //#########################################################################################  
   
   
   
   
   
   
 void reconnect() {  
   
   
   
  if (WiFi.status() != WL_CONNECTED)  
  {  
   
   Serial.print("Connecting to ..");  
   
   Serial.println(ssid);  
   
   
   
   while (WiFi.status() != WL_CONNECTED)  
   {  
   
    delay(500);  
   
    Serial.print(".");  
   
   }  
   
   
   
   Serial.println("");  
   
   Serial.println("WiFi connected");  
   
   Serial.println("IP address: ");  
   
   Serial.println(WiFi.localIP());  
  }  
   
   
   
   
   
  if (WiFi.status() == WL_CONNECTED) {  
   
   while (!client.connected()) {  
   
    Serial.print("Attempting MQTT connection...");  
   
   
   
    // Generate client name based on MAC address and last 8 bits of microsecond counter  
    String clientName;  
    clientName += "esp8266-";  
    uint8_t mac[6];  
    WiFi.macAddress(mac);  
    clientName += macToStr(mac);  
   
   
    //#########################################################################################  
   
    //######### CHANGE MQTT USER NAME AND PASSWORD BELOW ####################################  
   
    //#########################################################################################  
   
   
   
   
    if (client.connect((char*) clientName.c_str(), "newuser", "12345")) {  
   
     Serial.print("\tMQTT Connected");  
   
   
   
     client.subscribe(switchSleep);  
   
   
     client.subscribe(switchOta);    // the order in which topics are arranged here  
   
   
     // is how ESP will Subscribe and if you put  
   
     // relays first and also turn them on and ota or sleep too  
   
     // the switches will turn on momentarily untill it gets the message to sleep or ota update  
   
     client.subscribe(switchTopic1);  
   
     client.subscribe(switchTopic2);  
   
     client.subscribe(switchTopic3);  
   
     client.subscribe(switchTopic4);  
   
     // ##**************************######## Add MORE TOPICS FOR SWITCHES HERE  #####################  
   
   
    }  
   
   
    else  
    {  
     Serial.println("\tFailed.");  
   
     delay(2000);  
   
     break;  
   
    }  
   
   }  
   
  }  
   
 }  
   
   
   
   
   
 String macToStr(const uint8_t* mac)  
 {  
   
  String result;  
   
  for (int i = 0; i < 6; ++i) {  
   result += String(mac[i], 16);  
   
   if (i < 5) {  
    result += ':';  
   }  
  }  
   
  return result;  
 }  

Raspberry Pi Home Assistant Hassbian Camera Motion Mqtt

Usb Camera as a Motion sensor on Raspberry pi 3 Hassbian using Mosquitto MQTT broker/client 

Using "motion"(software) the images and Videos from the Usb webcam are recorded and streamed on the (same)Rpi3 which is also running Hassbian. 


I have edited the motion.conf file to run commands when motion is detected and when the motion event ends so that it publishes Mqtt messages to a Topic using Mosquitto MQTT broker and in the Homeassistant configuration.yaml file i have made an mqtt sensor that shows motion detected TRUE or FALSE .


It works and using Automations  it can be used to send mqtt messages to some other mqtt switches connected to the Hassbian to turn lights on or off or do something else.


#######################################

# In motion.conf file edit the following lines (in addition to the settings that are necessary for 
# your camera to work 
#######################################

# Command to be executed when an event starts. (default:none)


on_event_start mosquitto_pub -u newuser -P 12345 -t /house/system/motion -m "TRUE"


# Command to be executed when an event ends after a period of no motion


on_event_end mosquitto_pub -u newuser -P 12345 -t /house/system/motion -m "FALSE"


# Command to be executed when a motion frame is detected 


on_motion_detected mosquitto_pub -u newuser -P 12345 -t /house/system/motion -m "TRUE"


# the commands should also contain an ip number and a port number for connecting with 

# mosquitto broker if it is running on a different device within a network

###########


#########################

In Configuration.YAML file
#########################


camera:



####


  - platform: mjpeg    ## camera is on same device i.e. localhost

    mjpeg_url: http://localhost:8081
    name: Usb Cam

####

  - platform: mjpeg        ## camera is a different device
    mjpeg_url: http://192.168.1.7:8081
    name: RCam1
    username: user
    password: qwerty12345
    authentication: basic

######################

# MOSQUITTO MQTT 
######################


mqtt:

  broker: localhost
  port: 1883
  client_id: home-assistant-1
  keepalive: 60
  username: newuser
  password: 12345
  protocol: 3.1 

###############

# SENSORS 
###############
sensor 1:
  - platform: mqtt
    name: "Motion Detect"
    state_topic: "/house/system/motion"
  #  payload_on: "TRUE"
  # payload_off: "FALSE"
    qos: 0
    expire_after: 60
####################
sensor 6:
  - platform: mqtt
    name: "RCam1 Motion"
    state_topic: "/house/rcam1/motion"
 #   payload_on: "TRUE"
 #   payload_off: "FALSE"
    qos: 0
    expire_after: 60
####################

############################################


##################

In groups.YAML file
##################
default_view:
  view: true
  icon: mdi:home
  entities:
  #- group.time
  #- group.sun
  #- group.weathertoday
  - group.usbcam
  #- group.systeminfo
  name: default_view

###

usbcam:
  name: Usb Cam
  view: false
  entities:
  - camera.usb_cam
  - sensor.motion_detect

####

testview:
  name: TestView
  view: true
  entities:
  - group.rcam1

##########

rcam1:
  name: RCam1
  view: false
  entities: 
  - sensor.rcam1_motion
  - camera.rcam1




################ HOW TO ##################



First, make the camera work and configure motion by editing motion.conf file.Keep the resolution and frame rate at a minimum, for example : height x width 640 x 480 and 10 fps.

You need to make motion and your camera work with each other first so you can view the camera feed using the ip address of your Pi and a port at which motion is streaming the video from your camera.


Then add camera component and all the related settings in configuration.yaml file to show the camera on the homeassistant page. 

In the example above I have shown two ways to do it. 


First is for a USB cam attached directly to the Pi which is Running Homeassistant.


Second is for a different Pi with Raspbian Jessie,a CSI camera, and running motion and mosquitto and sends video and mqtt messages to the first Pi which is running Homeassistant/Hassbian.


Then use sensor component and make a "Sensor" by adding text in the Configuration.yaml file make sure the text has proper "spaces" because it will not work if the text is not formatted according to the YAML syntax. In the example above I have made Two sensors for motion detection from two camera feeds.


First is from the Usb cam and motion running on the same Pi where Hassbian is running.Second is for a different Pi with a CSI camera in the same Wifi network.They should have different mqtt "Topics"and the Payloads can be either "1" and "0" or "true" and "false".


Then make a "card" to show on the HomeAssistant page that can show camera feed and  motion detect = True / False  by adding text to the groups.yaml file. there are two ways to do it. 


First, is by adding it as a new tab by making two groups. First group with "view" set to "true", like in the example above the "Test View" in groups.yaml file . Then make a second group and set its view to "false"and add camera and sensor entity names to the second group (with view false),like in the example above the RCam1 group.Then add the second group's name to the first group (with view set  to true). Like I did above in the TestView entities section.If you do it like I did a new "TAB" will appear in the HomeAssistant webpage with the name Test View and it will show both the rcam1 video feed  and it's motion detection sensor using mqtt.


Second is by making a group with view set to false and add usb camera and motion sensor entity names to it then adding that group name to the default view entities section will show the video feed from usb cam and its motion sensor on the main home tab on the homeassistant page. 


Then test the Commands for Publishing a Message to the mqtt topics from command line and at the same time watch the changes on the motion detect cards on the homeassistant page. 

If the command is correct with correct topic,username,password and payload (TRUE/FALSE) and if on a different device with correct ip and port in the command too. (ip and port where the mosquitto broker is running) then you should be able to manually publish to the sensor topic and the motion detect status will change to TRUE or FALSE and in case no new message after expiry time is up it will change to UNKNOWN.  


Then add those tested/working commands for mosquitto_pub to the motion.conf file to automate the process of publishing messages to the mqtt topic as a result of motion events.


Please Keep it in mind that if this is being done on the same Raspberry Pi running Home Assistant,Motion and Mosquitto the Mosquitto commands that are executed on motion detection do not contain an ip and a port number for the mosquitto broker but will be necessary for communicating with the broker running on a different device/pi in a network.


Which means if you have two raspberry Pis FIRST with HomeAssistant and Mosquitto Broker and the SECOND with usb/csi Camera , Motion and Mosquitto Client then the SECOND Rpi with camera and motion has to know the Ip and port for the FIRST Rpi so it can communicate with it and send a message upon motion detection. 


If you are planing to use a second Pi as a camera then MotionEyeOS will not work as mqtt or Mosquitto cannot be installed on it at least not easily you will have to build it from source and add all the necessary packages to the image .Use Raspbian with MotionEye and Mosquitto I have used it and it works.



If anything is still not clear then Comment on my Youtube Channel and Please SUBSCRIBE to the CHANNEL. 

DIY Use Soil Moisture Sensor,Oled,Arduino,Breadboard,Battery Part 01


 #include <U8glib.h> // Version 1.19.1   
   
   
   
 # define font  u8g.setFont(u8g_font_helvB08) // set font One for oled display  
   
 byte Scroll   = 4 ; // Scroll Text x axis  
   
 int soilHumVal   = 0 ;  // for reading analog value from Soil Humidity Sensor's Analog output  
   
 const byte soilHumA  = A1 ; // pin for Soil Humidity Sensor's ANALOG Output Signal Pin it gives raw voltage values  
   
 U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST); // Fast I2C / TWI   
   
 unsigned long secs = 0;  
   
   
   
   
 void setup()  
 {  
  Serial.begin(9600);  
    
  pinMode(soilHumA, INPUT)  ;  
   
  analogReference(DEFAULT);  
    
  Start();  
  delay(2000);  
   
    
  soilHumCalc() ;  
   
 }  
   
   
 void Start()  
   
 {  
   
   
  u8g.firstPage();   // START SCREEN "Picture loop" for OLED  
   
  do  
  {  
   
   font;  
   u8g.drawFrame(10, 12, 108, 31); // Draw Frame and it's Size  
   u8g.drawFrame(0, 0, 128, 64); // Draw Frame and it's Size  
   u8g.drawStr(15, 25, "Soil Humidity"); // Draw a string   
   u8g.drawStr(85, 32, "V 1.0");     
   u8g.drawStr( 37, 40, "Meter");  
   u8g.drawStr(53, 60, "Made by:AMK");  
   
   
  }  
  while ( u8g.nextPage() );  
   
 }  
   
   
   
   
   
   
   
 //####################################  
 // Function for Reading Soil Humidity#  
 //####################################  
 void  soilHumCalc()  
 {  
   
  soilHumVal = analogRead(soilHumA);  
   
  Serial.print("Raw 10-bit Number Value : ");  
  Serial.println(soilHumVal );  
  soilHumVal = map(soilHumVal, 1023, 0, 0, 100);  
  Serial.print("Percentage Value : " );  
  Serial.println(soilHumVal );  
   
  if(soilHumVal<3) soilHumVal=0;  
 }  
   
   
   
   
 //############  
 // Loop #####  
 //############  
   
   
   
 void loop()  
 {  
  delay(200);  
  soilHumCalc() ;  
  delay(200);  
   
   
    
    
  u8g.firstPage();  
   
  do  
  {   
   u8g.setColorIndex(1);  
   
   u8g.drawFrame(0, 0, 128, 20); // Draw frame  
   u8g.drawFrame(0, 22, 128, 42); // Draw fram  
   if(millis()- secs > 100)//Check Timer  
   {  
   Scroll = Scroll -1; // Minus 1  
   Scroll--;// Minus 1  
   secs=millis(); //Reset Timer  
   }  
   
     
     
   
     
   font;  
   u8g.setPrintPos(Scroll, 14);  
   u8g.print( "YouTube.com/CrazyGuy/Official");  
   u8g.setPrintPos(4, 34);  
   u8g.print( "Moisture");  
    
   if(soilHumVal>18)   
   {  
    u8g.setPrintPos(113, 34);  
    if(soilHumVal < 30)   
    {   
     u8g.print("M");  
    }   
    else   
    {   
     u8g.print("H");}  
    }  
     
   u8g.setFont(u8g_font_osr18); // set font for oled display  
   u8g.setPrintPos(102, 59);  
   u8g.print("%");  
    
   if(soilHumVal>30)   
   {  
    u8g.drawBox(52,36,49,25);  
    u8g.setColorIndex(0);  
   }  
      
   u8g.setPrintPos(51, 59);  
   u8g.print(soilHumVal);  
    
  }  
   
  while ( u8g.nextPage() );  
   
 }