From 5a06a6c85a2f7a4566b605f9a2d67f59d89757b7 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 18 Feb 2020 21:30:44 +0100 Subject: [PATCH] some fix and new firmware for shelly1 --- .gitignore | 1 + .htaccess | 8 +- .../Shelly1/Shelly1_arduino_ide_setting.png | Bin 0 -> 21550 bytes .../Shelly1/Shelly1_v1/Shelly1_v1.ino | 210 ++++++++++++++++++ .../Sonoff_Basic_v3/Sonoff_Basic_v3.ino | 6 +- api.php | 4 +- app/class/FallbackManager.php | 21 +- app/class/LogManager.php | 19 ++ app/class/RecordManager.php | 2 +- app/class/Template.php | 2 +- app/controls/automation.php | 18 +- app/templates/js/script.js | 98 ++++---- app/templates/log.phtml | 1 + app/templates/part/deviceEdit.phtml | 12 +- app/views/Ajax.php | 71 ++++++ app/views/Home.php | 23 +- app/views/Log.php | 2 + make.sh | 34 +++ manifest.json | 10 +- old.home | 180 +++++++++++++++ 20 files changed, 626 insertions(+), 96 deletions(-) create mode 100644 _FIRMWARE/firmwares/Shelly1/Shelly1_arduino_ide_setting.png create mode 100644 _FIRMWARE/firmwares/Shelly1/Shelly1_v1/Shelly1_v1.ino create mode 100644 make.sh create mode 100644 old.home diff --git a/.gitignore b/.gitignore index 24ceb95..43c0f99 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .ftpconfig +.ftpconfig2 config.php _nemazat/index.html _nemazat/css/main.css.map diff --git a/.htaccess b/.htaccess index 1d7e144..a516291 100644 --- a/.htaccess +++ b/.htaccess @@ -2,7 +2,7 @@ Options -Indexes Options -MultiViews -Indexes RewriteEngine On -RewriteBase / +RewriteBase /vasek/home/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d @@ -10,8 +10,8 @@ RewriteCond %{REQUEST_FILENAME} !.css RewriteCond %{REQUEST_FILENAME} !.js RewriteRule (.*) index.php?url=$1 [QSA,L] -#RewriteCond %{HTTPS} off -#RewriteCond %{REQUEST_FILENAME} !api.php -#RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] +RewriteCond %{HTTPS} off +RewriteCond %{REQUEST_FILENAME} !api.php +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] AddType application/x-httpd-php .php .phtml diff --git a/_FIRMWARE/firmwares/Shelly1/Shelly1_arduino_ide_setting.png b/_FIRMWARE/firmwares/Shelly1/Shelly1_arduino_ide_setting.png new file mode 100644 index 0000000000000000000000000000000000000000..02beef6b5dd13ffc246a61407cdede73dda4c368 GIT binary patch literal 21550 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�_pGgHDdDEYPU2(^rRfgq<1k~EESh__NJ?hB%P#4 zYxPb8y}di3Lk$zQ&xVT#1O>h@eQlB`pR->tUc9*_8Bc@#VD#nIn^$$nraNZGat()H zQdZ?WPB?J!V{3feJ@3DjLTAX8r^mj-!I15Og?GXlI_E!x45dtrFyQh9kx z7tK$3ffMwrd9zSQ_w{*4ddd-%1)V@*Z#v_vy0rY6$5UM!@?(P}gwn&K4+yu30=;j8 zCJj%3m;?QtnELCdUT^oO6mz}(-=&!UGIIOdO990}Hj(fGY4Ga_4kmn;;R=bq>?^yp z4r-nKVs+zbW+4|$z(f8kf1X`2F}V1yZ2U4_{<6PkGh)gIo)=du>G|Ig?EIflHxI3QT zq@48)`{ZwNg;jgCvW+{V_1|7d^Lv`^%noOJKFwlCj0}=F?q*1Q+e70x5SE1RWnXuD z4Q1ssixe^_?)reB3Ew2Bzi9*w{yAW6Y`sEg)_~uvmHfw?)1FH~gC9q($G%kx$tLB5 zlLwUuQ$?r*YtUx0?ZRhPSBY{rY3`gEE6xT#o;YTXXV@H4#Us$uw=**)ypo5zK}O(N zvg%c{;~gZj%yq82S!+^8^r(FGy5In0zHLF>N|a6|a-v``{Jch*Tp)+Pw_a!jPtzcA zj&iK#kA4Tk(|9|CT_^CkcLgZ0MqB;#J?o3-lGQatMV_1tRWhs_r$Ntk$AWg1ax9Bx zZqm0(TjBPF*@eb}U5UX$Ar%LD^IFLyJAs!mY5F(7L!avIuOB?^Q%_P)uz$ZCN(zv9 z=gD&60t9W*YxYLqGwQOCoKNJS(>L=loO5m{-P0w|9&up2E6`uI|C8zc-wufXadCjY z?Yi8+^eNhlsCH2&2;7{J8sSS(jdySM6gtB7Njgvq>FOSI=Ik8DoyIK5ngQ+Tyk#gq(loEBl%@^;}^NMp=rgbhrn02Iii!JA-}+glUrHtB2Wk#t!oG@lO$r-$F= zFZ=h|&XVd(ycrK>E|EioO4J>vOw&Dl60_Iox@B@*wOkTBwk9<|$n8*DDM)d*l{6j6 z5GUTO@st3>rn(58@SP-8vM`rqhd~#oN~$l*aSP zYMsp@!zj&Dib~aSBUTb*lL|OCTBOt!G*>?IlijgitO?+v{xX!_v_(@RhB4FY(IR9q z_QVp>N~EKGesUXFQQd`$gEhJdKyC(4JbiWxxacXd*+!1)FuM>~qrC4G`{T)* zrHvG7mSBUD{9l6Z%h|8&r6gDCJIV+^{D6*$a95+jtD+Vf;deu}3LynLdxv z2WEY8{aRk(9@~!`Hcl7>;aBd-0c<{d%nIpO8+T9};JCpBJ5rFW?l+fO4QM>JRZXj! zh}j4uXGx;(VUfLS%MjU`9(->(32_5P5)VjRue%3&yL~s0x;q302^*StrjJS>E>V2M zpe2?DN8DGw8|A_P1_-2u8hT#*&@{0I60E;J^rDy)v{(FB|9<7*HwExpDi506?~%XS b|3yUS8AUFaS=9=7e1g +#include +#include +#include + +//Variables +const char* ssid = "Smart-Home"; +const char* pasw = "S1pjg3684dcCPTUQ"; +const char* hwId = "55f4g8d6ggh"; +const char* server = "http://dev.steelants.cz/vasek/home/api.php"; +int unsuccessfulRounds = 0; //Unsucesful atmpt counter +StaticJsonDocument<250> jsonContent; +bool buttonActive = false; +int interuptCount = 0; +int realState = 1; +int state = 0; +String requestJson = ""; + +//Pins +#define RELAY 4 //12 +#define SWITCH 5 //0 + +void ICACHE_RAM_ATTR handleInterrupt (); + +void setup() { + Serial.begin(9600); + EEPROM.begin(1); + while (!Serial) continue; + delay(10); + Serial.println('\n'); + Serial.println("HW: " + String(hwId)); + + pinMode(SWITCH, INPUT); + pinMode(RELAY, OUTPUT); + state = EEPROM.read(0); + digitalWrite(RELAY, state); + realState = state; + + attachInterrupt(digitalPinToInterrupt(SWITCH), handleInterrupt, CHANGE); + + + WiFi.persistent(false); + WiFi.mode(WIFI_STA); + + WiFi.begin(ssid, pasw); + checkConnection(); + + Serial.println('\n'); + Serial.println("Connection established!"); + Serial.print("IP address:"); + Serial.println(WiFi.localIP()); + Serial.print("MAC address:"); + Serial.println(WiFi.macAddress()); + + jsonContent = {}; + jsonContent["token"] = hwId; + jsonContent["values"]["on/off"]["value"] = (String)realState; + + serializeJson(jsonContent, requestJson); + Serial.println("JSON: " + requestJson); + DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson)); +} + +void loop() { + if(unsuccessfulRounds >= 5) { + Serial.println("RESTARTING ESP"); + ESP.restart(); + } + jsonContent = {}; + jsonContent["token"] = hwId; + requestJson = ""; + if (buttonActive){ + int realStateLocal = digitalRead(SWITCH); + jsonContent["values"]["on/off"]["value"] = (String)realStateLocal; + digitalWrite(RELAY, realStateLocal); + realState = realStateLocal; + EEPROM.write(0, realState); + EEPROM.commit(); + serializeJson(jsonContent, requestJson); + Serial.println("JSON: " + requestJson); + + //HTTP CLIENT + DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson)); + buttonActive = false; + } + jsonContent = {}; + jsonContent["token"] = hwId; + requestJson = ""; + serializeJson(jsonContent, requestJson); + Serial.println("JSON: " + requestJson); + + //HTTP CLIENT + DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson)); + + if (error) { + Serial.println(error.c_str()); + unsuccessfulRounds++; + Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5"); + return; + } + //configuration setup + String hostName = jsonContent["device"]["hostname"]; + String ipAddress = jsonContent["device"]["ipAddress"]; + String gateway = jsonContent["device"]["gateway"]; + String subnet = jsonContent["device"]["subnet"]; + String requestState = jsonContent["state"]; + JsonObject object = jsonContent.as(); + if (!object["value"].isNull()) { + state = (int)jsonContent["value"]; + } + + if (requestState != "succes") { + unsuccessfulRounds++; + Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5"); + } else if (requestState == "succes") { + unsuccessfulRounds = 0; + } + + //Set static ip + setStaticIp(ipAddress, gateway, subnet); + WiFi.hostname(hostName); + Serial.println("state: " + (String)state + ", realState: " + (String)realState); + if (state != realState){ + if (state == 1 && realState == 0) { + Serial.println("ON state: " + (String)state + ", realState: " + (String)realState); + digitalWrite(RELAY, HIGH); // Turn the LED on by making the voltage LOW + realState = 1; + } else { + Serial.println("OFF"); + digitalWrite(RELAY, LOW); // Turn the LED on by making the voltage LOW + realState = 0; + } + EEPROM.write(0, realState); + EEPROM.commit(); + } +} + +void handleInterrupt() { + interuptCount++; + buttonActive = true; +} + +String sendHttpRequest (String requestJson) { + HTTPClient http; + http.setReuse(true); + http.begin(server); + http.addHeader("Content-Type", "text/plain"); //Specify content-type header + + int httpCode = http.POST(requestJson); + String payload = http.getString(); //Get the response payload + http.end(); + + Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code + Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload + + if (httpCode == -1) { + unsuccessfulRounds++; + Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5"); + return ""; + } + return payload; +} + +bool checkConnection() { + int count = 0; + Serial.print("Waiting for Wi-Fi connection"); + while ( count < 30 ) { + if (buttonActive){ + if (!realState == 1) { + digitalWrite(RELAY, HIGH); + realState = 1; + } else if (!realState == 0){ + digitalWrite(RELAY, LOW); + realState = 0; + } + EEPROM.write(0, realState); + EEPROM.commit(); + buttonActive = false; + } + delay(250); + if (WiFi.status() == WL_CONNECTED) { + Serial.println(); + Serial.println("Connected!"); + return (true); + } + Serial.print("."); + count++; + } + Serial.println("Timed out."); + return false; +} + +void setStaticIp(String ipAddress, String subnet, String gateway){ + //Set static ip + IPAddress staticIpAddress; + IPAddress subnetIpAddress; + IPAddress gatewayIpAddress; + + if ( + staticIpAddress.fromString(ipAddress) && + subnetIpAddress.fromString(subnet) && + gatewayIpAddress.fromString(gateway) && + WiFi.localIP() != staticIpAddress + ) { + WiFi.config(staticIpAddress, subnetIpAddress, gatewayIpAddress); + Serial.print("STATIC IP address:"); + Serial.println(WiFi.localIP()); + } +} diff --git a/_FIRMWARE/firmwares/Sonoff_Basic/Sonoff_Basic_v3/Sonoff_Basic_v3.ino b/_FIRMWARE/firmwares/Sonoff_Basic/Sonoff_Basic_v3/Sonoff_Basic_v3.ino index e0ee21d..c9de47f 100644 --- a/_FIRMWARE/firmwares/Sonoff_Basic/Sonoff_Basic_v3/Sonoff_Basic_v3.ino +++ b/_FIRMWARE/firmwares/Sonoff_Basic/Sonoff_Basic_v3/Sonoff_Basic_v3.ino @@ -5,9 +5,9 @@ #include //Variables -const char* ssid = "ssid"; -const char* pasw = "pasw"; -const char* hwId = "hwId"; +const char* ssid = "Smart-Home"; +const char* pasw = "S1pjg3684dcCPTUQ"; +const char* hwId = "452r5s8dad"; const char* server = "http://dev.steelants.cz/vasek/home/api.php"; int unsuccessfulRounds = 0; //Unsucesful atmpt counter StaticJsonDocument<250> jsonContent; diff --git a/api.php b/api.php index 4b682b5..ebc6f6e 100644 --- a/api.php +++ b/api.php @@ -38,6 +38,7 @@ Db::connect (DBHOST, DBUSER, DBPASS, DBNAME); //Read API data $json = file_get_contents('php://input'); $obj = json_decode($json, true); +$logManager->write("[API] Rest API request body -> decodet to json \n" . json_encode($obj, JSON_PRETTY_PRINT), LogRecordType::INFO); //zabespecit proti Ddosu if (isset($obj['user']) && $obj['user'] != ''){ @@ -69,9 +70,10 @@ if (DEBUGMOD != 1) { //automationExecution try { + AutomationManager::executeAll(); $fallbackManager = new FallbackManager(RANGES); $fallbackManager->check(); - AutomationManager::executeAll(); + //LogKeeper::purge(LOGTIMOUT); } catch (\Exception $e) { $logManager->write("[Automation] Something happen during automation execution", LogRecordType::ERROR); } diff --git a/app/class/FallbackManager.php b/app/class/FallbackManager.php index a775074..cb3fb79 100644 --- a/app/class/FallbackManager.php +++ b/app/class/FallbackManager.php @@ -2,6 +2,9 @@ /** * */ + + + class FallbackManager { public $deviceDefinitions = ""; @@ -13,7 +16,7 @@ class FallbackManager function check(){ //TODO: FIX IT - /*$allDevicesData = DeviceManager::getAllDevices(); + $allDevicesData = DeviceManager::getAllDevices(); foreach ($allDevicesData as $deviceKey => $deviceValue) { $allSubDevicesData = SubDeviceManager::getAllSubDevices($deviceValue['device_id']); foreach ($allSubDevicesData as $subDeviceKey => $subDeviceValue) { @@ -21,13 +24,21 @@ class FallbackManager continue; } + if (!isset($this->deviceDefinitions[$subDeviceValue['type']]["fallBackTime"])) { + continue; + } + $lastRecord = RecordManager::getLastRecord($subDeviceValue['subdevice_id']); - $minutes = (time() - $lastRecord['time']) / 60; - echo $minutes; - if ( $minutes > 2){ + if ($lastRecord["value"] == $this->deviceDefinitions[$subDeviceValue['type']]["fallBack"]) { + continue; + } + + $minutes = (time() - strtotime($lastRecord['time'])) / 60; + + if ( $minutes > $this->deviceDefinitions[$subDeviceValue['type']]["fallBackTime"]){ RecordManager::create($deviceValue['device_id'], $subDeviceValue['type'], $this->deviceDefinitions[$subDeviceValue['type']]["fallBack"]); } } - }*/ + } } } diff --git a/app/class/LogManager.php b/app/class/LogManager.php index 5d2d984..95f82f4 100644 --- a/app/class/LogManager.php +++ b/app/class/LogManager.php @@ -9,6 +9,25 @@ class LogRecordType{ const INFO = 'info'; } +class LogKeeper +{ + function purge($days){ + $todayFileName = date("Y-m-d").'.log'; + $seconds = $days * 86400; + + $logFiles = scandir('./app/logs/'); + foreach ($logFiles as $key => $file) { + if (in_array($file,array(".","..", ".gitkeep", $todayFileName))) + { + continue; + } + if (filemtime($file) > $seconds) { + unlink('./app/logs/'.$file); + } + } + } +} + class LogManager { diff --git a/app/class/RecordManager.php b/app/class/RecordManager.php index e98eda6..22682f9 100644 --- a/app/class/RecordManager.php +++ b/app/class/RecordManager.php @@ -67,7 +67,7 @@ class RecordManager{ public static function clean ($day) { if (isset($day)) { - Db::command ('DELETE FROM records WHERE time < ADDDATE(NOW(), INTERVAL -? DAY);', array($day)); + Db::command ('DELETE FROM records WHERE `time` < ADDDATE(NOW(), INTERVAL -? DAY);', array($day)); } } diff --git a/app/class/Template.php b/app/class/Template.php index 4d99dab..0ebafb7 100644 --- a/app/class/Template.php +++ b/app/class/Template.php @@ -27,7 +27,7 @@ class Template extends Partial{ function render() { extract($this->assignedValues); if (!empty('app/controls/' . $this->path . '.php') && file_exists('app/controls/' . $this->path . '.php')) { - require_once('app/controls/' . $this->path . '.php'); + include('app/controls/' . $this->path . '.php'); } require_once('app/templates/' . $this->path . '.phtml'); } diff --git a/app/controls/automation.php b/app/controls/automation.php index 3fe2ac9..446f9c2 100644 --- a/app/controls/automation.php +++ b/app/controls/automation.php @@ -9,15 +9,15 @@ if (isset($_POST) && !empty($_POST)){ $onDays = $_POST['atDays']; //Debug - if (DEBUGMOD == 1) { - echo '
';
-			echo $permissionsInJson;
-			echo $deviceId;
-			var_dump(json_decode ($permissionsInJson));
-			echo '
'; - echo 'CONTINUE'; - die(); - } + // if (DEBUGMOD == 1) { + // echo '
';
+		// 	echo $permissionsInJson;
+		// 	echo $deviceId;
+		// 	var_dump(json_decode ($permissionsInJson));
+		// 	echo '
'; + // echo 'CONTINUE'; + // die(); + // } AutomationManager::create($_POST['name'], $onDays, $doCode, $ifCode); diff --git a/app/templates/js/script.js b/app/templates/js/script.js index 335dacb..3df7ca2 100644 --- a/app/templates/js/script.js +++ b/app/templates/js/script.js @@ -64,16 +64,16 @@ if ('serviceWorker' in navigator) { $('select[name="atSelector"]').change(function(e) { console.log($(this).val()); if( $(this).val() == 'time') { - + $('input[name="atTime"]').prop( "disabled", false ); - + $('select[name="atDeviceValueInt"]').prop( "disabled", true ); $('input[name="atDeviceValue"]').prop( "disabled", true ); } else if( $(this).val() == 'atDeviceValue') { - + $('select[name="atDeviceValue"]').prop( "disabled", false ); $('input[name="atDeviceValueInt"]').prop( "disabled", false ); - + $('input[name="atTime"]').prop( "disabled", true ); } }); @@ -88,7 +88,7 @@ $("div.square-content").on('touchend', function (e){ $("div.square-content").on('touchstart', function (eTarget) { navigator.vibrate([500]); var id = ''; - + var windowLoc = $(location).attr('pathname'); windowLoc = windowLoc.substring(windowLoc.lastIndexOf("/")); console.log(windowLoc); @@ -99,9 +99,9 @@ $("div.square-content").on('touchstart', function (eTarget) { } else if (windowLoc == "/automation") { id = $(this).attr('id').replace('automation-', ''); } - + var subId = $(this).attr('data-sub-device-id'); - + touch++; if(touch == 2 && touchSubId == subId){ console.log("Detail"); @@ -109,7 +109,7 @@ $("div.square-content").on('touchstart', function (eTarget) { $("#modal-detail-"+subId).removeClass('modal-container-hiden').show(); ajaxChart(subId); } else if (windowLoc == "/scene") { - + } else if (windowLoc == "/automation") { } touch = 0; @@ -117,7 +117,7 @@ $("div.square-content").on('touchstart', function (eTarget) { return; } touchSubId = subId; - + pressTimer = window.setTimeout(function (e) { console.log("Setting"); $("#modal-setting-"+id).removeClass('modal-container-hiden').show(); @@ -202,14 +202,14 @@ var windowLoc = $(location).attr('pathname'); windowLoc = windowLoc.substring(windowLoc.lastIndexOf("/")); console.log(); if (windowLoc == "/") { - + var selectRoomId = localStorage.getItem("selectedRoomId"); - + if (selectRoomId == null) { selectRoomId = 'all'; } - - + + console.log('Saved Selected Room ID '+ selectRoomId); $('[name="room"]').val(selectRoomId); $('.device-button').each(function(){ @@ -221,8 +221,8 @@ if (windowLoc == "/") { } } }); - - + + } //Room selector @@ -239,51 +239,55 @@ $( '[name="room"]' ).change(function (e) { }); } }); + + /* var windowLoc = $(location).attr('pathname'); windowLoc = windowLoc.substring(windowLoc.lastIndexOf("/")); console.log(); if (windowLoc == "/") { -var autoUpdate = setInterval(function(){ -if (pending == false) { -pending = true; -$.ajax({ -url: 'ajax', -type: 'POST', -dataType: 'json', -data: { -"action": 'getState' -}, -success: function(data){ -console.log(data); -for (const key in data) { -if (data.hasOwnProperty(key)) { -const device = data[key]; -$('[data-sub-device-id="'+key+'"]') -.find('.device-button-value') -.text(device['value']) -.attr('title',device['time']) -} -} -}, -error: function (request, status, error) { -console.log("ERROR ajaxChart():", request, error); -}, -complete: function (){ -pending = false; -} -}); -} -},4000); + var autoUpdate = setInterval(function(){ + if (pending == false) { + pending = true; + $.ajax({ + url: 'ajax', + type: 'POST', + dataType: 'json', + data: { + "action": 'getState' + }, + success: function(data){ + console.log(data); + for (const key in data) { + if (data.hasOwnProperty(key)) { + const device = data[key]; + $('[data-sub-device-id="'+key+'"]') + .find('.device-button-value') + .text(device['value']) + .attr('title',device['time']) + } + } + }, + error: function (request, status, error) { + console.log("ERROR ajaxChart():", request, error); + }, + complete: function (){ + pending = false; + } + }); + } + },4000); }*/ + + //Graphs $('.graph-period').on('click', function (e) { var subId = $(this).attr('data-sub-device-id'); var period = $(this).attr('data-period'); var groupBy = $(this).attr('data-group'); - + ajaxChart(subId, period, groupBy); }); diff --git a/app/templates/log.phtml b/app/templates/log.phtml index c747c83..97b11b5 100644 --- a/app/templates/log.phtml +++ b/app/templates/log.phtml @@ -22,6 +22,7 @@
+
/>echo('l_use'); ?> />echo('l_edit'); ?> - +
@@ -156,10 +156,10 @@
- + - - + +
diff --git a/app/views/Ajax.php b/app/views/Ajax.php index 1a97418..7276de2 100644 --- a/app/views/Ajax.php +++ b/app/views/Ajax.php @@ -145,6 +145,77 @@ class Ajax extends Template echo 'no action detected'; break; } + } else if ( + isset($_POST['action']) && + $_POST['action'] != '' + ) { + $updateData = []; + $allDevicesData = DeviceManager::getAllDevices(); + foreach ($allDevicesData as $deviceKey => $deviceValue) { + $allSubDevices = SubDeviceManager::getAllSubDevices($deviceValue['device_id']); + foreach ($allSubDevices as $key => $subDevicesData) { + + $lastRecord = RecordManager::getLastRecord($subDevicesData['subdevice_id']); + $parsedValue = $lastRecord['value'] . $subDevicesData['unit']; + + //TODO: udělat parser a ten použít jak v houmu tak zde + switch ($subDevicesData['type']) { + case 'on/off': + $replacementTrue = 'On'; + $replacementFalse = 'Off'; + $operator = '=='; + $breakValue = 1; + break; + + case 'door': + $replacementTrue = 'Closed'; + $replacementFalse = 'Open'; + $operator = '=='; + $breakValue = 1; + break; + + case 'light': + $replacementTrue = 'Light'; + $replacementFalse = 'Dark'; + $operator = '=='; + $breakValue = 1; + if ($lastRecord['value'] != 1 && $lastRecord['value'] != 0) { //Digital Light Senzor + $operator = '<'; + $breakValue = 810; + } + break; + + case 'water': + $replacementTrue = 'Wet'; + $replacementFalse = 'Dry'; + $operator = '=='; + $breakValue = 1; + break; + + default: + $replacementTrue = ''; + $replacementFalse = ''; + break; + } + + if ($replacementTrue != '' && $replacementFalse != '') { + //parsing last values + $parsedValue = $replacementFalse; + + if (Utilities::checkOperator($lastRecord['value'], $operator, $breakValue)) { + $parsedValue = $replacementTrue; + } + } + + $updateData[$subDevicesData['subdevice_id']] = [ + 'time' => $lastRecord['time'], + 'value' => $parsedValue, + ]; + } + } + + //TODO: PRO JS VRACET DATA + echo json_encode($updateData, JSON_PRETTY_PRINT); } } } diff --git a/app/views/Home.php b/app/views/Home.php index cee57d4..b9b2f4d 100644 --- a/app/views/Home.php +++ b/app/views/Home.php @@ -7,11 +7,6 @@ class Home extends Template { global $userManager; global $langMng; - $roomManager = new RoomManager(); - $deviceManager = new DeviceManager(); - $subDeviceManager = new SubDeviceManager(); - $recordManager = new RecordManager(); - $utilities = new Utilities(); if (!$userManager->isLogin()){ header('Location: ' . BASEDIR . 'login'); @@ -20,7 +15,7 @@ class Home extends Template $template = new Template('home'); //users instantialize - $users = $userManager->getUsers(); + $users = UserManager::getUsers(); $template->prepare('users', $users); //Users at home Info @@ -39,16 +34,16 @@ class Home extends Template $roomsItems = []; - $roomsData = $roomManager->getAllRooms(); + $roomsData = RoomManager::getAllRooms(); foreach ($roomsData as $roomKey => $roomsData) { $devices = []; - $devicesData = $deviceManager->getAllDevicesInRoom($roomsData['room_id']); + $devicesData = DeviceManager::getAllDevicesInRoom($roomsData['room_id']); foreach ($devicesData as $deviceKey => $deviceData) { $subDevices = []; - $subDevicesData = $subDeviceManager->getAllSubDevices($deviceData['device_id']); + $subDevicesData = SubDeviceManager::getAllSubDevices($deviceData['device_id']); foreach ($subDevicesData as $subDeviceKey => $subDeviceData) { - $events = $recordManager->getLastRecord($subDeviceData['subdevice_id'], 5); + $events = RecordManager::getLastRecord($subDeviceData['subdevice_id'], 5); $eventsRaw = $events; $connectionError = true; @@ -105,7 +100,7 @@ class Home extends Template //parsing last values $parsedValue = $replacementFalse; - if ($utilities->checkOperator($lastValue, $operator, $breakValue)) { + if (Utilities::checkOperator($lastValue, $operator, $breakValue)) { $parsedValue = $replacementTrue; } @@ -113,14 +108,14 @@ class Home extends Template //parsing last events values foreach ($events as $key => $value) { $events[$key]['value'] = $replacementFalse; - if ($utilities->checkOperator($value['value'], $operator, $breakValue)) { + if (Utilities::checkOperator($value['value'], $operator, $breakValue)) { $events[$key]['value'] = $replacementTrue; } } } $LastRecordTime = new DateTime($lastRecord['time']); - $niceTime = $utilities->ago($LastRecordTime); + $niceTime = Utilities::ago($LastRecordTime); $interval = $LastRecordTime->diff(new DateTime()); $hours = $interval->format('%h'); @@ -180,7 +175,7 @@ class Home extends Template ]; } - $rooms = $roomManager->getAllRooms(); + $rooms = RoomManager::getAllRooms(); $template->prepare('baseDir', BASEDIR); $template->prepare('debugMod', DEBUGMOD); $template->prepare('title', 'Home'); diff --git a/app/views/Log.php b/app/views/Log.php index 3e80f29..fae038a 100644 --- a/app/views/Log.php +++ b/app/views/Log.php @@ -26,6 +26,8 @@ class Log extends Template } $template->prepare('baseDir', BASEDIR); + $template->prepare('debugMod', DEBUGMOD); + $template->prepare('logToLiveTime', LOGTIMOUT); $template->prepare('title', 'Logy'); $template->prepare('logsFiles', $result); $template->prepare('langMng', $langMng); diff --git a/make.sh b/make.sh new file mode 100644 index 0000000..94978ba --- /dev/null +++ b/make.sh @@ -0,0 +1,34 @@ +#! /bin/sh +apt install dialog; + +#dialog --stdout --title "Smart-Home" \ + #--backtitle "Select update chanel :)" \ + #--yesno "DEV: Experimental Version, STABLE: Stable version" 7 60 +#dialog_status=$? + +# Do something +dialog --menu "The best tortilla is:" 0 0 0 1 "with onions" 2 "without onion" 3 "with piminetos" +echo "answer $?"; +#if [ "$dialo_status" -eq 'DEV' ]; then + # The previous dialog was answered Yes + #git checkout dev; +#else + # The previous dialog was answered No or interrupted with + #git checkout master; +#fi + +#clear; + +#git reset --hard HEAD +#git pull + +#rm ./.gitignore +#rm ./.ftpignore +#rm ./.todo +#rm ./LICENCE +#rm ./README.md +#rm -rf ./_FIRMWARE/* +#rm -rf ./_INSTALATION/* +#rm -rf ./_README_IMG/* + +echo "Done"; diff --git a/manifest.json b/manifest.json index 5aa8274..16775df 100644 --- a/manifest.json +++ b/manifest.json @@ -3,20 +3,20 @@ "short_name": "Home", "description": "Smart Home interface in PWA", "lang": "cs-CZ", - "start_url": "/", - "scope": "/", + "start_url": "/vasek/home/", + "scope": "/vasek/home/", "display": "fullscreen", "orientation": "portrait", "theme_color": "#182239", "icons": [ { - "src": "/app/templates/images/icon-192x192.png", + "src": "/vasek/home/app/templates/images/icon-192x192.png", "sizes": "192x192" }, { - "src": "/app/templates/images/icon-512x512.png", + "src": "/vasek/home/app/templates/images/icon-512x512.png", "sizes": "512x512" } ], "background_color": "#182239" -} +} \ No newline at end of file diff --git a/old.home b/old.home new file mode 100644 index 0000000..6da48ed --- /dev/null +++ b/old.home @@ -0,0 +1,180 @@ +