392 Commits

Author SHA1 Message Date
a7380841cf Move concerns to right places 2020-12-15 22:02:02 +01:00
28dd69e3a5 Write concerns 2020-12-15 21:55:39 +01:00
f21293bc01 Remove test code 2020-12-15 21:50:42 +01:00
bf79e9cee7 Introduced configurations and application object (test code) 2020-12-15 21:46:46 +01:00
cf30a1280d Really basic application object. 2020-12-15 21:10:42 +01:00
e11023d1c9 Merge pull request 'feature/composer' (#1) from feature/composer into remastering
Reviewed-on: #1
2020-12-15 16:10:30 +00:00
cfcfefefd8 Bootstrap installed 2020-12-15 16:59:08 +01:00
09d78192b6 Use composer autoload.php instead of custom boostrap.php 2020-12-15 16:56:12 +01:00
158220700b Create composer.json, ignore vendor/ folder. 2020-12-15 16:54:29 +01:00
GamerClassN7
76e036181a Docker submodule fixed 2020-12-15 09:13:23 +01:00
GamerClassN7
39f44c8d03 api tweeks 2020-12-15 09:07:47 +01:00
Haitem
ee0ebff76a first part of plugin setting 2020-12-09 14:30:41 +01:00
42443c8b58 Fix 2020-12-09 12:42:26 +01:00
e95435a707 Better settings Manager 2020-12-09 12:36:57 +01:00
74f6779c63 Fix 2020-12-09 12:28:31 +01:00
181a65a99b Bug Fixes 2020-12-09 12:19:19 +01:00
GamerClassN7
ff2c51d505 Minor Tweeks 2020-12-07 20:21:27 +01:00
GamerClassN7
879a63948f Bugfix 2020-11-30 12:37:44 +01:00
GamerClassN7
52688a5e70 Maybe filter out Error Values 2020-11-18 22:09:02 +01:00
GamerClassN7
3181c9dc72 Sort by Firmware Fix 2020-11-18 21:57:58 +01:00
GamerClassN7
ac43bdaf64 API Device Log Fix 2020-11-18 21:42:48 +01:00
GamerClassN7
e65b046d47 Loggin Form Error Message Fix 2020-11-18 21:42:02 +01:00
GamerClassN7
50a0d3036c basedir Additiona Fix of Automation page 2020-11-18 21:41:45 +01:00
GamerClassN7
fffaf0e237 Record Manager Bugfix 2020-11-18 21:41:11 +01:00
GamerClassN7
e9b8e0a453 Base Url Tweek <html> 2020-11-18 21:40:52 +01:00
GamerClassN7
0e3f571a0d Device Sorting Fix 2020-11-18 21:40:13 +01:00
GamerClassN7
5ad11cbb10 Little Tweeks + Sort Function for array 2020-11-03 16:29:10 +01:00
GamerClassN7
a4cdb250b9 N7 Day Plugin 2020-11-01 21:33:02 +01:00
GamerClassN7
72e6f475d7 Database Backup Plugin Fix + Record Fix 2020-11-01 21:20:05 +01:00
GamerClassN7
4b94ef29c1 Merge branch 'remastering' of https://gitea.steelants.cz/SH/PHP_SMART_HOME_V3 into remastering 2020-10-31 21:37:46 +01:00
GamerClassN7
8a00190850 Minor Tweeks 2020-10-31 21:37:29 +01:00
haitem
38cc436f4d Merge branch 'remastering' of https://gitea.steelants.cz/SH/PHP_SMART_HOME_V3 into remastering 2020-10-31 15:10:38 +01:00
haitem
fef8cb2ed9 make message 2020-10-31 15:10:05 +01:00
GamerClassN7
f205df36ff Code Style 2020-10-31 14:55:56 +01:00
GamerClassN7
c448f72095 Code Style 2020-10-31 14:54:31 +01:00
GamerClassN7
9969d3ca91 CPU Usage 2020-10-31 14:53:12 +01:00
GamerClassN7
1e9395f9e7 Merge branch 'remastering' of https://gitea.steelants.cz/SH/PHP_SMART_HOME_V3 into remastering 2020-10-31 14:34:07 +01:00
GamerClassN7
0c3d14754f Config Added 2020-10-31 14:33:37 +01:00
Haitem
2117e9acac remake to switch betwen enable and disable buton and second button is remove, remova now not work 2020-10-30 15:25:34 +01:00
Haitem
6689b4285e Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-10-26 16:46:01 +01:00
Haitem
eba00c2744 Remake design for plugins buttons 2020-10-26 16:45:45 +01:00
GamerClassN7
95c8e54199 Little tweeks 2020-10-26 16:27:15 +01:00
GamerClassN7
7533facf07 Some Plugin Improvements 2020-10-26 16:16:42 +01:00
Haitem
e2c16072b9 Reapir login cookies and session 2020-10-26 09:44:59 +01:00
haitem
c7e18d6959 Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-10-26 00:01:46 +01:00
haitem
ea00f7a295 Make plugins list and switcher 2020-10-26 00:01:30 +01:00
GamerClassN7
e9dace53e0 Clean Up 2020-10-25 19:09:17 +01:00
haitem
64ccd91469 Some edit 2020-10-25 17:46:06 +01:00
GamerClassN7
513b13dcb8 Login Redirect 2020-10-25 17:21:55 +01:00
GamerClassN7
6b08b2785f Bether Graph generation & covid version 2 2020-10-25 11:51:44 +01:00
GamerClassN7
e2c9c31d2f Tweeks 2020-10-22 21:28:08 +02:00
GamerClassN7
13ae5401f7 Old API Cleanup 2020-10-22 18:41:07 +02:00
GamerClassN7
31fb9dad37 Old Docker Cleanup 2020-10-22 18:02:26 +02:00
GamerClassN7
ab92a58289 Little Tweeks 2020-10-22 17:59:45 +02:00
GamerClassN7
946a93a23b Plugin system modification 2020-10-22 16:42:49 +02:00
GamerClassN7
1a3e659ca7 Air Quality 2020-10-21 19:35:52 +02:00
GamerClassN7
5d998da30a Gi ignore 2020-10-21 19:15:21 +02:00
GamerClassN7
2cbf6fbb23 Old Docker Cleanup 2020-10-21 19:14:35 +02:00
GamerClassN7
f4a5beeb7b Backup 2020-10-21 14:54:15 +02:00
GamerClassN7
24b0048f57 Clean Up Backup Folder 2020-10-21 14:44:31 +02:00
GamerClassN7
2871dd49dd docker 2020-10-21 14:38:41 +02:00
JonatanRek
a3a482c652 Db Backup Plugin 2020-10-19 16:23:39 +02:00
JonatanRek
0b954b79c0 Covid last Data Fix 2020-10-19 16:23:27 +02:00
JonatanRek
ce05533d29 Widget Detail no data Fix 2020-10-19 16:22:54 +02:00
JonatanRek
9dfaeb554d Record Debree optimalization 2020-10-19 16:22:17 +02:00
haitem
6b7bd911f7 Add email to create user, in setting edit user permission and emailmanager file 2020-10-17 18:03:55 +02:00
JonatanRek
740a2debf7 Simple-Home Biden vs. Trump Edition 2020-10-15 18:55:16 +02:00
JonatanRek
5d32c2bfa4 Some Tweeks 2020-10-14 18:33:34 +02:00
JonatanRek
c410df1bd6 Some Fixes 2020-10-14 15:53:26 +02:00
JonatanRek
3aab42d081 Cron Update 2020-10-14 14:35:04 +02:00
JonatanRek
dffaf8eb2e Open Weather Map 2020-10-14 14:34:46 +02:00
JonatanRek
3047ead205 Detail chart 2020-10-14 14:31:22 +02:00
JonatanRek
e39b6655e3 Covit Data Fetching Plugin 2020-10-08 19:41:38 +02:00
JonatanRek
b5d7904a61 Aditional changes 2020-10-05 21:32:23 +02:00
JonatanRek
e3b7e866f0 Adtional tweeks and fixes 2020-10-05 21:12:06 +02:00
JonatanRek
94d6576070 App Device Detail 2020-10-05 21:11:44 +02:00
JonatanRek
51f7ce9dbd Spotify #2 2020-10-03 21:44:09 +02:00
JonatanRek
a70caca58d Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-10-03 18:21:34 +02:00
JonatanRek
81dcc9da5b Spotifi Widget 2020-10-03 18:21:31 +02:00
Haitem
c75c67d420 Repair sort and get value wifi connection 2020-09-15 16:38:11 +02:00
20469c65db Repair bugs with global parameter 2020-09-14 16:24:59 +02:00
aafd5539c4 Merge local branch to remastering 2020-09-14 15:21:20 +02:00
30da6e162b Few Fixes After infrastructure migration 2020-09-14 15:15:47 +02:00
Haitem
cc804f36df Create sorting on table in devices 2020-09-09 20:24:10 +02:00
Haitem
ed732e125a Add name changer and repair need icon 2020-09-08 18:47:58 +02:00
Haitem
2c6e7e2ecc Add function on change room 2020-09-08 18:00:44 +02:00
32521d0ed3 Minor Changes 2020-09-07 12:52:30 +02:00
6945d58eb6 Device Room Select 2020-09-07 11:33:24 +02:00
50e161e1ce Icons Color and Icon CHanges 2020-09-07 11:18:17 +02:00
366f1c4db4 Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-09-07 11:06:05 +02:00
b0514c1f3a Some Fixes 2020-09-07 11:05:47 +02:00
Haitem
ca5b221bc1 Some modificatio and repair 2020-09-03 22:15:59 +02:00
JonatanRek
fc3d3d5930 Sync 2020-09-02 21:15:00 +02:00
JonatanRek
77d6e795d6 Merge Logal to remote 2020-09-02 19:47:07 +02:00
JonatanRek
3c456caeca Update othervise reload redo restart 2020-09-02 19:45:08 +02:00
JonatanRek
5647bb21a7 Little Tweeks 2020-09-02 19:44:40 +02:00
960859087a Some Fixes 2020-09-02 14:03:00 +02:00
Haitem
8e33d226cd Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-08-31 22:47:25 +02:00
Haitem
9b9b67d01e view if status is not changed in action 2020-08-31 22:46:50 +02:00
JonatanRek
50bd53561e Some stile tweeks 2020-08-31 22:45:05 +02:00
Haitem
6b0ab2d0ba Add device menu 2020-08-31 21:23:23 +02:00
0efbda0583 Weather API Start 2020-08-25 15:12:25 +02:00
7f42d49634 Logs to main menu 2020-08-03 15:06:43 +02:00
a6cb51f2f5 Trace log prewiew counter + his API 2020-07-30 16:31:25 +02:00
b174022f9a Tweeks of new Log System 2020-07-29 08:44:11 +02:00
d404afe501 Minore Tweeks and FIxes 2020-07-29 08:35:00 +02:00
ceca8fc057 Few Fixes 2020-07-28 15:51:40 +02:00
7df378d794 Device Log to Server Log 2020-07-28 15:40:48 +02:00
98c603494d Update of Config 2020-07-28 11:33:32 +02:00
27c306cba7 Some Loggig changes 2020-07-28 11:29:36 +02:00
70ef954b64 Bether Loggig Class 2020-07-28 09:02:46 +02:00
JonatanRek
6d44750804 Router fix 2020-07-27 20:00:41 +02:00
JonatanRek
49d24f8e0e Server Stats API 2020-07-27 19:52:43 +02:00
5ee1af2571 Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-07-27 16:57:06 +02:00
2185c62472 Bether Exeption Handler 2020-07-27 16:57:01 +02:00
Haitem
bde466a5bd Log finding add 2020-07-24 18:21:11 +02:00
3d68df2658 Server Info basic layout 2020-07-23 17:58:46 +02:00
880b01882a Log Server 2020-07-23 17:29:55 +02:00
727ed03be7 Server Fixes 2020-07-23 15:16:44 +02:00
0323323bb1 Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-07-21 17:01:28 +02:00
fa10200bde Delete Unused Routes 2020-07-21 17:01:23 +02:00
03cc627b72 Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-07-21 10:49:20 +02:00
3665d0afd9 Fix 2020-07-21 10:47:32 +02:00
be09f00b95 Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-07-21 10:47:04 +02:00
4b20c5fd0d TODO 2020-07-21 10:46:57 +02:00
5ba86edb69 merge fix 2020-07-21 10:46:27 +02:00
67cc103db5 Add dir variable on delete path variable 2020-07-21 10:44:55 +02:00
1a448663f0 Fixes Of Autoloader 2020-07-21 10:34:15 +02:00
1a27993a94 Crone Controlls Commit 2020-07-21 10:29:26 +02:00
Haitem
82e5248658 Repair global variable 2020-07-20 20:04:38 +02:00
Haitem
eba5301906 Add old log remover and repair islogin function error 2020-07-20 19:15:23 +02:00
8a6185e329 Clean Up 2020-07-20 13:08:17 +02:00
d013788249 Little Fixes 2020-07-20 12:54:07 +02:00
14a33b83d0 Widget duplication Fix 2020-07-20 12:46:46 +02:00
05bd0dbc64 sync 2020-07-20 11:07:32 +02:00
JonatanRek
d1b4597720 Order 2020-07-15 19:15:36 +02:00
dbbf42bc0d Docker Appache adition 2020-07-15 15:10:42 +02:00
1996b08311 OTA Endpoint Impruvements 2020-07-15 12:54:45 +02:00
JonatanRek
275aa97688 OTA Tweeks 2020-07-14 19:59:18 +02:00
Haitem
8ed3ab2f39 Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-07-14 18:24:31 +02:00
Haitem
7f5d348d07 add update 2020-07-14 18:24:21 +02:00
JonatanRek
5f95548b92 Tweeks of Endpoins API 2020-07-12 15:59:01 +02:00
Haitem
7a3beea274 Add to endpoint zapis 2020-07-04 20:07:40 +02:00
Haitem
61a1b5057c Some edit 2020-07-04 20:06:54 +02:00
JonatanRek
cdcddffc69 Some quick fix 2020-07-01 12:07:00 +02:00
JonatanRek
3669fde596 Some tveeks 2020-06-29 22:00:00 +02:00
JonatanRek
a1358c53fd Some Fixes 2020-06-29 21:35:17 +02:00
JonatanRek
78c29482a6 New Endpoint API 2020-06-28 16:45:05 +02:00
JonatanRek
7954ae49b9 Volume_Cont Added 2020-06-27 10:26:54 +02:00
JonatanRek
2ddb2750ab Google Home Execution Fix 2020-06-26 21:35:40 +02:00
JonatanRek
4c3aaa40bc Relative Paths Fixes 2020-06-26 16:58:08 +02:00
JonatanRek
fc8891425d Oauthentication gateway Fix 2020-06-26 16:57:54 +02:00
JonatanRek
348f8ab57d Google Home API Improvement + Refactoring 2020-06-26 16:57:26 +02:00
JonatanRek
b0650e7fbe CleanUp 2020-06-23 20:30:22 +02:00
JonatanRek
dcc7592c4f Routes Fix 2020-06-23 20:28:11 +02:00
JonatanRek
cb6ab3bdda Fixed 2020-06-23 20:25:42 +02:00
JonatanRek
41916a90bd Again 2020-06-23 20:23:11 +02:00
JonatanRek
da975598c5 Users Start 2020-05-28 18:30:11 +02:00
JonatanRek
35279a2b51 Detail 2020-05-27 21:37:35 +02:00
JonatanRek
804a5d1212 Detail endpoint start 2020-05-26 21:47:36 +02:00
JonatanRek
aef5b5116d Execution Check 2020-05-26 21:42:39 +02:00
xinatorus
ae0d5b86ad run widget 2020-05-26 21:01:03 +02:00
xinatorus
c961bc2c88 auth fix 2020-05-25 21:21:38 +02:00
JonatanRek
254a2cf97a Fix 2020-05-24 19:44:58 +02:00
JonatanRek
e7858ac4a3 Get -> post 2020-05-24 19:42:03 +02:00
JonatanRek
0b9f7486df Fix 2020-05-24 19:40:49 +02:00
JonatanRek
97408d31e9 Fix 2020-05-24 19:40:12 +02:00
JonatanRek
b2474fbdfb Small Fix 2020-05-24 19:37:29 +02:00
JonatanRek
0543f74977 Rooms And Widget API Endpoints 2020-05-24 19:35:19 +02:00
xinatorus
c3f11a4c66 Debugger 2020-05-22 22:15:49 +02:00
xinatorus
0929870cc9 api response content header as json 2020-05-22 20:11:52 +02:00
JonatanRek
b036adf206 NOtification Date Fix 2020-05-20 09:14:15 +02:00
JonatanRek
4fbbf5acbf Notification time 2020-05-20 09:11:49 +02:00
JonatanRek
b8b81626e8 Log File Clasification 2020-05-20 09:07:27 +02:00
JonatanRek
7af1eda141 Fix 2020-05-17 15:14:27 +02:00
JonatanRek
dc50d5d4d6 Bad path Fix 2020-05-17 14:41:26 +02:00
JonatanRek
e4d93c7add Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-05-17 14:25:28 +02:00
JonatanRek
6a20e9c684 Autocomplete of for OTA 2020-05-17 14:25:22 +02:00
JonatanRek
2c5d861011 Oauth Title Fix 2020-05-17 14:24:56 +02:00
xinatorus
778e862b97 auth api fix 2020-05-17 14:21:11 +02:00
JonatanRek
862fc29bde Auth Manager Fix 2020-05-17 14:15:54 +02:00
JonatanRek
fef3c1e57f Proper Oauth for Google Home 2020-05-17 01:27:06 +02:00
JonatanRek
1af11f3f58 Session Fix inwisible Char before 2020-05-17 01:26:49 +02:00
JonatanRek
cb8bd40a7e Cherry pick Rooms API 2020-05-16 22:11:20 +02:00
JonatanRek
87c719e9e6 Manager Duplication Clean Up 2020-05-16 22:05:11 +02:00
JonatanRek
090b9f7a7b CleanUp After Docker Try 2020-05-16 17:18:27 +02:00
JonatanRek
2f638d8091 Fix 2020-05-15 22:49:35 +02:00
JonatanRek
619386d391 To docker Image 2020-05-15 22:45:31 +02:00
xinatorus
ded8a698f0 docker 2020-05-15 22:37:17 +02:00
xinatorus
c3d8a211ed rooms api 2020-05-15 20:59:22 +02:00
JonatanRek
02ba4e5d6f Git additional Updates 2020-05-15 19:48:53 +02:00
xinatorus
d7a5d35f54 routes api fix 2020-05-13 17:58:41 +02:00
JonatanRek
135338041a Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-05-13 12:04:07 +02:00
JonatanRek
cd895d3bcc Menu Fix 2020-05-13 12:03:52 +02:00
xinatorus
3d541999a1 json api response unescape 2020-05-13 11:35:54 +02:00
JonatanRek
1070d8036c Rooms API 2020-05-13 10:05:54 +02:00
JonatanRek
26dab209bd Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-05-13 10:03:24 +02:00
JonatanRek
22e680e1d8 Google HOme Fixes 2020-05-13 10:02:42 +02:00
xinatorus
9961016683 widget types 2020-05-12 20:28:04 +02:00
xinatorus
c2203b452a refactoring, added rooms api 2020-05-12 19:41:46 +02:00
xinatorus
3981d9551d refactoring 2020-05-12 19:25:08 +02:00
JonatanRek
6458e89dea Gitignore 2020-05-12 13:57:31 +02:00
xinatorus
63e7c95415 View class, refactoring 2020-05-04 21:19:14 +02:00
JonatanRek
8d2af9181a Fix 2020-05-03 20:14:18 +02:00
JonatanRek
13678630f2 Need To be Fixed 2020-05-03 19:29:15 +02:00
JonatanRek
27d2c4fa18 Fix 2020-05-03 19:02:27 +02:00
JonatanRek
6383034de1 Smart Home Tem 2020-05-03 18:58:41 +02:00
JonatanRek
8f13c7ee5d ServerCleanUp 2020-05-02 21:24:21 +02:00
JonatanRek
4113296f86 ServerTime 2020-05-02 21:21:52 +02:00
JonatanRek
c74f93890d Some Fixes "hey, Google fix yourself :D" 2020-05-02 17:50:18 +02:00
JonatanRek
043cac1cba Something 2020-05-02 13:26:18 +02:00
JonatanRek
23aa83ec9a Google Home Bether Working 2020-05-02 13:18:15 +02:00
JonatanRek
8b39b727e1 Google API Progress 2020-04-30 19:40:34 +02:00
xinatorus
f588a293ed examples 2020-04-29 20:14:53 +02:00
JonatanRek
56891bda09 Google Home API location fix 2020-04-29 19:28:33 +02:00
JonatanRek
a1cfb21a81 Interesting Stuff 2020-04-29 16:10:33 +02:00
JonatanRek
c774ad90c2 Server informations 2020-04-28 15:17:14 +02:00
JonatanRek
e0bbc09389 Final Fixes And Clean Up 2020-04-28 11:52:14 +02:00
JonatanRek
a3d911d3ec Partial to lib 2020-04-28 11:44:35 +02:00
JonatanRek
2560800efb Storm patrik Fixes 2020-04-28 11:43:07 +02:00
JonatanRek
57501e2847 Path Fix 2020-04-28 09:28:46 +02:00
xinatorus
8fd7fe8329 project structure refactoring 2020-04-27 21:08:38 +02:00
xinatorus
e75de72afd project structure refactoring 2020-04-27 21:07:31 +02:00
xinatorus
d137d08ff4 AuthApi fix, refactoring 2020-04-27 19:42:05 +02:00
xinatorus
09ad9c9eba folder structure doc 2020-04-27 19:36:58 +02:00
JonatanRek
11e75cb18d Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-04-25 18:04:08 +02:00
JonatanRek
e4f37f7686 Authentication Endpoint 2020-04-25 18:04:02 +02:00
xinatorus
119149bf5e Api exeption handler 2020-04-25 11:38:06 +02:00
JonatanRek
8300e47b76 Exeption Handling 2020-04-25 11:09:32 +02:00
JonatanRek
0f51826d3f Error Handler Progress 2020-04-25 10:21:52 +02:00
JonatanRek
abff057943 Error Handler Progress 2020-04-25 10:20:47 +02:00
JonatanRek
79016fed87 Error handler 2020-04-25 09:37:55 +02:00
xinatorus
fe787163d0 ApiController visibility fix 2020-04-24 21:57:04 +02:00
xinatorus
5519d46ca2 DevicesApi 2020-04-24 21:54:25 +02:00
xinatorus
b4cfffc432 ApiControler 2020-04-24 21:22:24 +02:00
JonatanRek
84127bf7ab Api Controller Progress 2020-04-24 19:05:18 +02:00
JonatanRek
34ee711182 .htaccess token Fix 2020-04-24 18:59:41 +02:00
JonatanRek
cdcc63a81a Api Controller Progress 2020-04-24 18:58:00 +02:00
JonatanRek
bc0816e812 Api Controller 2020-04-24 18:37:05 +02:00
xinatorus
3dbec89f7b root htaccess 2020-04-23 21:13:02 +02:00
JonatanRek
9367564bfe .htaccess mastering 2020-04-23 17:37:19 +02:00
JonatanRek
048b9440e1 Clean Up 2020-04-22 08:38:08 +02:00
JonatanRek
a6453cf393 Multiple static fix 2020-04-21 20:11:40 +02:00
JonatanRek
386e7be130 Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-04-21 20:11:01 +02:00
JonatanRek
e8b2ad8599 Static Function fix 2020-04-21 20:10:53 +02:00
xinatorus
7548f409f2 ajax fix 2020-04-21 20:08:53 +02:00
xinatorus
a13c30a5c3 refactoring 2020-04-21 20:02:46 +02:00
JonatanRek
b326596e16 Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-04-21 19:44:39 +02:00
JonatanRek
ee65ea43c4 Static class Fix 2020-04-21 19:44:30 +02:00
xinatorus
0f49fd951a home route 2020-04-21 19:38:13 +02:00
JonatanRek
ba836c9573 Sub Index 2020-04-21 19:34:45 +02:00
JonatanRek
1e6fe2a00e Root minor fixes 2020-04-21 18:36:54 +02:00
xinatorus
bc76082860 router 404 2020-04-21 18:33:23 +02:00
xinatorus
85b10e1098 refactoring new project structure 2020-04-21 17:59:37 +02:00
JonatanRek
c520cf847c Template -> lib 2020-04-21 15:28:37 +02:00
JonatanRek
8c96a6021a Top up 2020-04-21 15:27:57 +02:00
JonatanRek
bfebe6b534 Route path Fix 2020-04-21 15:20:29 +02:00
JonatanRek
216db28e60 Fixes 2020-04-21 15:19:05 +02:00
JonatanRek
e76d2bc5e5 Includes (js, css to public) 2020-04-21 15:01:29 +02:00
JonatanRek
d51820b198 Main htacess change 2020-04-21 14:57:38 +02:00
JonatanRek
c58804ad12 Remove old index 2020-04-21 14:56:02 +02:00
JonatanRek
06fdc71ca2 Minnor changes 2020-04-21 14:54:35 +02:00
JonatanRek
bc9e9e16e7 Fixes 2020-04-21 14:19:30 +02:00
JonatanRek
bc6acb470a Fix 2020-04-21 14:14:13 +02:00
JonatanRek
15dfc8464d Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering 2020-04-21 14:11:46 +02:00
JonatanRek
36690e6899 Routes From Index 2020-04-21 14:11:34 +02:00
xinatorus
79b79bdfa5 router update 2020-04-21 14:04:01 +02:00
xinatorus
44c4a122f7 router update 2020-04-21 14:01:31 +02:00
JonatanRek
28490f5d67 Autoloader 2020-04-21 13:55:11 +02:00
xinatorus
74c6426500 new project structure 2020-04-20 21:49:30 +02:00
JonatanRek
dec5a9083a Docs to MD 2020-03-31 11:14:38 +02:00
JonatanRek
a1337d795d New Api autentication token 2020-03-31 11:13:21 +02:00
JonatanRek
e22d98cf6a Termostatic radiator head Preparation #Feature 2020-03-30 08:56:06 +02:00
JonatanRek
0593bf09dd API device registration notification #FIX 2020-03-30 08:55:36 +02:00
JonatanRek
4f1d2e18fc Licence Tweek 2020-03-25 17:54:59 +01:00
JonatanRek
15b0f97971 Firmwares To separed Repo 2020-03-25 17:42:54 +01:00
JonatanRek
2a33e070b8 Github Sync 2020-03-25 17:35:57 +01:00
JonatanRek
da01823b00 test Sync to Github 2020-03-25 17:31:10 +01:00
JonatanRek
12212d6c56 Release Fixes 2020-03-25 15:58:47 +01:00
JonatanRek
b2a8734ed3 API at home fix 2020-03-17 09:17:01 +01:00
3feeaab086 Merge branch 'dev' of https://git.steelants.cz/JonatanRek/PHP_SMART_HOME_V3 into dev 2020-03-16 17:09:07 +01:00
8cacccbf88 fix nodemcu 2020-03-16 17:08:47 +01:00
JonatanRek
8ab0b043f9 Api Impruvement 2020-03-16 16:34:37 +01:00
JonatanRek
24072cb582 Some tweeks 2020-03-16 15:07:44 +01:00
JonatanRek
801e26dda9 Updater Log Message + api tweeks 2020-03-16 15:03:43 +01:00
JonatanRek
ceeb002b6e Merge branch 'dev' of https://git.steelants.cz/JonatanRek/PHP_SMART_HOME_V3 into dev 2020-03-16 14:52:45 +01:00
JonatanRek
f570556d85 Bether Log + Log Wia API 2020-03-16 14:52:36 +01:00
b5d48be64a edit script to react on command 2020-03-13 17:02:53 +01:00
JonatanRek
e14a0edb3c Nicer Json 2020-03-13 16:28:50 +01:00
JonatanRek
ca2cb2dbd2 API fix 2020-03-13 16:25:09 +01:00
JonatanRek
62449d2528 Command interface API 2020-03-13 16:20:14 +01:00
JonatanRek
0d0ba4ae50 API command interface 2020-03-13 16:14:22 +01:00
JonatanRek
942c7a4bca New Stiles 2020-03-13 14:53:05 +01:00
JonatanRek
aaa713e646 Better Notification on Device Update. 2020-03-13 14:45:12 +01:00
Kotrba Filip
9d52a86aa8 little edit on shelly 2020-03-12 22:31:59 +01:00
unknown
a2030d944f setting for nodemcu 2020-03-12 22:14:36 +01:00
unknown
0b92c0a84a fix updater and other things 2020-03-12 21:34:12 +01:00
JonatanRek
3ff5e0d660 Chart Color 2020-03-12 10:28:36 +01:00
b158f4a042 fix upoad file 2020-03-11 15:30:11 +01:00
b05fa3e1ed add upload updater file 2020-03-11 14:45:42 +01:00
50100fd4c5 Merge branch 'dev' of https://git.steelants.cz/JonatanRek/PHP_SMART_HOME_V3 into dev 2020-03-11 13:11:14 +01:00
7825cbb7aa edit sonoff script on shelly script 2020-03-11 13:10:42 +01:00
JonatanRek
94f78af31b Diagnostic Information update 2020-03-11 12:43:37 +01:00
JonatanRek
6184f3815f Updater Ip address Filtration 2020-03-11 12:23:49 +01:00
JonatanRek
44c4c84292 Firmware Updater (Backend + GUI) 2020-03-11 12:22:44 +01:00
unknown
0d076eb67c some modification on shelly 2020-03-10 18:59:06 +01:00
unknown
3a6706d1ac fix nodemcu esp8266 2020-03-10 18:57:35 +01:00
9a8ea80f37 esp nodemcu version 4 2020-03-10 16:42:38 +01:00
unknown
e8def0f4ae Merge branch 'dev' of https://git.steelants.cz/JonatanRek/PHP_SMART_HOME_V3 into dev 2020-03-09 19:47:16 +01:00
unknown
f4ee4d5a7c fix updater 2020-03-09 19:45:49 +01:00
437d6f32c0 Smazat „app/updater/3C71BF2BEA66.bin“ 2020-03-09 19:45:21 +01:00
Kotrba Filip
b16766c65e fix shelly 1 2020-03-04 22:44:01 +01:00
unknown
b1b8c4925b fix merge 2020-03-04 20:56:31 +01:00
unknown
e2f7d72cb3 merge 2020-03-04 19:53:18 +01:00
unknown
a8daa51413 some test edit 2020-03-04 19:51:17 +01:00
JonatanRek
9d9bdc192f Create .gitkeep
Git keep
2020-03-04 15:45:31 +01:00
JonatanRek
eb62f02510 ESP Updater 2020-03-04 15:44:55 +01:00
JonatanRek
5d25eeccaf Update Shelly1_v2.ino
Double switch fix
2020-03-04 15:27:49 +01:00
Kotrba Filip
f3ec7476b2 little edit shelly 2020-03-03 20:03:06 +01:00
unknown
029d75cd33 Merge branch 'dev' of https://git.steelants.cz/JonatanRek/PHP_SMART_HOME_V3 into dev 2020-03-02 20:35:36 +01:00
unknown
4b1a26cc6f create shelly V2 2020-03-02 20:35:20 +01:00
JonatanRek
74e427fee2 Dore connection error ignor 2020-02-25 15:02:16 +01:00
JonatanRek
1e973d2d8f Automation Execution Time & Owner 2020-02-21 14:25:25 +01:00
JonatanRek
d8c7a54446 Automations 2020-02-21 14:01:39 +01:00
Kotrba Filip
edf0b1ceb4 wifi setting 2020-02-21 00:50:51 +01:00
unknown
ccd064ad3c add new shelly in alfa creation 2020-02-20 20:36:58 +01:00
unknown
dc4433899a fix 2020-02-20 19:04:43 +01:00
unknown
8a0f4d1956 some edit 2020-02-20 18:53:41 +01:00
unknown
c43b751bd3 merge 2020-02-18 21:31:37 +01:00
unknown
5a06a6c85a some fix and new firmware for shelly1 2020-02-18 21:30:44 +01:00
JonatanRek
15d95dae1d Fallback better settings 2020-02-15 14:02:18 +01:00
JonatanRek
bcd5f52a65 Fallback Fix 2020-02-14 17:05:56 +01:00
JonatanRek
0b8ad755a0 BACKGROUND SINC 2020-02-13 17:39:58 +01:00
JonatanRek
f0e82de775 Log page Fixes 2020-02-13 13:57:22 +01:00
JonatanRek
4ab9ad9c7c Log Clean Up "LogKeeper" initial 2020-02-13 13:53:58 +01:00
JonatanRek
1b5630215b API Request 2020-02-13 13:35:15 +01:00
JonatanRek
bc54e33621 Log Rest api requests 2020-02-13 13:32:18 +01:00
JonatanRek
e76b3127f3 FallBack Start 2020-02-11 16:01:00 +01:00
JonatanRek
a0fdd324e2 Merge branch 'dev' of https://git.steelants.cz/JonatanRek/PHP_SMART_HOME_V3 into dev 2020-02-11 15:09:51 +01:00
JonatanRek
cb95a0f9b8 LNG 2020-02-11 15:09:15 +01:00
unknown
fc7689b5a6 add edit on owen server 2020-02-06 17:57:11 +01:00
xinatorus
21bcff9660 gitignore 2020-01-27 21:08:32 +01:00
JonatanRek
c499a83a0c User Gavatar Support 2020-01-21 11:24:50 +01:00
JonatanRek
84f130faf3 //TODO 2020-01-17 10:28:09 +01:00
JonatanRek
3479fb9c87 DEBUGMODE in FRONTEND 2020-01-17 10:27:51 +01:00
JonatanRek
f345419c39 //TODO 2020-01-17 08:13:34 +01:00
JonatanRek
2dd2b3c6f7 User Manager Class Tweaks 2020-01-17 08:12:50 +01:00
JonatanRek
db3ab9dd95 Person at home detection 2020-01-17 08:12:40 +01:00
JonatanRek
dd8743d33e Ftp ignor 2020-01-16 14:51:30 +01:00
JonatanRek
842cbde2d8 Todo File addet 2020-01-16 14:50:39 +01:00
JonatanRek
ad89a18093 Periodical sync from dev FTP 2020-01-16 14:33:11 +01:00
unknown
6f0fa2f81e Merge branch 'dev' of https://git.steelants.cz/JonatanRek/PHP_SMART_HOME_V3 into dev 2020-01-11 11:23:01 +01:00
unknown
8e9639c257 edit sonoff basic 2020-01-11 11:22:23 +01:00
ŠPANINGER Václav
1e5564a11a Door/Window Senzor
Gerber Files + Schemes
2020-01-02 12:09:34 +01:00
JonatanRek
e1a7b69fee Battery measurement Added 2020-01-01 00:56:37 +01:00
JonatanRek
65e218e47b Door Windows Senzor Code + Case Addet 2019-12-31 23:08:43 +01:00
JonatanRek
cda98cdf77 Door Senzor 3D printable Case 2019-12-31 23:05:44 +01:00
JonatanRek
48fcd1a7c9 Notifications Icons Added 2019-12-31 23:05:19 +01:00
unknown
2d7db196dd fix digital pin and not commited changes in esp os node v3 2019-12-19 23:15:44 +01:00
unknown
ded59cc24a fix led 2019-12-12 19:44:17 +01:00
unknown
b1dd8dc297 sonoff version 3 created 2019-12-09 21:00:19 +01:00
JonatanRek
eddccead63 Update index.html
Some Tweeks
2019-12-01 15:56:40 +01:00
JonatanRek
ff3c796484 WIFI COnfiguration Page #2 2019-12-01 14:22:08 +01:00
JonatanRek
8b6a12c811 Minimalistic WiFI configuration page 2019-12-01 14:20:06 +01:00
JonatanRek
55cc65eddb Blinking on Wifi Connecting 2019-12-01 14:19:34 +01:00
JonatanRek
3bca87a4b3 Minore FW Tweeks 2019-11-30 18:35:45 +01:00
JonatanRek
563999e92d Network Setting 2019-11-28 14:34:32 +01:00
JonatanRek
b2e4da37bf STRING TO CHAR 2019-11-28 13:13:43 +01:00
JonatanRek
65439922b1 More functions 2019-11-28 08:45:51 +01:00
JonatanRek
4229c44678 Merge FW 2019-11-28 08:34:50 +01:00
JonatanRek
3fc6e931ef Merge 2019-11-28 08:33:43 +01:00
JonatanRek
e0ee40cb0d Device network setting part 1 2019-11-27 19:48:59 +01:00
JonatanRek
0045d00abc Comments, Comments Everywhere 2019-11-27 19:48:41 +01:00
JonatanRek
2b1ae58d55 Some tweeks 2019-11-27 19:15:13 +01:00
JonatanRek
5418452da2 Merge branch 'dev' of https://git.steelants.cz/JonatanRek/PHP_SMART_HOME_V3 into dev 2019-11-27 19:13:15 +01:00
JonatanRek
d67bac14e9 Fixes 2019-11-27 19:12:25 +01:00
JonatanRek
3b72bf85fd Merge Local Fixes NTB2 2019-11-27 19:11:43 +01:00
JonatanRek
b620ea6c8f Merge branch 'dev' of https://git.steelants.cz/JonatanRek/PHP_SMART_HOME_V3 into dev 2019-11-27 19:11:19 +01:00
JonatanRek
aef242ceca Clean Up 2019-11-27 19:10:29 +01:00
JonatanRek
8975eb785b FW tweeks 2019-11-27 18:18:46 +01:00
JonatanRek
878186c2a2 FW Clean Up 2019-11-27 17:29:20 +01:00
JonatanRek
1e7f16d3b9 Firmware impruevement #2 2019-11-27 17:27:18 +01:00
JonatanRek
79864c23fd Firmware impruevement 2019-11-27 17:19:22 +01:00
JonatanRek
7337e3c7d9 Static ip generator :) 2019-11-27 17:05:49 +01:00
JonatanRek
9e6968bf6c FW v3 TWEEKS 2019-11-26 13:56:06 +01:00
JonatanRek
3e71be821c Little Tweeks on Light Value Handling 2019-11-26 13:32:45 +01:00
JonatanRek
a5a5baffc9 API Sleep Time Fix 2019-11-26 13:32:08 +01:00
JonatanRek
88152ebeae Room Management In Settings 2019-11-22 15:09:22 +01:00
JonatanRek
2fdc1b5bcc ADDITIONAL SETTING (STATIC IP + TYPE)
Minor Fixes of Device EDit
2019-11-22 15:08:24 +01:00
JonatanRek
b26ab5c032 Formát #2 2019-11-22 15:07:54 +01:00
JonatanRek
6dbd4885e2 Format 2019-11-22 15:04:28 +01:00
JonatanRek
7d2bc0c6d6 New Updated Node Code 2019-11-04 15:51:30 +01:00
216 changed files with 10304 additions and 4151 deletions

1
.docker Submodule

Submodule .docker added at 0ee345e496

View File

@@ -3,29 +3,16 @@
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
insert_final_newline = true
insert_final_newline = true
[*.md]
charset = utf-8
end_of_line = lf
indent_style = tab
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 80
[COMMIT_EDITMSG]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = tab
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 80
max_line_length = 80

View File

@@ -2,4 +2,5 @@
_FIRMWARE
_INSTALATION
_README_IMG
README.md
README.md
.todo

13
.gitignore vendored
View File

@@ -1,7 +1,20 @@
.ftpconfig
.ftpconfig2
*.log
config.php
_nemazat/index.html
_nemazat/css/main.css.map
_nemazat/css/main.css
_nemazat/css/font-awesome.min.css
.vscode/
.vscode/sftp.json
app/updater/*.bin
app/logs/*.log
backup/*.zip
vendor/

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule ".docker"]
path = .docker
url = https://github.com/GamerClassN7/Docker-Xamp-Server.git

View File

@@ -1,17 +1,22 @@
Options -Indexes
Options -MultiViews -Indexes
RewriteEngine On
RewriteBase /vasek/home/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !.css
RewriteCond %{REQUEST_FILENAME} !.js
RewriteRule (.*) index.php?url=$1 [QSA,L]
# require https
#RewriteCond %{HTTPS} off
#RewriteCond %{REQUEST_URI} !^/api/update
#RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_FILENAME} !api.php
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
#token to HTTP_AUTHORIZATION
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule . - [e=HTTP_AUTHORIZATION:%1]
AddType application/x-httpd-php .php .phtml
# serve all files from public subfolder
RewriteCond %{REQUEST_FILENAME} !.php
RewriteCond %{REQUEST_FILENAME} !.log
RewriteCond %{REQUEST_FILENAME} !.ttfnot
RewriteCond %{REQUEST_FILENAME} \.
RewriteRule (.*) ./public/$1 [L]
# serve all other request as query parameters
RewriteRule (.*) ./public/index.php?url=$1 [L,QSA]
AddType application/x-httpd-php .php .phtml

13
.todo Normal file
View File

@@ -0,0 +1,13 @@
//TODO: Automation last Run Time
//TODO: Check if every automation type Works
//TODO: Add Switch to Setting For debug mode
//TODO: hide menu item Debug When Debug mode is disabled
//TODO: Check if every setting works
//TODO: Add slector to automation execute all To execute only utomation whitch contain same day (as actual to speed up process)
//TODO: Check and fix time based automation
//TODO: 404 same like in ENergo COunter Project
//TODO: @FILIP Fix Editation of all Automations
//TODO: @FILIP test if registration work without an isuu even with notification
//TODO: Fix Default Room selection
//TODO: Fix User Delete button
//TODO: Fix new add email form

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2019 JonatanRek
Copyright (c) 2019 JonatanRek<gamerclassn7@gamil.com> :)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
SOFTWARE.

View File

@@ -1,6 +1,7 @@
<pre>
<?php
var_dump($_POST);
var_dump(file_exists("./app/updater/" . "3C71BF22FDCF" . ".bin"));
?>
</pre>

View File

@@ -135,3 +135,37 @@ Distributed under the MIT License. See `LICENSE` for more information.
Project Link: [https://github.com/GamerClassN7/Smart_Home/](https://github.com/GamerClassN7/Smart_Home/) <br> <br>
<sup><sub>Tags (ignore): ESP32 ESP12 ESP08 ESP01 ESP Smart Home Automation System PWA PHP HTML JS DHT11 DHT22
## Folder structure
```
- /app # app specific files
- /controllers
- UserController.php
- /library # helpers etc.
- /models
- /types
- Units.php
- UserModal.php
- /views
- /layouts
- default.phtml
- /templates
- /components
- /pages
- Bootstrap.php
- Db.php
- Routes.php
- /library # framework, 3rd libraries etc.
- /vendor
- Controller.php
- Db.php
- Router.php
- config
- config.php /
- public
- /css
- /images
- /js
- .htaccess
- index.php
```

View File

@@ -1,213 +0,0 @@
; CH341SER.INF
; Driver for CH341 (USB=>SERIAL chip) V3.4
; WDM&VXD for Windows 98/Me/2000/XP/Server2003/Vista/64bit Vista/Server2008/Win7/64bit Win7
; Copyright (C) W.ch 2001-2014
;
[Version]
Signature = "$Chicago$"
Class = Ports
ClassGuid = {4D36E978-E325-11CE-BFC1-08002BE10318}
Provider = %WinChipHead%
DriverVer = 08/08/2014, 3.4.2014.08
CatalogFile = CH341SER.CAT
[ControlFlags]
ExcludeFromSelect = USB\VID_1A86&PID_7523
ExcludeFromSelect = USB\VID_1A86&PID_5523
ExcludeFromSelect = USB\VID_4348&PID_5523
ExcludeFromSelect = USB\VID_4348&PID_5523&REV_0250
ExcludeFromSelect = USBSERPORT\SER5523
ExcludeFromSelect = CH341PORT\SER5523
[Manufacturer]
%WinChipHead% = WinChipHead,NT,NTamd64,NTia64
[WinChipHead]
%CH340SER.DeviceDesc% = CH341SER_Install, USB\VID_1A86&PID_7523
%CH341ASER.DeviceDesc% = CH341SER_Install, USB\VID_1A86&PID_5523
%CH341SER.DeviceDesc% = CH341SER_Install, USB\VID_4348&PID_5523
%CH340SER.DeviceDesc% = CH341SER_Install, USB\VID_4348&PID_5523&REV_0250
%CH341S98.DeviceDesc% = CH341S98_Install, USBSERPORT\SER5523
%CH341S98.DeviceDesc% = CH341S98_Install, CH341PORT\SER5523
[WinChipHead.NT]
%CH340SER.DeviceDesc% = CH341SER_Install.NT, USB\VID_1A86&PID_7523
%CH341ASER.DeviceDesc% = CH341SER_Install.NT, USB\VID_1A86&PID_5523
%CH341SER.DeviceDesc% = CH341SER_Install.NT, USB\VID_4348&PID_5523
%CH340SER.DeviceDesc% = CH341SER_Install.NT, USB\VID_4348&PID_5523&REV_0250
[WinChipHead.NTamd64]
%CH340SER.DeviceDesc% = CH341SER_Inst.NTamd64, USB\VID_1A86&PID_7523
%CH341ASER.DeviceDesc% = CH341SER_Inst.NTamd64, USB\VID_1A86&PID_5523
%CH341SER.DeviceDesc% = CH341SER_Inst.NTamd64, USB\VID_4348&PID_5523
%CH340SER.DeviceDesc% = CH341SER_Inst.NTamd64, USB\VID_4348&PID_5523&REV_0250
[WinChipHead.NTia64]
%CH340SER.DeviceDesc% = CH341SER_Inst.NTia64, USB\VID_1A86&PID_7523
%CH341ASER.DeviceDesc% = CH341SER_Inst.NTia64, USB\VID_1A86&PID_5523
%CH341SER.DeviceDesc% = CH341SER_Inst.NTia64, USB\VID_4348&PID_5523
%CH340SER.DeviceDesc% = CH341SER_Inst.NTia64, USB\VID_4348&PID_5523&REV_0250
[CH341SER_Install]
DelFiles = CH341S98.DelFiles.SYS
CopyFiles = CH341SER.CopyFiles.SYS, CH341SER.CopyFiles.DLL
AddReg = CH341SER.9X.AddReg, CH341SER.AddReg
[CH341SER_Install.NT]
CopyFiles = CH341SER.NT.CopyFiles.SYS, CH341SER.CopyFiles.DLL
AddReg = CH341SER.NT.AddReg, CH341SER.AddReg
[CH341SER_Install.NT.HW]
AddReg = CH341SER.NT.HW.AddReg
[CH341SER_Inst.NTamd64]
CopyFiles = CH341SER.NT.CopyFiles.SYSA64
AddReg = CH341SER.NT.AddReg, CH341SER.AddReg
[CH341SER_Inst.NTamd64.HW]
AddReg = CH341SER.NT.HW.AddReg
[CH341SER_Inst.NTia64]
CopyFiles = CH341SER.NT.CopyFiles.SYSI64
AddReg = CH341SER.NT.AddReg, CH341SER.AddReg
[CH341SER_Inst.NTia64.HW]
AddReg = CH341SER.NT.HW.AddReg
[CH341S98_Install]
DelFiles = CH341S98.DelFiles.SYS
CopyFiles = CH341S98.CopyFiles.VXD, CH341SER.CopyFiles.SYS
AddReg = CH341S98.9X.AddReg, CH341S98.AddReg
;[CH341S98_Install.NT]
[CH341S98.DelFiles.SYS]
CH341S98.SYS, , , 1
[CH341SER.CopyFiles.SYS]
CH341S98.SYS, , , 2
[CH341SER.NT.CopyFiles.SYS]
CH341SER.SYS, , , 2
[CH341SER.NT.CopyFiles.SYSA64]
CH341S64.SYS, , , 2
[CH341SER.NT.CopyFiles.SYSI64]
;CH341I64.SYS, , , 2
[CH341S98.CopyFiles.VXD]
CH341SER.VXD, , , 2
[CH341SER.CopyFiles.DLL]
CH341PT.DLL, , , 2
;<3B><>װDLL<4C>ǿ<EFBFBD>ѡ<EFBFBD><D1A1>,DLL<4C><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6>CH341<34>˿ںͼ<DABA><CDBC><EFBFBD>CH341<34>˿ڵIJ<DAB5><C4B2><EFBFBD><EFBFBD>¼<EFBFBD>
[CH341SER.9X.AddReg]
HKR, , DevLoader, , *NTKERN
HKR, , NTMPDriver, , CH341S98.SYS
[CH341SER.NT.AddReg]
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
[CH341SER.NT.HW.AddReg]
HKR,,"UpperFilters",0x00010000,"serenum"
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ٽ<EFBFBD><D9BD>ڴ<EFBFBD><DAB4>ڵļ<DAB5><C4BC><EFBFBD><E5BCB4><EFBFBD>豸,<2C><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DTR<54><52>RTS<54>ź<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫö<D2AA><C3B6>,<2C><EFBFBD><EBBDAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еķֺ<C4B7>ȥ<EFBFBD><C8A5>
[CH341S98.9X.AddReg]
HKR, , DevLoader, , *vcomm
HKR, , PortDriver, , CH341SER.VXD
HKR, , Contention, , *vcd
HKR, , ConfigDialog, , serialui.dll
HKR, , DCB, 3, 1C,00,00,00, 80,25,00,00, 11,00,00,00, 00,00,0A,00, 0A,00,08,00, 00,11,13,00, 00,00,00,00
HKR, , PortSubClass, 1, 01
HKR, , EnumPropPages, , "serialui.dll,EnumPropPages"
HKR, , Enumerator, , serenum.vxd
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ٽ<EFBFBD><D9BD>ڴ<EFBFBD><DAB4>ڵļ<DAB5><C4BC><EFBFBD><E5BCB4><EFBFBD>豸,<2C><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DTR<54><52>RTS<54>ź<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫö<D2AA><C3B6>,<2C><EFBFBD><EBBDAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еķֺ<C4B7>ȥ<EFBFBD><C8A5>
[CH341SER.AddReg]
HKLM, SOFTWARE\WinChipHead\IC\CH341SER, WDM, 0x00010001, 0x00000034
HKLM, SOFTWARE\WinChipHead\IC\CH341PORT, DLL, 0x00010001, 0x00000010
HKLM, SOFTWARE\WinChipHead\IC\CH341SER, Function, , "USB=>Serial"
;HKLM, SYSTEM\CurrentControlSet\Services\CH341SER, UserRemoval, 0x00010001, 0x00000001
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ȫɾ<C8AB><C9BE>USBתSERIALӲ<4C><D3B2><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ֹ<EFBFBD>ɾ<EFBFBD><C9BE>Ӳ<EFBFBD><D3B2>
[CH341S98.AddReg]
HKLM, SOFTWARE\WinChipHead\IC\CH341SER, VXD, 0x00010001, 0x00000023
[CH341SER_Install.NT.Services]
AddService = CH341SER, 2, CH341SER.Service
AddService = Serenum, , Serenum_Service_Inst
[CH341SER_Inst.NTamd64.Services]
AddService = CH341SER_A64, 2, CH341SER.ServiceA64
AddService = Serenum, , Serenum_Service_Inst
[CH341SER_Inst.NTia64.Services]
AddService = CH341SER_I64, 2, CH341SER.ServiceI64
AddService = Serenum, , Serenum_Service_Inst
[CH341SER.Service]
DisplayName = "CH341SER"
ServiceType = 1
StartType = 3
ErrorControl = 1
ServiceBinary = %10%\System32\Drivers\CH341SER.SYS
[CH341SER.ServiceA64]
DisplayName = "CH341SER_A64"
ServiceType = 1
StartType = 3
ErrorControl = 1
ServiceBinary = %10%\System32\Drivers\CH341S64.SYS
[CH341SER.ServiceI64]
DisplayName = "CH341SER_I64"
ServiceType = 1
StartType = 3
ErrorControl = 1
ServiceBinary = %10%\System32\Drivers\CH341I64.SYS
[Serenum_Service_Inst]
DisplayName = "SerEnum"
ServiceType = 1
StartType = 3
ErrorControl = 1
ServiceBinary = %12%\serenum.sys
LoadOrderGroup = PNP Filter
[DestinationDirs]
DefaultDestDir = 10, System32\Drivers
CH341S98.DelFiles.SYS = 11
CH341SER.CopyFiles.SYS = 10, System32\Drivers
CH341SER.NT.CopyFiles.SYS = 10, System32\Drivers
CH341S98.CopyFiles.VXD = 11
CH341SER.CopyFiles.DLL = 11
CH341SER.NT.CopyFiles.SYSA64 = 10, System32\Drivers
;CH341SER.NT.CopyFiles.SYSI64 = 10, System32\Drivers
[SourceDisksFiles]
CH341SER.SYS = 1
CH341S98.SYS = 1
CH341SER.VXD = 1
CH341PT.DLL = 1
CH341S64.SYS = 1
;CH341I64.SYS = 1
[SourceDisksNames]
1 = %DISK_NAME%, , ,
[SourceDisksNames.amd64]
1 = %DISK_NAME%, , ,
[SourceDisksNames.ia64]
1 = %DISK_NAME%, , ,
[Strings]
WinChipHead = "wch.cn"
CH341SER.DeviceDesc = "USB-SERIAL CH341"
CH341S98.DeviceDesc = "USB-SERIAL CH341"
CH340SER.DeviceDesc = "USB-SERIAL CH340"
CH341ASER.DeviceDesc = "USB-SERIAL CH341A"
DISK_NAME = "CH341 Serial Installation Disk"

Binary file not shown.

View File

@@ -1,346 +0,0 @@
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include "DHT.h"
String ssid = "";
String pasw = "";
String hwId = "";
String url = "";
//Pins
#define LIGHTPIN 13
#define DHTPIN 4
#define DHTTYPE DHT11
#define LED_BUILTIN 16
//Settings
bool deepSleepOn = true;
long sleepTime = 4; //in minutes
bool lightSensor = true;
bool humiditySensor = true;
bool temperatureSensor = true;
ESP8266WebServer server(80);
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.setDebugOutput(true);
EEPROM.begin(512);
Serial.println("");
}
void loop() {
restorSetting();
if (!checkConnection()) {
settingMode();
while (true){
Serial.println("CONECTION SETTING LOOP");
server.handleClient();
}
} else {
httpRequest();
sleep();
}
}
//webpages
void handleRoot() {
String s = "<!DOCTYPE html><html><head>";
s += "<meta name=\"viewport\" content=\"width=device-width,user-scalable=0\">";
s += "<title>";
s += "Main";
s += "</title>";
s += "</head>";
s += "<body>";
s += "<a href=\"/restart\"><p>Restartovat</p><a/>";
s += "<a href=\"/setting\"><p>Refrest WIFI Networks</p><a/>";
s += "</body>";
s += "</html>";
server.send(200, "text/html", s);
}
void handleSetting() {
String wifiList = "";
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0) {
Serial.println("no networks found");
} else {
for (int i = 0; i < n; ++i) {
//Serial.println("SSID: " + WiFi.SSID(i));
wifiList = wifiList + String("<option value=\"");
wifiList = wifiList + String(WiFi.SSID(i));
wifiList = wifiList + String("\">");
wifiList = wifiList + String(WiFi.SSID(i) + "(" + WiFi.RSSI() + ")");
wifiList = wifiList + String("</option>");
}
}
String s = "<!DOCTYPE html><html><head>";
s += "<meta name=\"viewport\" content=\"width=device-width,user-scalable=0\">";
s += "<title>";
s += "Main";
s += "</title>";
s += "</head>";
s += "<body>";
s += "<form method=\"get\" action=\"set\">";
s += "<br>SSID: <select name=\"ssid\">";
s += wifiList;
s += "</select>";
s += "<br>Password: <input name=\"pasw\" length=64 type=\"password\">";
s += "<br>Token: <input name=\"token\" length=64 type=\"text\">";
s += "<br>Api Url: <input name=\"url\" length=64 type=\"url\">";
s += "<input type=\"submit\">";
s += "</form>";
s += "</body>";
s += "</html>";
server.send(200, "text/html", s);
}
//functions
bool restorSetting() {
Serial.println("Reading EEPROM");
ssid = "";
pasw = "";
hwId = "";
url = "";
if (EEPROM.read(0) != 0) {
Serial.println("Reading EEPROM");
for (int i = 0; i < 64; ++i) {
ssid += char(EEPROM.read(i));
}
Serial.println("SSID: " + String(ssid));
for (int i = 64; i < 128; ++i) {
pasw += char(EEPROM.read(i));
}
Serial.println("PASS: " + String(pasw));
for (int i = 128; i < 192; ++i) {
hwId += char(EEPROM.read(i));
}
Serial.println("TOKEN: " + String(hwId));
for (int i = 192; i < 256; ++i) {
url += char(EEPROM.read(i));
}
Serial.println("URL: " + String(url));
return true;
} else {
return false;
}
}
String urlDecode(String input) {
String s = input;
s.replace("%20", " ");
s.replace("+", " ");
s.replace("%21", "!");
s.replace("%22", "\"");
s.replace("%23", "#");
s.replace("%24", "$");
s.replace("%25", "%");
s.replace("%26", "&");
s.replace("%27", "\'");
s.replace("%28", "(");
s.replace("%29", ")");
s.replace("%30", "*");
s.replace("%31", "+");
s.replace("%2C", ",");
s.replace("%2E", ".");
s.replace("%2F", "/");
s.replace("%2C", ",");
s.replace("%3A", ":");
s.replace("%3A", ";");
s.replace("%3C", "<");
s.replace("%3D", "=");
s.replace("%3E", ">");
s.replace("%3F", "?");
s.replace("%40", "@");
s.replace("%5B", "[");
s.replace("%5C", "\\");
s.replace("%5D", "]");
s.replace("%5E", "^");
s.replace("%5F", "-");
s.replace("%60", "`");
return s;
}
bool checkConnection() {
int count = 0;
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.forceSleepWake();
WiFi.begin(ssid, pasw);
Serial.print("Waiting for Wi-Fi connection");
while ( count < 30 ) {
if (WiFi.status() == WL_CONNECTED) {
Serial.println();
Serial.println("Connected!");
return (true);
}
delay(500);
Serial.print(".");
count++;
}
Serial.println("Timed out.");
return false;
}
void settingMode(){
WiFi.mode(WIFI_AP);
WiFi.softAP("NodeMeter");
IPAddress myIP = WiFi.softAPIP();
Serial.print("HotSpt IP:");
Serial.println(myIP);
server.on("/", handleRoot);
server.on("/restart", []() {
ESP.restart();
});
server.on("/setting", handleSetting);
server.on("/set", []() {
for (int i = 0; i < 96; ++i) {
EEPROM.write(i, 'e');
}
EEPROM.commit();
ssid = server.arg("ssid");
pasw = server.arg("pasw");
hwId = server.arg("token");
url = server.arg("url");
for (int i = 0; i < 256; ++i) {
EEPROM.write(i, 0);
}
Serial.println("Writing EEPROM...");
Serial.println("SSID:" + ssid);
for (int i = 0; i < ssid.length(); ++i) {
EEPROM.write(i,ssid[i]);
}
Serial.println("PASW:" + pasw);
for (int i = 0; i < pasw.length(); ++i) {
EEPROM.write(64 + i, pasw[i]);
}
Serial.println("TOKEN:" + hwId);
for (int i = 0; i < hwId.length(); ++i) {
EEPROM.write(128 + i, hwId[i]);
}
Serial.println("URL:" + url);
for (int i = 0; i < url.length(); ++i) {
EEPROM.write(192 + i, url[i]);
}
EEPROM.commit();
Serial.println("Write EEPROM done!");
String s = "<h1>Setup complete.</h1><p>device will be connected to \"";
s += ssid;
s += "\" after the restart.";
server.send(200, "text/html", s);
ESP.restart();
});
server.begin();
Serial.println("HTTP server started");
}
bool httpRequest(){
StaticJsonDocument<1024> sendContent;
sendContent["token"] = hwId;
if (temperatureSensor){
sendContent["values"]["temp"]["value"] = String(getTemperature());
sendContent["values"]["temp"]["unit"] = "C";
}
if (humiditySensor){
sendContent["values"]["humi"]["value"] = String(getHumidity());
sendContent["values"]["humi"]["unit"] = "%";
}
if (lightSensor){
sendContent["values"]["light"]["value"] = String(getLight());
sendContent["values"]["light"]["unit"] = "";
}
String requestJson = "";
serializeJson(sendContent, requestJson);
Serial.println("JSON: " + requestJson);
HTTPClient http;
http.begin(String(url));
http.addHeader("Content-Type", "application/json"); //Specify content-type header
int httpCode = http.POST(requestJson);
String payload = http.getString(); //Get the response payload
http.end();
DynamicJsonDocument doc(1024);
deserializeJson(doc, payload);
String hostname = doc["device"]["hostname"];
sleepTime = doc["device"]["sleepTime"];
WiFi.hostname(hostname);
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
http.end(); //Close connection
}
void sleep(){
Serial.println("DISCONECTED FROM WIFI");
WiFi.disconnect();
if (deepSleepOn) {
Serial.println("GOING TO SLEEP FOR " + String(sleepTime));
ESP.deepSleep((sleepTime * 60) * 1000000, RF_DEFAULT); // 20e6 is 20 microseconds
delay(1000);
} else {
delay(1000);
delay(sleepTime);
}
}
//ReadTemperatures
float getTemperature() {
float t = dht.readTemperature();
//Serial.print(dht.readTemperature());
//Serial.println(t);
if (isnan(t)) {
Serial.println( "Failed to read temperature from sensor!") ;
return 999;
}
return t;
}
float getHumidity() {
float h = dht.readHumidity();
//Serial.println(h);
if (isnan(h)) {
Serial.println("Failed to read humidity from sensor!");
return 999;
}
return h;
}
int getLight() {
int l = analogRead(LIGHTPIN);
if (l > 1000) {
return 1;
} else {
return 0;
}
Serial.println("Failed to read light from sensor!");
return 999;
}

View File

@@ -1,92 +0,0 @@
//Includes
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
//Variables
const char* ssid = "";
const char* pasw = "";
const char* server = "http://ESP:ESP@dev.steelants.cz/projekty/rest_vasek/api/out.php";
const char* hwId = "";
int lastState = 0;
//Constant
#define SONOFF 12
#define SONOFF_LED 13
#define SONOFF_BUT 0
void setup() {
Serial.begin(9600);
Serial.println("HW: " + String(hwId));
pinMode(SONOFF, OUTPUT);
pinMode(SONOFF_LED, OUTPUT);
pinMode(SONOFF_BUT, OUTPUT);
pinMode(SONOFF_BUT, INPUT);
// WI-FI CONECTING
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pasw);
}
void loop() {
if(WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, pasw);
while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect
digitalWrite(SONOFF_LED, LOW); // LOW will turn on the LED
delay(1000);
digitalWrite(SONOFF_LED, HIGH); // HIGH will turn off the LED
delay(1000);
}
Serial.println("\nCONECTED TO WIFI");
Serial.println("IP: " + String(WiFi.localIP()));
}
bool buttonState = digitalRead(SONOFF_BUT);
HTTPClient http;
http.begin(server);
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
String requestJson = "{";
requestJson += "\"tocken\":\"" + String(hwId) + "\"";
if (buttonState == true) {
requestJson += ",";
requestJson += "\"on/off\":{";
requestJson += "\"value\":\"" + String(~lastState) + "\",";
requestJson += "\"unit\":\"\"";
requestJson += "}";
}
while(buttonState == true) {
delay(50); // keeps a small delay
}
requestJson += "}";
Serial.println("JSON: " + requestJson);
int httpCode = http.POST(requestJson);
String payload = http.getString(); //Get the response payload
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
DynamicJsonDocument doc(1024);
deserializeJson(doc, payload);
string hostname = doc["hostname"];
WiFi.hostname(hostname);
int state = doc["state"];
if (state == 1 && lastState == 0) {
Serial.println("ON");
digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW
digitalWrite(SONOFF_LED, LOW); // Turn the LED on by making the voltage LOW
} else {
Serial.println("OFF");
digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW
digitalWrite(SONOFF_LED, HIGH); // Turn the LED on by making the voltage LOW
}
lastState = state;
delay(1000);
}

View File

@@ -1,94 +0,0 @@
//Includes
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
//Variables
const char* ssid = "";
const char* pasw = "";
const char* server = "http://ESP:ESP@dev.steelants.cz/projekty/rest_vasek/api/out.php";
const char* hwId = "";
int lastState = 0;
//Constant
#define SONOFF 12
#define SONOFF_LED 13
#define SONOFF_BUT 0
void setup() {
Serial.begin(9600);
Serial.println("HW: " + String(hwId));
pinMode(SONOFF, OUTPUT);
pinMode(SONOFF_LED, OUTPUT);
pinMode(SONOFF_BUT, OUTPUT);
pinMode(SONOFF_BUT, INPUT);
// WI-FI CONECTING
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pasw);
}
void loop() {
if(WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, pasw);
while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect
digitalWrite(SONOFF_LED, LOW); // LOW will turn on the LED
delay(1000);
digitalWrite(SONOFF_LED, HIGH); // HIGH will turn off the LED
delay(1000);
}
Serial.println("\nCONECTED TO WIFI");
Serial.println("IP: " + String(WiFi.localIP()));
}
bool buttonState = digitalRead(SONOFF_BUT);
HTTPClient http;
http.begin(server);
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
String requestJson = "{";
requestJson += "\"tocken\":\"" + String(hwId) + "\"";
if (buttonState == true) {
requestJson += ",";
requestJson += "\"on/off\":{";
requestJson += "\"value\":\"" + String(~lastState) + "\",";
requestJson += "\"unit\":\"\"";
requestJson += "}";
}
while(buttonState == true) {
delay(50); // keeps a small delay
}
requestJson += "}";
Serial.println("JSON: " + requestJson);
int httpCode = http.POST(requestJson);
String payload = http.getString(); //Get the response payload
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
DynamicJsonDocument doc(1024);
deserializeJson(doc, payload);
string hostname = doc["device"]["hostname"];
sleepTime = doc["device"]["sleepTime"];
WiFi.hostname(hostname);
int state = doc["state"];
if (state == 1 && lastState == 0) {
Serial.println("ON");
digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW
digitalWrite(SONOFF_LED, LOW); // Turn the LED on by making the voltage LOW
} else {
Serial.println("OFF");
digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW
digitalWrite(SONOFF_LED, HIGH); // Turn the LED on by making the voltage LOW
}
lastState = state;
delay(1000);
}

View File

@@ -1,94 +0,0 @@
//Includes
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
//Variables
const char* ssid = " ";
const char* pasw = "";
const char* server = "http://dev.steelants.cz/vasek/home/api.php";
const char* hwId = "";
int lastState = 0;
int reconectAtemptsMax = 10; //time to wait before restart
//Constant
#define SONOFF 12
#define SONOFF_LED 13
#define SONOFF_BUT 0
void setup() {
Serial.begin(9600);
delay(10);
Serial.println('\n');
Serial.println("HW: " + String(hwId));
pinMode(SONOFF, OUTPUT);
pinMode(SONOFF_LED, OUTPUT);
pinMode(SONOFF_BUT, INPUT);
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pasw);
Serial.print("Connecting to ");
Serial.print(ssid); Serial.println(" ...");
int i = 0;
while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect
delay(1000);
Serial.print(++i); Serial.print(' ');
}
Serial.println('\n');
Serial.println("Connection established!");
Serial.print("IP address:\t");
Serial.println(WiFi.localIP());
}
void loop() {
StaticJsonDocument<200> jsonContent;
jsonContent["token"] = hwId;
if (!digitalRead(SONOFF_BUT)){
jsonContent["values"]["on/off"]["value"] = (int) !lastState;
if (!lastState == 1) {
digitalWrite(SONOFF, HIGH)
} else if (!lastState == 0){
digitalWrite(SONOFF, LOW)
}
while(!digitalRead(SONOFF_BUT)) {
delay(100);
}
}
String requestJson = "";
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
HTTPClient http;
http.begin(server);
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
int httpCode = http.POST(requestJson);
String payload = http.getString(); //Get the response payload
http.end();
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
deserializeJson(jsonContent, payload);
String hostname = jsonContent["device"]["hostname"];
int state = jsonContent["value"];
WiFi.hostname(hostname);
if (state != lastState){
if (state == 1 && lastState == 0) {
Serial.println("ON");
digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW
} else {
Serial.println("OFF");
digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW
}
}
lastState = state;
}

Binary file not shown.

View File

@@ -1,298 +0,0 @@
-- phpMyAdmin SQL Dump
-- version 4.6.6deb4
-- https://www.phpmyadmin.net/
--
-- Počítač: localhost:3306
-- Vytvořeno: Úte 08. říj 2019, 18:05
-- Verze serveru: 10.1.41-MariaDB-0+deb9u1
-- Verze PHP: 7.0.33-0+deb9u5
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Databáze: `smart-home`
--
-- --------------------------------------------------------
--
-- Struktura tabulky `automation`
--
CREATE TABLE `automation` (
`automation_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`on_days` varchar(255) NOT NULL,
`if_something` varchar(255) NOT NULL,
`do_something` varchar(255) NOT NULL,
`executed` tinyint(4) NOT NULL,
`active` tinyint(4) NOT NULL DEFAULT '1',
`locked` tinyint(4) DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabulky `dashboard`
--
CREATE TABLE `dashboard` (
`dashboard_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`subdevice_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabulky `devices`
--
CREATE TABLE `devices` (
`device_id` int(11) NOT NULL,
`room_id` int(11) DEFAULT NULL,
`name` varchar(255) NOT NULL,
`token` varchar(255) NOT NULL,
`sleep_time` int(13) NOT NULL,
`owner` int(13) NOT NULL,
`permission` varchar(255) NOT NULL,
`approved` int(11) NOT NULL,
`icon` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabulky `notifications`
--
CREATE TABLE `notifications` (
`id` int(13) NOT NULL,
`user_id` varchar(255) NOT NULL,
`token` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabulky `records`
--
CREATE TABLE `records` (
`record_id` int(11) NOT NULL,
`subdevice_id` int(11) NOT NULL,
`value` smallint(6) NOT NULL,
`time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`execuded` tinyint(4) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabulky `rooms`
--
CREATE TABLE `rooms` (
`room_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabulky `scenes`
--
CREATE TABLE `scenes` (
`scene_id` int(11) NOT NULL,
`icon` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`do_something` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabulky `subdevices`
--
CREATE TABLE `subdevices` (
`subdevice_id` int(11) NOT NULL,
`device_id` int(11) NOT NULL,
`type` varchar(255) NOT NULL,
`unit` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabulky `users`
--
CREATE TABLE `users` (
`user_id` int(11) NOT NULL,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`startPage` int(11) NOT NULL,
`at_home` varchar(255) NOT NULL DEFAULT 'false'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Vypisuji data pro tabulku `users`
--
INSERT INTO `users` (`user_id`, `username`, `password`, `startPage`) VALUES
(2, 'Admin', '08abb3ff83dfae60fb4591125fc49dc80cf7ef28224c2d5df86e2d0d037c553bc7f30e859348fd745c9c07a4edde4863e866a7d45356cf08a22e5e1eafa13406', 1);
--
-- Klíče pro exportované tabulky
--
--
-- Klíče pro tabulku `automation`
--
ALTER TABLE `automation`
ADD PRIMARY KEY (`automation_id`);
--
-- Klíče pro tabulku `dashboard`
--
ALTER TABLE `dashboard`
ADD PRIMARY KEY (`dashboard_id`),
ADD KEY `user_id` (`user_id`),
ADD KEY `subdevice_id` (`subdevice_id`);
--
-- Klíče pro tabulku `devices`
--
ALTER TABLE `devices`
ADD PRIMARY KEY (`device_id`),
ADD KEY `room_id` (`room_id`);
--
-- Klíče pro tabulku `notifications`
--
ALTER TABLE `notifications`
ADD PRIMARY KEY (`id`);
--
-- Klíče pro tabulku `records`
--
ALTER TABLE `records`
ADD PRIMARY KEY (`record_id`),
ADD KEY `device_id` (`subdevice_id`);
--
-- Klíče pro tabulku `rooms`
--
ALTER TABLE `rooms`
ADD PRIMARY KEY (`room_id`);
--
-- Klíče pro tabulku `scenes`
--
ALTER TABLE `scenes`
ADD PRIMARY KEY (`scene_id`);
--
-- Klíče pro tabulku `subdevices`
--
ALTER TABLE `subdevices`
ADD PRIMARY KEY (`subdevice_id`),
ADD KEY `device_id` (`device_id`);
--
-- Klíče pro tabulku `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`user_id`);
--
-- AUTO_INCREMENT pro tabulky
--
--
-- AUTO_INCREMENT pro tabulku `automation`
--
ALTER TABLE `automation`
MODIFY `automation_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=58;
--
-- AUTO_INCREMENT pro tabulku `dashboard`
--
ALTER TABLE `dashboard`
MODIFY `dashboard_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=24;
--
-- AUTO_INCREMENT pro tabulku `devices`
--
ALTER TABLE `devices`
MODIFY `device_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=16;
--
-- AUTO_INCREMENT pro tabulku `notifications`
--
ALTER TABLE `notifications`
MODIFY `id` int(13) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=17;
--
-- AUTO_INCREMENT pro tabulku `records`
--
ALTER TABLE `records`
MODIFY `record_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=352338;
--
-- AUTO_INCREMENT pro tabulku `rooms`
--
ALTER TABLE `rooms`
MODIFY `room_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=24;
--
-- AUTO_INCREMENT pro tabulku `scenes`
--
ALTER TABLE `scenes`
MODIFY `scene_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=20;
--
-- AUTO_INCREMENT pro tabulku `subdevices`
--
ALTER TABLE `subdevices`
MODIFY `subdevice_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=27;
--
-- AUTO_INCREMENT pro tabulku `users`
--
ALTER TABLE `users`
MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
--
-- Omezení pro exportované tabulky
--
--
-- Omezení pro tabulku `dashboard`
--
ALTER TABLE `dashboard`
ADD CONSTRAINT `dashboard_ibfk_2` FOREIGN KEY (`subdevice_id`) REFERENCES `subdevices` (`subdevice_id`) ON DELETE CASCADE ON UPDATE NO ACTION,
ADD CONSTRAINT `dashboard_ibfk_3` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE NO ACTION;
--
-- Omezení pro tabulku `devices`
--
ALTER TABLE `devices`
ADD CONSTRAINT `devices_ibfk_1` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`room_id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
--
-- Omezení pro tabulku `records`
--
ALTER TABLE `records`
ADD CONSTRAINT `records_ibfk_1` FOREIGN KEY (`subdevice_id`) REFERENCES `subdevices` (`subdevice_id`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Omezení pro tabulku `subdevices`
--
ALTER TABLE `subdevices`
ADD CONSTRAINT `subdevices_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES `devices` (`device_id`);
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

2044
adminer.php Normal file

File diff suppressed because one or more lines are too long

234
api.php
View File

@@ -1,234 +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();
//DB Conector
Db::connect (DBHOST, DBUSER, DBPASS, DBNAME);
//Read API data
$json = file_get_contents('php://input');
$obj = json_decode($json, true);
//zabespecit proti Ddosu
if (isset($obj['user']) && $obj['user'] != ''){
//user at home
$user = UserManager::getUser($obj['user']);
if (!empty($user)) {
$userId = $user['user_id'];
$atHome = $obj['atHome'];
UserManager::atHome($userId, $atHome);
$logManager->write("[Record] user " . $userId . "changet his home state to " . $atHome . RECORDTIMOUT , LogRecordType::WARNING);
echo 'Saved: ' . $atHome;
header("HTTP/1.1 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!",
));
header("HTTP/1.1 401 Unauthorized");
$logManager->write("[API] acces denied from " . $_SERVER['REMOTE_ADDR'], LogRecordType::WARNING);
exit();
}
}
//automationExecution
try {
AutomationManager::executeAll();
} 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;
if (isset($obj['values'])) {
$values = $obj['values'];
}
//Checks
if ($token == null || $token == "") {
echo json_encode(array(
'state' => 'unsuccess',
'errorMSG' => "Missing Value Token in JSON payload",
));
header("HTTP/1.1 401 Unauthorized");
die();
}
//Vstupní Checky
if (!DeviceManager::registeret($token)) {
$notificationData = [
'title' => 'Info',
'body' => 'New device Detected',
'icon' => '',
];
$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
$subscribers = $notificationMng::getSubscription();
foreach ($subscribers as $key => $subscriber) {
$logManager->write("[NOTIFICATION] SENDING TO" . $subscriber['id'] . " ");
$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
}
header("HTTP/1.1 401 Unauthorized");
echo json_encode(array(
'state' => 'unsuccess',
'errorMSG' => "Device not registeret",
));
$logManager->write("[API] Registering Device", LogRecordType::INFO);
exit();
}
if (!DeviceManager::approved($token)) {
header("HTTP/1.1 401 Unauthorized");
echo json_encode(array(
'state' => 'unsuccess',
'errorMSG' => "Unaproved Device",
));
exit();
}
// 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'],2));
$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' => '',
];
break;
case 'water':
$notificationData = [
'title' => 'Alert',
'body' => 'Wather leak detected by '.$device['name'],
'icon' => '',
];
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'] . " ");
$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
}
}
}
}
$hostname = strtolower($device['name']);
$hostname = str_replace(' ', '_', $hostname);
$jsonAnswer = [
'device' => [
'hostname' => $hostname,
],
'state' => 'succes',
];
$subDevicesTypeList = SubDeviceManager::getSubDeviceSTypeForMater($deviceId);
if (!in_array($subDevicesTypeList, ['on/off', 'door', 'water'])) {
$jsonAnswer['sleepTime'] = $device['sleep_time'];
}
echo json_encode($jsonAnswer);
header("HTTP/1.1 200 OK");
} else {
//Vypis
//TODO: doděla uložení výpisu jinými slovy zda li byl comman vykonán
$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']);
RecordManager::setExecuted($subDeviceLastReord['record_id']);
}
echo json_encode(array(
'device' => [
'hostname' => $device['name'],
'sleepTime' => $device['sleep_time'],
],
'state' => 'succes',
'value' => $subDeviceLastReordValue
));
header("HTTP/1.1 200 OK");
}
unset($logManager);
Db::disconect();
die();

119
app/Bootstrap.php Normal file
View 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');
//D B Conector
Db::connect (DBHOST, DBUSER, DBPASS, DBNAME);
Debugger::flag('routes');
// import routes
require_once '../app/Routes.php';
Debugger::flag('done');
// echo Debugger::showFlags(false);

65
app/Routes.php Normal file
View File

@@ -0,0 +1,65 @@
<?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->get('/device/{sortBy}/{sortType}', 'Device');
$router->any('/plugins', 'Plugins');
$router->any('/ajax', 'Ajax');
$router->any('/oauth', 'Oauth');
//Vue APP
$router->post('/api/login', 'AuthApi@login');
$router->post('/api/logout', 'AuthApi@logout');
$router->get('/api/rooms', 'RoomsApi@default');
$router->get('/api/rooms/{roomId}/update', 'RoomsApi@update');
$router->get('/api/devices', 'DevicesApi@default');
$router->get('/api/plugins', 'PluginsApi@default');
$router->get('/api/users', 'UsersApi@default');
$router->get('/api/server', 'ServerApi@default');
$router->get('/api/server/log', 'ServerApi@logStatus');
$router->post('/api/widgets/{widgetId}/run', 'WidgetApi@run');
$router->get('/api/widgets/{widgetId}/detail', 'WidgetApi@detail');
$router->get('/api/widgets/{widgetId}/detail/{period}', 'WidgetApi@detail');
//cron
$router->post('/cron/clean', 'CronApi@clean');
$router->post('/cron/fetch', 'CronApi@fetch');
//Google Home - API
$router->any('/api/HA/auth', 'Oauth');
$router->any('/api/HA', 'GoogleHomeApi@response');
//Endpoints API
$router->post('/api/endpoint/', 'EndpointsApi@default');
$router->any('/api/update/', 'UpdatesApi@default');
$router->any('/api/users/status', 'UsersApi@status');
// examples
$router->any('/api/example', 'ExampleApi@example');
$router->any('/example', 'ExampleController@index');
$router->any('/example/subpage', 'ExampleController@subpage');
//module routes
//$router->any('/plugins/spotify/callback', 'Spotify@callback');
$router->run($_SERVER['REQUEST_METHOD'], '/'.(isset($_GET['url']) ? $_GET['url'] : ''));

25
app/api/AuthApi.php Normal file
View File

@@ -0,0 +1,25 @@
<?php
class AuthApi extends ApiController {
public function login(){
$token = (new AuthManager)->getToken($this->input['username'],$this->input['password']);
if (!$token) {
throw new Exception("Auth failed", 401);
}
$this->response(['token' => $token]);
}
public function logout(){
$authenticationBearrer = $_SERVER['HTTP_AUTHORIZATION'];
if (!(new AuthManager)->deleteToken($authenticationBearrer)) {
throw new Exception("logout Failed", 401);
}
}
public function registration(){
}
public function restartPassword(){
}
}

58
app/api/CronApi.php Normal file
View File

@@ -0,0 +1,58 @@
<?php
class CronApi extends ApiController
{
public function clean()
{
//Log Cleaning
$logKeeper = new LogMaintainer();
$logKeeper->purge(LOGTIMOUT);
//Database Backup Cleanup
$backupWorker = new DatabaseBackup();
$backupWorker->purge(5);
$this->response(['Value' => 'OK']);
}
public function fetch()
{
//Run Plugins
$result = [];
$dir = $_SERVER['DOCUMENT_ROOT'] . BASEDIR . 'app/plugins/';
$pluginsFiles = array_diff(scandir($dir), ['..', '.']);
foreach ($pluginsFiles as $key => $pluginFile) {
if (strpos($pluginFile, "!") === false) {
$className = str_replace(".php", "", $pluginFile);
if (strpos($pluginFile, '_') === true) {
continue;
}
if (!class_exists($className)) {
continue;
}
$pluginMakeClass = new $className;
if (!method_exists($pluginMakeClass, 'make')) {
continue;
}
$result[$className] = $pluginMakeClass->make();
} else {
$className = str_replace("!", "", str_replace(".php", "", $pluginFile));
if (strpos($pluginFile, '_') === true) {
continue;
}
if (!class_exists($className)) {
continue;
}
$pluginMakeClass = new $className;
if (!method_exists($pluginMakeClass, 'disable')) {
continue;
}
$result[$className] = $pluginMakeClass->disable();
}
}
//Print Result
$this->response($result);
}
}

17
app/api/DevicesApi.php Normal file
View File

@@ -0,0 +1,17 @@
<?php
class DevicesApi extends ApiController{
public function default(){
$this->requireAuth();
$response = [];
// TODO: process the request
$this->response($response);
}
public function getDevicesByRoom($roomId){
}
}

193
app/api/EndpointsApi.php Normal file
View File

@@ -0,0 +1,193 @@
<?php
class EndpointsApi extends ApiController{
public function default(){
// $this->requireAuth();
$obj = $this->input;
//variables Definition
$command = "null";
//Log
$logManager = new LogManager('../logs/api/'. date("Y-m-d").'.log');
$logManager->setLevel(LOGLEVEL);
//Token Checks
if ($obj['token'] == null || !isset($obj['token'])) {
$this->response([
'state' => 'unsuccess',
'errorMSG' => "Missing Value Token in JSON payload",
], 401);
die();
}
//Vstupní Checky
if (!DeviceManager::registeret($obj['token'])) {
//Notification data setup
$notificationMng = new NotificationManager;
$notificationData = [
'title' => 'Info',
'body' => 'New device Detected Found',
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png',
];
//Subdevice Registration
$device = DeviceManager::create($obj['token'], $obj['token']);
foreach ($obj['values'] as $key => $value) {
if (!SubDeviceManager::getSubDeviceByMaster($device['device_id'], $key)) {
SubDeviceManager::create($device['device_id'], $key, UNITS[$key]);
}
}
//Notification for newly added Device
if ($notificationData != []) {
$subscribers = $notificationMng::getSubscription();
foreach ($subscribers as $key => $subscriber) {
$logManager->write("[NOTIFICATION] SENDING TO" . $subscriber['id'] . " ", LogRecordTypes::INFO);
$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
}
}
$logManager->write("[API] Registering Device", LogRecordTypes::INFO);
$this->response([
'state' => 'unsuccess',
'errorMSG' => "Device not registeret",
], 401);
}
if (!DeviceManager::approved($obj['token'])) {
$this->response([
'state' => 'unsuccess',
'errorMSG' => "Unaproved Device",
], 401);
}
$device = DeviceManager::getDeviceByToken($obj['token']);
//Diagnostic
if (isset($obj['settings'])){
$data = ['mac' => $obj['settings']["network"]["mac"], 'ip_address' => $obj['settings']["network"]["ip"]];
if (array_key_exists("firmware_hash", $obj['settings'])) {
$data['firmware_hash'] = $obj['settings']["firmware_hash"];
}
DeviceManager::editByToken($obj['token'], $data);
}
//Log Data Save
if (isset($obj['logs'])){
foreach ($obj['logs'] as $log) {
$deviceLogManager = new LogManager('../logs/devices/'. date("Y-m-d").'.log');
$deviceLogManager->setLevel(LOGLEVEL);
$deviceLogManager->write("[Device Log Msg] Device_ID " . $device['device_id'] . "->" . $log, LogRecordTypes::ERROR);
unset($deviceLogManager);
}
$this->response([
'state' => 'succes',
'command' => $command,
], 200);
die();
}
// Issuing command
if ($command == "null"){
$deviceCommand = $device["command"];
if ($deviceCommand != '' && $deviceCommand != null && $deviceCommand != "null")
{
$command = $deviceCommand;
$data = [
'command'=>'null'
];
DeviceManager::editByToken($obj['token'], $data);
$logManager->write("[API] Device_ID " . $device['device_id'] . " executing command " . $command, LogRecordTypes::INFO);
}
}
$jsonAnswer = [];
$subDeviceLastReordValue = [];
if (isset($obj['values'])) {
//ZAPIS
foreach ($obj['values'] as $key => $value) {
if (!SubDeviceManager::getSubDeviceByMaster($device['device_id'], $key)) {
SubDeviceManager::create($device['device_id'], $key, UNITS[$key]);
}
$subDeviceLastReordValue[$key] = $value['value'];
RecordManager::create($device['device_id'], $key, round($value['value'],3));
$logManager->write("[API] Device_ID " . $device['device_id'] . " writed value " . $key . ' ' . $value['value'], LogRecordTypes::INFO);
//notification
if ($key == 'door' || $key == 'water') {
$notificationMng = new NotificationManager;
$notificationData = [];
switch ($key) {
case 'door':
$notificationData = [
'title' => 'Info',
'body' => 'Someone just open up '.$device['name'],
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png',
];
break;
case 'water':
$notificationData = [
'title' => 'Alert',
'body' => 'Wather leak detected by '.$device['name'],
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png',
];
break;
}
if (DEBUGMOD) $notificationData['body'] .= ' value='.$value['value'];
if ($notificationData != []) {
$subscribers = $notificationMng::getSubscription();
foreach ($subscribers as $key => $subscriber) {
$logManager->write("[NOTIFICATION] SENDING TO" . $subscriber['id'] . " ", LogRecordTypes::INFO);
$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
}
}
}
}
//upravit format na setings-> netvork etc
$subDevicesTypeList = SubDeviceManager::getSubDeviceSTypeForMater($device['device_id']);
if (!in_array($subDevicesTypeList, ['on/off', 'door', 'water'])) {
$jsonAnswer['device']['sleepTime'] = $device['sleep_time'];
}
} else {
if (count(SubDeviceManager::getAllSubDevices($device['device_id'])) == 0) {
//SubDeviceManager::create($device['device_id'], 'on/off', UNITS[$key]);
//RecordManager::create($device['device_id'], 'on/off', 0);
}
$subDevicesData = SubDeviceManager::getAllSubDevices($device['device_id']);
foreach ($subDevicesData as $key => $subDeviceData) {
$subDeviceId = $subDeviceData['subdevice_id'];
$subDeviceLastReord = RecordManager::getLastRecord($subDeviceId);
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();
}
}

24
app/api/ExampleApi.php Normal file
View 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
View 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
View 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
View 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);
}
}

74
app/api/RoomsApi.php Normal file
View File

@@ -0,0 +1,74 @@
<?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]['time']);
$interval = $LastRecordTime->diff(new DateTime());
$lastSeen = ($interval->format('%h') * 60 + $interval->format('%i'));
if ($subDevicesData[$subDeviceKey][$key]['sleep_time'] == NULL || $subDevicesData[$subDeviceKey][$key]['sleep_time'] == 0 || $lastSeen < $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') : [];
$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
View 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
View File

@@ -0,0 +1,85 @@
<?php
class UpdatesApi {
private function sendFile($path) {
header($_SERVER["SERVER_PROTOCOL"] . ' 200 OK', true, 200);
header('Content-Type: application/octet-stream', true);
header('Content-Disposition: attachment; filename=' . basename($path));
header('Content-Length: ' . filesize($path), true);
header('x-MD5: ' . md5_file($path), true);
readfile($path);
}
private function validateHeader($headers){
if (
isset($_SERVER['HTTP_X_ESP8266_STA_MAC']) &&
isset($_SERVER['HTTP_X_ESP8266_SKETCH_MD5'])
) {
return true;
}
return false;
}
public function default(){
$logManager = new LogManager('../logs/ota/'. date("Y-m-d").'.log');
$logManager->setLevel(LOGLEVEL);
$logManager->write("[Updater] Client Connected", LogRecordTypes::INFO);
// if($this->validateHeader($_SERVER)){
// header($_SERVER["SERVER_PROTOCOL"]." 400 Bad Header");
// die();
// }
header('Content-type: text/plain; charset=utf8', true);
// //Filtrování IP adress
// if (DEBUGMOD != 1) {
// if (!in_array($_SERVER['REMOTE_ADDR'], HOMEIP)) {
// echo json_encode(array(
// 'state' => 'unsuccess',
// 'errorMSG' => "Using API from your IP insnt alowed!",
// ));
// header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized");
// $logManager->write("[Updater] acces denied from " . $_SERVER['REMOTE_ADDR'], LogRecordTypes::INFO);
// exit();
// }
// }
$macAddress = $_SERVER['HTTP_X_ESP8266_STA_MAC'];
$localBinary = "../updater/" . str_replace(':', '', $macAddress) . ".bin";
$logManager->write("[Updater] url: " . $localBinary, LogRecordTypes::INFO);
$logManager->write("[Updater] version: " . $_SERVER['HTTP_X_ESP8266_SKETCH_MD5'], LogRecordTypes::INFO);
if (file_exists($localBinary)) {
$logManager->write("[Updater] version PHP: " . md5_file($localBinary), LogRecordTypes::INFO);
if ($_SERVER['HTTP_X_ESP8266_SKETCH_MD5'] != md5_file($localBinary)) {
$this->sendFile($localBinary);
//get device data
$device = DeviceManager::getDeviceByMac($macAddress);
$deviceName = $device['name'];
$deviceId = $device['device_id'];
//logfile write
$logManager->write("[Device] device_ID " . $deviceId . " was just updated to new version", LogRecordTypes::INFO);
$logManager->write("[Device] version hash: " . md5_file($localBinary), LogRecordTypes::INFO);
//notification
$notificationMng = new NotificationManager;
$notificationData = [
'title' => 'Info',
'body' => $deviceName.' was just updated to new version',
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png',
];
if ($notificationData != []) {
$subscribers = $notificationMng->getSubscription();
foreach ($subscribers as $key => $subscriber) {
$logManager->write("[NOTIFICATION] SENDING TO " . $subscriber['id'] . " ", LogRecordTypes::INFO);
$answer = $notificationMng->sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
}
}
} else {
header($_SERVER["SERVER_PROTOCOL"].' 304 Not Modified', true, 304);
}
} else {
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
}
die();
}
}

37
app/api/UsersApi.php Normal file
View File

@@ -0,0 +1,37 @@
<?php
class UsersApi extends ApiController{
public function default(){
//$this->requireAuth();
$response = null;
$users = UserManager::getUsers(["user_id", "username", "at_home"]);
foreach ($users as $key => $user) {
$response[] = [
"userName" => $user['username'],
"homeStatus" => ($user['at_home'] == 'true') ? true : false,
"avatarUrl" => UserManager::getAvatarUrl($user['user_id']),
];
}
$this->response($response);
}
public function status(){
//$this->requireAuth();
$response = null;
$obj = $this->input;
$atHome = $obj['atHome'];
$user = UserManager::getUser($obj['user']);
$userAtHome = $user['at_home'];
$userId = $user['user_id'];
if (!empty($user)) {
if($userAtHome != $atHome){
UserManager::atHome($userId, $atHome);
}
}
$this->response(['value'=>'OK']);
}
}

137
app/api/WidgetApi.php Normal file
View File

@@ -0,0 +1,137 @@
<?php
class WidgetApi extends ApiController
{
public function run($subDeviceId)
{
//$this->requireAuth();
$response = null;
if (RecordManager::getLastRecord($subDeviceId)['execuded'] === 0) {
throw new Exception("Unreachable", 409);
}
$subDeviceData = SubDeviceManager::getSubDevice($subDeviceId);
if ($subDeviceData['type'] == 'on/off') {
$lastValue = RecordManager::getLastRecord($subDeviceData['subdevice_id'])['value'];
RecordManager::create($subDeviceData['device_id'], 'on/off', (int) !$lastValue);
$response = !$lastValue;
} else {
throw new Exception("Bad Request", 403);
}
$i = 0;
$timeout = 20;
while (RecordManager::getLastRecord($subDeviceId)['execuded'] == 0) {
if ($i == $timeout) {
throw new Exception("Timeout", 444);
}
$i++;
usleep(250000);
}
$this->response(['value' => $response]);
}
public function detail($subDeviceId, $period = "day")
{
//$this->requireAuth();
$groupBy = [
"year" => "month",
"month" => "day",
"day" => "hour",
"hout" => "minute",
];
$response = null;
$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[''];
}
}

View File

@@ -1,39 +0,0 @@
<?php
/**
*
*/
class LogRecordType{
const WARNING = 'warning';
const ERROR = 'error';
const INFO = 'info';
}
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";
$record = Utilities::stringInsert($record,"\n",65);
fwrite($this->logFile, $record);
}
function __destruct(){
if (isset($this->logFile)) {
fclose($this->logFile);
}
}
}

View File

@@ -1,26 +0,0 @@
<?php
class RoomManager{
public static $rooms;
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));
}
}
?>

View File

@@ -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
}
}

View File

@@ -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));
}
}

View File

@@ -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')) {
require_once('app/controls/' . $this->path . '.php');
}
require_once('app/templates/' . $this->path . '.phtml');
}
}

View File

@@ -1,142 +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
]
]
],
'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
}
}

View 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';
}
}

View File

@@ -0,0 +1,77 @@
<?php
if (isset($_POST) && !empty($_POST)){
if (isset($_POST['modalFinal']) && $_POST['action'] == "add") {
$doCode = json_encode($_POST['device'], JSON_PRETTY_PRINT);
$value = $_POST['atSelector'];
if ($_POST['atSelector'] == 'time'){
$value = $_POST['atSelectorValue'];
} else if ($_POST['atSelector'] == 'atDeviceValue') {
$value = json_decode($_POST['atSelectorValue']);
} else if ($_POST['atSelector'] == 'inHome' || $_POST['atSelector'] == 'outHome') {
$value = UserManager::getUserData('user_id');
}
$ifCode = json_encode([
"type" => $_POST['atSelector'],
"value" => $value,
], JSON_PRETTY_PRINT);
$onDays = $_POST['atDays'];
//Debug
// if (DEBUGMOD == 1) {
// echo '<pre>';
// echo $permissionsInJson;
// echo $deviceId;
// var_dump(json_decode ($permissionsInJson));
// echo '</pre>';
// echo '<a href="' . BASEDIR .'">CONTINUE</a>';
// die();
// }
AutomationManager::create($_POST['name'], $onDays, $doCode, $ifCode);
header('Location: ' . BASEURL . strtolower(basename(__FILE__, '.php')));
die();
} else if (isset($_POST['modalFinal']) && $_POST['action'] == "edit") {
$doCode = json_encode($_POST['device'], JSON_PRETTY_PRINT);
if (isset ($_POST['atDeviceValue'])) {
$subDeviceId = $_POST['atDeviceValue'];
$subDeviceValue = $_POST['atDeviceValueInt'];
$subDevice = SubDeviceManager::getSubDevice($subDeviceId);
$subDeviceMaster = SubDeviceManager::getSubDeviceMaster($subDeviceId,$subDevice['type']);
$device = [
'deviceID' => $subDeviceMaster['device_id'],
'type'=> $subDevice['type'],
'value'=> $subDeviceValue,
];
}
$value = $_POST['atSelector'];
if (isset($_POST['atTime'])){
$value = $_POST['atTime'];
} else if (isset($_POST['atDeviceValue'])) {
$value = $device;
} else if ($_POST['atSelector'] == 'inHome' || $_POST['atSelector'] == 'outHome') {
//TODO: opravit edit aby vkládal id původního uživatele
$value = UserManager::getUserData('user_id');
}
$value = (isset($_POST['atTime']) ? $_POST['atTime'] : (isset($_POST['atDeviceValue']) ? $device : $_POST['atSelector']));
$ifCode = json_encode([
"type" => $_POST['atSelector'],
"value" => $value,
], JSON_PRETTY_PRINT);
$onDays = ($_POST['day'] != '' ? json_encode($_POST['day']) : '');
AutomationManager::create($_POST['name'], $onDays, $doCode, $ifCode, (isset ($_POST['automation_id']) ? $_POST['automation_id'] : ""));
header('Location: ' . BASEURL . strtolower(basename(__FILE__, '.php')));
die();
}
}
?>

View File

@@ -0,0 +1,32 @@
<?php
if (!empty ($_POST)){
$deviceManager = new DeviceManager ();
if (!empty ($_FILES['deviceFirmware']) && !empty ($_FILES['deviceFirmware']['tmp_name']) && !empty ($_POST['deviceId'])) {
$file = $_FILES['deviceFirmware'];
$deviceMac = $deviceManager->getDeviceById ($_POST['deviceId'])['mac'];
$fileName = (!empty ($deviceMac) ? str_replace (":", "", $deviceMac) . ".bin" : "");
if ($fileName != "" && file_exists ("../updater/" . $fileName)) {
unlink("../updater/" . $fileName);
}
if ($fileName != "") {
copy ($file['tmp_name'], "../updater/" . $fileName);
}
}
if (isset ($_POST['deviceCommand']) && !empty ($_POST['deviceId'])) {
$deviceManager->edit ($_POST['deviceId'], array ('command' => $_POST['deviceCommand']));
} else if (!empty ($_POST['deviceCommand'])) {
$devices = $deviceManager->getAllDevices();
foreach ($devices as $key => $device) {
$deviceManager->edit ($device['device_id'], array ('command' => $_POST['deviceCommand']));
}
}
if (!empty ($_POST['deviceRoomId']) && !empty ($_POST['deviceId'])) {
$deviceManager->edit ($_POST['deviceId'], array ('room_id' => $_POST['deviceRoomId']));
}
if (!empty ($_POST['deviceName']) && !empty ($_POST['deviceId'])) {
$deviceManager->edit ($_POST['deviceId'], array ('name' => $_POST['deviceName']));
}
header('Location: ./device');
die();
}

View File

@@ -1,5 +1,5 @@
<?php
global $userManager;
$userManager = new UserManager();
if (
@@ -15,7 +15,7 @@ if (
$ota = $userManager->haveOtaEnabled($userName);
if ($ota == "") {
$landingPage = $userManager->login($userName, $userPassword, $rememberMe);
header('Location: ' . BASEDIR . $landingPage);
header('Location: ' . BASEURL . $landingPage);
die();
}
@@ -27,7 +27,6 @@ if (
isset($_POST['otaCode']) &&
$_POST['otaCode'] != ''
) {
$otaCode = $_POST['otaCode'];
$otaSecret = $_POST['otaSecret'];
@@ -40,7 +39,7 @@ if (
$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2); // 2 = 2*30sec clock tolerance
if ($checkResult) {
$landingPage = $userManager->login($userName, $userPassword, $rememberMe);
header('Location: ' . BASEDIR . $landingPage);
header('Location: ' . BASEURL . '/');
echo 'OK';
} else {
echo 'FAILED';

View File

@@ -0,0 +1,75 @@
<?php
$userManager = new UserManager();
if (
isset($_POST['username']) &&
$_POST['username'] != '' &&
isset($_POST['password']) &&
$_POST['password'] != ''
){
$ota = false;
$userName = $_POST['username'];
echo $_POST['username'];
$userPassword = $_POST['password'];
$state = $_POST["state"];
$clientId = $_POST["clientId"];
$ota = $userManager->haveOtaEnabled($userName);
if ($ota == "") {
$token = (new AuthManager)->getToken($userName,$userPassword, $clientId);
if (!$token) {
throw new Exception("Auth failed", 401);
}
$get = [
"access_token"=>$token,
"token_type"=>"Bearer",
"state"=>$state,
];
header('Location: ' . $_POST["redirectUrl"] . '#' . http_build_query($get));
die();
}
$_SESSION['USERNAME'] = $userName;
$_SESSION['PASSWORD'] = $userPassword;
$_SESSION['OTA'] = $ota;
$_SESSION['STATE'] = $state;
$_SESSION['REDIRECT'] = $_POST["redirectUrl"];
$_SESSION['CLIENT'] = $clientId;
} else if (
isset($_POST['otaCode']) &&
$_POST['otaCode'] != ''
) {
$otaCode = $_POST['otaCode'];
$otaSecret = $_POST['otaSecret'];
$userName = $_SESSION['USERNAME'];
$userPassword = $_SESSION['PASSWORD'];
$ota = $_SESSION['OTA'];
$oauthState = $_SESSION['STATE'];
$oauthRedirect = $_SESSION['REDIRECT'];
$oauthClientId = $_SESSION['CLIENT'];
$ga = new PHPGangsta_GoogleAuthenticator();
$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2); // 2 = 2*30sec clock tolerance
if ($checkResult) {
$token = (new AuthManager)->getToken($userName,$userPassword, $oauthClientId);
if (!$token) {
throw new Exception("Auth failed", 401);
}
$get = [
"access_token"=>$token,
"token_type"=>"Bearer",
"state"=>$oauthState,
];
header('Location: ' . $oauthRedirect . '#' . http_build_query($get));
echo 'OK';
} else {
echo 'FAILED';
}
die();
}

View 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'])
) {
//
}
}

View File

@@ -1,29 +1,34 @@
<?php
if (isset($_POST) && !empty($_POST)){
$userManager = new UserManager();
if (isset($_POST['submitPasswordChange']) && $_POST['submitPasswordChange'] != "") {
$oldPassword = $_POST['oldPassword'];
$newPassword = $_POST['newPassword1'];
$newPassword2 = $_POST['newPassword2'];
UserManager::changePassword($oldPassword, $newPassword, $newPassword2);
header('Location: ' . BASEDIR . 'logout');
$userManager->changePassword($oldPassword, $newPassword, $newPassword2);
header('Location: ' . BASEURL . 'logout');
die();
} else if (isset($_POST['submitCreateUser']) && $_POST['submitCreateUser'] != "") {
$userName = $_POST['userName'];
$password = $_POST['userPassword'];
UserManager::createUser($userName, $password);
header('Location: ' . BASEDIR . 'setting');
$email = $_POST['userEmail'];
$userManager->createUser($userName, $password, $email);
header('Location: ' . BASEURL . 'setting');
die();
} else if (isset($_POST['submitEnableOta']) && $_POST['submitEnableOta'] != "") {
echo $otaCode = $_POST['otaCode'];
echo $otaSecret = $_POST['otaSecret'];
$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);
$userManager->setOta($otaCode, $otaSecret);
}
header('Location: ' . BASEDIR . 'setting');
header('Location: ' . BASEURL . 'setting');
die();
} else if (isset ($_POST['userPermission']) && !empty ($_POST['userID'])) {
$userManager->setUserDataAdmin("permission", $_POST['userPermission'], $_POST['userID']);
header('Location: ' . BASEURL . 'setting');
die();
}
}

View File

@@ -1,56 +0,0 @@
<?php
if (isset($_POST) && !empty($_POST)){
if (isset($_POST['modalFinal']) && $_POST['action'] == "add") {
$doCode = json_encode($_POST['device'], JSON_PRETTY_PRINT);
$ifCode = json_encode([
"type" => $_POST['atSelector'],
"value" => $_POST['atSelectorValue'],
], JSON_PRETTY_PRINT);
$onDays = $_POST['atDays'];
//Debug
if (DEBUGMOD == 1) {
echo '<pre>';
echo $permissionsInJson;
echo $deviceId;
var_dump(json_decode ($permissionsInJson));
echo '</pre>';
echo '<a href="' . BASEDIR .'">CONTINUE</a>';
die();
}
AutomationManager::create($_POST['name'], $onDays, $doCode, $ifCode);
header('Location: ' . BASEDIR . strtolower(basename(__FILE__, '.php')));
die();
} else if (isset($_POST['modalFinal']) && $_POST['action'] == "edit") {
$doCode = json_encode($_POST['device'], JSON_PRETTY_PRINT);
if (isset ($_POST['atDeviceValue'])) {
$subDeviceId = $_POST['atDeviceValue'];
$subDeviceValue = $_POST['atDeviceValueInt'];
$subDevice = SubDeviceManager::getSubDevice($subDeviceId);
$subDeviceMaster = SubDeviceManager::getSubDeviceMaster($subDeviceId,$subDevice['type']);
$json = json_encode([
'deviceID' => $subDeviceMaster['device_id'],
'type'=> $subDevice['type'],
'value'=> $subDeviceValue,
]);
}
$_POST['atSelectorValue'] = (isset($_POST['atTime']) ? $_POST['atTime'] : (isset($_POST['atDeviceValue']) ? $json : $_POST['atSelector']));
$ifCode = json_encode([
"type" => $_POST['atSelector'],
"value" => $_POST['atSelectorValue'],
], JSON_PRETTY_PRINT);
$onDays = ($_POST['day'] != '' ? json_encode($_POST['day']) : '');
AutomationManager::create($_POST['name'], $onDays, $doCode, $ifCode, (isset ($_POST['automation_id']) ? $_POST['automation_id'] : ""));
header('Location: ' . BASEDIR . strtolower(basename(__FILE__, '.php')));
die();
}
}
?>

View File

@@ -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();
}
?>

View File

@@ -1,73 +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($_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();
}
?>

View File

@@ -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();
}
}

View File

@@ -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();
}
}

480
app/models/GoogleHome.php Normal file
View File

@@ -0,0 +1,480 @@
<?php
class GoogleHome {
static function sync($requestId){
$devices = [];
$roomsData = RoomManager::getAllRooms();
foreach ($roomsData as $roomKey => $roomData) {
$devicesData = DeviceManager::getAllDevicesInRoom($roomData['room_id']);
foreach ($devicesData as $deviceKey => $deviceData) {
$traids = [];
$attributes = [];
//Google Compatibile Action Type
$actionType = GoogleHomeDeviceTypes::getAction($deviceData['type']);
if ($actionType == "") continue;
$subDevicesData = SubDeviceManager::getAllSubDevices($deviceData['device_id']);
foreach ($subDevicesData as $subDeviceKey => $subDeviceData) {
$deviceTraid = GoogleHomeDeviceTypes::getTraid($subDeviceData['type']);
if ($deviceTraid != "") {
$traids[] = $deviceTraid;
}
$deviceAttributes = GoogleHomeDeviceTypes::getAttribute($subDeviceData['type']);
if ($deviceAttributes != "") {
$attributes += $deviceAttributes;
}
}
if ($traids < 0){
continue;
}
$tempDevice = [
'id' => (string) $deviceData['device_id'],
'type' => $actionType,
'traits' => $traids,
'attributes' => $attributes,
'name' => [
'name' => $deviceData['name'],
],
'willReportState' => false,
'roomHint' => $roomData['name']
];
if ($tempDevice['attributes'] == null) unset($tempDevice['attributes']);
//traids & Attributes
$devices[] = $tempDevice;
}
}
$response = [
'requestId' => $requestId,
'payload' => [
'agentUserId'=>'651351531531',
'devices' => array_values( $devices ),
],
];
$apiLogManager = new LogManager('../logs/google-home/'. date("Y-m-d").'.log');
$apiLogManager->setLevel(LOGLEVEL);
$apiLogManager->write("[API][$requestId] request response\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordTypes::INFO);
echo json_encode($response);
}
static function query($requestId, $payload){
$devices = [];
$num = 0;
foreach ($payload['devices'] as $deviceId) {
$subDevicesData = SubDeviceManager::getAllSubDevices($deviceId['id']);
$tempDevice[$deviceId['id']] = [
'online' => false,
'status' => 'OFFLINE',
];
foreach ($subDevicesData as $key => $subDeviceData) {
$lastRecord = RecordManager::getLastRecord($subDeviceData['subdevice_id']);
if ($lastRecord['execuded'] == 1){
$tempDevice[$deviceId['id']]['online'] = true;
$tempDevice[$deviceId['id']]['status'] = "SUCCESS";
} else {
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($deviceId['id'], 6) as $key => $value) {
if ($value['execuded'] == 1){
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed){
$tempDevice[$deviceId['id']]['online'] = true;
}
}
switch ($subDeviceData['type']) {
case 'temp_cont':
$tempDevice[$deviceId['id']]['thermostatMode'] = 'off';
if ($lastRecord['value'] != 0) {
$tempDevice[$deviceId['id']]['thermostatMode'] = 'heat';
}
$tempDevice[$deviceId['id']]['thermostatTemperatureAmbient'] = $lastRecord['value'];
$tempDevice[$deviceId['id']]['thermostatTemperatureSetpoint'] = $lastRecord['value'];
break;
case 'vol_cont':
$tempDevice[$deviceId['id']]['currentVolume'] = $lastRecord['value'];
break;
case 'media_apps':
$tempDevice[$deviceId['id']]['currentApplication'] = "kodi";
break;
case 'media_input':
$tempDevice[$deviceId['id']]['currentInput'] = "pc";
break;
case 'media_status':
$tempDevice[$deviceId['id']]['activityState'] = "ACTIVE";
$tempDevice[$deviceId['id']]['playbackState'] = "PLAYING";
break;
case 'on/off':
$tempDevice[$deviceId['id']]['on'] = ($lastRecord['value'] == 1 ? true : false);
break;
}
}
if ($lastRecord['execuded'] == 1){
$online = true;
$status = 'SUCCESS';
} else {
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($deviceId['id'], 6) as $key => $value) {
if ($value['execuded'] == 1){
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed){
$status = "PENDING";
$online = true;
}
}
$devices = $tempDevice;
/*if (count($devices)> 1){
$devices[] = $tempDevice;
}*/
}
$response = [
'requestId' => $requestId,
'payload' => [
'devices' => $devices,
],
];
$apiLogManager = new LogManager('../logs/google-home/'. date("Y-m-d").'.log');
$apiLogManager->write("[API][$requestId] request response\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordTypes::INFO);
$apiLogManager->setLevel(LOGLEVEL);
echo json_encode($response);
}
static function execute($requestId, $payload){
$commands = [];
foreach ($payload['commands'] as $key => $command) {
foreach ($command['devices'] as $key2 => $device) {
$executionCommand = $command['execution'][0];
if (isset($command['execution'][$key])) {
$executionCommand = $command['execution'][$key];
}
$deviceType = GoogleHomeDeviceTypes::getType($executionCommand['command']);
$subDeviceId = SubDeviceManager::getSubDeviceByMasterAndType($device['id'], $deviceType)['subdevice_id'];
switch ($executionCommand['command']) {
case 'action.devices.commands.OnOff':
$commands[] = self::executeSwitch($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.ThermostatTemperatureSetpoint':
$commands[] = self::executeTermostatValue($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.ThermostatSetMode':
$commands[] = self::executeTermostatMode($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.setVolume':
$commands[] = self::executeVolume($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.appSelect':
$commands[] = self::executeApp($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.SetInput':
$commands[] = self::executeInput($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.mediaNext':
$commands[] = self::executeMediaCont($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.mediaPrevious':
$commands[] = self::executeMediaCont($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.mediaPause':
$commands[] = self::executeMediaCont($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.mediaResume':
$commands[] = self::executeMediaCont($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.mediaStop':
$commands[] = self::executeMediaCont($subDeviceId, $executionCommand);
break;
}
}
}
$response = [
'requestId' => $requestId,
'payload' => [
'commands' => $commands,
],
];
$apiLogManager = new LogManager('../logs/google-home/'. date("Y-m-d").'.log');
$apiLogManager->setLevel(LOGLEVEL);
$apiLogManager->write("[API][EXECUTE][$requestId]\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordTypes::INFO);
echo json_encode($response);
}
static function executeSwitch($subDeviceId, $executionCommand){
$value = 0;
$status = 'OFFLINE';
$online = false;
if ($executionCommand['params']['on']) $value = 1;
RecordManager::createWithSubId($subDeviceId, $value);
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
if ($value['execuded'] == 1){
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed){
$status = "PENDING";
$online = true;
}
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'on' => $executionCommand['params']['on'],
'online' => $online,
],
];
return $commandTemp;
}
static function executeTermostatValue($subDeviceId, $executionCommand){
$value = 0;
$status = 'OFFLINE';
$online = false;
if (isset($executionCommand['params']['thermostatTemperatureSetpoint'])) {
$value = $executionCommand['params']['thermostatTemperatureSetpoint'];
}
RecordManager::createWithSubId($subDeviceId, $value);
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $lastValue) {
if ($lastValue['execuded'] == 1){
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed){
$status = "PENDING";
$online = true;;
}
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'thermostatMode' => 'heat',
'thermostatTemperatureSetpoint' => $value,
'thermostatTemperatureAmbient' => $value,
'online' => $online,
//ambient z dalšího zenzoru v roomu
],
];
return $commandTemp;
}
static function executeTermostatMode($subDeviceId, $executionCommand){
$mode = "off";
$value = 0;
$status = 'OFFLINE';
$online = false;
if (isset($executionCommand['params']['thermostatMode']) && $executionCommand['params']['thermostatMode'] != 'off') {
$mode = $executionCommand['params']['thermostatMode'];
$value = RecordManager::getLastRecordNotNull($subDeviceId)['value'];
}
RecordManager::createWithSubId($subDeviceId, $value);
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
if ($value['execuded'] == 1){
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed){
$status = "PENDING";
$online = true;
}
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'thermostatMode' => $mode,
'online' => $online,
],
];
return $commandTemp;
}
static function executeVolume($subDeviceId, $executionCommand){
//echo $executionCommand['params']['volumeLevel'];
$status = 'OFFLINE';
$online = false;
$currentVolume = RecordManager::getLastRecord($subDeviceId)['value'];
if (isset($executionCommand['params']['volumeLevel'])) {
RecordManager::createWithSubId($subDeviceId, $executionCommand['params']['volumeLevel']);
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
if ($value['execuded'] == 1){
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed){
$status = "PENDING";
$online = true;
$currentVolume = $executionCommand['params']['volumeLevel'];
}
}
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'currentVolume' => $currentVolume,
'online' => $online,
],
];
return $commandTemp;
}
static function executeApp($subDeviceId, $executionCommand){
//echo $executionCommand['params']['newApplication'];
$status = 'OFFLINE';
$online = false;
$currentApplication = RecordManager::getLastRecord($subDeviceId)['value'];
if (isset($executionCommand['params']['newApplication'])) {
RecordManager::createWithSubId($subDeviceId, $executionCommand['params']['newApplication']);
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
if ($value['execuded'] == 1){
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed){
$status = "PENDING";
$online = true;
$currentApplication = $executionCommand['params']['newApplication'];
}
}
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'currentApplication' => $currentApplication,
'online' => $online,
],
];
return $commandTemp;
}
static function executeInput($subDeviceId, $executionCommand){
//echo $executionCommand['params']['newInput'];
$status = 'OFFLINE';
$online = false;
$currentInput = RecordManager::getLastRecord($subDeviceId)['value'];
if (isset($executionCommand['params']['newInput'])) {
RecordManager::createWithSubId($subDeviceId, $executionCommand['params']['newInput']);
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
if ($value['execuded'] == 1){
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed){
$status = "PENDING";
$online = true;
$currentInput = $executionCommand['params']['newInput'];
}
}
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'currentInput' => $currentInput,
'online' => $online,
],
];
return $commandTemp;
}
static function executeMediaCont($subDeviceId, $executionCommand){
$status = 'SUCCESS';
$online = true;
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'online' => $online,
],
];
return $commandTemp;
}
}

View File

@@ -1,13 +1,13 @@
<?php
class Partial{
var $assignedValues = [];
var $partBuffer;
var $path;
var $debug;
private $assignedValues = [];
private $partBuffer;
private $path;
private $debug;
function __construct($path = "", $debug = false) {
$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;
} else {
echo '<pre>';
@@ -29,6 +29,6 @@ class Partial{
extract($this->assignedValues);
}
require('app/templates/part/' . $this->path . '.phtml');
require('../app/views/templates/part/' . $this->path . '.phtml');
}
}

206
app/models/Utilities.php Normal file
View File

@@ -0,0 +1,206 @@
<?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){
if ($a[$key] == $b[$key]) return 0;
return ($a[$key] < $b[$key]) ? -1 : 1;
});
} else{
uasort($data, function($a, $b) use ($key){
if ($a[$key] == $b[$key]) return 0;
return ($a[$key] > $b[$key]) ? -1 : 1;
});
}
return $data;
}
}

View File

@@ -0,0 +1,64 @@
<?php
class AuthManager {
public function getToken($username, $password, $userAgent = null){
if ($userAgent == null) {
$userAgent = $_SERVER['HTTP_USER_AGENT'];
}
$userManager = new UserManager();
if ($username != '' || $password != ''){
$userLogedIn = $userManager->loginNew($username, $password);
if ($userLogedIn != false){
// Create token header as a JSON string
$header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']);
// Create token payload as a JSON string
$payload = json_encode([
'user_id' => $userLogedIn,
'exp' => date('Y-m-d H:i:s',strtotime("+90 Days")),
'iat' => date('Y-m-d H:i:s',time()),
]);
// Encode Header to Base64Url String
$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));
// Encode Payload to Base64Url String
$base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload));
// Create Signature Hash
$signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, 'abC123!', true);
// Encode Signature to Base64Url String
$base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));
// Create JWT
$jwt = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
$token = [
'user_id' => $userLogedIn,
'user_agent' => $userAgent,
'token' => $jwt,
'expire' => date('Y-m-d H:i:s',strtotime("+90 Days")),
'issued' => date('Y-m-d H:i:s',time()),
];
if (Db::add ('tokens', $token)){
return $jwt;
}
}
}
return false;
}
public function deleteToken($token){
Db::command ('DELETE FROM tokens WHERE token=?', array ($token));
return true;
}
public function validateToken($token){
list($type, $hash) = explode(' ', $token);
$tokens = Db::loadAll('SELECT * FROM tokens WHERE token = ? AND expire >= CURRENT_TIMESTAMP AND blocked = 0;', array($hash));
if ($type == 'Bearer' && count($tokens) == 1) {
return true;
} else if (count($tokens) == 0) {
return false;
};
return false;
}
}

View File

@@ -3,23 +3,25 @@
class AutomationManager{
public static $automation;
public function remove($automationId) {
public static function remove($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));
$flipedValue = ($automation['active'] == 1 ? 0 : 1);
return Db::command ('UPDATE automation SET active = ? WHERE automation_id=?', array ($flipedValue,$automationId));
}
public function restart($automationId) {
public static function restart($automationId) {
return Db::command ('UPDATE automation SET executed = 0 WHERE automation_id=?', array ($automationId));
}
public function create ($name, $onDays, $doCode, $ifCode, $automationId = "") {
public static function create ($name, $onDays, $doCode, $ifCode, $automationId = "") {
$userId = UserManager::getUserData('user_id');
$scene = array (
'name' => $name,
'owner_id' => $userId,
'on_days' => $onDays,
'if_something' => $ifCode,
'do_something' => $doCode,
@@ -36,12 +38,12 @@ class AutomationManager{
}
}
public function getAll(){
public static function getAll(){
return Db::loadAll ("SELECT * FROM automation");
}
public function executeAll(){
public static function executeAll(){
global $logManager;
$automations = Db::loadAll ("SELECT * FROM automation");
@@ -77,9 +79,21 @@ class AutomationManager{
}
} else if ($onValue['type'] == 'outHome') {
//TODO: Add Ovner to automation
$userHomeStatus = UserManager::getUserData('at_home', $onValue['value']);
if ($userHomeStatus == 'false' && $automation['executed'] == 0) {
$run = true;
} else if ($userHomeStatus == 'true' && $automation['executed'] == 1) {
$restart = true;
}
} else if ($onValue['type'] == 'inHome') {
//TODO: Add Ovner to automation
$userHomeStatus = UserManager::getUserData('at_home', $onValue['value']);
if ($userHomeStatus == 'true' && $automation['executed'] == 0) {
$run = true;
} else if ($userHomeStatus == 'false' && $automation['executed'] == 1) {
$restart = true;
}
} else if ($onValue['type'] == 'noOneHome') {
$users = UserManager::getUsers();
$membersHome = 0;
@@ -106,6 +120,18 @@ class AutomationManager{
} else if ($membersHome > 0 && $automation['executed'] == 0){
$run = true;
}
} else if ($onValue['type'] == 'atDeviceValue') {
$subDeviceId = SubDeviceManager::getSubDeviceByMaster($onValue['value']['deviceID'], $onValue['value']['type'])["subdevice_id"];
$lastValue = RecordManager::getLastRecord($subDeviceId);
if ($lastValue['value'] == $onValue['value']['value'] && $automation['executed'] == 0) {
$run = true;
} else if ($lastValue['value'] != $onValue['value']['value'] && $automation['executed'] == 1){
$restart = true;
}
}
//finalization
@@ -120,18 +146,23 @@ class AutomationManager{
$subscribers = NotificationManager::getSubscription();
$i = 0;
foreach ($subscribers as $key => $subscriber) {
$logManager->write("[NOTIFICATION] SENDING NOTIFICATION TO" . $subscriber['id'] . " was executed" . $i);
$title = 'Automatization '.$automation['name']." was just executed";
$notification = new Notification(SERVERKEY);
$notification->to($subscriber['token']);
$notification->notification($title, '' , '', '');
$notification->send();
$notification = null;
$notificationMng = new NotificationManager;
$notificationData = [
'title' => 'Automatization',
'body' => 'Automatization '.$automation['name']." was just executed",
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png',
];
if ($notificationData != []) {
$subscribers = $notificationMng::getSubscription();
foreach ($subscribers as $key => $subscriber) {
$logManager->write("[NOTIFICATION/AUTOOMATION] SENDING TO" . $subscriber['id'] . " ");
$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
}
}
$logManager->write("[AUTOMATIONS] automation id ". $automation['automation_id'] . " was executed");
Db::edit('automation', array('executed' => 1), 'WHERE automation_id = ?', array($automation['automation_id']));
Db::edit('automation', array('executed' => 1, 'execution_time' => date("Y-m-d H:i:s")), 'WHERE automation_id = ?', array($automation['automation_id']));
} else if ($restart) {
$logManager->write("[AUTOMATIONS] automation id ". $automation['automation_id'] . " was restarted");
Db::edit('automation', array('executed' => 0), 'WHERE automation_id = ?', array($automation['automation_id']));

View 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;
}
}
?>

View File

@@ -3,19 +3,19 @@ class DashboardManager{
public static $devices;
function getAllDashboards ($userId) {
static function getAllDashboards ($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));
}
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));
}
function Add ($subDeviceId) {
static function Add ($subDeviceId) {
if (self::getSubDevice(UserManager::getUserData('user_id'), $subDeviceId) == null){
// to do: pokud existuje nepridej
@@ -34,7 +34,7 @@ class DashboardManager{
}
}
function Remove ($subDeviceId){
static function Remove ($subDeviceId){
$userId = UserManager::getUserData('user_id');
Db::command ('DELETE FROM dashboard WHERE subdevice_id=? AND user_id = ?', array ($subDeviceId, $userId));
}

View File

@@ -2,31 +2,49 @@
class DeviceManager{
public static $devices;
function getAllDevices () {
return Db::loadAll ("SELECT * FROM devices WHERE approved != ?", Array(2));
static function getAllDevices () {
return Db::loadAll ("SELECT * FROM devices
WHERE approved != ?", Array(2));
}
function getAllDevicesInRoom ($roomId = "") {
static function getAllDevicesInRoom ($roomId = "") {
return Db::loadAll ("SELECT * FROM devices WHERE room_id = ? AND approved != ?", Array($roomId, 2));
}
function getOtherDevices(){
static function getOtherDevices(){
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));
}
function getDeviceById($deviceId) {
static function getDeviceByMac($deviceMac) {
return Db::loadOne("SELECT * FROM devices WHERE mac = ?", array($deviceMac));
}
static function getDeviceById($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();
$device = array (
'name' => $name,
'token' => $token,
'room_id' => $defaultRoom,
);
if (!empty($type)) {
$device['type'] = $type;
}
try {
Db::add ('devices', $device);
return Db::loadOne("SELECT device_id FROM devices WHERE token = ?", array($token))['device_id'];
@@ -36,7 +54,7 @@ class DeviceManager{
}
}
public function edit ($deviceId, $values = []) {
public static function edit ($deviceId, $values = []) {
try {
Db::edit ('devices', $values, 'WHERE device_id = ?', array($deviceId));
} catch(PDOException $error) {
@@ -45,12 +63,21 @@ class DeviceManager{
}
}
public static function editByToken ($token, $values = []) {
try {
Db::edit ('devices', $values, 'WHERE token = ?', array($token));
} catch(PDOException $error) {
echo $error->getMessage();
die();
}
}
/**
* [assignRoom Přiřazení zařízení do třídy]
* @param [type] $roomId [číslo místnosti do kter se zařízení přiřadit]
* @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 (
'room_id' => $roomId,
);
@@ -66,15 +93,15 @@ class DeviceManager{
* [delete Smazání zařízení]
* @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));
}
public function registeret ($deviceToken) {
public static function registeret ($deviceToken) {
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);
}
}

View 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!");
}
}
}

View File

@@ -0,0 +1,44 @@
<?php
/**
*
*/
class FallbackManager
{
public $deviceDefinitions = "";
function __construct($deviceDefinition)
{
$this->deviceDefinitions = $deviceDefinition;
}
function check(){
//TODO: FIX IT
$allDevicesData = DeviceManager::getAllDevices();
foreach ($allDevicesData as $deviceKey => $deviceValue) {
$allSubDevicesData = SubDeviceManager::getAllSubDevices($deviceValue['device_id']);
foreach ($allSubDevicesData as $subDeviceKey => $subDeviceValue) {
if (!isset($this->deviceDefinitions[$subDeviceValue['type']]["fallBack"])) {
continue;
}
if (!isset($this->deviceDefinitions[$subDeviceValue['type']]["fallBackTime"])) {
continue;
}
$lastRecord = RecordManager::getLastRecord($subDeviceValue['subdevice_id']);
if ($lastRecord["value"] == $this->deviceDefinitions[$subDeviceValue['type']]["fallBack"]) {
continue;
}
$minutes = (time() - strtotime($lastRecord['time'])) / 60;
if ( $minutes > $this->deviceDefinitions[$subDeviceValue['type']]["fallBackTime"]){
RecordManager::create($deviceValue['device_id'], $subDeviceValue['type'], $this->deviceDefinitions[$subDeviceValue['type']]["fallBack"]);
}
}
}
}
}

View File

@@ -17,18 +17,19 @@ class LanguageManager
function load()
{
$file = './app/lang/en.php';
$file = '../lang/en.php';
if (!file_exists($file)){
echo 'ERROR: en.php not found';
die();
//TODO add lng EXEPTIONS
}
$arrayFirst = include($file);
$file = './app/lang/' . $this->lngCode . '.php';
$file = '../lang/' . $this->lngCode . '.php';
$arraySecond = [];
if (file_exists($file)){
$arraySecond = include($file);
}
$this->lngDatabase = array_merge($arrayFirst,$arraySecond);
$this->lngDatabase = array_merge($arrayFirst, $arraySecond);
return true;
}

View 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;
}
}

View File

@@ -0,0 +1,42 @@
<?php
/**
*
*/
class LogManager
{
private $logFile;
private $logLevel = 1;
public function __construct($fileName = "")
{
if ($fileName == ""){
$fileName = '../logs/'. date("Y-m-d").'.log';
}
if(!is_dir("../logs/"))
{
mkdir("../logs/");
}
$this->logFile = fopen($fileName, "a") or die("Unable to open file!");
}
public function setLevel($type = LogRecordTypess::WARNING){
$this->logLevel = $type['level'];
}
public function write($value, $type = LogRecordTypess::ERROR){
if ($type['level'] <= $this->logLevel) {
$record = "[".date("H:m:s")."][".$type['identifier']."]" . $value . "\n";
fwrite($this->logFile, $record);
}
}
public function __destruct(){
if (isset($this->logFile) && $this->logFile != "Unable to open file!") {
fclose($this->logFile);
}
}
}

View File

@@ -0,0 +1,18 @@
<?php
/**
*
*/
class NetvorkManager
{
function __construct()
{
// code...
}
function validateIp($ip = '0.0.0.0'){
if (!filter_var($ip, FILTER_VALIDATE_IP)){
return false;
}
}
}

View File

@@ -2,24 +2,27 @@
/**
* Notification Manager
*/
//TODO: Working timestamp to $title
class NotificationManager
{
function addSubscriber($userID = '', $token = ''){
$notificationSubscriber = $subDeviceId = Db::loadOne('SELECT id FROM notifications WHERE token = ?;', array($token));
if ($notificationSubscriber == ''){
$notification = array (
'user_id' => $userID,
'token' => $token,
);
Db::add ('notifications', $notification);
public static function addSubscriber($userID, $token){
if (!empty($userID) && !empty($token)) {
$notificationSubscriber = $subDeviceId = Db::loadOne('SELECT id FROM notifications WHERE token = ?;', array($token));
if ($notificationSubscriber == ''){
$notification = array (
'user_id' => $userID,
'token' => $token,
);
Db::add ('notifications', $notification);
}
}
}
function getSubscription(){
return Db::loadAll('SELECT * FROM notifications;', array());
public static function getSubscription () {
return Db::loadAll ("SELECT * FROM notifications");
}
function sendSimpleNotification(string $serverKey, string $to, array $data){
public static function sendSimpleNotification(string $serverKey, string $to, array $data, bool $timeStamp = false){
$dataTemplate = [
'title' => '',
'body' => '',
@@ -30,9 +33,13 @@ class NotificationManager
return;
}
if ($timeStamp) {
$data['title'] = $data['title'] . date();
}
$notification = new Notification($serverKey);
$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();
$notification = null;
@@ -64,8 +71,12 @@ class Notification
$this->jsonPayload["to"] = $to;
}
function notification($title = '', $body = '', $icon = '', $action = '')
function notification($title = '', $body = '', $icon = '', $action = '', bool $timeStamp = false)
{
if ($timeStamp) {
$data['title'] = $data['title'] . date();
}
$this->jsonPayload["data"]["notification"]["title"] = $title;
$this->jsonPayload["data"]["notification"]["body"] = $body;
$this->jsonPayload["data"]["notification"]["icon"] = $icon;

View File

@@ -2,16 +2,46 @@
class RecordManager{
public static $records;
public function create ($deviceId, $type, $value) {
public static function createWithSubId ($subDeviceId, $value) {
try {
$record = [
'execuded' => 1,
];
Db::edit ('records', $record, 'WHERE subdevice_id = ?', array ($subDeviceId));
$record = array (
'subdevice_id' => $subDeviceId,
'value' => $value,
);
return Db::add ('records', $record);
} catch(PDOException $error) {
echo $error->getMessage();
die();
}
}
public static function create ($deviceId, $type, $value) {
$subDeviceId = Db::loadOne('SELECT * FROM subdevices WHERE device_id = ? AND type = ?;', array($deviceId, $type))['subdevice_id'];
if ($subDeviceId == '') {
return false;
};
$record = array (
'subdevice_id' => $subDeviceId,
'value' => $value,
);
//Ochrana proti duplicitním hodnotám zapisují se jen změny
$lastRecord = self::getLastRecord($subDeviceId, 1);
if ($lastRecord['value'] == $value){
return false;
}
try {
$record = [
'execuded' => 1,
];
Db::edit ('records', $record, 'WHERE subdevice_id = ?', array ($subDeviceId));
$record = array (
'subdevice_id' => $subDeviceId,
'value' => $value,
);
return Db::add ('records', $record);
} catch(PDOException $error) {
echo $error->getMessage();
@@ -42,17 +72,22 @@ class RecordManager{
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) {
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") {
$periodLocal = '- 1 ' . strtoupper($period);
$periodLocal = '- 1' . strtoupper($period);
$dateTime = new DateTime();
$dateTime = $dateTime->modify($periodLocal);
$dateTime = $dateTime->format('Y-m-d');
$dateTime = $dateTime->format('Y-m-d H:i:s');
$groupBy = strtoupper($groupBy).'(time)';
$sql = 'SELECT value, time FROM records
$sql = 'SELECT value, time, execuded FROM records
WHERE
subdevice_id = ?
AND
@@ -60,18 +95,17 @@ class RecordManager{
AND
time > ?
GROUP BY '.$groupBy.'
ORDER BY time ASC';
ORDER BY time Desc';
//TODO: Prasárna Opravit
return Db::loadAll($sql, array($subDeviceId, $dateTime));
}
public static function clean ($day) {
if (isset($day)) {
Db::command ('DELETE FROM records WHERE time < ADDDATE(NOW(), INTERVAL -? DAY);', array($day));
Db::command ('DELETE FROM records WHERE `time` < ADDDATE(NOW(), INTERVAL -? DAY);', array($day));
}
}
//TODO: zkontrolovat jestli neco nezbilo po smazaní
public static function cleanSubdeviceRecords ($subDeviceId) {
Db::command ('DELETE FROM records WHERE subdevice_id = ?);', array($subDeviceId));

View File

@@ -0,0 +1,38 @@
<?php
class RoomManager{
public static $rooms;
static function getDefaultRoomId() {
$defaultRoom = Db::loadOne("SELECT `room_id` FROM `rooms` WHERE `default` = 1");
return $defaultRoom['room_id'];
}
static function getAllRooms () {
//TODO: ignore Widgets withoud data
$allRoom = Db::loadAll ("SELECT rooms.*, COUNT(devices.device_id) as device_count FROM rooms LEFT JOIN devices ON (devices.room_id=rooms.room_id) GROUP BY rooms.room_id");
return $allRoom;
}
static function getRoomsDefault () {
//TODO: ignore Widgets withoud data
$allRoom = Db::loadAll ("SELECT rooms.room_id, rooms.name, COUNT(devices.device_id) as device_count FROM rooms LEFT JOIN devices ON (devices.room_id=rooms.room_id) GROUP BY rooms.room_id;");
return $allRoom;
}
public static function create ($name) {
$room = array (
'name' => $name,
);
try {
Db::add ('rooms', $room);
} catch(PDOException $error) {
echo $error->getMessage();
die();
}
}
public static function delete ($roomId) {
Db::command ('DELETE FROM rooms WHERE room_id=?', array ($roomId));
}
}
?>

View File

@@ -2,7 +2,7 @@
class SceneManager{
public static $scenes;
public function create ($icon, $name, $doCode) {
public static function create ($icon, $name, $doCode) {
$scene = array (
'icon' => $icon,
'name' => $name,
@@ -16,15 +16,15 @@ class SceneManager{
}
}
public function getAllScenes () {
public static function getAllScenes () {
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));
}
public function execScene ($sceneId) {
public static function execScene ($sceneId) {
$sceneData = SceneManager::getScene($sceneId);
$sceneDoJson = $sceneData['do_something'];
$sceneDoArray = json_decode($sceneDoJson);
@@ -34,7 +34,7 @@ class SceneManager{
return true;
}
public function delete($sceneId){
public static function delete($sceneId){
Db::command ('DELETE FROM scenes WHERE scene_id=?', array ($sceneId));
}
}

View File

@@ -0,0 +1,45 @@
<?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 = '') {
$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();
}
}
}
}
?>

View File

@@ -0,0 +1,113 @@
<?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
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 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, sd.subdevice_id, sd.device_id, d.icon, d.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;
}
}

View File

@@ -1,9 +1,9 @@
<?php
class UserManager
{
public function getUsers () {
public static function getUsers ($filtr = ['*']) {
try {
$allUsers = Db::loadAll ("SELECT user_id, username, at_home, ota FROM users");
$allUsers = Db::loadAll ("SELECT " . implode(",", $filtr) . " FROM users");
return $allUsers;
} catch(PDOException $error) {
echo $error->getMessage();
@@ -11,7 +11,7 @@ class UserManager
}
}
public function getUser ($userName) {
public static function getUser ($userName) {
try {
$user = Db::loadOne ("SELECT * FROM users WHERE username = ?", [$userName]);
return $user;
@@ -21,38 +21,73 @@ class UserManager
}
}
public function login ($username, $password, $rememberMe) {
public static function getUserId ($userId) {
try {
if ($user = Db::loadOne ('SELECT * FROM users WHERE LOWER(username)=LOWER(?)', array ($username))) {
$user = Db::loadOne ("SELECT * FROM users WHERE user_id = ?", [$userId]);
return $user;
} catch(PDOException $error) {
echo $error->getMessage();
die();
}
}
public static function getAvatarUrl($userId = null){
if ($userId == null) {
$email = self::getUserData('email');
}
else if ($userId != null){
$email = self::getUserData('email',$userId);
}
return 'https://secure.gravatar.com/avatar/' . md5( strtolower( trim( $email ) ) );
}
public static function login ($username, $password, $rememberMe) {
try {
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 (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'];
$page = "";
if ($user["startPage"] == 1) {
$page = "dashboard";
}
unset($_POST['login']);
return $page;
return "";
} else {
throw new PDOException("Heslo není správné!");
}
} else {
throw new PDOException("Uživatel s tím to jménem neexistuje!");
}
} catch(PDOException $error) {
$_SESSION['msg'] = $error->getMessage();
unset($_POST);
header('Location: ' . BASEURL . 'login');
die();
}
}
public static function loginNew ($username, $password) {
try {
if ($user = Db::loadOne ('SELECT * FROM users WHERE LOWER(username)=LOWER(?) OR LOWER(email)=LOWER(?)', array ($username, $username))) {
if ($user['password'] == UserManager::getHashPassword($password)) {
return $user['user_id'];
} else {
return false;
}
} else {
return false;
}
} catch(PDOException $error) {
echo $error->getMessage();
die();
}
}
public function isLogin () {
public static function isLogin () {
if (isset ($_SESSION['user']) && isset($_SESSION['user']['id'])) {
return true;
} else {
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'];
return true;
}
@@ -61,16 +96,14 @@ class UserManager
return false;
}
public function logout () {
public static function logout () {
unset($_SESSION['user']);
unset($_COOKIE['rememberMe']);
setcookie("rememberMe", 'false', 0 - time(), BASEDIR, $_SERVER['HTTP_HOST']);
session_destroy();
if (isset($_COOKIE['rememberMe'])){
unset($_COOKIE['rememberMe']);
setcookie("rememberMe", 'false', time(), BASEDIR, $_SERVER['HTTP_HOST']);
}
}
public function setEncryptedCookie($value){
public static function setEncryptedCookie($value){
$first_key = base64_decode(FIRSTKEY);
$second_key = base64_decode(SECONDKEY);
@@ -83,7 +116,7 @@ class UserManager
return $newvalue;
}
public function getDecryptedCookie($value){
public static function getDecryptedCookie($value){
$first_key = base64_decode(FIRSTKEY);
$second_key = base64_decode(SECONDKEY);
@@ -102,28 +135,32 @@ class UserManager
}
public static function getUserData ($type, $userId = '') {
if (isset($_SESSION['user']['id'])) {
if ($userId == '') {
$userId = $_SESSION['user']['id'];
} else {
return "";
}
$user = Db::loadOne ('SELECT ' . $type . ' FROM users WHERE user_id=?', array ($userId));
return $user[$type];
}
public function setUserData ($type, $value) {
public static function setUserData ($type, $value) {
if (isset ($_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";
$hashPassword = hash('sha512', ($password . $salt));
return $hashPassword;
}
public function atHome($userId, $atHome){
public static function atHome($userId, $atHome){
try {
Db::edit ('users', ['at_home' => $atHome], 'WHERE user_id = ?', array($userId));
} catch(PDOException $error) {
@@ -132,7 +169,7 @@ class UserManager
}
}
public function changePassword($oldPassword, $newPassword, $newPassword2){
public static function changePassword($oldPassword, $newPassword, $newPassword2){
if ($newPassword == $newPassword2) {
//Password Criteria
$oldPasswordSaved = self::getUserData('password');
@@ -146,8 +183,9 @@ class UserManager
}
}
public function createUser($userName, $password){
$userId = Db::loadOne('SELECT * FROM users WHERE username = ?;', array($userName))['user_id'];
public static function createUser ($userName, $password, $email) {
$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) {
return false;
};
@@ -155,6 +193,7 @@ class UserManager
$user = [
'username' => $userName,
'password' => self::getHashPassword($password),
'email' => $email,
];
return Db::add ('users', $user);
} catch(PDOException $error) {
@@ -163,8 +202,8 @@ class UserManager
}
}
public function haveOtaEnabled($userName){
$ota = $this->getUser($userName)['ota'];
public static function haveOtaEnabled($userName){
$ota = self::getUser($userName)['ota'];
if ($ota != ''){
return ($ota != '' ? $ota : false);
@@ -172,5 +211,15 @@ class UserManager
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;
}
}
?>

View 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;
}
}

View File

@@ -0,0 +1,185 @@
<?php
class GoogleHomeDeviceTypes {
/*const AirConditioningUnit = 'action.devices.types.AC_UNIT';
const AirFreshener = 'action.devices.types.AIRFRESHENER';
const AirPurifier = 'action.devices.types.AIRPURIFIER';
const Awning = 'action.devices.types.AWNING';
const Bathtub = 'action.devices.types.BATHTUB';
const Bed = 'action.devices.types.BED';
const Blender = 'action.devices.types.BLENDER';
const Blinds = 'action.devices.types.BLINDS';
const Boiler = 'action.devices.types.BOILER';
const Camera = 'action.devices.types.CAMERA';
const CarbonMonoxideDetector = 'action.devices.types.CARBON_MONOXIDE_DETECTOR';
const Charger = 'action.devices.types.CHARGER';
const Closet = 'action.devices.types.CLOSET';
const CoffeeMaker = 'action.devices.types.COFFEE_MAKER';
const Cooktop = 'action.devices.types.COOKTOP';
const Curtain = 'action.devices.types.CURTAIN';
const Dehumidifier = 'action.devices.types.DEHUMIDIFIER';
const Dehydrator = 'action.devices.types.DEHYDRATOR';
const Dishwasher = 'action.devices.types.DISHWASHER';
const Door = 'action.devices.types.DOOR';
const Drawer = 'action.devices.types.DRAWER';
const Dryer = 'action.devices.types.DRYER';
const Fan = 'action.devices.types.FAN';
const Faucet = 'action.devices.types.FAUCET';
const Fireplace = 'action.devices.types.FIREPLACE';
const Fryer = 'action.devices.types.FRYER';
const GarageDoor = 'action.devices.types.GARAGE';
const Gate = 'action.devices.types.GATE';
const Grill = 'action.devices.types.GRILL';
const Heater = 'action.devices.types.HEATER';
const Hood = 'action.devices.types.HOOD';
const Humidifier = 'action.devices.types.HUMIDIFIER';
const Kettle = 'action.devices.types.KETTLE';
const Light = 'action.devices.types.LIGHT';
const Lock = 'action.devices.types.LOCK';
const MediaRemote = 'action.devices.types.REMOTECONTROL';
const Mop = 'action.devices.types.MOP';
const Mower = 'action.devices.types.MOWER';
const Microwave = 'action.devices.types.MICROWAVE';
const Multicooker = 'action.devices.types.MULTICOOKER';
const Network = 'action.devices.types.NETWORK';
const Oven = 'action.devices.types.OVEN';
const Pergola = 'action.devices.types.PERGOLA';
const PetFeeder = 'action.devices.types.PETFEEDER';
const PressureCooker = 'action.devices.types.PRESSURECOOKER';
const Radiator = 'action.devices.types.RADIATOR';
const Refrigerator = 'action.devices.types.REFRIGERATOR';
const Router = 'action.devices.types.ROUTER';
const Scene = 'action.devices.types.SCENE';
const Sensor = 'action.devices.types.SENSOR';
const SecuritySystem = 'action.devices.types.SECURITYSYSTEM';
const SettopBox = 'action.devices.types.SETTOP';
const Shutter = 'action.devices.types.SHUTTER';
const Shower = 'action.devices.types.SHOWER';
const SmokeDetector = 'action.devices.types.SMOKE_DETECTOR';
const SousVide = 'action.devices.types.SOUSVIDE';
const Sprinkler = 'action.devices.types.SPRINKLER';
const StandMixer = 'action.devices.types.STANDMIXER';
const Switch = 'action.devices.types.SWITCH';
const Television = 'action.devices.types.TV';
const Thermostat = 'action.devices.types.THERMOSTAT';
const Vacuum = 'action.devices.types.VACUUM';
const Valve = 'action.devices.types.VALVE';
const Washer = 'action.devices.types.WASHER';
const WaterHeater = 'action.devices.types.WATERHEATER';
const WaterPurifier = 'action.devices.types.WATERPURIFIER';
const WaterSoftener = 'action.devices.types.WATERSOFTENER';
const Window = 'action.devices.types.WINDOW';
const YogurtMaker = 'action.devices.types.YOGURTMAKER';*/
private static $actionWordBook = [
'control-light' => 'action.devices.types.LIGHT',
'control-socket' => 'action.devices.types.OUTLET',
'control-temp' => 'action.devices.types.THERMOSTAT',
'control-media' => 'action.devices.types.REMOTECONTROL',
];
private static $traidWordBook = [
'on/off' => 'action.devices.traits.OnOff',
'temp_cont' => 'action.devices.traits.TemperatureSetting',
'vol_cont' => 'action.devices.traits.Volume',
'media_cont' => 'action.devices.traits.TransportControl',
'media_status' => 'action.devices.traits.MediaState',
'media_apps' => 'action.devices.traits.AppSelector',
'media_input' => 'action.devices.traits.InputSelector',
];
private static $commandWordBook = [
'action.devices.commands.OnOff' => 'on/off',
'action.devices.commands.ThermostatTemperatureSetpoint' => 'temp_cont',
'action.devices.commands.ThermostatSetMode' => 'temp_cont',
'action.devices.commands.setVolume' => 'vol_cont',
'action.devices.commands.mediaNext' => 'media_status',
'action.devices.commands.mediaPause' => 'media_status',
'action.devices.commands.mediaPrevious' => 'media_status',
'action.devices.commands.mediaResume' => 'media_status',
'action.devices.commands.mediaStop' => 'media_status',
'action.devices.commands.appSelect' => 'media_apps',
'action.devices.commands.SetInput' => 'media_input',
];
private static $attributeWordBook = [
'on/off' => [
'commandOnlyOnOff' => false,
],
'temp_cont' => [
'availableThermostatModes' => 'off,heat',
'thermostatTemperatureUnit' => 'C',
],
'vol_cont' => [
'volumeCanMuteAndUnmute' => false,
'volumeDefaultPercentage' => 6,
'volumeMaxLevel' => 100,
'levelStepSize' => 2,
'commandOnlyVolume' => false,
],
'media_cont'=> [
'transportControlSupportedCommands' => [
"NEXT",
"PREVIOUS",
"PAUSE",
"STOP",
"RESUME",
"CAPTION_CONTROL"
],
],
'media_status'=> [
'supportActivityState' => true,
'supportPlaybackState' => true,
],
'media_apps' => [
"availableApplications" => [
[
"key" => "kodi",
"names" => [
"name_synonym" => [
"Kodi",
],
"lang" => "en",
],
],
],
],
'media_input' => [
"availableInputs" => [
[
"key" => "pc",
"names" => [
"name_synonym" => [
"PC",
],
"lang" => "en",
],
],
]
],
];
static function getAction($deviceType){
if (!isset(self::$actionWordBook[$deviceType])) return;
return self::$actionWordBook[$deviceType];
}
static function getTraid($subDeviceType){
if (!isset(self::$traidWordBook[$subDeviceType])) return;
return self::$traidWordBook[$subDeviceType];
}
static function getType($subDeviceCommand){
if (!isset(self::$commandWordBook[$subDeviceCommand])) return;
return self::$commandWordBook[$subDeviceCommand];
}
static function getAttribute($subDeviceType){
if (!isset(self::$attributeWordBook[$subDeviceType])) return;
return self::$attributeWordBook[$subDeviceType];
}
static function getQueryJson($deviceType, $type){
return self::$wordBook[$type];
}
}

View 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',
];
}

View 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'];
}
}

View File

@@ -0,0 +1,52 @@
<?php
class AirQuality extends VirtualDeviceManager
{
private $city_sluig = "prague";
private $app_id = "53ccbc353bb0bd0b05515169a593b96c38d57c48";
private $api_uri = 'http://api.waqi.info/feed/%s/?token=%s'; // Your redirect uri
private $virtual_device_name = "Air Quality";
private $subdevice_type = "air-quality";
function make()
{
try {
if (DeviceManager::registeret($this->virtual_device_name)) {
$deviceId = DeviceManager::getDeviceByToken($this->virtual_device_name)['device_id'];
if (!$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, $this->subdevice_type)) {
SubDeviceManager::create($deviceId, $this->subdevice_type, '');
sleep(1);
$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($this->subdevice_type));
}
//if (!$this->fetchEnabled($deviceId,$subDevice['subdevice_id'])) die();
$finalUrl = sprintf($this->api_uri, $this->city_sluig, $this->app_id);
$json = json_decode(Utilities::CallAPI('GET', $finalUrl, ''), true);
RecordManager::create($deviceId, $this->subdevice_type, $json['data']['aqi']);
} else {
DeviceManager::create($this->virtual_device_name, $this->virtual_device_name, 'senzore-virtual');
DeviceManager::approved($this->virtual_device_name);
}
return 'sucessful';
} catch(Exception $e) {
return 'exception: ' . $e->getMessage();
}
}
function translate($value){
if ($value < 50) {
return 'Good';
} else if ($value > 51 && $value < 100) {
return 'Moderate';
} else if ($value > 101 && $value < 150) {
return 'Normal';
} else if ($value > 151 && $value < 200) {
return 'Unhealthy';
} else if ($value > 201 && $value < 300) {
return 'Very Unhealthy';
} else if ($value > 301 ) {
return 'Hazardous';
}
return '';
}
}

View File

@@ -0,0 +1,52 @@
<?php
class AirQuality extends VirtualDeviceManager
{
private $city_sluig = "prague";
private $app_id = "53ccbc353bb0bd0b05515169a593b96c38d57c48";
private $api_uri = 'http://api.waqi.info/feed/%s/?token=%s'; // Your redirect uri
private $virtual_device_name = "Air Quality";
private $subdevice_type = "air-quality";
function make()
{
try {
if (DeviceManager::registeret($this->virtual_device_name)) {
$deviceId = DeviceManager::getDeviceByToken($this->virtual_device_name)['device_id'];
if (!$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, $this->subdevice_type)) {
SubDeviceManager::create($deviceId, $this->subdevice_type, '');
sleep(1);
$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($this->subdevice_type));
}
//if (!$this->fetchEnabled($deviceId,$subDevice['subdevice_id'])) die();
$finalUrl = sprintf($this->api_uri, $this->city_sluig, $this->app_id);
$json = json_decode(Utilities::CallAPI('GET', $finalUrl, ''), true);
RecordManager::create($deviceId, $this->subdevice_type, $json['data']['aqi']);
} else {
DeviceManager::create($this->virtual_device_name, $this->virtual_device_name, 'senzore-virtual');
DeviceManager::approved($this->virtual_device_name);
}
return 'sucessful';
} catch(Exception $e) {
return 'exception: ' . $e->getMessage();
}
}
function translate($value){
if ($value < 50) {
return 'Good';
} else if ($value > 51 && $value < 100) {
return 'Moderate';
} else if ($value > 101 && $value < 150) {
return 'Normal';
} else if ($value > 151 && $value < 200) {
return 'Unhealthy';
} else if ($value > 201 && $value < 300) {
return 'Very Unhealthy';
} else if ($value > 301 ) {
return 'Hazardous';
}
return '';
}
}

53
app/plugins/CovidV2.php Normal file
View File

@@ -0,0 +1,53 @@
<?php
class CovidV2 extends VirtualDeviceManager
{
private $api_uri = 'https://onemocneni-aktualne.mzcr.cz/api/v2/covid-19/nakazeni-vyleceni-umrti-testy.json'; // Your redirect uri
private $virtual_device_name = "Covid-V2";
private $name_index = [
"Active" => "kumulativni_pocet_nakazenych",
"Recovered" => "kumulativni_pocet_vylecenych",
"Tested" => "kumulativni_pocet_testu",
"Deaths" => "kumulativni_pocet_umrti",
];
public function make()
{
try {
if (DeviceManager::registeret($this->virtual_device_name)) {
$deviceId = DeviceManager::getDeviceByToken($this->virtual_device_name)['device_id'];
$dataItems = ['Tested', 'Deaths', 'Recovered', 'Active'];
foreach ($dataItems as $dataItem) {
if (!$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($dataItem))) {
SubDeviceManager::create($deviceId, strtolower($dataItem), $dataItem);
sleep(1);
$subDevice = SubDeviceManager::getSubDeviceByMaster($deviceId, strtolower($dataItem));
}
}
if (!$this->fetchEnabled($deviceId, $subDevice['subdevice_id'])) die();
$finalUrl = $this->api_uri;
$json = json_decode(Utilities::CallAPI('GET', $finalUrl, ''), true)['data'];
foreach ($dataItems as $dataItem) {
RecordManager::create($deviceId, strtolower($dataItem), end($json)[$this->name_index[$dataItem]]);
}
} else {
DeviceManager::create($this->virtual_device_name, $this->virtual_device_name, strtolower($this->virtual_device_name));
DeviceManager::approved($this->virtual_device_name);
}
return 'sucessful';
} catch (Exception $e) {
return 'exception: ' . $e->getMessage();
}
}
public function translate($value){
$outcome = $value / 1000;
if ($outcome < 1){
return $value;
}
return round($outcome) . 'K';
}
}

Some files were not shown because too many files have changed in this diff Show More