diff --git a/WifiControlSensor/MQTT.ino b/WifiControlSensor/MQTT.ino index a545e55..2a5a07b 100644 --- a/WifiControlSensor/MQTT.ino +++ b/WifiControlSensor/MQTT.ino @@ -3,6 +3,7 @@ #include "utils.h" #include "MQTT.h" +#define MAX_GPIO_OBSERVED (MAXSUBSCRIPTIONS*2) Adafruit_MQTT_Client *mqtt; Adafruit_MQTT_Publish *mqtt_temp; Adafruit_MQTT_Publish *mqtt_pressure; @@ -12,6 +13,7 @@ Adafruit_MQTT_Publish *mqtt_dry; Adafruit_MQTT_Publish *mqtt_ip; Adafruit_MQTT_Publish *mqttGpio[MAXSUBSCRIPTIONS] = {}; Adafruit_MQTT_Publish *mqttPwm[MAXSUBSCRIPTIONS] = {}; +Adafruit_MQTT_Publish *mqttGpioObserved[MAX_GPIO_OBSERVED] = {}; #define FEED_MAX_SIZE 96 @@ -27,11 +29,6 @@ Adafruit_MQTT_Publish *mqttPwm[MAXSUBSCRIPTIONS] = {}; #define PWM_SET_FEED_FORMAT "/feeds/%s/%s/gpio/%d/set" #define IP_FEED_FORMAT "/feeds/%s/%s/configuration/ip/addr" -// Should have less that MAXSUBSCRIPTIONS elements -// MAXSUBSCRIPTIONS is defined is Adafruit_mqtt.h -const int gpioControlled[] = CONFIG_CONTROLLED_GPIO; -const int pwmWatched[] = CONFIG_CONTROLLED_PWM; - char *mqttId; bool isMqttConfigured = false; @@ -60,21 +57,31 @@ int MqttSetup(char *server, char *user, char *passwd, int port, char *hostname) mqtt_dry = MqttCreatePublisher(DRY_FEED_FORMAT, user, mqttId); mqtt_ip = MqttCreatePublisher(IP_FEED_FORMAT, user, mqttId); - if( NB_ELEMENTS(gpioControlled) + NB_ELEMENTS(pwmWatched) > MAXSUBSCRIPTIONS){ + if (NB_ELEMENTS(gpioControlled) + NB_ELEMENTS(pwmControlled) > MAXSUBSCRIPTIONS){ SKETCH_DEBUG_PRINTF("Too much gpio/pwm to control\n Nb gpio %d Nb pwm %d Max is %d", - NB_ELEMENTS(gpioControlled), NB_ELEMENTS(pwmWatched), MAXSUBSCRIPTIONS); + NB_ELEMENTS(gpioControlled), NB_ELEMENTS(pwmControlled), MAXSUBSCRIPTIONS); + return -1; + } + if (NB_ELEMENTS(gpioObserved) > MAX_GPIO_OBSERVED){ + SKETCH_DEBUG_PRINTF("Too much gpio observed\n Nb gpio %d Nb is %d", + NB_ELEMENTS(gpioObserved), MAX_GPIO_OBSERVED); return -1; } - for (uint i = 0 ; i < NB_ELEMENTS(gpioControlled) && i < MAXSUBSCRIPTIONS; i++) { + for (uint i = 0 ; i < NB_ELEMENTS(gpioControlled); i++) { mqtt->subscribe(MqttCreateSubscribe(GPIO_SET_FEED_FORMAT, user, mqttId, gpioControlled[i])); mqttGpio[i] = MqttCreatePublisher(GPIO_FEED_FORMAT, user, mqttId, gpioControlled[i]); } - for (uint i = 0 ; i < NB_ELEMENTS(gpioControlled) && i < MAXSUBSCRIPTIONS; i++) { - mqtt->subscribe(MqttCreateSubscribe(PWM_SET_FEED_FORMAT, user, mqttId, pwmWatched[i])); - mqttPwm[i] = MqttCreatePublisher(PWM_FEED_FORMAT, user, mqttId, pwmWatched[i]); + for (uint i = 0 ; i < NB_ELEMENTS(gpioObserved) && i < MAX_GPIO_OBSERVED ; i++) { + mqttGpioObserved[i] = MqttCreatePublisher(GPIO_FEED_FORMAT, user, mqttId, gpioObserved[i]); } + + for (uint i = 0 ; i < NB_ELEMENTS(pwmControlled); i++) { + mqtt->subscribe(MqttCreateSubscribe(PWM_SET_FEED_FORMAT, user, mqttId, pwmControlled[i])); + mqttPwm[i] = MqttCreatePublisher(PWM_FEED_FORMAT, user, mqttId, pwmControlled[i]); + } + return 0; } @@ -97,7 +104,7 @@ Adafruit_MQTT_Subscribe *MqttCreateSubscribe(const char *fmt, ...){ } int MqttIsConnected() { - return (isMqttConfigured) ? mqtt->connected() : 0; + return (isMqttConfigured && (mode == BOOTMODE_NORMAL)) ? mqtt->connected() : 0; } // Function to connect and reconnect as necessary to the MQTT server. @@ -105,7 +112,7 @@ int MqttIsConnected() { int MqttConnect() { int8_t ret; - if(!isMqttConfigured) + if (!isMqttConfigured || mode != BOOTMODE_NORMAL) return -1; // Stop if already connected. @@ -166,9 +173,15 @@ int getGpioFromSubscription(Adafruit_MQTT_Subscribe *subscription, const char *p } void MqttNofity(int gpio, int value){ - int watchIdx = findIndex(gpio, gpioControlled); - if (watchIdx >= 0 && isMqttConfigured) { - mqttGpio[watchIdx]->publish(value); + if (MqttIsConnected()) { + int watchIdx = findIndex(gpio, gpioControlled); + if (watchIdx >= 0 ) { + mqttGpio[watchIdx]->publish(value); + } else { + watchIdx = findIndex(gpio, gpioObserved); + if (watchIdx >= 0 ) + mqttGpioObserved[watchIdx]->publish(value); + } } } @@ -196,7 +209,7 @@ void MqttCheckSubscription() { } gpio = getGpioFromSubscription(subscription, "/pwm/"); - if (gpio > 0 && findIndex(gpio, pwmWatched) >= 0) { + if (gpio > 0 && findIndex(gpio, pwmControlled) >= 0) { SKETCH_DEBUG_PRINTF("Got Subscription for PWM %d\n", gpio); char *value = (char *) subscription->lastread; SKETCH_DEBUG_PRINTF("Receive data: %s\n", value); diff --git a/WifiControlSensor/WebServer.ino b/WifiControlSensor/WebServer.ino index 3cc32cd..baa023c 100644 --- a/WifiControlSensor/WebServer.ino +++ b/WifiControlSensor/WebServer.ino @@ -1,6 +1,4 @@ #ifndef CONFIG_DISABLE_WEB -const int gpioWebConf[] = CONFIG_CONTROLLED_GPIO; -const int pwmWebConf[] = CONFIG_CONTROLLED_PWM; String gpioControlHTML = ""; String pwmControlHTML = ""; @@ -234,26 +232,26 @@ void WebHandleWifiStatus() { } void WebBuildGpioControl(){ - if (NB_ELEMENTS(gpioWebConf) > 0){ + if (NB_ELEMENTS(gpioControlled) > 0){ gpioControlHTML += "
" "Relay"; - for (uint i = 0 ; i < NB_ELEMENTS(gpioWebConf) ; i++) { - gpioControlHTML += "Relay " + String(gpioWebConf[i]) + " " + "ON/"; - gpioControlHTML += "OFF
"; + for (uint i = 0 ; i < NB_ELEMENTS(gpioControlled) ; i++) { + gpioControlHTML += "Relay " + String(gpioControlled[i]) + " " + "ON/"; + gpioControlHTML += "OFF
"; } gpioControlHTML += "
"; } } void WebBuildPwmControl(){ - if (NB_ELEMENTS(pwmWebConf) > 0){ + if (NB_ELEMENTS(pwmControlled) > 0){ pwmControlHTML += "
" "PWM"; - for (uint i = 0 ; i < NB_ELEMENTS(pwmWebConf) ; i++) { - pwmControlHTML += "PWM " + String(pwmWebConf[i]) + "
"; + for (uint i = 0 ; i < NB_ELEMENTS(pwmControlled) ; i++) { + pwmControlHTML += "PWM " + String(pwmControlled[i]) + "
"; pwmControlHTML += ""; + "onChange=\"setPWM(this.value," + String(pwmControlled[i]) + ")\" />"; } pwmControlHTML += "