-
-
Save balloob/1176b6d87c2816bd07919ce6e29a19e9 to your computer and use it in GitHub Desktop.
| // Get ESP8266 going with Arduino IDE | |
| // - https://github.com/esp8266/Arduino#installing-with-boards-manager | |
| // Required libraries (sketch -> include library -> manage libraries) | |
| // - PubSubClient by Nick ‘O Leary | |
| // - DHT sensor library by Adafruit | |
| #include <ESP8266WiFi.h> | |
| #include <PubSubClient.h> | |
| #include <DHT.h> | |
| #define wifi_ssid "YOUR WIFI SSID" | |
| #define wifi_password "WIFI PASSWORD" | |
| #define mqtt_server "YOUR_MQTT_SERVER_HOST" | |
| #define mqtt_user "your_username" | |
| #define mqtt_password "your_password" | |
| #define humidity_topic "sensor/humidity" | |
| #define temperature_topic "sensor/temperature" | |
| #define DHTTYPE DHT22 | |
| #define DHTPIN 14 | |
| WiFiClient espClient; | |
| PubSubClient client(espClient); | |
| DHT dht(DHTPIN, DHTTYPE, 11); // 11 works fine for ESP8266 | |
| void setup() { | |
| Serial.begin(115200); | |
| dht.begin(); | |
| setup_wifi(); | |
| client.setServer(mqtt_server, 1883); | |
| } | |
| void setup_wifi() { | |
| delay(10); | |
| // We start by connecting to a WiFi network | |
| Serial.println(); | |
| Serial.print("Connecting to "); | |
| Serial.println(wifi_ssid); | |
| WiFi.begin(wifi_ssid, wifi_password); | |
| while (WiFi.status() != WL_CONNECTED) { | |
| delay(500); | |
| Serial.print("."); | |
| } | |
| Serial.println(""); | |
| Serial.println("WiFi connected"); | |
| Serial.println("IP address: "); | |
| Serial.println(WiFi.localIP()); | |
| } | |
| void reconnect() { | |
| // Loop until we're reconnected | |
| while (!client.connected()) { | |
| Serial.print("Attempting MQTT connection..."); | |
| // Attempt to connect | |
| // If you do not want to use a username and password, change next line to | |
| // if (client.connect("ESP8266Client")) { | |
| if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) { | |
| Serial.println("connected"); | |
| } else { | |
| Serial.print("failed, rc="); | |
| Serial.print(client.state()); | |
| Serial.println(" try again in 5 seconds"); | |
| // Wait 5 seconds before retrying | |
| delay(5000); | |
| } | |
| } | |
| } | |
| bool checkBound(float newValue, float prevValue, float maxDiff) { | |
| return !isnan(newValue) && | |
| (newValue < prevValue - maxDiff || newValue > prevValue + maxDiff); | |
| } | |
| long lastMsg = 0; | |
| float temp = 0.0; | |
| float hum = 0.0; | |
| float diff = 1.0; | |
| void loop() { | |
| if (!client.connected()) { | |
| reconnect(); | |
| } | |
| client.loop(); | |
| long now = millis(); | |
| if (now - lastMsg > 2000) { | |
| lastMsg = now; | |
| float newTemp = dht.readTemperature(); | |
| float newHum = dht.readHumidity(); | |
| if (checkBound(newTemp, temp, diff)) { | |
| temp = newTemp; | |
| Serial.print("New temperature:"); | |
| Serial.println(String(temp).c_str()); | |
| client.publish(temperature_topic, String(temp).c_str(), true); | |
| } | |
| if (checkBound(newHum, hum, diff)) { | |
| hum = newHum; | |
| Serial.print("New humidity:"); | |
| Serial.println(String(hum).c_str()); | |
| client.publish(humidity_topic, String(hum).c_str(), true); | |
| } | |
| } | |
| } |
i think it's the MQTT_CALLBACK_SIGNATURE in pubsubclient. they are both being set to the same ID, so the MQTT server thinks you are already connected. when I unplug my 1st nodemcu the 2nd nodemcu stops getting the error. so it seems to be a first come, first serve(r)ed.
the script needs a way to pass in a DEVICE_ID of some kind to pubsubclient, so that it can used in the signature to differentiate them. not sure how to add that, python isn't my thing.
--stone
well, it seems i spoke too soon, it does have a DEVICE_ID.
line 62: change "ESP8266Client" to "whateverYouLike2"
just so long as it's unique.
then both nodes should play well with each other.
I am successfully using this, but the temp and humidty values it reports are VERY jittery. Does anyone have a way to clean them up a little?
Depending on their values, taking an average could work.
Yes, that's perfect, but I don't know how to implement it with HomeAssistant Generic Thermostat, it requires a float, and don't know how change the code to do that...