diff --git a/platformio.ini b/platformio.ini index 0074e59..1995297 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,6 +12,7 @@ platform = espressif32 board = wt32-eth01 framework = arduino +board_build.f_cpu = 240000000L lib_deps = siwats/ESPMegaPROR3@^1.3.0 knolleary/PubSubClient@^2.8 ivanseidel/ArduinoThread@^2.1.1 diff --git a/src/espmega_iot_core.cpp b/src/espmega_iot_core.cpp index 689ed12..587adad 100644 --- a/src/espmega_iot_core.cpp +++ b/src/espmega_iot_core.cpp @@ -159,6 +159,7 @@ void setup() lcd_send_command("boot_state.txt=\"IoT Core Initializing . . .\""); mqtt.setSocketTimeout(1000); eth.setTimeout(1); + mqtt.setCallback(&mqtt_callback); mqtt_connect(); lcd_send_command("boot_state.txt=\"Threads Initializing . . .\""); thread_initialization(); @@ -518,18 +519,29 @@ void mqtt_subscribe() mqtt.subscribe(STATE_REQUEST_TOPIC); } -void mqtt_callback(char* topic, char* payload, unsigned int length) { +void mqtt_callback(char *topic, byte *payload, unsigned int length) +{ uint8_t topic_length = strlen(topic); char topic_trim[50]; - strncpy(topic_trim, topic+topic_length, topic_length); - // PWM Callback - if((!strncmp(topic_trim,"/pwm/",5)) && !strncmp(topic_trim+7,"/set/state",10)) { - pwm_state_callback(topic_trim, topic_length,payload,length); + char payload_nt[length + 1]; + memcpy(payload_nt, payload, length); + payload_nt[length] = NULL; + strncpy(topic_trim, topic + base_topic_length - 1, topic_length); + if ((!strncmp(topic_trim, "/pwm/", 5)) && !strncmp(topic_trim + 7, "/set/state", 10)) + { + pwm_state_callback(topic_trim, topic_length, payload_nt, length); } - else if((!strncmp(topic_trim,"/pwm/",5)) && !strncmp(topic_trim+7,"/set/value",10)) { - pwm_value_callback(topic_trim, topic_length,payload,length); + else if ((!strncmp(topic_trim, "/pwm/", 5)) && !strncmp(topic_trim + 7, "/set/value", 10)) + { + pwm_value_callback(topic_trim, topic_length, payload_nt, length); + } else if(!strcmp(topic,STATE_REQUEST_TOPIC)) { + state_request_callback(); } - user_mqtt_callback(topic_trim,topic_length, payload, length); + else + { + ac_state_callback(topic, topic_length, payload_nt, length); + } + user_mqtt_callback(topic_trim, topic_length, payload_nt, length); } void thread_initialization() @@ -548,22 +560,22 @@ void thread_initialization() user_timer_tick.setInterval(15000); } -void pwm_state_callback(char* topic, uint8_t topic_length, char* payload, unsigned int payload_length) +void pwm_state_callback(char *topic, uint8_t topic_length, char *payload, unsigned int payload_length) { int a = topic[5] - '0'; int b = topic[6] - '0'; int id = 10 * a + b; - if (!strcmp(payload,"on")) + if (!strcmp(payload, "on")) { pwm_set_state(id, true); } - else if (!strcmp(payload,"off")) + else if (!strcmp(payload, "off")) { pwm_set_state(id, false); } } -void pwm_value_callback(char* topic, uint8_t topic_length, char* payload, unsigned int payload_length) +void pwm_value_callback(char *topic, uint8_t topic_length, char *payload, unsigned int payload_length) { int a = topic[5] - '0'; int b = topic[6] - '0'; @@ -629,7 +641,7 @@ void publish_pwm_state(int id) mqtt.publish(PWM_STATE_TOPIC, "off"); } char temp[6]; - itoa(value,temp,6); + itoa(value, temp, DEC); mqtt.publish(PWM_VALUE_TOPIC, temp); } @@ -740,7 +752,7 @@ void publish_input_state(int id, int state) mqtt.publish(INPUTS_TOPIC, state ? "1" : "0"); } -void state_request_callback(String topic, String message) +void state_request_callback() { publish_input_states(); publish_pwm_states(); @@ -777,7 +789,7 @@ void publish_ac_state() break; } char temp[5]; - itoa(ac_temperature,temp,DEC); + itoa(ac_temperature, temp, DEC); mqtt.publish(AC_TEMPERATURE_TOPIC, temp); switch (ac_fan_speed) { @@ -794,49 +806,48 @@ void publish_ac_state() mqtt.publish(AC_FAN_TOPIC, "low"); break; } - } -void ac_state_callback(String topic, String message) +void ac_state_callback(char *topic, uint8_t topic_length, char *payload, unsigned int payload_length) { - if (topic.compareTo(String(AC_SET_TEMPERATURE_TOPIC)) == 0) + if (!strcmp(topic, AC_SET_TEMPERATURE_TOPIC)) { - int new_temp = message.toInt(); + int new_temp = atoi(payload); if (new_temp >= AC_MIN_TEMPERATURE && new_temp <= AC_MAX_TEMPERATURE) { ac_set_state(ac_mode, new_temp, ac_fan_speed); } } - else if (topic.compareTo(String(AC_SET_MODE_TOPIC)) == 0) + else if (!strcmp(topic, AC_SET_MODE_TOPIC)) { - if (message.compareTo("off") == 0) + if (!strcmp(payload, "off")) { ac_set_state(0, ac_temperature, ac_fan_speed); } - else if (message.compareTo("cool") == 0) + else if (!strcmp(payload, "cool")) { ac_set_state(1, ac_temperature, ac_fan_speed); } - else if (message.compareTo("fan_only") == 0) + else if (!strcmp(payload, "fan_only")) { ac_set_state(2, ac_temperature, ac_fan_speed); } } - else if (topic.compareTo(String(AC_SET_FAN_TOPIC)) == 0) + else if (!strcmp(topic, AC_SET_FAN_TOPIC)) { - if (message.compareTo("auto") == 0) + if (!strcmp(payload, "auto")) { ac_set_state(ac_mode, ac_temperature, 0); } - else if (message.compareTo("low") == 0) + else if (!strcmp(payload, "low")) { ac_set_state(ac_mode, ac_temperature, 1); } - else if (message.compareTo("med") == 0) + else if (!strcmp(payload, "med")) { ac_set_state(ac_mode, ac_temperature, 2); } - else if (message.compareTo("high") == 0) + else if (!strcmp(payload, "high")) { ac_set_state(ac_mode, ac_temperature, 3); } diff --git a/src/espmega_iot_core.hpp b/src/espmega_iot_core.hpp index 1d24dab..42582ed 100644 --- a/src/espmega_iot_core.hpp +++ b/src/espmega_iot_core.hpp @@ -43,7 +43,7 @@ void mqtt_subscribe(); void thread_initialization(); void pwm_state_callback(char* topic, uint8_t topic_length, char* payload, unsigned int payload_length); void pwm_value_callback(char* topic, uint8_t topic_length, char* payload, unsigned int payload_length); -void state_request_callback(String topic, String message); +void state_request_callback(); void io_begin(); void ir_loop(); @@ -66,7 +66,7 @@ void publish_env_state(); uint8_t ac_get_temperature(); uint8_t ac_get_mode(); uint8_t ac_get_fan_speed(); -void ac_state_callback(String topic, String message); +void ac_state_callback(char* topic, uint8_t topic_length, char* payload, unsigned int payload_length); void ac_set_state(int mode, int temperature, int fan_speed); void publish_input_states();