diff -r 115e93bf8796 -r 1659bd3c7a2b main/task_mqtt.c --- a/main/task_mqtt.c Fri Mar 31 21:12:39 2023 +0200 +++ b/main/task_mqtt.c Sat Apr 01 21:06:59 2023 +0200 @@ -39,6 +39,11 @@ extern float solarCurrent; extern float solarPower; +extern uint8_t Relay1; +extern uint8_t Relay2; +extern uint8_t Dimmer3; +extern uint8_t Dimmer4; + void connect_mqtt(bool state) { @@ -133,6 +138,11 @@ +bool do_event_data(char *check, char *topic, char *data) { + return false; +} + + void publish(void) { char *topic = NULL, *payload = NULL, buf[64]; @@ -190,13 +200,17 @@ xSemaphoreGive(xSemaphoreBMP280); } payload = xstrcat(payload, (char *)"},\"output\":{\"relay1\":"); - + sprintf(buf, "%d", Relay1); + payload = xstrcat(payload, buf); payload = xstrcat(payload, (char *)",\"relay2\":"); - + sprintf(buf, "%d", Relay2); + payload = xstrcat(payload, buf); payload = xstrcat(payload, (char *)",\"dimmer3\":"); - + sprintf(buf, "%d", Dimmer3); + payload = xstrcat(payload, buf); payload = xstrcat(payload, (char *)",\"dimmer4\":"); - + sprintf(buf, "%d", Dimmer4); + payload = xstrcat(payload, buf); payload = xstrcat(payload, (char *)"}}"); topic = topic_base(); topic = xstrcat(topic, (char *)"status"); @@ -212,14 +226,18 @@ static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event) { + char *topic = NULL; + nvs_handle_t my_handle; + switch (event->event_id) { case MQTT_EVENT_CONNECTED: ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); - char *topic = topic_base(); + topic = topic_base(); topic = xstrcat(topic, (char *)"output/set/#"); ESP_LOGI(TAG, "Subscribe `%s' id %d", topic, esp_mqtt_client_subscribe(client, topic, 0)); free(topic); + topic = NULL; xEventGroupSetBits(xEventGroupMQTT, TASK_MQTT_CONNECTED); xEventGroupClearBits(xEventGroupMQTT, TASK_MQTT_DISCONNECTED); break; @@ -251,9 +269,91 @@ break; case MQTT_EVENT_DATA: - ESP_LOGI(TAG, "MQTT_EVENT_DATA"); - printf("TOPIC=%.*s ", event->topic_len, event->topic); - printf("DATA=%.*s\r\n", event->data_len, event->data); + ESP_LOGI(TAG, "MQTT_EVENT_DATA len=%d", event->data_len); + bool gotit = false; + esp_err_t err; + char data[65]; + if (event->data_len < 65) + snprintf(data, 64, "%.*s", event->data_len, event->data); + else + data[0] = '\0'; + + topic = topic_base(); + topic = xstrcat(topic, (char *)"output/set/1"); + if (strncmp(topic, event->topic, event->topic_len) == 0) { + ESP_LOGI(TAG, "Got %s `%s' %d", topic, data, atoi(data)); + gotit = true; + if ((uint8_t)atoi(data) != Relay1) { + Relay1 = (uint8_t)atoi(data); + err = nvs_open("balkon", NVS_READWRITE, &my_handle); + if (err == ESP_OK) { + nvs_set_u8(my_handle, (char *)"out1", Relay1); + nvs_commit(my_handle); + nvs_close(my_handle); + } + } + } + free(topic); + topic = NULL; + + topic = topic_base(); + topic = xstrcat(topic, (char *)"output/set/2"); + if (strncmp(topic, event->topic, event->topic_len) == 0) { + ESP_LOGI(TAG, "Got %s `%s' %d", topic, data, atoi(data)); + gotit = true; + if ((uint8_t)atoi(data) != Relay2) { + Relay2 = (uint8_t)atoi(data); + err = nvs_open("balkon", NVS_READWRITE, &my_handle); + if (err == ESP_OK) { + nvs_set_u8(my_handle, (char *)"out2", Relay2); + nvs_commit(my_handle); + nvs_close(my_handle); + } + } + } + free(topic); + topic = NULL; + + topic = topic_base(); + topic = xstrcat(topic, (char *)"output/set/3"); + if (strncmp(topic, event->topic, event->topic_len) == 0) { + ESP_LOGI(TAG, "Got %s `%s' %d", topic, data, atoi(data)); + gotit = true; + if ((uint8_t)atoi(data) != Dimmer3) { + Dimmer3 = (uint8_t)atoi(data); + err = nvs_open("balkon", NVS_READWRITE, &my_handle); + if (err == ESP_OK) { + nvs_set_u8(my_handle, (char *)"out3", Dimmer3); + nvs_commit(my_handle); + nvs_close(my_handle); + } + } + } + free(topic); + topic = NULL; + + topic = topic_base(); + topic = xstrcat(topic, (char *)"output/set/4"); + if (strncmp(topic, event->topic, event->topic_len) == 0) { + ESP_LOGI(TAG, "Got %s `%s' %d", topic, data, atoi(data)); + gotit = true; + if ((uint8_t)atoi(data) != Dimmer4) { + Dimmer4 = (uint8_t)atoi(data); + err = nvs_open("balkon", NVS_READWRITE, &my_handle); + if (err == ESP_OK) { + nvs_set_u8(my_handle, (char *)"out4", Dimmer4); + nvs_commit(my_handle); + nvs_close(my_handle); + } + } + } + free(topic); + topic = NULL; + + if (! gotit) { + printf("TOPIC=%.*s ", event->topic_len, event->topic); + printf("DATA=%.*s\r\n", event->data_len, event->data); + } break; case MQTT_EVENT_ERROR: