Advertisement
Guest User

Untitled

a guest
Nov 4th, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.64 KB | None | 0 0
  1. ////////////////////////////////////////////////////////////////////////////////////////////////////
  2. // Modify these values for your environment
  3. const char* wifiSSID = "wifissid"; // Your WiFi network name
  4. const char* wifiPassword = "wifipassword"; // Your WiFi network password
  5. const char* otaPassword = "myotapassword"; // OTA update password
  6. const char* mqttServer = "192.168.1.2"; // Your MQTT server IP address
  7. const char* mqttUser = ""; // mqtt username, set to "" for no user
  8. const char* mqttPassword = ""; // mqtt password, set to "" for no password
  9. const String mqttNode = "CarPresence"; // Your unique hostname for this device
  10. const String mqttDiscoveryPrefix = "homeassistant"; // Home Assistant MQTT Discovery, see https://home-assistant.io/docs/mqtt/discovery/
  11. ////////////////////////////////////////////////////////////////////////////////////////////////////
  12.  
  13. // Home Assistant MQTT Discovery, see https://home-assistant.io/docs/mqtt/discovery/
  14. // We'll create one binary_sensor device to track MQTT connectivity
  15. const String mqttDiscoBinaryStateTopic = mqttDiscoveryPrefix + "/binary_sensor/" + mqttNode + "/state";
  16. const String mqttDiscoBinaryConfigTopic = mqttDiscoveryPrefix + "/binary_sensor/" + mqttNode + "/config";
  17. // And a sensor for WiFi signal strength
  18. const String mqttDiscoSignalStateTopic = mqttDiscoveryPrefix + "/sensor/" + mqttNode + "-signal/state";
  19. const String mqttDiscoSignalConfigTopic = mqttDiscoveryPrefix + "/sensor/" + mqttNode + "-signal/config";
  20. // And a sensor for device uptime
  21. const String mqttDiscoUptimeStateTopic = mqttDiscoveryPrefix + "/sensor/" + mqttNode + "-uptime/state";
  22. const String mqttDiscoUptimeConfigTopic = mqttDiscoveryPrefix + "/sensor/" + mqttNode + "-uptime/config";
  23.  
  24. // The strings below will spill over the PubSubClient_MAX_PACKET_SIZE 128
  25. // You'll need to manually set MQTT_MAX_PACKET_SIZE in PubSubClient.h to 512
  26. const String mqttDiscoBinaryConfigPayload = "{"name": "" + mqttNode + "", "device_class": "connectivity", "state_topic": "" + mqttDiscoBinaryStateTopic + ""}";
  27. const String mqttDiscoSignalConfigPayload = "{"name": "" + mqttNode + "-signal", "state_topic": "" + mqttDiscoSignalStateTopic + "", "unit_of_measurement": "dBm", "value_template": "{{ value }}"}";
  28. const String mqttDiscoUptimeConfigPayload = "{"name": "" + mqttNode + "-uptime", "state_topic": "" + mqttDiscoUptimeStateTopic + "", "unit_of_measurement": "msec", "value_template": "{{ value }}"}";
  29.  
  30. // Set the signal strength and uptime reporting interval in milliseconds
  31. const unsigned long reportInterval = 5000;
  32. unsigned long reportTimer = millis();
  33.  
  34. // Set LED "twinkle" time for maximum daylight visibility
  35. const unsigned long twinkleInterval = 50;
  36. unsigned long twinkleTimer = millis();
  37.  
  38. #include <ESP8266WiFi.h>
  39. #include <ESP8266mDNS.h>
  40. #include <WiFiUdp.h>
  41. #include <ArduinoOTA.h>
  42. #include <PubSubClient.h>
  43.  
  44. WiFiClient wifiClient;
  45. PubSubClient mqttClient(wifiClient);
  46.  
  47. ////////////////////////////////////////////////////////////////////////////////////////////////////
  48. // System setup
  49. void setup() {
  50. pinMode(LED_BUILTIN, OUTPUT);
  51. digitalWrite(LED_BUILTIN, HIGH);
  52. Serial.begin(115200);
  53.  
  54. Serial.println("nHardware initialized, starting program load");
  55.  
  56. // Start up networking
  57. setupWifi();
  58.  
  59. // Create server and assign callbacks for MQTT
  60. mqttClient.setServer(mqttServer, 1883);
  61. mqttClient.setCallback(mqtt_callback);
  62.  
  63. // Start up OTA
  64. if (otaPassword[0]) {
  65. setupOTA();
  66. }
  67.  
  68. Serial.println("Initialization completen");
  69. }
  70.  
  71. ////////////////////////////////////////////////////////////////////////////////////////////////////
  72. // Main execution loop
  73. void loop() {
  74. // check WiFi connection
  75. if (WiFi.status() != WL_CONNECTED) {
  76. setupWifi();
  77. }
  78.  
  79. // check MQTT connection
  80. if (!mqttClient.connected()) {
  81. mqttConnect();
  82. }
  83.  
  84. // MQTT client loop
  85. if (mqttClient.connected()) {
  86. mqttClient.loop();
  87. }
  88.  
  89. // LED twinkle
  90. if (mqttClient.connected() && ((millis() - twinkleTimer) >= twinkleInterval)) {
  91. digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  92. twinkleTimer = millis();
  93. }
  94.  
  95. // Report signal strength and uptime
  96. if (mqttClient.connected() && ((millis() - reportTimer) >= reportInterval)) {
  97. String signalStrength = String(WiFi.RSSI());
  98. String uptimeTimer = String(millis());
  99. mqttClient.publish(mqttDiscoSignalStateTopic.c_str(), signalStrength.c_str());
  100. mqttClient.publish(mqttDiscoUptimeStateTopic.c_str(), uptimeTimer.c_str());
  101. reportTimer = millis();
  102. }
  103.  
  104. // OTA loop
  105. if (otaPassword[0]) {
  106. ArduinoOTA.handle();
  107. }
  108. }
  109.  
  110. ////////////////////////////////////////////////////////////////////////////////////////////////////
  111. // Functions
  112.  
  113. ////////////////////////////////////////////////////////////////////////////////////////////////////
  114. // Handle incoming commands from MQTT
  115. void mqtt_callback(char* topic, byte* payload, unsigned int payloadLength) {
  116. }
  117.  
  118. ////////////////////////////////////////////////////////////////////////////////////////////////////
  119. // Connect to WiFi
  120. void setupWifi() {
  121. Serial.print("Connecting to WiFi network: " + String(wifiSSID));
  122. WiFi.hostname(mqttNode.c_str());
  123. WiFi.mode(WIFI_STA);
  124. WiFi.begin(wifiSSID, wifiPassword);
  125.  
  126. while (WiFi.status() != WL_CONNECTED) {
  127. // Wait 500msec seconds before retrying
  128. delay(500);
  129. Serial.print(".");
  130. }
  131. Serial.println("nWiFi connected successfully and assigned IP: " + WiFi.localIP().toString());
  132. }
  133.  
  134. ////////////////////////////////////////////////////////////////////////////////////////////////////
  135. // MQTT connection and subscriptions
  136. void mqttConnect() {
  137. digitalWrite(LED_BUILTIN, HIGH);
  138. Serial.println("Attempting MQTT connection to broker: " + String(mqttServer));
  139. // Attempt to connect to broker, setting last will and testament
  140. if (mqttClient.connect(mqttNode.c_str(), mqttUser, mqttPassword, mqttDiscoBinaryStateTopic.c_str(), 1, 1, "OFF")) {
  141. // when connected, record signal strength and reset reporting timer
  142. String signalStrength = String(WiFi.RSSI());
  143. reportTimer = millis();
  144. String uptimeTimer = String(millis());
  145. // publish MQTT discovery topics and device state
  146. Serial.println("MQTT discovery connectivity config: [" + mqttDiscoBinaryConfigTopic + "] : [" + mqttDiscoBinaryConfigPayload + "]");
  147. Serial.println("MQTT discovery connectivity state: [" + mqttDiscoBinaryStateTopic + "] : [ON]");
  148. Serial.println("MQTT discovery signal config: [" + mqttDiscoSignalConfigTopic + "] : [" + mqttDiscoSignalConfigPayload + "]");
  149. Serial.println("MQTT discovery signal state: [" + mqttDiscoSignalStateTopic + "] : " + WiFi.RSSI());
  150. Serial.println("MQTT discovery uptime config: [" + mqttDiscoUptimeConfigTopic + "] : [" + mqttDiscoUptimeConfigPayload + "]");
  151. Serial.println("MQTT discovery uptime state: [" + mqttDiscoUptimeStateTopic + "] : " + uptimeTimer);
  152. mqttClient.publish(mqttDiscoUptimeConfigTopic.c_str(), mqttDiscoUptimeConfigPayload.c_str(), true);
  153. mqttClient.publish(mqttDiscoUptimeStateTopic.c_str(), uptimeTimer.c_str());
  154. mqttClient.publish(mqttDiscoBinaryConfigTopic.c_str(), mqttDiscoBinaryConfigPayload.c_str(), true);
  155. mqttClient.publish(mqttDiscoBinaryStateTopic.c_str(), "ON");
  156. mqttClient.publish(mqttDiscoSignalConfigTopic.c_str(), mqttDiscoSignalConfigPayload.c_str(), true);
  157. mqttClient.publish(mqttDiscoSignalStateTopic.c_str(), signalStrength.c_str());
  158. Serial.println("MQTT connected");
  159. digitalWrite(LED_BUILTIN, LOW);
  160. }
  161. else {
  162. Serial.println("MQTT connection failed, rc=" + String(mqttClient.state()));
  163. }
  164. }
  165.  
  166. ////////////////////////////////////////////////////////////////////////////////////////////////////
  167. // (mostly) boilerplate OTA setup from library examples
  168. void setupOTA() {
  169. // Start up OTA
  170. // ArduinoOTA.setPort(8266); // Port defaults to 8266
  171. ArduinoOTA.setHostname(mqttNode.c_str());
  172. ArduinoOTA.setPassword(otaPassword);
  173.  
  174. ArduinoOTA.onStart([]() {
  175. Serial.println("ESP OTA: update start");
  176. });
  177. ArduinoOTA.onEnd([]() {
  178. Serial.println("ESP OTA: update complete");
  179. });
  180. ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
  181. //Serial.printf("Progress: %u%%r", (progress / (total / 100)));
  182. });
  183. ArduinoOTA.onError([](ota_error_t error) {
  184. Serial.println("ESP OTA: ERROR code " + String(error));
  185. if (error == OTA_AUTH_ERROR) Serial.println("ESP OTA: ERROR - Auth Failed");
  186. else if (error == OTA_BEGIN_ERROR) Serial.println("ESP OTA: ERROR - Begin Failed");
  187. else if (error == OTA_CONNECT_ERROR) Serial.println("ESP OTA: ERROR - Connect Failed");
  188. else if (error == OTA_RECEIVE_ERROR) Serial.println("ESP OTA: ERROR - Receive Failed");
  189. else if (error == OTA_END_ERROR) Serial.println("ESP OTA: ERROR - End Failed");
  190. });
  191. ArduinoOTA.begin();
  192. Serial.println("ESP OTA: Over the Air firmware update ready");
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement