PageRenderTime 377ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/backend/controllers/FinalconfigurationController.php

https://gitlab.com/danielpanjaitan/agrimon
PHP | 467 lines | 303 code | 50 blank | 114 comment | 45 complexity | 9e57bd458df6147e00d13f15fb1f296f MD5 | raw file
  1. <?php
  2. namespace backend\controllers;
  3. use Yii;
  4. use backend\models\Finalconfiguration;
  5. use backend\searchModels\FinalconfigurationSearch;
  6. use yii\web\Controller;
  7. use yii\web\NotFoundHttpException;
  8. use yii\filters\VerbFilter;
  9. use backend\models\Model;
  10. use backend\models\Sensorinuse;
  11. use backend\models\SensorAvailable;
  12. use backend\searchModels\SensorinuseSearch;
  13. use yii\helpers\ArrayHelper;
  14. use backend\models\SensorData;
  15. use backend\searchModels\SensordataSearch;
  16. use backend\models\ActuatorAvailable;
  17. use backend\models\Actuatorinuse;
  18. use backend\searchModels\ActuatoravailableSearch;
  19. use backend\searchModels\ActuatorinuseSearch;
  20. use yii\helpers\Json;
  21. use backend\models\Actcondition;
  22. /**
  23. * FinalConfigurationController implements the CRUD actions for FinalConfiguration model.
  24. */
  25. class FinalconfigurationController extends Controller {
  26. public function behaviors() {
  27. return [
  28. 'verbs' => [
  29. 'class' => VerbFilter::className(),
  30. 'actions' => [
  31. 'delete' => ['post'],
  32. ],
  33. ],
  34. ];
  35. }
  36. /**
  37. * Lists all FinalConfiguration models.
  38. * @return mixed
  39. */
  40. public function actionIndex() {
  41. $searchModel = new FinalConfigurationSearch();
  42. $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
  43. return $this->render('index', [
  44. 'searchModel' => $searchModel,
  45. 'dataProvider' => $dataProvider,
  46. ]);
  47. }
  48. /**
  49. * Displays a single FinalConfiguration model.
  50. * @param string $id
  51. * @return mixed
  52. */
  53. public function actionHasil($id) {
  54. if (SensorData::find()->where(['token_id' => $id])->count() == 0) {
  55. Yii::$app->session->setFlash('warning', "Maaf, Data sensor belum anda, coba tunggu beberapa saat lagi, atau lakukan upload source code ");
  56. return $this->redirect(['view', 'id' => $id]);
  57. } else {
  58. $details = new SensordataSearch();
  59. $queryParams = array_merge(array(), Yii::$app->request->getQueryParams());
  60. $queryParams["SensordataSearch"]["token_id"] = $id;
  61. $dataProvider = $details->search($queryParams);
  62. return $this->render('hasil', [
  63. 'id' => $id,
  64. 'dataProvider' => $dataProvider,
  65. 'searchModel' => $details,
  66. ]);
  67. }
  68. }
  69. public function actionUpload($id) {
  70. //$this->actionGen($id);
  71. $output = shell_exec("sudo /var/www/html/agrimon/backend/web/executor.sh");
  72. //echo "<pre>".$output."</pre>";
  73. Yii::$app->session->setFlash('warning', "Source Code telah berhasil di upload");
  74. return $this->redirect(['view', 'id' => $id]);
  75. }
  76. public function actionAddactuator($id) {
  77. $model = new Actuatorinuse();
  78. $modelsDetail = [new \backend\models\Actcondition];
  79. $cons = "";
  80. if ($model->load(Yii::$app->request->post())) {
  81. $model->token_id = $id;
  82. $model->save();
  83. $modelsDetail = Model::createMultiple(\backend\models\Actcondition::classname());
  84. \backend\models\Model::loadMultiple($modelsDetail, Yii::$app->request->post());
  85. // validate all models
  86. $valid = $model->validate();
  87. $valid = Model::validateMultiple($modelsDetail) && $valid;
  88. if ($valid) {
  89. $transaction = \Yii::$app->db->beginTransaction();
  90. try {
  91. if ($flag = $model->save(false)) {
  92. foreach ($modelsDetail as $modelDetail) {
  93. $modelDetail->actuator_in_use_id = $model->id;
  94. if (!($flag = $modelDetail->save(false))) {
  95. $transaction->rollBack();
  96. break;
  97. }
  98. }
  99. }
  100. if ($flag) {
  101. $transaction->commit();
  102. return $this->redirect(['view', 'id' => $id]);
  103. }
  104. } catch (Exception $e) {
  105. $transaction->rollBack();
  106. }
  107. }
  108. } else {
  109. return $this->render('addactuator', [
  110. 'model' => $model,
  111. 'modelsDetail' => (empty($modelsDetail)) ? [new \backend\models\Sensorinuse] : $modelsDetail,
  112. 'id' => $id,
  113. 'cons' => $cons,
  114. ]);
  115. }
  116. }
  117. public function actionGen($id) {
  118. // die();
  119. if (Sensorinuse::find()->where(['token_id' => $id])->count() == 0) {
  120. Yii::$app->session->setFlash('warning', "Maaf, Anda harus menggunakan minimal satu sensor");
  121. return $this->redirect(['view', 'id' => $id]);
  122. } else {
  123. $model = new Finalconfiguration();
  124. $model = $this->findModel($id);
  125. $model->global_configuration = Yii::$app->generalConf->globalconfiguration() . "\n" . 'char token[ ] = "' . $model->token_id . '";';
  126. $model->open_loop_function = Yii::$app->generalConf->openloop() . "\n" . 'client.print(",\"Token\":\"");' . "\n" . 'client.print(token);' . "\n" . 'client.print("\"");';
  127. $model->setup_function = Yii::$app->generalConf->setupfunction();
  128. //Konfigurasi Aktuator
  129. if (Actuatorinuse::find()->where(['token_id' => $id])->count() != 0) {
  130. $allAktuator = ArrayHelper::map(Actuatorinuse::findAll(['token_id' => $id]), 'actuator_name', 'pin_in_use', 'id');
  131. $actuatoriterator = 0;
  132. foreach ($allAktuator as $indexA => $valueA) {
  133. $arrayActuatorID[$actuatoriterator] = $indexA;
  134. foreach ($valueA as $actuatorName => $actuatorPin) {
  135. $arrayActuatorName[$actuatoriterator] = ActuatorAvailable::findOne($actuatorName);
  136. $arrayActuatorPin[$actuatoriterator] = $actuatorPin;
  137. }
  138. $actuatoriterator++;
  139. }
  140. // echo "<pre>";
  141. // print_r($arrayActuatorID);
  142. // echo "<pre>";
  143. // print_r($arrayActuatorName);
  144. // echo "<pre>";
  145. // print_r($arrayActuatorPin);
  146. // echo "<pre>";
  147. // print_r($allAktuator);
  148. for ($i = 0; $i < sizeof($arrayActuatorID); $i++) {
  149. $allActCondition = ArrayHelper::map(Actcondition::findAll(['actuator_in_use_id' => $arrayActuatorID[$i]]), 'sensor_name', 'constraint');
  150. $conditionPerActuator[$i] = "(";
  151. foreach ($allActCondition as $nameOfSensor => $constarint) {
  152. $conditionPerActuator[$i] = $conditionPerActuator[$i] . "" . $nameOfSensor . " " . $constarint . " && ";
  153. }
  154. $conditionPerActuator[$i] = substr($conditionPerActuator[$i], 0, -3);
  155. $conditionPerActuator[$i] = $conditionPerActuator[$i] . ")";
  156. }
  157. // echo "<pre>";
  158. // print_r($conditionPerActuator);
  159. for ($i = 0; $i < sizeof($arrayActuatorName); $i++) {
  160. $arrayActuatorName[$i]->pin_assignment = str_replace($arrayActuatorName[$i]->pin_name, $arrayActuatorPin[$i], $arrayActuatorName[$i]->pin_assignment);
  161. $model->global_configuration = $model->global_configuration . "\n" . $arrayActuatorName[$i]->pin_assignment;
  162. // $model->setup_function = Yii::$app->generalConf->setupfunction() . "\n" . $arrayActuatorName[$i]->setup_code;
  163. $model->setup_function = $model->setup_function . "\n" . $arrayActuatorName[$i]->setup_code;
  164. $arrayActuatorName[$i]->actuation_code = str_replace("kondisiAktuator", $conditionPerActuator[$i], $arrayActuatorName[$i]->actuation_code);
  165. $model->open_loop_function = $arrayActuatorName[$i]->actuation_code . "\n" . $model->open_loop_function . "\n" . $arrayActuatorName[$i]->json_code;
  166. // echo $model->open_loop_function . "<br><br>";
  167. }
  168. // die();
  169. //
  170. // $actuatoriterator = 0;
  171. //
  172. // foreach ($allAktuator as $indexA => $valueA) {
  173. // $arrayActuatorIndex[$actuatoriterator] = Actuatorinuse::findOne($indexA);
  174. // foreach ($valueA as $actuatorName => $actuatorPin) {
  175. // $arrayActuator[$actuatoriterator] = ActuatorAvailable::findOne($actuatorName);
  176. // $arrayActuatorPin[$actuatoriterator] = $actuatorPin;
  177. // }
  178. // $actuatoriterator++;
  179. // }
  180. // $kondisi = "";
  181. // for ($iA = 0; $iA < $actuatoriterator; $iA++) {
  182. // $kondisi = $kondisi . "(";
  183. // if ($arrayActuatorIndex[$iA]->temperature_condition != NULL) {
  184. // $kondisi = $kondisi . "" . $arrayActuatorIndex[$iA]->temperature_condition . " && ";
  185. // }
  186. // if ($arrayActuatorIndex[$iA]->room_humidity_condition != NULL) {
  187. // $kondisi = $kondisi . "" . $arrayActuatorIndex[$iA]->room_humidity_condition . " && ";
  188. // }
  189. // if ($arrayActuatorIndex[$iA]->soil_humidity_condition != NULL) {
  190. // $kondisi = $kondisi . "" . $arrayActuatorIndex[$iA]->soil_humidity_condition . " && ";
  191. // }
  192. // $kondisi = substr($kondisi, 0, -3);
  193. // $kondisi = $kondisi . ")";
  194. // $arrayActuator[$iA]->pin_assignment = str_replace($arrayActuator[$iA]->pin_name, $arrayActuatorPin[$iA], $arrayActuator[$iA]->pin_assignment);
  195. //
  196. // $model->global_configuration = $model->global_configuration . "\n" . $arrayActuator[$iA]->pin_assignment;
  197. //
  198. // $model->setup_function = Yii::$app->generalConf->setupfunction() . "\n" . $arrayActuator[$iA]->setup_code;
  199. //
  200. // $arrayActuator[$iA]->actuation_code = str_replace("kondisiAktuator", $kondisi, $arrayActuator[$iA]->actuation_code);
  201. //
  202. // $model->open_loop_function = $arrayActuator[$iA]->actuation_code . "\n" . $model->open_loop_function . "\n" . $arrayActuator[$iA]->json_code;
  203. // }
  204. }
  205. // echo Actuatorinuse::find()->where(['token_id' => $id])->count();
  206. //die();
  207. //Konfigurasi Sensor
  208. $allSensor = ArrayHelper::map(Sensorinuse::findAll(['token_id' => $id]), 'sensor_name', 'pin_in_use', 'id');
  209. // echo '<pre>';
  210. // print_r($allSensor);
  211. // die();
  212. $iterator = 0;
  213. foreach ($allSensor as $index => $value) {
  214. $arrayIdentifier[$iterator] = Sensorinuse::findOne($index);
  215. foreach ($value as $sensorName => $pin) {
  216. $arraySensor[$iterator] = SensorAvailable::findOne($sensorName);
  217. $arrayPin[$iterator] = $pin;
  218. }
  219. $iterator++;
  220. }
  221. for ($i = 0; $i < $iterator; $i++) {
  222. //$arraySensor[$i]->pin_assignment = str_replace($arraySensor[$i]->pin_name, $arrayPin[$i], $arraySensor[$i]->pin_assignment);
  223. //$model->global_configuration = $model->global_configuration . "\n" . $arraySensor[$i]->pin_assignment;
  224. //if ($i != $iterator - 1) {
  225. //$model->open_loop_function = $arraySensor[$i]->sense_code . "\n" . $model->open_loop_function . "\n" . $arraySensor[$i]->json_code . "\n" . 'client.print("\"");';
  226. //} else {
  227. // $model->open_loop_function = $arraySensor[$i]->sense_code . "\n" . $model->open_loop_function . "\n" . $arraySensor[$i]->json_code;
  228. $model->open_loop_function = $arrayIdentifier[$i]->identifier . " = " . $arraySensor[$i]->sensor_name . "Assignment (" . $arrayPin[$i] . ");\n" . $model->open_loop_function . "\n" . $arraySensor[$i]->sensor_name . "Print" . "(client," . "\"" . $arrayIdentifier[$i]->identifier . "\"," . $arrayIdentifier[$i]->identifier . ");" . "";
  229. $model->global_configuration = $model->global_configuration . "\n" . $arraySensor[$i]->variable_type . " " . $arrayIdentifier[$i]->identifier . ";";
  230. //}
  231. }
  232. if ($model->save()) {
  233. $sourceCode = $model->library_list . "\n\n" . $model->global_configuration . "\n\n" . "void setup(){\n" . $model->setup_function . "\n}" . "\n\nvoid loop(){\n" . $model->open_loop_function . "\n" . $model->close_loop_function . "\n}\n";
  234. $my_file = 'sketch/src/sketch.ino';
  235. $handle = fopen($my_file, 'w') or die('Cannot open file: ' . $my_file);
  236. fwrite($handle, $sourceCode);
  237. fclose($handle);
  238. Yii::$app->session->setFlash('sukses', "Source Code berhasil digenerate");
  239. return $this->redirect(['view', 'id' => $id]);
  240. } else {
  241. Yii::$app->session->setFlash('warning', "Maaf, Terjadi kesalahan, coba beberapa saat lagi");
  242. return $this->redirect(['view', 'id' => $id]);
  243. }
  244. }
  245. }
  246. public function actionView($id) {
  247. $modelSensor = new Sensorinuse();
  248. $modelActuator = new Actuatorinuse();
  249. $model = $this->findModel($id);
  250. $details = new SensorinuseSearch();
  251. $queryParams = array_merge(array(), Yii::$app->request->getQueryParams());
  252. $queryParams["SensorinuseSearch"]["token_id"] = $id;
  253. $dataProvider = $details->search($queryParams);
  254. $newDetails = new ActuatorinuseSearch();
  255. $newQueryParams = array_merge(array(), Yii::$app->request->getQueryParams());
  256. $newQueryParams["ActuatorinuseSearch"]["token_id"] = $id;
  257. $actuatorDataProvider = $newDetails->search($newQueryParams);
  258. if ($modelSensor->load(Yii::$app->request->post())) {
  259. $modelSensor->token_id = $model->token_id;
  260. $modelSensor->save();
  261. return $this->redirect(['view', 'id' => $model->token_id]);
  262. } else if ($modelActuator->load(Yii::$app->request->post())) {
  263. $modelActuator->token_id = $model->token_id;
  264. // $temperatureSensor=
  265. if ($modelActuator->temperature_condition != NULL) {
  266. // break;
  267. $modelActuator->temperature_condition = "DHT.temperature >= " . $modelActuator->temperature_condition;
  268. }
  269. if ($modelActuator->room_humidity_condition != NULL) {
  270. $modelActuator->room_humidity_condition = "DHT.humidity <= " . $modelActuator->room_humidity_condition;
  271. }
  272. if ($modelActuator->soil_humidity_condition != NULL) {
  273. $modelActuator->soil_humidity_condition = "soil <= " . $modelActuator->soil_humidity_condition;
  274. }
  275. $modelActuator->save();
  276. return $this->redirect(['view', 'id' => $model->token_id]);
  277. } else {
  278. return $this->render('view', [
  279. 'modelSensor' => $modelSensor,
  280. 'modelActuator' => $modelActuator,
  281. 'model' => $model,
  282. 'dataProvider' => $dataProvider,
  283. 'actuatorDataProvider' => $actuatorDataProvider,
  284. 'searchModel' => $details,
  285. 'actuatorSearchModel' => $newDetails,
  286. ]);
  287. }
  288. // return $this->render('view', [
  289. // 'model' => $this->findModel($id),
  290. // ]);
  291. }
  292. public function actionGeneratePrimaryKey() {
  293. // $newKey = 'SENS-'. date('Y-m-d') .'-'. '001';
  294. // $key = Finalconfiguration::find()->orderBy('token_id desc')->one();
  295. // if (isset($key)) {
  296. // $newKey = 'SENS-'. date('Y-m-d').'-'. (str_pad(substr($key->token_id, 2) + 1, 3, '0', STR_PAD_LEFT));
  297. // }
  298. // return $newKey;
  299. $newKey = bin2hex(openssl_random_pseudo_bytes(10));
  300. return $newKey;
  301. }
  302. /**
  303. * Creates a new FinalConfiguration model.
  304. * If creation is successful, the browser will be redirected to the 'view' page.
  305. * @return mixed
  306. */
  307. public function actionCreate() {
  308. $model = new FinalConfiguration();
  309. if ($model->load(Yii::$app->request->post())) {
  310. $model->library_list = Yii::$app->generalConf->librarylist();
  311. $model->global_configuration = Yii::$app->generalConf->globalconfiguration() . "\n" . 'char token[ ] = "' . $model->token_id . '";';
  312. $model->setup_function = Yii::$app->generalConf->setupfunction();
  313. $model->open_loop_function = Yii::$app->generalConf->openloop() . "\n" . 'client.print(",\"Token\":\"");' . "\n" . 'client.print(token);' . "\n" . 'client.print("\"");' . "\n";
  314. $model->close_loop_function = Yii::$app->generalConf->closeloop();
  315. $model->created_at = date('Y-m-d G:i:s');
  316. $model->save();
  317. return $this->redirect(['view', 'id' => $model->token_id]);
  318. } else {
  319. return $this->render('create', [
  320. 'model' => $model,
  321. ]);
  322. }
  323. }
  324. public function actionLeate() {
  325. $model = new Finalconfiguration();
  326. $modelsDetail = [new \backend\models\Sensorinuse];
  327. if ($model->load(Yii::$app->request->post())) {
  328. $model->library_list = Yii::$app->generalConf->librarylist();
  329. $model->global_configuration = Yii::$app->generalConf->globalconfiguration();
  330. $model->setup_function = Yii::$app->generalConf->setupfunction();
  331. $model->open_loop_function = Yii::$app->generalConf->openloop();
  332. $model->close_loop_function = Yii::$app->generalConf->closeloop();
  333. $model->created_at = date('Y-m-d G:i:s');
  334. $model->save();
  335. $modelsDetail = Model::createMultiple(\backend\models\Sensorinuse::classname());
  336. \backend\models\Model::loadMultiple($modelsDetail, Yii::$app->request->post());
  337. // validate all models
  338. $valid = $model->validate();
  339. $valid = Model::validateMultiple($modelsDetail) && $valid;
  340. if ($valid) {
  341. $transaction = \Yii::$app->db->beginTransaction();
  342. try {
  343. if ($flag = $model->save(false)) {
  344. foreach ($modelsDetail as $modelDetail) {
  345. $modelDetail->token_id = $model->token_id;
  346. if (!($flag = $modelDetail->save(false))) {
  347. $transaction->rollBack();
  348. break;
  349. }
  350. }
  351. }
  352. if ($flag) {
  353. $transaction->commit();
  354. return $this->redirect(['view', 'id' => $model->token_id]);
  355. }
  356. } catch (Exception $e) {
  357. $transaction->rollBack();
  358. }
  359. }
  360. } else {
  361. return $this->render('create', [
  362. 'model' => $model,
  363. 'modelsDetail' => (empty($modelsDetail)) ? [new \backend\models\Sensorinuse] : $modelsDetail
  364. ]);
  365. }
  366. }
  367. /**
  368. * Updates an existing FinalConfiguration model.
  369. * If update is successful, the browser will be redirected to the 'view' page.
  370. * @param string $id
  371. * @return mixed
  372. */
  373. public function actionUpdate($id) {
  374. $model = $this->findModel($id);
  375. if ($model->load(Yii::$app->request->post()) && $model->save()) {
  376. return $this->redirect(['view', 'id' => $model->token_id]);
  377. } else {
  378. return $this->render('update', [
  379. 'model' => $model,
  380. ]);
  381. }
  382. }
  383. /**
  384. * Deletes an existing FinalConfiguration model.
  385. * If deletion is successful, the browser will be redirected to the 'index' page.
  386. * @param string $id
  387. * @return mixed
  388. */
  389. public function actionDelete($id) {
  390. $this->findModel($id)->delete();
  391. return $this->redirect(['index']);
  392. }
  393. /**
  394. * Finds the FinalConfiguration model based on its primary key value.
  395. * If the model is not found, a 404 HTTP exception will be thrown.
  396. * @param string $id
  397. * @return FinalConfiguration the loaded model
  398. * @throws NotFoundHttpException if the model cannot be found
  399. */
  400. protected function findModel($id) {
  401. if (($model = FinalConfiguration::findOne($id)) !== null) {
  402. return $model;
  403. } else {
  404. throw new NotFoundHttpException('The requested page does not exist.');
  405. }
  406. }
  407. public function actionAjaxFiller($id) {
  408. $model = new Sensoravailable;
  409. $model = Sensoravailable::findOne($id);
  410. echo Json::encode($model);
  411. }
  412. public function actionAj2axFiller($id) {
  413. $model = new ActuatorAvailable;
  414. $model = ActuatorAvailable::findOne($id);
  415. echo Json::encode($model);
  416. }
  417. }