HeaterScenario.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. package de.tu_darmstadt.tk.SmartHomeNetworkSim.view.menuBar;
  2. import org.apache.commons.math3.distribution.NormalDistribution;
  3. import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.Controller;
  4. import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.NetworkController;
  5. import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.PacketCaptureController;
  6. import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.SimulationController;
  7. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Connection;
  8. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.ConnectionPrecision;
  9. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Link;
  10. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.PacketCollector;
  11. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Port;
  12. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.PrecisionLink;
  13. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.RoomStatus;
  14. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.SimulationManager;
  15. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.SmartDevice;
  16. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.devices.SmartLight;
  17. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.devices.SmartLightSensor;
  18. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.devices.SmartTemperatureProducer;
  19. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.devices.SmartTemperatureSensor;
  20. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.distributionHandler.NormalDistributionHandler;
  21. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.protocols.MQTT_protocol;
  22. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.scheduler.AbstractEvent;
  23. import de.tu_darmstadt.tk.SmartHomeNetworkSim.evaluation.SWCKMeansClustering;
  24. import de.tu_darmstadt.tk.SmartHomeNetworkSim.evaluation.SWCKMeansClusteringWithLabels;
  25. public class HeaterScenario {
  26. Controller controller;
  27. NetworkController networkController;
  28. public HeaterScenario(Controller controller, NetworkController networkController) {
  29. this.controller=controller;
  30. this.networkController=networkController;
  31. }
  32. /**
  33. * Creates the paper toy example, also simulates it, if run = true
  34. * @param run
  35. */
  36. @SuppressWarnings("unchecked")
  37. public void createSWCExample(boolean run){
  38. /**
  39. * Reset network, etc.
  40. */
  41. long hour = 60 * 60 * 1000;
  42. long endTime = 24 * hour;
  43. long noAnomEnd = endTime + 1 * hour;
  44. long heaterEnd = noAnomEnd + 1 * hour;
  45. long stepLength=hour;
  46. long currentSimTime=0;
  47. SimulationController sim = controller.getSimulationController();
  48. if(run) {
  49. controller.getSimulationController().resetSimulation();
  50. controller.getNetworkController().deleteNetworkModel();
  51. /*
  52. * Simulate 24 hours
  53. */
  54. sim.setStartTime(0);
  55. sim.resetSimulation();
  56. sim.setStepDuration(hour);
  57. sim.setPrintPackets(false);
  58. sim.setEndTime(endTime);
  59. }
  60. /*
  61. * Main networking devices
  62. */
  63. SmartDevice smartHub = networkController.createSmartDevice("SmartHub", 400, 400, 50);
  64. /*
  65. * Links/Networks
  66. */
  67. Link zigbee = new PrecisionLink("ZigBee");
  68. networkController.addLink(zigbee);
  69. /*
  70. * Connect Devices to Links
  71. */
  72. networkController.addLinkToDevice(zigbee, smartHub);
  73. /*
  74. * Create MQTT Connection
  75. */
  76. Connection mqtt = new ConnectionPrecision();
  77. mqtt.setName("HomeAutomation (MQTT)");
  78. networkController.addConnectionToLink(mqtt, zigbee);
  79. mqtt.setProtocol(new MQTT_protocol());
  80. Port pBroker = new Port(smartHub, (short)1883);
  81. pBroker.setStatus(Port.OPEN);
  82. pBroker.setResponseTime((short)2);
  83. networkController.addDeviceToConnectionAndProtocol(pBroker, mqtt, 0);
  84. networkController.addConnection(mqtt);
  85. mqtt.setLabel((short) 0);
  86. /**
  87. * Room
  88. */
  89. String roomName = "Bedroom";
  90. RoomStatus room = new RoomStatus();
  91. room.setTemperature(19f);
  92. /*
  93. * Add some MQTT Devices
  94. */
  95. /**
  96. * Room Thermostat
  97. */
  98. SmartTemperatureSensor heatSensor = new SmartTemperatureSensor(roomName + " Thermostat", room);
  99. heatSensor.setFSinfoName("home/" + roomName + "/sensorTemp");
  100. networkController.addLinkToDevice(zigbee, heatSensor);
  101. networkController.moveSmartDevice(heatSensor, 300, 300, 50);
  102. heatSensor.setFSmin(19.0f);
  103. heatSensor.setFSmax(21.0f);
  104. heatSensor.setFSval(19.0f);
  105. networkController.addSmartDevice(heatSensor);
  106. Port pFloatSensor = new Port(heatSensor, (short)1883, 15000);
  107. pFloatSensor.setTriggerHandler(new NormalDistributionHandler(15000, 500));
  108. pFloatSensor.setStatus(Port.SENDING);
  109. pFloatSensor.setLastTrigger(-357L);
  110. networkController.addDeviceToConnectionAndProtocol(pFloatSensor, mqtt,1);
  111. heatSensor.setLabel((short) 0);
  112. /*
  113. * Add Heater (every second update)
  114. */
  115. SmartTemperatureProducer heaterDevice = new SmartTemperatureProducer(roomName + " Heater", room, 500, heatSensor);
  116. heaterDevice.setFSinfoName("home/" + roomName + "/heaterTemp");
  117. networkController.addLinkToDevice(zigbee, heaterDevice);
  118. networkController.moveSmartDevice(heaterDevice, 300, 500, 50);
  119. heaterDevice.setFSmin(19.0f);
  120. heaterDevice.setFSmax(21.0f);
  121. heaterDevice.setFSval(19.0f);
  122. networkController.addSmartDevice(heaterDevice);
  123. Port pHeaterDevice = new Port(heaterDevice, (short)1883, 15000);
  124. pHeaterDevice.setStatus(Port.SENDING);
  125. pHeaterDevice.setTriggerHandler(new NormalDistributionHandler(15000, 500));
  126. pHeaterDevice.setLastTrigger(-1231L);
  127. networkController.addDeviceToConnectionAndProtocol(pHeaterDevice, mqtt,1);
  128. heaterDevice.setLabel((short) 0);
  129. /*
  130. * Update visualization
  131. */
  132. controller.notifyObservers();
  133. /**
  134. * Run only if run == true
  135. */
  136. if(!run)return;
  137. try {
  138. System.out.println("Check 1");//TODO
  139. /**
  140. * Instances of the packet Sniffers
  141. */
  142. SWCKMeansClusteringWithLabels snifferKNNwithLabels = new SWCKMeansClusteringWithLabels();
  143. SWCKMeansClustering snifferKNNnoLabels = new SWCKMeansClustering();
  144. PacketCollector collectorKNNwithLabels = new PacketCollector(snifferKNNwithLabels);
  145. PacketCollector collectorKNNnoLabels = new PacketCollector(snifferKNNnoLabels);
  146. //PacketCollector collectorEM = new PacketCollector(snifferEM);
  147. //PacketCollector collectorHC = new PacketCollector(snifferHC);
  148. /*
  149. * Capture both links on all collectors
  150. */
  151. PacketCaptureController captureController = controller.getSimulationController().getPacketCaptureController();
  152. //captureController.addLinkToCollector(collectorEM, zigbee);
  153. //captureController.addLinkToCollector(collectorKNN, zigbee);
  154. captureController.addDeviceToCollector(collectorKNNwithLabels, heaterDevice);
  155. captureController.addPacketCollector(collectorKNNwithLabels);
  156. captureController.addDeviceToCollector(collectorKNNnoLabels, heaterDevice);
  157. captureController.addPacketCollector(collectorKNNnoLabels);
  158. //captureController.addPacketCollector(collectorEM);
  159. //captureController.addPacketCollector(collectorHC);
  160. System.out.println("Check 3: created Controller");//TODO
  161. long currentTime = System.currentTimeMillis();
  162. /**
  163. * Training events
  164. */
  165. System.out.println("Create training events");
  166. /**
  167. * Heater Events (random switch every 2h +- 30min
  168. */
  169. NormalDistribution tempDist = new NormalDistribution(2*hour, hour/2);
  170. long eventTime = 0;
  171. boolean low = true;
  172. while(eventTime < noAnomEnd) {
  173. /**
  174. * At least 1 second between events
  175. */
  176. final float newTemp;
  177. if(low)
  178. newTemp = heaterDevice.getFSmax();
  179. else
  180. newTemp = heaterDevice.getFSmin();
  181. low = !low;
  182. SimulationManager.scheduleEvent(new AbstractEvent(eventTime) {
  183. @Override
  184. public void simulateEvent(long time) {
  185. heaterDevice.setFSval(newTemp);
  186. heaterDevice.setTrueTemperature(newTemp);
  187. }
  188. });
  189. eventTime+=Math.max(1000, Math.round(tempDist.sample()));
  190. }
  191. System.out.println("Training:");//TODO
  192. while(currentSimTime<endTime) {
  193. sim.getSimulationManager().simulateTimeIntervall(currentSimTime, stepLength);
  194. currentSimTime+=stepLength;
  195. }
  196. long new_time = System.currentTimeMillis();
  197. long elapsed_time = new_time-currentTime;
  198. System.out.println("Training data generation took: "+elapsed_time+"ms");
  199. currentTime = new_time;
  200. /*
  201. * Start Classifying
  202. */
  203. collectorKNNwithLabels.setMode(true);
  204. collectorKNNnoLabels.setMode(true);
  205. //collectorEM.setMode(true);
  206. //collectorHC.setMode(true);
  207. new_time = System.currentTimeMillis();
  208. elapsed_time = new_time-currentTime;
  209. System.out.println("Training of algorithm took: "+elapsed_time+"ms");
  210. currentTime = new_time;
  211. /*
  212. * Simulate/Test 2 hour without anomalies
  213. */
  214. snifferKNNwithLabels.setCurrentScenario("NoAnomalies");
  215. snifferKNNnoLabels.setCurrentScenario("NoAnomalies");
  216. System.out.println("Test w/0 anomalies:");//TODO
  217. sim.getSimulationManager().simulateTimeIntervall(currentSimTime, noAnomEnd-currentSimTime);
  218. currentSimTime=noAnomEnd;
  219. new_time = System.currentTimeMillis();
  220. elapsed_time = new_time-currentTime;
  221. System.out.println("Test witout anomalies took: "+elapsed_time+"ms");
  222. currentTime = new_time;
  223. /**
  224. * Temperature Anomaly 1h
  225. */
  226. snifferKNNwithLabels.setCurrentScenario("TemperatureAnomalies");
  227. snifferKNNnoLabels.setCurrentScenario("TemperatureAnomalies");
  228. System.out.println("Temperature Anomaly:");
  229. heaterDevice.setFSval(21f);
  230. heaterDevice.setTrueTemperature(34f);
  231. heaterDevice.setLabel((short)-1);//-1 Value anomaly
  232. sim.getSimulationManager().simulateTimeIntervall(currentSimTime, heaterEnd-currentSimTime);
  233. currentSimTime=heaterEnd;
  234. heaterDevice.setFSval(21f);
  235. heaterDevice.setTrueTemperature(21f);
  236. heaterDevice.setLabel((short)0);
  237. new_time = System.currentTimeMillis();
  238. elapsed_time = new_time-currentTime;
  239. System.out.println("Anomaly generation & classification: "+elapsed_time+"ms");
  240. currentTime = new_time;
  241. System.out.println("Testing completed");
  242. } catch(Exception e) {
  243. System.out.println("WARNING: Testing failed: ");
  244. e.printStackTrace();
  245. }
  246. }
  247. }