Hello,
I have am working on setting up a temperature and humidity sensor based on the tutorial by
@anaptfox. When testing though, the device says authentication succeeded in the application log, however it doesn’t transmit any data afterward.
I am also getting this readout in the serial monitor:
WiFi connected
IP address:
xxx.xxx.x.x
Authenticating Device...This device is authorized!
Connecting to Losant...-2
.-2
.-2
.-2
.-2
.-2
I have tried removing everything marked “secure” in the code based on this forum thread but still receive the same error. My hardware and the code I am using are listed below. Does anyone have some ideas how I might fix this?
Hardware:
WEMOS D1 Mini Pro
DHT22 Sensor
Sketch:
(source) https://www.losant.com/blog/getting-started-with-the-esp8266-and-dht22-sensor
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <Losant.h>
#define DHTPIN 4 // what digital pin the DHT22 is conected to
#define DHTTYPE DHT22 // There are multiple kinds of DHT sensors
DHT dht(DHTPIN, DHTTYPE);
// WiFi credentials.
const char* WIFI_SSID = "my_wifi_ssid";
const char* WIFI_PASS = "my_password";
// Losant credentials.
const char* LOSANT_DEVICE_ID = "xxxxxx";
const char* LOSANT_ACCESS_KEY = "xxxxxx";
const char* LOSANT_ACCESS_SECRET = "xxxxxx";
WiFiClientSecure wifiClient;
LosantDevice device(LOSANT_DEVICE_ID);
void connect() {
// Connect to Wifi.
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(WIFI_SSID);
// WiFi fix: https://github.com/esp8266/Arduino/issues/2186
WiFi.persistent(false);
WiFi.mode(WIFI_OFF);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
unsigned long wifiConnectStart = millis();
while (WiFi.status() != WL_CONNECTED) {
// Check to see if
if (WiFi.status() == WL_CONNECT_FAILED) {
Serial.println("Failed to connect to WIFI. Please verify credentials: ");
Serial.println();
Serial.print("SSID: ");
Serial.println(WIFI_SSID);
Serial.print("Password: ");
Serial.println(WIFI_PASS);
Serial.println();
}
delay(500);
Serial.println("...");
// Only try for 30 seconds seconds.
if(millis() - wifiConnectStart > 30000) {
Serial.println("Failed to connect to WiFi");
Serial.println("Please attempt to send updated configuration parameters.");
return;
}
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println();
Serial.print("Authenticating Device...");
HTTPClient http;
http.begin("http://api.losant.com/auth/device");
http.addHeader("Content-Type", "application/json");
http.addHeader("Accept", "application/json");
/* Create JSON payload to sent to Losant
*
* {
* "deviceId": "575ecf887ae143cd83dc4aa2",
* "key": "this_would_be_the_key",
* "secret": "this_would_be_the_secret"
* }
*
*/
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["deviceId"] = LOSANT_DEVICE_ID;
root["key"] = LOSANT_ACCESS_KEY;
root["secret"] = LOSANT_ACCESS_SECRET;
String buffer;
root.printTo(buffer);
int httpCode = http.POST(buffer);
if(httpCode > 0) {
if(httpCode == HTTP_CODE_OK) {
Serial.println("This device is authorized!");
} else {
Serial.println("Failed to authorize device to Losant.");
if(httpCode == 400) {
Serial.println("Validation error: The device ID, access key, or access secret is not in the proper format.");
} else if(httpCode == 401) {
Serial.println("Invalid credentials to Losant: Please double-check the device ID, access key, and access secret.");
} else {
Serial.println("Unknown response from API");
}
}
} else {
Serial.println("Failed to connect to Losant API.");
}
http.end();
// Connect to Losant.
Serial.println();
Serial.print("Connecting to Losant...");
device.connectSecure(wifiClient, LOSANT_ACCESS_KEY, LOSANT_ACCESS_SECRET);
while(!device.connected()) {
delay(500);
Serial.println(device.mqttClient.state()); // HERE
Serial.print(".");
}
Serial.println("Connected!");
Serial.println();
Serial.println("This device is now ready for use!");
}
void setup() {
Serial.begin(115200);
Serial.setTimeout(2000);
// Wait for serial to initialize.
while(!Serial) { }
Serial.println("Device Started");
Serial.println("-------------------------------------");
Serial.println("Running DHT!");
Serial.println("-------------------------------------");
connect();
}
void report(double humidity, double tempC, double tempF, double heatIndexC, double heatIndexF) {
StaticJsonBuffer<500> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["humidity"] = humidity;
root["tempC"] = tempC;
root["tempF"] = tempF;
root["heatIndexC"] = heatIndexC;
root["heatIndexF"] = heatIndexF;
device.sendState(root);
Serial.println("Reported!");
}
int timeSinceLastRead = 0;
void loop() {
bool toReconnect = false;
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Disconnected from WiFi");
toReconnect = true;
}
if (!device.connected()) {
Serial.println("Disconnected from MQTT");
Serial.println(device.mqttClient.state());
toReconnect = true;
}
if (toReconnect) {
connect();
}
device.loop();
// Report every 15 minutes.
if(timeSinceLastRead > 900000) {
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true) - 4;
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
timeSinceLastRead = 0;
return;
}
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
report(h, t, f, hic, hif);
timeSinceLastRead = 0;
}
delay(100);
timeSinceLastRead += 100;
}