Here is my sketch if someone finds it useful. It uses LDR to set night mode in low light conditions and vice versa, door reed switch and PIR sensor to turn ac or dc lights with the help of two channel relay and EasyIOT as server. Interrupts perform the functions of turning lights on and off while timer wake up decides the night mode implementation. Moreover, sensor node sleeps most of its time to conserve the battery.
#include <SPI.h>
#include <MySensor.h>
#define CHILD_ID_LIGHT 0
#define CHILD_ID_DOOR 1
#define CHILD_ID_PIR 2
#define CHILD_ID_LED 3
#define CHILD_ID_SAVER 4
#define LDR_PIN A0
#define DOOR_PIN 2
#define PIR_PIN 3
#define LED_PIN 4 // Relay 1 is attached
#define SAVER_PIN 5 // Relay 2 is attached
#define INTERRUPT DOOR_PIN-2
unsigned long SLEEP_TIME = 1200000; // Sleep time 1200000 i.e. 20 minutes (in milliseconds)
MySensor gw;
boolean activity = false;
boolean LEDSwitch = false;
boolean SaverSwitch = false;
boolean nightSwitch = false;
MyMessage msgLDR(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
MyMessage msgDoor(CHILD_ID_DOOR, V_TRIPPED);
MyMessage msgPir(CHILD_ID_PIR, V_TRIPPED);
void setup()  
{ 
  gw.begin(NULL, AUTO, false, 1);
  gw.sendSketchInfo("BedRoom", "1.2");
  
  pinMode(DOOR_PIN,INPUT);
  pinMode(PIR_PIN,INPUT);
  pinMode(LED_PIN, OUTPUT);
  pinMode(SAVER_PIN, OUTPUT);
  
  digitalWrite(DOOR_PIN, HIGH);
  digitalWrite(PIR_PIN, HIGH);
  digitalWrite(LED_PIN, HIGH);
  digitalWrite(SAVER_PIN, HIGH);
  
  gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
  gw.present(CHILD_ID_DOOR, S_DOOR);
  gw.present(CHILD_ID_PIR, S_MOTION);
  
  int LightLevel;
  for(int i = millis(); i < (millis() + 5000); i++){
    LightLevel = (100 - ((1023-analogRead(LDR_PIN))/10.23));
  }
  if(LightLevel < 20){
    gw.send(msgLDR.set(LightLevel));
    nightSwitch = true;
  }
  else {
    gw.send(msgLDR.set(LightLevel));
    nightSwitch = false;
  }
}
void loop()      
{
  if(nightSwitch){ //When night switch is on
    int wake;
    wake = gw.sleep(INTERRUPT,FALLING, SLEEP_TIME);
    if(wake == 1){
      if(!activity){
        gw.send(msgDoor.set("1"));
        gw.send(msgDoor.set("0"));
        activity = true;
        if((!LEDSwitch) && (!SaverSwitch)){
          pirswitch();
        }
        else{ //activity finished
        activityoff();
        }
      }
    }
    else{ //Timer wake up
      int LightLevel;
      if((!LEDSwitch) && (!SaverSwitch)){
        for(int i = millis(); i < (millis() + 5000); i++){
          LightLevel = (100 - ((1023-analogRead(LDR_PIN))/10.23));
        }
      }
      else{
        for(int i = millis(); i < (millis() + 1000); i++){
          LightLevel = (100 - ((1023-analogRead(LDR_PIN))/10.23));
        }
      }
        
      if((LightLevel < 10) && ((!LEDSwitch) && (SaverSwitch))){
        Serial.println("Light level is less than 50%, Turning LED on");
        digitalWrite(LED_PIN, LOW);
        LEDSwitch = true;
        SLEEP_TIME = 7200000; // Sleep time changed to 2 hours
      }
      else if((LightLevel > 20) && ((!LEDSwitch) && (!SaverSwitch))){
        gw.send(msgLDR.set(LightLevel));
        nightSwitch = false;
        SLEEP_TIME = 7200000; // Sleep time changed to 2 hours
        gw.sleep(SLEEP_TIME);
      }
      else if((LightLevel > 5) && (nightSwitch) && ((!LEDSwitch) && (!SaverSwitch))){
        gw.send(msgLDR.set(LightLevel));
        SLEEP_TIME = 600000; // Sleep time changed to 10 minutes
      }
    }
  }
  else { //When night switch is off
    int LightLevel;
    for(int i = millis(); i < (millis() + 5000); i++){
      LightLevel = (100 - ((1023-analogRead(LDR_PIN))/10.23));
    }
    if(LightLevel < 20){
      gw.send(msgLDR.set(LightLevel));
      nightSwitch = true;
      SLEEP_TIME = 7200000; // Sleep time changed to 2 hours
      gw.sleep(INTERRUPT,FALLING, SLEEP_TIME);
    }
    else if((LightLevel < 30) && (!nightSwitch)){
      SLEEP_TIME = 600000; // Sleep time changed to 10 minutes
      gw.sleep(SLEEP_TIME);
    }
    else if((LightLevel < 50) && (!nightSwitch)){
      SLEEP_TIME = 1800000; // Sleep time changed to 30 minutes
      gw.sleep(SLEEP_TIME);
    }
  }
}
void pirswitch()
{
  for(int i = millis(); i < (millis() + 5000); i++){ //Check PIR for activity 10 times with delay of half second
    boolean tripped = digitalRead(PIR_PIN) == HIGH;
    Serial.println(i);
    if(tripped){
      gw.send(msgPir.set(tripped?"1":"0"));
      Serial.println("Motion detected");
      //activity on function
      activityon();
      Serial.println("Loop terminated");
      break;
    }
  }
  delay(3000);
  activity = false;
}
       
void activityon()
{
  //turn saver on
  digitalWrite(SAVER_PIN, LOW);
  SaverSwitch = true;
  Serial.println("Energy saver turned on");
  int LightLevel;
  for(int i = millis(); i < (millis() + 1000); i++){ //Check if energy saver is on
    LightLevel = (100 - ((1023-analogRead(LDR_PIN))/10.23));
  }
  if(LightLevel < 10){
    Serial.println("Light level is less than 50%, Turning LED on");
    digitalWrite(LED_PIN, LOW);
    LEDSwitch = true;
  }
  else{
    SLEEP_TIME = 1000;
    Serial.println("Sleep time changed to second");
  }
}
  
void activityoff()
{
  delay(3000);
  //turn off saver or LED
  digitalWrite(SAVER_PIN, HIGH);
  digitalWrite(LED_PIN, HIGH);
  Serial.println("Activity finished");
  SaverSwitch = false;
  LEDSwitch = false;
  activity = false;
  SLEEP_TIME = 7200000;
  Serial.println("Sleep time changed to 2 hours");
}