WiFiPCController.ino 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. // pre compiletime config
  2. #define SPIFFS_DBG
  3. #define SPIFFS_USE_MAGIC
  4. #define FIRMWARE_NAME "WiFiPCController"
  5. #define VERSION "1.0.0"
  6. #define COPYRIGHT "Flo Kra"
  7. // default values, can later be overridden via configuration
  8. #define DEVICE_NAME "WiFiPCController-1"
  9. #define MQTT_SERVER "mqtt.lan"
  10. #define MQTT_PORT 1883
  11. #define MQTT_TOPIC_IN "Test/PCController1/cmd"
  12. #define MQTT_TOPIC_OUT "Test/PCController1/status"
  13. #define CLEARCONF_TOKEN "TUES"
  14. #define PIN_OUT_POWERSW 5
  15. #define PIN_OUT_RESETSW 4
  16. #define PIN_IN_PWRLED 14
  17. // default logic levels
  18. #define OUT_POWERSW_ONSTATE HIGH
  19. #define OUT_RESETSW_ONSTATE HIGH
  20. #define IN_PWRLED_ONSTATE LOW
  21. #include "PersWiFiManager.h"
  22. #include <ArduinoJson.h>
  23. #include <ESP8266WiFi.h>
  24. #include <WiFiClient.h>
  25. #include <ESP8266WebServer.h>
  26. #include <ESP8266mDNS.h>
  27. #include <ESP8266HTTPUpdateServer.h>
  28. #include "PubSubClient.h"
  29. #include <DNSServer.h>
  30. #include <FS.h>
  31. boolean serialdebug = true;
  32. boolean mqttdebug = true;
  33. // config variables - do not change here!
  34. // confWeb
  35. char deviceName[31];
  36. char http_user[31];
  37. char http_pass[31];
  38. boolean http_user_auth = false;
  39. char http_token[31];
  40. char http_user1[31];
  41. char http_pass1[31];
  42. char http_user2[31];
  43. char http_pass2[31];
  44. // confMqtt
  45. char mqtt_server[41];
  46. int mqtt_port = MQTT_PORT;
  47. char mqtt_user[31];
  48. char mqtt_pass[31];
  49. char mqtt_topic_in[51];
  50. char mqtt_topic_out[51];
  51. char mqtt_willTopic[51];
  52. int mqtt_willQos = 2;
  53. boolean mqtt_willRetain = false;
  54. char mqtt_willMsg[31];
  55. char mqtt_connMsg[31];
  56. boolean mqtt_outRetain = false;
  57. char mqtt_topic_in_pcpwr[64];
  58. char mqtt_topic_in_pcpwrh[64];
  59. char mqtt_topic_in_pcrst[64];
  60. char mqtt_topic_in_pconsleep[64];
  61. // global variables
  62. byte mqttMode = 0;
  63. unsigned long mqttLastReconnectAttempt = 0;
  64. int mqttReconnectAttempts = 0;
  65. int mqttReconnects = 0;
  66. boolean mqttConnected = false;
  67. unsigned long mqttLastHeartbeat;
  68. boolean mqttInTopicSubscribed = false;
  69. char cmdPayload[101]; // buffer for commands
  70. boolean cmdInQueue = false; // command is queued and will be processed next loop() run
  71. bool saveConfigWebToFlash = false;
  72. bool saveConfigMqttToFlash = false;
  73. //bool saveConfigHwToFlash = false;
  74. char tmp_topic_pub[51];
  75. boolean pwrSwitchStateOn;
  76. unsigned long pwrSwitchOnAt;
  77. unsigned int pwrSwitchOffAfter;
  78. boolean resSwitchStateOn;
  79. unsigned long resSwitchOnAt;
  80. unsigned int resSwitchOffAfter;
  81. boolean in_pwrled_lastState = LOW;
  82. boolean in_pwrled_currState = LOW;
  83. unsigned long in_pwrled_millis = 0;
  84. unsigned long PC_standby_pending_millis = 0;
  85. int PCstate = 0;
  86. int PCstate_lastPublished = 0;
  87. unsigned int sysUptime_days = 0;
  88. unsigned int sysUptime_hours = 0;
  89. unsigned int sysUptime_mins = 0;
  90. char uptimeStr[15];
  91. WiFiClient espClient;
  92. void mqttCallback(char* topic, byte* payload, unsigned int length);
  93. PubSubClient mqttclient(espClient);
  94. ESP8266WebServer httpServer(80);
  95. DNSServer dnsServer;
  96. PersWiFiManager persWM(httpServer, dnsServer);
  97. ESP8266HTTPUpdateServer httpUpdater;
  98. void setup() {
  99. Serial.begin(115200);
  100. delay(500);
  101. Serial.println();
  102. Serial.print(FIRMWARE_NAME);
  103. Serial.print(" v");
  104. Serial.print(VERSION);
  105. Serial.println(COPYRIGHT);
  106. Serial.println("starting...");
  107. pinMode(PIN_OUT_POWERSW, OUTPUT);
  108. digitalWrite(PIN_OUT_POWERSW, !OUT_POWERSW_ONSTATE);
  109. pinMode(PIN_OUT_RESETSW, OUTPUT);
  110. digitalWrite(PIN_OUT_RESETSW, !OUT_RESETSW_ONSTATE);
  111. pinMode(PIN_IN_PWRLED, INPUT_PULLUP);
  112. //delay(50);
  113. //in_pwrled_lastState=digitalRead(PIN_IN_PWRLED);
  114. strlcpy(deviceName, DEVICE_NAME, 31);
  115. strlcpy(mqtt_server, MQTT_SERVER, 41);
  116. strlcpy(mqtt_topic_in, MQTT_TOPIC_IN, 51);
  117. strlcpy(mqtt_topic_out, MQTT_TOPIC_OUT, 51);
  118. Serial.println("default config values loaded..");
  119. Serial.println("Mounting FS...");
  120. if (!SPIFFS.begin()) {
  121. Serial.println("Failed to mount file system");
  122. return;
  123. }
  124. //SPIFFS.format();
  125. //Serial.print("Format SPIFFS complete.");
  126. if (!SPIFFS.exists("/formatted")) {
  127. Serial.println("Please wait 30 secs for SPIFFS to be formatted");
  128. SPIFFS.format();
  129. Serial.println("Spiffs formatted");
  130. File f = SPIFFS.open("/formatted", "w");
  131. if (!f) {
  132. Serial.println("file open failed");
  133. } else {
  134. f.println("Format Complete");
  135. }
  136. f.close();
  137. } else {
  138. Serial.println("SPIFFS is formatted. Moving along...");
  139. }
  140. Serial.println("files in SPIFFS:");
  141. Dir dir = SPIFFS.openDir("/");
  142. while (dir.next()) {
  143. Serial.print(dir.fileName());
  144. File f = dir.openFile("r");
  145. Serial.print(" ");
  146. Serial.println(f.size());
  147. f.close();
  148. }
  149. Serial.println("---");
  150. // load config from SPIFFS if files exist
  151. if (!loadConfigWeb()) {
  152. Serial.println("Failed to load confWeb.json");
  153. } else {
  154. Serial.println("confWeb.json loaded");
  155. }
  156. if (!loadConfigMqtt()) {
  157. Serial.println("Failed to load confWeb.json");
  158. } else {
  159. Serial.println("confWeb.json loaded");
  160. }
  161. delay(500);
  162. //optional code handlers to run everytime wifi is connected...
  163. persWM.onConnect([]() {
  164. Serial.print("wifi connected to ");
  165. Serial.print(WiFi.SSID());
  166. Serial.print(", IP: ");
  167. Serial.println(WiFi.localIP());
  168. });
  169. //...or AP mode is started
  170. persWM.onAp([]() {
  171. Serial.print("AP MODE: ");
  172. Serial.println(persWM.getApSsid());
  173. });
  174. //sets network name for AP mode
  175. persWM.setApCredentials(DEVICE_NAME);
  176. //persWM.setApCredentials(DEVICE_NAME, "password"); optional password
  177. //make connecting/disconnecting non-blocking
  178. persWM.setConnectNonBlock(true);
  179. //in non-blocking mode, program will continue past this point without waiting
  180. persWM.begin();
  181. delay(500);
  182. httpServerInit();
  183. mqttPrepareConnection();
  184. mqttClientInit();
  185. buildUptimeString();
  186. Serial.println("setup complete.");
  187. delay(1000);
  188. } //void setup
  189. void loop() {
  190. checkMillis();
  191. persWM.handleWiFi(); //in non-blocking mode, handleWiFi must be called in the main loop
  192. yield();
  193. dnsServer.processNextRequest();
  194. httpServer.handleClient();
  195. yield();
  196. mqttHandleConnection();
  197. yield();
  198. evalCmd();
  199. PC_pwrSwitchOffAfterTimeout();
  200. PC_resSwitchOffAfterTimeout();
  201. if (Serial.available()) {
  202. serialEvent();
  203. yield();
  204. }
  205. } //void loop