Domotique/WifiControlSensor/MQTT.ino
2016-03-22 23:39:30 +01:00

123 lines
3.2 KiB
C++

// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;
Adafruit_MQTT_Client *mqtt;
Adafruit_MQTT_Publish *mqtt_temp;
Adafruit_MQTT_Publish *mqtt_pressure;
#define NB_ELEMENTS(x) (sizeof(x)/ sizeof(x[0]))
const char TEMPERATURE_FEED[] = "/feeds/temperature";
const char PRESSURE_FEED[] = "/feeds/pressure";
// Should have less that MAXSUBSCRIPTIONS elements
// MAXSUBSCRIPTIONS is defined is Adafruit_mqtt.h
const int gpioWatched[] = {2};
#define GPIO_BASE "/feeds/gpio/"
const char *GPIO_FEED[] = { GPIO_BASE"2"};
const char *GPIO_SET_FEED[] = { GPIO_BASE"2/set"};
Adafruit_MQTT_Publish * mqttGpio[MAXSUBSCRIPTIONS] = {};
const char PUMP_CMD[] = "/feeds/pump/set";
boolean mqttIsConfigured = false;
int setupMQTT(char *server, char *user, char *passwd, int port) {
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
mqtt = new Adafruit_MQTT_Client(&client, server, port, user, passwd);
mqtt_temp = new Adafruit_MQTT_Publish(mqtt, TEMPERATURE_FEED);
mqtt_pressure = new Adafruit_MQTT_Publish(mqtt, PRESSURE_FEED);
for (int i = 0 ; i < NB_ELEMENTS(gpioWatched); i++) {
Adafruit_MQTT_Subscribe *gpioSet = new Adafruit_MQTT_Subscribe(mqtt, GPIO_SET_FEED[i]);
mqtt->subscribe(gpioSet);
Adafruit_MQTT_Publish *gpio = new Adafruit_MQTT_Publish(mqtt, GPIO_FEED[i]);
mqttGpio[i] = gpio;
}
return 0;
}
int MQTT_isConnected() {
return mqtt->connected();
}
// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
int MQTT_connect() {
int8_t ret;
// Stop if already connected.
if (mqtt->connected()) {
return 0;
}
uint8_t retries = 3;
while ((ret = mqtt->connect()) != 0) { // connect will return 0 for connected
Serial.println(mqtt->connectErrorString(ret));
Serial.println("Retrying MQTT connection ...");
mqtt->disconnect();
delay(100); // wait
retries--;
if (retries == 0) {
return -1;
}
}
return 0;
}
int publishMQTT(double temp, double pressure) {
if (MQTT_connect() == 0) {
Serial.println("publishing !");
mqtt_temp->publish(temp);
mqtt_pressure->publish(pressure);
}
return 0;
}
int getGpioFromSubscription(Adafruit_MQTT_Subscribe *subscription) {
if(!strstr(subscription->topic, GPIO_BASE))
return -1;
String gpioStr(subscription->topic+strlen(GPIO_BASE));
int idx = gpioStr.indexOf("/");
int gpio = gpioStr.substring(idx).toInt();
if(gpio >= 0 && gpio < 32 )
return gpio;
else
return -1;
}
bool isGpioWatched(int gpio) {
return false;
}
void checkMqttSubscription() {
if (MQTT_connect() == 0) {
Adafruit_MQTT_Subscribe *subscription;
while (subscription = mqtt->readSubscription(0)) {
int gpio = getGpioFromSubscription(subscription);
if (gpio > 0 && isGpioWatched(gpio)) {
char *value = (char *) subscription->lastread;
}
}
}
}
//char *mqttGetSubData() {
// return (char *)pumpButton->lastread;
//}
//
//Adafruit_MQTT_Subscribe *subscription;
//bool mqttSubAvailable() {
// if (MQTT_connect() == 0) {
// subscription = mqtt->readSubscription(0);
// if (subscription == pumpButton) {
// return true;
// }
// }
// return false;
//}