#include <ZMEKeypad.h>
#define ROWS  1
#define COLS  4
BYTE rowPins[1] = {17};
BYTE columnPins[4] = {9, 10, 11, 12};
ZMEKeypad kpd = ZMEKeypad(columnPins, COLS, rowPins, ROWS);
#define CONTROL_GROUP1 1  
#define CONTROL_GROUP2 2  
#define SWITCH_ON 0xff
#define SWITCH_OFF 0
byte button_0_start_holding = TRUE;
byte button_1_start_holding = TRUE;
byte button_2_start_holding = TRUE;
byte button_3_start_holding = TRUE;
ZUNO_SETUP_ASSOCIATIONS(ZUNO_ASSOCIATION_GROUP_SET_VALUE_AND_DIM, ZUNO_ASSOCIATION_GROUP_SET_VALUE_AND_DIM); 
ZUNO_SETUP_SLEEPING_MODE(ZUNO_SLEEPING_MODE_SLEEPING); 
void setup() {
  zunoSetupKeyScannerWU(4); 
  
  kpd.begin();
  kpd.setHoldTime(50); 
  kpd.setDebounceTime(2); 
}
void loop() {
  byte actions[4]; 
  byte go_to_sleep = FALSE; 
  
  
  byte button_0_active = FALSE;
  byte button_1_active = FALSE;
  byte button_2_active = FALSE;
  byte button_3_active = FALSE;
  byte num_touched_keys = kpd.scanKeys(actions);
  if (num_touched_keys) {
    bool hold = KEYPAD_IS_HOLDING(actions[0]);
    switch (KEYPAD_KEYINDEX(actions[0])) {
      case 0: 
        button_0_active = TRUE;
        if (hold && button_0_start_holding) { 
          button_0_start_holding = FALSE;
          zunoSendToGroupDimmingCommand(CONTROL_GROUP1, TRUE, TRUE); 
        }
        if (!hold) { 
          go_to_sleep = TRUE;
          zunoSendToGroupSetValueCommand(CONTROL_GROUP1, SWITCH_OFF);  
        }
        break;
      case 1: 
        button_1_active = TRUE;
        if (hold && button_1_start_holding) { 
          button_1_start_holding = FALSE;
          zunoSendToGroupDimmingCommand(CONTROL_GROUP1, FALSE, TRUE); 
        }
        if (!hold) { 
          go_to_sleep = TRUE;
          zunoSendToGroupSetValueCommand(CONTROL_GROUP1, SWITCH_ON);
        }
        break;
      case 2: 
        button_2_active = TRUE;
        if (hold && button_2_start_holding) { 
          button_2_start_holding = FALSE;
          zunoSendToGroupDimmingCommand(CONTROL_GROUP2, TRUE, TRUE); 
        }
        if (!hold) { 
          go_to_sleep = TRUE;
          zunoSendToGroupSetValueCommand(CONTROL_GROUP2, SWITCH_OFF);
        }
        break;
      case 3: 
        button_3_active = TRUE;
        if (hold && button_3_start_holding) { 
          button_3_start_holding = FALSE;
          zunoSendToGroupDimmingCommand(CONTROL_GROUP2, FALSE, TRUE); 
        }
        if (!hold) { 
          go_to_sleep = TRUE;
          zunoSendToGroupSetValueCommand(CONTROL_GROUP2, SWITCH_ON);
        }
        break;
    }
  }
  if(!button_0_start_holding && !button_0_active) { 
    button_0_start_holding = TRUE;
    zunoSendToGroupDimmingCommand(CONTROL_GROUP1, TRUE, FALSE); 
  }
   if(!button_1_start_holding && !button_1_active) { 
    button_1_start_holding = TRUE;
    zunoSendToGroupDimmingCommand(CONTROL_GROUP1, FALSE, FALSE); 
  }
   if(!button_2_start_holding && !button_2_active) { 
    button_2_start_holding = TRUE;
    zunoSendToGroupDimmingCommand(CONTROL_GROUP2, TRUE, FALSE); 
  }
   if(!button_3_start_holding && !button_3_active) { 
    button_3_start_holding = TRUE;
    zunoSendToGroupDimmingCommand(CONTROL_GROUP2, FALSE, FALSE); 
  }
  
  if (kpd.isIdled()) {
    go_to_sleep = TRUE;
  }
  if (go_to_sleep) {
    zunoSendDeviceToSleep();  
  }
}