-
-
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...