Compare commits
312 Commits
master
...
remasterin
Author | SHA1 | Date | |
---|---|---|---|
|
0045bdeb84 | ||
|
9c565d90fa | ||
|
f80b9a6b43 | ||
|
49f2354908 | ||
|
541ea0002f | ||
|
135dfcb666 | ||
|
04e83dccf6 | ||
|
4ab70a1c2d | ||
|
5f03295ad3 | ||
|
66dc2a3670 | ||
|
b9a967642a | ||
|
fe1247fdaf | ||
|
9d9304d30e | ||
|
c6f57a3661 | ||
|
adfb564ccc | ||
|
a3eaf16fd6 | ||
8b32ecc619 | |||
7ea4a90980 | |||
38b29a2a4a | |||
821c0926e8 | |||
3d3b073131 | |||
|
485709d61f | ||
|
1d44bd62e2 | ||
|
75dab33c9a | ||
2410441b88 | |||
|
1f49391b36 | ||
|
c17e3090a8 | ||
dc77534bad | |||
|
cb45cf9e22 | ||
|
47a5f71d9b | ||
|
1642ece7f4 | ||
696ff07987 | |||
|
1415c0cf2d | ||
|
d9952a59fb | ||
|
b5b2bb95a7 | ||
bad58f82e2 | |||
|
64b50ead9f | ||
|
a3a87d39d2 | ||
|
c4f36235ab | ||
daa0e0a2c5 | |||
|
464f229a16 | ||
|
fe72097d75 | ||
|
98efb779b1 | ||
30045b9f65 | |||
f21293bc01 | |||
bf79e9cee7 | |||
cf30a1280d | |||
e11023d1c9 | |||
cfcfefefd8 | |||
09d78192b6 | |||
158220700b | |||
|
76e036181a | ||
|
39f44c8d03 | ||
|
ee0ebff76a | ||
42443c8b58 | |||
e95435a707 | |||
74f6779c63 | |||
181a65a99b | |||
|
ff2c51d505 | ||
|
879a63948f | ||
|
52688a5e70 | ||
|
3181c9dc72 | ||
|
ac43bdaf64 | ||
|
e65b046d47 | ||
|
50a0d3036c | ||
|
fffaf0e237 | ||
|
e9b8e0a453 | ||
|
0e3f571a0d | ||
|
5ad11cbb10 | ||
|
a4cdb250b9 | ||
|
72e6f475d7 | ||
|
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
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 0ee345e496ed3bd468ae9bcb583352c7561ce368
|
@ -3,29 +3,16 @@
|
|||||||
root = true
|
root = true
|
||||||
|
|
||||||
[*]
|
[*]
|
||||||
tab_width = 4
|
|
||||||
|
|
||||||
[*.{php,phpt,inc}]
|
|
||||||
charset = utf-8
|
|
||||||
end_of_line = lf
|
|
||||||
indent_size = 2
|
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
|
indent_size = 3
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
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
|
@ -1,6 +0,0 @@
|
|||||||
.git
|
|
||||||
_FIRMWARE
|
|
||||||
_INSTALATION
|
|
||||||
_README_IMG
|
|
||||||
README.md
|
|
||||||
.todo
|
|
13
.gitignore
vendored
13
.gitignore
vendored
@ -1,13 +1,20 @@
|
|||||||
|
|
||||||
.ftpconfig
|
.ftpconfig
|
||||||
.ftpconfig2
|
.ftpconfig2
|
||||||
|
*.log
|
||||||
|
*.bin
|
||||||
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/*
|
|
||||||
|
|
||||||
|
vendor/
|
||||||
|
|
||||||
|
logs/*.log
|
||||||
|
updater/*.bin
|
||||||
|
backup/*.zip
|
||||||
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[submodule ".docker"]
|
||||||
|
path = .docker
|
||||||
|
url = https://github.com/GamerClassN7/Docker-Xamp-Server.git
|
31
.htaccess
31
.htaccess
@ -1,18 +1,23 @@
|
|||||||
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]
|
||||||
|
#RewriteRule ^(.*?\.php)/([^/]*)/([^/]*)(/.+)? ./public/index.php?url=$1&$2&$3 [NC,N,QSA]
|
||||||
|
|
||||||
AddType application/x-httpd-php .php .phtml
|
AddType application/x-httpd-php .php .phtml
|
||||||
|
1
.todo
1
.todo
@ -11,3 +11,4 @@
|
|||||||
//TODO: Fix Default Room selection
|
//TODO: Fix Default Room selection
|
||||||
//TODO: Fix User Delete button
|
//TODO: Fix User Delete button
|
||||||
//TODO: Fix new add email form
|
//TODO: Fix new add email form
|
||||||
|
//BUG: API RETURN ERROR VHEN NO ROOM IS PRESENT
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
Login
|
|
||||||
https://dev.steelants.cz/vasek/home/apiFront.php
|
|
||||||
```json
|
|
||||||
{"username":"username","password":"password"}```
|
|
45
README.md
45
README.md
@ -135,3 +135,48 @@ 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
|
||||||
|
|
||||||
|
## Code Statistics
|
||||||
|
Type | Files | Lines
|
||||||
|
-----|-------|-----------
|
||||||
|
php | 2 | 2298 (89%)
|
||||||
|
md | 1 | 171 (7%)
|
||||||
|
js | 1 | 64 (2%)
|
||||||
|
sh | 1 | 34 (1%)
|
||||||
|
json | 1 | 10 (0.4%)
|
||||||
|
-----|-------|-----------
|
||||||
|
All | 6 | 2577
|
||||||
|
|
||||||
|
## 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 |
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();*/
|
|
119
app/Bootstrap.php
Normal file
119
app/Bootstrap.php
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
<?php
|
||||||
|
//Debug
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
ini_set( 'display_errors','1');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//setup
|
||||||
|
parse_str($_SERVER['QUERY_STRING'], $params);
|
||||||
|
if (defined ("BASEDIR")) {
|
||||||
|
$urlSes = BASEDIR;
|
||||||
|
} else {
|
||||||
|
$urlSes = str_replace((!empty ($params['url']) ? $params['url'] : ""), "", str_replace('https://' . $_SERVER['HTTP_HOST'], "", $_SERVER['REQUEST_URI']));
|
||||||
|
}
|
||||||
|
if (defined ("BASEDIR") && defined ("BASEURL")) {
|
||||||
|
$domain = str_replace("http://", "", str_replace("https://", "", str_replace(BASEDIR, "", BASEURL)));
|
||||||
|
} else {
|
||||||
|
$domain = str_replace("/var/www/", "", $_SERVER['DOCUMENT_ROOT']);
|
||||||
|
}
|
||||||
|
session_set_cookie_params(
|
||||||
|
1209600,
|
||||||
|
$urlSes,
|
||||||
|
$domain,
|
||||||
|
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');
|
||||||
|
//DB Conector
|
||||||
|
Db::connect (DBHOST, DBUSER, DBPASS, DBNAME);
|
||||||
|
|
||||||
|
Debugger::flag('routes');
|
||||||
|
// import routes
|
||||||
|
require_once '../app/Routes.php';
|
||||||
|
|
||||||
|
Debugger::flag('done');
|
||||||
|
// echo Debugger::showFlags(false);
|
90
app/Routes.php
Normal file
90
app/Routes.php
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
<?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('/device/{sortBy}/{sortType}', 'Device');
|
||||||
|
$router->any('/plugins', 'Plugins');
|
||||||
|
$router->any('/ajax', 'Ajax');
|
||||||
|
$router->any('/oauth', 'Oauth');
|
||||||
|
|
||||||
|
//Vue APP - Authentication
|
||||||
|
$router->post('/api/login', 'AuthApi@login');
|
||||||
|
$router->post('/api/logout', 'AuthApi@logout');
|
||||||
|
|
||||||
|
//Vue APP - Rooms
|
||||||
|
$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');
|
||||||
|
|
||||||
|
//Vue APP - Server Info
|
||||||
|
$router->get('/api/server', 'ServerApi@default');
|
||||||
|
$router->get('/api/server/log', 'ServerApi@logStatus');
|
||||||
|
|
||||||
|
//Vue APP - Widgets
|
||||||
|
$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');
|
||||||
|
$router->post('/api/widgets/{widgetId}/edit', 'WidgetApi@edit');
|
||||||
|
|
||||||
|
//Vue APP - Automations Endpoints
|
||||||
|
$router->get('/api/automations', 'AutomationsApi@default');
|
||||||
|
$router->get('/api/automations/{automationId}/detail', 'AutomationsApi@detail');
|
||||||
|
$router->post('/api/automations/create', 'AutomationsApi@create');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//cron
|
||||||
|
$router->post('/cron/clean', 'CronApi@clean');
|
||||||
|
$router->post('/cron/fetch', 'CronApi@fetch');
|
||||||
|
$router->post('/cron/automations', 'CronApi@automations');
|
||||||
|
|
||||||
|
|
||||||
|
//Google Home - API
|
||||||
|
$router->any('/api/HA/auth', 'Oauth@default');
|
||||||
|
$router->any('/api/HA/token', 'Oauth@token');
|
||||||
|
$router->any('/api/HA', 'GoogleHomeApi@response');
|
||||||
|
$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');
|
||||||
|
$router->any('/api/users/subscribe', 'UsersApi@subscribe');
|
||||||
|
|
||||||
|
//Endpoints API - V2
|
||||||
|
$router->post('/api/v2/endpoint/', 'EndpointsApi@default_v2');
|
||||||
|
$router->post('/api/v2/endpoint/cofiguration', 'EndpointsApi@cofiguration_v2');
|
||||||
|
|
||||||
|
// 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(){
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
44
app/api/AutomationsApi.php
Normal file
44
app/api/AutomationsApi.php
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class AutomationsApi extends ApiController
|
||||||
|
{
|
||||||
|
|
||||||
|
public function default()
|
||||||
|
{
|
||||||
|
//$this->requireAuth();
|
||||||
|
$response = [];
|
||||||
|
$response = AutomationManager::getAll(["automation_id","name","enabled"]);
|
||||||
|
|
||||||
|
$this->response($response);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail($automationId)
|
||||||
|
{
|
||||||
|
//$this->requireAuth();
|
||||||
|
$response = [];
|
||||||
|
$response = AutomationManager::getById($automationId, ["automation_id", "last_execution_time", "owner_id", "conditions", "tasks"]);
|
||||||
|
|
||||||
|
$this->response($response);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
$this->requireAuth();
|
||||||
|
$obj = $this->input;
|
||||||
|
|
||||||
|
if (
|
||||||
|
empty($obj['name']) ||
|
||||||
|
!isset($obj['name']) ||
|
||||||
|
!isset($obj['conditions']) ||
|
||||||
|
!isset($obj['tasks']) ||
|
||||||
|
!isset($obj['days'])
|
||||||
|
) {
|
||||||
|
throw new Exception("Invalid request payload", 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
$response = [];
|
||||||
|
$response = AutomationManager::create($obj['name'],json_encode($obj['days']), json_encode($obj['tasks']), json_encode($obj['conditions']));
|
||||||
|
|
||||||
|
$this->response(['value'=>'OK']);
|
||||||
|
}
|
||||||
|
}
|
67
app/api/CronApi.php
Normal file
67
app/api/CronApi.php
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<?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);
|
||||||
|
|
||||||
|
//Old Records Cleanup
|
||||||
|
foreach (SubDeviceManager::getAllSubDevices() as $key => $value) {
|
||||||
|
RecordManager::setHistory($value['subdevice_id']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$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);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function automations(){
|
||||||
|
AutomationManager:executeAll();
|
||||||
|
$this->response(['Value' => 'OK']);
|
||||||
|
}
|
||||||
|
}
|
15
app/api/DevicesApi.php
Normal file
15
app/api/DevicesApi.php
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class DevicesApi extends ApiController{
|
||||||
|
|
||||||
|
public function default(){
|
||||||
|
$this->requireAuth();
|
||||||
|
$response = [];
|
||||||
|
|
||||||
|
// TODO: process the request
|
||||||
|
$this->response($response);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDevicesByRoom($roomId){
|
||||||
|
}
|
||||||
|
}
|
270
app/api/EndpointsApi.php
Normal file
270
app/api/EndpointsApi.php
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
<?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']);
|
||||||
|
DeviceManager::setHeartbeat($device['device_id']);
|
||||||
|
|
||||||
|
//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);
|
||||||
|
}
|
||||||
|
|
||||||
|
//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);
|
||||||
|
if ($log != 'HTTP_UPDATE_FAILD code-102 messageFile Not Found (404)') {
|
||||||
|
$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), 'device');
|
||||||
|
$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);
|
||||||
|
if (!empty($subDeviceLastReord)) {
|
||||||
|
$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();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function requireAuth()
|
||||||
|
{
|
||||||
|
if (isset($_SERVER['HTTP_AUTHORIZATION'])) {
|
||||||
|
// TODO: call appropriate class/method
|
||||||
|
$deviceManager = new DeviceManager();
|
||||||
|
list($type, $hash) = explode(' ', $_SERVER['HTTP_AUTHORIZATION']);
|
||||||
|
$this->authenticated = $deviceManager->approved($hash);
|
||||||
|
return $hash;
|
||||||
|
if (!$this->authenticated) {
|
||||||
|
throw new Exception("Authorization required", 401);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new Exception("Authorization required", 401);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function default_v2()
|
||||||
|
{
|
||||||
|
$token = $this->requireAuth();
|
||||||
|
$obj = $this->input;
|
||||||
|
$response = [];
|
||||||
|
|
||||||
|
$device = DeviceManager::getDeviceByToken($token);
|
||||||
|
DeviceManager::setHeartbeat($device['device_id']);
|
||||||
|
|
||||||
|
// Issue command
|
||||||
|
$deviceCommand = $device["command"];
|
||||||
|
if ($deviceCommand != '' && $deviceCommand != null && $deviceCommand != "null") {
|
||||||
|
$response['command'] = $deviceCommand;
|
||||||
|
DeviceManager::editByToken($obj['token'], ['command' => 'null']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$subDevicesData = SubDeviceManager::getAllSubDevices($device['device_id']);
|
||||||
|
if (count($subDevicesData) > 0) {
|
||||||
|
foreach ($subDevicesData as $key => $subDeviceData) {
|
||||||
|
$subDeviceId = $subDeviceData['subdevice_id'];
|
||||||
|
$subDeviceLastReord = RecordManager::getLastRecord($subDeviceId);
|
||||||
|
if (!empty($subDeviceLastReord)) {
|
||||||
|
$response['values'][$subDeviceData['type']] = $subDeviceLastReord['value'];
|
||||||
|
if ($subDeviceLastReord['execuded'] == 0) {
|
||||||
|
RecordManager::setExecuted($subDeviceLastReord['record_id']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->response($response, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function cofiguration_v2()
|
||||||
|
{
|
||||||
|
$token = $this->requireAuth();
|
||||||
|
$response = [];
|
||||||
|
|
||||||
|
$device = DeviceManager::getDeviceByToken($token);
|
||||||
|
DeviceManager::setHeartbeat($device['device_id']);
|
||||||
|
|
||||||
|
if (!empty($device["name"]) && isset($device["name"])) $response["nettwork"]['hostname'] = $this->nameToHostname($device["name"]);
|
||||||
|
if (!empty($device["ip_address"]) && isset($device["ip_address"])) $response["nettwork"]['ip'] = $device["ip_address"];
|
||||||
|
if (!empty($device["gateway"]) && isset($device["gateway"])) $response["nettwork"]['gateway'] = $device["gateway"];
|
||||||
|
if (!empty($device["dns"]) && isset($device["dns"])) $response["nettwork"]['dns'] = $device["dns"];
|
||||||
|
if (!empty($device["sleep_time"]) && isset($device["sleep_time"])) $response["sleep"] = $device["sleep_time"];
|
||||||
|
|
||||||
|
$this->response($response, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function nameToHostname(string $name = null)
|
||||||
|
{
|
||||||
|
$hostname = "";
|
||||||
|
$hostname = strtolower($name);
|
||||||
|
return str_replace(' ', '_', $hostname);
|
||||||
|
}
|
||||||
|
}
|
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);
|
||||||
|
}
|
||||||
|
}
|
82
app/api/RoomsApi.php
Normal file
82
app/api/RoomsApi.php
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
<?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 Handling
|
||||||
|
$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'];
|
||||||
|
}
|
||||||
|
|
||||||
|
//Connection Error Creation
|
||||||
|
$connectionError = true;
|
||||||
|
$LastRecordTime = new DateTime($subDevicesData[$subDeviceKey][$key]['heartbeat']);
|
||||||
|
$interval = $LastRecordTime->diff(new DateTime());
|
||||||
|
|
||||||
|
|
||||||
|
$lastSeen = $interval->days * 24 * 60;
|
||||||
|
$lastSeen += $interval->h * 60;
|
||||||
|
$lastSeen += $interval->i;
|
||||||
|
|
||||||
|
|
||||||
|
//$lastSeen = ($interval->format('%h') * 60 + $interval->format('%i'));
|
||||||
|
|
||||||
|
if ($lastSeen < ($subDevicesData[$subDeviceKey][$key]['sleep_time'] == 0 ? 15 : $subDevicesData[$subDeviceKey][$key]['sleep_time'])) {
|
||||||
|
$connectionError = false;
|
||||||
|
}
|
||||||
|
$subDevicesData[$subDeviceKey][$key]['connection_error'] = $connectionError;
|
||||||
|
|
||||||
|
//Record Translation
|
||||||
|
$cammelCaseClass = "";
|
||||||
|
foreach (explode('-', $type) as $word) {
|
||||||
|
$cammelCaseClass .= ucfirst($word);
|
||||||
|
}
|
||||||
|
if (class_exists($cammelCaseClass)) {
|
||||||
|
$deviceClass = new $cammelCaseClass;
|
||||||
|
if (method_exists($deviceClass, 'translate')) {
|
||||||
|
$subDevicesData[$subDeviceKey][$key]['value'] = $deviceClass->translate($subDevicesData[$subDeviceKey][$key]['value']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($roomsData as $roomKey => $roomData) {
|
||||||
|
if ($roomData['device_count'] == 0) continue;
|
||||||
|
$subDevicesSorted = isset($subDevicesData[$roomData['room_id']]) ? Utilities::sortArrayByKey($subDevicesData[$roomData['room_id']], 'connection_error', 'asc') : [];
|
||||||
|
if (count($subDevicesSorted) == 0) continue;
|
||||||
|
$response[] = [
|
||||||
|
'room_id' => $roomData['room_id'],
|
||||||
|
'name' => $roomData['name'],
|
||||||
|
'widgets' => $subDevicesSorted,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$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();
|
||||||
|
}
|
||||||
|
}
|
47
app/api/UsersApi.php
Normal file
47
app/api/UsersApi.php
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?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']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function subscribe(){
|
||||||
|
//$this->requireAuth();
|
||||||
|
$bearer = $_SERVER['HTTP_AUTHORIZATION'];
|
||||||
|
$authManager = new AuthManager();
|
||||||
|
$userId = $authManager->getUserId($bearer);
|
||||||
|
|
||||||
|
NotificationManager::addSubscriber($userId, $this->input['pushtoken']);
|
||||||
|
$this->response(['value'=>'OK']);
|
||||||
|
}
|
||||||
|
}
|
163
app/api/WidgetApi.php
Normal file
163
app/api/WidgetApi.php
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
<?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, "vue-app");
|
||||||
|
$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;
|
||||||
|
$subDeviceData = SubDeviceManager::getSubdeviceDetailById($subDeviceId);
|
||||||
|
|
||||||
|
|
||||||
|
//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);
|
||||||
|
|
||||||
|
$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 = [
|
||||||
|
'room_id' => $subDeviceData['room_id'],
|
||||||
|
'device_id' => $subDeviceData['device_id'],
|
||||||
|
'lastConnectionTime' => (empty($niceTime) ? "00:00" : $niceTime),
|
||||||
|
'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
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
//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[''];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function edit($subDeviceId)
|
||||||
|
{
|
||||||
|
$this->requireAuth();
|
||||||
|
$allow = ["icon", "name"];
|
||||||
|
|
||||||
|
$response = null;
|
||||||
|
$obj = $this->input;
|
||||||
|
|
||||||
|
foreach ($obj as $key => $value) {
|
||||||
|
if (!in_array($key, $allow)){
|
||||||
|
unset($obj[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo $subDeviceId;
|
||||||
|
echo SubDeviceManager::edit($subDeviceId, $obj);
|
||||||
|
|
||||||
|
$response = [
|
||||||
|
"value" => "OK"
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->response($response);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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,71 +0,0 @@
|
|||||||
<?php
|
|
||||||
class SubDeviceManager
|
|
||||||
{
|
|
||||||
public static $devices;
|
|
||||||
|
|
||||||
public function getAllSubDevices($deviceId)
|
|
||||||
{
|
|
||||||
return Db::loadAll("SELECT * FROM subdevices WHERE device_id = ?", array($deviceId));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getSubDeviceMaster($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)
|
|
||||||
{
|
|
||||||
if ($subDeviceType == null) {
|
|
||||||
return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ?;", array($deviceId));
|
|
||||||
} else {
|
|
||||||
return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ? AND type = ?;", array($deviceId, $subDeviceType));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getSubDeviceByMasterAndType($deviceId, $subDeviceType = null)
|
|
||||||
{
|
|
||||||
if (!empty($subDeviceType)) {
|
|
||||||
return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ?;", array($deviceId));
|
|
||||||
} else {
|
|
||||||
return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ? AND type = ?;", array($deviceId, $subDeviceType));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getSubDevice($subDeviceId)
|
|
||||||
{
|
|
||||||
return Db::loadOne("SELECT * FROM subdevices WHERE subdevice_id = ?;", array($subDeviceId));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getSubDevicesTypeForMater($deviceId)
|
|
||||||
{
|
|
||||||
$parsedTypes = [];
|
|
||||||
$types = Db::loadAll("SELECT type FROM subdevices WHERE device_id = ?;", array($deviceId));
|
|
||||||
foreach ($types as $orderNum => $type) {
|
|
||||||
$parsedTypes[$orderNum] = $type['type'];
|
|
||||||
}
|
|
||||||
return $parsedTypes;
|
|
||||||
}
|
|
||||||
|
|
||||||
//check if dubdevice exist
|
|
||||||
|
|
||||||
public function create($deviceId, $type, $unit)
|
|
||||||
{
|
|
||||||
$record = array(
|
|
||||||
'device_id' => $deviceId,
|
|
||||||
'type' => $type,
|
|
||||||
'unit' => $unit,
|
|
||||||
);
|
|
||||||
try {
|
|
||||||
Db::add('subdevices', $record);
|
|
||||||
} catch (PDOException $error) {
|
|
||||||
echo $error->getMessage();
|
|
||||||
die();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function remove($subDeviceId)
|
|
||||||
{
|
|
||||||
RecordManager::cleanSubdeviceRecords($subDeviceId);
|
|
||||||
return Db::loadAll("DELETE FROM subdevices WHERE subdevice_id = ?", array($subDeviceId));
|
|
||||||
}
|
|
||||||
}
|
|
@ -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');
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,144 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class Utilities
|
|
||||||
{
|
|
||||||
function cleanString($text) {
|
|
||||||
$utf8 = array(
|
|
||||||
'/[áàâãªä]/u' => 'a',
|
|
||||||
'/[ÁÀÂÃÄ]/u' => 'A',
|
|
||||||
'/[ÍÌÎÏ]/u' => 'I',
|
|
||||||
'/[íìîï]/u' => 'i',
|
|
||||||
'/[ěéèêë]/u' => 'e',
|
|
||||||
'/[ĚÉÈÊË]/u' => 'E',
|
|
||||||
'/[óòôõºö]/u' => 'o',
|
|
||||||
'/[ÓÒÔÕÖ]/u' => 'O',
|
|
||||||
'/[úùûü]/u' => 'u',
|
|
||||||
'/[ÚÙÛÜ]/u' => 'U',
|
|
||||||
'/Š/' => 'S',
|
|
||||||
'/š/' => 's',
|
|
||||||
'/Č/' => 'C',
|
|
||||||
'/č/' => 'c',
|
|
||||||
'/ř/' => 'r',
|
|
||||||
'/Ř/' => 'R',
|
|
||||||
'/Ý/' => 'Y',
|
|
||||||
'/ý/' => 'y',
|
|
||||||
'/ç/' => 'c',
|
|
||||||
'/Ç/' => 'C',
|
|
||||||
'/ñ/' => 'n',
|
|
||||||
'/Ñ/' => 'N',
|
|
||||||
'/–/' => '-', // UTF-8 hyphen to "normal" hyphen
|
|
||||||
'/[’‘‹›‚]/u' => ' ', // Literally a single quote
|
|
||||||
'/[“”«»„]/u' => ' ', // Double quote
|
|
||||||
'/ /' => ' ', // nonbreaking space (equiv. to 0x160)
|
|
||||||
);
|
|
||||||
return preg_replace(array_keys($utf8), array_values($utf8), $text);
|
|
||||||
}
|
|
||||||
|
|
||||||
function stringInsert($str,$insertstr,$pos)
|
|
||||||
{
|
|
||||||
$str = substr($str, 0, $pos) . $insertstr . substr($str, $pos);
|
|
||||||
return $str;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* [generateGraphJson description]
|
|
||||||
* @param string $type [line/bar]
|
|
||||||
* @param array $data [description]
|
|
||||||
* @param array $options [description]
|
|
||||||
* @return [type] [description]
|
|
||||||
*/
|
|
||||||
|
|
||||||
function generateGraphJson(string $type = 'line', array $data = [], array $options = []){
|
|
||||||
$array = [
|
|
||||||
'type' => $type,
|
|
||||||
'data' => [
|
|
||||||
'datasets' => [
|
|
||||||
[
|
|
||||||
'data' => $data,
|
|
||||||
'borderColor' => "#d4def7",
|
|
||||||
'backgroundColor' => "#d4def7"
|
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'options' => [
|
|
||||||
'scales' => [
|
|
||||||
'xAxes' => [
|
|
||||||
[
|
|
||||||
'type' => 'time',
|
|
||||||
'distribution' => 'linear',
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'yAxes' => [
|
|
||||||
[
|
|
||||||
'ticks' => [
|
|
||||||
'min' => $options['min'],
|
|
||||||
'max' => $options['max'],
|
|
||||||
'steps' => $options['scale']
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'legend' => [
|
|
||||||
'display' => false
|
|
||||||
],
|
|
||||||
'tooltips' => [
|
|
||||||
'enabled' => true
|
|
||||||
],
|
|
||||||
'hover' => [
|
|
||||||
'mode' => true
|
|
||||||
]
|
|
||||||
]
|
|
||||||
];
|
|
||||||
return json_encode($array, JSON_PRETTY_PRINT);
|
|
||||||
}
|
|
||||||
|
|
||||||
function ago( $datetime )
|
|
||||||
{
|
|
||||||
$interval = date_create('now')->diff( $datetime );
|
|
||||||
$suffix = ( $interval->invert ? ' ago' : '' );
|
|
||||||
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->h >= 1 ) return self::pluralize( $interval->h, 'hour' ) . $suffix;
|
|
||||||
if ( $v = $interval->i >= 1 ) return self::pluralize( $interval->i, 'minute' ) . $suffix;
|
|
||||||
return self::pluralize( $interval->s, 'second' ) . $suffix;
|
|
||||||
}
|
|
||||||
|
|
||||||
function pluralize( $count, $text )
|
|
||||||
{
|
|
||||||
return $count . ( ( $count == 1 ) ? ( " $text" ) : ( " ${text}s" ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkOperator($value1, $operator, $value2) {
|
|
||||||
switch ($operator) {
|
|
||||||
case '<': // Less than
|
|
||||||
return $value1 < $value2;
|
|
||||||
case '<=': // Less than or equal to
|
|
||||||
return $value1 <= $value2;
|
|
||||||
case '>': // Greater than
|
|
||||||
return $value1 > $value2;
|
|
||||||
case '>=': // Greater than or equal to
|
|
||||||
return $value1 >= $value2;
|
|
||||||
case '==': // Equal
|
|
||||||
return ($value1 == $value2);
|
|
||||||
case '===': // Identical
|
|
||||||
return $value1 === $value2;
|
|
||||||
case '!==': // Not Identical
|
|
||||||
return $value1 !== $value2;
|
|
||||||
case '!=': // Not equal
|
|
||||||
case '<>': // Not equal
|
|
||||||
return $value1 != $value2;
|
|
||||||
case '||': // Or
|
|
||||||
case 'or': // Or
|
|
||||||
return $value1 || $value2;
|
|
||||||
case '&&': // And
|
|
||||||
case 'and': // And
|
|
||||||
return $value1 && $value2;
|
|
||||||
case 'xor': // Or
|
|
||||||
return $value1 xor $value2;
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
} // end switch
|
|
||||||
}
|
|
||||||
}
|
|
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
39
app/controllers/deviceController.php
Normal file
39
app/controllers/deviceController.php
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
if (!empty ($_POST)){
|
||||||
|
$deviceManager = new DeviceManager ();
|
||||||
|
$subDeviceManager = new SubDeviceManager ();
|
||||||
|
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']));
|
||||||
|
}
|
||||||
|
if (!empty ($_POST['deviceApproved']) && !empty ($_POST['deviceId'])) {
|
||||||
|
$deviceManager->edit ($_POST['deviceId'], array ('approved' => $_POST['deviceApproved']));
|
||||||
|
}
|
||||||
|
if (isset ($_POST['deviceHistory']) && !empty ($_POST['deviceId'])) {
|
||||||
|
$subDeviceManager->editSubDevicesByDevice($_POST['deviceId'], array ('history' => $_POST['deviceHistory']));
|
||||||
|
}
|
||||||
|
header('Location: ' . BASEURL . str_replace(BASEDIR, "", $_SERVER['REQUEST_URI']));
|
||||||
|
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';
|
89
app/controllers/oauthController.php
Normal file
89
app/controllers/oauthController.php
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<?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=[];
|
||||||
|
if ($_POST['response_type'] = 'code') {
|
||||||
|
$get = [
|
||||||
|
"state"=>$state,
|
||||||
|
"code"=>$token,
|
||||||
|
"state"=>$state,
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
$get = [
|
||||||
|
"access_token"=>$token,
|
||||||
|
"token_type"=>"Bearer",
|
||||||
|
"state"=>$state,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
//Log
|
||||||
|
$logManager = new LogManager(__DIR__ . '/../../logs/auth/' . date("Y-m-d") . '.log');
|
||||||
|
$logManager->setLevel(LOGLEVEL);
|
||||||
|
$logManager->write("[OAUTH] Response " . $_POST["redirectUrl"] . '?' . http_build_query($get), LogRecordTypes::WARNING);
|
||||||
|
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'])
|
||||||
|
) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
50
app/controllers/settingController.php
Normal file
50
app/controllers/settingController.php
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
if (isset($_POST) && !empty($_POST)){
|
||||||
|
$userManager = new UserManager();
|
||||||
|
$roomManager = new RoomManager();
|
||||||
|
if (isset($_POST['submitPasswordChange']) && $_POST['submitPasswordChange'] != "") {
|
||||||
|
$oldPassword = $_POST['oldPassword'];
|
||||||
|
$newPassword = $_POST['newPassword1'];
|
||||||
|
$newPassword2 = $_POST['newPassword2'];
|
||||||
|
$userManager->changePassword($oldPassword, $newPassword, $newPassword2);
|
||||||
|
header('Location: ' . BASEURL . 'logout');
|
||||||
|
die();
|
||||||
|
} else if (isset($_POST['submitCreateUser']) && $_POST['submitCreateUser'] != "") {
|
||||||
|
$userName = $_POST['userName'];
|
||||||
|
$password = $_POST['userPassword'];
|
||||||
|
$email = $_POST['userEmail'];
|
||||||
|
$userManager->createUser($userName, $password, $email);
|
||||||
|
header('Location: ' . BASEURL . 'setting');
|
||||||
|
die();
|
||||||
|
} else if (isset($_POST['submitEnableOta']) && $_POST['submitEnableOta'] != "") {
|
||||||
|
$otaCode = $_POST['otaCode'];
|
||||||
|
$otaSecret = $_POST['otaSecret'];
|
||||||
|
|
||||||
|
$ga = new PHPGangsta_GoogleAuthenticator();
|
||||||
|
$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2); // 2 = 2*30sec clock tolerance
|
||||||
|
if ($checkResult) {
|
||||||
|
$userManager->setOta($otaCode, $otaSecret);
|
||||||
|
}
|
||||||
|
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();
|
||||||
|
} if (isset ($_POST['roomName']) && !empty ($_POST['roomId'])) {
|
||||||
|
$roomManager->edit($_POST['roomId'], array("name" => $_POST['roomName']));
|
||||||
|
header('Location: ' . BASEURL . 'setting');
|
||||||
|
die();
|
||||||
|
} else {
|
||||||
|
foreach ($_POST as $key => $value) {
|
||||||
|
if ($key == 'submit') continue;
|
||||||
|
$settingMng = new SettingsManager();
|
||||||
|
if ($settingMng->getByName($key)) {
|
||||||
|
$settingMng->update($key, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
header('Location: ' . BASEURL . 'setting');
|
||||||
|
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,34 +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();
|
|
||||||
} else if (isset($_POST['submitCreateRoom']) && $_POST['submitCreateRoom'] != "") {
|
|
||||||
$roomName = $_POST['roomName'];
|
|
||||||
RoomManager::create($roomName);
|
|
||||||
header('Location: ' . BASEDIR . 'setting');
|
|
||||||
die();
|
|
||||||
} else if (isset($_POST['submitEnableOta']) && $_POST['submitEnableOta'] != "") {
|
|
||||||
echo $otaCode = $_POST['otaCode'];
|
|
||||||
echo $otaSecret = $_POST['otaSecret'];
|
|
||||||
|
|
||||||
|
|
||||||
$ga = new PHPGangsta_GoogleAuthenticator();
|
|
||||||
$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2); // 2 = 2*30sec clock tolerance
|
|
||||||
if ($checkResult) {
|
|
||||||
UserManager::setOta($otaCode, $otaSecret);
|
|
||||||
}
|
|
||||||
header('Location: ' . BASEDIR . 'setting');
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
@ -112,7 +112,7 @@ class Form {
|
|||||||
* [render function whitch dysplay generated form]
|
* [render function whitch dysplay generated form]
|
||||||
*/
|
*/
|
||||||
function render(){
|
function render(){
|
||||||
self::addInput(InputTypes::SUBMIT, 'formSubmit', '', 'Submit', 'Submit');
|
self::addInput(InputTypes::SUBMIT, 'formSubmit', '', '', 'Submit');
|
||||||
$form = '<form '.$this->formName.$this->formId.$this->method.$this->action.'">';
|
$form = '<form '.$this->formName.$this->formId.$this->method.$this->action.'">';
|
||||||
$form .= $this->formContent;
|
$form .= $this->formContent;
|
||||||
$form .= '</form>';
|
$form .= '</form>';
|
502
app/models/GoogleHome.php
Normal file
502
app/models/GoogleHome.php
Normal file
@ -0,0 +1,502 @@
|
|||||||
|
<?php
|
||||||
|
https://console.cloud.google.com/logs/query;cursorTimestamp=2021-04-11T07:51:16.567357750Z?project=simple-home-79188
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($traids < 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tempDevice = [
|
||||||
|
'id' => (string) $deviceData['device_id'],
|
||||||
|
'type' => $actionType,
|
||||||
|
'traits' => $traids,
|
||||||
|
'attributes' => $attributes,
|
||||||
|
'name' => [
|
||||||
|
'name' => $deviceData['name'],
|
||||||
|
],
|
||||||
|
|
||||||
|
'willReportState' => false,
|
||||||
|
'roomHint' => $roomData['name'],
|
||||||
|
"otherDeviceIds" => [
|
||||||
|
["deviceId" => "SH#".(string) $deviceData['device_id']]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
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) {
|
||||||
|
|
||||||
|
$tempDevice[$deviceId['id']] = [
|
||||||
|
'online' => false,
|
||||||
|
'status' => 'OFFLINE',
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($subDevicesData = SubDeviceManager::getAllSubDevices($deviceId['id'])) {
|
||||||
|
foreach ($subDevicesData as $key => $subDeviceData) {
|
||||||
|
$lastRecord = RecordManager::getLastRecord($subDeviceData['subdevice_id']);
|
||||||
|
if ($lastRecord != false && $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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// $lastRecord = RecordManager::getLastRecord($deviceId['id']);
|
||||||
|
// //var_dump($lastRecord);
|
||||||
|
// 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']);
|
||||||
|
if ($subDeviceId = SubDeviceManager::getSubDeviceByMasterAndType($device['id'], $deviceType)) {
|
||||||
|
$subDeviceId = $subDeviceId['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, 'google');
|
||||||
|
|
||||||
|
$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, 'google');
|
||||||
|
|
||||||
|
$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, 'google');
|
||||||
|
|
||||||
|
$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');
|
||||||
}
|
}
|
||||||
}
|
}
|
217
app/models/Utilities.php
Normal file
217
app/models/Utilities.php
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class Utilities
|
||||||
|
{
|
||||||
|
static function cleanString($text)
|
||||||
|
{
|
||||||
|
$utf8 = array(
|
||||||
|
'/[áàâãªä]/u' => 'a',
|
||||||
|
'/[ÁÀÂÃÄ]/u' => 'A',
|
||||||
|
'/[ÍÌÎÏ]/u' => 'I',
|
||||||
|
'/[íìîï]/u' => 'i',
|
||||||
|
'/[ěéèêë]/u' => 'e',
|
||||||
|
'/[ĚÉÈÊË]/u' => 'E',
|
||||||
|
'/[óòôõºö]/u' => 'o',
|
||||||
|
'/[ÓÒÔÕÖ]/u' => 'O',
|
||||||
|
'/[úùûü]/u' => 'u',
|
||||||
|
'/[ÚÙÛÜ]/u' => 'U',
|
||||||
|
'/Š/' => 'S',
|
||||||
|
'/š/' => 's',
|
||||||
|
'/Č/' => 'C',
|
||||||
|
'/č/' => 'c',
|
||||||
|
'/ř/' => 'r',
|
||||||
|
'/Ř/' => 'R',
|
||||||
|
'/Ý/' => 'Y',
|
||||||
|
'/ý/' => 'y',
|
||||||
|
'/ç/' => 'c',
|
||||||
|
'/Ç/' => 'C',
|
||||||
|
'/ñ/' => 'n',
|
||||||
|
'/Ñ/' => 'N',
|
||||||
|
'/–/' => '-', // UTF-8 hyphen to "normal" hyphen
|
||||||
|
'/[’‘‹›‚]/u' => ' ', // Literally a single quote
|
||||||
|
'/[“”«»„]/u' => ' ', // Double quote
|
||||||
|
'/ /' => ' ', // nonbreaking space (equiv. to 0x160)
|
||||||
|
);
|
||||||
|
return preg_replace(array_keys($utf8), array_values($utf8), $text);
|
||||||
|
}
|
||||||
|
|
||||||
|
static function stringInsert($str, $insertstr, $pos)
|
||||||
|
{
|
||||||
|
$str = substr($str, 0, $pos) . $insertstr . substr($str, $pos);
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [generateGraphJson description]
|
||||||
|
* @param string $type [line/bar]
|
||||||
|
* @param array $data [description]
|
||||||
|
* @param array $options [description]
|
||||||
|
* @return [type] [description]
|
||||||
|
*/
|
||||||
|
|
||||||
|
static function generateGraphJson(string $type = 'line', array $data = [], array $options = [])
|
||||||
|
{
|
||||||
|
$array = [
|
||||||
|
'type' => $type,
|
||||||
|
'data' => [
|
||||||
|
'datasets' => [
|
||||||
|
[
|
||||||
|
'data' => $data,
|
||||||
|
'borderColor' => "#d4def7",
|
||||||
|
'backgroundColor' => "#d4def7"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'options' => [
|
||||||
|
'scales' => [
|
||||||
|
'xAxes' => [
|
||||||
|
[
|
||||||
|
'type' => 'time',
|
||||||
|
'distribution' => 'linear',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'yAxes' => [
|
||||||
|
[
|
||||||
|
'ticks' => [
|
||||||
|
'min' => $options['min'],
|
||||||
|
'max' => $options['max'],
|
||||||
|
'steps' => $options['scale']
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'legend' => [
|
||||||
|
'display' => false
|
||||||
|
],
|
||||||
|
'tooltips' => [
|
||||||
|
'enabled' => true
|
||||||
|
],
|
||||||
|
'hover' => [
|
||||||
|
'mode' => true
|
||||||
|
]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
return json_encode($array, JSON_PRETTY_PRINT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static function ago($datetime)
|
||||||
|
{
|
||||||
|
$interval = date_create('now')->diff($datetime);
|
||||||
|
$suffix = ($interval->invert ? ' ago' : '');
|
||||||
|
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->h >= 1) return self::pluralize($interval->h, 'hour') . $suffix;
|
||||||
|
if ($v = $interval->i >= 1) return self::pluralize($interval->i, 'minute') . $suffix;
|
||||||
|
return self::pluralize($interval->s, 'second') . $suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function pluralize($count, $text)
|
||||||
|
{
|
||||||
|
return $count . (($count == 1) ? (" $text") : (" ${text}s"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static function checkOperator($value1, $operator, $value2)
|
||||||
|
{
|
||||||
|
switch ($operator) {
|
||||||
|
case '<': // Less than
|
||||||
|
return $value1 < $value2;
|
||||||
|
case '<=': // Less than or equal to
|
||||||
|
return $value1 <= $value2;
|
||||||
|
case '>': // Greater than
|
||||||
|
return $value1 > $value2;
|
||||||
|
case '>=': // Greater than or equal to
|
||||||
|
return $value1 >= $value2;
|
||||||
|
case '==': // Equal
|
||||||
|
return ($value1 == $value2);
|
||||||
|
case '===': // Identical
|
||||||
|
return $value1 === $value2;
|
||||||
|
case '!==': // Not Identical
|
||||||
|
return $value1 !== $value2;
|
||||||
|
case '!=': // Not equal
|
||||||
|
case '<>': // Not equal
|
||||||
|
return $value1 != $value2;
|
||||||
|
case '||': // Or
|
||||||
|
case 'or': // Or
|
||||||
|
return $value1 || $value2;
|
||||||
|
case '&&': // And
|
||||||
|
case 'and': // And
|
||||||
|
return $value1 && $value2;
|
||||||
|
case 'xor': // Or
|
||||||
|
return $value1 xor $value2;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
} // 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sort Array by keys
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @param [type] $key
|
||||||
|
* @param string $operator ('asc'/'desc')
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
static function sortArrayByKey($data = [], $key, $operator = "asc")
|
||||||
|
{
|
||||||
|
if ($operator == "asc") {
|
||||||
|
uasort($data, function ($a, $b) use ($key) {
|
||||||
|
$SortA = $a[$key];
|
||||||
|
$SortB = $b[$key];
|
||||||
|
if ($key == "room_id") {
|
||||||
|
$SortA = RoomManager::getRoomName($SortA);
|
||||||
|
$SortB = RoomManager::getRoomName($SortB);
|
||||||
|
}
|
||||||
|
if ($SortA == $SortB) return 0;
|
||||||
|
return ($SortA < $SortB) ? -1 : 1;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
uasort($data, function ($a, $b) use ($key) {
|
||||||
|
$SortA = $a[$key];
|
||||||
|
$SortB = $b[$key];
|
||||||
|
if ($key == "room_id") {
|
||||||
|
$SortA = RoomManager::getRoomName($SortA);
|
||||||
|
$SortB = RoomManager::getRoomName($SortB);
|
||||||
|
}
|
||||||
|
if ($SortA == $SortB) return 0;
|
||||||
|
return ($SortA > $SortB) ? -1 : 1;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
70
app/models/managers/AuthManager.php
Normal file
70
app/models/managers/AuthManager.php
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
<?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;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUserId($bearer){
|
||||||
|
$token = explode(' ', $bearer)[1];
|
||||||
|
$userid = Db::loadOne('SELECT user_id FROM tokens WHERE token = ? AND expire >= CURRENT_TIMESTAMP AND blocked = 0;', array($token))['user_id'];
|
||||||
|
return $userid;
|
||||||
|
}
|
||||||
|
}
|
@ -3,28 +3,28 @@
|
|||||||
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 = self::getById($automationId,["enabled"]);
|
||||||
$flipedValue = ($automation['active'] == 1 ? 0 : 1);
|
$flipedValue = ($automation['enabled'] == 1 ? 0 : 1);
|
||||||
return Db::command ('UPDATE automation SET active = ? WHERE automation_id=?', array ($flipedValue,$automationId));
|
return Db::command ('UPDATE automation SET enabled = ? 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, $userId = 1, $automationId = "") {
|
||||||
$userId = UserManager::getUserData('user_id');
|
$userId = UserManager::getUserData('user_id', $userId);
|
||||||
$scene = array (
|
$scene = array (
|
||||||
'name' => $name,
|
'name' => $name,
|
||||||
'owner_id' => $userId,
|
'owner_id' => $userId,
|
||||||
'on_days' => $onDays,
|
'on_days' => $onDays,
|
||||||
'if_something' => $ifCode,
|
'conditions' => $ifCode,
|
||||||
'do_something' => $doCode,
|
'tasks' => $doCode,
|
||||||
);
|
);
|
||||||
try {
|
try {
|
||||||
if ($automationId == "") {
|
if ($automationId == "") {
|
||||||
@ -34,19 +34,24 @@ class AutomationManager{
|
|||||||
}
|
}
|
||||||
} catch(PDOException $error) {
|
} catch(PDOException $error) {
|
||||||
echo $error->getMessage();
|
echo $error->getMessage();
|
||||||
|
return false;
|
||||||
die();
|
die();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getAll(){
|
public static function getAll($collums = ['*']){
|
||||||
return Db::loadAll ("SELECT * FROM automation");
|
return Db::loadAll ("SELECT ". implode("," , $collums)." FROM automation");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getById($automationId, $collums = ['*']){
|
||||||
|
return Db::loadOne("SELECT ". implode("," , $collums)." FROM automation WHERE automation_id = ?", [$automationId]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function executeAll(){
|
public static function executeAll(){
|
||||||
global $logManager;
|
global $logManager;
|
||||||
|
|
||||||
$automations = Db::loadAll ("SELECT * FROM automation");
|
/*$automations = Db::loadAll ("SELECT * FROM automation");
|
||||||
$dayNameNow = strtolower (date('D', time()));
|
$dayNameNow = strtolower (date('D', time()));
|
||||||
|
|
||||||
foreach ($automations as $automation) {
|
foreach ($automations as $automation) {
|
||||||
@ -170,6 +175,6 @@ class AutomationManager{
|
|||||||
Db::edit('automation', array('locked' => 0), 'WHERE automation_id = ?', array($automation['automation_id']));
|
Db::edit('automation', array('locked' => 0), 'WHERE automation_id = ?', array($automation['automation_id']));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
}
|
}
|
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,51 @@
|
|||||||
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 * FROM devices
|
||||||
|
WHERE approved != ?", Array(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAllDevicesInRoom ($roomId = "") {
|
static function setHeartbeat($deviceId){
|
||||||
|
self::edit($deviceId, ['heartbeat' => date("Y-m-d H:i:s", time())]);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 +56,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 +65,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 +79,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 +95,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,13 +17,14 @@ 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);
|
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;
|
||||||
|
}
|
||||||
|
}
|
48
app/models/managers/LogManager.php
Normal file
48
app/models/managers/LogManager.php
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class LogManager
|
||||||
|
{
|
||||||
|
private $logFile;
|
||||||
|
private $filePath = null;
|
||||||
|
private $logLevel = 1;
|
||||||
|
|
||||||
|
public function __construct($fileName = "")
|
||||||
|
{
|
||||||
|
if ($fileName == ""){
|
||||||
|
$fileName = '../logs/'. date("Y-m-d").'.log';
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!is_dir("../logs/"))
|
||||||
|
{
|
||||||
|
mkdir("../logs/");
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->filePath = $fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setLevel($type = LogRecordTypess::WARNING){
|
||||||
|
$this->logLevel = $type['level'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function write($value, $type = LogRecordTypess::ERROR){
|
||||||
|
if ($this->logFile == null) {
|
||||||
|
$this->logFile = fopen($this->filePath, "a") or die("Unable to open file!");
|
||||||
|
}
|
||||||
|
|
||||||
|
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,10 +2,11 @@
|
|||||||
/**
|
/**
|
||||||
* 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){
|
||||||
|
if (!empty($userID) && !empty($token)) {
|
||||||
$notificationSubscriber = $subDeviceId = Db::loadOne('SELECT id FROM notifications WHERE token = ?;', array($token));
|
$notificationSubscriber = $subDeviceId = Db::loadOne('SELECT id FROM notifications WHERE token = ?;', array($token));
|
||||||
if ($notificationSubscriber == ''){
|
if ($notificationSubscriber == ''){
|
||||||
$notification = array (
|
$notification = array (
|
||||||
@ -15,12 +16,13 @@ class NotificationManager
|
|||||||
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;
|
||||||
}
|
}
|
29
app/models/managers/Pluginmanager.php
Normal file
29
app/models/managers/Pluginmanager.php
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
class PluginManager
|
||||||
|
{
|
||||||
|
public function load(){
|
||||||
|
$dir = $_SERVER['DOCUMENT_ROOT'] . BASEDIR . '/backup/';
|
||||||
|
|
||||||
|
$pluginsFiles = scandir ($dir);
|
||||||
|
foreach ($pluginsFiles as $key => $pluginFile) {
|
||||||
|
$className = str_replace(".zip", "", $pluginsFiles);
|
||||||
|
if(class_exists($className)){
|
||||||
|
(new $className)->make();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$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;
|
||||||
|
}
|
||||||
|
}
|
@ -2,16 +2,55 @@
|
|||||||
class RecordManager{
|
class RecordManager{
|
||||||
public static $records;
|
public static $records;
|
||||||
|
|
||||||
public function create ($deviceId, $type, $value) {
|
public static function createWithSubId ($subDeviceId, $value, $origin = false) {
|
||||||
$subDeviceId = Db::loadOne('SELECT * FROM subdevices WHERE device_id = ? AND type = ?;', array($deviceId, $type))['subdevice_id'];
|
try {
|
||||||
if ($subDeviceId == '') {
|
$record = [
|
||||||
return false;
|
'execuded' => 1,
|
||||||
};
|
];
|
||||||
|
|
||||||
|
Db::edit ('records', $record, 'WHERE subdevice_id = ?', array ($subDeviceId));
|
||||||
$record = array (
|
$record = array (
|
||||||
'subdevice_id' => $subDeviceId,
|
'subdevice_id' => $subDeviceId,
|
||||||
'value' => $value,
|
'value' => $value,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if ($origin != false)
|
||||||
|
$record['Origin'] = $origin;
|
||||||
|
|
||||||
|
return Db::add ('records', $record);
|
||||||
|
} catch(PDOException $error) {
|
||||||
|
echo $error->getMessage();
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function create ($deviceId, $type, $value, $origin = false) {
|
||||||
|
$subDeviceId = Db::loadOne('SELECT * FROM subdevices WHERE device_id = ? AND type = ?;', array($deviceId, $type))['subdevice_id'];
|
||||||
|
if ($subDeviceId == '') {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Ochrana proti duplicitním hodnotám zapisují se jen změny
|
||||||
|
$lastRecord = self::getLastRecord($subDeviceId, 1);
|
||||||
|
|
||||||
|
if (isset($lastRecord['value']) && $lastRecord['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,
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($origin != false)
|
||||||
|
$record['Origin'] = $origin;
|
||||||
|
|
||||||
return Db::add ('records', $record);
|
return Db::add ('records', $record);
|
||||||
} catch(PDOException $error) {
|
} catch(PDOException $error) {
|
||||||
echo $error->getMessage();
|
echo $error->getMessage();
|
||||||
@ -42,17 +81,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, origin FROM records
|
||||||
WHERE
|
WHERE
|
||||||
subdevice_id = ?
|
subdevice_id = ?
|
||||||
AND
|
AND
|
||||||
@ -60,21 +104,25 @@ 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function clean ($day) {
|
public static function clean ($day) {
|
||||||
if (isset($day)) {
|
if (isset($day)) {
|
||||||
Db::command ('DELETE FROM records WHERE `time` < ADDDATE(NOW(), INTERVAL -? DAY);', array($day));
|
Db::command ('DELETE FROM records WHERE `time` < ADDDATE(NOW(), INTERVAL ? DAY);', array($day));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function setHistory($subDeviceId){
|
||||||
|
$history = SubDeviceManager::getSubDevice($subDeviceId)['history'];
|
||||||
|
if ($history > 0) self::clean(-abs($history));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
53
app/models/managers/RoomManager.php
Normal file
53
app/models/managers/RoomManager.php
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
<?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 getRoomName ($room_id) {
|
||||||
|
//TODO: ignore Widgets withoud data
|
||||||
|
$allRoom = Db::loadAlone ("SELECT name FROM rooms WHERE room_id=?", array ($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 edit ($roomId, $values = []) {
|
||||||
|
try {
|
||||||
|
Db::edit ('rooms', $values, 'WHERE room_id = ?', array($roomId));
|
||||||
|
} 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));
|
||||||
}
|
}
|
||||||
}
|
}
|
47
app/models/managers/SettingsManager.php
Normal file
47
app/models/managers/SettingsManager.php
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
class SettingsManager{
|
||||||
|
static function getAllValues () {
|
||||||
|
return Db::loadAll ("SELECT * FROM settings");
|
||||||
|
}
|
||||||
|
|
||||||
|
static function getByName($settingName, $type = '') {
|
||||||
|
if ($type != '') return Db::loadOne("SELECT * FROM settings WHERE name = ? AND type = ?", array($settingName, $type));
|
||||||
|
return Db::loadOne("SELECT * FROM settings WHERE name = ?", array($settingName));
|
||||||
|
}
|
||||||
|
|
||||||
|
static function getSettingGroup($type) {
|
||||||
|
return Db::loadAll("SELECT * FROM settings WHERE type=?", array($type));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function create ($name, $value, $type = '') {
|
||||||
|
if (!self::getByName($name)){
|
||||||
|
$setting = array (
|
||||||
|
'name' => $name,
|
||||||
|
'value' => $value,
|
||||||
|
'type' => $type,
|
||||||
|
);
|
||||||
|
try {
|
||||||
|
Db::add ('settings', $setting);
|
||||||
|
} catch(PDOException $error) {
|
||||||
|
echo $error->getMessage();
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function update ($name, $value, $type = '') {
|
||||||
|
if (!self::getByName($name)){
|
||||||
|
self::create($name, $value, $type);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
Db::edit ('settings', [
|
||||||
|
'value' => $value
|
||||||
|
], 'WHERE name = ?', array($name));
|
||||||
|
} catch(PDOException $error) {
|
||||||
|
echo $error->getMessage();
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
127
app/models/managers/SubDeviceManager.php
Normal file
127
app/models/managers/SubDeviceManager.php
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
<?php
|
||||||
|
class SubDeviceManager
|
||||||
|
{
|
||||||
|
public static $devices;
|
||||||
|
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getSubDeviceMaster($subDeviceId)
|
||||||
|
{
|
||||||
|
return Db::loadOne("SELECT * FROM devices WHERE device_id = (SELECT device_id FROM subdevices WHERE subdevice_id = ?)", array($subDeviceId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getSubDeviceByMaster($deviceId, $subDeviceType = null)
|
||||||
|
{
|
||||||
|
if ($subDeviceType == null) {
|
||||||
|
return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ?;", array($deviceId));
|
||||||
|
} else {
|
||||||
|
return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ? AND type = ?;", array($deviceId, $subDeviceType));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getSubDeviceByMasterAndType($deviceId, $subDeviceType = '')
|
||||||
|
{
|
||||||
|
if ($subDeviceType == '') {
|
||||||
|
return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ?;", array($deviceId));
|
||||||
|
} else {
|
||||||
|
return Db::loadOne("SELECT * FROM subdevices WHERE device_id = ? AND type = ?;", array($deviceId, $subDeviceType));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getSubDevice($subDeviceId)
|
||||||
|
{
|
||||||
|
return Db::loadOne("SELECT * FROM subdevices WHERE subdevice_id = ?;", array($subDeviceId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getSubDevicesTypeForMater($deviceId)
|
||||||
|
{
|
||||||
|
$parsedTypes = [];
|
||||||
|
$types = Db::loadAll("SELECT type FROM subdevices WHERE device_id = ?;", array($deviceId));
|
||||||
|
foreach ($types as $orderNum => $type) {
|
||||||
|
$parsedTypes[$orderNum] = $type['type'];
|
||||||
|
}
|
||||||
|
return $parsedTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
//check if dubdevice exist
|
||||||
|
//Add History to be set in Creation
|
||||||
|
public static function create($deviceId, $type, $unit)
|
||||||
|
{
|
||||||
|
$record = array(
|
||||||
|
'device_id' => $deviceId,
|
||||||
|
'type' => $type,
|
||||||
|
'unit' => $unit,
|
||||||
|
);
|
||||||
|
try {
|
||||||
|
Db::add('subdevices', $record);
|
||||||
|
} catch (PDOException $error) {
|
||||||
|
echo $error->getMessage();
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function edit($subDeviceId, $values)
|
||||||
|
{
|
||||||
|
$record = [];
|
||||||
|
foreach ($values as $key => $value) {
|
||||||
|
$record[$key] = $value;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Db::edit('subdevices', $record, 'WHERE subdevice_id = ?', array ($subDeviceId));
|
||||||
|
} catch (PDOException $error) {
|
||||||
|
echo $error->getMessage();
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function remove($subDeviceId)
|
||||||
|
{
|
||||||
|
RecordManager::cleanSubdeviceRecords($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, d.sleep_time, d.heartbeat, sd.subdevice_id, sd.device_id, COALESCE(sd.icon, d.icon) AS icon, COALESCE(sd.name, d.name) AS name, sd.type, sd.unit, r.value, r.time 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 value != '999'*/
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getSubdeviceDetailById($subDeviceId){
|
||||||
|
if (empty($subDeviceId)) return NULL;
|
||||||
|
|
||||||
|
$rows = Db::loadOne("SELECT d.room_id, d.sleep_time, sd.subdevice_id, sd.type, sd.device_id FROM subdevices sd
|
||||||
|
JOIN devices d ON sd.device_id = d.device_id
|
||||||
|
WHERE sd.subdevice_id = ? ", [$subDeviceId]);
|
||||||
|
|
||||||
|
return $rows;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -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){
|
||||||
|
if ($userId == null) {
|
||||||
$email = self::getUserData('email');
|
$email = self::getUserData('email');
|
||||||
if ($userId != null){
|
}
|
||||||
|
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']);
|
||||||
session_destroy();
|
|
||||||
if (isset($_COOKIE['rememberMe'])){
|
|
||||||
unset($_COOKIE['rememberMe']);
|
unset($_COOKIE['rememberMe']);
|
||||||
setcookie("rememberMe", 'false', time(), BASEDIR, $_SERVER['HTTP_HOST']);
|
setcookie("rememberMe", 'false', 0 - time(), BASEDIR, $_SERVER['HTTP_HOST']);
|
||||||
}
|
session_destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
}
|
||||||
|
}
|
191
app/models/types/GoogleHomeDeviceTypes.php
Normal file
191
app/models/types/GoogleHomeDeviceTypes.php
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
<?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'], 'plugin');
|
||||||
|
} 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 '';
|
||||||
|
}
|
||||||
|
}
|
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
|
||||||
|
}
|
||||||
|
}
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
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'], 'plugin');
|
||||||
|
} 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]], 'plugin');
|
||||||
|
}
|
||||||
|
} 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';
|
||||||
|
}
|
||||||
|
}
|
85
app/plugins/DameJidlo.php
Normal file
85
app/plugins/DameJidlo.php
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<?php
|
||||||
|
class DameJidlo extends VirtualDeviceManager
|
||||||
|
{
|
||||||
|
private $virtual_device_name = "Dáme Jídlo";
|
||||||
|
private $device_type = "virtual-device";
|
||||||
|
private $subdevice_type = "dame-jidlo";
|
||||||
|
|
||||||
|
public function deliveryTime($token)
|
||||||
|
{
|
||||||
|
// Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
|
||||||
|
$ch = curl_init();
|
||||||
|
|
||||||
|
curl_setopt($ch, CURLOPT_URL, 'https://cz.fd-api.com/api/v5/tracking/active-orders?time_variation=Variation2');
|
||||||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||||
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
|
||||||
|
|
||||||
|
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');
|
||||||
|
|
||||||
|
$headers = array();
|
||||||
|
$headers[] = 'Authority: cz.fd-api.com';
|
||||||
|
$headers[] = 'Sec-Ch-Ua: \"Chromium\";v=\"88\", \"Google Chrome\";v=\"88\", \";Not A Brand\";v=\"99\"';
|
||||||
|
$headers[] = 'Accept: application/json, text/plain, */*';
|
||||||
|
$headers[] = 'Authorization: Bearer ' . $token;
|
||||||
|
$headers[] = 'X-Pd-Language-Id: 2';
|
||||||
|
$headers[] = 'Sec-Ch-Ua-Mobile: ?0';
|
||||||
|
$headers[] = 'X-Fp-Api-Key: volo';
|
||||||
|
$headers[] = 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36';
|
||||||
|
$headers[] = 'Origin: https://www.damejidlo.cz';
|
||||||
|
$headers[] = 'Sec-Fetch-Site: cross-site';
|
||||||
|
$headers[] = 'Sec-Fetch-Mode: cors';
|
||||||
|
$headers[] = 'Sec-Fetch-Dest: empty';
|
||||||
|
$headers[] = 'Referer: https://www.damejidlo.cz/';
|
||||||
|
$headers[] = 'Accept-Language: en-US,en;q=0.9,cs-CZ;q=0.8,cs;q=0.7';
|
||||||
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||||
|
|
||||||
|
$result = curl_exec($ch);
|
||||||
|
if (curl_errno($ch)) {
|
||||||
|
echo 'Error:' . curl_error($ch);
|
||||||
|
}
|
||||||
|
curl_close($ch);
|
||||||
|
var_dump(isset(json_decode($result, true)['data']['active_orders'][0]['delivery']['time']['eta']) ? json_decode($result, true)['data']['active_orders'][0]['delivery']['time']['eta'] : 0);
|
||||||
|
return (isset(json_decode($result, true)['data']['active_orders'][0]['delivery']['time']['eta']) ? json_decode($result, true)['data']['active_orders'][0]['delivery']['time']['eta'] : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function make()
|
||||||
|
{
|
||||||
|
//Register the settings
|
||||||
|
$settingMng = new SettingsManager();
|
||||||
|
if (!($settingField = $settingMng->getByName("damejidlo_token","damejidlo"))) {
|
||||||
|
$settingMng->create("damejidlo_token", "", "damejidlo");
|
||||||
|
} else {
|
||||||
|
$bearer = $settingField['value'];
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
RecordManager::create($deviceId, $this->subdevice_type, $this->deliveryTime($bearer), 'plugin');
|
||||||
|
} 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 == 0) {
|
||||||
|
return " Delivered";
|
||||||
|
} else if ($value <= 1) {
|
||||||
|
return "less " . $value;
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
93
app/plugins/DatabaseBackup.php
Normal file
93
app/plugins/DatabaseBackup.php
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
<?php
|
||||||
|
class DatabaseBackup
|
||||||
|
{
|
||||||
|
public function make()
|
||||||
|
{
|
||||||
|
//Register the settings
|
||||||
|
$time = '00:00';
|
||||||
|
$settingMng = new SettingsManager();
|
||||||
|
if (!($settingField = $settingMng->getByName("backup_time","db_backup"))) {
|
||||||
|
$settingMng->create("backup_time", $time, "db_backup");
|
||||||
|
} else {
|
||||||
|
$time = $settingField['value'];
|
||||||
|
}
|
||||||
|
|
||||||
|
//Time to Backup ?
|
||||||
|
if (date("H:i",time()) != $time)
|
||||||
|
return 'pending';
|
||||||
|
|
||||||
|
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 data()
|
||||||
|
{
|
||||||
|
$backupfile = $_SERVER['DOCUMENT_ROOT'] . BASEDIR . "/backup/" . DBNAME . '_data_' . date("Y-m-d", time()) . '.sql';
|
||||||
|
if (file_exists($backupfile)) return null;
|
||||||
|
$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 scheme()
|
||||||
|
{
|
||||||
|
$backupfile = $_SERVER['DOCUMENT_ROOT'] . BASEDIR . "/backup/" . DBNAME . '_scheme_' . date("Y-m-d", time()) . '.sql';
|
||||||
|
if (file_exists($backupfile)) return null;
|
||||||
|
$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
|
||||||
|
}
|
||||||
|
}
|
42
app/plugins/N7day.php
Normal file
42
app/plugins/N7day.php
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<?php
|
||||||
|
class N7Day extends VirtualDeviceManager
|
||||||
|
{
|
||||||
|
private $virtual_device_name = "N7 Day";
|
||||||
|
private $device_type = "day-count";
|
||||||
|
private $subdevice_type = "day-count";
|
||||||
|
|
||||||
|
|
||||||
|
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, 'days');
|
||||||
|
sleep(1);
|
||||||
|
$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($this->subdevice_type));
|
||||||
|
}
|
||||||
|
|
||||||
|
//if (!$this->fetchEnabled($deviceId,$subDevice['subdevice_id'])) die();
|
||||||
|
|
||||||
|
//Days Until N7 day
|
||||||
|
$now = time(); // or your date as well
|
||||||
|
if (strtotime(date("Y") . "-11-07") < $now){
|
||||||
|
$your_date = strtotime((date("Y") + 1) . "-11-07");
|
||||||
|
} else {
|
||||||
|
$your_date = strtotime(date("Y") . "-11-07");
|
||||||
|
}
|
||||||
|
$datediff = $now - $your_date;
|
||||||
|
$daysUntilN7Day = round($datediff / (60 * 60 * 24));
|
||||||
|
|
||||||
|
RecordManager::create($deviceId, $this->subdevice_type, $daysUntilN7Day, 'plugin');
|
||||||
|
} else {
|
||||||
|
DeviceManager::create($this->virtual_device_name, $this->virtual_device_name, $this->device_type);
|
||||||
|
DeviceManager::approved($this->virtual_device_name);
|
||||||
|
}
|
||||||
|
return 'sucessful';
|
||||||
|
} catch(Exception $e) {
|
||||||
|
return 'exception: ' . $e->getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
72
app/plugins/OpenWeatherMap.php
Normal file
72
app/plugins/OpenWeatherMap.php
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
<?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);
|
||||||
|
|
||||||
|
|
||||||
|
//Notification data setup
|
||||||
|
$notificationMng = new NotificationManager;
|
||||||
|
if ($json['weather'][0]['id'] >= 500 && $json['weather'][0]['id'] < 600) {
|
||||||
|
// $notificationData = [
|
||||||
|
// 'title' => 'Weather',
|
||||||
|
// 'body' => 'It Will be rainy outhere, Take Umbrela :)',
|
||||||
|
// 'icon' => 'http://dev.steelants.cz/projekty/simplehome-client/img/icons/favicon-16x16.png',
|
||||||
|
// ];
|
||||||
|
// //Notification for newly added Device
|
||||||
|
// if ($notificationData != []) {
|
||||||
|
// $subscribers = $notificationMng::getSubscription();
|
||||||
|
// foreach ($subscribers as $key => $subscriber) {
|
||||||
|
// $notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
} else if ($json['weather'][0]['id'] >= 600 && $json['weather'][0]['id'] < 700) {
|
||||||
|
// $notificationData = [
|
||||||
|
// 'title' => 'Weather',
|
||||||
|
// 'body' => 'It is white out there :)',
|
||||||
|
// 'icon' => 'http://dev.steelants.cz/projekty/simplehome-client/img/icons/favicon-16x16.png',
|
||||||
|
// ];
|
||||||
|
// //Notification for newly added Device
|
||||||
|
// if ($notificationData != []) {
|
||||||
|
// $subscribers = $notificationMng::getSubscription();
|
||||||
|
// foreach ($subscribers as $key => $subscriber) {
|
||||||
|
// $notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RecordManager::create($deviceId, $this->subdevice_type, $json['weather'][0]['id'], 'plugin');
|
||||||
|
} 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 enable(){
|
||||||
|
(new SettingsManager)->create('open_weather_api_token', '', 'open_weather');
|
||||||
|
}
|
||||||
|
}
|
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)), 'plugin');
|
||||||
|
}
|
||||||
|
} 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>
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user