Compare commits

..

No commits in common. "ac43bdaf640e21c95a253fb883267de29aaa7fa0" and "5ad11cbb10942769d537dc0bc6c16ca4c13af899" have entirely different histories.

12 changed files with 124 additions and 103 deletions

View File

@ -19,7 +19,6 @@ $router->any('/logout', 'Logout');
$router->any('/automation', 'Automation'); $router->any('/automation', 'Automation');
$router->any('/setting', 'Setting'); $router->any('/setting', 'Setting');
$router->any('/device', 'Device'); $router->any('/device', 'Device');
$router->get('/device/{sortBy}/{sortType}', 'Device');
$router->any('/plugins', 'Plugins'); $router->any('/plugins', 'Plugins');
$router->any('/ajax', 'Ajax'); $router->any('/ajax', 'Ajax');
$router->any('/oauth', 'Oauth'); $router->any('/oauth', 'Oauth');

View File

@ -70,6 +70,11 @@ class EndpointsApi extends ApiController{
$data['firmware_hash'] = $obj['settings']["firmware_hash"]; $data['firmware_hash'] = $obj['settings']["firmware_hash"];
} }
DeviceManager::editByToken($obj['token'], $data); DeviceManager::editByToken($obj['token'], $data);
$this->response([
'state' => 'succes',
'command' => $command,
], 200);
die();
} }
//Log Data Save //Log Data Save
@ -110,7 +115,6 @@ class EndpointsApi extends ApiController{
if (!SubDeviceManager::getSubDeviceByMaster($device['device_id'], $key)) { if (!SubDeviceManager::getSubDeviceByMaster($device['device_id'], $key)) {
SubDeviceManager::create($device['device_id'], $key, UNITS[$key]); SubDeviceManager::create($device['device_id'], $key, UNITS[$key]);
} }
$subDeviceLastReordValue[$key] = $value['value']; $subDeviceLastReordValue[$key] = $value['value'];
RecordManager::create($device['device_id'], $key, round($value['value'],3)); RecordManager::create($device['device_id'], $key, round($value['value'],3));
$logManager->write("[API] Device_ID " . $device['device_id'] . " writed value " . $key . ' ' . $value['value'], LogRecordTypes::INFO); $logManager->write("[API] Device_ID " . $device['device_id'] . " writed value " . $key . ' ' . $value['value'], LogRecordTypes::INFO);
@ -166,12 +170,11 @@ class EndpointsApi extends ApiController{
foreach ($subDevicesData as $key => $subDeviceData) { foreach ($subDevicesData as $key => $subDeviceData) {
$subDeviceId = $subDeviceData['subdevice_id']; $subDeviceId = $subDeviceData['subdevice_id'];
$subDeviceLastReord = RecordManager::getLastRecord($subDeviceId); $subDeviceLastReord = RecordManager::getLastRecord($subDeviceId);
if (!empty ($subDeviceLastReord)) { $subDeviceLastReordValue[$subDeviceData['type']] = $subDeviceLastReord['value'];
$subDeviceLastReordValue[$subDeviceData['type']] = $subDeviceLastReord['value'];
if ($subDeviceLastReord['execuded'] == 0){ if ($subDeviceLastReord['execuded'] == 0){
$logManager->write("[API] subDevice_ID " . $subDeviceId . " executed comand with value " . json_encode($subDeviceLastReordValue) . " executed " . $subDeviceLastReord['execuded'], LogRecordTypes::INFO); $logManager->write("[API] subDevice_ID ".$subDeviceId . " executed comand with value " . json_encode($subDeviceLastReordValue) ." executed " . $subDeviceLastReord['execuded'], LogRecordTypes::INFO);
RecordManager::setExecuted($subDeviceLastReord['record_id']); RecordManager::setExecuted($subDeviceLastReord['record_id']);
}
} }
} }
} }

View File

@ -3,12 +3,10 @@ class DeviceManager{
public static $devices; public static $devices;
static function getAllDevices () { static function getAllDevices () {
return Db::loadAll ("SELECT * FROM devices return Db::loadAll ("SELECT devices.* FROM devices
WHERE approved != ?", Array(2)); WHERE approved != ?", Array(2));
} }
static function getAllDevicesInRoom ($roomId = "") { static function getAllDevicesInRoom ($roomId = "") {
return Db::loadAll ("SELECT * FROM devices WHERE room_id = ? AND approved != ?", Array($roomId, 2)); return Db::loadAll ("SELECT * FROM devices WHERE room_id = ? AND approved != ?", Array($roomId, 2));
} }

View File

@ -26,13 +26,7 @@ class RecordManager{
}; };
//Ochrana proti duplicitním hodnotám zapisují se jen změny //Ochrana proti duplicitním hodnotám zapisují se jen změny
$lastRecord = self::getLastRecord($subDeviceId, 1); if (self::getLastRecord($subDeviceId, 1)['value'] == $value){
if (!$lastRecord){
return false;
}
if ($lastRecord['value'] == $value){
return false; return false;
} }

View File

@ -3,69 +3,91 @@
class Device extends Template class Device extends Template
{ {
function __construct($sortBy = null, $sortType = null) function __construct () {
{ $userManager = new UserManager ();
$userManager = new UserManager(); $deviceManager = new DeviceManager ();
$deviceManager = new DeviceManager(); $subDeviceManager = new SubDeviceManager ();
$subDeviceManager = new SubDeviceManager(); $recordManager = new RecordManager ();
$recordManager = new RecordManager(); $roomManager = new RoomManager ();
$roomManager = new RoomManager(); $langMng = new LanguageManager ('en');
$langMng = new LanguageManager('en');
if (!$userManager->isLogin()) { if (!$userManager->isLogin()){
header('Location: ' . BASEURL . 'login'); header('Location: ' . BASEURL . 'login');
} }
$template = new Template('device'); $template = new Template ('device');
$template->prepare('title', $langMng->get("m_devices")); $template->prepare ('title', $langMng->get ("m_devices"));
$sortWordBook = [ if (!empty ($_GET['sort']) && !empty ($_SESSION['sort']) && $_SESSION['sort'] != $_GET['sort']) {
"id" => "device_id", unset($_SESSION['sort']);
"name" => "name", header('Location: device?sort=' . $_GET["sort"] . "&sortType=ASC");
"room" => "room_id", die();
"ip" => "ip_address",
"mac" => "mac",
"token" => "token",
"signal" => "signal",
"firmware" => "firmware_hash",
"icon" => "icon"
];
$sortIcons = [
"ASC" => "&#xf0de",
"DESC" => "&#xf0dd",
];
$nextSort = [
"ASC" => "DESC",
"DESC" => "ASC",
];
$devices = $deviceManager->getAllDevices();
if (empty($sortBy) && empty($sortType)) {
$sortBy = "id";
$sortType = "DESC";
} }
$template->prepare('sortIcon', [$sortBy => $sortIcons[$sortType]]); if (isset ($_GET['sortType'])) {
switch ($_GET['sortType']) {
case "DESC":
$sortType = "";
$sortIcon = "&#xf0dd";
break;
case "ASC":
$sortType = "DESC";
$sortIcon = "&#xf0de";
break;
case "":
unset($_GET["sort"]);
unset($_GET["sortType"]);
header('Location: device');
die();
break;
}
} else {
$sortType = "ASC";
}
if (!empty ($_GET['sort']) && !empty ($_GET['sortType'])) {
$template->prepare ('sortIcon', array ($_GET['sort'] => $sortIcon));
$actualSort = "devices.device_id";
switch ($_GET['sort']) {
case "name":
$actualSort = "devices.name";
break;
case "room":
$actualSort = "rooms.name";
break;
case "ip":
$actualSort = "devices.ip_address";
break;
case "mac":
$actualSort = "devices.mac";
break;
case "token":
$actualSort = "devices.token";
break;
}
$devices = $deviceManager->getAllDevicesSorted ($actualSort, $_GET['sortType']);
} else {
$devices = $deviceManager->getAllDevices ();
}
if (!empty ($_GET['sort'])) {
$_SESSION['sort'] = $_GET['sort'];
}
foreach ($devices as $key => $device) { foreach ($devices as $key => $device) {
//Signal Stenght $subdevice = $subDeviceManager->getSubDeviceByMasterAndType ($device['device_id'], "wifi");
$subdevice = $subDeviceManager->getSubDeviceByMasterAndType($device['device_id'], "wifi"); if (!empty ($subdevice['subdevice_id'])) {
$devices[$key]['signal'] = "";
if (!empty($subdevice['subdevice_id'])) {
$record = $recordManager->getLastRecord($subdevice['subdevice_id']); $record = $recordManager->getLastRecord($subdevice['subdevice_id']);
if (!empty($record)) { if (!empty ($record)) {
$devices[$key]['signal'] = $record['value'] . " " . $subdevice['unit']; $devices[$key]['signal'] = $record['value'] . " " . $subdevice['unit'];
} }
} }
if (empty ($devices[$key]['signal'])) {
//Firmware Status $devices[$key]['signal'] = "";
$localBinary = "../updater/" . str_replace(':', '', $device['mac']) . ".bin"; }
$devices[$key]['firmware_hash'] = ""; $localBinary = "../updater/" . str_replace (':', '', $device['mac']) . ".bin";
if (file_exists($localBinary)) { if (file_exists ($localBinary)) {
$hash = md5_file($localBinary); $hash = md5_file ($localBinary);
if ($hash == $device['firmware_hash']) { if ($hash == $device['firmware_hash']) {
$devices[$key]['firmware_hash'] = "true"; $devices[$key]['firmware_hash'] = "true";
} else { } else {
@ -74,22 +96,35 @@ class Device extends Template
} else { } else {
$devices[$key]['firmware_hash'] = "false"; $devices[$key]['firmware_hash'] = "false";
} }
if (empty ($device['mac'])) {
$devices[$key]['firmware_hash'] = "";
}
} }
$devices = Utilities::sortArrayByKey($devices, $sortWordBook[$sortBy], strtolower($sortType)); if (!empty ($_GET['sort']) && !empty ($_GET['sortType']) && $_GET['sort'] == "firmware") {
if ($_GET['sortType'] == "DESC") {
return Utilities::sortArrayByKey($devices, 'firmware_hash', "desc");
} else if ($_GET['sortType'] == "ASC") {
return Utilities::sortArrayByKey($devices, 'firmware_hash', "asc");
}
} else if (!empty ($_GET['sort']) && !empty ($_GET['sortType']) && $_GET['sort'] == "signal") {
if ($_GET['sortType'] == "DESC") {
return Utilities::sortArrayByKey($devices, 'signal', "desc");
} else if ($_GET['sortType'] == "ASC") {
return Utilities::sortArrayByKey($devices, 'signal', "asc");
}
}
$rooms = $roomManager->getAllRooms(); $rooms = $roomManager->getAllRooms();
$template->prepare('baseUrl', BASEURL); $template->prepare ('baseDir', BASEDIR);
$template->prepare('baseDir', BASEDIR); $template->prepare ('debugMod', DEBUGMOD);
$template->prepare ('logToLiveTime', LOGTIMOUT);
$template->prepare ('rooms', $rooms);
$template->prepare ('sortType', $sortType);
$template->prepare ('devices', $devices);
$template->prepare ('langMng', $langMng);
$template->prepare('debugMod', DEBUGMOD); $template->render ();
$template->prepare('logToLiveTime', LOGTIMOUT);
$template->prepare('rooms', $rooms);
$template->prepare('sortType', $nextSort[$sortType]);
$template->prepare('devices', $devices);
$template->prepare('langMng', $langMng);
$template->render();
} }
} }

View File

@ -2,9 +2,8 @@
<html lang="en"> <html lang="en">
<head> <head>
<?php <?php
$partial = new Partial('head'); $partial = new Partial('head');
$partial->prepare('baseDir', $BASEDIR); $partial->prepare('baseDir', $BASEDIR);
$partial->prepare('baseUrl', $BASEURL);
$partial->render(); $partial->render();
?> ?>
<title><?php echo $TITLE ?></title> <title><?php echo $TITLE ?></title>

View File

@ -5,7 +5,6 @@
<?php <?php
$partial = new Partial('head'); $partial = new Partial('head');
$partial->prepare('baseDir', $BASEDIR); $partial->prepare('baseDir', $BASEDIR);
$partial->prepare('baseUrl', $BASEURL);
$partial->render(); $partial->render();
?> ?>
<title><?php echo $TITLE ?></title> <title><?php echo $TITLE ?></title>
@ -26,15 +25,15 @@
<div class="col-md-9 main-body"> <div class="col-md-9 main-body">
<table class="table is-fluid"> <table class="table is-fluid">
<tr> <tr>
<th><a href="device/icon/<?php echo $SORTTYPE; ?>">#</a><i class="fa"><?php echo (!empty($SORTICON['icon']) ? $SORTICON['icon'] : ""); ?></i></th> <th><a href="device">#</a></th>
<th><a href="device/name/<?php echo $SORTTYPE; ?>">Name</a><i class="fa"><?php echo (!empty($SORTICON['name']) ? $SORTICON['name'] : ""); ?></i></th> <th><a href="device?sort=name&sortType=<?php echo $SORTTYPE; ?>">Name</a><i class="fa"><?php echo (!empty($SORTICON['name']) ? $SORTICON['name'] : ""); ?></i></th>
<th><a href="device/room/<?php echo $SORTTYPE; ?>">Room</a><i class="fa"><?php echo (!empty($SORTICON['room']) ? $SORTICON['room'] : ""); ?></i></th> <th><a href="device?sort=room&sortType=<?php echo $SORTTYPE; ?>">Room</a><i class="fa"><?php echo (!empty($SORTICON['room']) ? $SORTICON['room'] : ""); ?></i></th>
<th><a href="device/signal/<?php echo $SORTTYPE; ?>">Signal</a><i class="fa"><?php echo (!empty($SORTICON['signal']) ? $SORTICON['signal'] : ""); ?></i></th> <th><a href="device?sort=signal&sortType=<?php echo $SORTTYPE; ?>">Signal</a><i class="fa"><?php echo (!empty($SORTICON['signal']) ? $SORTICON['signal'] : ""); ?></i></th>
<th><a href="device/firmware/<?php echo $SORTTYPE; ?>">Firmware</a><i class="fa"><?php echo (!empty($SORTICON['firmware']) ? $SORTICON['firmware'] : ""); ?></i></th> <th><a href="device?sort=firmware&sortType=<?php echo $SORTTYPE; ?>">Firmware</a><i class="fa"><?php echo (!empty($SORTICON['firmware']) ? $SORTICON['firmware'] : ""); ?></i></th>
<th> <th>
<a href="/device/ip/<?php echo $SORTTYPE; ?>">IP Address</a><i class="fa"><?php echo (!empty($SORTICON['ip']) ? $SORTICON['ip'] : ""); ?></i><br> <a href="device?sort=ip&sortType=<?php echo $SORTTYPE; ?>">IP Address</a><i class="fa"><?php echo (!empty($SORTICON['ip']) ? $SORTICON['ip'] : ""); ?></i><br>
<a href="/device/mac/<?php echo $SORTTYPE; ?>">(Mac)</a><i class="fa"><?php echo (!empty($SORTICON['mac']) ? $SORTICON['mac'] : ""); ?></i><br> <a href="device?sort=mac&sortType=<?php echo $SORTTYPE; ?>">(Mac)</a><i class="fa"><?php echo (!empty($SORTICON['mac']) ? $SORTICON['mac'] : ""); ?></i><br>
<a href="/device/token/<?php echo $SORTTYPE; ?>">Token</a><i class="fa"><?php echo (!empty($SORTICON['token']) ? $SORTICON['token'] : ""); ?></i> <a href="device?sort=token&sortType=<?php echo $SORTTYPE; ?>">Token</a><i class="fa"><?php echo (!empty($SORTICON['token']) ? $SORTICON['token'] : ""); ?></i>
</th> </th>
<th>Action <th>Action
<form method="post" action=""> <form method="post" action="">
@ -46,7 +45,7 @@
<?php if (!empty($DEVICES)) : ?> <?php if (!empty($DEVICES)) : ?>
<?php foreach ($DEVICES as $device) : ?> <?php foreach ($DEVICES as $device) : ?>
<tr> <tr>
<td><i class="fa <?php echo (!empty($device['icon']) ? $device['icon'] : ""); ?>"></i></td> <td><i class="fa">&#x<?php echo (!empty($device['icon']) ? $device['icon'] : ""); ?></i></td>
<td> <td>
<form method="post" action=""> <form method="post" action="">
<input type="hidden" name="deviceId" value="<?php echo (!empty($device['device_id']) ? $device['device_id'] : ""); ?>"> <input type="hidden" name="deviceId" value="<?php echo (!empty($device['device_id']) ? $device['device_id'] : ""); ?>">
@ -88,12 +87,12 @@
?> ?>
<i class="fa <?php echo $icon; ?>" style="color: <?php echo $color; ?>;"></i> <i class="fa <?php echo $icon; ?>" style="color: <?php echo $color; ?>;"></i>
<?php echo $device['firmware_hash'] ?>
<button class="fa custom-file-input" type="button" onclick="document.getElementById('deviceFirmware-<?php echo $device['device_id'] ?>').click();">&#xf0ee;</button> <button class="fa custom-file-input" type="button" onclick="document.getElementById('deviceFirmware-<?php echo $device['device_id'] ?>').click();">&#xf0ee;</button>
<form style="display: none;" method="POST" action="" enctype="multipart/form-data"> <form style="display: none;" method="POST" action="" enctype="multipart/form-data">
<input type="hidden" name="deviceId" value="<?php echo (!empty($device['device_id']) ? $device['device_id'] : ""); ?>"> <input type="hidden" name="deviceId" value="<?php echo (!empty($device['device_id']) ? $device['device_id'] : ""); ?>">
<input type="file" onchange="this.form.submit();" name="deviceFirmware" id="deviceFirmware-<?php echo $device['device_id'] ?>" value=""> <input type="file" onchange="this.form.submit();" name="deviceFirmware" id="deviceFirmware-<?php echo $device['device_id'] ?>" value="">
</form> </form>
<!--<button class="fa custom-file-input" type="button" onclick="document.getElementById('deviceFirmware-<?php //echo $device['device_id'] ?>').click();">&#xf1f8;</button>-->
<?php endif; ?> <?php endif; ?>
<div type="float: clear;"></div> <div type="float: clear;"></div>
</td> </td>

View File

@ -2,9 +2,8 @@
<html lang="en"> <html lang="en">
<head> <head>
<?php <?php
$partial = new Partial('head'); $partial = new Partial('head');
$partial->prepare('baseDir', $BASEDIR); $partial->prepare('baseDir', $BASEDIR);
$partial->prepare('baseUrl', $BASEURL);
$partial->render(); $partial->render();
?> ?>
<title><?php echo $TITLE ?></title> <title><?php echo $TITLE ?></title>

View File

@ -1,7 +1,5 @@
<link rel="manifest" href="manifest.json"> <link rel="manifest" href="manifest.json">
<base href="<?php echo $BASEURL; ?>">
<meta name="mobile-web-app-capable" content="yes"> <meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<meta name="application-name" content="Home"> <meta name="application-name" content="Home">
@ -20,7 +18,6 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge"> <meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="<?php echo $BASEDIR; ?>css/main.css?v2"> <link rel="stylesheet" href="<?php echo $BASEDIR; ?>css/main.css?v2">
<link rel="stylesheet" href="<?php echo $BASEDIR; ?>css/font-awesome.min.css"> <link rel="stylesheet" href="<?php echo $BASEDIR; ?>css/font-awesome.min.css">
<link rel="stylesheet" href="<?php echo $BASEDIR; ?>css/modal.css"> <link rel="stylesheet" href="<?php echo $BASEDIR; ?>css/modal.css">

View File

@ -15,7 +15,7 @@
<input class="" type="checkbox" name="remember" value="true"/> <input class="" type="checkbox" name="remember" value="true"/>
</div> </div>
<?php if (!empty ($_SESSION['msg'])): ?> <?php if (!empty ($_SESSION['msg'])): ?>
<label class="alert"><?php echo $_SESSION['msg']; ?></label><br/><br/> <label class="message"><?php echo $_SESSION['msg']; ?></label><br/><br/>
<?php unset ($_SESSION['msg']); ?> <?php unset ($_SESSION['msg']); ?>
<?php endif; ?> <?php endif; ?>
<input type="submit" class="button" name="login" value="Login"/> <input type="submit" class="button" name="login" value="Login"/>

View File

@ -2,9 +2,8 @@
<html lang="en"> <html lang="en">
<head> <head>
<?php <?php
$partial = new Partial('head'); $partial = new Partial('head');
$partial->prepare('baseDir', $BASEDIR); $partial->prepare('baseDir', $BASEDIR);
$partial->prepare('baseUrl', $BASEURL);
$partial->render(); $partial->render();
?> ?>
<title><?php echo $TITLE ?></title> <title><?php echo $TITLE ?></title>

View File

@ -2,9 +2,8 @@
<html lang="en"> <html lang="en">
<head> <head>
<?php <?php
$partial = new Partial('head'); $partial = new Partial('head');
$partial->prepare('baseDir', $BASEDIR); $partial->prepare('baseDir', $BASEDIR);
$partial->prepare('baseUrl', $BASEURL);
$partial->render(); $partial->render();
?> ?>
<title><?php echo $TITLE ?></title> <title><?php echo $TITLE ?></title>