Adding doorlock to the fourth benchmark
[iot2.git] / benchmarks / Java / HomeSecurityController / HomeSecurityController.java
index 68cf0fb6dc76e43c02f9e4667d5a79146bd26f4f..c87eece67a8d9a9801119732da51f3e2a08820e0 100644 (file)
@@ -8,6 +8,7 @@ import java.util.HashMap;
 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;
@@ -33,7 +34,7 @@ import iotcode.interfaces.*;
  * @version     1.0
  * @since       2016-12-14
  */
-public class HomeSecurityController implements SmartthingsSensorCallback {
+public class HomeSecurityController implements SmartthingsSensorCallback, SmartthingsActuatorCallback {
 
        /*
         *  Constants
@@ -43,6 +44,8 @@ public class HomeSecurityController implements SmartthingsSensorCallback {
        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
@@ -54,24 +57,17 @@ public class HomeSecurityController implements SmartthingsSensorCallback {
         *  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;
 
        /*******************************************************************************************************************************************
        **
@@ -81,6 +77,7 @@ public class HomeSecurityController implements SmartthingsSensorCallback {
        long lastTimeChecked = 0;
 
        private static int sensorId = 0;
+       private static int doorlockId = 0;
 
        /*******************************************************************************************************************************************
        **
@@ -96,12 +93,9 @@ public class HomeSecurityController implements SmartthingsSensorCallback {
        // 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 =
@@ -211,41 +205,25 @@ public class HomeSecurityController implements SmartthingsSensorCallback {
         *
         *   @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();
-                       }
-               }*/
+               }
        }
 
 
@@ -303,48 +281,21 @@ public class HomeSecurityController implements SmartthingsSensorCallback {
                } 
        }
 
-
-       /** 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);
+               } 
        }
 
 
@@ -360,11 +311,8 @@ public class HomeSecurityController implements SmartthingsSensorCallback {
                        // 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
+                       // ...
                }
        }
 
@@ -418,6 +366,22 @@ public class HomeSecurityController implements SmartthingsSensorCallback {
        }
 
 
+       /** 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
@@ -441,6 +405,7 @@ public class HomeSecurityController implements SmartthingsSensorCallback {
                                        zoneId = room.getRoomID();
                                        turnOnAlarms(zoneId);
                                        System.out.println("DETECTION: Camera active in room: " + zoneId);
+                                       lockDoors();
                                }
                        }
 
@@ -454,6 +419,7 @@ public class HomeSecurityController implements SmartthingsSensorCallback {
                                        turnOnAlarms(zoneId);
                                        System.out.println("DETECTION: Sensor active in room: " + zoneId);
                                        System.out.println("DETECTION: Detection by sensor: " + sensor.getId());
+                                       lockDoors();
                                }
                        }
                }
@@ -534,10 +500,8 @@ public class HomeSecurityController implements SmartthingsSensorCallback {
                        initCameras(rm);
 
                        // Init all doorlocks
-                       //initDoorLocks();
+                       initDoorLocks();
 
-                       // Init all outlets
-                       //initOutlets();
                }
 
                // Init all alarms