296 Commits
Author SHA1 Message Date
JonatanRek 2410441b88 Keep record of record origin 2021-02-02 12:47:41 +01:00
GamerClassN7 1f49391b36 Google Home api Fix 2021-01-24 19:56:53 +01:00
haitem c17e3090a8 repairt bug 2021-01-15 13:38:47 +01:00
JonatanRek dc77534bad Weather notifications 2021-01-07 18:02:01 +01:00
GamerClassN7 cb45cf9e22 Fixes 2021-01-06 19:23:12 +01:00
GamerClassN7 47a5f71d9b Tweeks 2021-01-05 21:35:12 +01:00
GamerClassN7 1642ece7f4 Subscribe 2021-01-05 20:27:53 +01:00
JonatanRek 696ff07987 Fixes 2021-01-05 13:24:52 +01:00
Haitem 1415c0cf2d Repair Historie sorting 2021-01-05 13:01:06 +01:00
Haitem d9952a59fb Merge branch 'remastering' of https://git.steelants.cz/SH/PHP_SMART_HOME_V3 into remastering 2021-01-05 12:19:41 +01:00
Haitem b5b2bb95a7 Fix sorting room, fix form sending after sorting and add column Historie 2021-01-05 12:19:30 +01:00
JonatanRek bad58f82e2 Few Fixes in Database backup Plugin 2021-01-05 10:37:32 +01:00
GamerClassN7 64b50ead9f Notifications 2021-01-04 17:08:56 +01:00
GamerClassN7 a3a87d39d2 Fixes 2021-01-04 16:51:34 +01:00
GamerClassN7 c4f36235ab Google Home Heater controll Fix 2020-12-25 15:59:13 +01:00
JonatanRek daa0e0a2c5 Settings Save Mechanism an few fixes 2020-12-23 15:57:12 +01:00
GamerClassN7 464f229a16 Add Open Weather Settings 2020-12-17 19:42:29 +01:00
GamerClassN7 fe72097d75 Show Plugin Settings 2020-12-17 19:41:59 +01:00
GamerClassN7 98efb779b1 comment 2020-12-17 19:17:05 +01:00
JonatanRek 30045b9f65 Merge pull request 'feature/bootstrap' (#2) from feature/bootstrap into remastering
Reviewed-on: #2
2020-12-15 21:22:52 +00:00
romano f21293bc01 Remove test code 2020-12-15 21:50:42 +01:00
romano bf79e9cee7 Introduced configurations and application object (test code) 2020-12-15 21:46:46 +01:00
romano cf30a1280d Really basic application object. 2020-12-15 21:10:42 +01:00
JonatanRek e11023d1c9 Merge pull request 'feature/composer' (#1) from feature/composer into remastering
Reviewed-on: #1
2020-12-15 16:10:30 +00:00
romano cfcfefefd8 Bootstrap installed 2020-12-15 16:59:08 +01:00
romano 09d78192b6 Use composer autoload.php instead of custom boostrap.php 2020-12-15 16:56:12 +01:00
romano 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
JonatanRek 42443c8b58 Fix 2020-12-09 12:42:26 +01:00
JonatanRek e95435a707 Better settings Manager 2020-12-09 12:36:57 +01:00
JonatanRek 74f6779c63 Fix 2020-12-09 12:28:31 +01:00
JonatanRek 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
haitem 20469c65db Repair bugs with global parameter 2020-09-14 16:24:59 +02:00
JonatanRek aafd5539c4 Merge local branch to remastering 2020-09-14 15:21:20 +02:00
JonatanRek 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
JonatanRek 32521d0ed3 Minor Changes 2020-09-07 12:52:30 +02:00
JonatanRek 6945d58eb6 Device Room Select 2020-09-07 11:33:24 +02:00
JonatanRek 50e161e1ce Icons Color and Icon CHanges 2020-09-07 11:18:17 +02:00
JonatanRek 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
JonatanRek 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
JonatanRek 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
JonatanRek 0efbda0583 Weather API Start 2020-08-25 15:12:25 +02:00
JonatanRek 7f42d49634 Logs to main menu 2020-08-03 15:06:43 +02:00
JonatanRek a6cb51f2f5 Trace log prewiew counter + his API 2020-07-30 16:31:25 +02:00
JonatanRek b174022f9a Tweeks of new Log System 2020-07-29 08:44:11 +02:00
JonatanRek d404afe501 Minore Tweeks and FIxes 2020-07-29 08:35:00 +02:00
JonatanRek ceca8fc057 Few Fixes 2020-07-28 15:51:40 +02:00
JonatanRek 7df378d794 Device Log to Server Log 2020-07-28 15:40:48 +02:00
JonatanRek 98c603494d Update of Config 2020-07-28 11:33:32 +02:00
JonatanRek 27c306cba7 Some Loggig changes 2020-07-28 11:29:36 +02:00
JonatanRek 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
JonatanRek 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
JonatanRek 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
JonatanRek 3d68df2658 Server Info basic layout 2020-07-23 17:58:46 +02:00
JonatanRek 880b01882a Log Server 2020-07-23 17:29:55 +02:00
JonatanRek 727ed03be7 Server Fixes 2020-07-23 15:16:44 +02:00
JonatanRek 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
JonatanRek fa10200bde Delete Unused Routes 2020-07-21 17:01:23 +02:00
haitem 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
haitem 3665d0afd9 Fix 2020-07-21 10:47:32 +02:00
JonatanRek 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
JonatanRek 4b20c5fd0d TODO 2020-07-21 10:46:57 +02:00
haitem 5ba86edb69 merge fix 2020-07-21 10:46:27 +02:00
haitem 67cc103db5 Add dir variable on delete path variable 2020-07-21 10:44:55 +02:00
JonatanRek 1a448663f0 Fixes Of Autoloader 2020-07-21 10:34:15 +02:00
JonatanRek 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
JonatanRek 8a6185e329 Clean Up 2020-07-20 13:08:17 +02:00
JonatanRek d013788249 Little Fixes 2020-07-20 12:54:07 +02:00
JonatanRek 14a33b83d0 Widget duplication Fix 2020-07-20 12:46:46 +02:00
JonatanRek 05bd0dbc64 sync 2020-07-20 11:07:32 +02:00
JonatanRek d1b4597720 Order 2020-07-15 19:15:36 +02:00
JonatanRek dbbf42bc0d Docker Appache adition 2020-07-15 15:10:42 +02:00
JonatanRek 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
236 changed files with 9958 additions and 38771 deletions
Submodule
+1
Submodule .docker added at 0ee345e496
+5 -18
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
+11 -1
View File
@@ -1,11 +1,21 @@
.ftpconfig
.ftpconfig2
*.log
*.bin
config.php
_nemazat/index.html
_nemazat/css/main.css.map
_nemazat/css/main.css
_nemazat/css/font-awesome.min.css
app/logs/*.log
.vscode/
.vscode/sftp.json
app/updater/*.bin
app/logs/*.log
backup/*.zip
vendor/
+3
View File
@@ -0,0 +1,3 @@
[submodule ".docker"]
path = .docker
url = https://github.com/GamerClassN7/Docker-Xamp-Server.git
+17 -13
View File
@@ -1,18 +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
RewriteCond %{REQUEST_FILENAME} !apiFront.php
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
#token to HTTP_AUTHORIZATION
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule . - [e=HTTP_AUTHORIZATION:%1]
# 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
+1 -1
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
+34
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
```
Binary file not shown.
Binary file not shown.
Binary file not shown.
-213
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
;安装DLL是可选的,DLL可以用于识别CH341端口和监视CH341端口的插拔事件
[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"
;上面这行用于枚举接在串口的即插即用设备,启动时将产生DTR和RTS信号,如果需要枚举,请将上面这行的分号去掉
[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
;上面这行用于枚举接在串口的即插即用设备,启动时将产生DTR和RTS信号,如果需要枚举,请将上面这行的分号去掉
[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
;上面这行用于在系统托盘中显示“安全删除USB转SERIAL硬件设备”,便于用户手工删除硬件
[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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,88 +0,0 @@
//Includes
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
//USER CONFIGURATION
const char* WIFI_SSID = "";
const char* WIFI_PASS = "";
const char* HW_TOKEN = "";
const char* SERVER_ADRESS = "";
StaticJsonDocument<250> jsonBuffer;
String requestJson = "";
ADC_MODE(ADC_VCC);
//Pins
#define SENZORPIN 12 //12
void setup() {
Serial.begin(9600);
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
checkConnection();
Serial.print("TEST");
jsonBuffer = {};
jsonBuffer["token"] = HW_TOKEN;
jsonBuffer["values"]["door"]["value"] = 0;
int batteryVoltage = (ESP.getVcc() + 600) / 1000;
jsonBuffer["values"]["battery"]["value"] = batteryVoltage;
serializeJson(jsonBuffer, requestJson);
sendHttpRequest(requestJson);
delay(500);
ESP.deepSleep(0);
}
void loop() {
}
void setStaticIp(String ipAddress, String subnet, String gateway){
//Set static ip
IPAddress staticIpAddress;
IPAddress subnetIpAddress;
IPAddress gatewayIpAddress;
if (
staticIpAddress.fromString(ipAddress) &&
subnetIpAddress.fromString(subnet) &&
gatewayIpAddress.fromString(gateway) &&
WiFi.localIP() != staticIpAddress
) {
WiFi.config(staticIpAddress, subnetIpAddress, gatewayIpAddress);
Serial.print("STATIC IP address:");
Serial.println(WiFi.localIP());
}
}
String sendHttpRequest (String requestJson) {
HTTPClient http;
http.setReuse(true);
http.begin(SERVER_ADRESS);
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();
if (httpCode == -1) {
ESP.restart();
}
return payload;
}
bool checkConnection() {
int count = 0;
while ( count < 30 ) {
delay(500);
if (WiFi.status() == WL_CONNECTED) {
return true;
}
count++;
}
return false;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

@@ -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;
}
@@ -1,153 +0,0 @@
//Includes
#include <DHT.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
//Variables
const char* ssid = "Smart-Home";
const char* pasw = "S1pjg3684dcCPTUQ";
const char* hwId = "45235sadad";
const char* url = "http://dev.steelants.cz/vasek/home/api.php";
int unsuccessfulRounds = 0;
//Pins
#define pinDHT 4
#define LIGHTPIN 13
//Inicializations
DHT DHTs(pinDHT, DHT11);
void setup() {
Serial.begin(9600);
while (!Serial) continue;
delay(10);
Serial.println('\n');
//Show start up Configuration
Serial.println("HW: " + String(hwId));
Serial.print("IP address:\t");
Serial.println(WiFi.localIP());
Serial.print("MAC address:\t");
Serial.println(WiFi.macAddress());
pinMode(LIGHTPIN, INPUT);
}
void loop() {
//Start Conection to wifi
WiFi.begin(ssid, pasw);
checkConnection();
//HTTP CLIENT
HTTPClient http;
http.begin(url); //Begun HTTP Request
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
DHTs.begin();
//JsonDocsDefinition
StaticJsonDocument<265> doc;
doc["token"] = hwId;
//Read and Handle DHT values
float tem = DHTs.readTemperature();
float hum = DHTs.readHumidity();
Serial.println("TEMP" + String(tem) + ";HUMI" + String(hum));
if (isnan(tem) || isnan(hum)) {
Serial.println("Unable to read DHT");
} else {
doc["values"]["temp"]["value"] = tem;
doc["values"]["temp"]["unit"] = "C";
doc["values"]["humi"]["value"] = hum;
doc["values"]["humi"]["unit"] = "%";
}
//Handle Photo Rezistor Values
doc["values"]["light"]["value"] = (String)!digitalRead(LIGHTPIN);
doc["values"]["light"]["unit"] = "";
/*More Senzores to come*/
String jsonPayload = "";
serializeJson(doc, jsonPayload);
Serial.print("JSON: ");
Serial.println(jsonPayload);
int httpCode = http.POST(jsonPayload); //Get Http response code
String httpPayload = http.getString(); //Get the response payload
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
Serial.println("HTTP BODY: " + String(httpPayload) + ""); //Print request response payload
DeserializationError error = deserializeJson(doc, httpPayload); //Get deserialization Error if exists
//configuration setup
int sleepTime = doc["device"]["sleepTime"];
String hostName = doc["device"]["hostname"];
String ipAddress = doc["device"]["ipAddress"];
String gateway = doc["device"]["gateway"];
String subnet = doc["device"]["subnet"];
String state = doc["state"];
if (state != "succes") {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + (String)unsuccessfulRounds + "FROM 5");
} else if (state == "succes") {
unsuccessfulRounds = 0;
}
//Set static ip
setStaticIp(ipAddress, gateway, subnet);
WiFi.hostname(hostName); //Set HostName
http.end(); //Close connection
WiFi.disconnect(); //Disconect from WIFI
Serial.println("DISCONECTED FROM WIFI");
if(unsuccessfulRounds == 5) { //after 5 unsucessful request restart ESP
Serial.println("RESTARTING ESP");
ESP.restart();
}
sleep(sleepTime);
}
//checking if connection is working
bool checkConnection() {
int count = 0;
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 setStaticIp(String IpAddress, String subnet, String gateway){
//Set static ip
IPAddress staticIpAddress;
IPAddress subnetIpAddress;
IPAddress gatewayIpAddress;
if (
staticIpAddress.fromString(IpAddress) &&
subnetIpAddress.fromString(subnet) &&
gatewayIpAddress.fromString(gateway) &&
WiFi.localIP() != staticIpAddress
) {
WiFi.config(staticIpAddress, subnetIpAddress, gatewayIpAddress);
Serial.print("STATIC IP address:\t");
Serial.println(WiFi.localIP());
}
}
void sleep(int sleepTime) {
if (sleepTime > 0) { //if deep sleepTime > 0 use deep sleep
Serial.println("GOING TO SLEEP FOR " + String(sleepTime));
ESP.deepSleep((sleepTime * 60) * 1000000, RF_DEFAULT);
} else {
delay(5000);
}
}
@@ -1,387 +0,0 @@
//Includes
#include <DHT.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiClientSecure.h>
#include <ESP8266HTTPClient.h>
#define ARDUINOJSON_DECODE_UNICODE 1
#include <ArduinoJson.h>
#include <EEPROM.h>
#include "ESP8266httpUpdate.h"
//Variables
const char* ssidServer = "";
const char* paswServer = "";
String ssid = "";
String pasw = "";
String apiToken = "";
const int httpsPort = 443;
const char* host = "http://dev.steelants.cz";
const char* url = "/vasek/home/api.php";
const char* fingerprint = "";
const char* host2 = "dev.steelants.cz";
const char* url2 = "/vasek/home/update.php";
String content;
String Logs;
bool conf = false;
bool buttonActive = false;
int state = 0;
String requestJson = "";
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
ESP8266WebServer server(80);
StaticJsonDocument<265> jsonContent;
DeserializationError error;
//Pins
#define DHTPIN 2
//#define LIGHTPIN 13
//Inicializations
DHT DHTs(DHTPIN, DHT11);
void setup() {
Serial.begin(9600);
EEPROM.begin(100);
while (!Serial) continue;
delay(10);
//read saved data
ssid = ReadEeprom(1, 33);
pasw = ReadEeprom(33, 65);
apiToken = ReadEeprom(65, 97);
#if defined(LIGHTPIN)
//set pins
pinMode(LIGHTPIN, INPUT);
#endif
//wifi
if (ssid != "") {
WiFi.disconnect();
WiFi.softAPdisconnect(true);
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pasw);
conf = wifiVerify(20);
if (conf) {
configTime(3 * 3600, 0, "pool.ntp.org");
WiFiClientSecure client;
Serial.print("connecting to ");
Serial.println(host2);
client.setInsecure();
if (!client.connect(host2, httpsPort)) {
addLog("connection failed");
Serial.println("connection failed");
return;
}
if (client.verify(fingerprint, host2)) {
Serial.println("certificate matches");
} else {
addLog("certificate doesn't match");
Serial.println("certificate doesn't match");
return;
}
Serial.print("Starting OTA from: ");
Serial.println(url2
);
auto ret = ESPhttpUpdate.update(client, host2, 80, url2);
delay(500);
switch(ret) {
case HTTP_UPDATE_FAILED:
addLog("HTTP_UPDATE_FAILD Error (" + (String)ESPhttpUpdate.getLastError() + ") : " + (String)ESPhttpUpdate.getLastErrorString().c_str());
Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
Serial.println();
Serial.println();
Serial.println();
break;
case HTTP_UPDATE_NO_UPDATES:
Serial.println("HTTP_UPDATE_NO_UPDATES");
Serial.println();
Serial.println();
break;
case HTTP_UPDATE_OK:
Serial.println("HTTP_UPDATE_OK");
Serial.println();
Serial.println();
Serial.println();
break;
}
delay(500);
jsonContent = {};
jsonContent["token"] = apiToken;
jsonContent["settings"]["network"]["ip"] = WiFi.localIP().toString();
jsonContent["settings"]["network"]["mac"] = WiFi.macAddress();
jsonContent["settings"]["firmware_hash"] = ESP.getSketchMD5();
sendDataToWeb();
return;
}
}
setupAP();
}
void loop() {
if (conf) {
LogErrors();
if (unsuccessfulRounds >= 5) {
Serial.println("RESTARTING ESP");
ESP.restart();
}
DHTs.begin();
jsonContent = {};
jsonContent["token"] = apiToken;
requestJson = "";
//Read and Handle DHT values
float tem = DHTs.readTemperature();
float hum = DHTs.readHumidity();
Serial.println("TEMP" + String(tem) + ";HUMI" + String(hum));
if (isnan(tem) || isnan(hum)) {
Serial.println("Unable to read DHT");
} else {
jsonContent["values"]["temp"]["value"] = (String)tem;
jsonContent["values"]["temp"]["unit"] = "C";
jsonContent["values"]["humi"]["value"] = (String)hum;
jsonContent["values"]["humi"]["unit"] = "%";
}
#if defined(LIGHTPIN)
//Handle Photo Rezistor Values
jsonContent["values"]["light"]["value"] = (String)!digitalRead(LIGHTPIN);
jsonContent["values"]["light"]["unit"] = "";
#endif
sendDataToWeb();
loadDataFromWeb();
} else {
server.handleClient();
}
}
bool wifiVerify(int t) {
int c = 0;
Serial.println("Waiting for Wifi");
while (c < t) {
if (WiFi.status() == WL_CONNECTED) {
c = t;
return true;
}
delay(500);
Serial.print(WiFi.status());
c++;
}
return false;
}
void loadDataFromWeb() {
if (error.code() != DeserializationError::Ok) {
addLog(error.c_str());
Serial.println(error.c_str());
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
error = DeserializationError::Ok;
return;
}
//configuration setup
int sleepTime = jsonContent["device"]["sleepTime"];
String hostName = jsonContent["device"]["hostname"];
String requestState = jsonContent["state"];
String command = jsonContent["command"];
if (command == "reset"){
command = "";
ESP.reset();
} else if (command == "config") {
command = "";
CleanEeprom();
EEPROM.commit();
ESP.restart();
}
if (requestState != "succes") {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
} else if (requestState == "succes") {
unsuccessfulRounds = 0;
}
WiFi.hostname(hostName);
sleep(sleepTime);
}
void sendDataToWeb() {
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
error = deserializeJson(jsonContent, sendHttpRequest());
}
void sleep(int sleepTime) {
if (sleepTime > 0) { //if deep sleepTime > 0 use deep sleep
Serial.println("GOING TO SLEEP FOR " + String(sleepTime));
ESP.deepSleep((sleepTime * 60) * 1000000, RF_DEFAULT);
} else {
delay(5000);
}
}
String sendHttpRequest () {
HTTPClient http;
http.setReuse(true);
Serial.println("HTTP url: " + String(host) + String(url) + ""); //Print HTTP return code
http.begin(String(host) + String(url));
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
Serial.println("HTTP request: " + String(requestJson) + ""); //Print HTTP return code
int httpCode = http.POST(requestJson);
String payload = http.getString(); //Get the response payload
http.end();
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
if (httpCode == -1) {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
return "";
}
return payload;
}
void LogErrors() {
jsonContent = {};
error = deserializeJson(jsonContent, "{\"logs\":[" + Logs + "]}");
jsonContent["token"] = apiToken;
requestJson = "";
Logs = "";
sendDataToWeb();
}
void addLog(String logText) {
if (Logs == "") {
Logs = "\"" + logText + "\"";
} else {
Logs += ",\"" + logText + "\"";
}
}
void CleanEeprom() {
for (int i = 1; i < 100; ++i) {
EEPROM.write(i, 0);
}
}
void WriteEeprom (String data, int start = 1) {
for (int i = 0; i < data.length(); ++i)
{
EEPROM.write(start + i, data[i]);
}
EEPROM.commit();
}
String ReadEeprom(int min, int max) {
String localString;
for (int i = min; i < max; ++i) {
localString += char(EEPROM.read(i));
}
return localString;
}
void createWeb()
{
server.on("/", []() {
if (server.args() == 3) {
ssid = server.arg("wifi-ssid");
pasw = server.arg("wifi-pasw");
apiToken = server.arg("apiToken");
if (ssid != "" && pasw != "" && apiToken != "") {
CleanEeprom();
WriteEeprom(ssid);
WriteEeprom(pasw, 33);
WriteEeprom(apiToken, 65);
server.send(200, "application/json", "Restarting esp");
delay(500);
ESP.restart();
}
}
content = "<!DOCTYPE HTML><body>";
content += "<head><style>";
content += "html,body {height: 100%;}";
content += "html {display: table;margin: auto;}";
content += "body {display: table-cell;vertical-align: middle;}";
content += "input {width: 100%;box-sizing: border-box}";
content += "</style></head>";
content += "<h2>WIFI Configuration</h2>";
content += "<h4><b>" + (String)ssidServer + "</b></h4>";
content += "<a href='#'>Refresh</a>";
content += "<div class=\"wifi-list\">";
int n = WiFi.scanNetworks();
if (n == 0)
content += "<label>No networks found...</label>";
else
{
for (int i = 0; i < n; ++i)
{
content += "<a href=\"#\" onclick=\"fillSSID(this.innerHTML)\">" + WiFi.SSID(i) + "</a><br>";
}
}
content += "</div>";
content += "<form method='get' action=''><div class='wifi-form'>";
content += "<label>SSID: </label><input name='wifi-ssid' id='wifi-ssid' length=32 type='text'><br>";
content += "<label>Heslo: </label><input name='wifi-pasw' length=32 type='password'><br>";
content += "<label>Api token: </label><input name='apiToken' length=32 type='password'><br>";
content += "<input type='submit' value='Connect'>";
content += "</div></form>";
content += "<script>";
content += "function fillSSID(value) {\r\n";
content += "document.getElementById(\"wifi-ssid\").value = value;\r\n";
content += "}";
content += "</script>";
content += "</body>";
server.send(200, "text/html", content);
});
}
void setupAP(void) {
WiFi.mode(WIFI_STA);
WiFi.disconnect();
WiFi.softAPdisconnect(true);
delay(100);
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0)
Serial.println("no networks found");
else
{
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; ++i)
{
// Print SSID and RSSI for each network found
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(")");
Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
delay(10);
}
}
delay(100);
WiFi.softAP(ssidServer, paswServer);
Serial.println("softap");
Serial.println("");
Serial.println("WiFi connected");
Serial.print("Local IP: ");
Serial.println(WiFi.localIP());
Serial.print("SoftAP IP: ");
Serial.println(WiFi.softAPIP());
createWeb();
// Start the server
server.begin();
Serial.println("Server started");
Serial.println("over");
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

@@ -1,206 +0,0 @@
//Includes
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include <EEPROM.h>
//Variables
const char* ssid = "ssid";
const char* pasw = "pasw";
const char* hwId = "hwId";
const char* server = "http://dev.steelants.cz/vasek/home/api.php";
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
StaticJsonDocument<250> jsonContent;
bool buttonActive = false;
int interuptCount = 0;
int realState = 0;
int state = 0;
String requestJson = "";
//Pins
#define RELAY 4 //12
#define SWITCH 5 //0
void ICACHE_RAM_ATTR handleInterrupt ();
void setup() {
Serial.begin(9600);
EEPROM.begin(1);
while (!Serial) continue;
delay(10);
Serial.println('\n');
Serial.println("HW: " + String(hwId));
pinMode(SWITCH, INPUT);
pinMode(RELAY, OUTPUT);
state = EEPROM.read(0);
digitalWrite(RELAY, state);
realState = state;
attachInterrupt(digitalPinToInterrupt(SWITCH), handleInterrupt, CHANGE);
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pasw);
checkConnection();
Serial.println('\n');
Serial.println("Connection established!");
Serial.print("IP address:");
Serial.println(WiFi.localIP());
Serial.print("MAC address:");
Serial.println(WiFi.macAddress());
jsonContent = {};
jsonContent["token"] = hwId;
jsonContent["values"]["on/off"]["value"] = (String)realState;
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
}
void loop() {
if(unsuccessfulRounds >= 5) {
Serial.println("RESTARTING ESP");
ESP.restart();
}
jsonContent = {};
jsonContent["token"] = hwId;
requestJson = "";
if (buttonActive){
int realStateLocal = digitalRead(SWITCH);
jsonContent["values"]["on/off"]["value"] = (String)realStateLocal;
digitalWrite(RELAY, realStateLocal);
realState = realStateLocal;
EEPROM.write(0, realState);
EEPROM.commit();
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
//HTTP CLIENT
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
buttonActive = false;
}
jsonContent = {};
jsonContent["token"] = hwId;
requestJson = "";
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
//HTTP CLIENT
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
if (error) {
Serial.println(error.c_str());
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
return;
}
//configuration setup
String hostName = jsonContent["device"]["hostname"];
String ipAddress = jsonContent["device"]["ipAddress"];
String gateway = jsonContent["device"]["gateway"];
String subnet = jsonContent["device"]["subnet"];
String requestState = jsonContent["state"];
JsonObject object = jsonContent.as<JsonObject>();
if (!object["value"].isNull()) {
state = (int)jsonContent["value"];
}
if (requestState != "succes") {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
} else if (requestState == "succes") {
unsuccessfulRounds = 0;
}
//Set static ip
setStaticIp(ipAddress, gateway, subnet);
WiFi.hostname(hostName);
Serial.println("state: " + (String)state + ", realState: " + (String)realState);
if (state != realState){
if (state == 1 && realState == 0) {
Serial.println("ON state: " + (String)state + ", realState: " + (String)realState);
digitalWrite(RELAY, HIGH); // Turn the LED on by making the voltage LOW
realState = 1;
} else {
Serial.println("OFF");
digitalWrite(RELAY, LOW); // Turn the LED on by making the voltage LOW
realState = 0;
}
EEPROM.write(0, realState);
EEPROM.commit();
}
}
void handleInterrupt() {
interuptCount++;
buttonActive = true;
}
String sendHttpRequest (String requestJson) {
HTTPClient http;
http.setReuse(true);
http.begin(server);
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
int httpCode = http.POST(requestJson);
String payload = http.getString(); //Get the response payload
http.end();
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
if (httpCode == -1) {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
return "";
}
return payload;
}
bool checkConnection() {
int count = 0;
Serial.print("Waiting for Wi-Fi connection");
while ( count < 30 ) {
if (buttonActive){
int realStateLocal = digitalRead(SWITCH);
digitalWrite(RELAY, realStateLocal);
realState = realStateLocal;
EEPROM.write(0, realState);
EEPROM.commit();
buttonActive = false;
}
delay(250);
if (WiFi.status() == WL_CONNECTED) {
Serial.println();
Serial.println("Connected!");
return (true);
}
Serial.print(".");
count++;
}
Serial.println("Timed out.");
return false;
}
void setStaticIp(String ipAddress, String subnet, String gateway){
//Set static ip
IPAddress staticIpAddress;
IPAddress subnetIpAddress;
IPAddress gatewayIpAddress;
if (
staticIpAddress.fromString(ipAddress) &&
subnetIpAddress.fromString(subnet) &&
gatewayIpAddress.fromString(gateway) &&
WiFi.localIP() != staticIpAddress
) {
WiFi.config(staticIpAddress, subnetIpAddress, gatewayIpAddress);
Serial.print("STATIC IP address:");
Serial.println(WiFi.localIP());
}
}
@@ -1,360 +0,0 @@
//Includes
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiClientSecure.h>
#include <ESP8266HTTPClient.h>
#define ARDUINOJSON_DECODE_UNICODE 1
#include <ArduinoJson.h>
#include <EEPROM.h>
#include "ESP8266httpUpdate.h"
//Variables
const char* ssidServer = "";
const char* paswServer = "";
String ssid = "";
String pasw = "";
String apiToken = "";
const int httpsPort = 443;
const char* host = "http://dev.steelants.cz";
const char* url = "/vasek/home/api.php";
const char* fingerprint = "";
const char* host2 = "dev.steelants.cz";
const char* url2 = "/vasek/home/update.php";
String content;
bool conf = false;
bool buttonActive = false;
int state = 0;
String requestJson = "";
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
ESP8266WebServer server(80);
StaticJsonDocument<250> jsonContent;
DeserializationError error;
//Pins
#define RELAY 4 //12
#define SWITCH 5 //0
void ICACHE_RAM_ATTR handleInterrupt ();
void setup() {
Serial.begin(115200);
EEPROM.begin(100);
while (!Serial) continue;
delay(10);
//read saved data
ssid = ReadEeprom(1, 33);
pasw = ReadEeprom(33, 65);
apiToken = ReadEeprom(65, 97);
//set pins
pinMode(SWITCH, INPUT);
pinMode(RELAY, OUTPUT);
state = EEPROM.read(0);
digitalWrite(RELAY, state);
attachInterrupt(digitalPinToInterrupt(SWITCH), handleInterrupt, CHANGE);
//wifi
if (ssid != "") {
WiFi.disconnect();
WiFi.softAPdisconnect(true);
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pasw);
conf = wifiVerify(20);
if (conf) {
configTime(3 * 3600, 0, "pool.ntp.org");
WiFiClientSecure client;
Serial.print("connecting to ");
Serial.println(host2);
client.setInsecure();
if (!client.connect(host2, httpsPort)) {
Serial.println("connection failed");
return;
}
if (client.verify(fingerprint, host2)) {
Serial.println("certificate matches");
} else {
Serial.println("certificate doesn't match");
return;
}
Serial.print("Starting OTA from: ");
Serial.println(url2
);
auto ret = ESPhttpUpdate.update(client, host2, 80, url2);
delay(500);
switch(ret) {
case HTTP_UPDATE_FAILED:
Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
Serial.println();
Serial.println();
Serial.println();
break;
case HTTP_UPDATE_NO_UPDATES:
Serial.println("HTTP_UPDATE_NO_UPDATES");
Serial.println();
Serial.println();
break;
case HTTP_UPDATE_OK:
Serial.println("HTTP_UPDATE_OK");
Serial.println();
Serial.println();
Serial.println();
break;
}
delay(500);
jsonContent = {};
jsonContent["token"] = apiToken;
jsonContent["values"]["on/off"]["value"] = (String)state;
jsonContent["settings"]["network"]["ip"] = WiFi.localIP().toString();
jsonContent["settings"]["network"]["mac"] = WiFi.macAddress();
jsonContent["settings"]["firmware_hash"] = ESP.getSketchMD5();
sendDataToWeb();
return;
}
}
setupAP();
}
void loop() {
if (conf) {
if (unsuccessfulRounds >= 5) {
Serial.println("RESTARTING ESP");
ESP.restart();
}
if (buttonActive) {
jsonContent = {};
jsonContent["token"] = apiToken;
requestJson = "";
jsonContent["values"]["on/off"]["value"] = (String)state;
digitalWrite(RELAY, state);
EEPROM.write(0, state);
EEPROM.commit();
sendDataToWeb();
buttonActive = false;
delay(500);
} else {
loadDataFromWeb();
}
} else {
server.handleClient();
}
}
void handleInterrupt() {
buttonActive = true;
state = !state;
digitalWrite(RELAY, state);
}
bool wifiVerify(int t) {
int c = 0;
Serial.println("Waiting for Wifi to connect to Shelly1");
while (c < t) {
if (WiFi.status() == WL_CONNECTED) {
c = t;
return true;
}
delay(500);
Serial.print(WiFi.status());
c++;
}
return false;
}
void loadDataFromWeb() {
jsonContent = {};
jsonContent["token"] = apiToken;
requestJson = "";
sendDataToWeb();
if (error.code() != DeserializationError::Ok) {
Serial.println(error.c_str());
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
error = DeserializationError::Ok;
return;
}
//configuration setup
String hostName = jsonContent["device"]["hostname"];
String requestState = jsonContent["state"];
String command = jsonContent["command"];
if (!buttonActive) {
state = (int)jsonContent["value"];
Serial.println("state: " + (String)state);
digitalWrite(RELAY, state);
EEPROM.write(0, state);
EEPROM.commit();
delay(500);
}
if (command == "reset"){
ESP.reset();
} else if (command == "config") {
CleanEeprom();
EEPROM.commit();
ESP.restart();
}
if (requestState != "succes") {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
} else if (requestState == "succes") {
unsuccessfulRounds = 0;
}
WiFi.hostname(hostName);
}
void sendDataToWeb() {
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
error = deserializeJson(jsonContent, sendHttpRequest());
}
String sendHttpRequest () {
HTTPClient http;
http.setReuse(true);
Serial.println("HTTP url: " + String(host) + String(url) + ""); //Print HTTP return code
http.begin(String(host) + String(url));
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
Serial.println("HTTP request: " + String(requestJson) + ""); //Print HTTP return code
int httpCode = http.POST(requestJson);
String payload = http.getString(); //Get the response payload
http.end();
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
if (httpCode == -1) {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
return "";
}
return payload;
}
void CleanEeprom() {
for (int i = 1; i < 100; ++i) {
EEPROM.write(i, 0);
}
}
void WriteEeprom (String data, int start = 1) {
for (int i = 0; i < data.length(); ++i)
{
EEPROM.write(start + i, data[i]);
}
EEPROM.commit();
}
String ReadEeprom(int min, int max) {
String localString;
for (int i = min; i < max; ++i) {
localString += char(EEPROM.read(i));
}
return localString;
}
void createWeb()
{
server.on("/", []() {
if (server.args() == 3) {
ssid = server.arg("wifi-ssid");
pasw = server.arg("wifi-pasw");
apiToken = server.arg("apiToken");
if (ssid != "" && pasw != "" && apiToken != "") {
CleanEeprom();
WriteEeprom(ssid);
WriteEeprom(pasw, 33);
WriteEeprom(apiToken, 65);
server.send(200, "application/json", "Restarting esp");
delay(500);
ESP.restart();
}
}
content = "<!DOCTYPE HTML><body>";
content += "<head><style>";
content += "html,body {height: 100%;}";
content += "html {display: table;margin: auto;}";
content += "body {display: table-cell;vertical-align: middle;}";
content += "input {width: 100%;box-sizing: border-box}";
content += "</style></head>";
content += "<h2>WIFI Configuration</h2>";
content += "<a href='#'>Refresh</a>";
content += "<div class=\"wifi-list\">";
int n = WiFi.scanNetworks();
if (n == 0)
content += "<label>No networks found...</label>";
else
{
for (int i = 0; i < n; ++i)
{
content += "<a href=\"#\" onclick=\"fillSSID(this.innerHTML)\">" + WiFi.SSID(i) + "</a><br>";
}
}
content += "</div>";
content += "<form method='get' action=''><div class='wifi-form'>";
content += "<label>SSID: </label><input name='wifi-ssid' id='wifi-ssid' length=32 type='text'><br>";
content += "<label>Heslo: </label><input name='wifi-pasw' length=32 type='password'><br>";
content += "<label>Api token: </label><input name='apiToken' length=32 type='password'><br>";
content += "<input type='submit' value='Connect'>";
content += "</div></form>";
content += "<script>";
content += "function fillSSID(value) {\r\n";
content += "document.getElementById(\"wifi-ssid\").value = value;\r\n";
content += "}";
content += "</script>";
content += "</body>";
server.send(200, "text/html", content);
});
}
void setupAP(void) {
WiFi.mode(WIFI_STA);
WiFi.disconnect();
WiFi.softAPdisconnect(true);
delay(100);
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0)
Serial.println("no networks found");
else
{
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; ++i)
{
// Print SSID and RSSI for each network found
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(")");
Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
delay(10);
}
}
delay(100);
WiFi.softAP(ssidServer, paswServer);
Serial.println("softap");
Serial.println("");
Serial.println("WiFi connected");
Serial.print("Local IP: ");
Serial.println(WiFi.localIP());
Serial.print("SoftAP IP: ");
Serial.println(WiFi.softAPIP());
createWeb();
// Start the server
server.begin();
Serial.println("Server started");
Serial.println("over");
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

@@ -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);
}
@@ -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);
}
@@ -1,221 +0,0 @@
//Includes
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include <EEPROM.h>
//Variables
const char* ssid = "Smart-Home";
const char* pasw = "S1pjg3684dcCPTUQ";
const char* hwId = "452r5s8dad";
const char* server = "http://dev.steelants.cz/vasek/home/api.php";
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
StaticJsonDocument<250> jsonContent;
bool buttonActive = false;
int interuptCount = 0;
int realState = 1;
int state = 0;
String requestJson = "";
//Pins
#define SONOFF 12 //12
#define SONOFF_LED 13
#define SONOFF_BUT 0 //0
void ICACHE_RAM_ATTR handleInterrupt ();
void setup() {
Serial.begin(9600);
EEPROM.begin(1);
while (!Serial) continue;
delay(10);
Serial.println('\n');
Serial.println("HW: " + String(hwId));
pinMode(SONOFF_LED, OUTPUT);
pinMode(SONOFF_BUT, INPUT_PULLUP);
pinMode(SONOFF, OUTPUT);
state = EEPROM.read(0);
digitalWrite(SONOFF, state);
realState = state;
attachInterrupt(digitalPinToInterrupt(SONOFF_BUT), handleInterrupt, FALLING);
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pasw);
checkConnection();
Serial.println('\n');
Serial.println("Connection established!");
Serial.print("IP address:");
Serial.println(WiFi.localIP());
Serial.print("MAC address:");
Serial.println(WiFi.macAddress());
jsonContent = {};
jsonContent["token"] = hwId;
jsonContent["values"]["on/off"]["value"] = (String)realState;
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
}
void loop() {
if(unsuccessfulRounds >= 5) {
Serial.println("RESTARTING ESP");
ESP.restart();
}
jsonContent = {};
jsonContent["token"] = hwId;
requestJson = "";
if (buttonActive == true){
jsonContent["values"]["on/off"]["value"] = (String)!realState;
if (!realState == 1) {
digitalWrite(SONOFF, HIGH);
realState = 1;
} else if (!realState == 0){
digitalWrite(SONOFF, LOW);
realState = 0;
}
EEPROM.write(0, 0);
EEPROM.commit();
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
//HTTP CLIENT
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
buttonActive = false;
}
jsonContent = {};
jsonContent["token"] = hwId;
requestJson = "";
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
//HTTP CLIENT
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
if (error) {
Serial.println(error.c_str());
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
return;
}
//configuration setup
String hostName = jsonContent["device"]["hostname"];
String ipAddress = jsonContent["device"]["ipAddress"];
String gateway = jsonContent["device"]["gateway"];
String subnet = jsonContent["device"]["subnet"];
String requestState = jsonContent["state"];
JsonObject object = jsonContent.as<JsonObject>();
if (!object["value"].isNull()) {
state = (int)jsonContent["value"];
}
if (requestState != "succes") {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
} else if (requestState == "succes") {
unsuccessfulRounds = 0;
}
//Set static ip
setStaticIp(ipAddress, gateway, subnet);
WiFi.hostname(hostName);
Serial.println("state: " + (String)state + ", realState: " + (String)realState);
if (state != realState){
if (state == 1 && realState == 0) {
Serial.println("ON state: " + (String)state + ", realState: " + (String)realState);
digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW
realState = 1;
} else if (state == 0 && realState == 1) {
Serial.println("OFF");
digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW
realState = 0;
}
EEPROM.write(0, realState);
EEPROM.commit();
}
}
void handleInterrupt() {
interuptCount++;
buttonActive = true;
}
String sendHttpRequest (String requestJson) {
HTTPClient http;
http.setReuse(true);
http.begin(server);
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
int httpCode = http.POST(requestJson);
String payload = http.getString(); //Get the response payload
http.end();
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
if (httpCode == -1) {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
return "";
}
return payload;
}
bool checkConnection() {
int count = 0;
Serial.print("Waiting for Wi-Fi connection");
while ( count < 30 ) {
if (buttonActive == true){
if (!realState == 1) {
digitalWrite(SONOFF, HIGH);
realState = 1;
} else if (!realState == 0){
digitalWrite(SONOFF, LOW);
realState = 0;
}
EEPROM.write(0, realState);
EEPROM.commit();
buttonActive = false;
}
digitalWrite(SONOFF_LED, HIGH);
delay(125);
digitalWrite(SONOFF_LED, LOW);
delay(125);
if (WiFi.status() == WL_CONNECTED) {
Serial.println();
Serial.println("Connected!");
digitalWrite(SONOFF_LED, HIGH);
return (true);
}
Serial.print(".");
count++;
}
Serial.println("Timed out.");
return false;
}
void setStaticIp(String ipAddress, String subnet, String gateway){
//Set static ip
IPAddress staticIpAddress;
IPAddress subnetIpAddress;
IPAddress gatewayIpAddress;
if (
staticIpAddress.fromString(ipAddress) &&
subnetIpAddress.fromString(subnet) &&
gatewayIpAddress.fromString(gateway) &&
WiFi.localIP() != staticIpAddress
) {
WiFi.config(staticIpAddress, subnetIpAddress, gatewayIpAddress);
Serial.print("STATIC IP address:");
Serial.println(WiFi.localIP());
}
}
@@ -1,373 +0,0 @@
//Includes
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiClientSecure.h>
#include <ESP8266HTTPClient.h>
#define ARDUINOJSON_DECODE_UNICODE 1
#include <ArduinoJson.h>
#include <EEPROM.h>
#include "ESP8266httpUpdate.h"
//Variables
const char* ssidServer = "";
const char* paswServer = "";
String ssid = "";
String pasw = "";
String apiToken = "";
const int httpsPort = 443;
const char* host = "http://dev.steelants.cz";
const char* url = "/vasek/home/api.php";
const char* fingerprint = "";
const char* host2 = "dev.steelants.cz";
const char* url2 = "/vasek/home/update.php";
String content;
bool conf = false;
bool buttonActive = false;
int state = 0;
String requestJson = "";
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
ESP8266WebServer server(80);
StaticJsonDocument<250> jsonContent;
DeserializationError error;
//Pins
#define SONOFF 12
#define SONOFF_LED 13
#define SONOFF_BUT 0 //0
void ICACHE_RAM_ATTR handleInterrupt ();
void setup() {
Serial.begin(9600);
EEPROM.begin(100);
while (!Serial) continue;
delay(10);
//read saved data
ssid = ReadEeprom(1, 33);
pasw = ReadEeprom(33, 65);
apiToken = ReadEeprom(65, 97);
//set pins
pinMode(SONOFF_LED, OUTPUT);
pinMode(SONOFF_BUT, INPUT_PULLUP);
pinMode(SONOFF, OUTPUT);
state = EEPROM.read(0);
digitalWrite(SONOFF, state);
attachInterrupt(digitalPinToInterrupt(SONOFF_BUT), handleInterrupt, FALLING);
//wifi
if (ssid != "") {
WiFi.disconnect();
WiFi.softAPdisconnect(true);
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pasw);
conf = wifiVerify(20);
if (conf) {
configTime(3 * 3600, 0, "pool.ntp.org");
WiFiClientSecure client;
Serial.print("connecting to ");
Serial.println(host2);
client.setInsecure();
if (!client.connect(host2, httpsPort)) {
Serial.println("connection failed");
return;
}
if (client.verify(fingerprint, host2)) {
Serial.println("certificate matches");
} else {
Serial.println("certificate doesn't match");
return;
}
Serial.print("Starting OTA from: ");
Serial.println(url2
);
auto ret = ESPhttpUpdate.update(client, host2, 80, url2);
delay(500);
switch(ret) {
case HTTP_UPDATE_FAILED:
Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
Serial.println();
Serial.println();
break;
case HTTP_UPDATE_NO_UPDATES:
Serial.println("HTTP_UPDATE_NO_UPDATES");
Serial.println();
Serial.println();
Serial.println();
break;
case HTTP_UPDATE_OK:
Serial.println("HTTP_UPDATE_OK");
Serial.println();
Serial.println();
break;
}
delay(500);
jsonContent = {};
jsonContent["token"] = apiToken;
jsonContent["values"]["on/off"]["value"] = (String)state;
jsonContent["settings"]["network"]["ip"] = WiFi.localIP().toString();
jsonContent["settings"]["network"]["mac"] = WiFi.macAddress();
jsonContent["settings"]["firmware_hash"] = ESP.getSketchMD5();
sendDataToWeb();
return;
}
}
setupAP();
}
void loop() {
if (conf) {
if (unsuccessfulRounds >= 5) {
Serial.println("RESTARTING ESP");
ESP.restart();
}
jsonContent = {};
jsonContent["token"] = apiToken;
requestJson = "";
if (buttonActive) {
jsonContent["values"]["on/off"]["value"] = (String)state;
digitalWrite(SONOFF, state);
EEPROM.write(0, state);
EEPROM.commit();
sendDataToWeb();
buttonActive = false;
delay(500);
} else {
sendDataToWeb();
loadDataFromWeb();
}
} else {
server.handleClient();
}
}
void handleInterrupt() {
buttonActive = true;
state = !state;
digitalWrite(SONOFF, state);
}
bool wifiVerify(int t) {
int c = 0;
Serial.println("Waiting for Wifi to connect to Shelly1");
while (c < t) {
if (WiFi.status() == WL_CONNECTED) {
c = t;
Serial.println();
Serial.println("Connected!");
digitalWrite(SONOFF_LED, HIGH);
return true;
}
if (buttonActive == true){
digitalWrite(SONOFF, state);
EEPROM.write(0, state);
EEPROM.commit();
buttonActive = false;
}
digitalWrite(SONOFF_LED, HIGH);
delay(125);
digitalWrite(SONOFF_LED, LOW);
delay(375);
Serial.print(WiFi.status());
c++;
}
return false;
}
void loadDataFromWeb() {
if (error.code() != DeserializationError::Ok) {
Serial.println(error.c_str());
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
error = DeserializationError::Ok;
return;
}
//configuration setup
String hostName = jsonContent["device"]["hostname"];
String requestState = jsonContent["state"];
String command = jsonContent["command"];
if (!buttonActive) {
state = (int)jsonContent["value"];
Serial.println("state: " + (String)state);
digitalWrite(SONOFF, state);
EEPROM.write(0, state);
EEPROM.commit();
delay(500);
}
if (command == "reset"){
ESP.reset();
} else if (command == "config") {
CleanEeprom();
EEPROM.commit();
ESP.restart();
}
if (requestState != "succes") {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
} else if (requestState == "succes") {
unsuccessfulRounds = 0;
}
WiFi.hostname(hostName);
}
void sendDataToWeb() {
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
error = deserializeJson(jsonContent, sendHttpRequest());
}
String sendHttpRequest () {
HTTPClient http;
http.setReuse(true);
Serial.println("HTTP url: " + String(host) + String(url) + ""); //Print HTTP return code
http.begin(String(host) + String(url));
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
Serial.println("HTTP request: " + String(requestJson) + ""); //Print HTTP return code
int httpCode = http.POST(requestJson);
String payload = http.getString(); //Get the response payload
http.end();
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
if (httpCode == -1) {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
return "";
}
return payload;
}
void CleanEeprom() {
for (int i = 1; i < 100; ++i) {
EEPROM.write(i, 0);
}
}
void WriteEeprom (String data, int start = 1) {
for (int i = 0; i < data.length(); ++i)
{
EEPROM.write(start + i, data[i]);
}
EEPROM.commit();
}
String ReadEeprom(int min, int max) {
String localString;
for (int i = min; i < max; ++i) {
localString += char(EEPROM.read(i));
}
return localString;
}
void createWeb()
{
server.on("/", []() {
if (server.args() == 3) {
ssid = server.arg("wifi-ssid");
pasw = server.arg("wifi-pasw");
apiToken = server.arg("apiToken");
if (ssid != "" && pasw != "" && apiToken != "") {
CleanEeprom();
WriteEeprom(ssid);
WriteEeprom(pasw, 33);
WriteEeprom(apiToken, 65);
server.send(200, "application/json", "Restarting esp");
delay(500);
ESP.restart();
}
}
content = "<!DOCTYPE HTML><body>";
content += "<head><style>";
content += "html,body {height: 100%;}";
content += "html {display: table;margin: auto;}";
content += "body {display: table-cell;vertical-align: middle;}";
content += "input {width: 100%;box-sizing: border-box}";
content += "</style></head>";
content += "<h2>WIFI Configuration</h2>";
content += "<h4><b>" + (String)ssidServer + "</b></h4>";
content += "<a href='#'>Refresh</a>";
content += "<div class=\"wifi-list\">";
int n = WiFi.scanNetworks();
if (n == 0)
content += "<label>No networks found...</label>";
else
{
for (int i = 0; i < n; ++i)
{
content += "<a href=\"#\" onclick=\"fillSSID(this.innerHTML)\">" + WiFi.SSID(i) + "</a><br>";
}
}
content += "</div>";
content += "<form method='get' action=''><div class='wifi-form'>";
content += "<label>SSID: </label><input name='wifi-ssid' id='wifi-ssid' length=32 type='text'><br>";
content += "<label>Heslo: </label><input name='wifi-pasw' length=32 type='password'><br>";
content += "<label>Api token: </label><input name='apiToken' length=32 type='password'><br>";
content += "<input type='submit' value='Connect'>";
content += "</div></form>";
content += "<script>";
content += "function fillSSID(value) {\r\n";
content += "document.getElementById(\"wifi-ssid\").value = value;\r\n";
content += "}";
content += "</script>";
content += "</body>";
server.send(200, "text/html", content);
});
}
void setupAP(void) {
WiFi.mode(WIFI_STA);
WiFi.disconnect();
WiFi.softAPdisconnect(true);
delay(100);
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0)
Serial.println("no networks found");
else
{
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; ++i)
{
// Print SSID and RSSI for each network found
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(")");
Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
delay(10);
}
}
delay(100);
WiFi.softAP(ssidServer, paswServer);
Serial.println("softap");
Serial.println("");
Serial.println("WiFi connected");
Serial.print("Local IP: ");
Serial.println(WiFi.localIP());
Serial.print("SoftAP IP: ");
Serial.println(WiFi.softAPIP());
createWeb();
// Start the server
server.begin();
Serial.println("Server started");
Serial.println("over");
}
@@ -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;
}
@@ -1,150 +0,0 @@
//Includes
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
//Variables
const char* ssid = "";
const char* pasw = "";
const char* hwId = "";
const char* server = "http://dev.steelants.cz/vasek/home/api.php";
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
int lastState = 0;
//Pins
#define SONOFF 12
#define SONOFF_LED 13
#define SONOFF_BUT 0
void setup() {
Serial.begin(9600);
while (!Serial) continue;
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);
checkConnection();
Serial.println('\n');
Serial.println("Connection established!");
Serial.print("IP address:");
Serial.println(WiFi.localIP());
Serial.print("MAC address:");
Serial.println(WiFi.macAddress());
}
void loop() {
StaticJsonDocument<250> 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);
//HTTP CLIENT
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
DeserializationError error = deserializeJson(jsonContent, payload);
//configuration setup
String hostName = jsonContent["device"]["hostname"];
String ipAddress = jsonContent["device"]["ipAddress"];
String gateway = jsonContent["device"]["gateway"];
String subnet = jsonContent["device"]["subnet"];
String requestState = jsonContent["state"];
int state = jsonContent["value"];
if (requestState != "succes") {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
} else if (requestState == "succes") {
unsuccessfulRounds = 0;
}
//Set static ip
setStaticIp(ipAddress, gateway, subnet);
WiFi.hostname(hostName);
if(unsuccessfulRounds == 5) {
Serial.println("RESTARTING ESP");
ESP.restart();
}
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;
}
bool checkConnection() {
int count = 0;
Serial.print("Waiting for Wi-Fi connection");
while ( count < 30 ) {
if (WiFi.status() == WL_CONNECTED) {
Serial.println();
Serial.println("Connected!");
return (true);
}
digitalWrite(SONOFF, HIGH);
delay(250);
digitalWrite(SONOFF, HIGH);
delay(250);
Serial.print(".");
count++;
}
Serial.println("Timed out.");
return false;
}
void setStaticIp(String ipAddress, String subnet, String gateway){
//Set static ip
IPAddress staticIpAddress;
IPAddress subnetIpAddress;
IPAddress gatewayIpAddress;
if (
staticIpAddress.fromString(ipAddress) &&
subnetIpAddress.fromString(subnet) &&
gatewayIpAddress.fromString(gateway) &&
WiFi.localIP() != staticIpAddress
) {
WiFi.config(staticIpAddress, subnetIpAddress, gatewayIpAddress);
Serial.print("STATIC IP address:");
Serial.println(WiFi.localIP());
}
}
@@ -1,221 +0,0 @@
//Includes
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include <EEPROM.h>
//Variables
const char* ssid = "ssid";
const char* pasw = "pasw";
const char* hwId = "hwId";
const char* server = "http://dev.steelants.cz/vasek/home/api.php";
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
StaticJsonDocument<250> jsonContent;
bool buttonActive = false;
int interuptCount = 0;
int realState = 1;
int state = 0;
String requestJson = "";
//Pins
#define SONOFF 12 //12
#define SONOFF_LED 13
#define SONOFF_BUT 0 //0
void ICACHE_RAM_ATTR handleInterrupt ();
void setup() {
Serial.begin(9600);
EEPROM.begin(1);
while (!Serial) continue;
delay(10);
Serial.println('\n');
Serial.println("HW: " + String(hwId));
pinMode(SONOFF_LED, OUTPUT);
pinMode(SONOFF_BUT, INPUT_PULLUP);
pinMode(SONOFF, OUTPUT);
state = EEPROM.read(0);
digitalWrite(SONOFF, state);
realState = state;
attachInterrupt(digitalPinToInterrupt(SONOFF_BUT), handleInterrupt, FALLING);
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pasw);
checkConnection();
Serial.println('\n');
Serial.println("Connection established!");
Serial.print("IP address:");
Serial.println(WiFi.localIP());
Serial.print("MAC address:");
Serial.println(WiFi.macAddress());
jsonContent = {};
jsonContent["token"] = hwId;
jsonContent["values"]["on/off"]["value"] = (String)realState;
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
}
void loop() {
if(unsuccessfulRounds >= 5) {
Serial.println("RESTARTING ESP");
ESP.restart();
}
jsonContent = {};
jsonContent["token"] = hwId;
requestJson = "";
if (buttonActive){
jsonContent["values"]["on/off"]["value"] = (String)!realState;
if (!realState == 1) {
digitalWrite(SONOFF, HIGH);
realState = 1;
} else if (!realState == 0){
digitalWrite(SONOFF, LOW);
realState = 0;
}
EEPROM.write(0, 0);
EEPROM.commit();
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
//HTTP CLIENT
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
buttonActive = false;
}
jsonContent = {};
jsonContent["token"] = hwId;
requestJson = "";
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
//HTTP CLIENT
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
if (error) {
Serial.println(error.c_str());
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
return;
}
//configuration setup
String hostName = jsonContent["device"]["hostname"];
String ipAddress = jsonContent["device"]["ipAddress"];
String gateway = jsonContent["device"]["gateway"];
String subnet = jsonContent["device"]["subnet"];
String requestState = jsonContent["state"];
JsonObject object = jsonContent.as<JsonObject>();
if (!object["value"].isNull()) {
state = (int)jsonContent["value"];
}
if (requestState != "succes") {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
} else if (requestState == "succes") {
unsuccessfulRounds = 0;
}
//Set static ip
setStaticIp(ipAddress, gateway, subnet);
WiFi.hostname(hostName);
Serial.println("state: " + (String)state + ", realState: " + (String)realState);
if (state != realState){
if (state == 1 && realState == 0) {
Serial.println("ON state: " + (String)state + ", realState: " + (String)realState);
digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW
realState = 1;
} else {
Serial.println("OFF");
digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW
realState = 0;
}
EEPROM.write(0, realState);
EEPROM.commit();
}
}
void handleInterrupt() {
interuptCount++;
buttonActive = true;
}
String sendHttpRequest (String requestJson) {
HTTPClient http;
http.setReuse(true);
http.begin(server);
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
int httpCode = http.POST(requestJson);
String payload = http.getString(); //Get the response payload
http.end();
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
if (httpCode == -1) {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
return "";
}
return payload;
}
bool checkConnection() {
int count = 0;
Serial.print("Waiting for Wi-Fi connection");
while ( count < 30 ) {
if (buttonActive){
if (!realState == 1) {
digitalWrite(SONOFF, HIGH);
realState = 1;
} else if (!realState == 0){
digitalWrite(SONOFF, LOW);
realState = 0;
}
EEPROM.write(0, realState);
EEPROM.commit();
buttonActive = false;
}
digitalWrite(SONOFF_LED, HIGH);
delay(125);
digitalWrite(SONOFF_LED, LOW);
delay(125);
if (WiFi.status() == WL_CONNECTED) {
Serial.println();
Serial.println("Connected!");
digitalWrite(SONOFF_LED, LOW);
return (true);
}
Serial.print(".");
count++;
}
Serial.println("Timed out.");
return false;
}
void setStaticIp(String ipAddress, String subnet, String gateway){
//Set static ip
IPAddress staticIpAddress;
IPAddress subnetIpAddress;
IPAddress gatewayIpAddress;
if (
staticIpAddress.fromString(ipAddress) &&
subnetIpAddress.fromString(subnet) &&
gatewayIpAddress.fromString(gateway) &&
WiFi.localIP() != staticIpAddress
) {
WiFi.config(staticIpAddress, subnetIpAddress, gatewayIpAddress);
Serial.print("STATIC IP address:");
Serial.println(WiFi.localIP());
}
}
@@ -1,375 +0,0 @@
//Includes
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiClientSecure.h>
#include <ESP8266HTTPClient.h>
#define ARDUINOJSON_DECODE_UNICODE 1
#include <ArduinoJson.h>
#include <EEPROM.h>
#include "ESP8266httpUpdate.h"
//Variables
const char* ssidServer = "";
const char* paswServer = "";
String ssid = "";
String pasw = "";
String apiToken = "";
const int httpsPort = 443;
const char* host = "http://dev.steelants.cz";
const char* url = "/vasek/home/api.php";
const char* fingerprint = "";
const char* host2 = "dev.steelants.cz";
const char* url2 = "/vasek/home/update.php";
String content;
bool conf = false;
bool buttonActive = false;
int state = 0;
String requestJson = "";
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
ESP8266WebServer server(80);
StaticJsonDocument<250> jsonContent;
DeserializationError error;
//Pins
#define SONOFF 12
#define SONOFF_LED 13
#define SONOFF_BUT 0 //0
void ICACHE_RAM_ATTR handleInterrupt ();
void setup() {
Serial.begin(9600);
EEPROM.begin(100);
while (!Serial) continue;
delay(10);
//read saved data
ssid = ReadEeprom(1, 33);
pasw = ReadEeprom(33, 65);
apiToken = ReadEeprom(65, 97);
//set pins
pinMode(SONOFF_LED, OUTPUT);
pinMode(SONOFF_BUT, INPUT_PULLUP);
pinMode(SONOFF, OUTPUT);
state = EEPROM.read(0);
digitalWrite(SONOFF, state);
attachInterrupt(digitalPinToInterrupt(SONOFF_BUT), handleInterrupt, FALLING);
//wifi
if (ssid != "") {
WiFi.disconnect();
WiFi.softAPdisconnect(true);
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pasw);
conf = wifiVerify(20);
if (conf) {
configTime(3 * 3600, 0, "pool.ntp.org");
WiFiClientSecure client;
Serial.print("connecting to ");
Serial.println(host2);
client.setInsecure();
if (!client.connect(host2, httpsPort)) {
Serial.println("connection failed");
return;
}
if (client.verify(fingerprint, host2)) {
Serial.println("certificate matches");
} else {
Serial.println("certificate doesn't match");
return;
}
Serial.print("Starting OTA from: ");
Serial.println(url2
);
auto ret = ESPhttpUpdate.update(client, host2, 80, url2);
delay(500);
switch(ret) {
case HTTP_UPDATE_FAILED:
Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
Serial.println();
Serial.println();
Serial.println();
break;
case HTTP_UPDATE_NO_UPDATES:
Serial.println("HTTP_UPDATE_NO_UPDATES");
Serial.println();
Serial.println();
break;
case HTTP_UPDATE_OK:
Serial.println("HTTP_UPDATE_OK");
Serial.println();
Serial.println();
Serial.println();
break;
}
delay(500);
jsonContent = {};
jsonContent["token"] = apiToken;
jsonContent["values"]["on/off"]["value"] = (String)state;
jsonContent["settings"]["network"]["ip"] = WiFi.localIP().toString();
jsonContent["settings"]["network"]["mac"] = WiFi.macAddress();
jsonContent["settings"]["firmware_hash"] = ESP.getSketchMD5();
sendDataToWeb();
return;
}
}
setupAP();
}
void loop() {
if (conf) {
if (unsuccessfulRounds >= 5) {
Serial.println("RESTARTING ESP");
ESP.restart();
}
jsonContent = {};
jsonContent["token"] = apiToken;
requestJson = "";
if (buttonActive) {
jsonContent["values"]["on/off"]["value"] = (String)state;
digitalWrite(SONOFF, state);
EEPROM.write(0, state);
EEPROM.commit();
sendDataToWeb();
buttonActive = false;
delay(500);
} else {
sendDataToWeb();
loadDataFromWeb();
}
} else {
server.handleClient();
}
}
void handleInterrupt() {
buttonActive = true;
state = !state;
digitalWrite(SONOFF, state);
}
bool wifiVerify(int t) {
int c = 0;
Serial.println("Waiting for Wifi to connect to Shelly1");
while (c < t) {
if (WiFi.status() == WL_CONNECTED) {
c = t;
Serial.println();
Serial.println("Connected!");
digitalWrite(SONOFF_LED, HIGH);
return true;
}
if (buttonActive == true){
digitalWrite(SONOFF, state);
EEPROM.write(0, state);
EEPROM.commit();
buttonActive = false;
}
digitalWrite(SONOFF_LED, HIGH);
delay(125);
digitalWrite(SONOFF_LED, LOW);
delay(375);
Serial.print(WiFi.status());
c++;
}
return false;
}
void loadDataFromWeb() {
if (error.code() != DeserializationError::Ok) {
Serial.println(error.c_str());
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
error = DeserializationError::Ok;
return;
}
//configuration setup
String hostName = jsonContent["device"]["hostname"];
String requestState = jsonContent["state"];
String command = jsonContent["command"];
if (!buttonActive) {
state = (int)jsonContent["value"];
Serial.println("state: " + (String)state);
digitalWrite(SONOFF, state);
EEPROM.write(0, state);
EEPROM.commit();
delay(500);
}
if (command == "reset"){
ESP.reset();
} else if (command == "config") {
CleanEeprom();
EEPROM.commit();
ESP.restart();
}
if (requestState != "succes") {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
} else if (requestState == "succes") {
unsuccessfulRounds = 0;
}
WiFi.hostname(hostName);
}
void sendDataToWeb() {
serializeJson(jsonContent, requestJson);
Serial.println("JSON: " + requestJson);
error = deserializeJson(jsonContent, sendHttpRequest());
}
String sendHttpRequest () {
HTTPClient http;
http.setReuse(true);
Serial.println("HTTP url: " + String(host) + String(url) + ""); //Print HTTP return code
http.begin(String(host) + String(url));
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
Serial.println("HTTP request: " + String(requestJson) + ""); //Print HTTP return code
int httpCode = http.POST(requestJson);
String payload = http.getString(); //Get the response payload
http.end();
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
if (httpCode == -1) {
unsuccessfulRounds++;
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
return "";
}
return payload;
}
void CleanEeprom() {
for (int i = 1; i < 100; ++i) {
EEPROM.write(i, 0);
}
}
void WriteEeprom (String data, int start = 1) {
for (int i = 0; i < data.length(); ++i)
{
EEPROM.write(start + i, data[i]);
}
EEPROM.commit();
}
String ReadEeprom(int min, int max) {
String localString;
for (int i = min; i < max; ++i) {
localString += char(EEPROM.read(i));
}
return localString;
}
void createWeb()
{
server.on("/", []() {
if (server.args() == 3) {
ssid = server.arg("wifi-ssid");
pasw = server.arg("wifi-pasw");
apiToken = server.arg("apiToken");
if (ssid != "" && pasw != "" && apiToken != "") {
CleanEeprom();
WriteEeprom(ssid);
WriteEeprom(pasw, 33);
WriteEeprom(apiToken, 65);
server.send(200, "application/json", "Restarting esp");
delay(500);
ESP.restart();
}
}
content = "<!DOCTYPE HTML><body>";
content += "<head><style>";
content += "html,body {height: 100%;}";
content += "html {display: table;margin: auto;}";
content += "body {display: table-cell;vertical-align: middle;}";
content += "input {width: 100%;box-sizing: border-box}";
content += "</style></head>";
content += "<h2>WIFI Configuration</h2>";
content += "<h4><b>" + (String)ssidServer + "</b></h4>";
content += "<a href='#'>Refresh</a>";
content += "<div class=\"wifi-list\">";
int n = WiFi.scanNetworks();
if (n == 0)
content += "<label>No networks found...</label>";
else
{
for (int i = 0; i < n; ++i)
{
content += "<a href=\"#\" onclick=\"fillSSID(this.innerHTML)\">" + WiFi.SSID(i) + "</a><br>";
}
}
content += "</div>";
content += "<form method='get' action=''><div class='wifi-form'>";
content += "<label>SSID: </label><input name='wifi-ssid' id='wifi-ssid' length=32 type='text'><br>";
content += "<label>Heslo: </label><input name='wifi-pasw' length=32 type='password'><br>";
content += "<label>Api token: </label><input name='apiToken' length=32 type='password'><br>";
content += "<input type='submit' value='Connect'>";
content += "</div></form>";
content += "<script>";
content += "function fillSSID(value) {\r\n";
content += "document.getElementById(\"wifi-ssid\").value = value;\r\n";
content += "}";
content += "</script>";
content += "</body>";
server.send(200, "text/html", content);
});
}
void setupAP(void) {
WiFi.mode(WIFI_STA);
WiFi.disconnect();
WiFi.softAPdisconnect(true);
delay(100);
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0)
Serial.println("no networks found");
else
{
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; ++i)
{
// Print SSID and RSSI for each network found
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(")");
Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
delay(10);
}
}
delay(100);
WiFi.softAP(ssidServer, paswServer);
Serial.println("softap");
Serial.println("");
Serial.println("WiFi connected");
Serial.print("Local IP: ");
Serial.println(WiFi.localIP());
Serial.print("SoftAP IP: ");
Serial.println(WiFi.softAPIP());
createWeb();
// Start the server
server.begin();
Serial.println("Server started");
Serial.println("over");
}
@@ -1,71 +0,0 @@
<!DOCTYPE html>
<body>
<head>
<style>
html,
body {
height: 100%;
}
html {
display: table;
margin: auto;
font-family: "Metropolis", sans-serif;
}
body {
display: table-cell;
vertical-align: middle;
background: #182239;
color: #d4def7;
}
input {
width: 100%;
box-sizing: border-box;
line-height: 1.5;
background: #121a2b;
border-radius: 3px;
border: 0px solid transparent;
color: #d4def7;
padding: 0.5em 0.8em;
height: 2.5rem;
line-height: 1.5;
background: #121a2b;
width: 100%;
display: block;
}
a{
display: block;
color: #DDE7F5;
text-decoration:underline;
}
</style>
</head>
<h2>WIFI Configuration</h2>
<a href="#">Refresh</a>
<form>
<div class="wifi-list">
<a href="#" onclick="fillSSID(this.innerHTML)">WifiName</a><br>
<a href="#" onclick="fillSSID(this.innerHTML)">WifiName</a><br>
<a href="#" onclick="fillSSID(this.innerHTML)">WifiName</a><br>
<a href="#" onclick="fillSSID(this.innerHTML)">WifiName</a><br>
<a href="#" onclick="fillSSID(this.innerHTML)">WifiName</a><br>
<a href="#" onclick="fillSSID(this.innerHTML)">WifiName</a><br>
</div>
<div class="wifi-form">
<input id="wifi-ssid" type="text"><br>
<input id="password" type="text"><br>
<input type="submit" value="Connect">
</div>
</form>
<script>
function fillSSID(value) {
document.getElementById("wifi-ssid").value = value;
}
</script>
</body>
@@ -1,3 +0,0 @@
{
"folders": []
}
Binary file not shown.
-298
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
View File
File diff suppressed because one or more lines are too long
-323
View File
@@ -1,323 +0,0 @@
<?php
/** Includes **/
include_once('./config.php');
//Autoloader
$files = scandir('./app/class/');
$files = array_diff($files, array(
'.',
'..',
'app',
'ChartJS.php',
'ChartJS_Line.php',
'ChartManager.php',
'DashboardManager.php',
'Partial.php',
'Form.php',
'Route.php',
'Template.php',
'Ajax.php',
));
foreach($files as $file) {
include './app/class/'. $file;
}
//Allow acces only wia Curl, Ajax ETC
$restAcess = 'XMLHttpRequest' == ( $_SERVER['HTTP_X_REQUESTED_WITH'] ?? '' );
if (!$restAcess){
header('Location: ./');
}
//Log
$logManager = new LogManager();
$apiLogManager = new LogManager('./app/logs/api/'. date("Y-m-d").'.log');
//DB Conector
Db::connect (DBHOST, DBUSER, DBPASS, DBNAME);
//Read API data
$json = file_get_contents('php://input');
$obj = json_decode($json, true);
//Log RAW api request
if (API_DEBUGMOD == 1) {
$apiLogManager->write("[API] request body\n" . json_encode($obj, JSON_PRETTY_PRINT), LogRecordType::INFO);
}
//zabespecit proti Ddosu
if (isset($obj['user']) && $obj['user'] != ''){
//user at home
$user = UserManager::getUser($obj['user']);
$userAtHome = $user['at_home'];
if (!empty($user)) {
$userId = $user['user_id'];
$atHome = $obj['atHome'];
if($userAtHome != $atHome){
UserManager::atHome($userId, $atHome);
$logManager->write("[USER] user " . $userId . " changet his home state to " . $atHome , LogRecordType::INFO);
}
echo 'Saved: ' . $atHome;
header($_SERVER["SERVER_PROTOCOL"]." 200 OK");
die();
}
}
//Filtrování IP adress
if (DEBUGMOD != 1) {
if (!in_array($_SERVER['REMOTE_ADDR'], HOMEIP)) {
echo json_encode(array(
'state' => 'unsuccess',
'errorMSG' => "Using API from your IP insnt alowed!",
), JSON_PRETTY_PRINT);
header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized");
$logManager->write("[API] acces denied from " . $_SERVER['REMOTE_ADDR'], LogRecordType::WARNING);
exit();
}
}
//automationExecution
try {
AutomationManager::executeAll();
$fallbackManager = new FallbackManager(RANGES);
$fallbackManager->check();
//LogKeeper::purge(LOGTIMOUT);
} catch (\Exception $e) {
$logManager->write("[Automation] Something happen during automation execution", LogRecordType::ERROR);
}
//Record Cleaning
try {
RecordManager::clean(RECORDTIMOUT);
} catch (\Exception $e) {
$logManager->write("[Record] cleaning record older that " . RECORDTIMOUT , LogRecordType::ERROR);
}
//Variables
$token = $obj['token'];
$values = null;
$settings = null;
$deviceLogs = null;
$command = "null";
if (isset($obj['values'])) {
$values = $obj['values'];
}
if (isset($obj['settings'])) {
$settings = $obj['settings'];
}
if (isset($obj['logs'])) {
$deviceLogs = $obj['logs'];
}
//Checks
if ($token == null || $token == "") {
echo json_encode(array(
'state' => 'unsuccess',
'errorMSG' => "Missing Value Token in JSON payload",
), JSON_PRETTY_PRINT);
header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized");
die();
}
//Vstupní Checky
if (!DeviceManager::registeret($token)) {
$notificationMng = new NotificationManager;
$notificationData = [];
$notificationData = [
'title' => 'Info',
'body' => 'New device Detected Found',
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png',
];
$deviceId = DeviceManager::create($token, $token);
foreach ($values as $key => $value) {
if (!SubDeviceManager::getSubDeviceByMaster($deviceId, $key)) {
SubDeviceManager::create($deviceId, $key, UNITS[$key]);
}
if ($notificationData != []) {
$subscribers = $notificationMng::getSubscription();
foreach ($subscribers as $key => $subscriber) {
$logManager->write("[NOTIFICATION] SENDING TO" . $subscriber['id'] . " ", LogRecordType::INFO);
$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
}
}
}
//Notification for newly added Device
$subscribers = $notificationMng::getSubscription();
foreach ($subscribers as $key => $subscriber) {
$logManager->write("[NOTIFICATION] SENDING TO" . $subscriber['id'] . " ", LogRecordType::INFO);
$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
}
header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized");
echo json_encode(array(
'state' => 'unsuccess',
'errorMSG' => "Device not registeret",
), JSON_PRETTY_PRINT);
$logManager->write("[API] Registering Device", LogRecordType::INFO);
exit();
}
if (!DeviceManager::approved($token)) {
header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized");
echo json_encode(array(
'state' => 'unsuccess',
'errorMSG' => "Unaproved Device",
), JSON_PRETTY_PRINT);
exit();
}
// Diagnostic Data Write to DB
if ($settings != null && $settings != ""){
$data = ['mac' => $settings["network"]["mac"], 'ip_address' => $settings["network"]["ip"]];
if (array_key_exists("firmware_hash", $settings)) {
$data['firmware_hash'] = $settings["firmware_hash"];
}
DeviceManager::editByToken($token, $data);
$jsonAnswer = [
'state' => 'succes',
'command' => $command,
];
echo json_encode($jsonAnswer, JSON_PRETTY_PRINT);
header($_SERVER["SERVER_PROTOCOL"]." 200 OK");
die();
}
// Issuing command
if ($command == "null"){
$device = DeviceManager::getDeviceByToken($token);
$deviceId = $device['device_id'];
$deviceCommand = $device["command"];
if ($deviceCommand != '' && $deviceCommand != null && $deviceCommand != "null")
{
$command = $deviceCommand;
$data = [
'command'=>'null'
];
DeviceManager::editByToken($token, $data);
$logManager->write("[API] Device_ID " . $deviceId . " executing command " . $command, LogRecordType::INFO);
}
}
// Diagnostic Logs Write To log File
if ($deviceLogs != null && $deviceLogs != ""){
foreach ($deviceLogs as $log) {
$logManager->write("[Device Log Msg] Device_ID " . $deviceId . "->" . $log, LogRecordType::ERROR);
}
$jsonAnswer = [
'state' => 'succes',
'command' => $command,
];
echo json_encode($jsonAnswer, JSON_PRETTY_PRINT);
header($_SERVER["SERVER_PROTOCOL"]." 200 OK");
die();
}
// Subdevices first data!
if ($values != null && $values != "") {
//ZAPIS
$device = DeviceManager::getDeviceByToken($token);
$deviceId = $device['device_id'];
foreach ($values as $key => $value) {
if (!SubDeviceManager::getSubDeviceByMaster($deviceId, $key)) {
SubDeviceManager::create($deviceId, $key, UNITS[$key]);
}
RecordManager::create($deviceId, $key, round($value['value'],3));
$logManager->write("[API] Device_ID " . $deviceId . " writed value " . $key . ' ' . $value['value'], LogRecordType::INFO);
//notification
if ($key == 'door' || $key == 'water') {
$notificationMng = new NotificationManager;
$notificationData = [];
switch ($key) {
case 'door':
$notificationData = [
'title' => 'Info',
'body' => 'Someone just open up '.$device['name'],
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png',
];
break;
case 'water':
$notificationData = [
'title' => 'Alert',
'body' => 'Wather leak detected by '.$device['name'],
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png',
];
break;
}
if (DEBUGMOD) $notificationData['body'] .= ' value='.$value['value'];
if ($notificationData != []) {
$subscribers = $notificationMng::getSubscription();
foreach ($subscribers as $key => $subscriber) {
$logManager->write("[NOTIFICATION] SENDING TO" . $subscriber['id'] . " ", LogRecordType::INFO);
$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
}
}
}
}
$hostname = strtolower($device['name']);
$hostname = str_replace(' ', '_', $hostname);
//upravit format na setings-> netvork etc
$jsonAnswer = [
'device' => [
'hostname' => $hostname,
'ipAddress' => $device['ip_address'],
'subnet' => $device['subnet'],
'gateway' => $device['gateway'],
],
'state' => 'succes',
'command' => $command,
];
$subDevicesTypeList = SubDeviceManager::getSubDeviceSTypeForMater($deviceId);
if (!in_array($subDevicesTypeList, ['on/off', 'door', 'water'])) {
$jsonAnswer['device']['sleepTime'] = $device['sleep_time'];
}
echo json_encode($jsonAnswer, JSON_PRETTY_PRINT);
header($_SERVER["SERVER_PROTOCOL"]." 200 OK");
} else {
//Vypis
$device = DeviceManager::getDeviceByToken($token);
$deviceId = $device['device_id'];
if (count(SubDeviceManager::getAllSubDevices($deviceId)) == 0) {
SubDeviceManager::create($deviceId, 'on/off', UNITS[$key]);
//RecordManager::create($deviceId, 'on/off', 0);
}
$subDeviceId = SubDeviceManager::getAllSubDevices($deviceId)[0]['subdevice_id'];
$subDeviceLastReord = RecordManager::getLastRecord($subDeviceId);
$subDeviceLastReordValue = $subDeviceLastReord['value'];
if ($subDeviceLastReord['execuded'] == 0){
$logManager->write("[API] subDevice_ID ".$subDeviceId . " executed comand with value " .$subDeviceLastReordValue . " record id " . $subDeviceLastReord['record_id'] . " executed " . $subDeviceLastReord['execuded'], LogRecordType::INFO);
RecordManager::setExecuted($subDeviceLastReord['record_id']);
}
echo json_encode(array(
'device' => [
'hostname' => $device['name'],
'ipAddress' => $device['ip_address'],
'subnet' => $device['subnet'],
'gateway' => $device['gateway'],
],
'state' => 'succes',
'value' => $subDeviceLastReordValue,
'command' => $command,
), JSON_PRETTY_PRINT);
header($_SERVER["SERVER_PROTOCOL"]." 200 OK");
}
unset($logManager);
Db::disconect();
die();
-43
View File
@@ -1,43 +0,0 @@
<?php
/** Includes **/
include_once('./config.php');
//Autoloader
$files = scandir('./app/class/');
$files = array_diff($files, array(
'.',
'..',
'app',
'ChartJS.php',
'ChartJS_Line.php',
'ChartManager.php',
'DashboardManager.php',
'Partial.php',
'Form.php',
'Route.php',
'Template.php',
'Ajax.php',
));
foreach($files as $file) {
include './app/class/'. $file;
}
//Log
$apiLogManager = new LogManager('./app/logs/apiFront/'. date("Y-m-d").'.log');
//DB Conector
Db::connect (DBHOST, DBUSER, DBPASS, DBNAME);
//Read API data
$json = file_get_contents('php://input');
$obj = json_decode($json, true);
//Log RAW api request
if (API_DEBUGMOD == 1) {
$apiLogManager->write("[API] request body\n" . json_encode($obj, JSON_PRETTY_PRINT), LogRecordType::INFO);
}
unset($logManager);
Db::disconect();
die();
+119
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);
+66
View File
@@ -0,0 +1,66 @@
<?php
$router = new Router();
$router->setDefault(function(){
echo $_GET['url'].': 404';
$logManager = new LogManager();
$logManager->setLevel(LOGLEVEL);
$logManager->write("[ROUTER]" . $_GET['url'] . "not found", LogRecordTypes::WARNING);
unset($logManager);
});
//Pages
$router->any('/', 'Log');
$router->any('/log', 'Log');
$router->any('/server', 'Server');
$router->any('/login', 'Login');
$router->any('/logout', 'Logout');
$router->any('/automation', 'Automation');
$router->any('/setting', 'Setting');
$router->any('/device', 'Device');
$router->any('/device/{sortBy}/{sortType}', 'Device');
$router->any('/plugins', 'Plugins');
$router->any('/ajax', 'Ajax');
$router->any('/oauth', 'Oauth');
//Vue APP
$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');
$router->any('/api/users/subscribe', 'UsersApi@subscribe');
// 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
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(){
}
}
+63
View File
@@ -0,0 +1,63 @@
<?php
class CronApi extends ApiController
{
public function clean()
{
//Log Cleaning
$logKeeper = new LogMaintainer();
$logKeeper->purge(LOGTIMOUT);
//Database Backup Cleanup
$backupWorker = new DatabaseBackup();
$backupWorker->purge(5);
//Old Records Cleanup
foreach (SubDeviceManager::getAllSubDevices() as $key => $value) {
RecordManager::setHistory($value['subdevice_id']);
}
$this->response(['Value' => 'OK']);
}
public function fetch()
{
//Run Plugins
$result = [];
$dir = $_SERVER['DOCUMENT_ROOT'] . BASEDIR . 'app/plugins/';
$pluginsFiles = array_diff(scandir($dir), ['..', '.']);
foreach ($pluginsFiles as $key => $pluginFile) {
if (strpos($pluginFile, "!") === false) {
$className = str_replace(".php", "", $pluginFile);
if (strpos($pluginFile, '_') === true) {
continue;
}
if (!class_exists($className)) {
continue;
}
$pluginMakeClass = new $className;
if (!method_exists($pluginMakeClass, 'make')) {
continue;
}
$result[$className] = $pluginMakeClass->make();
} else {
$className = str_replace("!", "", str_replace(".php", "", $pluginFile));
if (strpos($pluginFile, '_') === true) {
continue;
}
if (!class_exists($className)) {
continue;
}
$pluginMakeClass = new $className;
if (!method_exists($pluginMakeClass, 'disable')) {
continue;
}
$result[$className] = $pluginMakeClass->disable();
}
}
//Print Result
$this->response($result);
}
}
+15
View File
@@ -0,0 +1,15 @@
<?php
class DevicesApi extends ApiController{
public function default(){
$this->requireAuth();
$response = [];
// TODO: process the request
$this->response($response);
}
public function getDevicesByRoom($roomId){
}
}
+194
View File
@@ -0,0 +1,194 @@
<?php
class EndpointsApi extends ApiController{
public function default(){
// $this->requireAuth();
$obj = $this->input;
//variables Definition
$command = "null";
//Log
$logManager = new LogManager('../logs/api/'. date("Y-m-d").'.log');
$logManager->setLevel(LOGLEVEL);
//Token Checks
if ($obj['token'] == null || !isset($obj['token'])) {
$this->response([
'state' => 'unsuccess',
'errorMSG' => "Missing Value Token in JSON payload",
], 401);
die();
}
//Vstupní Checky
if (!DeviceManager::registeret($obj['token'])) {
//Notification data setup
$notificationMng = new NotificationManager;
$notificationData = [
'title' => 'Info',
'body' => 'New device Detected Found',
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png',
];
//Subdevice Registration
$device = DeviceManager::create($obj['token'], $obj['token']);
foreach ($obj['values'] as $key => $value) {
if (!SubDeviceManager::getSubDeviceByMaster($device['device_id'], $key)) {
SubDeviceManager::create($device['device_id'], $key, UNITS[$key]);
}
}
//Notification for newly added Device
if ($notificationData != []) {
$subscribers = $notificationMng::getSubscription();
foreach ($subscribers as $key => $subscriber) {
$logManager->write("[NOTIFICATION] SENDING TO" . $subscriber['id'] . " ", LogRecordTypes::INFO);
$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
}
}
$logManager->write("[API] Registering Device", LogRecordTypes::INFO);
$this->response([
'state' => 'unsuccess',
'errorMSG' => "Device not registeret",
], 401);
}
if (!DeviceManager::approved($obj['token'])) {
$this->response([
'state' => 'unsuccess',
'errorMSG' => "Unaproved Device",
], 401);
}
$device = DeviceManager::getDeviceByToken($obj['token']);
DeviceManager::setHeartbeat($device['device_id']);
//Diagnostic
if (isset($obj['settings'])){
$data = ['mac' => $obj['settings']["network"]["mac"], 'ip_address' => $obj['settings']["network"]["ip"]];
if (array_key_exists("firmware_hash", $obj['settings'])) {
$data['firmware_hash'] = $obj['settings']["firmware_hash"];
}
DeviceManager::editByToken($obj['token'], $data);
}
//Log Data Save
if (isset($obj['logs'])){
foreach ($obj['logs'] as $log) {
$deviceLogManager = new LogManager('../logs/devices/'. date("Y-m-d").'.log');
$deviceLogManager->setLevel(LOGLEVEL);
$deviceLogManager->write("[Device Log Msg] Device_ID " . $device['device_id'] . "->" . $log, LogRecordTypes::ERROR);
unset($deviceLogManager);
}
$this->response([
'state' => 'succes',
'command' => $command,
], 200);
die();
}
// Issuing command
if ($command == "null"){
$deviceCommand = $device["command"];
if ($deviceCommand != '' && $deviceCommand != null && $deviceCommand != "null")
{
$command = $deviceCommand;
$data = [
'command'=>'null'
];
DeviceManager::editByToken($obj['token'], $data);
$logManager->write("[API] Device_ID " . $device['device_id'] . " executing command " . $command, LogRecordTypes::INFO);
}
}
$jsonAnswer = [];
$subDeviceLastReordValue = [];
if (isset($obj['values'])) {
//ZAPIS
foreach ($obj['values'] as $key => $value) {
if (!SubDeviceManager::getSubDeviceByMaster($device['device_id'], $key)) {
SubDeviceManager::create($device['device_id'], $key, UNITS[$key]);
}
$subDeviceLastReordValue[$key] = $value['value'];
RecordManager::create($device['device_id'], $key, round($value['value'],3), 'device');
$logManager->write("[API] Device_ID " . $device['device_id'] . " writed value " . $key . ' ' . $value['value'], LogRecordTypes::INFO);
//notification
if ($key == 'door' || $key == 'water') {
$notificationMng = new NotificationManager;
$notificationData = [];
switch ($key) {
case 'door':
$notificationData = [
'title' => 'Info',
'body' => 'Someone just open up '.$device['name'],
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png',
];
break;
case 'water':
$notificationData = [
'title' => 'Alert',
'body' => 'Wather leak detected by '.$device['name'],
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png',
];
break;
}
if (DEBUGMOD) $notificationData['body'] .= ' value='.$value['value'];
if ($notificationData != []) {
$subscribers = $notificationMng::getSubscription();
foreach ($subscribers as $key => $subscriber) {
$logManager->write("[NOTIFICATION] SENDING TO" . $subscriber['id'] . " ", LogRecordTypes::INFO);
$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
}
}
}
}
//upravit format na setings-> netvork etc
$subDevicesTypeList = SubDeviceManager::getSubDeviceSTypeForMater($device['device_id']);
if (!in_array($subDevicesTypeList, ['on/off', 'door', 'water'])) {
$jsonAnswer['device']['sleepTime'] = $device['sleep_time'];
}
} else {
if (count(SubDeviceManager::getAllSubDevices($device['device_id'])) == 0) {
//SubDeviceManager::create($device['device_id'], 'on/off', UNITS[$key]);
//RecordManager::create($device['device_id'], 'on/off', 0);
}
$subDevicesData = SubDeviceManager::getAllSubDevices($device['device_id']);
foreach ($subDevicesData as $key => $subDeviceData) {
$subDeviceId = $subDeviceData['subdevice_id'];
$subDeviceLastReord = RecordManager::getLastRecord($subDeviceId);
if (!empty ($subDeviceLastReord)) {
$subDeviceLastReordValue[$subDeviceData['type']] = $subDeviceLastReord['value'];
if ($subDeviceLastReord['execuded'] == 0){
$logManager->write("[API] subDevice_ID " . $subDeviceId . " executed comand with value " . json_encode($subDeviceLastReordValue) . " executed " . $subDeviceLastReord['execuded'], LogRecordTypes::INFO);
RecordManager::setExecuted($subDeviceLastReord['record_id']);
}
}
}
}
$hostname = "";
$hostname = strtolower($device['name']);
$hostname = str_replace(' ', '_', $hostname);
$jsonAnswer['device']['hostname'] = $hostname;
$jsonAnswer['state'] = 'succes';
$jsonAnswer['values'] = $subDeviceLastReordValue;
$jsonAnswer['command'] = $command;
$this->response($jsonAnswer);
// this method returns response as json
//unset($logManager); //TODO: Opravit
die();
}
}
+24
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
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
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
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
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
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
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();
}
}
+47
View File
@@ -0,0 +1,47 @@
<?php
class UsersApi extends ApiController{
public function default(){
//$this->requireAuth();
$response = null;
$users = UserManager::getUsers(["user_id", "username", "at_home"]);
foreach ($users as $key => $user) {
$response[] = [
"userName" => $user['username'],
"homeStatus" => ($user['at_home'] == 'true') ? true : false,
"avatarUrl" => UserManager::getAvatarUrl($user['user_id']),
];
}
$this->response($response);
}
public function status(){
//$this->requireAuth();
$response = null;
$obj = $this->input;
$atHome = $obj['atHome'];
$user = UserManager::getUser($obj['user']);
$userAtHome = $user['at_home'];
$userId = $user['user_id'];
if (!empty($user)) {
if($userAtHome != $atHome){
UserManager::atHome($userId, $atHome);
}
}
$this->response(['value'=>'OK']);
}
public function subscribe(){
//$this->requireAuth();
$bearer = $_SERVER['HTTP_AUTHORIZATION'];
$authManager = new AuthManager();
$userId = $authManager->getUserId($bearer);
NotificationManager::addSubscriber($userId, $this->input['pushtoken']);
$this->response(['value'=>'OK']);
}
}
+137
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, "vue-app");
$response = !$lastValue;
} else {
throw new Exception("Bad Request", 403);
}
$i = 0;
$timeout = 20;
while (RecordManager::getLastRecord($subDeviceId)['execuded'] == 0) {
if ($i == $timeout) {
throw new Exception("Timeout", 444);
}
$i++;
usleep(250000);
}
$this->response(['value' => $response]);
}
public function detail($subDeviceId, $period = "day")
{
//$this->requireAuth();
$groupBy = [
"year" => "month",
"month" => "day",
"day" => "hour",
"hout" => "minute",
];
$response = null;
$subDeviceData = SubDeviceManager::getSubdeviceDetailById($subDeviceId);
//TODO: zeptat se @Patrik Je Graf Dobře Seřazený na DESC ?
$events = RecordManager::getAllRecordForGraph($subDeviceId, $period, $groupBy[$period]);
if ( count($events) == 0){
throw new Exception("No Records", 404);
}
//Striping executed value from dataset if pasiv device such as Senzor ETC
if ($subDeviceData['type'] != "on/off") {
foreach ($events as $key => $event) {
unset($events[$key]['execuded']);
}
}
$LastRecordTime = new DateTime(reset($events)['time']);
$niceTime = Utilities::ago($LastRecordTime);
$labels = [];
$values = [];
foreach ($events as $key => $event) {
$recordDatetime = new DateTime($event['time']);
if ($key == 0){
$labels[] = 'now';
} else {
$labels[] = $recordDatetime->format('H:i');
}
$values[] = [
'y' => $event['value'],
't' => $recordDatetime->getTimestamp() * 1000,
];
}
$response = [
'room_id' => $subDeviceData['room_id'],
'device_id' => $subDeviceData['device_id'],
'lastConnectionTime' => (empty($niceTime) ? "00:00" : $niceTime),
'records' => $events,
'graph' => [
'type' => $this->getDeviceConfig($subDeviceData['type'])['graph'],
'data' => [
'labels' => $labels,
'datasets' => [[
//'label' => 'FUCK you',
'data' => $values,
]],
],
'options' => [
'scales' => [
'xAxis' => [[
'type' => 'time',
'distribution' => 'linear',
]],
],
'legend' => [
'display' => false
],
'tooltips' => [
'enabled' => true
],
'hover' => [
'mode' => true
],
],
],
];
//TODO: Make Cleaner
if (isset(RANGES[$subDeviceData['type']])){
$response['graph']['options']['scales']['yAxes'] = [[
'ticks' => [
'min' => RANGES[$subDeviceData['type']]['min'],
'max' => RANGES[$subDeviceData['type']]['max'],
'steps' => RANGES[$subDeviceData['type']]['scale'],
]
]];
}
$this->response($response);
}
private function getDeviceConfig($type){
if (isset(RANGES[$type])){
return RANGES[$type];
}
return RANGES[''];
}
}
-60
View File
@@ -1,60 +0,0 @@
<?php
/**
*
*/
class LogRecordType{
const WARNING = 'warning';
const ERROR = 'error';
const INFO = 'info';
}
class LogKeeper
{
function purge($days){
$todayFileName = date("Y-m-d").'.log';
$seconds = $days * 86400;
$logFiles = scandir('./app/logs/');
foreach ($logFiles as $key => $file) {
if (in_array($file,array(".","..", ".gitkeep", $todayFileName)))
{
continue;
}
if (filemtime($file) > $seconds) {
unlink('./app/logs/'.$file);
}
}
}
}
class LogManager
{
private $logFile;
function __construct($fileName = "")
{
if ($fileName == ""){
$fileName = './app/logs/'. date("Y-m-d").'.log';
}
if(!is_dir("./app/logs/"))
{
mkdir("./app/logs/");
}
$this->logFile = fopen($fileName, "a") or die("Unable to open file!");
}
function write($value, $type = LogRecordType::ERROR){
$record = "[".date("H:m:s")."][".$type."]" . $value . "\n";
if (strlen($record) > 65 ) {
$record = Utilities::stringInsert($record,"\n",65);
}
fwrite($this->logFile, $record);
}
function __destruct(){
if (isset($this->logFile)) {
fclose($this->logFile);
}
}
}
-31
View File
@@ -1,31 +0,0 @@
<?php
class RoomManager{
public static $rooms;
function getDefaultRoomId() {
$defaultRoom = Db::loadOne("SELECT room_id FROM rooms WHERE 'default' = 1");
return $defaultRoom['room_id'];
}
function getAllRooms () {
$allRoom = Db::loadAll ("SELECT rooms.*, COUNT(devices.device_id) as device_count FROM rooms LEFT JOIN devices ON (devices.room_id=rooms.room_id) GROUP BY rooms.room_id");
return $allRoom;
}
public function create ($name) {
$room = array (
'name' => $name,
);
try {
Db::add ('rooms', $room);
} catch(PDOException $error) {
echo $error->getMessage();
die();
}
}
public function delete ($roomId) {
Db::command ('DELETE FROM rooms WHERE room_id=?', array ($roomId));
}
}
?>
-30
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
}
}
-71
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));
}
}
-34
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')) {
include('app/controls/' . $this->path . '.php');
}
require_once('app/templates/' . $this->path . '.phtml');
}
}
-144
View File
@@ -1,144 +0,0 @@
<?php
/**
*
*/
class Utilities
{
function cleanString($text) {
$utf8 = array(
'/[áàâãªä]/u' => 'a',
'/[ÁÀÂÃÄ]/u' => 'A',
'/[ÍÌÎÏ]/u' => 'I',
'/[íìîï]/u' => 'i',
'/[ěéèêë]/u' => 'e',
'/[ĚÉÈÊË]/u' => 'E',
'/[óòôõºö]/u' => 'o',
'/[ÓÒÔÕÖ]/u' => 'O',
'/[úùûü]/u' => 'u',
'/[ÚÙÛÜ]/u' => 'U',
'/Š/' => 'S',
'/š/' => 's',
'/Č/' => 'C',
'/č/' => 'c',
'/ř/' => 'r',
'/Ř/' => 'R',
'/Ý/' => 'Y',
'/ý/' => 'y',
'/ç/' => 'c',
'/Ç/' => 'C',
'/ñ/' => 'n',
'/Ñ/' => 'N',
'//' => '-', // UTF-8 hyphen to "normal" hyphen
'/[’‘‹›‚]/u' => ' ', // Literally a single quote
'/[“”«»„]/u' => ' ', // Double quote
'/ /' => ' ', // nonbreaking space (equiv. to 0x160)
);
return preg_replace(array_keys($utf8), array_values($utf8), $text);
}
function stringInsert($str,$insertstr,$pos)
{
$str = substr($str, 0, $pos) . $insertstr . substr($str, $pos);
return $str;
}
/**
* [generateGraphJson description]
* @param string $type [line/bar]
* @param array $data [description]
* @param array $options [description]
* @return [type] [description]
*/
function generateGraphJson(string $type = 'line', array $data = [], array $options = []){
$array = [
'type' => $type,
'data' => [
'datasets' => [
[
'data' => $data,
'borderColor' => "#d4def7",
'backgroundColor' => "#d4def7"
]
]
],
'options' => [
'scales' => [
'xAxes' => [
[
'type' => 'time',
'distribution' => 'linear',
]
],
'yAxes' => [
[
'ticks' => [
'min' => $options['min'],
'max' => $options['max'],
'steps' => $options['scale']
]
]
]
],
'legend' => [
'display' => false
],
'tooltips' => [
'enabled' => true
],
'hover' => [
'mode' => true
]
]
];
return json_encode($array, JSON_PRETTY_PRINT);
}
function ago( $datetime )
{
$interval = date_create('now')->diff( $datetime );
$suffix = ( $interval->invert ? ' ago' : '' );
if ( $v = $interval->y >= 1 ) return self::pluralize( $interval->m, 'month' ) . $suffix;
if ( $v = $interval->d >= 1 ) return self::pluralize( $interval->d, 'day' ) . $suffix;
if ( $v = $interval->h >= 1 ) return self::pluralize( $interval->h, 'hour' ) . $suffix;
if ( $v = $interval->i >= 1 ) return self::pluralize( $interval->i, 'minute' ) . $suffix;
return self::pluralize( $interval->s, 'second' ) . $suffix;
}
function pluralize( $count, $text )
{
return $count . ( ( $count == 1 ) ? ( " $text" ) : ( " ${text}s" ) );
}
function checkOperator($value1, $operator, $value2) {
switch ($operator) {
case '<': // Less than
return $value1 < $value2;
case '<=': // Less than or equal to
return $value1 <= $value2;
case '>': // Greater than
return $value1 > $value2;
case '>=': // Greater than or equal to
return $value1 >= $value2;
case '==': // Equal
return ($value1 == $value2);
case '===': // Identical
return $value1 === $value2;
case '!==': // Not Identical
return $value1 !== $value2;
case '!=': // Not equal
case '<>': // Not equal
return $value1 != $value2;
case '||': // Or
case 'or': // Or
return $value1 || $value2;
case '&&': // And
case 'and': // And
return $value1 && $value2;
case 'xor': // Or
return $value1 xor $value2;
default:
return FALSE;
} // end switch
}
}
+14
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';
}
}
@@ -32,7 +32,7 @@ if (isset($_POST) && !empty($_POST)){
AutomationManager::create($_POST['name'], $onDays, $doCode, $ifCode);
header('Location: ' . BASEDIR . strtolower(basename(__FILE__, '.php')));
header('Location: ' . BASEURL . strtolower(basename(__FILE__, '.php')));
die();
} else if (isset($_POST['modalFinal']) && $_POST['action'] == "edit") {
$doCode = json_encode($_POST['device'], JSON_PRETTY_PRINT);
@@ -70,7 +70,7 @@ if (isset($_POST) && !empty($_POST)){
AutomationManager::create($_POST['name'], $onDays, $doCode, $ifCode, (isset ($_POST['automation_id']) ? $_POST['automation_id'] : ""));
header('Location: ' . BASEDIR . strtolower(basename(__FILE__, '.php')));
header('Location: ' . BASEURL . strtolower(basename(__FILE__, '.php')));
die();
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
if (!empty ($_POST)){
$deviceManager = new DeviceManager ();
$subDeviceManager = new SubDeviceManager ();
if (!empty ($_FILES['deviceFirmware']) && !empty ($_FILES['deviceFirmware']['tmp_name']) && !empty ($_POST['deviceId'])) {
$file = $_FILES['deviceFirmware'];
$deviceMac = $deviceManager->getDeviceById ($_POST['deviceId'])['mac'];
$fileName = (!empty ($deviceMac) ? str_replace (":", "", $deviceMac) . ".bin" : "");
if ($fileName != "" && file_exists ("../updater/" . $fileName)) {
unlink("../updater/" . $fileName);
}
if ($fileName != "") {
copy ($file['tmp_name'], "../updater/" . $fileName);
}
}
if (isset ($_POST['deviceCommand']) && !empty ($_POST['deviceId'])) {
$deviceManager->edit ($_POST['deviceId'], array ('command' => $_POST['deviceCommand']));
} else if (!empty ($_POST['deviceCommand'])) {
$devices = $deviceManager->getAllDevices();
foreach ($devices as $key => $device) {
$deviceManager->edit ($device['device_id'], array ('command' => $_POST['deviceCommand']));
}
}
if (!empty ($_POST['deviceRoomId']) && !empty ($_POST['deviceId'])) {
$deviceManager->edit ($_POST['deviceId'], array ('room_id' => $_POST['deviceRoomId']));
}
if (!empty ($_POST['deviceName']) && !empty ($_POST['deviceId'])) {
$deviceManager->edit ($_POST['deviceId'], array ('name' => $_POST['deviceName']));
}
if (isset ($_POST['deviceHistory']) && !empty ($_POST['deviceId'])) {
$subDeviceManager->editSubDevicesByDevice($_POST['deviceId'], array ('history' => $_POST['deviceHistory']));
}
header('Location: ' . BASEURL . str_replace(BASEDIR, "", $_SERVER['REQUEST_URI']));
die();
}
@@ -1,5 +1,5 @@
<?php
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';
+75
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();
}
+28
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'])
) {
//
}
}
+45
View File
@@ -0,0 +1,45 @@
<?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: ' . BASEURL . 'logout');
die();
} else if (isset($_POST['submitCreateUser']) && $_POST['submitCreateUser'] != "") {
$userName = $_POST['userName'];
$password = $_POST['userPassword'];
$email = $_POST['userEmail'];
$userManager->createUser($userName, $password, $email);
header('Location: ' . BASEURL . 'setting');
die();
} else if (isset($_POST['submitEnableOta']) && $_POST['submitEnableOta'] != "") {
$otaCode = $_POST['otaCode'];
$otaSecret = $_POST['otaSecret'];
$ga = new PHPGangsta_GoogleAuthenticator();
$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2); // 2 = 2*30sec clock tolerance
if ($checkResult) {
$userManager->setOta($otaCode, $otaSecret);
}
header('Location: ' . BASEURL . 'setting');
die();
} else if (isset ($_POST['userPermission']) && !empty ($_POST['userID'])) {
$userManager->setUserDataAdmin("permission", $_POST['userPermission'], $_POST['userID']);
header('Location: ' . BASEURL . 'setting');
die();
} else {
foreach ($_POST as $key => $value) {
if ($key == 'submit') continue;
$settingMng = new SettingsManager();
if ($settingMng->getByName($key)) {
$settingMng->update($key, $value);
}
}
header('Location: ' . BASEURL . 'setting');
die();
}
}
-13
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();
}
?>
-87
View File
@@ -1,87 +0,0 @@
<?php
if (isset($_POST) && !empty($_POST)){
if (isset($_POST['saveDevice']) && $_POST['saveDevice'] != "") {
$deviceId = $_POST['deviceId'];
$deviceName = $_POST['deviceName'];
$deviceIcon = $_POST['deviceIcon'];
$sleepTime = 0;
if (isset($_FILES['deviceFirmware']) && isset($_FILES['deviceFirmware']['tmp_name']) && $_FILES['deviceFirmware']['tmp_name'] != "") {
$file = $_FILES['deviceFirmware'];
$deviceMac = DeviceManager::getDeviceById($deviceId)['mac'];
$fileName = (isset ($deviceMac) && $deviceMac != "" ? str_replace(":", "", $deviceMac) . ".bin" : "");
if ($fileName != "" && file_exists("./app/updater/" . $fileName)) {
unlink("./app/updater/" . $fileName);
}
if ($fileName != "") {
copy($file['tmp_name'], "./app/updater/" . $fileName);
} else {
}
}
if (isset($_POST['sleepTime'])) {
$sleepTime = $_POST['sleepTime'];
}
//TODO: if device isnt on off
$permissionsInJson = json_encode([
(int) $_POST['permissionOwner'],
(int) $_POST['permissionOther'],
]);
$deviceOwnerUserId = $_POST['deviceOwnerUserId'];
$deviceOwnerRoomId = $_POST['deviceOwnerId'];
try {
$args = array(
'owner' => $deviceOwnerUserId,
'name' => $deviceName,
'icon' => $deviceIcon,
'permission' => $permissionsInJson,
'sleep_time' => $sleepTime,
'room_id' => $deviceOwnerRoomId,
);
DeviceManager::edit($deviceId, $args);
} catch (\Exception $e) {
echo $e->message();
}
//Debug
if (DEBUGMOD == 1) {
echo '<pre>';
echo $permissionsInJson;
echo $deviceId;
var_dump(json_decode ($permissionsInJson));
echo '</pre>';
echo '<a href="' . BASEDIR .'">CONTINUE</a>';
die();
}
} else if (isset($_POST['approveDevice'])) {
$deviceId = $_POST['deviceId'];
$args = array(
'approved' => 1,
);
DeviceManager::edit($deviceId, $args);
} else if (isset($_POST['disableDevice'])) {
$deviceId = $_POST['deviceId'];
$args = array(
'approved' => 2,
);
DeviceManager::edit($deviceId, $args);
}
//Debug
if (DEBUGMOD == 1) {
echo '<pre>';
var_dump($POST);
echo '</pre>';
echo '<a href="' . BASEDIR . '">CONTINUE</a>';
die();
}
header('Location: ' . BASEDIR );
die();
}
?>
-18
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();
}
}
-29
View File
@@ -1,29 +0,0 @@
<?php
if (isset($_POST) && !empty($_POST)){
if (isset($_POST['submitPasswordChange']) && $_POST['submitPasswordChange'] != "") {
$oldPassword = $_POST['oldPassword'];
$newPassword = $_POST['newPassword1'];
$newPassword2 = $_POST['newPassword2'];
UserManager::changePassword($oldPassword, $newPassword, $newPassword2);
header('Location: ' . BASEDIR . 'logout');
die();
} else if (isset($_POST['submitCreateUser']) && $_POST['submitCreateUser'] != "") {
$userName = $_POST['userName'];
$password = $_POST['userPassword'];
UserManager::createUser($userName, $password);
header('Location: ' . BASEDIR . 'setting');
die();
} else if (isset($_POST['submitEnableOta']) && $_POST['submitEnableOta'] != "") {
echo $otaCode = $_POST['otaCode'];
echo $otaSecret = $_POST['otaSecret'];
$ga = new PHPGangsta_GoogleAuthenticator();
$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2); // 2 = 2*30sec clock tolerance
if ($checkResult) {
UserManager::setOta($otaCode, $otaSecret);
}
header('Location: ' . BASEDIR . 'setting');
die();
}
}
-17
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();
}
}
+498
View File
@@ -0,0 +1,498 @@
<?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 < 1) {
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) {
$tempDevice[$deviceId['id']] = [
'online' => false,
'status' => 'OFFLINE',
];
if ($subDevicesData = SubDeviceManager::getAllSubDevices($deviceId['id'])) {
foreach ($subDevicesData as $key => $subDeviceData) {
$lastRecord = RecordManager::getLastRecord($subDeviceData['subdevice_id']);
if ($lastRecord != false && $lastRecord['execuded'] == 1) {
$tempDevice[$deviceId['id']]['online'] = true;
$tempDevice[$deviceId['id']]['status'] = "SUCCESS";
} else {
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($deviceId['id'], 6) as $key => $value) {
if ($value['execuded'] == 1) {
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed) {
$tempDevice[$deviceId['id']]['online'] = true;
}
}
switch ($subDeviceData['type']) {
case 'temp_cont':
$tempDevice[$deviceId['id']]['thermostatMode'] = 'off';
if ($lastRecord['value'] != 0) {
$tempDevice[$deviceId['id']]['thermostatMode'] = 'heat';
}
$tempDevice[$deviceId['id']]['thermostatTemperatureAmbient'] = $lastRecord['value'];
$tempDevice[$deviceId['id']]['thermostatTemperatureSetpoint'] = $lastRecord['value'];
break;
case 'vol_cont':
$tempDevice[$deviceId['id']]['currentVolume'] = $lastRecord['value'];
break;
case 'media_apps':
$tempDevice[$deviceId['id']]['currentApplication'] = "kodi";
break;
case 'media_input':
$tempDevice[$deviceId['id']]['currentInput'] = "pc";
break;
case 'media_status':
$tempDevice[$deviceId['id']]['activityState'] = "ACTIVE";
$tempDevice[$deviceId['id']]['playbackState'] = "PLAYING";
break;
case 'on/off':
$tempDevice[$deviceId['id']]['on'] = ($lastRecord['value'] == 1 ? true : false);
break;
}
}
}
// $lastRecord = RecordManager::getLastRecord($deviceId['id']);
// //var_dump($lastRecord);
// if ($lastRecord['execuded'] == 1) {
// $online = true;
// $status = 'SUCCESS';
// } else {
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($deviceId['id'], 6) as $key => $value) {
if ($value['execuded'] == 1) {
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed) {
$status = "PENDING";
$online = true;
}
// }
$devices = $tempDevice;
if (count($devices)> 1){
$devices[] = $tempDevice;
}
}
$response = [
'requestId' => $requestId,
'payload' => [
'devices' => $devices,
],
];
$apiLogManager = new LogManager('../logs/google-home/' . date("Y-m-d") . '.log');
$apiLogManager->write("[API][$requestId] request response\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordTypes::INFO);
$apiLogManager->setLevel(LOGLEVEL);
echo json_encode($response);
}
static function execute($requestId, $payload)
{
$commands = [];
foreach ($payload['commands'] as $key => $command) {
foreach ($command['devices'] as $key2 => $device) {
$executionCommand = $command['execution'][0];
if (isset($command['execution'][$key])) {
$executionCommand = $command['execution'][$key];
}
$deviceType = GoogleHomeDeviceTypes::getType($executionCommand['command']);
if ($subDeviceId = SubDeviceManager::getSubDeviceByMasterAndType($device['id'], $deviceType)) {
$subDeviceId = $subDeviceId['subdevice_id'];
switch ($executionCommand['command']) {
case 'action.devices.commands.OnOff':
$commands[] = self::executeSwitch($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.ThermostatTemperatureSetpoint':
$commands[] = self::executeTermostatValue($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.ThermostatSetMode':
$commands[] = self::executeTermostatMode($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.setVolume':
$commands[] = self::executeVolume($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.appSelect':
$commands[] = self::executeApp($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.SetInput':
$commands[] = self::executeInput($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.mediaNext':
$commands[] = self::executeMediaCont($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.mediaPrevious':
$commands[] = self::executeMediaCont($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.mediaPause':
$commands[] = self::executeMediaCont($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.mediaResume':
$commands[] = self::executeMediaCont($subDeviceId, $executionCommand);
break;
case 'action.devices.commands.mediaStop':
$commands[] = self::executeMediaCont($subDeviceId, $executionCommand);
break;
}
}
}
}
$response = [
'requestId' => $requestId,
'payload' => [
'commands' => $commands,
],
];
$apiLogManager = new LogManager('../logs/google-home/' . date("Y-m-d") . '.log');
$apiLogManager->setLevel(LOGLEVEL);
$apiLogManager->write("[API][EXECUTE][$requestId]\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordTypes::INFO);
echo json_encode($response);
}
static function executeSwitch($subDeviceId, $executionCommand)
{
$value = 0;
$status = 'OFFLINE';
$online = false;
if ($executionCommand['params']['on']) $value = 1;
RecordManager::createWithSubId($subDeviceId, $value, 'google');
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
if ($value['execuded'] == 1) {
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed) {
$status = "PENDING";
$online = true;
}
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'on' => $executionCommand['params']['on'],
'online' => $online,
],
];
return $commandTemp;
}
static function executeTermostatValue($subDeviceId, $executionCommand)
{
$value = 0;
$status = 'OFFLINE';
$online = false;
if (isset($executionCommand['params']['thermostatTemperatureSetpoint'])) {
$value = $executionCommand['params']['thermostatTemperatureSetpoint'];
}
RecordManager::createWithSubId($subDeviceId, $value, 'google');
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $lastValue) {
if ($lastValue['execuded'] == 1) {
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed) {
$status = "PENDING";
$online = true;;
}
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'thermostatMode' => 'heat',
'thermostatTemperatureSetpoint' => $value,
'thermostatTemperatureAmbient' => $value,
'online' => $online,
//ambient z dalšího zenzoru v roomu
],
];
return $commandTemp;
}
static function executeTermostatMode($subDeviceId, $executionCommand)
{
$mode = "off";
$value = 0;
$status = 'OFFLINE';
$online = false;
if (isset($executionCommand['params']['thermostatMode']) && $executionCommand['params']['thermostatMode'] != 'off') {
$mode = $executionCommand['params']['thermostatMode'];
$value = RecordManager::getLastRecordNotNull($subDeviceId)['value'];
}
RecordManager::createWithSubId($subDeviceId, $value, 'google');
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
if ($value['execuded'] == 1) {
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed) {
$status = "PENDING";
$online = true;
}
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'thermostatMode' => $mode,
'online' => $online,
],
];
return $commandTemp;
}
static function executeVolume($subDeviceId, $executionCommand)
{
//echo $executionCommand['params']['volumeLevel'];
$status = 'OFFLINE';
$online = false;
$currentVolume = RecordManager::getLastRecord($subDeviceId)['value'];
if (isset($executionCommand['params']['volumeLevel'])) {
RecordManager::createWithSubId($subDeviceId, $executionCommand['params']['volumeLevel']);
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
if ($value['execuded'] == 1) {
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed) {
$status = "PENDING";
$online = true;
$currentVolume = $executionCommand['params']['volumeLevel'];
}
}
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'currentVolume' => $currentVolume,
'online' => $online,
],
];
return $commandTemp;
}
static function executeApp($subDeviceId, $executionCommand)
{
//echo $executionCommand['params']['newApplication'];
$status = 'OFFLINE';
$online = false;
$currentApplication = RecordManager::getLastRecord($subDeviceId)['value'];
if (isset($executionCommand['params']['newApplication'])) {
RecordManager::createWithSubId($subDeviceId, $executionCommand['params']['newApplication']);
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
if ($value['execuded'] == 1) {
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed) {
$status = "PENDING";
$online = true;
$currentApplication = $executionCommand['params']['newApplication'];
}
}
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'currentApplication' => $currentApplication,
'online' => $online,
],
];
return $commandTemp;
}
static function executeInput($subDeviceId, $executionCommand)
{
//echo $executionCommand['params']['newInput'];
$status = 'OFFLINE';
$online = false;
$currentInput = RecordManager::getLastRecord($subDeviceId)['value'];
if (isset($executionCommand['params']['newInput'])) {
RecordManager::createWithSubId($subDeviceId, $executionCommand['params']['newInput']);
$executed = 0;
$waiting = 0;
foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
if ($value['execuded'] == 1) {
$executed++;
} else {
$waiting++;
}
}
if ($waiting < $executed) {
$status = "PENDING";
$online = true;
$currentInput = $executionCommand['params']['newInput'];
}
}
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'currentInput' => $currentInput,
'online' => $online,
],
];
return $commandTemp;
}
static function executeMediaCont($subDeviceId, $executionCommand)
{
$status = 'SUCCESS';
$online = true;
$deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id'];
$commandTemp = [
'ids' => [(string) $deviceId],
'status' => $status,
'states' => [
'online' => $online,
],
];
return $commandTemp;
}
}
@@ -1,13 +1,13 @@
<?php
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');
}
}
+217
View File
@@ -0,0 +1,217 @@
<?php
/**
*
*/
class Utilities
{
static function cleanString($text)
{
$utf8 = array(
'/[áàâãªä]/u' => 'a',
'/[ÁÀÂÃÄ]/u' => 'A',
'/[ÍÌÎÏ]/u' => 'I',
'/[íìîï]/u' => 'i',
'/[ěéèêë]/u' => 'e',
'/[ĚÉÈÊË]/u' => 'E',
'/[óòôõºö]/u' => 'o',
'/[ÓÒÔÕÖ]/u' => 'O',
'/[úùûü]/u' => 'u',
'/[ÚÙÛÜ]/u' => 'U',
'/Š/' => 'S',
'/š/' => 's',
'/Č/' => 'C',
'/č/' => 'c',
'/ř/' => 'r',
'/Ř/' => 'R',
'/Ý/' => 'Y',
'/ý/' => 'y',
'/ç/' => 'c',
'/Ç/' => 'C',
'/ñ/' => 'n',
'/Ñ/' => 'N',
'//' => '-', // UTF-8 hyphen to "normal" hyphen
'/[’‘‹›‚]/u' => ' ', // Literally a single quote
'/[“”«»„]/u' => ' ', // Double quote
'/ /' => ' ', // nonbreaking space (equiv. to 0x160)
);
return preg_replace(array_keys($utf8), array_values($utf8), $text);
}
static function stringInsert($str, $insertstr, $pos)
{
$str = substr($str, 0, $pos) . $insertstr . substr($str, $pos);
return $str;
}
/**
* [generateGraphJson description]
* @param string $type [line/bar]
* @param array $data [description]
* @param array $options [description]
* @return [type] [description]
*/
static function generateGraphJson(string $type = 'line', array $data = [], array $options = [])
{
$array = [
'type' => $type,
'data' => [
'datasets' => [
[
'data' => $data,
'borderColor' => "#d4def7",
'backgroundColor' => "#d4def7"
]
]
],
'options' => [
'scales' => [
'xAxes' => [
[
'type' => 'time',
'distribution' => 'linear',
]
],
'yAxes' => [
[
'ticks' => [
'min' => $options['min'],
'max' => $options['max'],
'steps' => $options['scale']
]
]
]
],
'legend' => [
'display' => false
],
'tooltips' => [
'enabled' => true
],
'hover' => [
'mode' => true
]
]
];
return json_encode($array, JSON_PRETTY_PRINT);
}
static function ago($datetime)
{
$interval = date_create('now')->diff($datetime);
$suffix = ($interval->invert ? ' ago' : '');
if ($v = $interval->y >= 1) return self::pluralize($interval->m, 'month') . $suffix;
if ($v = $interval->d >= 1) return self::pluralize($interval->d, 'day') . $suffix;
if ($v = $interval->h >= 1) return self::pluralize($interval->h, 'hour') . $suffix;
if ($v = $interval->i >= 1) return self::pluralize($interval->i, 'minute') . $suffix;
return self::pluralize($interval->s, 'second') . $suffix;
}
static function pluralize($count, $text)
{
return $count . (($count == 1) ? (" $text") : (" ${text}s"));
}
static function checkOperator($value1, $operator, $value2)
{
switch ($operator) {
case '<': // Less than
return $value1 < $value2;
case '<=': // Less than or equal to
return $value1 <= $value2;
case '>': // Greater than
return $value1 > $value2;
case '>=': // Greater than or equal to
return $value1 >= $value2;
case '==': // Equal
return ($value1 == $value2);
case '===': // Identical
return $value1 === $value2;
case '!==': // Not Identical
return $value1 !== $value2;
case '!=': // Not equal
case '<>': // Not equal
return $value1 != $value2;
case '||': // Or
case 'or': // Or
return $value1 || $value2;
case '&&': // And
case 'and': // And
return $value1 && $value2;
case 'xor': // Or
return $value1 xor $value2;
default:
return FALSE;
} // end switch
}
static function CallAPI($method, $url, $data = false)
{
$curl = curl_init();
switch ($method) {
case "POST":
curl_setopt($curl, CURLOPT_POST, 1);
if ($data)
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
break;
case "PUT":
curl_setopt($curl, CURLOPT_PUT, 1);
break;
default:
if ($data)
$url = sprintf("%s?%s", $url, http_build_query($data));
}
// Optional Authentication:
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
//curl_setopt($curl, CURLOPT_USERPWD, "username:password");
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
/**
* Sort Array by keys
*
* @param array $data
* @param [type] $key
* @param string $operator ('asc'/'desc')
* @return void
*/
static function sortArrayByKey($data = [], $key, $operator = "asc")
{
if ($operator == "asc") {
uasort($data, function ($a, $b) use ($key) {
$SortA = $a[$key];
$SortB = $b[$key];
if ($key == "room_id") {
$SortA = RoomManager::getRoomName($SortA);
$SortB = RoomManager::getRoomName($SortB);
}
if ($SortA == $SortB) return 0;
return ($SortA < $SortB) ? -1 : 1;
});
} else {
uasort($data, function ($a, $b) use ($key) {
$SortA = $a[$key];
$SortB = $b[$key];
if ($key == "room_id") {
$SortA = RoomManager::getRoomName($SortA);
$SortB = RoomManager::getRoomName($SortB);
}
if ($SortA == $SortB) return 0;
return ($SortA > $SortB) ? -1 : 1;
});
}
return $data;
}
}
+70
View File
@@ -0,0 +1,70 @@
<?php
class AuthManager {
public function getToken($username, $password, $userAgent = null){
if ($userAgent == null) {
$userAgent = $_SERVER['HTTP_USER_AGENT'];
}
$userManager = new UserManager();
if ($username != '' || $password != ''){
$userLogedIn = $userManager->loginNew($username, $password);
if ($userLogedIn != false){
// Create token header as a JSON string
$header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']);
// Create token payload as a JSON string
$payload = json_encode([
'user_id' => $userLogedIn,
'exp' => date('Y-m-d H:i:s',strtotime("+90 Days")),
'iat' => date('Y-m-d H:i:s',time()),
]);
// Encode Header to Base64Url String
$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));
// Encode Payload to Base64Url String
$base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload));
// Create Signature Hash
$signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, 'abC123!', true);
// Encode Signature to Base64Url String
$base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));
// Create JWT
$jwt = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
$token = [
'user_id' => $userLogedIn,
'user_agent' => $userAgent,
'token' => $jwt,
'expire' => date('Y-m-d H:i:s',strtotime("+90 Days")),
'issued' => date('Y-m-d H:i:s',time()),
];
if (Db::add ('tokens', $token)){
return $jwt;
}
}
}
return false;
}
public function deleteToken($token){
Db::command ('DELETE FROM tokens WHERE token=?', array ($token));
return true;
}
public function validateToken($token){
list($type, $hash) = explode(' ', $token);
$tokens = Db::loadAll('SELECT * FROM tokens WHERE token = ? AND expire >= CURRENT_TIMESTAMP AND blocked = 0;', array($hash));
if ($type == 'Bearer' && count($tokens) == 1) {
return true;
} else if (count($tokens) == 0) {
return false;
};
return false;
}
public function getUserId($bearer){
$token = explode(' ', $bearer)[1];
$userid = Db::loadOne('SELECT user_id FROM tokens WHERE token = ? AND expire >= CURRENT_TIMESTAMP AND blocked = 0;', array($token))['user_id'];
return $userid;
}
}
@@ -3,21 +3,21 @@
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,
@@ -38,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");
+129
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;
}
}
?>
@@ -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));
}
@@ -2,37 +2,51 @@
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 setHeartbeat($deviceId){
self::edit($deviceId, ['heartbeat' => date("Y-m-d H:i:s", time())]);
}
static function getAllDevicesInRoom ($roomId = "") {
return Db::loadAll ("SELECT * FROM devices WHERE room_id = ? AND approved != ?", Array($roomId, 2));
}
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 getDeviceByMac($deviceMac) {
static function getDeviceByMac($deviceMac) {
return Db::loadOne("SELECT * FROM devices WHERE mac = ?", array($deviceMac));
}
function getDeviceById($deviceId) {
static function getDeviceById($deviceId) {
return Db::loadOne("SELECT * FROM devices WHERE device_id = ?", array($deviceId));
}
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'];
@@ -42,7 +56,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) {
@@ -51,7 +65,7 @@ class DeviceManager{
}
}
public function editByToken ($token, $values = []) {
public static function editByToken ($token, $values = []) {
try {
Db::edit ('devices', $values, 'WHERE token = ?', array($token));
} catch(PDOException $error) {
@@ -65,7 +79,7 @@ class DeviceManager{
* @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,
);
@@ -81,15 +95,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);
}
}

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