Compare commits
	
		
			241 Commits
		
	
	
		
			master
			...
			4b94ef29c1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 4b94ef29c1 | ||
|  | 8a00190850 | ||
|  | 38cc436f4d | ||
|  | fef8cb2ed9 | ||
|  | f205df36ff | ||
|  | c448f72095 | ||
|  | 9969d3ca91 | ||
|  | 1e9395f9e7 | ||
|  | 0c3d14754f | ||
|  | 2117e9acac | ||
|  | 6689b4285e | ||
|  | eba00c2744 | ||
|  | 95c8e54199 | ||
|  | 7533facf07 | ||
|  | e2c16072b9 | ||
|  | c7e18d6959 | ||
|  | ea00f7a295 | ||
|  | e9dace53e0 | ||
|  | 64ccd91469 | ||
|  | 513b13dcb8 | ||
|  | 6b08b2785f | ||
|  | e2c9c31d2f | ||
|  | 13ae5401f7 | ||
|  | 31fb9dad37 | ||
|  | ab92a58289 | ||
|  | 946a93a23b | ||
|  | 1a3e659ca7 | ||
|  | 5d998da30a | ||
|  | 2cbf6fbb23 | ||
|  | f4a5beeb7b | ||
|  | 24b0048f57 | ||
|  | 2871dd49dd | ||
|  | a3a482c652 | ||
|  | 0b954b79c0 | ||
|  | ce05533d29 | ||
|  | 9dfaeb554d | ||
|  | 6b7bd911f7 | ||
|  | 740a2debf7 | ||
|  | 5d32c2bfa4 | ||
|  | c410df1bd6 | ||
|  | 3aab42d081 | ||
|  | dffaf8eb2e | ||
|  | 3047ead205 | ||
|  | e39b6655e3 | ||
|  | b5d7904a61 | ||
|  | e3b7e866f0 | ||
|  | 94d6576070 | ||
|  | 51f7ce9dbd | ||
|  | a70caca58d | ||
|  | 81dcc9da5b | ||
|  | c75c67d420 | ||
| 20469c65db | |||
| aafd5539c4 | |||
| 30da6e162b | |||
|  | cc804f36df | ||
|  | ed732e125a | ||
|  | 2c6e7e2ecc | ||
| 32521d0ed3 | |||
| 6945d58eb6 | |||
| 50e161e1ce | |||
| 366f1c4db4 | |||
| b0514c1f3a | |||
|  | ca5b221bc1 | ||
|  | fc3d3d5930 | ||
|  | 77d6e795d6 | ||
|  | 3c456caeca | ||
|  | 5647bb21a7 | ||
| 960859087a | |||
|  | 8e33d226cd | ||
|  | 9b9b67d01e | ||
|  | 50bd53561e | ||
|  | 6b0ab2d0ba | ||
| 0efbda0583 | |||
| 7f42d49634 | |||
| a6cb51f2f5 | |||
| b174022f9a | |||
| d404afe501 | |||
| ceca8fc057 | |||
| 7df378d794 | |||
| 98c603494d | |||
| 27c306cba7 | |||
| 70ef954b64 | |||
|  | 6d44750804 | ||
|  | 49d24f8e0e | ||
| 5ee1af2571 | |||
| 2185c62472 | |||
|  | bde466a5bd | ||
| 3d68df2658 | |||
| 880b01882a | |||
| 727ed03be7 | |||
| 0323323bb1 | |||
| fa10200bde | |||
| 03cc627b72 | |||
| 3665d0afd9 | |||
| be09f00b95 | |||
| 4b20c5fd0d | |||
| 5ba86edb69 | |||
| 67cc103db5 | |||
| 1a448663f0 | |||
| 1a27993a94 | |||
|  | 82e5248658 | ||
|  | eba5301906 | ||
| 8a6185e329 | |||
| d013788249 | |||
| 14a33b83d0 | |||
| 05bd0dbc64 | |||
|  | d1b4597720 | ||
| dbbf42bc0d | |||
| 1996b08311 | |||
|  | 275aa97688 | ||
|  | 8ed3ab2f39 | ||
|  | 7f5d348d07 | ||
|  | 5f95548b92 | ||
|  | 7a3beea274 | ||
|  | 61a1b5057c | ||
|  | cdcddffc69 | ||
|  | 3669fde596 | ||
|  | a1358c53fd | ||
|  | 78c29482a6 | ||
|  | 7954ae49b9 | ||
|  | 2ddb2750ab | ||
|  | 4c3aaa40bc | ||
|  | fc8891425d | ||
|  | 348f8ab57d | ||
|  | b0650e7fbe | ||
|  | dcc7592c4f | ||
|  | cb6ab3bdda | ||
|  | 41916a90bd | ||
|  | da975598c5 | ||
|  | 35279a2b51 | ||
|  | 804a5d1212 | ||
|  | aef5b5116d | ||
|  | ae0d5b86ad | ||
|  | c961bc2c88 | ||
|  | 254a2cf97a | ||
|  | e7858ac4a3 | ||
|  | 0b9f7486df | ||
|  | 97408d31e9 | ||
|  | b2474fbdfb | ||
|  | 0543f74977 | ||
|  | c3f11a4c66 | ||
|  | 0929870cc9 | ||
|  | b036adf206 | ||
|  | 4fbbf5acbf | ||
|  | b8b81626e8 | ||
|  | 7af1eda141 | ||
|  | dc50d5d4d6 | ||
|  | e4d93c7add | ||
|  | 6a20e9c684 | ||
|  | 2c5d861011 | ||
|  | 778e862b97 | ||
|  | 862fc29bde | ||
|  | fef3c1e57f | ||
|  | 1af11f3f58 | ||
|  | cb8bd40a7e | ||
|  | 87c719e9e6 | ||
|  | 090b9f7a7b | ||
|  | 2f638d8091 | ||
|  | 619386d391 | ||
|  | ded8a698f0 | ||
|  | c3d8a211ed | ||
|  | 02ba4e5d6f | ||
|  | d7a5d35f54 | ||
|  | 135338041a | ||
|  | cd895d3bcc | ||
|  | 3d541999a1 | ||
|  | 1070d8036c | ||
|  | 26dab209bd | ||
|  | 22e680e1d8 | ||
|  | 9961016683 | ||
|  | c2203b452a | ||
|  | 3981d9551d | ||
|  | 6458e89dea | ||
|  | 63e7c95415 | ||
|  | 8d2af9181a | ||
|  | 13678630f2 | ||
|  | 27d2c4fa18 | ||
|  | 6383034de1 | ||
|  | 8f13c7ee5d | ||
|  | 4113296f86 | ||
|  | c74f93890d | ||
|  | 043cac1cba | ||
|  | 23aa83ec9a | ||
|  | 8b39b727e1 | ||
|  | f588a293ed | ||
|  | 56891bda09 | ||
|  | a1cfb21a81 | ||
|  | c774ad90c2 | ||
|  | e0bbc09389 | ||
|  | a3d911d3ec | ||
|  | 2560800efb | ||
|  | 57501e2847 | ||
|  | 8fd7fe8329 | ||
|  | e75de72afd | ||
|  | d137d08ff4 | ||
|  | 09ad9c9eba | ||
|  | 11e75cb18d | ||
|  | e4f37f7686 | ||
|  | 119149bf5e | ||
|  | 8300e47b76 | ||
|  | 0f51826d3f | ||
|  | abff057943 | ||
|  | 79016fed87 | ||
|  | fe787163d0 | ||
|  | 5519d46ca2 | ||
|  | b4cfffc432 | ||
|  | 84127bf7ab | ||
|  | 34ee711182 | ||
|  | cdcc63a81a | ||
|  | bc0816e812 | ||
|  | 3dbec89f7b | ||
|  | 9367564bfe | ||
|  | 048b9440e1 | ||
|  | a6453cf393 | ||
|  | 386e7be130 | ||
|  | e8b2ad8599 | ||
|  | 7548f409f2 | ||
|  | a13c30a5c3 | ||
|  | b326596e16 | ||
|  | ee65ea43c4 | ||
|  | 0f49fd951a | ||
|  | ba836c9573 | ||
|  | 1e6fe2a00e | ||
|  | bc76082860 | ||
|  | 85b10e1098 | ||
|  | c520cf847c | ||
|  | 8c96a6021a | ||
|  | bfebe6b534 | ||
|  | 216db28e60 | ||
|  | e76d2bc5e5 | ||
|  | d51820b198 | ||
|  | c58804ad12 | ||
|  | 06fdc71ca2 | ||
|  | bc9e9e16e7 | ||
|  | bc6acb470a | ||
|  | 15dfc8464d | ||
|  | 36690e6899 | ||
|  | 79b79bdfa5 | ||
|  | 44c4a122f7 | ||
|  | 28490f5d67 | ||
|  | 74c6426500 | 
							
								
								
									
										1
									
								
								.docker
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								.docker
									
									
									
									
									
										Submodule
									
								
							 Submodule .docker added at 0ee345e496
									
								
							| @@ -3,29 +3,16 @@ | |||||||
| root = true | root = true | ||||||
|  |  | ||||||
| [*] | [*] | ||||||
| tab_width                = 4 | indent_style = tab | ||||||
|  | indent_size = 3 | ||||||
| [*.{php,phpt,inc}] | end_of_line = lf | ||||||
| charset                  = utf-8 | charset = utf-8 | ||||||
| end_of_line              = lf |  | ||||||
| indent_size              = 2 |  | ||||||
| indent_style             = tab |  | ||||||
| trim_trailing_whitespace = true | trim_trailing_whitespace = true | ||||||
| insert_final_newline     = true | insert_final_newline = true | ||||||
|  |  | ||||||
| [*.md] | [*.md] | ||||||
| charset                  = utf-8 |  | ||||||
| end_of_line              = lf |  | ||||||
| indent_style             = tab |  | ||||||
| trim_trailing_whitespace = true |  | ||||||
| insert_final_newline     = true |  | ||||||
| max_line_length          = 80 | max_line_length          = 80 | ||||||
|  |  | ||||||
| [COMMIT_EDITMSG] | [COMMIT_EDITMSG] | ||||||
| charset                  = utf-8 |  | ||||||
| end_of_line              = lf |  | ||||||
| indent_size              = 4 | indent_size              = 4 | ||||||
| indent_style             = tab |  | ||||||
| trim_trailing_whitespace = true |  | ||||||
| insert_final_newline     = true |  | ||||||
| max_line_length          = 80 | max_line_length          = 80 | ||||||
							
								
								
									
										10
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,13 +1,17 @@ | |||||||
|  |  | ||||||
| .ftpconfig | .ftpconfig | ||||||
| .ftpconfig2 | .ftpconfig2 | ||||||
|  | *.log | ||||||
| config.php | config.php | ||||||
|  |  | ||||||
| _nemazat/index.html | _nemazat/index.html | ||||||
| _nemazat/css/main.css.map | _nemazat/css/main.css.map | ||||||
| _nemazat/css/main.css | _nemazat/css/main.css | ||||||
| _nemazat/css/font-awesome.min.css | _nemazat/css/font-awesome.min.css | ||||||
| app/logs/*.log |  | ||||||
| .vscode/ | .vscode/ | ||||||
| .vscode/sftp.json | .vscode/sftp.json | ||||||
| app/updater/*.bin |  | ||||||
| logs/* |  | ||||||
|  |  | ||||||
|  | app/updater/*.bin | ||||||
|  | app/logs/*.log | ||||||
|  | backup/*.zip | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								.htaccess
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								.htaccess
									
									
									
									
									
								
							| @@ -1,18 +1,22 @@ | |||||||
| Options -Indexes |  | ||||||
| Options -MultiViews -Indexes |  | ||||||
|  |  | ||||||
| RewriteEngine On | RewriteEngine On | ||||||
| RewriteBase /vasek/home/ |  | ||||||
|  |  | ||||||
| RewriteCond %{REQUEST_FILENAME} !-f | # require https | ||||||
| RewriteCond %{REQUEST_FILENAME} !-d | #RewriteCond %{HTTPS} off | ||||||
| RewriteCond %{REQUEST_FILENAME} !.css | #RewriteCond %{REQUEST_URI} !^/api/update | ||||||
| RewriteCond %{REQUEST_FILENAME} !.js | #RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] | ||||||
| RewriteRule (.*) index.php?url=$1 [QSA,L] |  | ||||||
|  |  | ||||||
| RewriteCond %{HTTPS} off | #token to HTTP_AUTHORIZATION | ||||||
| RewriteCond %{REQUEST_FILENAME} !api.php | RewriteCond %{HTTP:Authorization} ^(.*) | ||||||
| RewriteCond %{REQUEST_FILENAME} !apiFront.php | RewriteRule . - [e=HTTP_AUTHORIZATION:%1] | ||||||
| RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] |  | ||||||
|  | # serve all files from public subfolder | ||||||
|  | RewriteCond %{REQUEST_FILENAME} !.php | ||||||
|  | RewriteCond %{REQUEST_FILENAME} !.log | ||||||
|  | RewriteCond %{REQUEST_FILENAME} !.ttfnot | ||||||
|  | RewriteCond %{REQUEST_FILENAME} \. | ||||||
|  | RewriteRule (.*) ./public/$1 [L] | ||||||
|  |  | ||||||
|  | # serve all other request as query parameters | ||||||
|  | RewriteRule (.*) ./public/index.php?url=$1 [L,QSA] | ||||||
|  |  | ||||||
| AddType application/x-httpd-php .php .phtml | AddType application/x-httpd-php .php .phtml | ||||||
|   | |||||||
| @@ -1,4 +0,0 @@ | |||||||
| Login |  | ||||||
| https://dev.steelants.cz/vasek/home/apiFront.php |  | ||||||
| ```json |  | ||||||
| {"username":"username","password":"password"}``` |  | ||||||
							
								
								
									
										34
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								README.md
									
									
									
									
									
								
							| @@ -135,3 +135,37 @@ Distributed under the MIT License. See `LICENSE` for more information. | |||||||
|  |  | ||||||
| Project Link: [https://github.com/GamerClassN7/Smart_Home/](https://github.com/GamerClassN7/Smart_Home/) <br> <br> | Project Link: [https://github.com/GamerClassN7/Smart_Home/](https://github.com/GamerClassN7/Smart_Home/) <br> <br> | ||||||
| <sup><sub>Tags (ignore): ESP32 ESP12 ESP08 ESP01 ESP Smart Home Automation System PWA PHP HTML JS DHT11 DHT22 | <sup><sub>Tags (ignore): ESP32 ESP12 ESP08 ESP01 ESP Smart Home Automation System PWA PHP HTML JS DHT11 DHT22 | ||||||
|  |  | ||||||
|  | ## Folder structure | ||||||
|  | ``` | ||||||
|  | - /app								# app specific files | ||||||
|  | 	- /controllers | ||||||
|  | 		- UserController.php | ||||||
|  | 	- /library						# helpers etc. | ||||||
|  | 	- /models | ||||||
|  | 		- /types | ||||||
|  | 			- Units.php | ||||||
|  | 		- UserModal.php | ||||||
|  | 	- /views | ||||||
|  | 		- /layouts | ||||||
|  | 			- default.phtml | ||||||
|  | 		- /templates | ||||||
|  | 			- /components | ||||||
|  | 			- /pages | ||||||
|  | 	- Bootstrap.php | ||||||
|  | 	- Db.php | ||||||
|  | 	- Routes.php | ||||||
|  | - /library 							# framework, 3rd libraries etc. | ||||||
|  | 	- /vendor | ||||||
|  | 	- Controller.php | ||||||
|  | 	- Db.php | ||||||
|  | 	- Router.php | ||||||
|  | - config | ||||||
|  | 	- config.php / | ||||||
|  | - public | ||||||
|  | 	- /css | ||||||
|  | 	- /images | ||||||
|  | 	- /js | ||||||
|  | 	- .htaccess | ||||||
|  | 	- index.php | ||||||
|  | ``` | ||||||
|   | |||||||
| @@ -1,298 +0,0 @@ | |||||||
| -- phpMyAdmin SQL Dump |  | ||||||
| -- version 4.6.6deb4 |  | ||||||
| -- https://www.phpmyadmin.net/ |  | ||||||
| -- |  | ||||||
| -- Počítač: localhost:3306 |  | ||||||
| -- Vytvořeno: Úte 08. říj 2019, 18:05 |  | ||||||
| -- Verze serveru: 10.1.41-MariaDB-0+deb9u1 |  | ||||||
| -- Verze PHP: 7.0.33-0+deb9u5 |  | ||||||
|  |  | ||||||
| SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; |  | ||||||
| SET time_zone = "+00:00"; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; |  | ||||||
| /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; |  | ||||||
| /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; |  | ||||||
| /*!40101 SET NAMES utf8mb4 */; |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Databáze: `smart-home` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Struktura tabulky `automation` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| CREATE TABLE `automation` ( |  | ||||||
|   `automation_id` int(11) NOT NULL, |  | ||||||
|   `name` varchar(255) NOT NULL, |  | ||||||
|   `on_days` varchar(255) NOT NULL, |  | ||||||
|   `if_something` varchar(255) NOT NULL, |  | ||||||
|   `do_something` varchar(255) NOT NULL, |  | ||||||
|   `executed` tinyint(4) NOT NULL, |  | ||||||
|   `active` tinyint(4) NOT NULL DEFAULT '1', |  | ||||||
|   `locked` tinyint(4) DEFAULT '0' |  | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Struktura tabulky `dashboard` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| CREATE TABLE `dashboard` ( |  | ||||||
|   `dashboard_id` int(11) NOT NULL, |  | ||||||
|   `user_id` int(11) NOT NULL, |  | ||||||
|   `subdevice_id` int(11) NOT NULL |  | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Struktura tabulky `devices` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| CREATE TABLE `devices` ( |  | ||||||
|   `device_id` int(11) NOT NULL, |  | ||||||
|   `room_id` int(11) DEFAULT NULL, |  | ||||||
|   `name` varchar(255) NOT NULL, |  | ||||||
|   `token` varchar(255) NOT NULL, |  | ||||||
|   `sleep_time` int(13) NOT NULL, |  | ||||||
|   `owner` int(13) NOT NULL, |  | ||||||
|   `permission` varchar(255) NOT NULL, |  | ||||||
|   `approved` int(11) NOT NULL, |  | ||||||
|   `icon` varchar(255) NOT NULL |  | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Struktura tabulky `notifications` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| CREATE TABLE `notifications` ( |  | ||||||
|   `id` int(13) NOT NULL, |  | ||||||
|   `user_id` varchar(255) NOT NULL, |  | ||||||
|   `token` varchar(255) NOT NULL |  | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Struktura tabulky `records` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| CREATE TABLE `records` ( |  | ||||||
|   `record_id` int(11) NOT NULL, |  | ||||||
|   `subdevice_id` int(11) NOT NULL, |  | ||||||
|   `value` smallint(6) NOT NULL, |  | ||||||
|   `time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, |  | ||||||
|   `execuded` tinyint(4) NOT NULL DEFAULT '0' |  | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Struktura tabulky `rooms` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| CREATE TABLE `rooms` ( |  | ||||||
|   `room_id` int(11) NOT NULL, |  | ||||||
|   `name` varchar(255) NOT NULL |  | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Struktura tabulky `scenes` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| CREATE TABLE `scenes` ( |  | ||||||
|   `scene_id` int(11) NOT NULL, |  | ||||||
|   `icon` varchar(255) NOT NULL, |  | ||||||
|   `name` varchar(255) NOT NULL, |  | ||||||
|   `do_something` varchar(255) NOT NULL |  | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Struktura tabulky `subdevices` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| CREATE TABLE `subdevices` ( |  | ||||||
|   `subdevice_id` int(11) NOT NULL, |  | ||||||
|   `device_id` int(11) NOT NULL, |  | ||||||
|   `type` varchar(255) NOT NULL, |  | ||||||
|   `unit` varchar(255) NOT NULL |  | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |  | ||||||
|  |  | ||||||
| -- -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Struktura tabulky `users` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| CREATE TABLE `users` ( |  | ||||||
|   `user_id` int(11) NOT NULL, |  | ||||||
|   `username` varchar(255) NOT NULL, |  | ||||||
|   `password` varchar(255) NOT NULL, |  | ||||||
|   `startPage` int(11) NOT NULL, |  | ||||||
|   `at_home` varchar(255) NOT NULL DEFAULT 'false' |  | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Vypisuji data pro tabulku `users` |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| INSERT INTO `users` (`user_id`, `username`, `password`, `startPage`) VALUES |  | ||||||
| (2, 'Admin', '08abb3ff83dfae60fb4591125fc49dc80cf7ef28224c2d5df86e2d0d037c553bc7f30e859348fd745c9c07a4edde4863e866a7d45356cf08a22e5e1eafa13406', 1); |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Klíče pro exportované tabulky |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Klíče pro tabulku `automation` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `automation` |  | ||||||
|   ADD PRIMARY KEY (`automation_id`); |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Klíče pro tabulku `dashboard` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `dashboard` |  | ||||||
|   ADD PRIMARY KEY (`dashboard_id`), |  | ||||||
|   ADD KEY `user_id` (`user_id`), |  | ||||||
|   ADD KEY `subdevice_id` (`subdevice_id`); |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Klíče pro tabulku `devices` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `devices` |  | ||||||
|   ADD PRIMARY KEY (`device_id`), |  | ||||||
|   ADD KEY `room_id` (`room_id`); |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Klíče pro tabulku `notifications` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `notifications` |  | ||||||
|   ADD PRIMARY KEY (`id`); |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Klíče pro tabulku `records` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `records` |  | ||||||
|   ADD PRIMARY KEY (`record_id`), |  | ||||||
|   ADD KEY `device_id` (`subdevice_id`); |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Klíče pro tabulku `rooms` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `rooms` |  | ||||||
|   ADD PRIMARY KEY (`room_id`); |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Klíče pro tabulku `scenes` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `scenes` |  | ||||||
|   ADD PRIMARY KEY (`scene_id`); |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Klíče pro tabulku `subdevices` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `subdevices` |  | ||||||
|   ADD PRIMARY KEY (`subdevice_id`), |  | ||||||
|   ADD KEY `device_id` (`device_id`); |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Klíče pro tabulku `users` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `users` |  | ||||||
|   ADD PRIMARY KEY (`user_id`); |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- AUTO_INCREMENT pro tabulky |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- AUTO_INCREMENT pro tabulku `automation` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `automation` |  | ||||||
|   MODIFY `automation_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=58; |  | ||||||
| -- |  | ||||||
| -- AUTO_INCREMENT pro tabulku `dashboard` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `dashboard` |  | ||||||
|   MODIFY `dashboard_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=24; |  | ||||||
| -- |  | ||||||
| -- AUTO_INCREMENT pro tabulku `devices` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `devices` |  | ||||||
|   MODIFY `device_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=16; |  | ||||||
| -- |  | ||||||
| -- AUTO_INCREMENT pro tabulku `notifications` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `notifications` |  | ||||||
|   MODIFY `id` int(13) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=17; |  | ||||||
| -- |  | ||||||
| -- AUTO_INCREMENT pro tabulku `records` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `records` |  | ||||||
|   MODIFY `record_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=352338; |  | ||||||
| -- |  | ||||||
| -- AUTO_INCREMENT pro tabulku `rooms` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `rooms` |  | ||||||
|   MODIFY `room_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=24; |  | ||||||
| -- |  | ||||||
| -- AUTO_INCREMENT pro tabulku `scenes` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `scenes` |  | ||||||
|   MODIFY `scene_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=20; |  | ||||||
| -- |  | ||||||
| -- AUTO_INCREMENT pro tabulku `subdevices` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `subdevices` |  | ||||||
|   MODIFY `subdevice_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=27; |  | ||||||
| -- |  | ||||||
| -- AUTO_INCREMENT pro tabulku `users` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `users` |  | ||||||
|   MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; |  | ||||||
| -- |  | ||||||
| -- Omezení pro exportované tabulky |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Omezení pro tabulku `dashboard` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `dashboard` |  | ||||||
|   ADD CONSTRAINT `dashboard_ibfk_2` FOREIGN KEY (`subdevice_id`) REFERENCES `subdevices` (`subdevice_id`) ON DELETE CASCADE ON UPDATE NO ACTION, |  | ||||||
|   ADD CONSTRAINT `dashboard_ibfk_3` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE NO ACTION; |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Omezení pro tabulku `devices` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `devices` |  | ||||||
|   ADD CONSTRAINT `devices_ibfk_1` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`room_id`) ON DELETE NO ACTION ON UPDATE NO ACTION; |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Omezení pro tabulku `records` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `records` |  | ||||||
|   ADD CONSTRAINT `records_ibfk_1` FOREIGN KEY (`subdevice_id`) REFERENCES `subdevices` (`subdevice_id`) ON DELETE CASCADE ON UPDATE CASCADE; |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Omezení pro tabulku `subdevices` |  | ||||||
| -- |  | ||||||
| ALTER TABLE `subdevices` |  | ||||||
|   ADD CONSTRAINT `subdevices_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES `devices` (`device_id`); |  | ||||||
|  |  | ||||||
| /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; |  | ||||||
| /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; |  | ||||||
| /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; |  | ||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 77 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 66 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 45 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 108 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 76 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 58 KiB | 
							
								
								
									
										2044
									
								
								adminer.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2044
									
								
								adminer.php
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										326
									
								
								api.php
									
									
									
									
									
								
							
							
						
						
									
										326
									
								
								api.php
									
									
									
									
									
								
							| @@ -1,326 +0,0 @@ | |||||||
| <?php |  | ||||||
| /** Includes **/ |  | ||||||
| include_once('./config.php'); |  | ||||||
|  |  | ||||||
| //Autoloader |  | ||||||
| $files = scandir('./app/class/'); |  | ||||||
| $files = array_diff($files, array( |  | ||||||
| 	'.', |  | ||||||
| 	'..', |  | ||||||
| 	'app', |  | ||||||
| 	'ChartJS.php', |  | ||||||
| 	'ChartJS_Line.php', |  | ||||||
| 	'ChartManager.php', |  | ||||||
| 	'DashboardManager.php', |  | ||||||
| 	'Partial.php', |  | ||||||
| 	'Form.php', |  | ||||||
| 	'Route.php', |  | ||||||
| 	'Template.php', |  | ||||||
| 	'Ajax.php', |  | ||||||
| )); |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| foreach($files as $file) { |  | ||||||
| 	include './app/class/'.  $file; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //Allow acces only wia Curl, Ajax ETC |  | ||||||
| /*$restAcess = 'XMLHttpRequest' == ( $_SERVER['HTTP_X_REQUESTED_WITH'] ?? '' ); |  | ||||||
| if (!$restAcess){ |  | ||||||
| 	header('Location: ./'); |  | ||||||
| }*/ |  | ||||||
|  |  | ||||||
| //Log |  | ||||||
| $logManager = new LogManager(); |  | ||||||
| $apiLogManager = new LogManager('./app/logs/api/'. date("Y-m-d").'.log'); |  | ||||||
|  |  | ||||||
| //DB Conector |  | ||||||
| Db::connect (DBHOST, DBUSER, DBPASS, DBNAME); |  | ||||||
|  |  | ||||||
| //Read API data |  | ||||||
| $json = file_get_contents('php://input'); |  | ||||||
| $obj = json_decode($json, true); |  | ||||||
|  |  | ||||||
| //Log RAW api request |  | ||||||
| if (API_DEBUGMOD == 1) { |  | ||||||
| 	$apiLogManager->write("[API] request body\n" . json_encode($obj, JSON_PRETTY_PRINT), LogRecordType::INFO); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //zabespecit proti Ddosu |  | ||||||
| if (isset($obj['user']) && $obj['user'] != ''){ |  | ||||||
| 	//user at home |  | ||||||
| 	$user = UserManager::getUser($obj['user']); |  | ||||||
| 	$userAtHome = $user['at_home']; |  | ||||||
| 	if (!empty($user)) { |  | ||||||
| 		$userId = $user['user_id']; |  | ||||||
| 		$atHome = $obj['atHome']; |  | ||||||
| 		if($userAtHome != $atHome){ |  | ||||||
| 			UserManager::atHome($userId, $atHome); |  | ||||||
| 			$logManager->write("[USER] user " . $userId . " changet his home state to " . $atHome , LogRecordType::INFO); |  | ||||||
| 		} |  | ||||||
| 		echo 'Saved: ' . $atHome; |  | ||||||
| 		header($_SERVER["SERVER_PROTOCOL"]." 200 OK"); |  | ||||||
| 		die(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //Filtrování IP adress |  | ||||||
| if (DEBUGMOD != 1) { |  | ||||||
| 	if (!in_array($_SERVER['REMOTE_ADDR'], HOMEIP)) { |  | ||||||
| 		echo json_encode(array( |  | ||||||
| 			'state' => 'unsuccess', |  | ||||||
| 			'errorMSG' => "Using API from your IP insnt alowed!", |  | ||||||
| 		), JSON_PRETTY_PRINT); |  | ||||||
| 		header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized"); |  | ||||||
| 		$logManager->write("[API] acces denied from " . $_SERVER['REMOTE_ADDR'], LogRecordType::WARNING); |  | ||||||
| 		exit(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //automationExecution |  | ||||||
| try { |  | ||||||
| 	AutomationManager::executeAll(); |  | ||||||
| 	$fallbackManager = new FallbackManager(RANGES); |  | ||||||
| 	$fallbackManager->check(); |  | ||||||
| 	//LogKeeper::purge(LOGTIMOUT); |  | ||||||
| } catch (\Exception $e) { |  | ||||||
| 	$logManager->write("[Automation] Something happen during automation execution", LogRecordType::ERROR); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //Record Cleaning |  | ||||||
| try { |  | ||||||
| 	RecordManager::clean(RECORDTIMOUT); |  | ||||||
| } catch (\Exception $e) { |  | ||||||
| 	$logManager->write("[Record] cleaning record older that " . RECORDTIMOUT , LogRecordType::ERROR); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //Variables |  | ||||||
| $token = $obj['token']; |  | ||||||
| $values = null; |  | ||||||
| $settings = null; |  | ||||||
| $deviceLogs = null; |  | ||||||
| $command = "null"; |  | ||||||
|  |  | ||||||
| if (isset($obj['values'])) { |  | ||||||
| 	$values = $obj['values']; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| if (isset($obj['settings'])) { |  | ||||||
| 	$settings = $obj['settings']; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| if (isset($obj['logs'])) { |  | ||||||
| 	$deviceLogs = $obj['logs']; |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| //Checks |  | ||||||
| if ($token == null || $token == "") { |  | ||||||
| 	echo json_encode(array( |  | ||||||
| 		'state' => 'unsuccess', |  | ||||||
| 		'errorMSG' => "Missing Value Token in JSON payload", |  | ||||||
| 	), JSON_PRETTY_PRINT); |  | ||||||
| 	header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized"); |  | ||||||
| 	die(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //Vstupní Checky |  | ||||||
| if (!DeviceManager::registeret($token)) { |  | ||||||
| 	//Notification data setup |  | ||||||
| 	$notificationMng = new NotificationManager; |  | ||||||
| 	$notificationData = [ |  | ||||||
| 		'title' => 'Info', |  | ||||||
| 		'body' => 'New device Detected Found', |  | ||||||
| 		'icon' => BASEDIR . '/app/templates/images/icon-192x192.png', |  | ||||||
| 	]; |  | ||||||
|  |  | ||||||
| 	//Subdevice Registration |  | ||||||
| 	$deviceId = DeviceManager::create($token, $token); |  | ||||||
| 	foreach ($values as $key => $value) { |  | ||||||
| 		if (!SubDeviceManager::getSubDeviceByMaster($deviceId, $key)) { |  | ||||||
| 			SubDeviceManager::create($deviceId, $key, UNITS[$key]); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	//Notification for newly added Device |  | ||||||
| 	if ($notificationData != []) { |  | ||||||
| 		$subscribers = $notificationMng::getSubscription(); |  | ||||||
| 		foreach ($subscribers as $key => $subscriber) { |  | ||||||
| 			$logManager->write("[NOTIFICATION] SENDING TO" . $subscriber['id'] . " ", LogRecordType::INFO); |  | ||||||
| 			$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized"); |  | ||||||
| 	echo json_encode(array( |  | ||||||
| 		'state' => 'unsuccess', |  | ||||||
| 		'errorMSG' => "Device not registeret", |  | ||||||
| 	), JSON_PRETTY_PRINT); |  | ||||||
| 	$logManager->write("[API] Registering Device", LogRecordType::INFO); |  | ||||||
| 	exit(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| if (!DeviceManager::approved($token)) { |  | ||||||
| 	header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized"); |  | ||||||
| 	echo json_encode(array( |  | ||||||
| 		'state' => 'unsuccess', |  | ||||||
| 		'errorMSG' => "Unaproved Device", |  | ||||||
| 	), JSON_PRETTY_PRINT); |  | ||||||
| 	exit(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Diagnostic Data Write to DB |  | ||||||
| if ($settings != null && $settings != ""){ |  | ||||||
| 	$data = ['mac' => $settings["network"]["mac"], 'ip_address' => $settings["network"]["ip"]]; |  | ||||||
| 	if (array_key_exists("firmware_hash", $settings)) { |  | ||||||
| 		$data['firmware_hash'] = $settings["firmware_hash"]; |  | ||||||
| 	} |  | ||||||
| 	DeviceManager::editByToken($token, $data); |  | ||||||
| 	$jsonAnswer = [ |  | ||||||
| 		'state' => 'succes', |  | ||||||
| 		'command' => $command, |  | ||||||
| 	]; |  | ||||||
| 	echo json_encode($jsonAnswer, JSON_PRETTY_PRINT); |  | ||||||
| 	header($_SERVER["SERVER_PROTOCOL"]." 200 OK"); |  | ||||||
| 	die(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Issuing command |  | ||||||
| if ($command == "null"){ |  | ||||||
| 	$device = DeviceManager::getDeviceByToken($token); |  | ||||||
| 	$deviceId = $device['device_id']; |  | ||||||
| 	$deviceCommand = $device["command"]; |  | ||||||
| 	if ($deviceCommand != '' && $deviceCommand != null && $deviceCommand != "null") |  | ||||||
| 	{ |  | ||||||
| 		$command = $deviceCommand;		 |  | ||||||
| 		$data = [ |  | ||||||
| 			'command'=>'null' |  | ||||||
| 		]; |  | ||||||
| 		DeviceManager::editByToken($token, $data); |  | ||||||
| 		$logManager->write("[API] Device_ID " . $deviceId . " executing command " . $command, LogRecordType::INFO); |  | ||||||
| 	}  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Diagnostic Logs Write To log File |  | ||||||
| if ($deviceLogs != null && $deviceLogs != ""){ |  | ||||||
| 	foreach ($deviceLogs as $log) { |  | ||||||
| 		$logManager->write("[Device Log Msg] Device_ID " . $deviceId . "->" . $log, LogRecordType::ERROR); |  | ||||||
| 	} |  | ||||||
| 	$jsonAnswer = [ |  | ||||||
| 		'state' => 'succes', |  | ||||||
| 		'command' => $command, |  | ||||||
| 	]; |  | ||||||
| 	echo json_encode($jsonAnswer, JSON_PRETTY_PRINT); |  | ||||||
| 	header($_SERVER["SERVER_PROTOCOL"]." 200 OK"); |  | ||||||
| 	die(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| // |  | ||||||
| if (count($values) == 1){ |  | ||||||
| 	unset($values["wifi"]); |  | ||||||
| } |  | ||||||
| // Subdevices first data! |  | ||||||
| if ($values != null && $values != "") { |  | ||||||
|  |  | ||||||
| 	//ZAPIS |  | ||||||
| 	$device = DeviceManager::getDeviceByToken($token); |  | ||||||
| 	$deviceId = $device['device_id']; |  | ||||||
| 	foreach ($values as $key => $value) { |  | ||||||
| 		if (!SubDeviceManager::getSubDeviceByMaster($deviceId, $key)) { |  | ||||||
| 			SubDeviceManager::create($deviceId, $key, UNITS[$key]); |  | ||||||
| 		} |  | ||||||
| 		RecordManager::create($deviceId, $key, round($value['value'],3)); |  | ||||||
| 		$logManager->write("[API] Device_ID " . $deviceId . " writed value " . $key . ' ' . $value['value'], LogRecordType::INFO); |  | ||||||
|  |  | ||||||
| 		//notification |  | ||||||
| 		if ($key == 'door' || $key == 'water') { |  | ||||||
| 			$notificationMng = new NotificationManager; |  | ||||||
| 			$notificationData = []; |  | ||||||
|  |  | ||||||
| 			switch ($key) { |  | ||||||
| 				case 'door': |  | ||||||
| 					$notificationData = [ |  | ||||||
| 						'title' => 'Info', |  | ||||||
| 						'body' => 'Someone just open up '.$device['name'], |  | ||||||
| 						'icon' => BASEDIR . '/app/templates/images/icon-192x192.png', |  | ||||||
| 					]; |  | ||||||
|  |  | ||||||
| 				break; |  | ||||||
| 				case 'water': |  | ||||||
| 					$notificationData = [ |  | ||||||
| 						'title' => 'Alert', |  | ||||||
| 						'body' => 'Wather leak detected by '.$device['name'], |  | ||||||
| 						'icon' => BASEDIR . '/app/templates/images/icon-192x192.png', |  | ||||||
| 					]; |  | ||||||
| 				break; |  | ||||||
| 			} |  | ||||||
| 			if (DEBUGMOD) $notificationData['body'] .= ' value='.$value['value']; |  | ||||||
| 			if ($notificationData != []) { |  | ||||||
| 				$subscribers = $notificationMng::getSubscription(); |  | ||||||
| 				foreach ($subscribers as $key => $subscriber) { |  | ||||||
| 					$logManager->write("[NOTIFICATION] SENDING TO" . $subscriber['id'] . " ", LogRecordType::INFO); |  | ||||||
| 					$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	$hostname = strtolower($device['name']); |  | ||||||
| 	$hostname = str_replace(' ', '_', $hostname); |  | ||||||
| 	//upravit format na setings-> netvork etc |  | ||||||
| 	$jsonAnswer = [ |  | ||||||
| 		'device' => [ |  | ||||||
| 			'hostname' => $hostname, |  | ||||||
| 			'ipAddress' => $device['ip_address'], |  | ||||||
| 			'subnet' => $device['subnet'], |  | ||||||
| 			'gateway' => $device['gateway'], |  | ||||||
| 		], |  | ||||||
| 		'state' => 'succes', |  | ||||||
| 		'command' => $command, |  | ||||||
| 	]; |  | ||||||
|  |  | ||||||
| 	$subDevicesTypeList = SubDeviceManager::getSubDeviceSTypeForMater($deviceId); |  | ||||||
| 	if (!in_array($subDevicesTypeList, ['on/off', 'door', 'water'])) { |  | ||||||
| 		$jsonAnswer['device']['sleepTime'] = $device['sleep_time']; |  | ||||||
| 	} |  | ||||||
| 	echo json_encode($jsonAnswer, JSON_PRETTY_PRINT); |  | ||||||
| 	header($_SERVER["SERVER_PROTOCOL"]." 200 OK"); |  | ||||||
| } else { |  | ||||||
| 	//Vypis |  | ||||||
| 	$device = DeviceManager::getDeviceByToken($token); |  | ||||||
| 	$deviceId = $device['device_id']; |  | ||||||
|  |  | ||||||
| 	if (count(SubDeviceManager::getAllSubDevices($deviceId)) == 0) { |  | ||||||
| 		SubDeviceManager::create($deviceId, 'on/off', UNITS[$key]); |  | ||||||
| 		//RecordManager::create($deviceId, 'on/off', 0); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	$subDeviceId = SubDeviceManager::getAllSubDevices($deviceId)[0]['subdevice_id']; |  | ||||||
| 	$subDeviceLastReord = RecordManager::getLastRecord($subDeviceId); |  | ||||||
| 	$subDeviceLastReordValue = $subDeviceLastReord['value']; |  | ||||||
|  |  | ||||||
| 	if ($subDeviceLastReord['execuded'] == 0){ |  | ||||||
| 		$logManager->write("[API] subDevice_ID ".$subDeviceId . " executed comand with value " .$subDeviceLastReordValue . " record id " . $subDeviceLastReord['record_id'] . " executed " . $subDeviceLastReord['execuded'], LogRecordType::INFO); |  | ||||||
| 		RecordManager::setExecuted($subDeviceLastReord['record_id']); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	echo json_encode(array( |  | ||||||
| 		'device' => [ |  | ||||||
| 			'hostname' => $device['name'], |  | ||||||
| 			'ipAddress' => $device['ip_address'], |  | ||||||
| 			'subnet' => $device['subnet'], |  | ||||||
| 			'gateway' => $device['gateway'], |  | ||||||
| 		], |  | ||||||
| 		'state' => 'succes', |  | ||||||
| 		'value' => $subDeviceLastReordValue, |  | ||||||
| 		'command' => $command, |  | ||||||
| 	), JSON_PRETTY_PRINT); |  | ||||||
| 	header($_SERVER["SERVER_PROTOCOL"]." 200 OK"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unset($logManager); |  | ||||||
| Db::disconect(); |  | ||||||
| die(); |  | ||||||
							
								
								
									
										98
									
								
								apiFront.php
									
									
									
									
									
								
							
							
						
						
									
										98
									
								
								apiFront.php
									
									
									
									
									
								
							| @@ -1,98 +0,0 @@ | |||||||
| <?php |  | ||||||
| /** Includes **/ |  | ||||||
| include_once('./config.php'); |  | ||||||
|  |  | ||||||
| //Autoloader |  | ||||||
| $files = scandir('./app/class/'); |  | ||||||
| $files = array_diff($files, array( |  | ||||||
| 	'.', |  | ||||||
| 	'..', |  | ||||||
| 	'app', |  | ||||||
| 	'ChartJS.php', |  | ||||||
| 	'ChartJS_Line.php', |  | ||||||
| 	'ChartManager.php', |  | ||||||
| 	'DashboardManager.php', |  | ||||||
| 	'Partial.php', |  | ||||||
| 	'Form.php', |  | ||||||
| 	'Route.php', |  | ||||||
| 	'Template.php', |  | ||||||
| 	'Ajax.php', |  | ||||||
| )); |  | ||||||
|  |  | ||||||
| foreach($files as $file) { |  | ||||||
| 	include './app/class/'.  $file; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //Log |  | ||||||
| $apiLogManager = new LogManager('./app/logs/apiFront/'. date("Y-m-d").'.log'); |  | ||||||
|  |  | ||||||
| //DB Conector |  | ||||||
| Db::connect (DBHOST, DBUSER, DBPASS, DBNAME); |  | ||||||
|  |  | ||||||
| //Read API data |  | ||||||
| $json = file_get_contents('php://input'); |  | ||||||
| $obj = json_decode($json, true); |  | ||||||
|  |  | ||||||
| //Log RAW api request |  | ||||||
| if (API_DEBUGMOD == 1) { |  | ||||||
| 	$apiLogManager->write("[API] request body\n" . json_encode($obj, JSON_PRETTY_PRINT), LogRecordType::INFO); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| $apiManager = new ApiManager(); |  | ||||||
| echo $apiManager->generateToken($obj['username'],$obj['password']); |  | ||||||
| die(); |  | ||||||
|  |  | ||||||
| /* |  | ||||||
| if ( |  | ||||||
| 	isset($obj['username']) && |  | ||||||
| 	$obj['username'] != '' && |  | ||||||
| 	isset($obj['password']) && |  | ||||||
| 	$obj['password'] != '' |  | ||||||
| ){ |  | ||||||
| 	$ota = false; |  | ||||||
| 	$userName = $_POST['username']; |  | ||||||
| 	$userPassword = $_POST['password']; |  | ||||||
| 	$rememberMe = (isset ($_POST['remember']) ? $_POST['remember'] : ""); |  | ||||||
| 	$ota = $userManager->haveOtaEnabled($userName); |  | ||||||
| 	if ($ota == "") { |  | ||||||
| 		$landingPage = $userManager->login($userName, $userPassword, $rememberMe); |  | ||||||
| 		header('Location: ' . BASEDIR . $landingPage); |  | ||||||
| 		die(); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	$_SESSION['USERNAME'] = $userName; |  | ||||||
| 	$_SESSION['PASSWORD'] = $userPassword; |  | ||||||
| 	$_SESSION['REMEMBER'] = $rememberMe; |  | ||||||
| 	$_SESSION['OTA'] = $ota; |  | ||||||
| } else if ( |  | ||||||
| 	isset($_POST['otaCode']) && |  | ||||||
| 	$_POST['otaCode'] != '' |  | ||||||
| ) { |  | ||||||
|  |  | ||||||
| 	$otaCode = $_POST['otaCode']; |  | ||||||
| 	$otaSecret = $_POST['otaSecret']; |  | ||||||
|  |  | ||||||
| 	$ga = new PHPGangsta_GoogleAuthenticator(); |  | ||||||
| 	$ota = $_SESSION['OTA']; |  | ||||||
| 	$userName = $_SESSION['USERNAME']; |  | ||||||
| 	$userPassword = $_SESSION['PASSWORD']; |  | ||||||
| 	$rememberMe = $_SESSION['REMEMBER']; |  | ||||||
| 	unset($_SESSION['OTA']); |  | ||||||
| 	$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2);    // 2 = 2*30sec clock tolerance |  | ||||||
| 	if ($checkResult) { |  | ||||||
| 		$landingPage = $userManager->login($userName, $userPassword, $rememberMe); |  | ||||||
| 		header('Location: ' . BASEDIR . $landingPage); |  | ||||||
| 		echo 'OK'; |  | ||||||
| 	} else { |  | ||||||
| 		echo 'FAILED'; |  | ||||||
| 	} |  | ||||||
| 	//TODO: upravi a ověřit jeslti ja zabezpečené |  | ||||||
| 	//TODO: |  | ||||||
| 	die(); |  | ||||||
| } |  | ||||||
| */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /*unset($logManager); |  | ||||||
| Db::disconect(); |  | ||||||
| die();*/ |  | ||||||
							
								
								
									
										110
									
								
								app/Bootstrap.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								app/Bootstrap.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | |||||||
|  | <?php | ||||||
|  | //Debug | ||||||
|  | error_reporting(E_ALL); | ||||||
|  | ini_set( 'display_errors','1'); | ||||||
|  |  | ||||||
|  | //setup | ||||||
|  | parse_str($_SERVER['QUERY_STRING'], $params); | ||||||
|  | $urlSes = str_replace((!empty ($params['url']) ? $params['url'] : ""), "", str_replace('https://' . $_SERVER['HTTP_HOST'], "", $_SERVER['REQUEST_URI'])); | ||||||
|  | session_set_cookie_params( | ||||||
|  |     1209600, | ||||||
|  |     $urlSes, | ||||||
|  |     str_replace("/var/www/", "", $_SERVER['DOCUMENT_ROOT']), | ||||||
|  |     true, | ||||||
|  |     true | ||||||
|  | ); | ||||||
|  | /*ini_set ('session.cookie_httponly', '1'); | ||||||
|  | ini_set('session.cookie_domain', $_SERVER['HTTP_HOST']); | ||||||
|  | ini_set('session.cookie_path', str_replace('login', "", str_replace('https://' . $_SERVER['HTTP_HOST'], "", $_SERVER['REQUEST_URI']))); | ||||||
|  | ini_set('session.cookie_secure', '1'); | ||||||
|  | ini_set('session.gc_maxlifetime', 1209600);*/ | ||||||
|  | mb_internal_encoding ("UTF-8"); | ||||||
|  |  | ||||||
|  | session_start(); | ||||||
|  |  | ||||||
|  | // import configs | ||||||
|  | require_once '../library/Debugger.php'; | ||||||
|  |  | ||||||
|  | Debugger::flag('loaders'); | ||||||
|  |  | ||||||
|  | //Autoloader | ||||||
|  | class Autoloader { | ||||||
|  | 	protected static $extension = ".php"; | ||||||
|  | 	protected static $root = __DIR__; | ||||||
|  | 	protected static $files = []; | ||||||
|  |  | ||||||
|  | 	static function ClassLoader ($className = ""){ | ||||||
|  | 		$directorys = new RecursiveDirectoryIterator(static::$root, RecursiveDirectoryIterator::SKIP_DOTS); | ||||||
|  |  | ||||||
|  | 		//echo '<pre>'; | ||||||
|  | 		//var_dump($directorys); | ||||||
|  | 		//echo '</pre>'; | ||||||
|  |  | ||||||
|  | 		$files = new RecursiveIteratorIterator($directorys, RecursiveIteratorIterator::LEAVES_ONLY); | ||||||
|  |  | ||||||
|  | 		$filename = $className . static::$extension; | ||||||
|  |  | ||||||
|  | 		foreach ($files as $key => $file) { | ||||||
|  | 			if (strtolower($file->getFilename()) === strtolower($filename) && $file->isReadable()) { | ||||||
|  | 				include_once $file->getPathname(); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	static function setRoot($rootPath){ | ||||||
|  | 		static::$root = $rootPath; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | spl_autoload_register("Autoloader::ClassLoader"); | ||||||
|  | Autoloader::setRoot('/var/www/dev.steelants.cz/vasek/home-update/'); | ||||||
|  |  | ||||||
|  | // import configs | ||||||
|  | require_once '../config/config.php'; | ||||||
|  |  | ||||||
|  | class ErrorHandler { | ||||||
|  | 	static function exception($exception){ | ||||||
|  | 		error_log($exception); | ||||||
|  | 		http_response_code($exception->getCode()); | ||||||
|  | 		$message = [ | ||||||
|  | 			'code' => $exception->getCode(), | ||||||
|  | 			'message' => $exception->getMessage(), | ||||||
|  | 			'file' => $exception->getFile(), | ||||||
|  | 			'line' => $exception->getLine(), | ||||||
|  | 			'trace' => $exception->getTrace(), | ||||||
|  | 		]; | ||||||
|  | 		echo json_encode($message); | ||||||
|  |  | ||||||
|  | 		$apiLogManager = new LogManager('../logs/apache/'. date("Y-m-d").'.log'); | ||||||
|  | 		$apiLogManager->setLevel(LOGLEVEL); | ||||||
|  | 		$apiLogManager->write("[APACHE]\n" . json_encode($message, JSON_PRETTY_PRINT), LogRecordTypes::ERROR); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | set_exception_handler("ErrorHandler::exception"); | ||||||
|  |  | ||||||
|  | Debugger::flag('preload'); | ||||||
|  |  | ||||||
|  | $json = file_get_contents('php://input'); | ||||||
|  | $obj = json_decode($json, true); | ||||||
|  |  | ||||||
|  | $apiLogManager = new LogManager('../logs/api/'. date("Y-m-d").'.log'); | ||||||
|  | $apiLogManager->setLevel(LOGLEVEL); | ||||||
|  |  | ||||||
|  | $apiLogManager->write("[API] headers\n" . json_encode($_SERVER, JSON_PRETTY_PRINT), LogRecordTypes::INFO); | ||||||
|  | $apiLogManager->write("[API] request body\n" . json_encode($obj, JSON_PRETTY_PRINT), LogRecordTypes::INFO); | ||||||
|  | $apiLogManager->write("[API] POST  body\n" . json_encode($_POST, JSON_PRETTY_PRINT), LogRecordTypes::INFO); | ||||||
|  | $apiLogManager->write("[API] GET body\n" . json_encode($_GET, JSON_PRETTY_PRINT), LogRecordTypes::INFO); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Debugger::flag('dbconnect'); | ||||||
|  | //D B Conector | ||||||
|  | Db::connect (DBHOST, DBUSER, DBPASS, DBNAME); | ||||||
|  |  | ||||||
|  | Debugger::flag('routes'); | ||||||
|  | // import routes | ||||||
|  | require_once '../app/Routes.php'; | ||||||
|  |  | ||||||
|  | Debugger::flag('done'); | ||||||
|  | // echo Debugger::showFlags(false); | ||||||
							
								
								
									
										64
									
								
								app/Routes.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								app/Routes.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | $router = new Router(); | ||||||
|  |  | ||||||
|  | $router->setDefault(function(){ | ||||||
|  | 	echo $_GET['url'].': 404'; | ||||||
|  | 	$logManager = new LogManager(); | ||||||
|  | 	$logManager->setLevel(LOGLEVEL); | ||||||
|  | 	$logManager->write("[ROUTER]" . $_GET['url'] . "not found", LogRecordTypes::WARNING); | ||||||
|  | 	unset($logManager); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | //Pages | ||||||
|  | $router->any('/', 'Log'); | ||||||
|  | $router->any('/log', 'Log'); | ||||||
|  | $router->any('/server', 'Server'); | ||||||
|  | $router->any('/login', 'Login'); | ||||||
|  | $router->any('/logout', 'Logout'); | ||||||
|  | $router->any('/automation', 'Automation'); | ||||||
|  | $router->any('/setting', 'Setting'); | ||||||
|  | $router->any('/device', 'Device'); | ||||||
|  | $router->any('/plugins', 'Plugins'); | ||||||
|  | $router->any('/ajax', 'Ajax'); | ||||||
|  | $router->any('/oauth', 'Oauth'); | ||||||
|  |  | ||||||
|  | //Vue APP | ||||||
|  | $router->post('/api/login', 'AuthApi@login'); | ||||||
|  | $router->post('/api/logout', 'AuthApi@logout'); | ||||||
|  | $router->get('/api/rooms', 'RoomsApi@default'); | ||||||
|  | $router->get('/api/rooms/{roomId}/update', 'RoomsApi@update'); | ||||||
|  |  | ||||||
|  | $router->get('/api/devices', 'DevicesApi@default'); | ||||||
|  | $router->get('/api/plugins', 'PluginsApi@default'); | ||||||
|  | $router->get('/api/users', 'UsersApi@default'); | ||||||
|  | $router->get('/api/server', 'ServerApi@default'); | ||||||
|  | $router->get('/api/server/log', 'ServerApi@logStatus'); | ||||||
|  |  | ||||||
|  | $router->post('/api/widgets/{widgetId}/run', 'WidgetApi@run'); | ||||||
|  | $router->get('/api/widgets/{widgetId}/detail', 'WidgetApi@detail'); | ||||||
|  | $router->get('/api/widgets/{widgetId}/detail/{period}', 'WidgetApi@detail'); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //cron | ||||||
|  | $router->post('/cron/clean', 'CronApi@clean'); | ||||||
|  | $router->post('/cron/fetch', 'CronApi@fetch'); | ||||||
|  |  | ||||||
|  | //Google Home - API | ||||||
|  | $router->any('/api/HA/auth', 'Oauth'); | ||||||
|  | $router->any('/api/HA', 'GoogleHomeApi@response'); | ||||||
|  |  | ||||||
|  | //Endpoints API | ||||||
|  | $router->post('/api/endpoint/', 'EndpointsApi@default'); | ||||||
|  | $router->any('/api/update/', 'UpdatesApi@default'); | ||||||
|  | $router->any('/api/users/status', 'UsersApi@status'); | ||||||
|  |  | ||||||
|  | // examples | ||||||
|  | $router->any('/api/example', 'ExampleApi@example'); | ||||||
|  | $router->any('/example', 'ExampleController@index'); | ||||||
|  | $router->any('/example/subpage', 'ExampleController@subpage'); | ||||||
|  |  | ||||||
|  | //module routes | ||||||
|  | //$router->any('/plugins/spotify/callback', 'Spotify@callback'); | ||||||
|  |  | ||||||
|  | $router->run($_SERVER['REQUEST_METHOD'], '/'.(isset($_GET['url']) ? $_GET['url'] : '')); | ||||||
							
								
								
									
										25
									
								
								app/api/AuthApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								app/api/AuthApi.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | <?php | ||||||
|  | class AuthApi extends ApiController { | ||||||
|  | 	public function login(){ | ||||||
|  | 		$token = (new AuthManager)->getToken($this->input['username'],$this->input['password']); | ||||||
|  | 		if (!$token) { | ||||||
|  | 			throw new Exception("Auth failed", 401); | ||||||
|  | 		} | ||||||
|  | 		$this->response(['token' => $token]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function logout(){ | ||||||
|  | 		$authenticationBearrer = $_SERVER['HTTP_AUTHORIZATION']; | ||||||
|  | 		if (!(new AuthManager)->deleteToken($authenticationBearrer)) { | ||||||
|  | 			throw new Exception("logout Failed", 401); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function registration(){ | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function restartPassword(){ | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										58
									
								
								app/api/CronApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								app/api/CronApi.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | |||||||
|  | <?php | ||||||
|  | class CronApi extends ApiController | ||||||
|  | { | ||||||
|  |  | ||||||
|  | 	public function clean() | ||||||
|  | 	{ | ||||||
|  | 		//Log Cleaning | ||||||
|  | 		$logKeeper = new LogMaintainer(); | ||||||
|  | 		$logKeeper->purge(LOGTIMOUT); | ||||||
|  |  | ||||||
|  | 		//Database Backup Cleanup | ||||||
|  | 		$backupWorker = new DatabaseBackup(); | ||||||
|  | 		$backupWorker->purge(5); | ||||||
|  |  | ||||||
|  | 		$this->response(['Value' => 'OK']); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function fetch() | ||||||
|  | 	{ | ||||||
|  | 		//Run Plugins | ||||||
|  | 		$result = []; | ||||||
|  | 		$dir = $_SERVER['DOCUMENT_ROOT'] . BASEDIR . 'app/plugins/'; | ||||||
|  | 		$pluginsFiles = array_diff(scandir($dir), ['..', '.']); | ||||||
|  | 		foreach ($pluginsFiles as $key => $pluginFile) { | ||||||
|  | 			if (strpos($pluginFile, "!") === false) { | ||||||
|  | 				$className = str_replace(".php", "", $pluginFile); | ||||||
|  | 				if (strpos($pluginFile, '_') === true) { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				if (!class_exists($className)) { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				$pluginMakeClass = new $className; | ||||||
|  | 				if (!method_exists($pluginMakeClass, 'make')) { | ||||||
|  |  | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				$result[$className] = $pluginMakeClass->make(); | ||||||
|  | 			} else { | ||||||
|  | 				$className = str_replace("!", "", str_replace(".php", "", $pluginFile)); | ||||||
|  | 				if (strpos($pluginFile, '_') === true) { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				if (!class_exists($className)) { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				$pluginMakeClass = new $className; | ||||||
|  | 				if (!method_exists($pluginMakeClass, 'disable')) { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				$result[$className] = $pluginMakeClass->disable(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		//Print Result | ||||||
|  | 		$this->response($result); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								app/api/DevicesApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								app/api/DevicesApi.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | class DevicesApi extends ApiController{ | ||||||
|  |  | ||||||
|  | 	public function default(){ | ||||||
|  | 		$this->requireAuth(); | ||||||
|  | 		$response = []; | ||||||
|  |  | ||||||
|  | 		// TODO: process the request | ||||||
|  |  | ||||||
|  | 		$this->response($response); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function getDevicesByRoom($roomId){ | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										196
									
								
								app/api/EndpointsApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								app/api/EndpointsApi.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,196 @@ | |||||||
|  | <?php | ||||||
|  | class EndpointsApi extends ApiController{ | ||||||
|  | 	public function default(){ | ||||||
|  | 		// $this->requireAuth(); | ||||||
|  | 		$obj = $this->input; | ||||||
|  |  | ||||||
|  | 		//variables Definition | ||||||
|  | 		$command = "null"; | ||||||
|  |  | ||||||
|  | 		//Log | ||||||
|  | 		$logManager = new LogManager('../logs/api/'. date("Y-m-d").'.log'); | ||||||
|  | 		$logManager->setLevel(LOGLEVEL); | ||||||
|  |  | ||||||
|  | 		//Token Checks | ||||||
|  | 		if ($obj['token'] == null || !isset($obj['token'])) { | ||||||
|  | 			$this->response([ | ||||||
|  | 				'state' => 'unsuccess', | ||||||
|  | 				'errorMSG' => "Missing Value Token in JSON payload", | ||||||
|  | 			], 401); | ||||||
|  | 			die(); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		//Vstupní Checky | ||||||
|  | 		if (!DeviceManager::registeret($obj['token'])) { | ||||||
|  | 			//Notification data setup | ||||||
|  | 			$notificationMng = new NotificationManager; | ||||||
|  | 			$notificationData = [ | ||||||
|  | 				'title' => 'Info', | ||||||
|  | 				'body' => 'New device Detected Found', | ||||||
|  | 				'icon' => BASEDIR . '/app/templates/images/icon-192x192.png', | ||||||
|  | 			]; | ||||||
|  |  | ||||||
|  | 			//Subdevice Registration | ||||||
|  | 			$device = DeviceManager::create($obj['token'], $obj['token']); | ||||||
|  | 			foreach ($obj['values'] as $key => $value) { | ||||||
|  | 				if (!SubDeviceManager::getSubDeviceByMaster($device['device_id'], $key)) { | ||||||
|  | 					SubDeviceManager::create($device['device_id'], $key, UNITS[$key]); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			//Notification for newly added Device | ||||||
|  | 			if ($notificationData != []) { | ||||||
|  | 				$subscribers = $notificationMng::getSubscription(); | ||||||
|  | 				foreach ($subscribers as $key => $subscriber) { | ||||||
|  | 					$logManager->write("[NOTIFICATION] SENDING TO" . $subscriber['id'] . " ", LogRecordTypes::INFO); | ||||||
|  | 					$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			$logManager->write("[API] Registering Device", LogRecordTypes::INFO); | ||||||
|  | 			$this->response([ | ||||||
|  | 				'state' => 'unsuccess', | ||||||
|  | 				'errorMSG' => "Device not registeret", | ||||||
|  | 			], 401); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if (!DeviceManager::approved($obj['token'])) { | ||||||
|  | 			$this->response([ | ||||||
|  | 				'state' => 'unsuccess', | ||||||
|  | 				'errorMSG' => "Unaproved Device", | ||||||
|  | 			], 401); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$device = DeviceManager::getDeviceByToken($obj['token']); | ||||||
|  |  | ||||||
|  | 		//Diagnostic | ||||||
|  | 		if (isset($obj['settings'])){ | ||||||
|  | 			$data = ['mac' => $obj['settings']["network"]["mac"], 'ip_address' => $obj['settings']["network"]["ip"]]; | ||||||
|  | 			if (array_key_exists("firmware_hash", $obj['settings'])) { | ||||||
|  | 				$data['firmware_hash'] = $obj['settings']["firmware_hash"]; | ||||||
|  | 			} | ||||||
|  | 			DeviceManager::editByToken($obj['token'], $data); | ||||||
|  | 			$this->response([ | ||||||
|  | 				'state' => 'succes', | ||||||
|  | 				'command' => $command, | ||||||
|  | 			], 200); | ||||||
|  | 			die(); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		//Log Data Save | ||||||
|  | 		if (isset($obj['logs'])){ | ||||||
|  | 			foreach ($obj['logs'] as $log) { | ||||||
|  | 				$deviceLogManager = new LogManager('../logs/devices/'. date("Y-m-d").'.log'); | ||||||
|  | 				$deviceLogManager->setLevel(LOGLEVEL); | ||||||
|  | 				$deviceLogManager->write("[Device Log Msg] Device_ID " . $device['device_id'] . "->" . $log, LogRecordTypes::ERROR); | ||||||
|  | 				unset($deviceLogManager); | ||||||
|  | 			} | ||||||
|  | 			$this->response([ | ||||||
|  | 				'state' => 'succes', | ||||||
|  | 				'command' => $command, | ||||||
|  | 			], 200); | ||||||
|  | 			die(); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Issuing command | ||||||
|  | 		if ($command == "null"){ | ||||||
|  | 			$deviceCommand = $device["command"]; | ||||||
|  | 			if ($deviceCommand != '' && $deviceCommand != null && $deviceCommand != "null") | ||||||
|  | 			{ | ||||||
|  | 				$command = $deviceCommand; | ||||||
|  | 				$data = [ | ||||||
|  | 					'command'=>'null' | ||||||
|  | 				]; | ||||||
|  | 				DeviceManager::editByToken($obj['token'], $data); | ||||||
|  | 				$logManager->write("[API] Device_ID " . $device['device_id'] . " executing command " . $command, LogRecordTypes::INFO); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$jsonAnswer = []; | ||||||
|  | 		$subDeviceLastReordValue = []; | ||||||
|  |  | ||||||
|  | 		if (isset($obj['values'])) { | ||||||
|  | 			//ZAPIS | ||||||
|  | 			foreach ($obj['values'] as $key => $value) { | ||||||
|  | 				if (!SubDeviceManager::getSubDeviceByMaster($device['device_id'], $key)) { | ||||||
|  | 					SubDeviceManager::create($device['device_id'], $key, UNITS[$key]); | ||||||
|  | 				} | ||||||
|  | 				$subDeviceLastReordValue[$key] = $value['value']; | ||||||
|  | 				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); | ||||||
|  |  | ||||||
|  | 				//notification | ||||||
|  | 				if ($key == 'door' || $key == 'water') { | ||||||
|  | 					$notificationMng = new NotificationManager; | ||||||
|  | 					$notificationData = []; | ||||||
|  |  | ||||||
|  | 					switch ($key) { | ||||||
|  | 						case 'door': | ||||||
|  | 							$notificationData = [ | ||||||
|  | 								'title' => 'Info', | ||||||
|  | 								'body' => 'Someone just open up '.$device['name'], | ||||||
|  | 								'icon' => BASEDIR . '/app/templates/images/icon-192x192.png', | ||||||
|  | 							]; | ||||||
|  |  | ||||||
|  | 						break; | ||||||
|  | 						case 'water': | ||||||
|  | 							$notificationData = [ | ||||||
|  | 								'title' => 'Alert', | ||||||
|  | 								'body' => 'Wather leak detected by '.$device['name'], | ||||||
|  | 								'icon' => BASEDIR . '/app/templates/images/icon-192x192.png', | ||||||
|  | 							]; | ||||||
|  | 						break; | ||||||
|  | 					} | ||||||
|  | 					if (DEBUGMOD) $notificationData['body'] .= ' value='.$value['value']; | ||||||
|  | 					if ($notificationData != []) { | ||||||
|  | 						$subscribers = $notificationMng::getSubscription(); | ||||||
|  | 						foreach ($subscribers as $key => $subscriber) { | ||||||
|  | 							$logManager->write("[NOTIFICATION] SENDING TO" . $subscriber['id'] . " ", LogRecordTypes::INFO); | ||||||
|  | 							$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData); | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 			//upravit format na setings-> netvork etc | ||||||
|  |  | ||||||
|  | 			$subDevicesTypeList = SubDeviceManager::getSubDeviceSTypeForMater($device['device_id']); | ||||||
|  | 			if (!in_array($subDevicesTypeList, ['on/off', 'door', 'water'])) { | ||||||
|  | 				$jsonAnswer['device']['sleepTime'] = $device['sleep_time']; | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			if (count(SubDeviceManager::getAllSubDevices($device['device_id'])) == 0) { | ||||||
|  | 				//SubDeviceManager::create($device['device_id'], 'on/off', UNITS[$key]); | ||||||
|  | 				//RecordManager::create($device['device_id'], 'on/off', 0); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			$subDevicesData = SubDeviceManager::getAllSubDevices($device['device_id']); | ||||||
|  |  | ||||||
|  | 			foreach ($subDevicesData as $key => $subDeviceData) { | ||||||
|  | 				$subDeviceId = $subDeviceData['subdevice_id']; | ||||||
|  | 				$subDeviceLastReord = RecordManager::getLastRecord($subDeviceId); | ||||||
|  | 				$subDeviceLastReordValue[$subDeviceData['type']] = $subDeviceLastReord['value']; | ||||||
|  |  | ||||||
|  | 				if ($subDeviceLastReord['execuded'] == 0){ | ||||||
|  | 					$logManager->write("[API] subDevice_ID ".$subDeviceId . " executed comand with value " . json_encode($subDeviceLastReordValue) ." executed " . $subDeviceLastReord['execuded'], LogRecordTypes::INFO); | ||||||
|  | 					RecordManager::setExecuted($subDeviceLastReord['record_id']); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$hostname = ""; | ||||||
|  | 		$hostname = strtolower($device['name']); | ||||||
|  | 		$hostname = str_replace(' ', '_', $hostname); | ||||||
|  |  | ||||||
|  | 		$jsonAnswer['device']['hostname'] = $hostname; | ||||||
|  | 		$jsonAnswer['state'] = 'succes'; | ||||||
|  | 		$jsonAnswer['values'] = $subDeviceLastReordValue; | ||||||
|  | 		$jsonAnswer['command'] = $command; | ||||||
|  |  | ||||||
|  | 		$this->response($jsonAnswer); | ||||||
|  | 		// this method returns response as json | ||||||
|  | 		//unset($logManager); //TODO: Opravit | ||||||
|  | 		die(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								app/api/ExampleApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								app/api/ExampleApi.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | class ExampleApi extends ApiController{ | ||||||
|  |  | ||||||
|  | 	public function example(){ | ||||||
|  | 		// if this function should be accessible only for logged users uncomment next line | ||||||
|  | 		// $this->requireAuth(); | ||||||
|  | 		// if user is logged in, next lines will be processed | ||||||
|  | 		// otherwise script get terminated with 401 UNAUTHORIZED | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 		// input data are stored in $this->input | ||||||
|  | 		// in this example we just copy input to response | ||||||
|  | 		$response = $this->input; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 		// this method returns response as json | ||||||
|  | 		$this->response($response); | ||||||
|  | 		// you can specify returned http code by second optional parameter | ||||||
|  | 		// default value is 200 | ||||||
|  | 		// $this->response($response, $httpCode); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										56
									
								
								app/api/GoogleHomeApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								app/api/GoogleHomeApi.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | |||||||
|  | <?php | ||||||
|  | class GoogleHomeApi{ | ||||||
|  | 	static function response(){ | ||||||
|  | 		//$this->requireAuth(); | ||||||
|  | 		$json = file_get_contents('php://input'); | ||||||
|  | 		$obj = json_decode($json, true); | ||||||
|  |  | ||||||
|  | 		$apiLogManager = new LogManager('../logs/google-home/'. date("Y-m-d").'.log'); | ||||||
|  | 		$apiLogManager->setLevel(LOGLEVEL); | ||||||
|  |  | ||||||
|  | 		header('Content-Type: application/json'); | ||||||
|  |  | ||||||
|  | 		switch ($obj['inputs'][0]['intent']) { | ||||||
|  | 			case 'action.devices.SYNC': | ||||||
|  | 			GoogleHome::sync($obj['requestId']); | ||||||
|  | 			$apiLogManager->write("[Google Home] action.devices.SYNC", LogRecordTypes::INFO); | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case 'action.devices.QUERY': | ||||||
|  | 			GoogleHome::query($obj['requestId'], $obj['inputs'][0]['payload']); | ||||||
|  | 			$apiLogManager->write("[Google Home] action.devices.QUERY", LogRecordTypes::INFO); | ||||||
|  | 			$apiLogManager->write("[API] request body\n" . json_encode($obj, JSON_PRETTY_PRINT), LogRecordTypes::INFO); | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case 'action.devices.EXECUTE': | ||||||
|  |  | ||||||
|  | 			GoogleHome::execute($obj['requestId'], $obj['inputs'][0]['payload']); | ||||||
|  | 			$apiLogManager->write("[Google Home] action.devices.EXECUTE", LogRecordTypes::INFO); | ||||||
|  | 			$apiLogManager->write("[API] request body\n" . json_encode($obj, JSON_PRETTY_PRINT), LogRecordTypes::INFO); | ||||||
|  |  | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		unset($apiLogManager); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	static function autorize(){ | ||||||
|  | 		$json = file_get_contents('php://input'); | ||||||
|  | 		$obj = json_decode($json, true); | ||||||
|  |  | ||||||
|  | 		$apiLogManager = new LogManager('../logs/google-home/'. date("Y-m-d").'.log'); | ||||||
|  | 		$apiLogManager->setLevel(LOGLEVEL); | ||||||
|  | 		$apiLogManager->write("[API] request body\n" . json_encode($obj, JSON_PRETTY_PRINT), LogRecordTypes::INFO); | ||||||
|  | 		$apiLogManager->write("[API] GET body\n" . json_encode($_GET, JSON_PRETTY_PRINT), LogRecordTypes::INFO); | ||||||
|  | 		unset($apiLogManager); | ||||||
|  |  | ||||||
|  | 		$get = [ | ||||||
|  | 			"access_token"=>"2222255888", //TODO: FIX | ||||||
|  | 			"token_type"=>"Bearer", | ||||||
|  | 			"state"=>$_GET["state"], | ||||||
|  | 		]; | ||||||
|  |  | ||||||
|  | 		echo $_GET["redirect_uri"] . '#' . http_build_query($get) ; | ||||||
|  | 		echo '<a href="'.$_GET["redirect_uri"] . '#' . http_build_query($get) . '">FINISH</a>'; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								app/api/PluginsApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								app/api/PluginsApi.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | <?php | ||||||
|  | class PluginsApi extends ApiController{ | ||||||
|  |  | ||||||
|  | 	public function default(){ | ||||||
|  | 		$this->requireAuth(); | ||||||
|  | 		$response = []; | ||||||
|  |  | ||||||
|  | 		// TODO: process the request | ||||||
|  |  | ||||||
|  | 		$this->response($response); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								app/api/RecordApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								app/api/RecordApi.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | class RecordApi extends ApiController{ | ||||||
|  |  | ||||||
|  | 	public function default(){ | ||||||
|  | 		//$this->requireAuth(); | ||||||
|  | 		$response = []; | ||||||
|  | 		$roomIds = []; | ||||||
|  | 		$roomsData = RoomManager::getRoomsDefault(); | ||||||
|  |  | ||||||
|  | 		foreach ($roomsData as $roomKey => $room) { | ||||||
|  | 			$roomIds[] = $room['room_id']; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$subDevicesData = SubDeviceManager::getSubdevicesByRoomIds($roomIds); | ||||||
|  |  | ||||||
|  | 		foreach ($roomsData as $roomKey => $roomData) { | ||||||
|  | 			$response[] = [ | ||||||
|  | 				'room_id' => $roomData['room_id'], | ||||||
|  | 				'name' => $roomData['name'], | ||||||
|  | 				'widgets' => isset($subDevicesData[$roomData['room_id']]) ? $subDevicesData[$roomData['room_id']] : [], | ||||||
|  | 			]; | ||||||
|  | 		} | ||||||
|  | 		$this->response($response); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										63
									
								
								app/api/RoomsApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								app/api/RoomsApi.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | class RoomsApi extends ApiController | ||||||
|  | { | ||||||
|  | 	 | ||||||
|  | 	public function	default() | ||||||
|  | 	{ | ||||||
|  | 		//$this->requireAuth(); | ||||||
|  | 		$response = []; | ||||||
|  | 		$roomIds = []; | ||||||
|  | 		$roomsData = RoomManager::getRoomsDefault(); | ||||||
|  | 		 | ||||||
|  | 		foreach ($roomsData as $roomKey => $room) { | ||||||
|  | 			$roomIds[] = $room['room_id']; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		//Translation Of Numeric Walues | ||||||
|  | 		$subDevicesData = SubDeviceManager::getSubdevicesByRoomIds($roomIds); | ||||||
|  | 		foreach ($subDevicesData as $subDeviceKey => $subDevice) { | ||||||
|  | 			foreach ($subDevice as $key => $value) { | ||||||
|  | 				$type = null; | ||||||
|  | 				if (strpos($subDevicesData[$subDeviceKey][$key]['type'], '-') !== false) { | ||||||
|  | 					$type = $subDevicesData[$subDeviceKey][$key]['type']; | ||||||
|  | 				} else if (strpos(SubDeviceManager::getSubDeviceMaster($subDevicesData[$subDeviceKey][$key]['subdevice_id'])['type'], '-') !== false) { | ||||||
|  | 					$type = SubDeviceManager::getSubDeviceMaster($subDevicesData[$subDeviceKey][$key]['subdevice_id'])['type']; | ||||||
|  | 				} else { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				 | ||||||
|  | 				$cammelCaseClass = ""; | ||||||
|  | 				foreach (explode('-', $type) as $word) { | ||||||
|  | 					$cammelCaseClass .= ucfirst($word); | ||||||
|  | 				} | ||||||
|  | 				if (!class_exists($cammelCaseClass)) { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				$deviceClass = new $cammelCaseClass; | ||||||
|  | 				if (!method_exists($deviceClass, 'translate')) { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				$subDevicesData[$subDeviceKey][$key]['value'] = $deviceClass->translate($subDevicesData[$subDeviceKey][$key]['value']); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		foreach ($roomsData as $roomKey => $roomData) { | ||||||
|  | 			if ($roomData['device_count'] == 0) continue; | ||||||
|  | 			$response[] = [ | ||||||
|  | 				'room_id' => $roomData['room_id'], | ||||||
|  | 				'name' => $roomData['name'], | ||||||
|  | 				'widgets' => isset($subDevicesData[$roomData['room_id']]) ? $subDevicesData[$roomData['room_id']] : [], | ||||||
|  | 			]; | ||||||
|  | 		} | ||||||
|  | 		$this->response($response); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public function update($roomId) | ||||||
|  | 	{ | ||||||
|  | 		//$this->requireAuth(); | ||||||
|  | 		 | ||||||
|  | 		$subDevicesData = SubDeviceManager::getSubdevicesByRoomIds([$roomId]); | ||||||
|  | 		$this->response($subDevicesData); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										43
									
								
								app/api/ServerApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								app/api/ServerApi.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | |||||||
|  | <?php | ||||||
|  | class ServerApi extends ApiController { | ||||||
|  |     private function getSystemMemInfo() | ||||||
|  | 	{ | ||||||
|  | 		$data = explode("\n", file_get_contents("/proc/meminfo")); | ||||||
|  | 		$meminfo = array(); | ||||||
|  | 		foreach ($data as $line) { | ||||||
|  | 			$data = explode(":", $line); | ||||||
|  | 			if (count($data)!=2) continue; | ||||||
|  | 			$meminfo[$data[0]] = trim($data[1]); | ||||||
|  | 		} | ||||||
|  | 		return $meminfo; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private function getProcessorUsage(){ | ||||||
|  | 		$loads=sys_getloadavg(); | ||||||
|  | 		$core_nums=trim(shell_exec("grep -P '^physical id' /proc/cpuinfo|wc -l")); | ||||||
|  | 		$load = round($loads[0]/($core_nums + 1)*100, 2); | ||||||
|  | 		return $load; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  |     public function default(){ | ||||||
|  |         //$this->requireAuth(); | ||||||
|  |         $response = [ | ||||||
|  |             "cpu_load" => $this->getProcessorUsage(), | ||||||
|  |             "uptime" => shell_exec('uptime -p'), | ||||||
|  |             "ramFree" => $this->getSystemMemInfo()["MemFree"], | ||||||
|  |             "ramTotal" => $this->getSystemMemInfo()["MemTotal"], | ||||||
|  |             "diskFree" => disk_free_space("/"), | ||||||
|  |             "diskTotal" => disk_total_space("/"), | ||||||
|  |             "serverTime" => date('m. d. Y H:i:s'), | ||||||
|  |             "serverTimeZone" => date('e'), | ||||||
|  |         ]; | ||||||
|  |         $this->response($response); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public function logStatus() | ||||||
|  |     { | ||||||
|  |         $logKeeper = new LogMaintainer(); | ||||||
|  |         $response = $logKeeper::getStats(); | ||||||
|  |         $this->response($response); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										85
									
								
								app/api/UpdatesApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								app/api/UpdatesApi.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | |||||||
|  | <?php | ||||||
|  | class UpdatesApi { | ||||||
|  |     private function sendFile($path)	{ | ||||||
|  |         header($_SERVER["SERVER_PROTOCOL"] . ' 200 OK', true, 200); | ||||||
|  |         header('Content-Type: application/octet-stream', true); | ||||||
|  |         header('Content-Disposition: attachment; filename=' . basename($path)); | ||||||
|  |         header('Content-Length: ' . filesize($path), true); | ||||||
|  |         header('x-MD5: ' . md5_file($path), true); | ||||||
|  |         readfile($path); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private function validateHeader($headers){ | ||||||
|  |         if ( | ||||||
|  |             isset($_SERVER['HTTP_X_ESP8266_STA_MAC']) && | ||||||
|  |             isset($_SERVER['HTTP_X_ESP8266_SKETCH_MD5']) | ||||||
|  |         ) { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public function default(){ | ||||||
|  |         $logManager = new LogManager('../logs/ota/'. date("Y-m-d").'.log'); | ||||||
|  |         $logManager->setLevel(LOGLEVEL); | ||||||
|  |         $logManager->write("[Updater] Client Connected", LogRecordTypes::INFO); | ||||||
|  |  | ||||||
|  |       //   if($this->validateHeader($_SERVER)){ | ||||||
|  |       //       header($_SERVER["SERVER_PROTOCOL"]." 400 Bad Header"); | ||||||
|  |       //       die(); | ||||||
|  |       //   } | ||||||
|  |  | ||||||
|  |         header('Content-type: text/plain; charset=utf8', true); | ||||||
|  |  | ||||||
|  |         // //Filtrování IP adress | ||||||
|  |         // if (DEBUGMOD != 1) { | ||||||
|  |         //     if (!in_array($_SERVER['REMOTE_ADDR'], HOMEIP)) { | ||||||
|  |         //         echo json_encode(array( | ||||||
|  |         //             'state' => 'unsuccess', | ||||||
|  |         //             'errorMSG' => "Using API from your IP insnt alowed!", | ||||||
|  |         //         )); | ||||||
|  |         //         header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized"); | ||||||
|  |         //         $logManager->write("[Updater] acces denied from " . $_SERVER['REMOTE_ADDR'], LogRecordTypes::INFO); | ||||||
|  |         //         exit(); | ||||||
|  |         //     } | ||||||
|  |         // } | ||||||
|  |  | ||||||
|  |         $macAddress = $_SERVER['HTTP_X_ESP8266_STA_MAC']; | ||||||
|  |         $localBinary = "../updater/" . str_replace(':', '', $macAddress) . ".bin"; | ||||||
|  |         $logManager->write("[Updater] url: " . $localBinary, LogRecordTypes::INFO); | ||||||
|  |         $logManager->write("[Updater] version:      " . $_SERVER['HTTP_X_ESP8266_SKETCH_MD5'], LogRecordTypes::INFO); | ||||||
|  |         if (file_exists($localBinary)) { | ||||||
|  |             $logManager->write("[Updater] version PHP: " . md5_file($localBinary), LogRecordTypes::INFO); | ||||||
|  |             if ($_SERVER['HTTP_X_ESP8266_SKETCH_MD5'] != md5_file($localBinary)) { | ||||||
|  |                 $this->sendFile($localBinary); | ||||||
|  |                 //get device data | ||||||
|  |                 $device = DeviceManager::getDeviceByMac($macAddress); | ||||||
|  |                 $deviceName = $device['name']; | ||||||
|  |                 $deviceId = $device['device_id']; | ||||||
|  |                 //logfile write | ||||||
|  |                 $logManager->write("[Device] device_ID " . $deviceId . " was just updated to new version", LogRecordTypes::INFO); | ||||||
|  |                 $logManager->write("[Device] version hash: " . md5_file($localBinary), LogRecordTypes::INFO); | ||||||
|  |                 //notification | ||||||
|  |                 $notificationMng = new NotificationManager; | ||||||
|  |                 $notificationData = [ | ||||||
|  |                     'title' => 'Info', | ||||||
|  |                     'body' => $deviceName.' was just updated to new version', | ||||||
|  |                     'icon' => BASEDIR . '/app/templates/images/icon-192x192.png', | ||||||
|  |                 ]; | ||||||
|  |                 if ($notificationData != []) { | ||||||
|  |                     $subscribers = $notificationMng->getSubscription(); | ||||||
|  |                     foreach ($subscribers as $key => $subscriber) { | ||||||
|  |                         $logManager->write("[NOTIFICATION] SENDING TO " . $subscriber['id'] . " ", LogRecordTypes::INFO); | ||||||
|  |                         $answer = $notificationMng->sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } else { | ||||||
|  |                 header($_SERVER["SERVER_PROTOCOL"].' 304 Not Modified', true, 304); | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); | ||||||
|  |         } | ||||||
|  |         die(); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								app/api/UsersApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								app/api/UsersApi.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | <?php | ||||||
|  | class UsersApi extends ApiController{ | ||||||
|  | 	public function default(){ | ||||||
|  | 		//$this->requireAuth(); | ||||||
|  | 		$response = null; | ||||||
|  |  | ||||||
|  | 		$users = UserManager::getUsers(["user_id", "username", "at_home"]); | ||||||
|  |  | ||||||
|  | 		foreach ($users as $key => $user) { | ||||||
|  | 			$response[] = [ | ||||||
|  | 				"userName" => $user['username'], | ||||||
|  | 				"homeStatus" => ($user['at_home'] == 'true') ? true : false, | ||||||
|  | 				"avatarUrl" => UserManager::getAvatarUrl($user['user_id']), | ||||||
|  | 			]; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$this->response($response); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function status(){ | ||||||
|  | 		//$this->requireAuth(); | ||||||
|  | 		$response = null; | ||||||
|  | 		$obj = $this->input; | ||||||
|  | 		$atHome = $obj['atHome']; | ||||||
|  |  | ||||||
|  | 		$user = UserManager::getUser($obj['user']); | ||||||
|  | 		$userAtHome = $user['at_home']; | ||||||
|  | 		$userId = $user['user_id']; | ||||||
|  |  | ||||||
|  | 		if (!empty($user)) { | ||||||
|  | 			if($userAtHome != $atHome){ | ||||||
|  | 				UserManager::atHome($userId, $atHome); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		$this->response(['value'=>'OK']); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										151
									
								
								app/api/WidgetApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								app/api/WidgetApi.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,151 @@ | |||||||
|  | <?php | ||||||
|  | class WidgetApi extends ApiController | ||||||
|  | { | ||||||
|  |  | ||||||
|  | 	public function run($subDeviceId) | ||||||
|  | 	{ | ||||||
|  | 		//$this->requireAuth(); | ||||||
|  |  | ||||||
|  | 		$response = null; | ||||||
|  | 		if (RecordManager::getLastRecord($subDeviceId)['execuded'] === 0) { | ||||||
|  | 			throw new Exception("Unreachable", 409); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$subDeviceData = SubDeviceManager::getSubDevice($subDeviceId); | ||||||
|  | 		if ($subDeviceData['type'] == 'on/off') { | ||||||
|  | 			$lastValue = RecordManager::getLastRecord($subDeviceData['subdevice_id'])['value']; | ||||||
|  | 			RecordManager::create($subDeviceData['device_id'], 'on/off', (int) !$lastValue); | ||||||
|  | 			$response = !$lastValue; | ||||||
|  | 		} else { | ||||||
|  | 			throw new Exception("Bad Request", 403); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$i = 0; | ||||||
|  | 		$timeout = 20; | ||||||
|  | 		while (RecordManager::getLastRecord($subDeviceId)['execuded'] == 0) { | ||||||
|  | 			if ($i == $timeout) { | ||||||
|  | 				throw new Exception("Timeout", 444); | ||||||
|  | 			} | ||||||
|  | 			$i++; | ||||||
|  | 			usleep(250000); | ||||||
|  | 		} | ||||||
|  | 		$this->response(['value' => $response]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function detail($subDeviceId, $period = "day") | ||||||
|  | 	{ | ||||||
|  | 		//$this->requireAuth(); | ||||||
|  |  | ||||||
|  | 		$groupBy = [ | ||||||
|  | 			"year" => "month", | ||||||
|  | 			"month" => "day", | ||||||
|  | 			"day" => "hour", | ||||||
|  | 			"hout" => "minute", | ||||||
|  | 		]; | ||||||
|  |  | ||||||
|  | 		$response = null; | ||||||
|  | 		$connectionError = true; | ||||||
|  |  | ||||||
|  | 		$subDeviceData = SubDeviceManager::getSubDevice($subDeviceId); | ||||||
|  | 		$deviceData = DeviceManager::getDeviceById($subDeviceData['device_id']); | ||||||
|  |  | ||||||
|  | 		//TODO: zeptat se @Patrik Je Graf Dobře Seřazený na DESC ? | ||||||
|  | 		$events = RecordManager::getAllRecordForGraph($subDeviceId, $period, $groupBy[$period]); | ||||||
|  | 		if ( count($events) == 0){ | ||||||
|  | 			throw new Exception("No Records", 404); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		//Striping executed value from dataset if pasiv device such as Senzor ETC | ||||||
|  | 		if ($subDeviceData['type'] != "on/off") { | ||||||
|  | 			foreach ($events as $key => $event) { | ||||||
|  | 				unset($events[$key]['execuded']); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$LastRecordTime = new DateTime(reset($events)['time']); | ||||||
|  | 		$niceTime = Utilities::ago($LastRecordTime); | ||||||
|  |  | ||||||
|  | 		$interval = $LastRecordTime->diff(new DateTime()); | ||||||
|  | 		$hours   = $interval->format('%h'); | ||||||
|  | 		$minutes = $interval->format('%i'); | ||||||
|  | 		$lastSeen = ($hours * 60 + $minutes); | ||||||
|  |  | ||||||
|  | 		if ( | ||||||
|  | 			$lastSeen < $deviceData['sleep_time'] || | ||||||
|  | 			$subDeviceData['type'] == "on/off" || | ||||||
|  | 			$subDeviceData['type'] == "door" || | ||||||
|  | 			$subDeviceData['type'] == "wather" | ||||||
|  | 		) { | ||||||
|  | 			$connectionError = false; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$labels = []; | ||||||
|  | 		$values = []; | ||||||
|  | 		foreach ($events as $key => $event) { | ||||||
|  | 			$recordDatetime = new DateTime($event['time']); | ||||||
|  | 			if ($key == 0){ | ||||||
|  | 				$labels[] = 'now'; | ||||||
|  | 			} else { | ||||||
|  | 				$labels[] = $recordDatetime->format('H:i'); | ||||||
|  | 			} | ||||||
|  | 			$values[] = [ | ||||||
|  | 				'y' => $event['value'], | ||||||
|  | 				't' => $recordDatetime->getTimestamp() * 1000, | ||||||
|  | 			]; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$response = [ | ||||||
|  | 			'records' => $events, | ||||||
|  | 			'graph' => [ | ||||||
|  | 				'type' => $this->getDeviceConfig($subDeviceData['type'])['graph'], | ||||||
|  | 				'data' => [ | ||||||
|  | 					'labels' => $labels, | ||||||
|  | 					'datasets' => [[ | ||||||
|  | 						//'label' => 'FUCK you', | ||||||
|  | 						'data' => $values, | ||||||
|  | 					]], | ||||||
|  | 				], | ||||||
|  | 				'options' => [ | ||||||
|  | 					'scales' => [ | ||||||
|  | 						'xAxis' => [[ | ||||||
|  | 							'type' => 'time', | ||||||
|  | 							'distribution' => 'linear', | ||||||
|  | 						]], | ||||||
|  |  | ||||||
|  | 					], | ||||||
|  | 					'legend' => [ | ||||||
|  | 						'display' => false | ||||||
|  | 					], | ||||||
|  | 					'tooltips' => [ | ||||||
|  | 						'enabled' => true | ||||||
|  | 					], | ||||||
|  | 					'hover' => [ | ||||||
|  | 						'mode' => true | ||||||
|  | 					], | ||||||
|  | 				], | ||||||
|  | 			], | ||||||
|  | 			'comError' => $connectionError, | ||||||
|  | 			'lastConnectionTime' => (empty($niceTime) ? "00:00" : $niceTime), | ||||||
|  | 		]; | ||||||
|  |  | ||||||
|  | 		//TODO: Make Cleaner  | ||||||
|  | 		if (isset(RANGES[$subDeviceData['type']])){ | ||||||
|  | 			$response['graph']['options']['scales']['yAxes'] = [[ | ||||||
|  | 				'ticks' => [ | ||||||
|  | 					'min' => RANGES[$subDeviceData['type']]['min'], | ||||||
|  | 					'max' => RANGES[$subDeviceData['type']]['max'], | ||||||
|  | 					'steps' => RANGES[$subDeviceData['type']]['scale'], | ||||||
|  | 				] | ||||||
|  | 			]]; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		$this->response($response); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	private function getDeviceConfig($type){ | ||||||
|  | 		if (isset(RANGES[$type])){ | ||||||
|  | 			return RANGES[$type]; | ||||||
|  | 		} | ||||||
|  | 		return RANGES['']; | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -1,30 +0,0 @@ | |||||||
| <?php |  | ||||||
|  |  | ||||||
| class ApiManager { |  | ||||||
|     public function generateToken($username, $password){ |  | ||||||
|         $userManager = new UserManager(); |  | ||||||
|         if ($username != '' || $password != ''){                |  | ||||||
|             $userLogedIn = $userManager->loginNew($username, $password); |  | ||||||
|                  |  | ||||||
|             if ($userLogedIn != false){ |  | ||||||
|                 // Create token header as a JSON string |  | ||||||
|                 $header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']); |  | ||||||
|                 // Create token payload as a JSON string |  | ||||||
|                 $payload = json_encode(['user_id' => $userLogedIn]); |  | ||||||
|                 // Encode Header to Base64Url String |  | ||||||
|                 $base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header)); |  | ||||||
|                 // Encode Payload to Base64Url String |  | ||||||
|                 $base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload)); |  | ||||||
|                 // Create Signature Hash |  | ||||||
|                 $signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, 'abC123!', true); |  | ||||||
|                 // Encode Signature to Base64Url String |  | ||||||
|                 $base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature)); |  | ||||||
|                 // Create JWT |  | ||||||
|                 $jwt = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature; |  | ||||||
|                  |  | ||||||
|                 return $jwt; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,60 +0,0 @@ | |||||||
| <?php |  | ||||||
| /** |  | ||||||
| * |  | ||||||
| */ |  | ||||||
|  |  | ||||||
| class LogRecordType{ |  | ||||||
| 	const WARNING = 'warning'; |  | ||||||
| 	const ERROR = 'error'; |  | ||||||
| 	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 |  | ||||||
| { |  | ||||||
|  |  | ||||||
| 	private $logFile; |  | ||||||
| 	function __construct($fileName = "") |  | ||||||
| 	{ |  | ||||||
| 		if ($fileName == ""){ |  | ||||||
| 			$fileName = './app/logs/'. date("Y-m-d").'.log'; |  | ||||||
| 		} |  | ||||||
| 		if(!is_dir("./app/logs/")) |  | ||||||
| 		{ |  | ||||||
| 			mkdir("./app/logs/"); |  | ||||||
| 		} |  | ||||||
| 		$this->logFile = fopen($fileName, "a") or die("Unable to open file!"); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	function write($value, $type = LogRecordType::ERROR){ |  | ||||||
| 		$record = "[".date("H:m:s")."][".$type."]" . $value . "\n"; |  | ||||||
| 		if (strlen($record) > 65 ) { |  | ||||||
| 			$record = Utilities::stringInsert($record,"\n",65); |  | ||||||
| 		}  |  | ||||||
| 		fwrite($this->logFile, $record); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	function __destruct(){ |  | ||||||
| 		if (isset($this->logFile)) { |  | ||||||
| 			fclose($this->logFile); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @@ -1,31 +0,0 @@ | |||||||
| <?php |  | ||||||
| class RoomManager{ |  | ||||||
| 	public static $rooms; |  | ||||||
|  |  | ||||||
| 	function getDefaultRoomId() { |  | ||||||
| 		$defaultRoom = Db::loadOne("SELECT room_id FROM rooms WHERE 'default' = 1"); |  | ||||||
| 		return $defaultRoom['room_id']; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	function getAllRooms () { |  | ||||||
| 		$allRoom = Db::loadAll ("SELECT rooms.*, COUNT(devices.device_id) as device_count FROM rooms LEFT JOIN devices ON (devices.room_id=rooms.room_id) GROUP BY rooms.room_id"); |  | ||||||
| 		return $allRoom; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	public function create ($name) { |  | ||||||
| 		$room = array ( |  | ||||||
| 			'name' => $name, |  | ||||||
| 		); |  | ||||||
| 		try { |  | ||||||
| 			Db::add ('rooms', $room); |  | ||||||
| 		} catch(PDOException $error) { |  | ||||||
| 			echo $error->getMessage(); |  | ||||||
| 			die(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	public function delete ($roomId) { |  | ||||||
| 		Db::command ('DELETE FROM rooms WHERE room_id=?', array ($roomId)); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| ?> |  | ||||||
| @@ -1,30 +0,0 @@ | |||||||
| <?php |  | ||||||
| class Route{ |  | ||||||
| 	private $urls = []; |  | ||||||
| 	private $views = []; |  | ||||||
|  |  | ||||||
| 	function __construct() { |  | ||||||
| 		// code... |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	function add($url, $view = "", $conrol = "") { |  | ||||||
| 		$this->urls[] = '/'.trim($url, '/'); |  | ||||||
| 		if (!empty($view)) { |  | ||||||
| 			$this->views[] = $view; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	function submit(){ |  | ||||||
| 		$urlGetParam = isset($_GET['url']) ? '/' . $_GET['url'] : '/'; |  | ||||||
| 		foreach ($this->urls as $urlKey => $urlValue) { |  | ||||||
| 			if ($urlValue === $urlGetParam) { |  | ||||||
| 				$useView = $this->views[$urlKey]; |  | ||||||
| 				new $useView(); |  | ||||||
| 				die(); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		echo 'Not Fount 404'; |  | ||||||
| 		die(); |  | ||||||
| 		//TODO: 404 přidělat |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @@ -1,34 +0,0 @@ | |||||||
| <?php |  | ||||||
| class Template extends Partial{ |  | ||||||
| 	var $assignedValues = []; |  | ||||||
| 	var $partBuffer; |  | ||||||
| 	var $path; |  | ||||||
| 	var $debug; |  | ||||||
|  |  | ||||||
| 	function __construct($path = "", $debug = false) { |  | ||||||
| 		$this->debug = $debug; |  | ||||||
| 		if (!empty('app/templates/' . $path . '.phtml') && file_exists('app/templates/' . $path . '.phtml')) { |  | ||||||
| 			$this->path = $path; |  | ||||||
| 		} else { |  | ||||||
| 			echo '<pre>'; |  | ||||||
| 			echo 'PHTML: Template File ' . $path . ' not found'; |  | ||||||
| 			echo '</pre>'; |  | ||||||
| 			die(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	function prepare($searchS, $repleaceS) { |  | ||||||
| 		if (!empty($searchS)) { |  | ||||||
| 			$this->assignedValues[strtoupper($searchS)] = $repleaceS; |  | ||||||
| 		} |  | ||||||
| 		echo ($this->debug == true ? var_dump($this->assignedValues) : ''); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	function render() { |  | ||||||
| 		extract($this->assignedValues); |  | ||||||
| 		if (!empty('app/controls/' . $this->path . '.php') && file_exists('app/controls/' . $this->path . '.php')) { |  | ||||||
| 			include('app/controls/' . $this->path . '.php'); |  | ||||||
| 		} |  | ||||||
| 		require_once('app/templates/' . $this->path . '.phtml'); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
							
								
								
									
										14
									
								
								app/controllers/ExampleController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								app/controllers/ExampleController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | class ExampleController extends Controller{ | ||||||
|  |  | ||||||
|  | 	public function index(){ | ||||||
|  | 		$this->view->title = 'Example title'; | ||||||
|  | 		$this->view->render('example.phtml'); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function subpage(){ | ||||||
|  | 		echo 'subpage'; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -32,7 +32,7 @@ if (isset($_POST) && !empty($_POST)){ | |||||||
| 
 | 
 | ||||||
| 		AutomationManager::create($_POST['name'], $onDays, $doCode, $ifCode); | 		AutomationManager::create($_POST['name'], $onDays, $doCode, $ifCode); | ||||||
| 
 | 
 | ||||||
| 		header('Location: ' . BASEDIR . strtolower(basename(__FILE__, '.php'))); | 		header('Location: ' . BASEURL . strtolower(basename(__FILE__, '.php'))); | ||||||
| 		die(); | 		die(); | ||||||
| 	} else if (isset($_POST['modalFinal']) && $_POST['action'] == "edit") { | 	} else if (isset($_POST['modalFinal']) && $_POST['action'] == "edit") { | ||||||
| 		$doCode = json_encode($_POST['device'], JSON_PRETTY_PRINT); | 		$doCode = json_encode($_POST['device'], JSON_PRETTY_PRINT); | ||||||
| @@ -70,7 +70,7 @@ if (isset($_POST) && !empty($_POST)){ | |||||||
| 
 | 
 | ||||||
| 		AutomationManager::create($_POST['name'], $onDays, $doCode, $ifCode, (isset ($_POST['automation_id']) ? $_POST['automation_id'] : "")); | 		AutomationManager::create($_POST['name'], $onDays, $doCode, $ifCode, (isset ($_POST['automation_id']) ? $_POST['automation_id'] : "")); | ||||||
| 
 | 
 | ||||||
| 		header('Location: ' . BASEDIR . strtolower(basename(__FILE__, '.php'))); | 		header('Location: ' . BASEURL . strtolower(basename(__FILE__, '.php'))); | ||||||
| 		die(); | 		die(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
							
								
								
									
										32
									
								
								app/controllers/deviceController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								app/controllers/deviceController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | <?php | ||||||
|  | if (!empty ($_POST)){ | ||||||
|  | 	$deviceManager = new DeviceManager (); | ||||||
|  | 	if (!empty ($_FILES['deviceFirmware']) && !empty ($_FILES['deviceFirmware']['tmp_name']) && !empty ($_POST['deviceId'])) { | ||||||
|  | 		$file = $_FILES['deviceFirmware']; | ||||||
|  | 		$deviceMac = $deviceManager->getDeviceById ($_POST['deviceId'])['mac']; | ||||||
|  | 		$fileName = (!empty ($deviceMac) ? str_replace (":", "", $deviceMac) . ".bin" : ""); | ||||||
|  |  | ||||||
|  | 		if ($fileName != "" && file_exists ("../updater/" . $fileName)) { | ||||||
|  | 			unlink("../updater/" . $fileName); | ||||||
|  | 		} | ||||||
|  | 		if ($fileName != "") { | ||||||
|  | 			copy ($file['tmp_name'], "../updater/" . $fileName); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if (isset ($_POST['deviceCommand'])  && !empty ($_POST['deviceId'])) { | ||||||
|  | 		$deviceManager->edit ($_POST['deviceId'], array ('command' => $_POST['deviceCommand'])); | ||||||
|  | 	} else if (!empty ($_POST['deviceCommand'])) { | ||||||
|  | 		$devices = $deviceManager->getAllDevices(); | ||||||
|  | 		foreach ($devices as $key => $device) { | ||||||
|  | 			$deviceManager->edit ($device['device_id'], array ('command' => $_POST['deviceCommand'])); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if (!empty ($_POST['deviceRoomId'])  && !empty ($_POST['deviceId'])) { | ||||||
|  | 		$deviceManager->edit ($_POST['deviceId'], array ('room_id' => $_POST['deviceRoomId'])); | ||||||
|  | 	} | ||||||
|  | 	if (!empty ($_POST['deviceName'])  && !empty ($_POST['deviceId'])) { | ||||||
|  | 		$deviceManager->edit ($_POST['deviceId'], array ('name' => $_POST['deviceName'])); | ||||||
|  | 	} | ||||||
|  | 	header('Location: ./device'); | ||||||
|  | 	die(); | ||||||
|  | } | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| <?php | <?php | ||||||
| global $userManager; | $userManager = new UserManager(); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| if ( | if ( | ||||||
| @@ -15,7 +15,7 @@ if ( | |||||||
| 	$ota = $userManager->haveOtaEnabled($userName); | 	$ota = $userManager->haveOtaEnabled($userName); | ||||||
| 	if ($ota == "") { | 	if ($ota == "") { | ||||||
| 		$landingPage = $userManager->login($userName, $userPassword, $rememberMe); | 		$landingPage = $userManager->login($userName, $userPassword, $rememberMe); | ||||||
| 		header('Location: ' . BASEDIR . $landingPage); | 		header('Location: ' . BASEURL . $landingPage); | ||||||
| 		die(); | 		die(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @@ -27,7 +27,6 @@ if ( | |||||||
| 	isset($_POST['otaCode']) && | 	isset($_POST['otaCode']) && | ||||||
| 	$_POST['otaCode'] != '' | 	$_POST['otaCode'] != '' | ||||||
| ) { | ) { | ||||||
| 
 |  | ||||||
| 	$otaCode = $_POST['otaCode']; | 	$otaCode = $_POST['otaCode']; | ||||||
| 	$otaSecret = $_POST['otaSecret']; | 	$otaSecret = $_POST['otaSecret']; | ||||||
| 
 | 
 | ||||||
| @@ -40,7 +39,7 @@ if ( | |||||||
| 	$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2);    // 2 = 2*30sec clock tolerance
 | 	$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2);    // 2 = 2*30sec clock tolerance
 | ||||||
| 	if ($checkResult) { | 	if ($checkResult) { | ||||||
| 		$landingPage = $userManager->login($userName, $userPassword, $rememberMe); | 		$landingPage = $userManager->login($userName, $userPassword, $rememberMe); | ||||||
| 		header('Location: ' . BASEDIR . $landingPage); | 		header('Location: ' . BASEURL . '/'); | ||||||
| 		echo 'OK'; | 		echo 'OK'; | ||||||
| 	} else { | 	} else { | ||||||
| 		echo 'FAILED'; | 		echo 'FAILED'; | ||||||
							
								
								
									
										75
									
								
								app/controllers/oauthController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								app/controllers/oauthController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | |||||||
|  | <?php | ||||||
|  | $userManager = new UserManager(); | ||||||
|  |  | ||||||
|  | if ( | ||||||
|  | 	isset($_POST['username']) && | ||||||
|  | 	$_POST['username'] != '' && | ||||||
|  | 	isset($_POST['password']) && | ||||||
|  | 	$_POST['password'] != '' | ||||||
|  | ){ | ||||||
|  | 	$ota = false; | ||||||
|  | 	$userName = $_POST['username']; | ||||||
|  | 	echo $_POST['username']; | ||||||
|  | 	$userPassword = $_POST['password']; | ||||||
|  | 	$state = $_POST["state"]; | ||||||
|  | 	$clientId = $_POST["clientId"]; | ||||||
|  | 	$ota = $userManager->haveOtaEnabled($userName); | ||||||
|  | 	if ($ota == "") { | ||||||
|  | 		$token = (new AuthManager)->getToken($userName,$userPassword, $clientId); | ||||||
|  | 		if (!$token) { | ||||||
|  | 			throw new Exception("Auth failed", 401); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$get = [ | ||||||
|  | 			"access_token"=>$token, | ||||||
|  | 			"token_type"=>"Bearer", | ||||||
|  | 			"state"=>$state, | ||||||
|  | 		]; | ||||||
|  |  | ||||||
|  | 		header('Location: ' . $_POST["redirectUrl"] . '#' . http_build_query($get)); | ||||||
|  | 		die(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$_SESSION['USERNAME'] = $userName; | ||||||
|  | 	$_SESSION['PASSWORD'] = $userPassword; | ||||||
|  | 	$_SESSION['OTA'] = $ota; | ||||||
|  | 	$_SESSION['STATE'] = $state; | ||||||
|  | 	$_SESSION['REDIRECT'] = $_POST["redirectUrl"]; | ||||||
|  | 	$_SESSION['CLIENT'] = $clientId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } else if ( | ||||||
|  | 	isset($_POST['otaCode']) && | ||||||
|  | 	$_POST['otaCode'] != '' | ||||||
|  | ) { | ||||||
|  | 	$otaCode = $_POST['otaCode']; | ||||||
|  | 	$otaSecret = $_POST['otaSecret']; | ||||||
|  |  | ||||||
|  | 	$userName = $_SESSION['USERNAME']; | ||||||
|  | 	$userPassword = $_SESSION['PASSWORD']; | ||||||
|  | 	$ota = $_SESSION['OTA']; | ||||||
|  | 	$oauthState = $_SESSION['STATE']; | ||||||
|  | 	$oauthRedirect = $_SESSION['REDIRECT']; | ||||||
|  | 	$oauthClientId = $_SESSION['CLIENT']; | ||||||
|  |  | ||||||
|  | 	$ga = new PHPGangsta_GoogleAuthenticator(); | ||||||
|  | 	$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2);    // 2 = 2*30sec clock tolerance | ||||||
|  | 	if ($checkResult) { | ||||||
|  | 		$token = (new AuthManager)->getToken($userName,$userPassword, $oauthClientId); | ||||||
|  | 		if (!$token) { | ||||||
|  | 			throw new Exception("Auth failed", 401); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$get = [ | ||||||
|  | 			"access_token"=>$token, | ||||||
|  | 			"token_type"=>"Bearer", | ||||||
|  | 			"state"=>$oauthState, | ||||||
|  | 		]; | ||||||
|  |  | ||||||
|  | 		header('Location: ' . $oauthRedirect . '#' . http_build_query($get)); | ||||||
|  | 		echo 'OK'; | ||||||
|  | 	} else { | ||||||
|  | 		echo 'FAILED'; | ||||||
|  | 	} | ||||||
|  | 	die(); | ||||||
|  | } | ||||||
							
								
								
									
										28
									
								
								app/controllers/pluginsController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/controllers/pluginsController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | <?php | ||||||
|  | if (!empty ($_POST)){ | ||||||
|  | 	if ( | ||||||
|  | 		isset ($_POST['name']) && | ||||||
|  | 		$_POST['name'] != '' && | ||||||
|  | 		!isset ($_POST['remove']) | ||||||
|  | 	) { | ||||||
|  | 		if ($_POST['status'] == "true") { | ||||||
|  | 			if (file_exists ($_SERVER['DOCUMENT_ROOT'] . BASEDIR . 'app/plugins/!' . $_POST['name'] . ".php")) { | ||||||
|  | 				rename($_SERVER['DOCUMENT_ROOT'] . BASEDIR . 'app/plugins/!' . $_POST['name'] . ".php", $_SERVER['DOCUMENT_ROOT'] . BASEDIR . 'app/plugins/' . $_POST['name'] . ".php"); | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			if (file_exists ($_SERVER['DOCUMENT_ROOT'] . BASEDIR . 'app/plugins/' . $_POST['name'] . ".php")) { | ||||||
|  | 				rename($_SERVER['DOCUMENT_ROOT'] . BASEDIR . 'app/plugins/' . $_POST['name'] . ".php", $_SERVER['DOCUMENT_ROOT'] . BASEDIR . 'app/plugins/!' . $_POST['name'] . ".php"); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		header('Location: ./plugins'); | ||||||
|  | 		die(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if ( | ||||||
|  | 		isset ($_POST['name']) && | ||||||
|  | 		$_POST['name'] != '' && | ||||||
|  | 		isset ($_POST['remove']) | ||||||
|  | 	) { | ||||||
|  | 		// | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -1,34 +1,34 @@ | |||||||
| <?php | <?php | ||||||
| if (isset($_POST) && !empty($_POST)){ | if (isset($_POST) && !empty($_POST)){ | ||||||
|  | 	$userManager = new UserManager(); | ||||||
| 	if (isset($_POST['submitPasswordChange']) && $_POST['submitPasswordChange'] != "") { | 	if (isset($_POST['submitPasswordChange']) && $_POST['submitPasswordChange'] != "") { | ||||||
| 		$oldPassword = $_POST['oldPassword']; | 		$oldPassword = $_POST['oldPassword']; | ||||||
| 		$newPassword = $_POST['newPassword1']; | 		$newPassword = $_POST['newPassword1']; | ||||||
| 		$newPassword2 = $_POST['newPassword2']; | 		$newPassword2 = $_POST['newPassword2']; | ||||||
| 		UserManager::changePassword($oldPassword, $newPassword, $newPassword2); | 		$userManager->changePassword($oldPassword, $newPassword, $newPassword2); | ||||||
| 		header('Location: ' . BASEDIR . 'logout'); | 		header('Location: ' . BASEURL . 'logout'); | ||||||
| 		die(); | 		die(); | ||||||
| 	} else if (isset($_POST['submitCreateUser']) && $_POST['submitCreateUser'] != "") { | 	} else if (isset($_POST['submitCreateUser']) && $_POST['submitCreateUser'] != "") { | ||||||
| 		$userName = $_POST['userName']; | 		$userName = $_POST['userName']; | ||||||
| 		$password = $_POST['userPassword']; | 		$password = $_POST['userPassword']; | ||||||
| 		UserManager::createUser($userName, $password); | 		$email = $_POST['userEmail']; | ||||||
| 		header('Location: ' . BASEDIR . 'setting'); | 		$userManager->createUser($userName, $password, $email); | ||||||
| 		die(); | 		header('Location: ' . BASEURL . 'setting'); | ||||||
| 	} else if (isset($_POST['submitCreateRoom']) && $_POST['submitCreateRoom'] != "") { |  | ||||||
| 		$roomName = $_POST['roomName']; |  | ||||||
| 		RoomManager::create($roomName); |  | ||||||
| 		header('Location: ' . BASEDIR . 'setting'); |  | ||||||
| 		die(); | 		die(); | ||||||
| 	} else if (isset($_POST['submitEnableOta']) && $_POST['submitEnableOta'] != "") { | 	} else if (isset($_POST['submitEnableOta']) && $_POST['submitEnableOta'] != "") { | ||||||
| 		echo $otaCode = $_POST['otaCode']; | 		$otaCode = $_POST['otaCode']; | ||||||
| 		echo $otaSecret = $_POST['otaSecret']; | 		$otaSecret = $_POST['otaSecret']; | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| 		$ga = new PHPGangsta_GoogleAuthenticator(); | 		$ga = new PHPGangsta_GoogleAuthenticator(); | ||||||
| 		$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2);    // 2 = 2*30sec clock tolerance
 | 		$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2);    // 2 = 2*30sec clock tolerance
 | ||||||
| 		 if ($checkResult) { | 		 if ($checkResult) { | ||||||
| 			 UserManager::setOta($otaCode, $otaSecret); | 			 $userManager->setOta($otaCode, $otaSecret); | ||||||
| 		 } | 		 } | ||||||
| 		header('Location: ' . BASEDIR . 'setting'); | 		header('Location: ' . BASEURL . 'setting'); | ||||||
|  | 		die(); | ||||||
|  | 	} else if (isset ($_POST['userPermission']) && !empty ($_POST['userID'])) { | ||||||
|  | 		$userManager->setUserDataAdmin("permission", $_POST['userPermission'], $_POST['userID']); | ||||||
|  | 		header('Location: ' . BASEURL . 'setting'); | ||||||
| 		die(); | 		die(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -1,13 +0,0 @@ | |||||||
| <?php |  | ||||||
| if (isset($_POST) && !empty($_POST)){ |  | ||||||
|  |  | ||||||
| 	if (isset($_POST['modalFinal']) && $_POST['modalFinal'] != "") { |  | ||||||
| 		$subDeviceIds = $_POST['devices']; |  | ||||||
| 		foreach ($subDeviceIds as $subDeviceId) { |  | ||||||
| 			DashboardManager::Add($subDeviceId); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	header('Location: ' . BASEDIR . strtolower(basename(__FILE__, '.php'))); |  | ||||||
| 	die(); |  | ||||||
| } |  | ||||||
| ?> |  | ||||||
| @@ -1,87 +0,0 @@ | |||||||
| <?php |  | ||||||
| if (isset($_POST) && !empty($_POST)){ |  | ||||||
| 	if (isset($_POST['saveDevice']) && $_POST['saveDevice'] != "") { |  | ||||||
| 		$deviceId = $_POST['deviceId']; |  | ||||||
| 		$deviceName = $_POST['deviceName']; |  | ||||||
| 		$deviceIcon = $_POST['deviceIcon']; |  | ||||||
| 		$sleepTime = 0; |  | ||||||
| 		if (isset($_FILES['deviceFirmware']) && isset($_FILES['deviceFirmware']['tmp_name']) && $_FILES['deviceFirmware']['tmp_name'] != "") { |  | ||||||
| 			$file = $_FILES['deviceFirmware']; |  | ||||||
| 			$deviceMac = DeviceManager::getDeviceById($deviceId)['mac']; |  | ||||||
| 			$fileName = (isset ($deviceMac) && $deviceMac != "" ? str_replace(":", "", $deviceMac) . ".bin" : ""); |  | ||||||
| 			if ($fileName != "" && file_exists("./app/updater/" . $fileName)) { |  | ||||||
| 				unlink("./app/updater/" . $fileName); |  | ||||||
| 			} |  | ||||||
| 			if ($fileName != "") { |  | ||||||
| 				copy($file['tmp_name'], "./app/updater/" . $fileName); |  | ||||||
| 			} else { |  | ||||||
|  |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if (isset($_POST['sleepTime'])) { |  | ||||||
| 			$sleepTime = $_POST['sleepTime']; |  | ||||||
| 		} |  | ||||||
| 		//TODO: if device isnt on off |  | ||||||
| 		$permissionsInJson = json_encode([ |  | ||||||
| 			(int) $_POST['permissionOwner'], |  | ||||||
| 			(int) $_POST['permissionOther'], |  | ||||||
| 		]); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 		$deviceOwnerUserId = $_POST['deviceOwnerUserId']; |  | ||||||
| 		$deviceOwnerRoomId = $_POST['deviceOwnerId']; |  | ||||||
|  |  | ||||||
| 		try { |  | ||||||
| 			$args = array( |  | ||||||
| 				'owner' => $deviceOwnerUserId, |  | ||||||
| 				'name' => $deviceName, |  | ||||||
| 				'icon' => $deviceIcon, |  | ||||||
| 				'permission' => $permissionsInJson, |  | ||||||
| 				'sleep_time' => $sleepTime, |  | ||||||
| 				'room_id' => $deviceOwnerRoomId, |  | ||||||
| 			); |  | ||||||
| 			DeviceManager::edit($deviceId, $args); |  | ||||||
| 		} catch (\Exception $e) { |  | ||||||
| 			echo $e->message(); |  | ||||||
|  |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 		//Debug |  | ||||||
| 		if (DEBUGMOD == 1) { |  | ||||||
| 			echo '<pre>'; |  | ||||||
| 			echo $permissionsInJson; |  | ||||||
| 			echo $deviceId; |  | ||||||
| 			var_dump(json_decode ($permissionsInJson)); |  | ||||||
| 			echo '</pre>'; |  | ||||||
| 			echo '<a href="' . BASEDIR .'">CONTINUE</a>'; |  | ||||||
| 			die(); |  | ||||||
| 		} |  | ||||||
| 	} else if (isset($_POST['approveDevice'])) { |  | ||||||
| 		$deviceId = $_POST['deviceId']; |  | ||||||
| 		$args = array( |  | ||||||
| 			'approved' => 1, |  | ||||||
| 		); |  | ||||||
| 		DeviceManager::edit($deviceId, $args); |  | ||||||
| 	} else if (isset($_POST['disableDevice'])) { |  | ||||||
| 		$deviceId = $_POST['deviceId']; |  | ||||||
| 		$args = array( |  | ||||||
| 			'approved' => 2, |  | ||||||
| 		); |  | ||||||
| 		DeviceManager::edit($deviceId, $args); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	//Debug |  | ||||||
| 	if (DEBUGMOD == 1) { |  | ||||||
| 		echo '<pre>'; |  | ||||||
| 		var_dump($POST); |  | ||||||
| 		echo '</pre>'; |  | ||||||
| 		echo '<a href="' . BASEDIR . '">CONTINUE</a>'; |  | ||||||
| 		die(); |  | ||||||
| 	} |  | ||||||
| 	header('Location: ' . BASEDIR ); |  | ||||||
| 	die(); |  | ||||||
| } |  | ||||||
| ?> |  | ||||||
| @@ -1,18 +0,0 @@ | |||||||
| <?php |  | ||||||
|  |  | ||||||
| if (isset($_POST) && !empty($_POST)){ |  | ||||||
| 	if (isset($_POST['submitFinal']) && $_POST['submitFinal'] != "") { |  | ||||||
| 		SceneManager::create($_POST['sceneIcon'], $_POST['sceneName'], json_encode($_POST['devices'])); |  | ||||||
| 		header('Location: ' . BASEDIR . strtolower(basename(__FILE__, '.php'))); |  | ||||||
| 		die(); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	//Debug |  | ||||||
| 	if (DEBUGMOD == 1) { |  | ||||||
| 		echo '<pre>'; |  | ||||||
| 		var_dump($_POST); |  | ||||||
| 		echo '</pre>'; |  | ||||||
| 		echo '<a href="/' . BASEDIR . strtolower(basename(__FILE__, '.php')).'">CONTINUE</a>'; |  | ||||||
| 		die(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| <?php |  | ||||||
| if (isset($_POST) && !empty($_POST)){ |  | ||||||
| 	if (isset($_POST['submitPasswordChange']) && $_POST['submitPasswordChange'] != "") { |  | ||||||
| 		$oldPassword = $_POST['oldPassword']; |  | ||||||
| 		$newPassword = $_POST['newPassword1']; |  | ||||||
| 		$newPassword2 = $_POST['newPassword2']; |  | ||||||
| 		UserManager::changePassword($oldPassword, $newPassword, $newPassword2); |  | ||||||
| 		header('Location: ' . BASEDIR . 'logout'); |  | ||||||
| 		die(); |  | ||||||
| 	} else if (isset($_POST['submitCreateUser']) && $_POST['submitCreateUser'] != "") { |  | ||||||
| 		$userName = $_POST['userName']; |  | ||||||
| 		$password = $_POST['userPassword']; |  | ||||||
| 		UserManager::createUser($userName, $password); |  | ||||||
| 		header('Location: ' . BASEDIR . 'setting'); |  | ||||||
| 		die(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
							
								
								
									
										476
									
								
								app/models/GoogleHome.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										476
									
								
								app/models/GoogleHome.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,476 @@ | |||||||
|  | <?php | ||||||
|  | class GoogleHome { | ||||||
|  | 	static function sync($requestId){ | ||||||
|  | 		$devices = []; | ||||||
|  | 		$roomsData = RoomManager::getAllRooms(); | ||||||
|  | 		foreach ($roomsData as $roomKey => $roomData) { | ||||||
|  | 			$devicesData = DeviceManager::getAllDevicesInRoom($roomData['room_id']); | ||||||
|  | 			foreach ($devicesData as $deviceKey => $deviceData) { | ||||||
|  | 				$traids = []; | ||||||
|  | 				$attributes = []; | ||||||
|  |  | ||||||
|  | 				//Google Compatibile Action Type | ||||||
|  | 				$actionType = GoogleHomeDeviceTypes::getAction($deviceData['type']); | ||||||
|  | 				if ($actionType == "") continue; | ||||||
|  |  | ||||||
|  | 				$subDevicesData = SubDeviceManager::getAllSubDevices($deviceData['device_id']); | ||||||
|  | 				foreach ($subDevicesData as $subDeviceKey => $subDeviceData) { | ||||||
|  | 					$deviceTraid = GoogleHomeDeviceTypes::getTraid($subDeviceData['type']); | ||||||
|  | 					if ($deviceTraid != "") { | ||||||
|  | 						$traids[] = $deviceTraid; | ||||||
|  | 					} | ||||||
|  |  | ||||||
|  | 					$deviceAttributes = GoogleHomeDeviceTypes::getAttribute($subDeviceData['type']); | ||||||
|  | 					if ($deviceAttributes != "") { | ||||||
|  | 						$attributes += $deviceAttributes; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				$tempDevice = [ | ||||||
|  | 					'id' => (string) $deviceData['device_id'], | ||||||
|  | 					'type' => $actionType, | ||||||
|  | 					'traits' => $traids, | ||||||
|  | 					'attributes' => $attributes, | ||||||
|  | 					'name' => [ | ||||||
|  | 						'name' => $deviceData['name'], | ||||||
|  | 					], | ||||||
|  |  | ||||||
|  | 					'willReportState' => false, | ||||||
|  | 					'roomHint' => $roomData['name'] | ||||||
|  | 				]; | ||||||
|  | 				if ($tempDevice['attributes'] == null) unset($tempDevice['attributes']); | ||||||
|  |  | ||||||
|  | 				//traids & Attributes | ||||||
|  | 				$devices[] = $tempDevice; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 		$response = [ | ||||||
|  | 			'requestId' => $requestId, | ||||||
|  | 			'payload' => [ | ||||||
|  | 				'agentUserId'=>'651351531531', | ||||||
|  | 				'devices' => array_values( $devices ), | ||||||
|  | 			], | ||||||
|  | 		]; | ||||||
|  |  | ||||||
|  | 		$apiLogManager = new LogManager('../logs/google-home/'. date("Y-m-d").'.log'); | ||||||
|  | 		$apiLogManager->setLevel(LOGLEVEL); | ||||||
|  | 		$apiLogManager->write("[API][$requestId] request response\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordTypes::INFO); | ||||||
|  | 		echo json_encode($response); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	static function query($requestId, $payload){ | ||||||
|  | 		$devices = []; | ||||||
|  | 		$num = 0; | ||||||
|  | 		foreach ($payload['devices'] as $deviceId) { | ||||||
|  | 			$subDevicesData = SubDeviceManager::getAllSubDevices($deviceId['id']); | ||||||
|  |  | ||||||
|  | 			$tempDevice[$deviceId['id']] = [ | ||||||
|  | 				'online' => false, | ||||||
|  | 				'status' => 'OFFLINE', | ||||||
|  | 			]; | ||||||
|  | 			foreach ($subDevicesData as $key => $subDeviceData) { | ||||||
|  | 				$lastRecord = RecordManager::getLastRecord($subDeviceData['subdevice_id']); | ||||||
|  | 				if ($lastRecord['execuded'] == 1){ | ||||||
|  | 					$tempDevice[$deviceId['id']]['online'] = true; | ||||||
|  | 					$tempDevice[$deviceId['id']]['status'] = "SUCCESS"; | ||||||
|  | 				} else { | ||||||
|  | 					$executed = 0; | ||||||
|  | 					$waiting = 0; | ||||||
|  | 					foreach (RecordManager::getLastRecord($deviceId['id'], 6) as $key => $value) { | ||||||
|  | 						if ($value['execuded'] == 1){ | ||||||
|  | 							$executed++; | ||||||
|  | 						} else { | ||||||
|  | 							$waiting++; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 					if ($waiting < $executed){ | ||||||
|  | 						$tempDevice[$deviceId['id']]['online'] = true; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				switch ($subDeviceData['type']) { | ||||||
|  | 					case 'temp_cont': | ||||||
|  | 						$tempDevice[$deviceId['id']]['thermostatMode'] = 'off'; | ||||||
|  | 						if ($lastRecord['value'] != 0) { | ||||||
|  | 							$tempDevice[$deviceId['id']]['thermostatMode'] = 'heat'; | ||||||
|  | 						} | ||||||
|  | 						$tempDevice[$deviceId['id']]['thermostatTemperatureAmbient'] = $lastRecord['value']; | ||||||
|  | 						$tempDevice[$deviceId['id']]['thermostatTemperatureSetpoint'] = $lastRecord['value']; | ||||||
|  | 					break; | ||||||
|  | 					case 'vol_cont': | ||||||
|  | 						$tempDevice[$deviceId['id']]['currentVolume'] = $lastRecord['value']; | ||||||
|  | 					break; | ||||||
|  | 					case 'media_apps': | ||||||
|  | 						$tempDevice[$deviceId['id']]['currentApplication'] = "kodi"; | ||||||
|  | 					break; | ||||||
|  | 					case 'media_input': | ||||||
|  | 						$tempDevice[$deviceId['id']]['currentInput'] = "pc"; | ||||||
|  | 					break; | ||||||
|  | 					case 'media_status': | ||||||
|  | 						$tempDevice[$deviceId['id']]['activityState'] = "ACTIVE"; | ||||||
|  | 						$tempDevice[$deviceId['id']]['playbackState'] = "PLAYING"; | ||||||
|  | 					break; | ||||||
|  | 					case 'on/off': | ||||||
|  | 						$tempDevice[$deviceId['id']]['on'] = ($lastRecord['value'] == 1 ? true : false); | ||||||
|  | 					break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if ($lastRecord['execuded'] == 1){ | ||||||
|  | 			$online = true; | ||||||
|  | 			$status = 'SUCCESS'; | ||||||
|  | 		} else { | ||||||
|  | 			$executed = 0; | ||||||
|  | 			$waiting = 0; | ||||||
|  | 			foreach (RecordManager::getLastRecord($deviceId['id'], 6) as $key => $value) { | ||||||
|  | 				if ($value['execuded'] == 1){ | ||||||
|  | 					$executed++; | ||||||
|  | 				} else { | ||||||
|  | 					$waiting++; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			if ($waiting < $executed){ | ||||||
|  | 				$status = "PENDING"; | ||||||
|  | 				$online = true; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		$devices = $tempDevice; | ||||||
|  | 		/*if (count($devices)> 1){ | ||||||
|  | 			$devices[] = $tempDevice; | ||||||
|  | 		}*/ | ||||||
|  | 	} | ||||||
|  | 	$response = [ | ||||||
|  | 		'requestId' => $requestId, | ||||||
|  | 		'payload' => [ | ||||||
|  | 			'devices' => $devices, | ||||||
|  | 		], | ||||||
|  | 	]; | ||||||
|  | 	$apiLogManager = new LogManager('../logs/google-home/'. date("Y-m-d").'.log'); | ||||||
|  | 	$apiLogManager->write("[API][$requestId] request response\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordTypes::INFO); | ||||||
|  | 	$apiLogManager->setLevel(LOGLEVEL); | ||||||
|  | 	echo json_encode($response); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static function execute($requestId, $payload){ | ||||||
|  | 	$commands = []; | ||||||
|  | 	foreach ($payload['commands'] as $key => $command) { | ||||||
|  | 		foreach ($command['devices'] as $key2 => $device) { | ||||||
|  | 			$executionCommand = $command['execution'][0]; | ||||||
|  | 			if (isset($command['execution'][$key])) { | ||||||
|  | 				$executionCommand = $command['execution'][$key]; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			$deviceType = GoogleHomeDeviceTypes::getType($executionCommand['command']); | ||||||
|  | 			$subDeviceId = SubDeviceManager::getSubDeviceByMasterAndType($device['id'], $deviceType)['subdevice_id']; | ||||||
|  | 			switch ($executionCommand['command']) { | ||||||
|  | 				case 'action.devices.commands.OnOff': | ||||||
|  | 					$commands[] = self::executeSwitch($subDeviceId, $executionCommand); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 				case 'action.devices.commands.ThermostatTemperatureSetpoint': | ||||||
|  | 					$commands[] = self::executeTermostatValue($subDeviceId, $executionCommand); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 				case 'action.devices.commands.ThermostatSetMode': | ||||||
|  | 					$commands[] = self::executeTermostatMode($subDeviceId, $executionCommand); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 				case 'action.devices.commands.setVolume': | ||||||
|  | 					$commands[] = self::executeVolume($subDeviceId, $executionCommand); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 				case 'action.devices.commands.appSelect': | ||||||
|  | 					$commands[] = self::executeApp($subDeviceId, $executionCommand); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 				case 'action.devices.commands.SetInput': | ||||||
|  | 					$commands[] = self::executeInput($subDeviceId, $executionCommand); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 				case 'action.devices.commands.mediaNext': | ||||||
|  | 					$commands[] = self::executeMediaCont($subDeviceId, $executionCommand); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 				case 'action.devices.commands.mediaPrevious': | ||||||
|  | 					$commands[] = self::executeMediaCont($subDeviceId, $executionCommand); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 				case 'action.devices.commands.mediaPause': | ||||||
|  | 					$commands[] = self::executeMediaCont($subDeviceId, $executionCommand); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 				case 'action.devices.commands.mediaResume': | ||||||
|  | 					$commands[] = self::executeMediaCont($subDeviceId, $executionCommand); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 				case 'action.devices.commands.mediaStop': | ||||||
|  | 					$commands[] = self::executeMediaCont($subDeviceId, $executionCommand); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	$response = [ | ||||||
|  | 		'requestId' => $requestId, | ||||||
|  | 		'payload' => [ | ||||||
|  | 			'commands' => $commands, | ||||||
|  | 		], | ||||||
|  | 	]; | ||||||
|  |  | ||||||
|  | 	$apiLogManager = new LogManager('../logs/google-home/'. date("Y-m-d").'.log'); | ||||||
|  | 	$apiLogManager->setLevel(LOGLEVEL); | ||||||
|  | 	$apiLogManager->write("[API][EXECUTE][$requestId]\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordTypes::INFO); | ||||||
|  |  | ||||||
|  | 	echo json_encode($response); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static function executeSwitch($subDeviceId, $executionCommand){ | ||||||
|  | 	$value = 0; | ||||||
|  | 	$status = 'OFFLINE'; | ||||||
|  | 	$online = false; | ||||||
|  |  | ||||||
|  | 	if ($executionCommand['params']['on']) $value = 1; | ||||||
|  |  | ||||||
|  | 	RecordManager::createWithSubId($subDeviceId, $value); | ||||||
|  |  | ||||||
|  | 	$executed = 0; | ||||||
|  | 	$waiting = 0; | ||||||
|  | 	foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) { | ||||||
|  | 		if ($value['execuded'] == 1){ | ||||||
|  | 			$executed++; | ||||||
|  | 		} else { | ||||||
|  | 			$waiting++; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if ($waiting < $executed){ | ||||||
|  | 		$status = "PENDING"; | ||||||
|  | 		$online = true; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id']; | ||||||
|  | 	$commandTemp = [ | ||||||
|  | 		'ids' => [(string) $deviceId], | ||||||
|  | 		'status' => $status, | ||||||
|  | 		'states' => [ | ||||||
|  | 			'on' => $executionCommand['params']['on'], | ||||||
|  | 			'online' => $online, | ||||||
|  | 		], | ||||||
|  | 	]; | ||||||
|  | 	return $commandTemp; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static function executeTermostatValue($subDeviceId, $executionCommand){ | ||||||
|  | 	$value = 0; | ||||||
|  | 	$status = 'OFFLINE'; | ||||||
|  | 	$online = false; | ||||||
|  |  | ||||||
|  | 	if (isset($executionCommand['params']['thermostatTemperatureSetpoint'])) { | ||||||
|  | 		$value = $executionCommand['params']['thermostatTemperatureSetpoint']; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	RecordManager::createWithSubId($subDeviceId, $value); | ||||||
|  |  | ||||||
|  | 	$executed = 0; | ||||||
|  | 	$waiting = 0; | ||||||
|  | 	foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $lastValue) { | ||||||
|  | 		if ($lastValue['execuded'] == 1){ | ||||||
|  | 			$executed++; | ||||||
|  | 		} else { | ||||||
|  | 			$waiting++; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if ($waiting < $executed){ | ||||||
|  | 		$status = "PENDING"; | ||||||
|  | 		$online = true;; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id']; | ||||||
|  | 	$commandTemp = [ | ||||||
|  | 		'ids' => [(string) $deviceId], | ||||||
|  | 		'status' => $status, | ||||||
|  | 		'states' => [ | ||||||
|  | 			'thermostatMode' => 'heat', | ||||||
|  | 			'thermostatTemperatureSetpoint' => $value, | ||||||
|  | 			'thermostatTemperatureAmbient' => $value, | ||||||
|  | 			'online' => $online, | ||||||
|  | 			//ambient z dalšího zenzoru v roomu | ||||||
|  | 		], | ||||||
|  | 	]; | ||||||
|  | 	return $commandTemp; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static function executeTermostatMode($subDeviceId, $executionCommand){ | ||||||
|  | 	$mode = "off"; | ||||||
|  | 	$value = 0; | ||||||
|  | 	$status = 'OFFLINE'; | ||||||
|  | 	$online = false; | ||||||
|  |  | ||||||
|  | 	if (isset($executionCommand['params']['thermostatMode']) && $executionCommand['params']['thermostatMode'] != 'off') { | ||||||
|  | 		$mode = $executionCommand['params']['thermostatMode']; | ||||||
|  | 		$value = RecordManager::getLastRecordNotNull($subDeviceId)['value']; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	RecordManager::createWithSubId($subDeviceId, $value); | ||||||
|  |  | ||||||
|  | 	$executed = 0; | ||||||
|  | 	$waiting = 0; | ||||||
|  | 	foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) { | ||||||
|  | 		if ($value['execuded'] == 1){ | ||||||
|  | 			$executed++; | ||||||
|  | 		} else { | ||||||
|  | 			$waiting++; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if ($waiting < $executed){ | ||||||
|  | 		$status = "PENDING"; | ||||||
|  | 		$online = true; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id']; | ||||||
|  | 	$commandTemp = [ | ||||||
|  | 		'ids' => [(string) $deviceId], | ||||||
|  | 		'status' => $status, | ||||||
|  | 		'states' => [ | ||||||
|  | 			'thermostatMode' => $mode, | ||||||
|  | 			'online' => $online, | ||||||
|  | 		], | ||||||
|  | 	]; | ||||||
|  |  | ||||||
|  | 	return $commandTemp; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static function executeVolume($subDeviceId, $executionCommand){ | ||||||
|  | 	//echo $executionCommand['params']['volumeLevel']; | ||||||
|  | 	$status = 'OFFLINE'; | ||||||
|  | 	$online = false; | ||||||
|  |  | ||||||
|  | 	$currentVolume = RecordManager::getLastRecord($subDeviceId)['value']; | ||||||
|  |  | ||||||
|  | 	if (isset($executionCommand['params']['volumeLevel'])) { | ||||||
|  | 		RecordManager::createWithSubId($subDeviceId, $executionCommand['params']['volumeLevel']); | ||||||
|  | 		$executed = 0; | ||||||
|  | 		$waiting = 0; | ||||||
|  | 		foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) { | ||||||
|  | 			if ($value['execuded'] == 1){ | ||||||
|  | 				$executed++; | ||||||
|  | 			} else { | ||||||
|  | 				$waiting++; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if ($waiting < $executed){ | ||||||
|  | 			$status = "PENDING"; | ||||||
|  | 			$online = true; | ||||||
|  | 			$currentVolume = $executionCommand['params']['volumeLevel']; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id']; | ||||||
|  | 	$commandTemp = [ | ||||||
|  | 		'ids' => [(string) $deviceId], | ||||||
|  | 		'status' => $status, | ||||||
|  | 		'states' => [ | ||||||
|  | 			'currentVolume' => $currentVolume, | ||||||
|  | 			'online' => $online, | ||||||
|  | 		], | ||||||
|  | 	]; | ||||||
|  |  | ||||||
|  | 	return $commandTemp; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static function executeApp($subDeviceId, $executionCommand){ | ||||||
|  | 	//echo $executionCommand['params']['newApplication']; | ||||||
|  | 	$status = 'OFFLINE'; | ||||||
|  | 	$online = false; | ||||||
|  |  | ||||||
|  | 	$currentApplication = RecordManager::getLastRecord($subDeviceId)['value']; | ||||||
|  |  | ||||||
|  | 	if (isset($executionCommand['params']['newApplication'])) { | ||||||
|  | 		RecordManager::createWithSubId($subDeviceId, $executionCommand['params']['newApplication']); | ||||||
|  | 		$executed = 0; | ||||||
|  | 		$waiting = 0; | ||||||
|  | 		foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) { | ||||||
|  | 			if ($value['execuded'] == 1){ | ||||||
|  | 				$executed++; | ||||||
|  | 			} else { | ||||||
|  | 				$waiting++; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if ($waiting < $executed){ | ||||||
|  | 			$status = "PENDING"; | ||||||
|  | 			$online = true; | ||||||
|  | 			$currentApplication = $executionCommand['params']['newApplication']; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id']; | ||||||
|  | 	$commandTemp = [ | ||||||
|  | 		'ids' => [(string) $deviceId], | ||||||
|  | 		'status' => $status, | ||||||
|  | 		'states' => [ | ||||||
|  | 			'currentApplication' => $currentApplication, | ||||||
|  | 			'online' => $online, | ||||||
|  | 		], | ||||||
|  | 	]; | ||||||
|  |  | ||||||
|  | 	return $commandTemp; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static function executeInput($subDeviceId, $executionCommand){ | ||||||
|  | 	//echo $executionCommand['params']['newInput']; | ||||||
|  | 	$status = 'OFFLINE'; | ||||||
|  | 	$online = false; | ||||||
|  |  | ||||||
|  | 	$currentInput = RecordManager::getLastRecord($subDeviceId)['value']; | ||||||
|  |  | ||||||
|  | 	if (isset($executionCommand['params']['newInput'])) { | ||||||
|  | 		RecordManager::createWithSubId($subDeviceId, $executionCommand['params']['newInput']); | ||||||
|  | 		$executed = 0; | ||||||
|  | 		$waiting = 0; | ||||||
|  | 		foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) { | ||||||
|  | 			if ($value['execuded'] == 1){ | ||||||
|  | 				$executed++; | ||||||
|  | 			} else { | ||||||
|  | 				$waiting++; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if ($waiting < $executed){ | ||||||
|  | 			$status = "PENDING"; | ||||||
|  | 			$online = true; | ||||||
|  | 			$currentInput = $executionCommand['params']['newInput']; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id']; | ||||||
|  | 	$commandTemp = [ | ||||||
|  | 		'ids' => [(string) $deviceId], | ||||||
|  | 		'status' => $status, | ||||||
|  | 		'states' => [ | ||||||
|  | 			'currentInput' => $currentInput, | ||||||
|  | 			'online' => $online, | ||||||
|  | 		], | ||||||
|  | 	]; | ||||||
|  |  | ||||||
|  | 	return $commandTemp; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static function executeMediaCont($subDeviceId, $executionCommand){ | ||||||
|  | 	$status = 'SUCCESS'; | ||||||
|  | 	$online = true; | ||||||
|  |  | ||||||
|  | 	$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id']; | ||||||
|  | 	$commandTemp = [ | ||||||
|  | 		'ids' => [(string) $deviceId], | ||||||
|  | 		'status' => $status, | ||||||
|  | 		'states' => [ | ||||||
|  | 			'online' => $online, | ||||||
|  | 		], | ||||||
|  | 	]; | ||||||
|  |  | ||||||
|  | 	return $commandTemp; | ||||||
|  | } | ||||||
|  | } | ||||||
| @@ -1,13 +1,13 @@ | |||||||
| <?php | <?php | ||||||
| class Partial{ | class Partial{ | ||||||
| 	var $assignedValues = []; | 	private $assignedValues = []; | ||||||
| 	var $partBuffer; | 	private $partBuffer; | ||||||
| 	var $path; | 	private $path; | ||||||
| 	var $debug; | 	private $debug; | ||||||
| 
 | 
 | ||||||
| 	function __construct($path = "", $debug = false) { | 	function __construct($path = "", $debug = false) { | ||||||
| 		$this->debug = $debug; | 		$this->debug = $debug; | ||||||
| 		if (!empty('app/templates/part/' . $path . '.phtml') && file_exists('app/templates/part/' . $path . '.phtml')) { | 		if (!empty('../app/views/templates/part/' . $path . '.phtml') && file_exists('../app/views/templates/part/' . $path . '.phtml')) { | ||||||
| 			$this->path = $path; | 			$this->path = $path; | ||||||
| 		} else { | 		} else { | ||||||
| 			echo '<pre>'; | 			echo '<pre>'; | ||||||
| @@ -29,6 +29,6 @@ class Partial{ | |||||||
| 			extract($this->assignedValues); | 			extract($this->assignedValues); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		require('app/templates/part/' . $this->path . '.phtml'); | 		require('../app/views/templates/part/' . $this->path . '.phtml'); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -1,10 +1,12 @@ | |||||||
| <?php | <?php | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
| * |  * | ||||||
| */ |  */ | ||||||
| class Utilities | class Utilities | ||||||
| { | { | ||||||
| 	function cleanString($text) { | 	static function cleanString($text) | ||||||
|  | 	{ | ||||||
| 		$utf8 = array( | 		$utf8 = array( | ||||||
| 			'/[áàâãªä]/u'   =>   'a', | 			'/[áàâãªä]/u'   =>   'a', | ||||||
| 			'/[ÁÀÂÃÄ]/u'    =>   'A', | 			'/[ÁÀÂÃÄ]/u'    =>   'A', | ||||||
| @@ -36,21 +38,22 @@ class Utilities | |||||||
| 		return preg_replace(array_keys($utf8), array_values($utf8), $text); | 		return preg_replace(array_keys($utf8), array_values($utf8), $text); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function stringInsert($str,$insertstr,$pos) | 	static function stringInsert($str, $insertstr, $pos) | ||||||
| 	{ | 	{ | ||||||
| 		$str = substr($str, 0, $pos) . $insertstr . substr($str, $pos); | 		$str = substr($str, 0, $pos) . $insertstr . substr($str, $pos); | ||||||
| 		return $str; | 		return $str; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
| 	* [generateGraphJson description] | 	 * [generateGraphJson description] | ||||||
| 	* @param  string $type    [line/bar] | 	 * @param  string $type    [line/bar] | ||||||
| 	* @param  array  $data    [description] | 	 * @param  array  $data    [description] | ||||||
| 	* @param  array  $options [description] | 	 * @param  array  $options [description] | ||||||
| 	* @return [type]          [description] | 	 * @return [type]          [description] | ||||||
| 	*/ | 	 */ | ||||||
| 
 | 
 | ||||||
| 	function generateGraphJson(string $type = 'line', array $data = [], array $options = []){ | 	static function generateGraphJson(string $type = 'line', array $data = [], array $options = []) | ||||||
|  | 	{ | ||||||
| 		$array = [ | 		$array = [ | ||||||
| 			'type' => $type, | 			'type' => $type, | ||||||
| 			'data' => [ | 			'data' => [ | ||||||
| @@ -94,51 +97,85 @@ class Utilities | |||||||
| 		return json_encode($array, JSON_PRETTY_PRINT); | 		return json_encode($array, JSON_PRETTY_PRINT); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function ago( $datetime ) | 	static function ago($datetime) | ||||||
| 	{ | 	{ | ||||||
| 		$interval = date_create('now')->diff( $datetime ); | 		$interval = date_create('now')->diff($datetime); | ||||||
| 		$suffix = ( $interval->invert ? ' ago' : '' ); | 		$suffix = ($interval->invert ? ' ago' : ''); | ||||||
| 		if ( $v = $interval->y >= 1 ) return self::pluralize( $interval->m, 'month' ) . $suffix; | 		if ($v = $interval->y >= 1) return self::pluralize($interval->m, 'month') . $suffix; | ||||||
| 		if ( $v = $interval->d >= 1 ) return self::pluralize( $interval->d, 'day' ) . $suffix; | 		if ($v = $interval->d >= 1) return self::pluralize($interval->d, 'day') . $suffix; | ||||||
| 		if ( $v = $interval->h >= 1 ) return self::pluralize( $interval->h, 'hour' ) . $suffix; | 		if ($v = $interval->h >= 1) return self::pluralize($interval->h, 'hour') . $suffix; | ||||||
| 		if ( $v = $interval->i >= 1 ) return self::pluralize( $interval->i, 'minute' ) . $suffix; | 		if ($v = $interval->i >= 1) return self::pluralize($interval->i, 'minute') . $suffix; | ||||||
| 		return self::pluralize( $interval->s, 'second' ) . $suffix; | 		return self::pluralize($interval->s, 'second') . $suffix; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function pluralize( $count, $text ) | 	static function pluralize($count, $text) | ||||||
| 	{ | 	{ | ||||||
| 		return $count . ( ( $count == 1 ) ? ( " $text" ) : ( " ${text}s" ) ); | 		return $count . (($count == 1) ? (" $text") : (" ${text}s")); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function checkOperator($value1, $operator, $value2) { | 	static function checkOperator($value1, $operator, $value2) | ||||||
|  | 	{ | ||||||
| 		switch ($operator) { | 		switch ($operator) { | ||||||
| 			case '<': // Less than
 | 			case '<': // Less than
 | ||||||
| 			return $value1 < $value2; | 				return $value1 < $value2; | ||||||
| 			case '<=': // Less than or equal to
 | 			case '<=': // Less than or equal to
 | ||||||
| 			return $value1 <= $value2; | 				return $value1 <= $value2; | ||||||
| 			case '>': // Greater than
 | 			case '>': // Greater than
 | ||||||
| 			return $value1 > $value2; | 				return $value1 > $value2; | ||||||
| 			case '>=': // Greater than or equal to
 | 			case '>=': // Greater than or equal to
 | ||||||
| 			return $value1 >= $value2; | 				return $value1 >= $value2; | ||||||
| 			case '==': // Equal
 | 			case '==': // Equal
 | ||||||
| 			return ($value1 == $value2); | 				return ($value1 == $value2); | ||||||
| 			case '===': // Identical
 | 			case '===': // Identical
 | ||||||
| 			return $value1 === $value2; | 				return $value1 === $value2; | ||||||
| 			case '!==': // Not Identical
 | 			case '!==': // Not Identical
 | ||||||
| 			return $value1 !== $value2; | 				return $value1 !== $value2; | ||||||
| 			case '!=': // Not equal
 | 			case '!=': // Not equal
 | ||||||
| 			case '<>': // Not equal
 | 			case '<>': // Not equal
 | ||||||
| 			return $value1 != $value2; | 				return $value1 != $value2; | ||||||
| 			case '||': // Or
 | 			case '||': // Or
 | ||||||
| 			case 'or': // Or
 | 			case 'or': // Or
 | ||||||
| 			return $value1 || $value2; | 				return $value1 || $value2; | ||||||
| 			case '&&': // And
 | 			case '&&': // And
 | ||||||
| 			case 'and': // And
 | 			case 'and': // And
 | ||||||
| 			return $value1 && $value2; | 				return $value1 && $value2; | ||||||
| 			case 'xor': // Or
 | 			case 'xor': // Or
 | ||||||
| 			return $value1 xor $value2; | 				return $value1 xor $value2; | ||||||
| 			default: | 			default: | ||||||
| 			return FALSE; | 				return FALSE; | ||||||
| 		} // end switch
 | 		} // end switch
 | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	static function CallAPI($method, $url, $data = false) | ||||||
|  | 	{ | ||||||
|  | 		$curl = curl_init(); | ||||||
|  | 
 | ||||||
|  | 		switch ($method) { | ||||||
|  | 			case "POST": | ||||||
|  | 				curl_setopt($curl, CURLOPT_POST, 1); | ||||||
|  | 
 | ||||||
|  | 				if ($data) | ||||||
|  | 					curl_setopt($curl, CURLOPT_POSTFIELDS, $data); | ||||||
|  | 				break; | ||||||
|  | 			case "PUT": | ||||||
|  | 				curl_setopt($curl, CURLOPT_PUT, 1); | ||||||
|  | 				break; | ||||||
|  | 			default: | ||||||
|  | 				if ($data) | ||||||
|  | 					$url = sprintf("%s?%s", $url, http_build_query($data)); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Optional Authentication:
 | ||||||
|  | 		curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); | ||||||
|  | 		//curl_setopt($curl, CURLOPT_USERPWD, "username:password");
 | ||||||
|  | 
 | ||||||
|  | 		curl_setopt($curl, CURLOPT_URL, $url); | ||||||
|  | 		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); | ||||||
|  | 
 | ||||||
|  | 		$result = curl_exec($curl); | ||||||
|  | 
 | ||||||
|  | 		curl_close($curl); | ||||||
|  | 
 | ||||||
|  | 		return $result; | ||||||
|  | 	} | ||||||
| } | } | ||||||
							
								
								
									
										64
									
								
								app/models/managers/AuthManager.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								app/models/managers/AuthManager.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | class AuthManager { | ||||||
|  | 	public function getToken($username, $password, $userAgent = null){ | ||||||
|  | 		if ($userAgent == null) { | ||||||
|  | 			$userAgent = $_SERVER['HTTP_USER_AGENT']; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$userManager = new UserManager(); | ||||||
|  | 		if ($username != '' || $password != ''){ | ||||||
|  | 			$userLogedIn = $userManager->loginNew($username, $password); | ||||||
|  |  | ||||||
|  | 			if ($userLogedIn != false){ | ||||||
|  | 				// Create token header as a JSON string | ||||||
|  | 				$header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']); | ||||||
|  | 				// Create token payload as a JSON string | ||||||
|  | 				$payload = json_encode([ | ||||||
|  | 					'user_id' => $userLogedIn, | ||||||
|  | 					'exp' => date('Y-m-d H:i:s',strtotime("+90 Days")), | ||||||
|  | 					'iat' => date('Y-m-d H:i:s',time()), | ||||||
|  | 			  ]); | ||||||
|  | 				// Encode Header to Base64Url String | ||||||
|  | 				$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header)); | ||||||
|  | 				// Encode Payload to Base64Url String | ||||||
|  | 				$base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload)); | ||||||
|  | 				// Create Signature Hash | ||||||
|  | 				$signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, 'abC123!', true); | ||||||
|  | 				// Encode Signature to Base64Url String | ||||||
|  | 				$base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature)); | ||||||
|  | 				// Create JWT | ||||||
|  | 				$jwt = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 				$token = [ | ||||||
|  | 					'user_id' => $userLogedIn, | ||||||
|  | 					'user_agent' => $userAgent, | ||||||
|  | 					'token' => $jwt, | ||||||
|  | 					'expire' => date('Y-m-d H:i:s',strtotime("+90 Days")), | ||||||
|  | 					'issued' => date('Y-m-d H:i:s',time()), | ||||||
|  | 				]; | ||||||
|  | 				if (Db::add ('tokens', $token)){ | ||||||
|  | 					return $jwt; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function deleteToken($token){ | ||||||
|  | 		Db::command ('DELETE FROM tokens WHERE token=?', array ($token)); | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function validateToken($token){ | ||||||
|  | 		list($type, $hash) = explode(' ', $token); | ||||||
|  | 		$tokens = Db::loadAll('SELECT * FROM tokens WHERE token = ? AND expire >= CURRENT_TIMESTAMP AND blocked = 0;', array($hash)); | ||||||
|  | 		if ($type == 'Bearer' && count($tokens) == 1) { | ||||||
|  | 			return true; | ||||||
|  | 		} else if (count($tokens) == 0) { | ||||||
|  | 			return false; | ||||||
|  | 		}; | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -3,21 +3,21 @@ | |||||||
| class AutomationManager{ | class AutomationManager{ | ||||||
| 	public static $automation; | 	public static $automation; | ||||||
| 
 | 
 | ||||||
| 	public function remove($automationId) { | 	public static function remove($automationId) { | ||||||
| 		return Db::command ('DELETE FROM automation WHERE automation_id=?', array ($automationId)); | 		return Db::command ('DELETE FROM automation WHERE automation_id=?', array ($automationId)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function deactive($automationId) { | 	public static function deactive($automationId) { | ||||||
| 		$automation = Db::loadOne ("SELECT * FROM automation WHERE automation_id=?" , array ($automationId)); | 		$automation = Db::loadOne ("SELECT * FROM automation WHERE automation_id=?" , array ($automationId)); | ||||||
| 		$flipedValue = ($automation['active'] == 1 ? 0 : 1); | 		$flipedValue = ($automation['active'] == 1 ? 0 : 1); | ||||||
| 		return Db::command ('UPDATE automation SET active = ? WHERE automation_id=?', array ($flipedValue,$automationId)); | 		return Db::command ('UPDATE automation SET active = ? WHERE automation_id=?', array ($flipedValue,$automationId)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function restart($automationId) { | 	public static function restart($automationId) { | ||||||
| 		return Db::command ('UPDATE automation SET executed = 0 WHERE automation_id=?', array ($automationId)); | 		return Db::command ('UPDATE automation SET executed = 0 WHERE automation_id=?', array ($automationId)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function create ($name, $onDays, $doCode, $ifCode, $automationId = "") { | 	public static function create ($name, $onDays, $doCode, $ifCode, $automationId = "") { | ||||||
| 		$userId = UserManager::getUserData('user_id'); | 		$userId = UserManager::getUserData('user_id'); | ||||||
| 		$scene = array ( | 		$scene = array ( | ||||||
| 			'name' => $name, | 			'name' => $name, | ||||||
| @@ -38,12 +38,12 @@ class AutomationManager{ | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function getAll(){ | 	public static function getAll(){ | ||||||
| 		return Db::loadAll ("SELECT * FROM automation"); | 		return Db::loadAll ("SELECT * FROM automation"); | ||||||
| 
 | 
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function executeAll(){ | 	public static function executeAll(){ | ||||||
| 		global $logManager; | 		global $logManager; | ||||||
| 
 | 
 | ||||||
| 		$automations = Db::loadAll ("SELECT * FROM automation"); | 		$automations = Db::loadAll ("SELECT * FROM automation"); | ||||||
							
								
								
									
										129
									
								
								app/models/managers/ChartManager.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								app/models/managers/ChartManager.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,129 @@ | |||||||
|  | <?php | ||||||
|  | class ChartScale{ | ||||||
|  | 	const HOUR = 'info'; | ||||||
|  | 	const DAY = 'warning'; | ||||||
|  | 	const MONTH = 'warning'; | ||||||
|  | 	const YEAR = 'error'; | ||||||
|  | } | ||||||
|  | class ChartManager{ | ||||||
|  | 	function generateChart($data, $min = 0, $max = 100) { | ||||||
|  |  | ||||||
|  | 		echo '<br>Aktuální Hodnota: '.$data[0]['value']; | ||||||
|  | 		echo "<style> | ||||||
|  | 		.sloupec { | ||||||
|  | 			border-top: solid 2px red; | ||||||
|  | 		} | ||||||
|  | 		</style>"; | ||||||
|  | 		echo '<div class=graph>'; | ||||||
|  | 		echo '<div class="posuv " graf-max="'.$max.'" graf-min='.$min.'>'; | ||||||
|  | 		for ($valuesRow = 0; $valuesRow < count($data); $valuesRow++) { | ||||||
|  | 			$row = $data[$valuesRow]; | ||||||
|  |  | ||||||
|  | 			echo '<div class="sloupec " name="sloupec" value="' . $row['value'] . '" data-toggle="tooltip" title=""></div>'; | ||||||
|  | 		} | ||||||
|  | 		echo '</div>'; | ||||||
|  | 		echo '</div>'; | ||||||
|  | 		echo '<script src="./include/js/chartDrwer.js"></script>'; | ||||||
|  | 		echo 'Poslední Update: '; | ||||||
|  |  | ||||||
|  | 		echo '<style> | ||||||
|  | 		.graph { | ||||||
|  | 			width: 100%; | ||||||
|  | 			overflow: hidden; | ||||||
|  |  | ||||||
|  | 			margin-top: auto; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 		.posuv { | ||||||
|  | 			display: flex; | ||||||
|  | 			height: 200px; | ||||||
|  | 			background-image: url(./img/graph.png); | ||||||
|  | 			padding: 20px; | ||||||
|  | 			background-repeat: repeat; | ||||||
|  | 			border-bottom: 1px solid black; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		.sloupec { | ||||||
|  | 			border-top: solid 2px blue; | ||||||
|  | 			background-color: grey; | ||||||
|  | 			float: left; | ||||||
|  | 			margin: auto 0 0; | ||||||
|  | 			display: inline-block; | ||||||
|  | 			width: 1%; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		</style> | ||||||
|  | 		<script> | ||||||
|  | 		var posuvList = document.getElementsByClassName("posuv"); | ||||||
|  | 		var maxHeight = posuvList[0].clientHeight; | ||||||
|  | 		for (i = 0; i < posuvList.length; i++) { | ||||||
|  | 			var maxPx = 0; | ||||||
|  | 			var grafMax = Number(posuvList[i].getAttribute("graf-max")); //100% | ||||||
|  | 			var grafMin = Number(posuvList[i].getAttribute("graf-min")); //0% | ||||||
|  | 			if (grafMin == 0 && grafMax == 100) { | ||||||
|  | 				var onePercent = 1; | ||||||
|  | 			} else { | ||||||
|  | 				var stepsBetWene = grafMax; | ||||||
|  | 				if (grafMin !== 0) { | ||||||
|  | 					if (grafMin < 0) { | ||||||
|  | 						stepsBetWene = grafMax + Math.abs(grafMin); | ||||||
|  | 					} | ||||||
|  | 					if (grafMin > 0) { | ||||||
|  | 						stepsBetWene = grafMax - grafMin; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				var onePercent = stepsBetWene / 100; | ||||||
|  | 			} | ||||||
|  | 			var sloupceList = posuvList[i].querySelectorAll(".sloupec"); | ||||||
|  | 			for (ai = 0; ai < sloupceList.length; ai++) { | ||||||
|  | 				var onePxPercent = maxHeight / 100; | ||||||
|  | 				var heightInPercent = | ||||||
|  | 				Math.abs(sloupceList[ai].getAttribute("value")) / onePercent; | ||||||
|  | 				var outputPx = onePxPercent * heightInPercent; | ||||||
|  |  | ||||||
|  | 				sloupceList[ai].style.height = outputPx + "px"; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		</script>'; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	function generateChartData(int $subDeviceId, string $periode, string $groupBy) { | ||||||
|  | 		$chartData = []; | ||||||
|  |  | ||||||
|  | 		$subDevice = SubDeviceManager::getSubDevice($subDeviceId); | ||||||
|  | 		$records = RecordManager::getAllRecordForGraph($subDeviceId, $periode, $groupBy); | ||||||
|  |  | ||||||
|  | 		$array = array_column($records, 'value'); | ||||||
|  | 		$arrayTime = array_column($records, 'time'); | ||||||
|  | 		$output = []; | ||||||
|  |  | ||||||
|  | 		foreach ($array as $key => $value) { | ||||||
|  | 			$output[$key]['y'] = $value; | ||||||
|  | 			if ($subDevice['type'] == 'light'){ | ||||||
|  | 				if ($value > 810){ | ||||||
|  | 					$output[$key]['y'] = 1; | ||||||
|  | 				} else { | ||||||
|  | 					$output[$key]['y'] = 0; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			$timeStamp = new DateTime($arrayTime[$key]); | ||||||
|  | 			$output[$key]['t'] = $timeStamp->format("Y-m-d") . 'T' . $timeStamp->format("H:i:s") . 'Z'; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$data = json_encode($output); | ||||||
|  | 		$data = $output; | ||||||
|  | 		$arrayTimeStamps = array_column($records, 'time'); | ||||||
|  | 		foreach ($arrayTimeStamps as $key => $value) { | ||||||
|  | 			$arrayTimeStamps[$key] = (new DateTime($value))->format(TIMEFORMAT); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$chartData['graphRange'] = RANGES[$subDevice['type']]; | ||||||
|  | 		$chartData['graphType'] = RANGES[$subDevice['type']]['graph']; | ||||||
|  | 		$chartData['graphData'] = $data; | ||||||
|  |  | ||||||
|  | 		return $chartData; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | ?> | ||||||
| @@ -3,19 +3,19 @@ class DashboardManager{ | |||||||
| 	public static $devices; | 	public static $devices; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	function getAllDashboards ($userId) { | 	static function getAllDashboards ($userId) { | ||||||
| 		return Db::loadAll ("SELECT * FROM dashboard WHERE user_id=?", array($userId)); | 		return Db::loadAll ("SELECT * FROM dashboard WHERE user_id=?", array($userId)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function getAllSubDevices ($userId) { | 	static function getAllSubDevices ($userId) { | ||||||
| 		return Db::loadAll ("SELECT * FROM subdevices WHERE subdevice_id IN (SELECT subdevice_id FROM dashboard WHERE user_id=?)", array($userId)); | 		return Db::loadAll ("SELECT * FROM subdevices WHERE subdevice_id IN (SELECT subdevice_id FROM dashboard WHERE user_id=?)", array($userId)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function getSubDevice ($userId, $subDeviceId) { | 	static function getSubDevice ($userId, $subDeviceId) { | ||||||
| 		return Db::loadOne ("SELECT * FROM subdevices WHERE subdevice_id = (SELECT subdevice_id FROM dashboard WHERE user_id=? AND subdevice_id = ? )", array($userId, $subDeviceId)); | 		return Db::loadOne ("SELECT * FROM subdevices WHERE subdevice_id = (SELECT subdevice_id FROM dashboard WHERE user_id=? AND subdevice_id = ? )", array($userId, $subDeviceId)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function Add ($subDeviceId) { | 	static function Add ($subDeviceId) { | ||||||
| 		if (self::getSubDevice(UserManager::getUserData('user_id'), $subDeviceId) == null){ | 		if (self::getSubDevice(UserManager::getUserData('user_id'), $subDeviceId) == null){ | ||||||
| 
 | 
 | ||||||
| 			// to do: pokud existuje nepridej
 | 			// to do: pokud existuje nepridej
 | ||||||
| @@ -34,7 +34,7 @@ class DashboardManager{ | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function Remove ($subDeviceId){ | 	static function Remove ($subDeviceId){ | ||||||
| 		$userId = UserManager::getUserData('user_id'); | 		$userId = UserManager::getUserData('user_id'); | ||||||
| 		Db::command ('DELETE FROM dashboard WHERE subdevice_id=? AND user_id = ?', array ($subDeviceId, $userId)); | 		Db::command ('DELETE FROM dashboard WHERE subdevice_id=? AND user_id = ?', array ($subDeviceId, $userId)); | ||||||
| 	} | 	} | ||||||
| @@ -2,37 +2,47 @@ | |||||||
| class DeviceManager{ | class DeviceManager{ | ||||||
| 	public static $devices; | 	public static $devices; | ||||||
| 
 | 
 | ||||||
| 	function getAllDevices () { | 	static function getAllDevices () { | ||||||
| 		return Db::loadAll ("SELECT * FROM devices WHERE approved != ?", Array(2)); | 		return Db::loadAll ("SELECT devices.* FROM devices
 | ||||||
|  | 		WHERE approved != ?", Array(2));
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	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)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function getOtherDevices(){ | 	static function getOtherDevices(){ | ||||||
| 		return Db::loadAll ("SELECT * FROM devices WHERE room_id IS NULL "); | 		return Db::loadAll ("SELECT * FROM devices WHERE room_id IS NULL "); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function getDeviceByToken($deviceToken) { | 	static function getDeviceByToken($deviceToken) { | ||||||
| 		return Db::loadOne("SELECT * FROM devices WHERE token = ?", array($deviceToken)); | 		return Db::loadOne("SELECT * FROM devices WHERE token = ?", array($deviceToken)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function getDeviceByMac($deviceMac) { | 	static function getDeviceByMac($deviceMac) { | ||||||
| 		return Db::loadOne("SELECT * FROM devices WHERE mac = ?", array($deviceMac)); | 		return Db::loadOne("SELECT * FROM devices WHERE mac = ?", array($deviceMac)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function getDeviceById($deviceId) { | 	static function getDeviceById($deviceId) { | ||||||
| 		return Db::loadOne("SELECT * FROM devices WHERE device_id = ?", array($deviceId)); | 		return Db::loadOne("SELECT * FROM devices WHERE device_id = ?", array($deviceId)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function create ($name, $token) { | 	static function getAllDevicesSorted ($sort, $sortType = "ASC") { | ||||||
|  | 		return Db::loadAll ("SELECT devices.* FROM devices
 | ||||||
|  | 			LEFT JOIN rooms ON (devices.room_id = rooms.room_id) | ||||||
|  | 		WHERE devices.approved != ? ORDER BY $sort $sortType", Array(2));
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public static function create ($name, $token, $type = "") { | ||||||
| 		$defaultRoom = RoomManager::getDefaultRoomId(); | 		$defaultRoom = RoomManager::getDefaultRoomId(); | ||||||
| 		$device = array ( | 		$device = array ( | ||||||
| 			'name' => $name, | 			'name' => $name, | ||||||
| 			'token' => $token, | 			'token' => $token, | ||||||
| 			'room_id' => $defaultRoom, | 			'room_id' => $defaultRoom, | ||||||
| 		); | 		); | ||||||
|  | 		if (!empty($type)) { | ||||||
|  | 			$device['type'] = $type; | ||||||
|  | 		} | ||||||
| 		try { | 		try { | ||||||
| 			Db::add ('devices', $device); | 			Db::add ('devices', $device); | ||||||
| 			return Db::loadOne("SELECT device_id FROM devices WHERE token = ?", array($token))['device_id']; | 			return Db::loadOne("SELECT device_id FROM devices WHERE token = ?", array($token))['device_id']; | ||||||
| @@ -42,7 +52,7 @@ class DeviceManager{ | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function edit ($deviceId, $values = []) { | 	public static function edit ($deviceId, $values = []) { | ||||||
| 		try { | 		try { | ||||||
| 			Db::edit ('devices', $values, 'WHERE device_id = ?', array($deviceId)); | 			Db::edit ('devices', $values, 'WHERE device_id = ?', array($deviceId)); | ||||||
| 		} catch(PDOException $error) { | 		} catch(PDOException $error) { | ||||||
| @@ -51,7 +61,7 @@ class DeviceManager{ | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function editByToken ($token, $values = []) { | 	public static function editByToken ($token, $values = []) { | ||||||
| 		try { | 		try { | ||||||
| 			Db::edit ('devices', $values, 'WHERE token = ?', array($token)); | 			Db::edit ('devices', $values, 'WHERE token = ?', array($token)); | ||||||
| 		} catch(PDOException $error) { | 		} catch(PDOException $error) { | ||||||
| @@ -65,7 +75,7 @@ class DeviceManager{ | |||||||
| 	* @param  [type] $roomId   [číslo místnosti do kter se má zařízení přiřadit] | 	* @param  [type] $roomId   [číslo místnosti do kter se má zařízení přiřadit] | ||||||
| 	* @param  [type] $deviceId [Číslo zařízení které chcete přiřadit do místnosti] | 	* @param  [type] $deviceId [Číslo zařízení které chcete přiřadit do místnosti] | ||||||
| 	*/ | 	*/ | ||||||
| 	public function assignRoom ($roomId, $deviceId) { | 	public static function assignRoom ($roomId, $deviceId) { | ||||||
| 		$device = array ( | 		$device = array ( | ||||||
| 			'room_id' => $roomId, | 			'room_id' => $roomId, | ||||||
| 		); | 		); | ||||||
| @@ -81,15 +91,15 @@ class DeviceManager{ | |||||||
| 	* [delete Smazání zařízení] | 	* [delete Smazání zařízení] | ||||||
| 	* @param  [type] $deviceId [Id zařízení ke smazání] | 	* @param  [type] $deviceId [Id zařízení ke smazání] | ||||||
| 	*/ | 	*/ | ||||||
| 	public function delete ($deviceId) { | 	public static function delete ($deviceId) { | ||||||
| 		Db::command ('DELETE FROM devices WHERE device_id=?', array ($deviceId)); | 		Db::command ('DELETE FROM devices WHERE device_id=?', array ($deviceId)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function registeret ($deviceToken) { | 	public static function registeret ($deviceToken) { | ||||||
| 		return (count(Db::loadAll ("SELECT * FROM devices WHERE token=?", array($deviceToken))) == 1 ? true : false); | 		return (count(Db::loadAll ("SELECT * FROM devices WHERE token=?", array($deviceToken))) == 1 ? true : false); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function approved ($deviceToken) { | 	public static function approved ($deviceToken) { | ||||||
| 		return (count(Db::loadAll ("SELECT * FROM devices WHERE token=? AND approved = ?", array($deviceToken, 1))) == 1 ? true : false); | 		return (count(Db::loadAll ("SELECT * FROM devices WHERE token=? AND approved = ?", array($deviceToken, 1))) == 1 ? true : false); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
							
								
								
									
										11
									
								
								app/models/managers/EmailManager.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								app/models/managers/EmailManager.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | <?php | ||||||
|  | class EmailManager { | ||||||
|  | 	public function SendTo ($pro, $predmet, $zprava) { | ||||||
|  | 			$email = "From: EnergyCounter@steelants.cz"; | ||||||
|  | 			$email .= "\nMIME-Version: 1.0\n"; | ||||||
|  | 			$email .= "Content-Type: text/html; charset=\"utf-8\"\n"; | ||||||
|  | 			if (!mb_send_mail ($pro, $predmet, $zprava, $email)) { | ||||||
|  | 				throw new PDOException("!Email se nepodařilo odeslat!"); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | } | ||||||
| @@ -17,18 +17,19 @@ class LanguageManager | |||||||
| 
 | 
 | ||||||
| 	function load() | 	function load() | ||||||
| 	{ | 	{ | ||||||
| 		$file = './app/lang/en.php'; | 		$file = '../lang/en.php'; | ||||||
| 		if (!file_exists($file)){ | 		if (!file_exists($file)){ | ||||||
|  | 			echo 'ERROR: en.php not found'; | ||||||
| 			die(); | 			die(); | ||||||
| 			//TODO add lng EXEPTIONS
 | 			//TODO add lng EXEPTIONS
 | ||||||
| 		} | 		} | ||||||
| 		$arrayFirst = include($file); | 		$arrayFirst = include($file); | ||||||
| 		$file = './app/lang/' . $this->lngCode . '.php'; | 		$file = '../lang/' . $this->lngCode . '.php'; | ||||||
| 		$arraySecond = []; | 		$arraySecond = []; | ||||||
| 		if (file_exists($file)){ | 		if (file_exists($file)){ | ||||||
| 			$arraySecond = include($file); | 			$arraySecond = include($file); | ||||||
| 		} | 		} | ||||||
| 		$this->lngDatabase = array_merge($arrayFirst,$arraySecond); | 		$this->lngDatabase = array_merge($arrayFirst, $arraySecond); | ||||||
| 		return true; | 		return true; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
							
								
								
									
										78
									
								
								app/models/managers/LogMaintainer.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								app/models/managers/LogMaintainer.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  | <?php | ||||||
|  | class LogMaintainer | ||||||
|  | { | ||||||
|  | 	private function cleaningDir ($dir, $seconds) { | ||||||
|  | 		$todayFileName = date ("Y-m-d").'.log'; | ||||||
|  | 		$logFiles = scandir ($dir); | ||||||
|  | 		foreach ($logFiles as $key => $file) { | ||||||
|  | 			if (in_array ($file,array (".", "..", ".gitkeep", $todayFileName))) | ||||||
|  | 			{ | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 			if (!is_dir($dir . $file)) { | ||||||
|  | 				if (strtotime(str_replace(".log", "", $file)) < (strtotime("now") - $seconds)) { | ||||||
|  | 					unlink ($dir . $file); | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				$this->cleaningDir ($dir . $file . "/", $seconds); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function purge ($days) { | ||||||
|  | 		$seconds = $days * 86400; | ||||||
|  | 		$this->cleaningDir ('../logs/', $seconds); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public static function getStats(){ | ||||||
|  | 		$stats = array( | ||||||
|  | 			'ERROR' => 0, | ||||||
|  | 			'WARNING' => 0, | ||||||
|  | 			'EXEPTION' => 0, | ||||||
|  | 			'INFO' => 0, | ||||||
|  | 		); | ||||||
|  |  | ||||||
|  | 		$result = array(); | ||||||
|  | 		$result = self::logFinder ('../logs/', $result); | ||||||
|  |  | ||||||
|  | 		foreach ($result as $path => $files) { | ||||||
|  | 			foreach ($files as $file) { | ||||||
|  | 		 | ||||||
|  | 				# code... | ||||||
|  | 				$matches = array(); | ||||||
|  |  | ||||||
|  | 				$re = '/\[(?:warning|error|info)\]/'; | ||||||
|  | 				$str = file_get_contents($path . $file); | ||||||
|  | 				preg_match_all($re, $str, $matches); | ||||||
|  | 				if (count($matches[0]) == 0) continue; | ||||||
|  | 				 | ||||||
|  | 				foreach ($matches[0] as $match) { | ||||||
|  | 					switch($match){ | ||||||
|  | 						case '[error]': $stats['ERROR']++; break; | ||||||
|  | 						case '[warning]': $stats['WARNING']++; break; | ||||||
|  | 						case '[exeption]': $stats['EXEPTION']++; break; | ||||||
|  | 						default: $stats['INFO']++;  break; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return $stats; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	private static function logFinder ($dir, $result) { | ||||||
|  | 		$logFiles = scandir ($dir); | ||||||
|  | 		foreach ($logFiles as $key => $file) { | ||||||
|  | 			if (in_array ($file,array (".", "..", ".gitkeep"))) | ||||||
|  | 			{ | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 			if (!is_dir($dir . $file)) { | ||||||
|  | 				$result[$dir][] = $file; | ||||||
|  | 			} else { | ||||||
|  | 				$result = self::logFinder ($dir . $file . "/", $result); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return $result; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										42
									
								
								app/models/managers/LogManager.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								app/models/managers/LogManager.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  | * | ||||||
|  | */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class LogManager | ||||||
|  | { | ||||||
|  | 	private $logFile; | ||||||
|  | 	private $logLevel = 1; | ||||||
|  |  | ||||||
|  | 	public function __construct($fileName = "") | ||||||
|  | 	{ | ||||||
|  | 		if ($fileName == ""){ | ||||||
|  | 			$fileName = '../logs/'. date("Y-m-d").'.log'; | ||||||
|  | 		} | ||||||
|  | 		if(!is_dir("../logs/")) | ||||||
|  | 		{ | ||||||
|  | 			mkdir("../logs/"); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$this->logFile = fopen($fileName, "a") or die("Unable to open file!"); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function setLevel($type = LogRecordTypess::WARNING){ | ||||||
|  | 		$this->logLevel = $type['level']; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function write($value, $type = LogRecordTypess::ERROR){ | ||||||
|  | 		if ($type['level'] <= $this->logLevel) { | ||||||
|  | 			$record = "[".date("H:m:s")."][".$type['identifier']."]" . $value . "\n"; | ||||||
|  | 			fwrite($this->logFile, $record); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function __destruct(){ | ||||||
|  | 		if (isset($this->logFile) && $this->logFile != "Unable to open file!") { | ||||||
|  | 			fclose($this->logFile); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -2,25 +2,27 @@ | |||||||
| /** | /** | ||||||
| * Notification Manager | * Notification Manager | ||||||
| */ | */ | ||||||
| //TODO: Working timestamp to body or $title
 | //TODO: Working timestamp to $title
 | ||||||
| class NotificationManager | class NotificationManager | ||||||
| { | { | ||||||
| 	function addSubscriber($userID = '', $token = ''){ | 	public static function addSubscriber($userID, $token){ | ||||||
| 		$notificationSubscriber = $subDeviceId = Db::loadOne('SELECT id FROM notifications WHERE token = ?;', array($token)); | 		if (!empty($userID) && !empty($token)) { | ||||||
| 		if ($notificationSubscriber == ''){ | 			$notificationSubscriber = $subDeviceId = Db::loadOne('SELECT id FROM notifications WHERE token = ?;', array($token)); | ||||||
| 			$notification = array ( | 			if ($notificationSubscriber == ''){ | ||||||
| 				'user_id' => $userID, | 				$notification = array ( | ||||||
| 				'token' => $token, | 					'user_id' => $userID, | ||||||
| 			); | 					'token' => $token, | ||||||
| 			Db::add ('notifications', $notification); | 				); | ||||||
|  | 				Db::add ('notifications', $notification); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function getSubscription () { | 	public static function getSubscription () { | ||||||
| 		return Db::loadAll ("SELECT * FROM notifications"); | 		return Db::loadAll ("SELECT * FROM notifications"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function sendSimpleNotification(string $serverKey, string $to, array $data, bool $timeStamp = false){ | 	public static function sendSimpleNotification(string $serverKey, string $to, array $data, bool $timeStamp = false){ | ||||||
| 		$dataTemplate = [ | 		$dataTemplate = [ | ||||||
| 			'title' => '', | 			'title' => '', | ||||||
| 			'body' => '', | 			'body' => '', | ||||||
| @@ -37,7 +39,7 @@ class NotificationManager | |||||||
| 
 | 
 | ||||||
| 		$notification = new Notification($serverKey); | 		$notification = new Notification($serverKey); | ||||||
| 		$notification->to($to); | 		$notification->to($to); | ||||||
| 		$notification->notification($data['title'], $data['body'], $data['icon'], ''); | 		$notification->notification($data['title'], date("h:i") . " - " . $data['body'], $data['icon'], ''); | ||||||
| 		$answer = $notification->send(); | 		$answer = $notification->send(); | ||||||
| 		$notification = null; | 		$notification = null; | ||||||
| 
 | 
 | ||||||
| @@ -76,7 +78,7 @@ class Notification | |||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		$this->jsonPayload["data"]["notification"]["title"] = $title; | 		$this->jsonPayload["data"]["notification"]["title"] = $title; | ||||||
| 		$this->jsonPayload["data"]["notification"]["body"] = date("h:i") . " - " .  $body; | 		$this->jsonPayload["data"]["notification"]["body"] = $body; | ||||||
| 		$this->jsonPayload["data"]["notification"]["icon"] = $icon; | 		$this->jsonPayload["data"]["notification"]["icon"] = $icon; | ||||||
| 		$this->jsonPayload["data"]["notification"]["click_action"] = $action; | 		$this->jsonPayload["data"]["notification"]["click_action"] = $action; | ||||||
| 	} | 	} | ||||||
| @@ -2,16 +2,45 @@ | |||||||
| class RecordManager{ | class RecordManager{ | ||||||
| 	public static $records; | 	public static $records; | ||||||
| 
 | 
 | ||||||
| 	public function create ($deviceId, $type, $value) { | 	public static function createWithSubId ($subDeviceId,  $value) { | ||||||
|  | 		try { | ||||||
|  | 			$record = [ | ||||||
|  | 				'execuded' => 1, | ||||||
|  | 			]; | ||||||
|  | 			Db::edit ('records', $record, 'WHERE subdevice_id = ?', array ($subDeviceId)); | ||||||
|  | 			$record = array ( | ||||||
|  | 				'subdevice_id' => $subDeviceId, | ||||||
|  | 				'value' => $value, | ||||||
|  | 			); | ||||||
|  | 			return Db::add ('records', $record); | ||||||
|  | 		} catch(PDOException $error) { | ||||||
|  | 			echo $error->getMessage(); | ||||||
|  | 			die(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public static function create ($deviceId, $type, $value) { | ||||||
| 		$subDeviceId = Db::loadOne('SELECT * FROM subdevices WHERE device_id = ? AND type = ?;', array($deviceId, $type))['subdevice_id']; | 		$subDeviceId = Db::loadOne('SELECT * FROM subdevices WHERE device_id = ? AND type = ?;', array($deviceId, $type))['subdevice_id']; | ||||||
| 		if ($subDeviceId == '') { | 		if ($subDeviceId == '') { | ||||||
| 			return false; | 			return false; | ||||||
| 		}; | 		}; | ||||||
| 		$record = array ( | 
 | ||||||
| 			'subdevice_id' => $subDeviceId, | 		//Ochrana proti duplicitním hodnotám zapisují se jen změny
 | ||||||
| 			'value' => $value, | 		if (self::getLastRecord($subDeviceId, 1)['value'] === $value){ | ||||||
| 		); | 			return false; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 
 | ||||||
| 		try { | 		try { | ||||||
|  | 			$record = [ | ||||||
|  | 				'execuded' => 1, | ||||||
|  | 			]; | ||||||
|  | 			Db::edit ('records', $record, 'WHERE subdevice_id = ?', array ($subDeviceId)); | ||||||
|  | 
 | ||||||
|  | 			$record = array ( | ||||||
|  | 				'subdevice_id' => $subDeviceId, | ||||||
|  | 				'value' => $value, | ||||||
|  | 			); | ||||||
| 			return Db::add ('records', $record); | 			return Db::add ('records', $record); | ||||||
| 		} catch(PDOException $error) { | 		} catch(PDOException $error) { | ||||||
| 			echo $error->getMessage(); | 			echo $error->getMessage(); | ||||||
| @@ -42,17 +71,22 @@ class RecordManager{ | |||||||
| 		return Db::loadAll('SELECT * FROM records WHERE subdevice_id = ? AND value != ? ORDER BY time DESC LIMIT ?;', array($subDeviceId, 999, $num)); | 		return Db::loadAll('SELECT * FROM records WHERE subdevice_id = ? AND value != ? ORDER BY time DESC LIMIT ?;', array($subDeviceId, 999, $num)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	public static function getLastRecordNotNull($subDeviceId) { | ||||||
|  | 		return Db::loadOne('SELECT * FROM records WHERE subdevice_id = ? AND value != ? ORDER BY time DESC;', array($subDeviceId, 0)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	public static function getAllRecord($subDeviceId, $timeFrom, $timeTo) { | 	public static function getAllRecord($subDeviceId, $timeFrom, $timeTo) { | ||||||
| 		return Db::loadAll('SELECT * FROM records WHERE subdevice_id = ? AND time >= ? AND time <= ? AND value != ? ORDER BY time;', array($subDeviceId, $timeFrom, $timeTo, 999)); | 		return Db::loadAll('SELECT * FROM records WHERE subdevice_id = ? AND time >= ? AND time <= ? AND value != ? ORDER BY time;', array($subDeviceId, $timeFrom, $timeTo, 999)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	//TODO: Zeptat se @Patrik jestli je secure pak používat periodu přímo do SQL a pak pře url SQL Injection
 | ||||||
| 	public static function getAllRecordForGraph($subDeviceId, $period = "day", $groupBy = "hour") { | 	public static function getAllRecordForGraph($subDeviceId, $period = "day", $groupBy = "hour") { | ||||||
| 		$periodLocal = '- 1 ' . strtoupper($period); | 		$periodLocal = '- 1' . strtoupper($period); | ||||||
| 		$dateTime = new DateTime(); | 		$dateTime = new DateTime(); | ||||||
| 		$dateTime = $dateTime->modify($periodLocal); | 		$dateTime = $dateTime->modify($periodLocal); | ||||||
| 		$dateTime = $dateTime->format('Y-m-d'); | 		$dateTime = $dateTime->format('Y-m-d H:i:s'); | ||||||
| 		$groupBy = strtoupper($groupBy).'(time)'; | 		$groupBy = strtoupper($groupBy).'(time)'; | ||||||
| 		$sql = 'SELECT value, time FROM records | 		$sql = 'SELECT value, time, execuded FROM records | ||||||
| 		WHERE | 		WHERE | ||||||
| 		subdevice_id = ? | 		subdevice_id = ? | ||||||
| 		AND | 		AND | ||||||
| @@ -60,7 +94,7 @@ class RecordManager{ | |||||||
| 		AND | 		AND | ||||||
| 		time > ? | 		time > ? | ||||||
| 		GROUP BY '.$groupBy.' | 		GROUP BY '.$groupBy.' | ||||||
| 		ORDER BY time ASC'; | 		ORDER BY time Desc'; | ||||||
| 		//TODO: Prasárna Opravit
 | 		//TODO: Prasárna Opravit
 | ||||||
| 		return Db::loadAll($sql, array($subDeviceId, $dateTime)); | 		return Db::loadAll($sql, array($subDeviceId, $dateTime)); | ||||||
| 	} | 	} | ||||||
| @@ -71,7 +105,6 @@ class RecordManager{ | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 	//TODO: zkontrolovat jestli neco nezbilo po smazaní
 | 	//TODO: zkontrolovat jestli neco nezbilo po smazaní
 | ||||||
| 	public static function cleanSubdeviceRecords ($subDeviceId) { | 	public static function cleanSubdeviceRecords ($subDeviceId) { | ||||||
| 		Db::command ('DELETE FROM records WHERE subdevice_id = ?);', array($subDeviceId)); | 		Db::command ('DELETE FROM records WHERE subdevice_id = ?);', array($subDeviceId)); | ||||||
							
								
								
									
										38
									
								
								app/models/managers/RoomManager.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								app/models/managers/RoomManager.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | <?php | ||||||
|  | class RoomManager{ | ||||||
|  | 	public static $rooms; | ||||||
|  |  | ||||||
|  | 	static function getDefaultRoomId() { | ||||||
|  | 		$defaultRoom = Db::loadOne("SELECT `room_id` FROM `rooms` WHERE `default` = 1"); | ||||||
|  | 		return $defaultRoom['room_id']; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	static function getAllRooms () { | ||||||
|  | 		//TODO: ignore Widgets withoud data | ||||||
|  | 		$allRoom = Db::loadAll ("SELECT rooms.*, COUNT(devices.device_id) as device_count FROM rooms LEFT JOIN devices ON (devices.room_id=rooms.room_id) GROUP BY rooms.room_id"); | ||||||
|  | 		return $allRoom; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	static function getRoomsDefault () { | ||||||
|  | 		//TODO: ignore Widgets withoud data | ||||||
|  | 		$allRoom = Db::loadAll ("SELECT rooms.room_id, rooms.name, COUNT(devices.device_id) as device_count FROM rooms LEFT JOIN devices ON (devices.room_id=rooms.room_id) GROUP BY rooms.room_id;"); | ||||||
|  | 		return $allRoom; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public static function create ($name) { | ||||||
|  | 		$room = array ( | ||||||
|  | 			'name' => $name, | ||||||
|  | 		); | ||||||
|  | 		try { | ||||||
|  | 			Db::add ('rooms', $room); | ||||||
|  | 		} catch(PDOException $error) { | ||||||
|  | 			echo $error->getMessage(); | ||||||
|  | 			die(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public static function delete ($roomId) { | ||||||
|  | 		Db::command ('DELETE FROM rooms WHERE room_id=?', array ($roomId)); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | ?> | ||||||
| @@ -2,7 +2,7 @@ | |||||||
| class SceneManager{ | class SceneManager{ | ||||||
| 	public static $scenes; | 	public static $scenes; | ||||||
| 
 | 
 | ||||||
| 	public function create ($icon, $name, $doCode) { | 	public static function create ($icon, $name, $doCode) { | ||||||
| 		$scene = array ( | 		$scene = array ( | ||||||
| 			'icon' => $icon, | 			'icon' => $icon, | ||||||
| 			'name' => $name, | 			'name' => $name, | ||||||
| @@ -16,15 +16,15 @@ class SceneManager{ | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function getAllScenes () { | 	public static function getAllScenes () { | ||||||
| 		return Db::loadAll ("SELECT * FROM scenes"); | 		return Db::loadAll ("SELECT * FROM scenes"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function getScene ($sceneId) { | 	public static function getScene ($sceneId) { | ||||||
| 		return Db::loadOne("SELECT * FROM scenes WHERE scene_id = ?", array($sceneId)); | 		return Db::loadOne("SELECT * FROM scenes WHERE scene_id = ?", array($sceneId)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function execScene ($sceneId) { | 	public static function execScene ($sceneId) { | ||||||
| 		$sceneData = SceneManager::getScene($sceneId); | 		$sceneData = SceneManager::getScene($sceneId); | ||||||
| 		$sceneDoJson = $sceneData['do_something']; | 		$sceneDoJson = $sceneData['do_something']; | ||||||
| 		$sceneDoArray = json_decode($sceneDoJson); | 		$sceneDoArray = json_decode($sceneDoJson); | ||||||
| @@ -34,7 +34,7 @@ class SceneManager{ | |||||||
| 		return true; | 		return true; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function delete($sceneId){ | 	public static function delete($sceneId){ | ||||||
| 		Db::command ('DELETE FROM scenes WHERE scene_id=?', array ($sceneId)); | 		Db::command ('DELETE FROM scenes WHERE scene_id=?', array ($sceneId)); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
							
								
								
									
										33
									
								
								app/models/managers/SettingsManager.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								app/models/managers/SettingsManager.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | <?php | ||||||
|  | class SettingsManager{ | ||||||
|  | 	static function getAllValues () { | ||||||
|  | 		return Db::loadAll ("SELECT * FROM settings"); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	static function getByName($settingName) { | ||||||
|  | 		return Db::loadOne("SELECT * FROM settings WHERE name = ?", array($settingName)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public static function create ($name, $value) { | ||||||
|  | 		$setting = array ( | ||||||
|  | 			'name' => $name, | ||||||
|  | 			'value' => $value, | ||||||
|  | 		); | ||||||
|  | 		try { | ||||||
|  | 			Db::add ('settings', $setting); | ||||||
|  | 		} catch(PDOException $error) { | ||||||
|  | 			echo $error->getMessage(); | ||||||
|  | 			die(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public static function update ($name, $value) { | ||||||
|  | 		try { | ||||||
|  | 			Db::edit ('settings', ['value' => $value], 'WHERE name = ?', array($name)); | ||||||
|  | 		} catch(PDOException $error) { | ||||||
|  | 			echo $error->getMessage(); | ||||||
|  | 			die(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | ?> | ||||||
| @@ -3,17 +3,20 @@ class SubDeviceManager | |||||||
| { | { | ||||||
| 	public static $devices; | 	public static $devices; | ||||||
| 
 | 
 | ||||||
| 	public function getAllSubDevices($deviceId) | 	public static function getAllSubDevices($deviceId = null) | ||||||
| 	{ | 	{ | ||||||
|  | 		if ($deviceId == null){ | ||||||
|  | 			return Db::loadAll("SELECT * FROM subdevices"); | ||||||
|  | 		} | ||||||
| 		return Db::loadAll("SELECT * FROM subdevices WHERE device_id = ?", array($deviceId)); | 		return Db::loadAll("SELECT * FROM subdevices WHERE device_id = ?", array($deviceId)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function getSubDeviceMaster($subDeviceId) | 	public static function getSubDeviceMaster($subDeviceId) | ||||||
| 	{ | 	{ | ||||||
| 		return Db::loadOne("SELECT * FROM devices WHERE device_id = (SELECT device_id FROM subdevices WHERE subdevice_id = ?)", array($subDeviceId)); | 		return Db::loadOne("SELECT * FROM devices WHERE device_id = (SELECT device_id FROM subdevices WHERE subdevice_id = ?)", array($subDeviceId)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function getSubDeviceByMaster($deviceId, $subDeviceType = null) | 	public static function getSubDeviceByMaster($deviceId, $subDeviceType = null) | ||||||
| 	{ | 	{ | ||||||
| 		if ($subDeviceType == null) { | 		if ($subDeviceType == null) { | ||||||
| 			return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ?;", array($deviceId)); | 			return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ?;", array($deviceId)); | ||||||
| @@ -22,21 +25,21 @@ class SubDeviceManager | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function getSubDeviceByMasterAndType($deviceId, $subDeviceType = null) | 	public static function getSubDeviceByMasterAndType($deviceId, $subDeviceType = '') | ||||||
| 	{ | 	{ | ||||||
| 		if (!empty($subDeviceType)) { | 		if ($subDeviceType == '') { | ||||||
| 			return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ?;", array($deviceId)); | 			return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ?;", array($deviceId)); | ||||||
| 		} else { | 		} else { | ||||||
| 			return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ? AND type = ?;", array($deviceId, $subDeviceType)); | 			return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ? AND type = ?;", array($deviceId, $subDeviceType)); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function getSubDevice($subDeviceId) | 	public static function getSubDevice($subDeviceId) | ||||||
| 	{ | 	{ | ||||||
| 		return Db::loadOne("SELECT * FROM subdevices WHERE subdevice_id = ?;", array($subDeviceId)); | 		return Db::loadOne("SELECT * FROM subdevices WHERE subdevice_id = ?;", array($subDeviceId)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function getSubDevicesTypeForMater($deviceId) | 	public static function getSubDevicesTypeForMater($deviceId) | ||||||
| 	{ | 	{ | ||||||
| 		$parsedTypes = []; | 		$parsedTypes = []; | ||||||
| 		$types = Db::loadAll("SELECT type FROM subdevices WHERE device_id = ?;", array($deviceId)); | 		$types = Db::loadAll("SELECT type FROM subdevices WHERE device_id = ?;", array($deviceId)); | ||||||
| @@ -48,7 +51,7 @@ class SubDeviceManager | |||||||
| 
 | 
 | ||||||
| 	//check if dubdevice exist
 | 	//check if dubdevice exist
 | ||||||
| 
 | 
 | ||||||
| 	public function create($deviceId, $type, $unit) | 	public static function create($deviceId, $type, $unit) | ||||||
| 	{ | 	{ | ||||||
| 		$record = array( | 		$record = array( | ||||||
| 			'device_id' => $deviceId, | 			'device_id' => $deviceId, | ||||||
| @@ -63,9 +66,35 @@ class SubDeviceManager | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function remove($subDeviceId) | 	public static function remove($subDeviceId) | ||||||
| 	{ | 	{ | ||||||
| 		RecordManager::cleanSubdeviceRecords($subDeviceId); | 		RecordManager::cleanSubdeviceRecords($subDeviceId); | ||||||
| 		return Db::loadAll("DELETE FROM subdevices WHERE subdevice_id = ?", array($subDeviceId)); | 		return Db::loadAll("DELETE FROM subdevices WHERE subdevice_id = ?", array($subDeviceId)); | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	public static function getSubdevicesByRoomIds($roomIds = NULL) { | ||||||
|  | 		if(empty($roomIds)) return NULL; | ||||||
|  | 
 | ||||||
|  | 		//TODO: @Patrik Check line 89
 | ||||||
|  | 		$rows = Db::loadAll(" | ||||||
|  | 			SELECT d.room_id, sd.subdevice_id, sd.device_id, d.icon, d.name, sd.type, sd.unit, r.value FROM subdevices sd | ||||||
|  | 			JOIN devices d ON sd.device_id = d.device_id | ||||||
|  | 			JOIN records r ON r.subdevice_id = sd.subdevice_id | ||||||
|  | 			WHERE d.room_id IN (".str_repeat("?,", count($roomIds)-1)."?) | ||||||
|  | 			AND r.record_id IN ( | ||||||
|  | 				SELECT MAX(record_id) | ||||||
|  | 				FROM records | ||||||
|  | 				GROUP BY subdevice_id | ||||||
|  | 			  ) | ||||||
|  | 			GROUP BY subdevice_id | ||||||
|  | 			ORDER BY d.name DESC | ||||||
|  | 		", $roomIds);
 | ||||||
|  | 
 | ||||||
|  | 		$ret = []; | ||||||
|  | 		foreach($rows as $row){ | ||||||
|  | 			$ret[$row['room_id']][] = $row; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return $ret; | ||||||
|  | 	} | ||||||
| } | } | ||||||
| @@ -1,9 +1,9 @@ | |||||||
| <?php | <?php | ||||||
| class UserManager | class UserManager | ||||||
| { | { | ||||||
| 	public function getUsers () { | 	public static function getUsers ($filtr = ['*']) { | ||||||
| 		try { | 		try { | ||||||
| 			$allUsers = Db::loadAll ("SELECT user_id, username, at_home, ota FROM users"); | 			$allUsers = Db::loadAll ("SELECT " . implode(",", $filtr) . " FROM users"); | ||||||
| 			return $allUsers; | 			return $allUsers; | ||||||
| 		} catch(PDOException $error) { | 		} catch(PDOException $error) { | ||||||
| 			echo $error->getMessage(); | 			echo $error->getMessage(); | ||||||
| @@ -11,7 +11,7 @@ class UserManager | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function getUser ($userName) { | 	public static function getUser ($userName) { | ||||||
| 		try { | 		try { | ||||||
| 			$user = Db::loadOne ("SELECT * FROM users WHERE username = ?", [$userName]); | 			$user = Db::loadOne ("SELECT * FROM users WHERE username = ?", [$userName]); | ||||||
| 			return $user; | 			return $user; | ||||||
| @@ -21,7 +21,7 @@ class UserManager | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function getUserId ($userId) { | 	public static function getUserId ($userId) { | ||||||
| 		try { | 		try { | ||||||
| 			$user = Db::loadOne ("SELECT * FROM users WHERE user_id = ?", [$userId]); | 			$user = Db::loadOne ("SELECT * FROM users WHERE user_id = ?", [$userId]); | ||||||
| 			return $user; | 			return $user; | ||||||
| @@ -31,28 +31,26 @@ class UserManager | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function getAvatarUrl($userId = null){ | 	public static function getAvatarUrl($userId = null){ | ||||||
| 		$email = self::getUserData('email'); | 		if ($userId == null) { | ||||||
| 		if ($userId != null){ | 			$email = self::getUserData('email'); | ||||||
|  | 		} | ||||||
|  | 		else if ($userId != null){ | ||||||
| 			$email = self::getUserData('email',$userId); | 			$email = self::getUserData('email',$userId); | ||||||
| 		} | 		} | ||||||
| 		return 'https://secure.gravatar.com/avatar/' . md5( strtolower( trim( $email ) ) ); | 		return 'https://secure.gravatar.com/avatar/' . md5( strtolower( trim( $email ) ) ); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function login ($username, $password, $rememberMe) { | 	public static function login ($username, $password, $rememberMe) { | ||||||
| 		try { | 		try { | ||||||
| 			if ($user = Db::loadOne ('SELECT * FROM users WHERE LOWER(username)=LOWER(?)', array ($username))) { | 			if ($user = Db::loadOne ('SELECT * FROM users WHERE (LOWER(username)=LOWER(?) OR LOWER(email)=LOWER(?))', array ($username, $username))) { | ||||||
| 				if ($user['password'] == UserManager::getHashPassword($password)) { | 				if ($user['password'] == UserManager::getHashPassword($password)) { | ||||||
| 					if (isset($rememberMe) && $rememberMe == 'true') { | 					if (isset($rememberMe) && $rememberMe == 'true') { | ||||||
| 						setcookie ("rememberMe", $this->setEncryptedCookie($user['username']), time () + (30 * 24 * 60 * 60 * 1000), BASEDIR, $_SERVER['HTTP_HOST'], 1); | 						setcookie ("rememberMe", self::setEncryptedCookie($user['username']), time () + (30 * 24 * 60 * 60 * 1000), BASEDIR, $_SERVER['HTTP_HOST'], 1); | ||||||
| 					} | 					} | ||||||
| 					$_SESSION['user']['id'] = $user['user_id']; | 					$_SESSION['user']['id'] = $user['user_id']; | ||||||
| 					$page = ""; |  | ||||||
| 					if ($user["startPage"] == 1) { |  | ||||||
| 						$page = "dashboard"; |  | ||||||
| 					} |  | ||||||
| 					unset($_POST['login']); | 					unset($_POST['login']); | ||||||
| 					return $page; | 					return ""; | ||||||
| 				} else { | 				} else { | ||||||
| 					throw new PDOException("Heslo není správné!"); | 					throw new PDOException("Heslo není správné!"); | ||||||
| 				} | 				} | ||||||
| @@ -60,16 +58,17 @@ class UserManager | |||||||
| 				throw new PDOException("Uživatel s tím to jménem neexistuje!"); | 				throw new PDOException("Uživatel s tím to jménem neexistuje!"); | ||||||
| 			} | 			} | ||||||
| 		} catch(PDOException $error) { | 		} catch(PDOException $error) { | ||||||
| 			echo $error->getMessage(); | 			$_SESSION['msg'] = $error->getMessage(); | ||||||
|  | 			unset($_POST); | ||||||
|  | 			header('Location: ' . BASEURL . 'login'); | ||||||
| 			die(); | 			die(); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function loginNew ($username, $password) { | 	public static function loginNew ($username, $password) { | ||||||
| 		try { | 		try { | ||||||
| 			if ($user = Db::loadOne ('SELECT * FROM users WHERE LOWER(username)=LOWER(?)', array ($username))) { | 			if ($user = Db::loadOne ('SELECT * FROM users WHERE LOWER(username)=LOWER(?) OR LOWER(email)=LOWER(?)', array ($username, $username))) { | ||||||
| 				if ($user['password'] == UserManager::getHashPassword($password)) { | 				if ($user['password'] == UserManager::getHashPassword($password)) { | ||||||
| 					echo "user loged in"; |  | ||||||
| 					return $user['user_id']; | 					return $user['user_id']; | ||||||
| 				} else { | 				} else { | ||||||
| 					return false; | 					return false; | ||||||
| @@ -83,12 +82,12 @@ class UserManager | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function isLogin () { | 	public static function isLogin () { | ||||||
| 		if (isset ($_SESSION['user']) && isset($_SESSION['user']['id'])) { | 		if (isset ($_SESSION['user']) && isset($_SESSION['user']['id'])) { | ||||||
| 			return true; | 			return true; | ||||||
| 		} else { | 		} else { | ||||||
| 			if (isset ($_COOKIE['rememberMe'])){ | 			if (isset ($_COOKIE['rememberMe'])){ | ||||||
| 				if ($user = Db::loadOne ('SELECT * FROM users WHERE LOWER(username)=LOWER(?)', array ($this->getDecryptedCookie($_COOKIE['rememberMe'])))) { | 				if ($user = Db::loadOne ('SELECT * FROM users WHERE LOWER(username)=LOWER(?)', array (self::getDecryptedCookie($_COOKIE['rememberMe'])))) { | ||||||
| 					$_SESSION['user']['id'] = $user['user_id']; | 					$_SESSION['user']['id'] = $user['user_id']; | ||||||
| 					return true; | 					return true; | ||||||
| 				} | 				} | ||||||
| @@ -97,16 +96,14 @@ class UserManager | |||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function logout () { | 	public static function logout () { | ||||||
| 		unset($_SESSION['user']); | 		unset($_SESSION['user']); | ||||||
|  | 		unset($_COOKIE['rememberMe']); | ||||||
|  | 		setcookie("rememberMe", 'false', 0 - time(), BASEDIR, $_SERVER['HTTP_HOST']); | ||||||
| 		session_destroy(); | 		session_destroy(); | ||||||
| 		if (isset($_COOKIE['rememberMe'])){ |  | ||||||
| 			unset($_COOKIE['rememberMe']); |  | ||||||
| 			setcookie("rememberMe", 'false', time(), BASEDIR, $_SERVER['HTTP_HOST']); |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function setEncryptedCookie($value){ | 	public static function setEncryptedCookie($value){ | ||||||
| 		$first_key = base64_decode(FIRSTKEY); | 		$first_key = base64_decode(FIRSTKEY); | ||||||
| 		$second_key = base64_decode(SECONDKEY); | 		$second_key = base64_decode(SECONDKEY); | ||||||
| 
 | 
 | ||||||
| @@ -119,7 +116,7 @@ class UserManager | |||||||
| 		return $newvalue; | 		return $newvalue; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function getDecryptedCookie($value){ | 	public static function getDecryptedCookie($value){ | ||||||
| 		$first_key = base64_decode(FIRSTKEY); | 		$first_key = base64_decode(FIRSTKEY); | ||||||
| 		$second_key = base64_decode(SECONDKEY); | 		$second_key = base64_decode(SECONDKEY); | ||||||
| 
 | 
 | ||||||
| @@ -145,19 +142,25 @@ class UserManager | |||||||
| 		return $user[$type]; | 		return $user[$type]; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function setUserData ($type, $value) { | 	public static function setUserData ($type, $value) { | ||||||
| 		if (isset ($_SESSION['user']['id'])) { | 		if (isset ($_SESSION['user']['id'])) { | ||||||
| 			Db::command ('UPDATE users SET ' . $type . '=? WHERE user_id=?', array ($value, $_SESSION['user']['id'])); | 			Db::command ('UPDATE users SET ' . $type . '=? WHERE user_id=?', array ($value, $_SESSION['user']['id'])); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function getHashPassword ($password) { | 	public static function setUserDataAdmin ($type, $value, $id) { | ||||||
|  | 		if ($id) { | ||||||
|  | 			Db::command ('UPDATE users SET ' . $type . '=? WHERE user_id=?', array ($value, $id)); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public static function getHashPassword ($password) { | ||||||
| 		$salt = "s0mRIdlKvI"; | 		$salt = "s0mRIdlKvI"; | ||||||
| 		$hashPassword = hash('sha512', ($password . $salt)); | 		$hashPassword = hash('sha512', ($password . $salt)); | ||||||
| 		return $hashPassword; | 		return $hashPassword; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function atHome($userId, $atHome){ | 	public static function atHome($userId, $atHome){ | ||||||
| 		try { | 		try { | ||||||
| 			Db::edit ('users', ['at_home' => $atHome], 'WHERE user_id = ?', array($userId)); | 			Db::edit ('users', ['at_home' => $atHome], 'WHERE user_id = ?', array($userId)); | ||||||
| 		} catch(PDOException $error) { | 		} catch(PDOException $error) { | ||||||
| @@ -166,7 +169,7 @@ class UserManager | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function changePassword($oldPassword, $newPassword, $newPassword2){ | 	public static function changePassword($oldPassword, $newPassword, $newPassword2){ | ||||||
| 		if ($newPassword == $newPassword2) { | 		if ($newPassword == $newPassword2) { | ||||||
| 			//Password Criteria
 | 			//Password Criteria
 | ||||||
| 			$oldPasswordSaved = self::getUserData('password'); | 			$oldPasswordSaved = self::getUserData('password'); | ||||||
| @@ -180,8 +183,9 @@ class UserManager | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function createUser($userName, $password){ | 	public static function createUser ($userName, $password, $email) { | ||||||
| 		$userId = Db::loadOne('SELECT * FROM users WHERE username = ?;', array($userName))['user_id']; | 		$email = strtolower ($email); | ||||||
|  | 		$userId = Db::loadOne ('SELECT * FROM users WHERE LOWER (username) = LOWER (?) OR LOWER (email) = LOWER (?);', array ($userName, $email))['user_id']; | ||||||
| 		if ($userId != null) { | 		if ($userId != null) { | ||||||
| 			return false; | 			return false; | ||||||
| 		}; | 		}; | ||||||
| @@ -189,6 +193,7 @@ class UserManager | |||||||
| 			$user = [ | 			$user = [ | ||||||
| 				'username' => $userName, | 				'username' => $userName, | ||||||
| 				'password' => self::getHashPassword($password), | 				'password' => self::getHashPassword($password), | ||||||
|  | 				'email' => $email, | ||||||
| 			]; | 			]; | ||||||
| 			return Db::add ('users', $user); | 			return Db::add ('users', $user); | ||||||
| 		} catch(PDOException $error) { | 		} catch(PDOException $error) { | ||||||
| @@ -197,8 +202,8 @@ class UserManager | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function	haveOtaEnabled($userName){ | 	public static function	haveOtaEnabled($userName){ | ||||||
| 		$ota = $this->getUser($userName)['ota']; | 		$ota = self::getUser($userName)['ota']; | ||||||
| 
 | 
 | ||||||
| 		if ($ota != ''){ | 		if ($ota != ''){ | ||||||
| 			return ($ota != '' ? $ota : false); | 			return ($ota != '' ? $ota : false); | ||||||
| @@ -206,5 +211,15 @@ class UserManager | |||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	public static function setOta($otaCode, $otaSecret){ | ||||||
|  | 		$ga = new PHPGangsta_GoogleAuthenticator(); | ||||||
|  | 		$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2);    // 2 = 2*30sec clock tolerance
 | ||||||
|  | 		if ($checkResult) { | ||||||
|  | 			self::setUserData('ota', $otaSecret); | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
| } | } | ||||||
| ?>
 | ?>
 | ||||||
							
								
								
									
										19
									
								
								app/models/managers/VirtualDeviceManager.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								app/models/managers/VirtualDeviceManager.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | <?php | ||||||
|  | class VirtualDeviceManager | ||||||
|  | { | ||||||
|  | 	public function fetchEnabled($deviceId = null, $subDeviceId = null){ | ||||||
|  | 		$sleepTime = DeviceManager::getDeviceById($deviceId)['sleep_time']; | ||||||
|  |  | ||||||
|  | 		$LastRecordTime = new DateTime(RecordManager::getLastRecord($subDeviceId, 1)['time']); | ||||||
|  | 		$interval = $LastRecordTime->diff(new DateTime()); | ||||||
|  | 		$hours   = $interval->format('%h'); | ||||||
|  | 		$minutes = $interval->format('%i'); | ||||||
|  | 		$lastSeen = ($hours * 60 + $minutes); | ||||||
|  |  | ||||||
|  | 		if ($lastSeen > $sleepTime || $sleepTime == 0) { | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										185
									
								
								app/models/types/GoogleHomeDeviceTypes.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								app/models/types/GoogleHomeDeviceTypes.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,185 @@ | |||||||
|  | <?php | ||||||
|  | class GoogleHomeDeviceTypes { | ||||||
|  | 	/*const AirConditioningUnit	   = 'action.devices.types.AC_UNIT'; | ||||||
|  | 	const AirFreshener 			   = 'action.devices.types.AIRFRESHENER'; | ||||||
|  | 	const AirPurifier             = 'action.devices.types.AIRPURIFIER'; | ||||||
|  | 	const Awning 					   = 'action.devices.types.AWNING'; | ||||||
|  | 	const Bathtub 					   = 'action.devices.types.BATHTUB'; | ||||||
|  | 	const Bed 					 	   = 'action.devices.types.BED'; | ||||||
|  | 	const Blender				 	   = 'action.devices.types.BLENDER'; | ||||||
|  | 	const Blinds					   = 'action.devices.types.BLINDS'; | ||||||
|  | 	const Boiler					   = 'action.devices.types.BOILER'; | ||||||
|  | 	const Camera					   = 'action.devices.types.CAMERA'; | ||||||
|  | 	const CarbonMonoxideDetector	= 'action.devices.types.CARBON_MONOXIDE_DETECTOR'; | ||||||
|  | 	const Charger						= 'action.devices.types.CHARGER'; | ||||||
|  | 	const Closet						= 'action.devices.types.CLOSET'; | ||||||
|  | 	const CoffeeMaker					= 'action.devices.types.COFFEE_MAKER'; | ||||||
|  | 	const Cooktop						= 'action.devices.types.COOKTOP'; | ||||||
|  | 	const Curtain						= 'action.devices.types.CURTAIN'; | ||||||
|  | 	const Dehumidifier				= 'action.devices.types.DEHUMIDIFIER'; | ||||||
|  | 	const Dehydrator					= 'action.devices.types.DEHYDRATOR'; | ||||||
|  | 	const Dishwasher					= 'action.devices.types.DISHWASHER'; | ||||||
|  | 	const Door							= 'action.devices.types.DOOR'; | ||||||
|  | 	const Drawer						= 'action.devices.types.DRAWER'; | ||||||
|  | 	const Dryer							= 'action.devices.types.DRYER'; | ||||||
|  | 	const Fan							= 'action.devices.types.FAN'; | ||||||
|  | 	const Faucet						= 'action.devices.types.FAUCET'; | ||||||
|  | 	const Fireplace					= 'action.devices.types.FIREPLACE'; | ||||||
|  | 	const Fryer                   = 'action.devices.types.FRYER'; | ||||||
|  | 	const GarageDoor              = 'action.devices.types.GARAGE'; | ||||||
|  | 	const Gate							= 'action.devices.types.GATE'; | ||||||
|  | 	const Grill							= 'action.devices.types.GRILL'; | ||||||
|  | 	const Heater						= 'action.devices.types.HEATER'; | ||||||
|  | 	const Hood							= 'action.devices.types.HOOD'; | ||||||
|  | 	const Humidifier					= 'action.devices.types.HUMIDIFIER'; | ||||||
|  | 	const Kettle						= 'action.devices.types.KETTLE'; | ||||||
|  | 	const Light							= 'action.devices.types.LIGHT'; | ||||||
|  | 	const Lock							= 'action.devices.types.LOCK'; | ||||||
|  | 	const MediaRemote					= 'action.devices.types.REMOTECONTROL'; | ||||||
|  | 	const Mop							= 'action.devices.types.MOP'; | ||||||
|  | 	const Mower							= 'action.devices.types.MOWER'; | ||||||
|  | 	const Microwave					= 'action.devices.types.MICROWAVE'; | ||||||
|  | 	const Multicooker					= 'action.devices.types.MULTICOOKER'; | ||||||
|  | 	const Network						= 'action.devices.types.NETWORK'; | ||||||
|  |  | ||||||
|  | 	const Oven							= 'action.devices.types.OVEN'; | ||||||
|  | 	const Pergola						= 'action.devices.types.PERGOLA'; | ||||||
|  | 	const PetFeeder					= 'action.devices.types.PETFEEDER'; | ||||||
|  | 	const PressureCooker				= 'action.devices.types.PRESSURECOOKER'; | ||||||
|  | 	const Radiator						= 'action.devices.types.RADIATOR'; | ||||||
|  | 	const Refrigerator				= 'action.devices.types.REFRIGERATOR'; | ||||||
|  | 	const Router						= 'action.devices.types.ROUTER'; | ||||||
|  | 	const Scene							= 'action.devices.types.SCENE'; | ||||||
|  | 	const Sensor						= 'action.devices.types.SENSOR'; | ||||||
|  | 	const SecuritySystem				= 'action.devices.types.SECURITYSYSTEM'; | ||||||
|  | 	const SettopBox					= 'action.devices.types.SETTOP'; | ||||||
|  | 	const Shutter						= 'action.devices.types.SHUTTER'; | ||||||
|  | 	const Shower						= 'action.devices.types.SHOWER'; | ||||||
|  | 	const SmokeDetector				= 'action.devices.types.SMOKE_DETECTOR'; | ||||||
|  | 	const SousVide						= 'action.devices.types.SOUSVIDE'; | ||||||
|  | 	const Sprinkler					= 'action.devices.types.SPRINKLER'; | ||||||
|  | 	const StandMixer					= 'action.devices.types.STANDMIXER'; | ||||||
|  | 	const Switch						= 'action.devices.types.SWITCH'; | ||||||
|  | 	const Television					= 'action.devices.types.TV'; | ||||||
|  | 	const Thermostat					= 'action.devices.types.THERMOSTAT'; | ||||||
|  | 	const Vacuum						= 'action.devices.types.VACUUM'; | ||||||
|  | 	const Valve							= 'action.devices.types.VALVE'; | ||||||
|  | 	const Washer						= 'action.devices.types.WASHER'; | ||||||
|  | 	const WaterHeater					= 'action.devices.types.WATERHEATER'; | ||||||
|  | 	const WaterPurifier				= 'action.devices.types.WATERPURIFIER'; | ||||||
|  | 	const WaterSoftener				= 'action.devices.types.WATERSOFTENER'; | ||||||
|  | 	const Window						= 'action.devices.types.WINDOW'; | ||||||
|  | 	const YogurtMaker					= 'action.devices.types.YOGURTMAKER';*/ | ||||||
|  |  | ||||||
|  | 	private static $actionWordBook = [ | ||||||
|  | 		'control-light' 			=> 'action.devices.types.LIGHT', | ||||||
|  | 		'control-socket' 			=> 'action.devices.types.OUTLET', | ||||||
|  | 		'control-temp'				=> 'action.devices.types.THERMOSTAT', | ||||||
|  | 		'control-media'			=> 'action.devices.types.REMOTECONTROL', | ||||||
|  | 	]; | ||||||
|  |  | ||||||
|  | 	private static $traidWordBook = [ | ||||||
|  | 		'on/off' 					=> 'action.devices.traits.OnOff', | ||||||
|  | 		'temp_cont' 				=> 'action.devices.traits.TemperatureSetting', | ||||||
|  | 		'vol_cont'					=> 'action.devices.traits.Volume', | ||||||
|  | 		'media_cont'            => 'action.devices.traits.TransportControl', | ||||||
|  | 		'media_status'          => 'action.devices.traits.MediaState', | ||||||
|  | 		'media_apps'            => 'action.devices.traits.AppSelector', | ||||||
|  | 		'media_input'           => 'action.devices.traits.InputSelector', | ||||||
|  | 	]; | ||||||
|  |  | ||||||
|  | 	private static $commandWordBook = [ | ||||||
|  | 		'action.devices.commands.OnOff' => 'on/off', | ||||||
|  | 		'action.devices.commands.ThermostatTemperatureSetpoint' => 'temp_cont', | ||||||
|  | 		'action.devices.commands.ThermostatSetMode' => 'temp_cont', | ||||||
|  | 		'action.devices.commands.setVolume' => 'vol_cont', | ||||||
|  | 		'action.devices.commands.mediaNext' => 'media_status', | ||||||
|  | 		'action.devices.commands.mediaPause' => 'media_status', | ||||||
|  | 		'action.devices.commands.mediaPrevious' => 'media_status', | ||||||
|  | 		'action.devices.commands.mediaResume' => 'media_status', | ||||||
|  | 		'action.devices.commands.mediaStop' => 'media_status', | ||||||
|  | 		'action.devices.commands.appSelect' => 'media_apps', | ||||||
|  | 		'action.devices.commands.SetInput' => 'media_input', | ||||||
|  | 	]; | ||||||
|  |  | ||||||
|  | 	private static $attributeWordBook = [ | ||||||
|  | 		'on/off' => [ | ||||||
|  | 			'commandOnlyOnOff' => false, | ||||||
|  | 		], | ||||||
|  | 		'temp_cont' 				=> [ | ||||||
|  | 			'availableThermostatModes' => 'off,heat', | ||||||
|  | 			'thermostatTemperatureUnit' => 'C', | ||||||
|  | 		], | ||||||
|  | 		'vol_cont' 				=> [ | ||||||
|  | 			'volumeCanMuteAndUnmute' => false, | ||||||
|  | 			'volumeDefaultPercentage' => 6, | ||||||
|  | 			'volumeMaxLevel' => 100, | ||||||
|  | 			'levelStepSize' => 2, | ||||||
|  | 			'commandOnlyVolume' => false, | ||||||
|  | 		], | ||||||
|  | 		'media_cont'=> [ | ||||||
|  | 			'transportControlSupportedCommands' => [ | ||||||
|  | 				"NEXT", | ||||||
|  | 				"PREVIOUS", | ||||||
|  | 				"PAUSE", | ||||||
|  | 				"STOP", | ||||||
|  | 				"RESUME", | ||||||
|  | 				"CAPTION_CONTROL" | ||||||
|  | 			], | ||||||
|  | 		], | ||||||
|  | 		'media_status'=> [ | ||||||
|  | 			'supportActivityState' => true, | ||||||
|  | 			'supportPlaybackState' => true, | ||||||
|  | 		], | ||||||
|  | 		'media_apps' => [ | ||||||
|  | 			"availableApplications" => [ | ||||||
|  | 				[ | ||||||
|  | 					"key" => "kodi", | ||||||
|  | 					"names" => [ | ||||||
|  | 						"name_synonym" => [ | ||||||
|  | 							"Kodi", | ||||||
|  | 						], | ||||||
|  | 						"lang" => "en", | ||||||
|  | 					], | ||||||
|  | 				], | ||||||
|  | 			], | ||||||
|  | 		], | ||||||
|  | 		'media_input' => [ | ||||||
|  | 			"availableInputs" => [ | ||||||
|  | 				[ | ||||||
|  | 					"key" => "pc", | ||||||
|  | 					"names" => [ | ||||||
|  | 						"name_synonym"  => [ | ||||||
|  | 							"PC", | ||||||
|  | 						], | ||||||
|  | 						"lang"  => "en", | ||||||
|  | 					], | ||||||
|  | 				], | ||||||
|  | 			] | ||||||
|  | 		], | ||||||
|  | 	]; | ||||||
|  |  | ||||||
|  | 	static function getAction($deviceType){ | ||||||
|  | 		if (!isset(self::$actionWordBook[$deviceType])) return; | ||||||
|  | 		return self::$actionWordBook[$deviceType]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	static function getTraid($subDeviceType){ | ||||||
|  | 		if (!isset(self::$traidWordBook[$subDeviceType])) return; | ||||||
|  | 		return self::$traidWordBook[$subDeviceType]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	static function getType($subDeviceCommand){ | ||||||
|  | 		if (!isset(self::$commandWordBook[$subDeviceCommand])) return; | ||||||
|  | 		return self::$commandWordBook[$subDeviceCommand]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	static function getAttribute($subDeviceType){ | ||||||
|  | 		if (!isset(self::$attributeWordBook[$subDeviceType])) return; | ||||||
|  | 		return self::$attributeWordBook[$subDeviceType]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	static function getQueryJson($deviceType, $type){ | ||||||
|  | 		return self::$wordBook[$type]; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										19
									
								
								app/models/types/LogRecordTypes.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								app/models/types/LogRecordTypes.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | <?php | ||||||
|  | class LogRecordTypes{ | ||||||
|  | 	const ERROR = [ | ||||||
|  | 		'level' => 0, | ||||||
|  | 		'identifier' => 'error', | ||||||
|  | 	]; | ||||||
|  | 	const WARNING = [ | ||||||
|  | 		'level' => 1, | ||||||
|  | 		'identifier' =>'warning', | ||||||
|  | 	]; | ||||||
|  | 	const EXEPTION = [ | ||||||
|  | 		'level' => 2, | ||||||
|  | 		'identifier' => 'exeption', | ||||||
|  | 	]; | ||||||
|  | 	const INFO = [ | ||||||
|  | 		'level' => 3, | ||||||
|  | 		'identifier' => 'info', | ||||||
|  | 	]; | ||||||
|  | } | ||||||
							
								
								
									
										45
									
								
								app/models/types/WidgetTypes.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								app/models/types/WidgetTypes.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | class WidgetTypes { | ||||||
|  | 	const VALUE 	= 0; | ||||||
|  | 	const ICON 		= 1; | ||||||
|  | 	const BUTTON 	= 2; | ||||||
|  | 	const SWITH  	= 3; | ||||||
|  | 	const RANGE 	= 4; | ||||||
|  | 	const CUSTOM	= 5; | ||||||
|  |  | ||||||
|  | 	private $types = [ | ||||||
|  | 		self::VALUE => [ | ||||||
|  | 			'name' => 'value', | ||||||
|  | 			'active' => false | ||||||
|  | 		], | ||||||
|  | 		self::ICON => [ | ||||||
|  | 			'name' => 'icon', | ||||||
|  | 			'active' => false | ||||||
|  | 		], | ||||||
|  | 		self::BUTTON => [ | ||||||
|  | 			'name' => 'button', | ||||||
|  | 			'active' => true | ||||||
|  | 		], | ||||||
|  | 		self::SWITH => [ | ||||||
|  | 			'name' => 'switch', | ||||||
|  | 			'active' => true | ||||||
|  | 		], | ||||||
|  | 		self::RANGE => [ | ||||||
|  | 			'name' => 'range', | ||||||
|  | 			'active' => true | ||||||
|  | 		], | ||||||
|  | 		self::CUSTOM => [ | ||||||
|  | 			'name' => 'custom', | ||||||
|  | 			'active' => true | ||||||
|  | 		], | ||||||
|  | 	]; | ||||||
|  |  | ||||||
|  | 	public static function getName($type){ | ||||||
|  | 		return self::$types[$type]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public static function isActive($type){ | ||||||
|  | 		return isset(self::$types[$type]) && self::$types[$type]['active']; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										52
									
								
								app/plugins/!AirQuality.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								app/plugins/!AirQuality.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | |||||||
|  | <?php | ||||||
|  | class AirQuality extends VirtualDeviceManager | ||||||
|  | { | ||||||
|  | 	private $city_sluig = "prague"; | ||||||
|  | 	private $app_id = "53ccbc353bb0bd0b05515169a593b96c38d57c48"; | ||||||
|  | 	private $api_uri = 'http://api.waqi.info/feed/%s/?token=%s'; // Your redirect uri | ||||||
|  | 	private $virtual_device_name = "Air Quality"; | ||||||
|  | 	private $subdevice_type = "air-quality"; | ||||||
|  |  | ||||||
|  | 	function make() | ||||||
|  | 	{ | ||||||
|  | 		try { | ||||||
|  | 			if (DeviceManager::registeret($this->virtual_device_name)) { | ||||||
|  | 				$deviceId = DeviceManager::getDeviceByToken($this->virtual_device_name)['device_id']; | ||||||
|  | 				if (!$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, $this->subdevice_type)) { | ||||||
|  | 					SubDeviceManager::create($deviceId, $this->subdevice_type, ''); | ||||||
|  | 					sleep(1); | ||||||
|  | 					$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($this->subdevice_type)); | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				//if (!$this->fetchEnabled($deviceId,$subDevice['subdevice_id'])) die(); | ||||||
|  |  | ||||||
|  | 				$finalUrl = sprintf($this->api_uri, $this->city_sluig, $this->app_id); | ||||||
|  | 				$json = json_decode(Utilities::CallAPI('GET', $finalUrl, ''), true); | ||||||
|  | 				RecordManager::create($deviceId, $this->subdevice_type, $json['data']['aqi']); | ||||||
|  | 			} else { | ||||||
|  | 				DeviceManager::create($this->virtual_device_name, $this->virtual_device_name, 'senzore-virtual'); | ||||||
|  | 				DeviceManager::approved($this->virtual_device_name); | ||||||
|  | 			} | ||||||
|  | 			return 'sucessful'; | ||||||
|  | 		} catch(Exception $e) { | ||||||
|  | 			return 'exception: ' . $e->getMessage(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	function translate($value){ | ||||||
|  | 		if ($value < 50) { | ||||||
|  | 			return 'Good'; | ||||||
|  | 		}  else if  ($value > 51 && $value < 100) { | ||||||
|  | 			return 'Moderate'; | ||||||
|  | 		} else if ($value > 101 && $value < 150) { | ||||||
|  | 			return 'Normal'; | ||||||
|  | 		} else if ($value > 151 && $value < 200) { | ||||||
|  | 			return 'Unhealthy'; | ||||||
|  | 		} else if ($value > 201 && $value < 300) { | ||||||
|  | 			return 'Very Unhealthy'; | ||||||
|  | 		} else if ($value > 301 ) { | ||||||
|  | 			return 'Hazardous'; | ||||||
|  | 		} | ||||||
|  | 		return ''; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										52
									
								
								app/plugins/AirQuality.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								app/plugins/AirQuality.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | |||||||
|  | <?php | ||||||
|  | class AirQuality extends VirtualDeviceManager | ||||||
|  | { | ||||||
|  | 	private $city_sluig = "prague"; | ||||||
|  | 	private $app_id = "53ccbc353bb0bd0b05515169a593b96c38d57c48"; | ||||||
|  | 	private $api_uri = 'http://api.waqi.info/feed/%s/?token=%s'; // Your redirect uri | ||||||
|  | 	private $virtual_device_name = "Air Quality"; | ||||||
|  | 	private $subdevice_type = "air-quality"; | ||||||
|  |  | ||||||
|  | 	function make() | ||||||
|  | 	{ | ||||||
|  | 		try { | ||||||
|  | 			if (DeviceManager::registeret($this->virtual_device_name)) { | ||||||
|  | 				$deviceId = DeviceManager::getDeviceByToken($this->virtual_device_name)['device_id']; | ||||||
|  | 				if (!$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, $this->subdevice_type)) { | ||||||
|  | 					SubDeviceManager::create($deviceId, $this->subdevice_type, ''); | ||||||
|  | 					sleep(1); | ||||||
|  | 					$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($this->subdevice_type)); | ||||||
|  | 				} | ||||||
|  | 				 | ||||||
|  | 				//if (!$this->fetchEnabled($deviceId,$subDevice['subdevice_id'])) die(); | ||||||
|  | 				 | ||||||
|  | 				$finalUrl = sprintf($this->api_uri, $this->city_sluig, $this->app_id); | ||||||
|  | 				$json = json_decode(Utilities::CallAPI('GET', $finalUrl, ''), true); | ||||||
|  | 				RecordManager::create($deviceId, $this->subdevice_type, $json['data']['aqi']); | ||||||
|  | 			} else { | ||||||
|  | 				DeviceManager::create($this->virtual_device_name, $this->virtual_device_name, 'senzore-virtual'); | ||||||
|  | 				DeviceManager::approved($this->virtual_device_name); | ||||||
|  | 			} | ||||||
|  | 			return 'sucessful'; | ||||||
|  | 		} catch(Exception $e) { | ||||||
|  | 			return 'exception: ' . $e->getMessage(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	function translate($value){ | ||||||
|  | 		if ($value < 50) { | ||||||
|  | 			return 'Good'; | ||||||
|  | 		}  else if  ($value > 51 && $value < 100) { | ||||||
|  | 			return 'Moderate'; | ||||||
|  | 		} else if ($value > 101 && $value < 150) { | ||||||
|  | 			return 'Normal'; | ||||||
|  | 		} else if ($value > 151 && $value < 200) { | ||||||
|  | 			return 'Unhealthy'; | ||||||
|  | 		} else if ($value > 201 && $value < 300) { | ||||||
|  | 			return 'Very Unhealthy'; | ||||||
|  | 		} else if ($value > 301 ) { | ||||||
|  | 			return 'Hazardous'; | ||||||
|  | 		} | ||||||
|  | 		return ''; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										53
									
								
								app/plugins/CovidV2.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								app/plugins/CovidV2.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | |||||||
|  | <?php | ||||||
|  | class CovidV2 extends VirtualDeviceManager | ||||||
|  | { | ||||||
|  | 	private $api_uri = 'https://onemocneni-aktualne.mzcr.cz/api/v2/covid-19/nakazeni-vyleceni-umrti-testy.json'; // Your redirect uri | ||||||
|  | 	private $virtual_device_name = "Covid-V2"; | ||||||
|  | 	private $name_index = [ | ||||||
|  | 		"Active" => "kumulativni_pocet_nakazenych", | ||||||
|  | 		"Recovered" => "kumulativni_pocet_vylecenych", | ||||||
|  | 		"Tested" => "kumulativni_pocet_testu", | ||||||
|  | 		"Deaths" => "kumulativni_pocet_umrti", | ||||||
|  |  | ||||||
|  | 	]; | ||||||
|  |  | ||||||
|  | 	public function make() | ||||||
|  | 	{ | ||||||
|  | 		try { | ||||||
|  | 			if (DeviceManager::registeret($this->virtual_device_name)) { | ||||||
|  | 				$deviceId = DeviceManager::getDeviceByToken($this->virtual_device_name)['device_id']; | ||||||
|  | 				$dataItems = ['Tested', 'Deaths', 'Recovered', 'Active']; | ||||||
|  | 				foreach ($dataItems as $dataItem) { | ||||||
|  | 					if (!$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($dataItem))) { | ||||||
|  | 						SubDeviceManager::create($deviceId, strtolower($dataItem), $dataItem); | ||||||
|  | 						sleep(1); | ||||||
|  | 						$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($dataItem)); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				if (!$this->fetchEnabled($deviceId, $subDevice['subdevice_id'])) die(); | ||||||
|  |  | ||||||
|  | 				$finalUrl = $this->api_uri; | ||||||
|  | 				$json = json_decode(Utilities::CallAPI('GET', $finalUrl, ''), true)['data']; | ||||||
|  |  | ||||||
|  | 				foreach ($dataItems as $dataItem) { | ||||||
|  | 					RecordManager::create($deviceId, strtolower($dataItem), end($json)[$this->name_index[$dataItem]]); | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				DeviceManager::create($this->virtual_device_name, $this->virtual_device_name, strtolower($this->virtual_device_name)); | ||||||
|  | 				DeviceManager::approved($this->virtual_device_name); | ||||||
|  | 			} | ||||||
|  | 			return 'sucessful'; | ||||||
|  | 		} catch (Exception $e) { | ||||||
|  | 			return 'exception: ' . $e->getMessage(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function translate($value){ | ||||||
|  | 		$outcome = $value / 1000; | ||||||
|  | 		if ($outcome < 1){ | ||||||
|  | 			return $value; | ||||||
|  | 		} | ||||||
|  | 		return round($outcome) . 'K'; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										78
									
								
								app/plugins/DatabaseBackup.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								app/plugins/DatabaseBackup.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  | <?php | ||||||
|  | class DatabaseBackup | ||||||
|  | { | ||||||
|  | 	public function make() | ||||||
|  | 	{ | ||||||
|  | 		try { | ||||||
|  | 			$filenames = []; | ||||||
|  | 			$backupWorker = new DatabaseBackup; | ||||||
|  | 			$filenames[] = $backupWorker->scheme(); //Backup Database scheme | ||||||
|  | 			$filenames[] = $backupWorker->data(); //Backup Database Data | ||||||
|  | 			$filenames[] = $_SERVER['DOCUMENT_ROOT'] . '/config/config.php'; //Backup Configuration File | ||||||
|  | 			$backupWorker->compress($_SERVER['DOCUMENT_ROOT'] . BASEDIR . '/backup/' . date("Y-m-d", time()) . '.zip', $filenames); | ||||||
|  | 			return 'sucessful'; | ||||||
|  | 		} catch (Exception $e) { | ||||||
|  | 			return 'exception: ' . $e->getMessage(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	private function scheme() | ||||||
|  | 	{ | ||||||
|  | 		$backupfile = $_SERVER['DOCUMENT_ROOT'] . BASEDIR . "/backup/" . DBNAME . '_scheme_' . date("Y-m-d", time()) . '.sql'; | ||||||
|  | 		$command = "mysqldump --skip-comments --no-create-info -h localhost -u " . DBUSER . " -p" . DBPASS . " " . DBNAME . " -r $backupfile 2>&1"; | ||||||
|  | 		$this->executeCommand($command); | ||||||
|  | 		return $backupfile; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	private function data() | ||||||
|  | 	{ | ||||||
|  | 		$backupfile = $_SERVER['DOCUMENT_ROOT'] . BASEDIR . "/backup/" . DBNAME . '_data_' . date("Y-m-d", time()) . '.sql'; | ||||||
|  | 		$command = "mysqldump --skip-comments --no-data -h localhost -u " . DBUSER . " -p" . DBPASS . " " . DBNAME . " -r $backupfile 2>&1"; | ||||||
|  | 		$this->executeCommand($command); | ||||||
|  | 		return $backupfile; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	private function executeCommand($command) | ||||||
|  | 	{ | ||||||
|  | 		ini_set('date.timezone', 'Europe/Prague'); | ||||||
|  | 		exec($command); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	private function compress($filename, $files = []) | ||||||
|  | 	{ | ||||||
|  | 		$zip = new ZipArchive(); | ||||||
|  | 		if ($zip->open($filename, ZipArchive::CREATE | ZipArchive::OVERWRITE)) { | ||||||
|  | 			foreach ($files as $file) { | ||||||
|  | 				$zip->addFile($file); | ||||||
|  | 			} | ||||||
|  | 			$zip->close(); | ||||||
|  | 			foreach ($files as $file) { | ||||||
|  | 				unlink($file); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	private function cleaningDir($dir, $seconds) | ||||||
|  | 	{ | ||||||
|  | 		$todayFileName = date("Y-m-d") . '.zip'; | ||||||
|  | 		$logFiles = scandir($dir); | ||||||
|  | 		foreach ($logFiles as $key => $file) { | ||||||
|  | 			if (in_array($file, array(".", "..", ".gitkeep", $todayFileName))) { | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 			if (!is_dir($dir . $file)) { | ||||||
|  | 				if (strtotime(str_replace(".zip", "", $file)) < (strtotime("now") - $seconds)) { | ||||||
|  | 					unlink($dir . $file); | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				$this->cleaningDir($dir . $file . "/", $seconds); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function purge($days) | ||||||
|  | 	{ | ||||||
|  | 		$seconds = $days * 86400; | ||||||
|  | 		$this->cleaningDir('../backup/', $seconds); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										11
									
								
								app/plugins/ExamplePlugin.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								app/plugins/ExamplePlugin.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | <?php | ||||||
|  | class ExamplePlugin extends VirtualDeviceManager | ||||||
|  | { | ||||||
|  |     function make(){ | ||||||
|  |         //Getting Data | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function translate($value){ | ||||||
|  |         //Translation of numeric values | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								app/plugins/OpenWeatherMap.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								app/plugins/OpenWeatherMap.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | |||||||
|  | <?php | ||||||
|  | class OpenWeatherMap extends VirtualDeviceManager | ||||||
|  | { | ||||||
|  | 	private $city_sluig = "prague"; | ||||||
|  | 	private $app_id = "1ee609f2fcf8048e84f1d2fb1d1d72b5"; | ||||||
|  | 	private $api_uri = 'api.openweathermap.org/data/2.5/weather?q=%s&appid=%s'; // Your redirect uri | ||||||
|  | 	private $virtual_device_name = "Weather"; | ||||||
|  | 	private $subdevice_type = "weather"; | ||||||
|  |  | ||||||
|  | 	function make() | ||||||
|  | 	{ | ||||||
|  | 		try { | ||||||
|  | 			if (DeviceManager::registeret($this->virtual_device_name)) { | ||||||
|  | 				$deviceId = DeviceManager::getDeviceByToken($this->virtual_device_name)['device_id']; | ||||||
|  | 				if (!$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, $this->subdevice_type)) { | ||||||
|  | 					SubDeviceManager::create($deviceId, $this->subdevice_type, ''); | ||||||
|  | 					sleep(1); | ||||||
|  | 					$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($this->subdevice_type)); | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				if (!$this->fetchEnabled($deviceId, $subDevice['subdevice_id'])) die(); | ||||||
|  |  | ||||||
|  | 				$finalUrl = sprintf($this->api_uri, $this->city_sluig, $this->app_id); | ||||||
|  | 				$json = json_decode(Utilities::CallAPI('GET', $finalUrl, ''), true); | ||||||
|  |  | ||||||
|  | 				RecordManager::create($deviceId, $this->subdevice_type, $json['weather'][0]['id']); | ||||||
|  | 			} else { | ||||||
|  | 				DeviceManager::create($this->virtual_device_name, $this->virtual_device_name, 'senzore-virtual'); | ||||||
|  | 				DeviceManager::approved($this->virtual_device_name); | ||||||
|  | 			} | ||||||
|  | 			return 'sucessful'; | ||||||
|  | 		} catch (Exception $e) { | ||||||
|  | 			return 'exception: ' . $e->getMessage(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										66
									
								
								app/plugins/Spotify.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								app/plugins/Spotify.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | |||||||
|  | <?php | ||||||
|  | class Spotify extends VirtualDeviceManager | ||||||
|  | { | ||||||
|  | 	private $token = ""; | ||||||
|  | 	private $client_id = '76840e2199e34dcd903d19877bd726dd'; // Your client id | ||||||
|  | 	private $redirect_uri = 'https://dev.steelants.cz/vasek/home-update/plugins/spotify/callback'; // Your redirect uri | ||||||
|  |  | ||||||
|  | 	public function oAuth() | ||||||
|  | 	{ | ||||||
|  | 		$client_secret = 'CLIENT_SECRET'; // Your secret | ||||||
|  | 		$scopes = 'user-read-private user-read-email'; | ||||||
|  |  | ||||||
|  | 		header('Location: https://accounts.spotify.com/authorize?client_id=' . $this->client_id . '&response_type=token&redirect_uri=' . urlencode($this->redirect_uri) . '&scope=user-read-playback-state'); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	private function setToken($token) | ||||||
|  | 	{ | ||||||
|  | 		$this->token = $token; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function callback() | ||||||
|  | 	{ | ||||||
|  | 		var_dump($_REQUEST); | ||||||
|  | 		(new SettingsManager)->create('spotify_token', $token); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function autorize() | ||||||
|  | 	{ | ||||||
|  |  | ||||||
|  | 		$client_secret = '0f94ed2c0bd64bf791ea13b7e6310ba3'; | ||||||
|  |  | ||||||
|  | 		$ch = curl_init(); | ||||||
|  | 		curl_setopt($ch, CURLOPT_URL,            'https://accounts.spotify.com/api/token'); | ||||||
|  | 		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | ||||||
|  | 		curl_setopt($ch, CURLOPT_POST,           1); | ||||||
|  | 		curl_setopt($ch, CURLOPT_POSTFIELDS,     'grant_type=client_credentials&scope=user-read-playback-state'); | ||||||
|  | 		curl_setopt($ch, CURLOPT_HTTPHEADER,     array('Authorization: Basic ' . base64_encode($this->client_id . ':' . $client_secret))); | ||||||
|  |  | ||||||
|  | 		$result = curl_exec($ch); | ||||||
|  |  | ||||||
|  | 		$this->setToken(json_decode($result, true)['access_token']); | ||||||
|  | 		echo $result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	private function getPlayerData() | ||||||
|  | 	{ | ||||||
|  | 		$ch = curl_init(); | ||||||
|  | 		curl_setopt($ch, CURLOPT_URL,            'https://api.spotify.com/v1/me/player'); | ||||||
|  | 		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | ||||||
|  | 		curl_setopt($ch, CURLOPT_HTTPHEADER,     array('Authorization: Bearer ' . (new SettingsManager)->getByName('spotify_token')['value'])); | ||||||
|  |  | ||||||
|  | 		$result = curl_exec($ch); | ||||||
|  | 		echo $result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// function make() | ||||||
|  | 	// { | ||||||
|  | 	// 	try { | ||||||
|  | 	// 		//$this->autorize();d | ||||||
|  | 	// 		//$this->getPlayerData(); | ||||||
|  | 	// 		return 'sucessful'; | ||||||
|  | 	// 	} catch (Exception $e) { | ||||||
|  | 	// 		return 'exception: ' . $e->getMessage(); | ||||||
|  | 	// 	} | ||||||
|  | 	// } | ||||||
|  | } | ||||||
							
								
								
									
										66
									
								
								app/plugins/UsaElection.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								app/plugins/UsaElection.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | |||||||
|  | <?php | ||||||
|  | class UsaElection extends VirtualDeviceManager | ||||||
|  | { | ||||||
|  | 	private $api_uri = 'https://ft-ig-content-prod.s3.eu-west-1.amazonaws.com/v2/Financial-Times/ig-rcp-polls-backend/2020-presidential/latest/presidential-races.json'; // Your redirect uri | ||||||
|  | 	private $virtual_device_name = "Election"; | ||||||
|  | 	private $subdevice_type = "election"; | ||||||
|  |  | ||||||
|  | 	function make() | ||||||
|  | 	{ | ||||||
|  | 		try { | ||||||
|  | 			if (DeviceManager::registeret($this->virtual_device_name)) { | ||||||
|  | 				$deviceId = DeviceManager::getDeviceByToken($this->virtual_device_name)['device_id']; | ||||||
|  | 				$dataItems = ['Trump', 'Biden', 'Unknown']; | ||||||
|  | 				foreach ($dataItems as $dataItem) { | ||||||
|  | 					if (!$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($dataItem))) { | ||||||
|  | 						SubDeviceManager::create($deviceId, strtolower($dataItem), '% ' . $dataItem); | ||||||
|  | 						sleep(1); | ||||||
|  | 						$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($this->subdevice_type)); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				if (!$this->fetchEnabled($deviceId, $subDevice['subdevice_id'])) die(); | ||||||
|  |  | ||||||
|  | 				$finalUrl = $this->api_uri; | ||||||
|  | 				$json = json_decode(Utilities::CallAPI('GET', $finalUrl), true); | ||||||
|  |  | ||||||
|  | 				$voteSpectrum = [ | ||||||
|  | 					'republican' => [ | ||||||
|  | 						'solid' => 0, | ||||||
|  | 						'leaning' => 0, | ||||||
|  | 					], | ||||||
|  | 					'democrat' => [ | ||||||
|  | 						'solid' => 0, | ||||||
|  | 						'leaning' => 0, | ||||||
|  | 					], | ||||||
|  | 					'tossup' => 0 | ||||||
|  | 				]; | ||||||
|  |  | ||||||
|  | 				foreach ($json as $state) { | ||||||
|  | 					if ($state['raceCategory'] != 'tossup') { | ||||||
|  | 						$raceCategory = explode('-', $state['raceCategory']); | ||||||
|  | 						$voteSpectrum[$raceCategory[0]][$raceCategory[1]] = $voteSpectrum[$raceCategory[0]][$raceCategory[1]] + $state['raceDelegates']; | ||||||
|  | 					} else { | ||||||
|  | 						$voteSpectrum['tossup'] = $voteSpectrum['tossup'] + $state['raceDelegates']; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				$Trump = $voteSpectrum['republican']['solid'] + $voteSpectrum['republican']['leaning']; | ||||||
|  | 				$Biden = $voteSpectrum['democrat']['solid'] + $voteSpectrum['democrat']['leaning']; | ||||||
|  | 				$Unknown = $voteSpectrum['tossup']; | ||||||
|  |  | ||||||
|  | 				$OnePercent = ($Trump + $Biden + $Unknown) / 100; | ||||||
|  |  | ||||||
|  | 				foreach ($dataItems as $Category) { | ||||||
|  | 					RecordManager::create($deviceId, strtolower($Category), round(($$Category / $OnePercent))); | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				DeviceManager::create($this->virtual_device_name, $this->virtual_device_name, 'senzore-virtual'); | ||||||
|  | 				DeviceManager::approved($this->virtual_device_name); | ||||||
|  | 			} | ||||||
|  | 			return 'sucessful'; | ||||||
|  | 		} catch (Exception $e) { | ||||||
|  | 			return 'exception: ' . $e->getMessage(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										39
									
								
								app/plugins/_Covid.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								app/plugins/_Covid.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | |||||||
|  | <?php | ||||||
|  | class Covid extends VirtualDeviceManager | ||||||
|  | { | ||||||
|  | 	private $country_sluig = "czech-republic"; | ||||||
|  | 	private $api_uri = 'https://api.covid19api.com/live/country/%s/status/confirmed'; // Your redirect uri | ||||||
|  | 	private $virtual_device_name = "Covid"; | ||||||
|  |  | ||||||
|  | 	function make() | ||||||
|  | 	{ | ||||||
|  | 		try { | ||||||
|  | 			if (DeviceManager::registeret($this->virtual_device_name)) { | ||||||
|  | 				$deviceId = DeviceManager::getDeviceByToken($this->virtual_device_name)['device_id']; | ||||||
|  | 				$dataItems = ['Confirmed', 'Deaths', 'Recovered', 'Active']; | ||||||
|  | 				foreach ($dataItems as $dataItem) { | ||||||
|  | 					if (!$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($dataItem))) { | ||||||
|  | 						SubDeviceManager::create($deviceId, strtolower($dataItem), $dataItem); | ||||||
|  | 						sleep(1); | ||||||
|  | 						$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($dataItem)); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				if (!$this->fetchEnabled($deviceId, $subDevice['subdevice_id'])) die(); | ||||||
|  |  | ||||||
|  | 				$finalUrl = sprintf($this->api_uri, $this->country_sluig); | ||||||
|  | 				$json = json_decode(Utilities::CallAPI('GET', $finalUrl, ''), true); | ||||||
|  |  | ||||||
|  | 				foreach ($dataItems as $dataItem) { | ||||||
|  | 					RecordManager::create($deviceId, strtolower($dataItem), end($json)[$dataItem]); | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				DeviceManager::create($this->virtual_device_name, $this->virtual_device_name, 'senzore-virtual'); | ||||||
|  | 				DeviceManager::approved($this->virtual_device_name); | ||||||
|  | 			} | ||||||
|  | 			return 'sucessful'; | ||||||
|  | 		} catch (Exception $e) { | ||||||
|  | 			return 'exception: ' . $e->getMessage(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -1,67 +0,0 @@ | |||||||
| <!DOCTYPE html> |  | ||||||
| <html lang="en"> |  | ||||||
| <head> |  | ||||||
| 	<?php |  | ||||||
| 	$partial = new Partial('head'); |  | ||||||
| 	$partial->prepare('baseDir', $BASEDIR); |  | ||||||
| 	$partial->render(); |  | ||||||
| 	?> |  | ||||||
| 	<title><?php echo $TITLE; ?></title> |  | ||||||
| </head> |  | ||||||
| <body class="no-transitions"> |  | ||||||
| 	<div class="row no-gutters main"> |  | ||||||
| 		<div class="col-md-3 d-sm-none"></div> |  | ||||||
| 		<div class="col-md-3 nav-container"> |  | ||||||
| 			<?php |  | ||||||
| 			$partial = new Partial('menu'); |  | ||||||
| 			$partial->prepare('item', 'dashboard'); |  | ||||||
| 			$partial->prepare('langMng',$LANGMNG); |  | ||||||
| 			$partial->prepare('debugMod',$DEBUGMOD); |  | ||||||
| 			$partial->render(); |  | ||||||
| 			?> |  | ||||||
| 		</div> |  | ||||||
| 		<div class="col-md-9 main-body"> |  | ||||||
| 			<a onClick="$('#modal').removeClass('modal-container-hiden').show();" class="button is-primary m-1"><?php $LANGMNG->echo('t_addDevice'); ?></a> |  | ||||||
| 			<div class="row no-gutters"> |  | ||||||
| 				<?php foreach ($DASHBOARD as $dashboardItemId => $dashboardItemData) { |  | ||||||
| 					$partialDeviceButton = new Partial('dashboardButton'); |  | ||||||
| 					$partialDeviceButton->prepare('dashboardItemData', $dashboardItemData); |  | ||||||
|  |  | ||||||
| 					$partialDeviceButton->render(); |  | ||||||
| 				} ?> |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| 	</div> |  | ||||||
|  |  | ||||||
| 	<div class="modal-container modal-container-hiden" id="modal"> |  | ||||||
| 		<div class="modal"> |  | ||||||
| 			<div class="close"> |  | ||||||
| 				<i class="fa fa-times"></i> |  | ||||||
| 			</div> |  | ||||||
| 			<h4 class="mb-4"><?php $LANGMNG->echo('t_addDevice'); ?></h4> |  | ||||||
| 			<form method="post"> |  | ||||||
| 				<div class="field px-2"> |  | ||||||
| 					<div class="label"><?php $LANGMNG->echo('l_choseDevice'); ?>:</div> |  | ||||||
| 					<select class="input" name="devices[]" multiple required> |  | ||||||
| 						<?php foreach ($SUBDEVICES as $subDeviceKey => $subDeviceValue){ ?> |  | ||||||
| 							<option value="<?php echo $subDeviceKey; ?>"><?php echo $subDeviceValue['name'] . '[' . $subDeviceValue['type']  . ']'; ?></option> |  | ||||||
| 						<?php } ?> |  | ||||||
| 					</select> |  | ||||||
| 				</div> |  | ||||||
| 				<input type="submit" class="button" name="modalFinal" value="<?php $LANGMNG->echo('b_create'); ?>"/> |  | ||||||
| 			</form> |  | ||||||
| 		</div> |  | ||||||
| 	</div> |  | ||||||
|  |  | ||||||
| 	<?php |  | ||||||
| 	if (isset($_POST['deviceId'])) { |  | ||||||
| 		$partial = new Partial('deviceEdit'); |  | ||||||
| 		$partial->prepare('DEVICEDATA', $DEVICEDATA); |  | ||||||
|  |  | ||||||
| 		$partial->render(); |  | ||||||
| 	} |  | ||||||
| 	$partial = new Partial('footer'); |  | ||||||
| 	$partial->render(); |  | ||||||
| 	?> |  | ||||||
| </body> |  | ||||||
| </html> |  | ||||||
| @@ -1,107 +0,0 @@ | |||||||
| <!DOCTYPE html> |  | ||||||
| <html lang="en"> |  | ||||||
| <head> |  | ||||||
| 	<?php |  | ||||||
| 	$partial = new Partial('head'); |  | ||||||
| 	$partial->prepare('baseDir', $BASEDIR); |  | ||||||
| 	$partial->render(); |  | ||||||
| 	?> |  | ||||||
| 	<title><?php echo $TITLE ?></title> |  | ||||||
| </head> |  | ||||||
| <body class="no-transitions"> |  | ||||||
| 	<div class="row no-gutters main"> |  | ||||||
| 		<div class="col-md-3 d-sm-none"></div> |  | ||||||
| 		<div class="col-md-3 nav-container"> |  | ||||||
| 			<?php |  | ||||||
| 			$partial = new Partial('menu'); |  | ||||||
| 			$partial->prepare('item', 'home'); |  | ||||||
| 			$partial->prepare('langMng',$LANGMNG); |  | ||||||
| 			$partial->prepare('debugMod',$DEBUGMOD); |  | ||||||
| 			$partial->render(); |  | ||||||
| 			?> |  | ||||||
| 		</div> |  | ||||||
|  |  | ||||||
| 		<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.bundle.min.js"></script> |  | ||||||
|  |  | ||||||
| 		<div class="col-md-9 main-body"> |  | ||||||
| 			<div class="label m-1"> |  | ||||||
| 				<?php |  | ||||||
| 				if ($USERSATHOME != "") { |  | ||||||
| 					$LANGMNG->echo('l_atHome'); |  | ||||||
| 					echo ': ' . $USERSATHOME; |  | ||||||
| 				} |  | ||||||
| 				?> |  | ||||||
| 			</div> |  | ||||||
| 			<div class="m-1"> |  | ||||||
| 				<select class="select" name="room"> |  | ||||||
| 					<option value="all">All</option> |  | ||||||
| 					<?php foreach ($ROOMS as $key => $room) { |  | ||||||
| 						if ($room['device_count'] > 0) { ?> |  | ||||||
| 							<option value="<?php echo $room['room_id']?>"><?php echo $room['name'] ?></option> |  | ||||||
| 						<?php } ?> |  | ||||||
| 					<?php } ?> |  | ||||||
| 				</select> |  | ||||||
| 			</div> |  | ||||||
| 			<div class="row no-gutters"> |  | ||||||
| 				<?php foreach ($DATA as $roomId => $room) { ?> |  | ||||||
| 					<?php foreach ($room['devices'] as $deviceId => $device) { ?> |  | ||||||
| 						<?php foreach ($device['subDevices'] as $subDeviceKey => $subDevice) { |  | ||||||
| 							//BUTTON |  | ||||||
| 							$partialDeviceButton = new Partial('deviceButton'); |  | ||||||
| 							$partialDeviceButton->prepare('roomid',$roomId); |  | ||||||
| 							$partialDeviceButton->prepare('subdeviceid',$subDeviceKey); |  | ||||||
| 							$partialDeviceButton->prepare('subdevice',$subDevice); |  | ||||||
| 							$partialDeviceButton->prepare('deviceid',$deviceId); |  | ||||||
| 							$partialDeviceButton->prepare('device',$device); |  | ||||||
|  |  | ||||||
| 							$partialDeviceButton->render(); |  | ||||||
|  |  | ||||||
| 							//DETAIL |  | ||||||
| 							$partialDetail = new Partial('deviceDetail'); |  | ||||||
| 							$partialDetail->prepare('subdeviceid',$subDeviceKey); |  | ||||||
| 							$partialDetail->prepare('subdevice',$subDevice); |  | ||||||
| 							$partialDetail->prepare('device',$device); |  | ||||||
| 							$partialDetail->prepare('langMng',$LANGMNG); |  | ||||||
|  |  | ||||||
| 							$partialDetail->render(); |  | ||||||
|  |  | ||||||
| 							//SETTING |  | ||||||
| 							$partialEdit = new Partial('deviceEdit'); |  | ||||||
| 							$partialEdit->prepare('deviceid',$deviceId); |  | ||||||
| 							$partialEdit->prepare('subdevice',$subDevice); |  | ||||||
| 							$partialEdit->prepare('device',$device); |  | ||||||
| 							$partialEdit->prepare('users',$USERS); |  | ||||||
| 							$partialEdit->prepare('rooms',$ROOMS); |  | ||||||
| 							$partialEdit->prepare('langMng',$LANGMNG); |  | ||||||
|  |  | ||||||
| 							$partialEdit->render(); |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 				} ?> |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| 	</div> |  | ||||||
| 	<?php |  | ||||||
| 	$partial = new Partial('footer'); |  | ||||||
| 	$partial->render(); |  | ||||||
| 	?> |  | ||||||
| 	<script> |  | ||||||
| 		$(document).on('keyup mouseup', '#value_control', function(event) { 					 |  | ||||||
| 			$.ajax({ |  | ||||||
| 				url: 'ajax', |  | ||||||
| 				type: 'POST', |  | ||||||
| 				//TODO: GET Attribute from ID |  | ||||||
| 				data: { subDevice_id : '13', action : 'set', value: this.value}, |  | ||||||
| 				success: function(msg){ |  | ||||||
| 					console.log("message"); |  | ||||||
| 					console.log(msg); |  | ||||||
| 				}, |  | ||||||
| 				error: function (request, status, error) { |  | ||||||
| 					console.log('0'); |  | ||||||
| 				} |  | ||||||
| 			}); |  | ||||||
| 			console.log(this.value); |  | ||||||
| 		});	 |  | ||||||
| 	</script> |  | ||||||
| </body> |  | ||||||
| </html> |  | ||||||
| @@ -1,57 +0,0 @@ | |||||||
| <!DOCTYPE html> |  | ||||||
| <html lang="en"> |  | ||||||
| <head> |  | ||||||
|     <?php |  | ||||||
|     $partial = new Partial('head'); |  | ||||||
|     $partial->prepare('baseDir', $BASEDIR); |  | ||||||
|     $partial->render(); |  | ||||||
|     ?> |  | ||||||
|     <title><?php echo $TITLE ?></title> |  | ||||||
| </head> |  | ||||||
| <body class="no-transitions"> |  | ||||||
|     <div class="row no-gutters main"> |  | ||||||
|         <div class="col-md-3 d-sm-none"></div> |  | ||||||
|         <div class="col-md-3 nav-container"> |  | ||||||
|             <?php |  | ||||||
|             $partial = new Partial('menu'); |  | ||||||
|             $partial->prepare('item', 'log'); |  | ||||||
|             $partial->prepare('langMng',$LANGMNG); |  | ||||||
|             $partial->prepare('debugMod',$DEBUGMOD); |  | ||||||
|             $partial->render(); |  | ||||||
|             ?> |  | ||||||
|         </div> |  | ||||||
|         <div class="col-md-9 main-body"> |  | ||||||
|             <div class="col-12 col-sm-9 mx-auto mt-4"> |  | ||||||
|                 <label><?php echo $LANGMNG->get('l_logMaxLiveTime') . " " . $LOGTOLIVETIME . " days";?></label> |  | ||||||
|                 <form method="post" action=""> |  | ||||||
|                     <div class="field"> |  | ||||||
|                         <select class="input" name="LogFile"> |  | ||||||
|                             <?php foreach ($LOGSFILES as $key => $value) { ?> |  | ||||||
|                                 <option value="<?php echo $value; ?>"><?php echo $value; ?></option> |  | ||||||
|                             <?php } ?> |  | ||||||
|                         </select> |  | ||||||
|                     </div> |  | ||||||
|                     <div class="field"> |  | ||||||
|                         <input type="submit" class="button" name="selectFile" value="<?php $LANGMNG->echo('b_select');?>"/> |  | ||||||
|                     </div> |  | ||||||
|                 </form> |  | ||||||
|                 <?php |  | ||||||
|                 if (isset($_POST['LogFile'])) { |  | ||||||
|                     $file_lines = file('./app/logs/' . $_POST['LogFile']); |  | ||||||
|                     echo '<pre style="overflow: auto;">'; |  | ||||||
|                     foreach ($file_lines as $line) { |  | ||||||
|                         echo $line; |  | ||||||
|                     } |  | ||||||
|                     echo '</pre>'; |  | ||||||
|                 } |  | ||||||
|                 ?> |  | ||||||
|             </div> |  | ||||||
|         </div> |  | ||||||
|  |  | ||||||
|         <?php |  | ||||||
|         $partial = new Partial('footer'); |  | ||||||
|         $partial->render(); |  | ||||||
|         //TODO js do main.js |  | ||||||
|         ?> |  | ||||||
|     </body> |  | ||||||
|     </html> |  | ||||||
| @@ -1,21 +0,0 @@ | |||||||
| <div class="col-4 col-sm-3 col-xl-2 square-wrap"> |  | ||||||
|     <div class="square"> |  | ||||||
|         <div class="square-content" id="device-<?php echo $DASHBOARDITEMDATA['masterId'] ?>" onClick="ajaxPost('ajax',{subDevice_id:'<?php echo $DASHBOARDITEMDATA['id']; ?>'}, this);"> |  | ||||||
|             <div class="content"> |  | ||||||
|                 <div class="row"> |  | ||||||
|                     <div class="col"> |  | ||||||
|                         <h5 class="fa">&#x<?php echo $DASHBOARDITEMDATA['icon'] ?></h5> |  | ||||||
|                     </div> |  | ||||||
|                     <div class="col"> |  | ||||||
|                         <h5 class="text-right"><?php echo $DASHBOARDITEMDATA['lastRecord']['value'].''.$DASHBOARDITEMDATA['unit'] ?></h5> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
|                 <div class="row"> |  | ||||||
|                     <div class="col"> |  | ||||||
|                         <?php echo $DASHBOARDITEMDATA['name'] ?> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
|         </div> |  | ||||||
|     </div> |  | ||||||
| </div> |  | ||||||
| @@ -1,39 +0,0 @@ | |||||||
| <?php  |  | ||||||
| $action = ""; |  | ||||||
| if ($SUBDEVICE['type'] == 'on/off') { |  | ||||||
| 	$action = 'onClick="ajaxPost(\'ajax\',{subDevice_id:\'' . $SUBDEVICEID . '\', action:\'change\'}, this);"'; |  | ||||||
| }  |  | ||||||
| //neaktivní zařízení is-inactive |  | ||||||
| ?> |  | ||||||
|  |  | ||||||
| <div class="device-button col-4 col-sm-3 col-xl-2 square-wrap" <?php echo $action; ?> data-room-id="<?php echo $ROOMID; ?>"> |  | ||||||
| 	<div class="square"> |  | ||||||
| 		<div class="square-content <?php echo (($SUBDEVICE['comError'] == 1 || $DEVICE['approved'] == 0) ? "is-inactive" : "") ;?>" id="device-<?php echo $DEVICEID ?>" data-sub-device-id="<?php echo $SUBDEVICEID;?>"> |  | ||||||
| 			<div class="content"> |  | ||||||
| 				<div class="row no-gutters"> |  | ||||||
| 					<div class="col"> |  | ||||||
| 						<h5 unselectable="on" class="fa">&#x<?php echo $DEVICE['icon'] ?></h5> |  | ||||||
| 					</div> |  | ||||||
| 					<div class="col"> |  | ||||||
| 					<?php if ($SUBDEVICE['type'] == 'temp_cont') { ?> |  | ||||||
| 						<input type="number" step="5" class="device-button-value text-right" id="value_control" value="<?php echo $SUBDEVICE['lastRecort']['value'] ?>"><?php echo $SUBDEVICE['unit']?> |  | ||||||
| 						<style> |  | ||||||
| 							input.device-button-value.text-right { |  | ||||||
|     							width: inherit; |  | ||||||
| 							} |  | ||||||
| 						</style> |  | ||||||
| 					 |  | ||||||
| 					<?php } else { ?> |  | ||||||
| 						<h5 unselectable="on" class="device-button-value text-right" title="<?php echo $SUBDEVICE['lastRecort']['time']; ?>"><?php echo $SUBDEVICE['lastRecort']['value'] . $SUBDEVICE['unit']?></h5> |  | ||||||
| 					<?php } ?>	 |  | ||||||
| 					</div> |  | ||||||
| 				</div> |  | ||||||
| 				<div class="row"> |  | ||||||
| 					<div class="col  button-text" unselectable="on" > |  | ||||||
| 						<?php echo $DEVICE['name']; ?> |  | ||||||
| 					</div> |  | ||||||
| 				</div> |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| 	</div> |  | ||||||
| </div> |  | ||||||
| @@ -1,85 +0,0 @@ | |||||||
| <!-- Detail --> |  | ||||||
| <div class="modal-container modal-container-hiden" id="modal-detail-<?php echo $SUBDEVICEID;?>"> |  | ||||||
| 	<div class="modal"> |  | ||||||
| 		<div class="close"> |  | ||||||
| 			<i class="fa fa-times"></i> |  | ||||||
| 		</div> |  | ||||||
| 		<h4 class="mb-4"><?php echo $DEVICE['name']; ?></h4> |  | ||||||
| 		<h5 class="mb-4"><?php echo $SUBDEVICE['lastRecort']['value'] . $SUBDEVICE['unit']?></h5> |  | ||||||
| 		<p><?php $LANGMNG->echo('l_lastSeen'); echo ' ' . $SUBDEVICE['lastRecort']['niceTime']; ?></p> |  | ||||||
| 		<div class=""> |  | ||||||
| 			<canvas id="canvas-<?php echo $SUBDEVICEID;?>"></canvas> |  | ||||||
| 		</div> |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 		<input |  | ||||||
| 		type="submit" |  | ||||||
| 		class="button col-2 graph-period" |  | ||||||
| 		data-period="year" |  | ||||||
| 		data-group="month" |  | ||||||
| 		data-sub-device-id="<?php echo $SUBDEVICEID;?>" |  | ||||||
| 		value="<?php $LANGMNG->echo('b_year');?>" |  | ||||||
| 		/> |  | ||||||
|  |  | ||||||
| 		<input |  | ||||||
| 		type="submit" |  | ||||||
| 		class="button col-2  graph-period" |  | ||||||
| 		data-period="month" |  | ||||||
| 		data-group="day" |  | ||||||
| 		data-sub-device-id="<?php echo $SUBDEVICEID;?>" |  | ||||||
| 		value="<?php $LANGMNG->echo('b_month');?>" |  | ||||||
| 		/> |  | ||||||
|  |  | ||||||
| 		<input |  | ||||||
| 		type="submit" |  | ||||||
| 		class="button col-2 graph-period" |  | ||||||
| 		data-period="week" |  | ||||||
| 		data-group="day" |  | ||||||
| 		data-sub-device-id="<?php echo $SUBDEVICEID;?>" |  | ||||||
| 		value="<?php $LANGMNG->echo('b_week');?>" |  | ||||||
| 		/> |  | ||||||
|  |  | ||||||
| 		<input |  | ||||||
| 		type="submit" |  | ||||||
| 		class="button col-2  graph-period" |  | ||||||
| 		data-period="day" |  | ||||||
| 		data-group="hour" |  | ||||||
| 		data-sub-device-id="<?php echo $SUBDEVICEID;?>" |  | ||||||
| 		value="<?php $LANGMNG->echo('b_day');?>" |  | ||||||
| 		/> |  | ||||||
|  |  | ||||||
| 		<input |  | ||||||
| 		type="submit" |  | ||||||
| 		class="button col-2  graph-period" |  | ||||||
| 		data-period="hour" |  | ||||||
| 		data-group="minute" |  | ||||||
| 		data-sub-device-id="<?php echo $SUBDEVICEID;?>" |  | ||||||
| 		value="<?php $LANGMNG->echo('b_hour');?>" |  | ||||||
| 		/> |  | ||||||
|  |  | ||||||
| 		<div> |  | ||||||
| 			<table class="table is-fluid"> |  | ||||||
| 				<thead> |  | ||||||
| 					<tr> |  | ||||||
| 						<th><?php $LANGMNG->echo('t_time');?></th> |  | ||||||
| 						<th><?php $LANGMNG->echo('t_state');?></th> |  | ||||||
| 					</tr> |  | ||||||
| 				</thead> |  | ||||||
| 				<tbody> |  | ||||||
| 					<?php foreach ($SUBDEVICE['events'] as $key => $value) { ?> |  | ||||||
| 						<tr> |  | ||||||
| 							<td><?php echo (new DateTime($value['time']))->format(DATEFORMAT); ?></td> |  | ||||||
| 							<td title="test"><?php  |  | ||||||
| 							echo $value['value'] . $SUBDEVICE['unit']; |  | ||||||
| 							if (DEBUGMOD) { |  | ||||||
| 								echo ' (' . $SUBDEVICE['eventsRaw'][$key]['value'] . ')'; |  | ||||||
| 							} |  | ||||||
| 							?></td> |  | ||||||
| 							<?php //TODO: P5IDAT TOOLTIP PRO RAW VALUE?> |  | ||||||
| 						</tr> |  | ||||||
| 					<?php } ?> |  | ||||||
| 				</tbody> |  | ||||||
| 			</table> |  | ||||||
| 		</div> |  | ||||||
| 	</div> |  | ||||||
| </div> |  | ||||||
| @@ -1,179 +0,0 @@ | |||||||
| <div class="modal-container modal-container-hiden" id="modal-setting-<?php echo $DEVICEID ?>"> |  | ||||||
|     <div class="modal"> |  | ||||||
|         <div class="close"> |  | ||||||
|             <i class="fa fa-times"></i> |  | ||||||
|         </div> |  | ||||||
|         <h4 class="mb-4"><?php $LANGMNG->echo('t_editDevice'); ?></h4> |  | ||||||
|         <form method="post" action="" enctype="multipart/form-data"> |  | ||||||
|             <input class="input" type="hidden" name="deviceId" value="<?php echo $DEVICEID; ?>"> |  | ||||||
|             <?php if ($DEVICE['approved'] != 0) { ?> |  | ||||||
|                 <?php if ($DEVICE['userIsAdmin']) { ?> |  | ||||||
|                     <div class="field"> |  | ||||||
|                         <div class="label"><?php $LANGMNG->echo('l_owner'); ?></div> |  | ||||||
|                         <select class="input" name="deviceOwnerUserId"> |  | ||||||
|                             <option value=""><?php $LANGMNG->echo('w_noOne'); ?></option> |  | ||||||
|                             <?php foreach ($USERS as $user) { |  | ||||||
|                                 $userId =  $user['user_id']; |  | ||||||
|                                 $userName =  $user['username']; |  | ||||||
|                                 ?> |  | ||||||
|                                 <option value="<?php echo $userId; ?>" <?php ECHO ((int) $userId === (int)  $DEVICE['owner'] ? 'selected="selected"' : ''); ?>><?php echo $userName; ?></option> |  | ||||||
|                             <?php } ?> |  | ||||||
|                         </select> |  | ||||||
|                     </div> |  | ||||||
|                     <div class="label"><?php $LANGMNG->echo('l_permission'); ?></div> |  | ||||||
|                     <div class="row"> |  | ||||||
|  |  | ||||||
|                         <div class="col-6"> |  | ||||||
|                             <div class="label"> - <?php $LANGMNG->echo('l_owner'); ?></div> |  | ||||||
|                         </div> |  | ||||||
|  |  | ||||||
|                         <div class="col-6"> |  | ||||||
|                             <?php |  | ||||||
|                             $permissions = $DEVICE['permission']; |  | ||||||
|                             //Debug |  | ||||||
|                             if (DEBUGMOD == 1) { |  | ||||||
|                                 echo '<pre>'; |  | ||||||
|                                 VAR_DUMP($permissions); |  | ||||||
|                                 echo '</pre>'; |  | ||||||
|                             } |  | ||||||
|                             ?> |  | ||||||
|                             <input type="radio" name="permissionOwner" value=1 <?php ECHO ($permissions[0] == 1 ? 'checked' : ''); ?>/><?php $LANGMNG->echo('l_read'); ?> |  | ||||||
|                             <input type="radio" name="permissionOwner" value=2 <?php ECHO ($permissions[0] == 2 ? 'checked' : ''); ?>/><?php $LANGMNG->echo('l_use'); ?> |  | ||||||
|                             <input type="radio" name="permissionOwner" value=3 <?php ECHO ($permissions[0] == 3 ? 'checked' : ''); ?>/><?php $LANGMNG->echo('l_edit'); ?> |  | ||||||
|  |  | ||||||
|                         </div> |  | ||||||
|                     </div> |  | ||||||
|                     <div class="row"> |  | ||||||
|                         <div class="col-6"> |  | ||||||
|                             <div class="label"> - <?php $LANGMNG->echo('l_member'); ?></div> |  | ||||||
|                         </div> |  | ||||||
|                         <div class="col-6"> |  | ||||||
|                             <input type="radio" name="permissionOther" value=1 <?php ECHO ($permissions[1] == 1 ? 'checked' : ''); ?>/><?php $LANGMNG->echo('l_read'); ?> |  | ||||||
|                             <input type="radio" name="permissionOther" value=2 <?php ECHO ($permissions[1] == 2 ? 'checked' : ''); ?>/><?php $LANGMNG->echo('l_use'); ?> |  | ||||||
|                             <input type="radio" name="permissionOther" value=3 <?php ECHO ($permissions[1] == 3 ? 'checked' : ''); ?>/><?php $LANGMNG->echo('l_edit'); ?> |  | ||||||
|                         </div> |  | ||||||
|                     </div> |  | ||||||
|                     <div class="field"> |  | ||||||
|                         <div class="label"><?php $LANGMNG->echo('w_title'); ?></div> |  | ||||||
|                         <input class="input" type="text" name="deviceName" value="<?php echo $DEVICE['name']; ?>" <?php echo (!$DEVICE['userIsAdmin'] ? 'disabled' : ''); ?>> |  | ||||||
|                     </div> |  | ||||||
|                 <?php } ?> |  | ||||||
|                 <div class="field"> |  | ||||||
|                     <div class="label">Token:</div> |  | ||||||
|                     <input class="input" type="text" name="deviceToken" value="<?php echo $DEVICE['token']; ?>" disabled> |  | ||||||
|                 </div> |  | ||||||
|                 <h4 class="mb-4"><?php $LANGMNG->echo('t_networkSetting'); ?></h4> |  | ||||||
|                 <div class="field"> |  | ||||||
|                     <div class="label">Type:</div> |  | ||||||
|                     <input class="input" type="text" name="deviceToken" value="<?php echo $DEVICE['type']; ?>" disabled> |  | ||||||
|                 </div> |  | ||||||
|                 <div class="field"> |  | ||||||
|                     <div class="label">Mac Address:</div> |  | ||||||
|                     <input class="input" type="text" name="deviceMac" value="<?php echo $DEVICE['mac']; ?>" disabled> |  | ||||||
|                 </div> |  | ||||||
|                 <div class="field"> |  | ||||||
|                     <div class="label">IP:</div> |  | ||||||
|                     <input class="input" type="text" name="deviceIp" value="<?php echo $DEVICE['ip']; ?>" minlength="7" maxlength="15" size="15" pattern="^((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$" disabled> |  | ||||||
|                 </div> |  | ||||||
|                 <div class="field"> |  | ||||||
|                     <div class="label">Subnet:</div> |  | ||||||
|                     <input class="input" type="text" name="deviceSubnet" value="<?php echo $DEVICE['subnet']; ?>" minlength="7" maxlength="15" size="15" pattern="^((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$" disabled> |  | ||||||
|                 </div> |  | ||||||
|                 <div class="field"> |  | ||||||
|                     <div class="label">Gateway:</div> |  | ||||||
|                     <input class="input" type="text" name="deviceGateway" value="<?php echo $DEVICE['gateway']; ?>" minlength="7" maxlength="15" size="15" pattern="^((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$" disabled> |  | ||||||
|                 </div> |  | ||||||
|  |  | ||||||
|                 <h4 class="mb-4"><?php $LANGMNG->echo('t_deviceVersion'); ?></h4> |  | ||||||
|                 <div class="field"> |  | ||||||
|                     <div class="label"><?php $LANGMNG->echo('l_uploadFirmware'); ?></div> |  | ||||||
|                     <input class="input" type="file" name="deviceFirmware" value=""> |  | ||||||
|                 </div> |  | ||||||
|  |  | ||||||
|                 <?php if ($DEVICE['userIsAdmin']) { ?> |  | ||||||
|                     <?php if (!in_array($SUBDEVICE['type'], ['on/off', 'door', 'water'])) { ?> |  | ||||||
|                         <div class="field"> |  | ||||||
|                             <div class="label"><?php $LANGMNG->echo('l_sleepTime'); ?></div> |  | ||||||
|                             <input class="input" type="int" name="sleepTime" value="<?php echo $DEVICE['sleepTime']; ?>"  <?php echo (!$DEVICE['userIsAdmin'] ? 'disabled' : ''); ?>> |  | ||||||
|                             <p>* - <?php $LANGMNG->echo('l_inMinutes'); ?></p> |  | ||||||
|                         </div> |  | ||||||
|                     <?php }?> |  | ||||||
|                     <div class="field"> |  | ||||||
|                         <div class="label"><?php $LANGMNG->echo('w_room'); ?></div> |  | ||||||
|                         <select class="input" name="deviceOwnerId"> |  | ||||||
|                             <?php foreach ($ROOMS as $room) { |  | ||||||
|                                 $roomId =  $room['room_id']; |  | ||||||
|                                 $roomName =  $room['name']; |  | ||||||
|                                 ?> |  | ||||||
|                                 <option value="<?php echo $roomId; ?>" <?php ECHO ((int) $roomId === (int)  $DEVICE['room'] ? 'selected="selected"' : ''); ?>><?php echo $roomName; ?></option> |  | ||||||
|                             <?php } ?> |  | ||||||
|                         </select> |  | ||||||
|                     </div> |  | ||||||
|                     <div class="field"> |  | ||||||
|                         <div class="label"><?php $LANGMNG->echo('w_icon'); ?></div> |  | ||||||
|                         <select class="input fa" name="deviceIcon" <?php echo (!$DEVICE['userIsAdmin'] ? 'disabled' : ''); ?>> |  | ||||||
|                             <option value=""><?php $LANGMNG->echo('w_no'); ?><?php echo ' '; ?><?php $LANGMNG->echo('w_icon'); ?></option> |  | ||||||
|                             <option value="f0eb" <?php ECHO ($DEVICE['icon'] == "f0eb" ? 'selected="selected"' : ''); ?>> - fa-lightbulb-o</option> |  | ||||||
|                             <option value="f2dc" <?php ECHO ($DEVICE['icon'] == "f2dc" ? 'selected="selected"' : ''); ?>> - fa-snowflake-o</option> |  | ||||||
|                             <option value="f0e7" <?php ECHO ($DEVICE['icon'] == "f0e7" ? 'selected="selected"' : ''); ?>> - fa-bolt</option> |  | ||||||
|                             <option value="f2c7" <?php ECHO ($DEVICE['icon'] == "f2c7" ? 'selected="selected"' : ''); ?>> - fa-thermometer-full</option> |  | ||||||
|                             <option value="f236" <?php ECHO ($DEVICE['icon'] == "f236" ? 'selected="selected"' : ''); ?>> - fa-bed</option> |  | ||||||
|                             <option value="f185" <?php ECHO ($DEVICE['icon'] == "f185" ? 'selected="selected"' : ''); ?>> - fa-sun-o</option> |  | ||||||
|                             <option value="f2db" <?php ECHO ($DEVICE['icon'] == "f2db" ? 'selected="selected"' : ''); ?>> - fa-microchip</option> |  | ||||||
|                             <option value="f011" <?php ECHO ($DEVICE['icon'] == "f011" ? 'selected="selected"' : ''); ?>> - fa-power-off</option> |  | ||||||
|                             <option value="f011" <?php ECHO ($DEVICE['icon'] == "f011" ? 'selected="selected"' : ''); ?>> - fa-desktop</option> |  | ||||||
|                         </select> |  | ||||||
|                     </div> |  | ||||||
|                 <?php } ?> |  | ||||||
|                 <div class="field"> |  | ||||||
|                     <div class="label"><?php $LANGMNG->echo('w_moduls'); ?></div> |  | ||||||
|                     <div class="row no-gutters"> |  | ||||||
|                         <?php foreach ($DEVICE['subDevices'] as $subDeviceKey => $subDevice) { ?> |  | ||||||
|                             <div class="device-button col-4 col-sm-3 col-xl-2 square-wrap"> |  | ||||||
|                                 <div class="square"> |  | ||||||
|                                     <div class="square-content"> |  | ||||||
|                                         <div class="row no-gutters"> |  | ||||||
|                                             <div class="col"> |  | ||||||
|                                                 <h5 unselectable="on" class="fa">&#x<?php echo $DEVICE['icon'] ?></h5> |  | ||||||
|                                             </div> |  | ||||||
|                                             <div class="col"> |  | ||||||
|                                                 <h5 unselectable="on" class="device-button-value text-right" title="<?php echo $subDevice['lastRecort']['time']; ?>"><?php echo $subDevice['lastRecort']['value'] . $subDevice['unit']?></h5> |  | ||||||
|                                             </div> |  | ||||||
|                                         </div> |  | ||||||
|                                         <div class="row"> |  | ||||||
|                                             <div class="col  button-text" unselectable="on" > |  | ||||||
|                                                 <?php echo $DEVICE['name']; ?> |  | ||||||
|                                             </div> |  | ||||||
|                                         </div> |  | ||||||
|                                     </div> |  | ||||||
|                                 </div> |  | ||||||
|                             </div> |  | ||||||
|                         <?php } ?> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
|                 <input type="submit" class="button" name="saveDevice" value="<?php $LANGMNG->echo('b_save'); ?>" <?php echo (!$DEVICE['userIsAdmin'] ? 'disabled' : ''); ?>/> |  | ||||||
|                 <input type="submit" class="button is-danger" name="disableDevice" value="<?php $LANGMNG->echo('b_disable'); ?>"/> |  | ||||||
|             <?php } else { ?> |  | ||||||
|                 <div class="field"> |  | ||||||
|                     <div class="label"><?php $LANGMNG->echo('w_moduls'); ?></div> |  | ||||||
|                     <div class="row no-gutters"> |  | ||||||
|                         <?php foreach ($DEVICE['subDevices'] as $subDeviceKey => $subDevice) { ?> |  | ||||||
|                             <div class="device-button col-4 col-sm-3 col-xl-2 square-wrap"> |  | ||||||
|                                 <div class="square"> |  | ||||||
|                                     <div class="square-content"> |  | ||||||
|  |  | ||||||
|                                         <?php echo $DEVICE['name']; ?> |  | ||||||
|  |  | ||||||
|  |  | ||||||
|                                     </div> |  | ||||||
|                                 </div> |  | ||||||
|                             </div> |  | ||||||
|                         <?php } ?> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
|                 <input type="submit" class="button is-primary" name="approveDevice" value="<?php $LANGMNG->echo('b_approve'); ?>"/> |  | ||||||
|                 <input type="submit" class="button is-danger" name="disableDevice" value="<?php $LANGMNG->echo('b_disable'); ?>"/> |  | ||||||
|             <?php } ?> |  | ||||||
|         </form> |  | ||||||
|     </div> |  | ||||||
| </div> |  | ||||||
| @@ -1,5 +0,0 @@ | |||||||
| <script src="./app/templates/js/jquery.js"></script> |  | ||||||
| <script src="https://www.gstatic.com/firebasejs/7.1.0/firebase-app.js"></script> |  | ||||||
| <script src="https://www.gstatic.com/firebasejs/7.1.0/firebase-messaging.js"></script> |  | ||||||
| <script src="./app/templates/js/script.js"></script> |  | ||||||
| <script src="./app/templates/js/post.js"></script> |  | ||||||
| @@ -1,22 +0,0 @@ | |||||||
| <div class="col-12 col-md-6 col-xl-4 square-wrap noselect"> |  | ||||||
|     <div class="rectangle-2"> |  | ||||||
|         <div class="square-content double" id="scene-<?php echo $SCENEID ?>" onClick="ajaxPost('ajax',{scene_id:'<?php echo $SCENEID; ?>',action:'execute'}, this);" > |  | ||||||
|             <div class="row"> |  | ||||||
|                 <div class="col-1"> |  | ||||||
|                     <h5 class="fa noselect"> |  | ||||||
|                         &#x<?php echo $SCENEDATA['icon']; ?> |  | ||||||
|                     </h5> |  | ||||||
|                 </div> |  | ||||||
|                 <div class="col"> |  | ||||||
|                     <h5 class="text-right break-all noselect"> |  | ||||||
|                         <?php echo $SCENEDATA['name']; ?> |  | ||||||
|                     </h5> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
|             <div class="row"> |  | ||||||
|                 <div class="col"> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
|         </div> |  | ||||||
|     </div> |  | ||||||
| </div> |  | ||||||
| @@ -1,40 +0,0 @@ | |||||||
| <div class="modal-container modal-container-hiden" id="modal"> |  | ||||||
|     <div class="modal"> |  | ||||||
|         <div class="close"> |  | ||||||
|             <i class="fa fa-times"></i> |  | ||||||
|         </div> |  | ||||||
|         <h4 class="mb-4"><?php $LANGMNG->echo('t_createScene');?></h4> |  | ||||||
|         <form method="post"> |  | ||||||
|             <div class="field"> |  | ||||||
|                 <div class="label"><?php $LANGMNG->echo('w_title');?>:</div> |  | ||||||
|                 <input type="text" class="input" name="sceneName" value=""/>   |  | ||||||
|             </div> |  | ||||||
|             <div class="field"> |  | ||||||
|                 <div class="label"><?php $LANGMNG->echo('w_icon');?>:</div> |  | ||||||
|                 <select class="input fa" name="sceneIcon" <?php echo (!$DEVICE['userIsAdmin'] ? 'disabled' : ''); ?>> |  | ||||||
|                     <option value="">No icon</option> |  | ||||||
|                     <option value="f0eb"> - fa-lightbulb-o</option> |  | ||||||
|                     <option value="f2dc"> - fa-snowflake-o</option> |  | ||||||
|                     <option value="f0e7"> - fa-bolt</option> |  | ||||||
|                     <option value="f2c7"> - fa-thermometer-full</option> |  | ||||||
|                     <option value="f236"> - fa-bed</option> |  | ||||||
|                     <option value="f185"> - fa-sun-o</option> |  | ||||||
|                     <option value="f2db"> - fa-microchip</option> |  | ||||||
|                     <option value="f011"> - fa-power-off</option> |  | ||||||
|                     <option value="f011"> - fa-desktop</option> |  | ||||||
|                 </select> |  | ||||||
|             </div> |  | ||||||
|             <div class="field"> |  | ||||||
|                 <div class="label"><?php $LANGMNG->echo('l_choseDevice');?></div> |  | ||||||
|                 <select  class="input" name="devices[]" multiple required> |  | ||||||
|                     <?php |  | ||||||
|                     foreach ($SUBDEVICES as $subdeviceId => $subdeviceData) { |  | ||||||
|                         echo '<option value="'.$subdeviceId.'">'.$subdeviceData['name'].'</option>'; |  | ||||||
|                     } |  | ||||||
|                     ?> |  | ||||||
|                 </select> |  | ||||||
|             </div> |  | ||||||
|             <input type="submit" class="button" name="submit" value="<?php $LANGMNG->echo('b_next');?>"/> |  | ||||||
|         </form> |  | ||||||
|     </div> |  | ||||||
| </div> |  | ||||||
| @@ -1,26 +0,0 @@ | |||||||
| <div class="modal-container" id="modal"> |  | ||||||
|     <div class="modal"> |  | ||||||
|         <div class="close"> |  | ||||||
|             <i class="fa fa-times"></i> |  | ||||||
|         </div> |  | ||||||
|         <h4 class="mb-4"><?php $LANGMNG->echo('t_createScene');?></h4> |  | ||||||
|         <form method="post"> |  | ||||||
|             <input type="hidden" name="sceneName" value="<?php echo $SCENENAME; ?>"> |  | ||||||
|             <input type="hidden" name="sceneIcon" value="<?php echo $SCENEICON; ?>"> |  | ||||||
|             <?php  |  | ||||||
|             $i = 0; |  | ||||||
|             foreach($SETSTATEFORMDEVICES as $device){ ?> |  | ||||||
|                 <div class="field px-2"> |  | ||||||
|                     <div class="label"><?php echo $device['name']; ?></div> |  | ||||||
|                     <select  class="input" name="devices[<?php echo $device['setableSubDevices']; ?>]"> |  | ||||||
|                         <option value="0">off</option> |  | ||||||
|                         <option value="1">on</option> |  | ||||||
|                     </select> |  | ||||||
|                 </div> |  | ||||||
|                 <?php  |  | ||||||
|                 $i++; |  | ||||||
|             } ?> |  | ||||||
|             <input type="submit" class="button" name="submitFinal" value="<?php echo $LANGMNG->echo('b_create');?>"/> |  | ||||||
|         </form> |  | ||||||
|     </div> |  | ||||||
| </div> |  | ||||||
| @@ -1,47 +0,0 @@ | |||||||
| <div class="modal-container modal-container-hiden" id="modal-setting-<?php echo $SCENEID ?>"> |  | ||||||
|     <div class="modal"> |  | ||||||
|         <div class="close"> |  | ||||||
|             <i class="fa fa-times"></i> |  | ||||||
|         </div> |  | ||||||
|         <h4 class="mb-4"><?php $LANGMNG->echo('t_editScene')?></h4> |  | ||||||
|         <form method="post"> |  | ||||||
|             <div class="field"> |  | ||||||
|                 <div class="label"><?php $LANGMNG->echo('w_title');?>:</div> |  | ||||||
|                 <input type="text" class="input" name="sceneName" value="<?php echo $SCENE['name']; ?>"/>   |  | ||||||
|             </div> |  | ||||||
|             <div class="field"> |  | ||||||
|                 <div class="label"><?php $LANGMNG->echo('w_icon');?>:</div> |  | ||||||
|                 <select class="input fa" name="sceneIcon"> |  | ||||||
|                     <option value=""><?php $LANGMNG->echo('w_no').$LANGMNG->get('w_icon');?></option> |  | ||||||
|                     <option value="f0eb" <?php ECHO ($SCENE['icon'] == "f0eb" ? 'selected="selected"' : ''); ?>> - fa-lightbulb-o</option> |  | ||||||
|                     <option value="f2dc" <?php ECHO ($SCENE['icon'] == "f2dc" ? 'selected="selected"' : ''); ?>> - fa-snowflake-o</option> |  | ||||||
|                     <option value="f0e7" <?php ECHO ($SCENE['icon'] == "f0e7" ? 'selected="selected"' : ''); ?>> - fa-bolt</option> |  | ||||||
|                     <option value="f2c7" <?php ECHO ($SCENE['icon'] == "f2c7" ? 'selected="selected"' : ''); ?>> - fa-thermometer-full</option> |  | ||||||
|                     <option value="f236" <?php ECHO ($SCENE['icon'] == "f236" ? 'selected="selected"' : ''); ?>> - fa-bed</option> |  | ||||||
|                     <option value="f185" <?php ECHO ($SCENE['icon'] == "f185" ? 'selected="selected"' : ''); ?>> - fa-sun-o</option> |  | ||||||
|                     <option value="f2db" <?php ECHO ($SCENE['icon'] == "f2db" ? 'selected="selected"' : ''); ?>> - fa-microchip</option> |  | ||||||
|                     <option value="f011" <?php ECHO ($SCENE['icon'] == "f011" ? 'selected="selected"' : ''); ?>> - fa-power-off</option> |  | ||||||
|                     <option value="f011" <?php ECHO ($SCENE['icon'] == "f011" ? 'selected="selected"' : ''); ?>> - fa-desktop</option> |  | ||||||
|                 </select> |  | ||||||
|             </div> |  | ||||||
|             <div class="field px-2"> |  | ||||||
|                 <?php  |  | ||||||
|                 $i = 0; |  | ||||||
|                 foreach($SCENE['doSomething'] as $subDeviceId => $subDeviceData){ ?>  |  | ||||||
|                     <div id="scene-<?php echo $SCENEID; ?>-content">                |  | ||||||
|                         <div class="label"><?php echo $subDeviceData['name']; ?></div> |  | ||||||
|                         <select class="input" name="devices[<?php echo $subDeviceId; ?>]"> |  | ||||||
|                             <option value="0" <?php ECHO ($subDeviceData['state'] == "0" ? 'selected="selected"' : ''); ?>>off</option> |  | ||||||
|                             <option value="1" <?php ECHO ($subDeviceData['state'] == "1" ? 'selected="selected"' : ''); ?>>on</option> |  | ||||||
|                         </select> |  | ||||||
|                         <button name="remove" type="button" class="button is-danger fa" data-scene-id="<?php echo $SCENEID; ?>"></button> |  | ||||||
|                     </div> |  | ||||||
|                     <?php  |  | ||||||
|                     $i++; |  | ||||||
|                 } ?> |  | ||||||
|             </div> |  | ||||||
|             <input type="submit" class="button" name="saveDevice" value="<?php $LANGMNG->echo('b_edit');?>"/>	 |  | ||||||
|             <input type="button" class="button is-danger" onClick="ajaxPost('ajax',{scene_id:'<?php echo $SCENEID ?>', 'action':'delete'}, this, true);" name="saveDevice" value="<?php $LANGMNG->echo('b_remove');?>"/>	 |  | ||||||
|         </form> |  | ||||||
|     </div> |  | ||||||
| </div> |  | ||||||
| @@ -1,154 +0,0 @@ | |||||||
| <!DOCTYPE html> |  | ||||||
| <html lang="en"> |  | ||||||
| <head> |  | ||||||
|     <?php |  | ||||||
|     $partial = new Partial('head'); |  | ||||||
|     $partial->prepare('baseDir', $BASEDIR); |  | ||||||
|     $partial->render(); |  | ||||||
|     ?> |  | ||||||
|     <title><?php echo $TITLE ?></title> |  | ||||||
| </head> |  | ||||||
| <body class="no-transitions"> |  | ||||||
|     <div class="row no-gutters main"> |  | ||||||
|         <div class="col-md-3 d-sm-none"></div> |  | ||||||
|         <div class="col-md-3 nav-container"> |  | ||||||
|             <?php |  | ||||||
|             $partial = new Partial('menu'); |  | ||||||
|             $partial->prepare('item', 'rooms'); |  | ||||||
|             $partial->prepare('langMng',$LANGMNG); |  | ||||||
|             $partial->prepare('debugMod',$DEBUGMOD); |  | ||||||
|             $partial->render(); |  | ||||||
|             ?> |  | ||||||
|         </div> |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         <div class="col-md-9 main-body"> |  | ||||||
|             <div class="frame"> |  | ||||||
|                 <?php foreach ($ROOMS as $roomId => $room) {  ?> |  | ||||||
|                     <div class="single-frame" id="room-<?php echo $roomId; ?>"> |  | ||||||
|                         <div class=""> |  | ||||||
|                             <h1><?php echo $room['name']; ?></h1> |  | ||||||
|                             <?php foreach ($room['reading'] as $key => $value) { ?> |  | ||||||
|                                 <?php echo $LANGMNG->get($key) .": ".  $value; ?></br> |  | ||||||
|                             <?php } ?> |  | ||||||
|                             <?php if (DEBUGMOD == 1) { ?> |  | ||||||
|                                 <pre> |  | ||||||
|                                     <?php var_dump($room);?> |  | ||||||
|                                 </pre> |  | ||||||
|                             <?php } ?> |  | ||||||
|                         </div> |  | ||||||
|                         <?php foreach ($room['controls'] as $key => $value) { ?> |  | ||||||
|                             <div class="row no-gutters"> |  | ||||||
|                                 <div class="device-button col-4 col-sm-3 col-xl-2 square-wrap"  data-room-id=""> |  | ||||||
|                                     <div class="square"> |  | ||||||
|                                         <div class="square-content" id="device-" data-sub-device-id=""> |  | ||||||
|                                             <div class="content"> |  | ||||||
|                                                 <div class="row"> |  | ||||||
|                                                     <div class="col"> |  | ||||||
|                                                         <h5 unselectable="on" class="fa">&#x<?php echo $value['icon'];?></h5> |  | ||||||
|                                                     </div> |  | ||||||
|                                                     <div class="col"> |  | ||||||
|                                                         <h5 unselectable="on" class="device-button-value text-right" title=""><?php echo $value['value'];?></h5> |  | ||||||
|                                                     </div> |  | ||||||
|                                                 </div> |  | ||||||
|                                                 <div class="row"> |  | ||||||
|                                                     <div class="col" unselectable="on" > |  | ||||||
|                                                         <?php echo $value['name'];?> |  | ||||||
|                                                     </div> |  | ||||||
|                                                 </div> |  | ||||||
|                                             </div> |  | ||||||
|                                         </div> |  | ||||||
|                                     </div> |  | ||||||
|                                 </div> |  | ||||||
|                             </div> |  | ||||||
|                         <?php } ?> |  | ||||||
|                     </div> |  | ||||||
|                 <?php } ?> |  | ||||||
|             </div> |  | ||||||
|             <style> |  | ||||||
|             .single-frame { |  | ||||||
|                 background-color: red; |  | ||||||
|                 width: 100%; |  | ||||||
|                 flex: 0 0 100%; |  | ||||||
|                 height: 100%; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             .frame { |  | ||||||
|                 overflow-x: auto; |  | ||||||
|                 width: 100%; |  | ||||||
|                 display: flex; |  | ||||||
|                 height: 100%; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             body,html{ |  | ||||||
|                 height: 100%; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             .frame .single-frame:nth-child(even) { |  | ||||||
|                 background: red; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             .frame .single-frame:nth-child(odd) { |  | ||||||
|                 background: green; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             </style> |  | ||||||
|         </div> |  | ||||||
|     </div> |  | ||||||
|     <?php |  | ||||||
|     $partial = new Partial('footer'); |  | ||||||
|     $partial->render(); |  | ||||||
|     ?> |  | ||||||
|     <script> |  | ||||||
|     var prev_id; |  | ||||||
|     var id; |  | ||||||
|     var current_element |  | ||||||
|     var elementWidth = $('.frame').width(); |  | ||||||
|  |  | ||||||
|     $('.frame').scroll(function(){ |  | ||||||
|         //console.log('SCROLLING!'); |  | ||||||
|         //console.log('scrool'+$('.single-frame').scrollLeft()); |  | ||||||
|         var element_width = $('.single-frame').width(); |  | ||||||
|  |  | ||||||
|         var offset = $('.single-frame').offset(); |  | ||||||
|         var positive =  Math.abs(offset.left) |  | ||||||
|         var divided = positive / element_width; |  | ||||||
|         var round = Math.round(divided); |  | ||||||
|  |  | ||||||
|         current_element = $('.frame').children().eq(round); |  | ||||||
|         id = current_element.attr('id'); |  | ||||||
|  |  | ||||||
|         if (prev_id != id){ |  | ||||||
|             prev_id = id; |  | ||||||
|             console.log(prev_id); |  | ||||||
|         } |  | ||||||
|         var scrollTo = $('#'+id).offset().left; |  | ||||||
|         console.log('s-f: '+ scrollTo) |  | ||||||
|  |  | ||||||
|     }); |  | ||||||
|     $('.frame').on('touchend', function(){ // listen to mouse up |  | ||||||
|         console.log('STOPPED SCROLLING!'); |  | ||||||
|         var scrollLeft = $('.frame').scrollLeft(); |  | ||||||
|         console.log('frameLeft' + scrollLeft); |  | ||||||
|         var a = $('.frame').children(); |  | ||||||
|         for (index = 0; index < a.length; ++index) { |  | ||||||
|             if(a[index].id == id){ |  | ||||||
|                 $('.frame').animate({ |  | ||||||
|                     scrollLeft: (index * elementWidth) |  | ||||||
|                 }); |  | ||||||
|                 $('.frame').animate({ |  | ||||||
|                     scrollLeft: (index * elementWidth) |  | ||||||
|                 }); |  | ||||||
|             } |  | ||||||
|             console.log(a[index]); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         if (scrollTo > 160) { |  | ||||||
|             console.log($('#'+id).left) |  | ||||||
|  |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
|     </script> |  | ||||||
| </body> |  | ||||||
| </html> |  | ||||||
| @@ -1,67 +0,0 @@ | |||||||
| <!DOCTYPE html> |  | ||||||
| <html lang="en"> |  | ||||||
| <head> |  | ||||||
|     <?php |  | ||||||
|     $partial = new Partial('head'); |  | ||||||
|     $partial->prepare('baseDir', $BASEDIR); |  | ||||||
|     $partial->render(); |  | ||||||
|     ?> |  | ||||||
|     <title><?php echo $TITLE ?></title> |  | ||||||
| </head> |  | ||||||
| <body class="no-transitions"> |  | ||||||
|     <div class="row no-gutters main"> |  | ||||||
|         <div class="col-md-3 d-sm-none"></div> |  | ||||||
|         <div class="col-md-3 nav-container"> |  | ||||||
|             <?php |  | ||||||
|             $partial = new Partial('menu'); |  | ||||||
|             $partial->prepare('item', 'scene'); |  | ||||||
|             $partial->prepare('langMng',$LANGMNG); |  | ||||||
|             $partial->prepare('debugMod',$DEBUGMOD); |  | ||||||
|             $partial->render(); |  | ||||||
|             ?> |  | ||||||
|         </div> |  | ||||||
|         <div class="col-md-9 main-body"> |  | ||||||
|             <a class="button is-primary m-1" onClick="$('#modal').removeClass('modal-container-hiden').show();"><?php $LANGMNG->echo('t_createScene');?></a> |  | ||||||
|             <div class="row no-gutters"> |  | ||||||
|                 <?php foreach ($SCENES as $sceneId => $sceneData) { |  | ||||||
|                     //BUTTON |  | ||||||
|                     $partialScenButton = new Partial('sceneButton'); |  | ||||||
|                     $partialScenButton->prepare('langMng', $LANGMNG); |  | ||||||
|                     $partialScenButton->prepare('sceneId', $sceneId); |  | ||||||
|                     $partialScenButton->prepare('sceneData', $sceneData); |  | ||||||
|  |  | ||||||
|                     $partialScenButton->render(); |  | ||||||
|  |  | ||||||
|                     // Edit |  | ||||||
|                     $partialSceneEdit = new Partial('sceneEdit'); |  | ||||||
|                     $partialSceneEdit->prepare('langMng',$LANGMNG); |  | ||||||
|                     $partialSceneEdit->prepare('sceneId',$sceneId); |  | ||||||
|                     $partialSceneEdit->prepare('scene',$sceneData); |  | ||||||
|  |  | ||||||
|                     $partialSceneEdit->render(); |  | ||||||
|                     ?> |  | ||||||
|                 <?php } ?> |  | ||||||
|             </div> |  | ||||||
|         </div> |  | ||||||
|     </div> |  | ||||||
|  |  | ||||||
|     <?php if (isset($_POST['submit'])) { |  | ||||||
|         $partial = new Partial('sceneCreateFinal'); |  | ||||||
|         $partial->prepare('langMng',$LANGMNG); |  | ||||||
|         $partial->prepare('setStateFormDevices',$SETSTATEFORMDEVICES ); |  | ||||||
|         $partial->prepare('sceneIcon',$SCENEICON ); |  | ||||||
|         $partial->prepare('SceneName',$SCENENAME ); |  | ||||||
|  |  | ||||||
|         $partial->render(); |  | ||||||
|     } else { |  | ||||||
|         $partial = new Partial('sceneCreate'); |  | ||||||
|         $partial->prepare('langMng',$LANGMNG); |  | ||||||
|         $partial->prepare('subDevices',$SUBDEVICES); |  | ||||||
|  |  | ||||||
|         $partial->render(); |  | ||||||
|     } |  | ||||||
|     $partial = new Partial('footer'); |  | ||||||
|     $partial->render(); |  | ||||||
|     ?> |  | ||||||
| </body> |  | ||||||
| </html> |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user