import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.HashSet;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.ConcurrentHashMap;
* @version 1.0
* @since 2016-12-14
*/
-public class HomeSecurityController implements SmartthingsSensorCallback {
+public class HomeSecurityController implements SmartthingsSensorCallback, SmartthingsActuatorCallback {
/*
* Constants
private static final int CHECK_TIME_WAIT = 1; // in seconds
private static final int SECOND_TO_TURN_ON = 60; // in seconds
private static final int SECOND_TO_TURN_OFF = 1; // in seconds
+ private static final int LOCK_DOOR = 0;
+ private static final int UNLOCK_DOOR = 1;
/**
* IoT Sets and Relations
* 4) Camera (detect motion)
* 5) Alarm (using ESP board) - assuming 1 house alarm
* 6) Room (object as place of device)
- *
- * Additionals (for more extensive home management)
* 7) Doorlock (detect open/locked)
- * 8) Power outlet (detect on/off, monitor watt)
*/
- // This comprises multipurpose, motion, and water leak sensors
- // TODO: Per 01/2017, doorlock and outlet are not ready, ESP board will be used for alarm
@config private IoTSet<SmartthingsSensorSmart> smartSensorsSet;
@config private IoTSet<CameraSmart> camSet;
@config private IoTSet<AlarmSmart> alarmSet;
@config private IoTSet<RoomSmart> roomSet;
- //@config private IoTSet<DoorLock> doorlockSet;
- //@config private IoTSet<Outlet> outletSet;
+ @config private IoTSet<SmartthingsActuatorSmart> doorlockSet;
@config private IoTRelation<RoomSmart, SmartthingsSensorSmart> roomSensorRelation;
@config private IoTRelation<RoomSmart, CameraSmart> roomCameraRelation;
//@config private IoTRelation<RoomSmart, DoorLock> roomDoorLockRelation;
- //@config private IoTRelation<RoomSmart, Outlet> roomOutletRelation;
/*******************************************************************************************************************************************
**
long lastTimeChecked = 0;
private static int sensorId = 0;
+ private static int doorlockId = 0;
/*******************************************************************************************************************************************
**
// Camera (true = motion)
private Map<CameraSmart, Boolean> camDetectStatus =
new HashMap<CameraSmart, Boolean>();
- // Doorlock (true = open - not locked)
- //private Map<DoorLock, Boolean> doorlockStatus =
- // new HashMap<DoorLock, Boolean>();
- // Outlet (true = on - outlet is used)
- //private Map<Outlet, Boolean> outletStatus =
- // new HashMap<Outlet, Boolean>();
+ // Doorlock (true = locked)
+ private Map<Integer, Boolean> doorlockStatus =
+ new HashMap<Integer, Boolean>();
// Alarm status
private Map<Integer, Boolean> alarmStatus =
*
* @return [void] None.
*/
- private void initDoorLocks(RoomSmart rm) {
+ private void initDoorLocks() {
- // Get and init the doorlocks for this specific room
- /*HashSet<DoorLock> doorlocks = roomDoorLockRelation.get(rm);
- for (DoorLock doorlock : doorlocks) {
+ // Get and init the doorlocks (we only assume 1 main doorlock)
+ Set<SmartthingsActuatorSmart> doorlocks = doorlockSet.values();
+ for (SmartthingsActuatorSmart doorlock : doorlocks) {
try {
// Initialize doorlocks
doorlock.init();
- System.out.println("DEBUG: Initialized doorlock!");
+ System.out.println("DEBUG: Initialized doorlock! ID: " + doorlockId);
+ doorlockStatus.put(doorlockId, false);
+ System.out.println("DEBUG: Initialized doorlock status to false!");
+ doorlock.setId(doorlockId++);
+ doorlock.registerCallback(this);
+ System.out.println("DEBUG: Registered doorlock callback!");
} catch (Exception e) {
e.printStackTrace();
}
- }*/
- }
-
-
- /** Method to initialize power outlets
- *
- * @return [void] None.
- */
- private void initOutlets(RoomSmart rm) {
-
- // Get and init the outlets for this specific room
- /*HashSet<Outlet> outlets = roomOutletRelation.get(rm);
- for (Outlet outlet : outlets) {
-
- try {
- // Initialize outlets
- outlet.init();
- System.out.println("DEBUG: Initialized outlet!");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }*/
+ }
}
}
}
-
- /** Method to update state data structures for doorlocks
- *
- * @return [void] None.
- */
- private void updateDoorLockStatus(RoomSmart rm) {
-
- // Get and init the outlets for this specific room
- /*HashSet<DoorLock> doorlocks = roomDoorLockRelation.get(rm);
- for (DoorLock doorlock : doorlocks) {
-
- // Change is detected! Set to true for report...
- if(isChangeDetected()) {
-
- doorlockStatus.put(doorlock, true);
- } else {
-
- doorlockStatus.put(doorlock, false);
- }
- }*/
- }
-
-
- /** Method to update state data structures for outlets
+ /** Method to update state data structures for Smartthings actuators
*
* @return [void] None.
*/
- private void updateOutletStatus(RoomSmart rm) {
-
- // Get and init the outlets for this specific room
- /*HashSet<Outlet> outlets = roomOutletRelation.get(rm);
- for (Outlet outlet : outlets) {
-
- // Change is detected! Set to true for report...
- if(isChangeDetected()) {
+ public void newActuatorReadingAvailable(int _sensorId, int _value, boolean _activeValue) {
- outletStatus.put(outlet, true);
- } else {
+ System.out.println("DEBUG: Actuator reading value: " + _value);
+ if(_activeValue) {
+ System.out.println("DEBUG: Actuator is detecting something: " + _activeValue);
+ doorlockStatus.put(_sensorId, true);
- outletStatus.put(outlet, false);
- }
- }*/
+ } else {
+ //System.out.println("DEBUG: Sensor is not detecting something: " + _activeValue);
+ doorlockStatus.put(_sensorId, false);
+ }
}
// Update status of camera
updateCameraStatus(room);
- // Update status of doorlocks
- //updateDoorLockStatus(room);
-
- // Update status of outlets
- //updateOutletStatus(room);
+ // Update status of other devices if any
+ // ...
}
}
}
+ /** Method to lock doors
+ *
+ * @return [void] None.
+ */
+ private void lockDoors() {
+
+ // Get and lock the doorlocks (we only assume 1 main doorlock)
+ Set<SmartthingsActuatorSmart> doorlocks = doorlockSet.values();
+ for (SmartthingsActuatorSmart doorlock : doorlocks) {
+
+ doorlock.actuate(LOCK_DOOR);
+ System.out.println("DEBUG: Lock doorlock! ID: " + doorlock.getId());
+ }
+ }
+
+
/** Check status of devices and turn on alarm accordingly
* <p>
* Simple rule is whenever any sensor or camera detect something unusual
zoneId = room.getRoomID();
turnOnAlarms(zoneId);
System.out.println("DETECTION: Camera active in room: " + zoneId);
+ lockDoors();
}
}
turnOnAlarms(zoneId);
System.out.println("DETECTION: Sensor active in room: " + zoneId);
System.out.println("DETECTION: Detection by sensor: " + sensor.getId());
+ lockDoors();
}
}
}
initCameras(rm);
// Init all doorlocks
- //initDoorLocks();
+ initDoorLocks();
- // Init all outlets
- //initOutlets();
}
// Init all alarms