Browse Source

Looks like its working mqtt and http-get with relay ctrl.

Thomas Chef 2 years ago
parent
commit
649c921adf
11 changed files with 88 additions and 220 deletions
  1. 0 2
      main/CMakeLists.txt
  2. 1 3
      main/config.h
  3. 63 28
      main/http_client.c
  4. 2 1
      main/http_client.h
  5. 6 1
      main/kWhCounter.c
  6. 15 11
      main/main.c
  7. 1 1
      main/mqtt.c
  8. 0 43
      main/relay_control.c
  9. 0 10
      main/relay_control.h
  10. 0 94
      main/send.c
  11. 0 26
      main/send.h

+ 0 - 2
main/CMakeLists.txt

@@ -2,8 +2,6 @@ idf_component_register(SRCS
 "http_client.c" "mqtt.c" "wifi.c"
 "http_client.c" "mqtt.c" "wifi.c"
 "main.c"
 "main.c"
 "wifi.c" "mqtt.c"
 "wifi.c" "mqtt.c"
-"send.c"
-"relay_control.c"
 "kWhCounter.c"
 "kWhCounter.c"
 
 
 
 

+ 1 - 3
main/config.h

@@ -8,9 +8,7 @@
 // These defines configures which code to generate (to save download time during development)
 // These defines configures which code to generate (to save download time during development)
 #define WIFI_ENABLED
 #define WIFI_ENABLED
 #define HTTP_ENABLED
 #define HTTP_ENABLED
-//#define MQTT_ENABLED
-//#define ENABLE_SEND
-#define ENABLE_RELAY_OUTPUT
+#define MQTT_ENABLED
 #define ENABLE_KWH_COUNTER
 #define ENABLE_KWH_COUNTER
 
 
 #define VVB_RELAY_OUTPUT_IO      GPIO_NUM_22   // Output GPIO of a relay control of VVB
 #define VVB_RELAY_OUTPUT_IO      GPIO_NUM_22   // Output GPIO of a relay control of VVB

+ 63 - 28
main/http_client.c

@@ -19,14 +19,10 @@
 #define MAX_HTTP_RECV_BUFFER 512
 #define MAX_HTTP_RECV_BUFFER 512
 static const char *TAG = "HTTP_CLIENT";
 static const char *TAG = "HTTP_CLIENT";
 
 
-typedef struct {
-	double energyData_kWh;
-    uint32_t bigCnt;
-    int32_t cnt;
-} sensor_data;
-
 esp_err_t _http_event_handler(esp_http_client_event_t *evt)
 esp_err_t _http_event_handler(esp_http_client_event_t *evt)
 {
 {
+    static char *output_buffer;  // Buffer to store response of http request from event handler
+    static int output_len;       // Stores number of bytes read
     switch(evt->event_id) {
     switch(evt->event_id) {
         case HTTP_EVENT_ERROR:
         case HTTP_EVENT_ERROR:
             ESP_LOGD(TAG, "HTTP_EVENT_ERROR");
             ESP_LOGD(TAG, "HTTP_EVENT_ERROR");
@@ -42,64 +38,103 @@ esp_err_t _http_event_handler(esp_http_client_event_t *evt)
             break;
             break;
         case HTTP_EVENT_ON_DATA:
         case HTTP_EVENT_ON_DATA:
             ESP_LOGD(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
             ESP_LOGD(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
+            /*
+             *  Check for chunked encoding is added as the URL for chunked encoding used in this example returns binary data.
+             *  However, event handler can also be used in case chunked encoding is used.
+             */
             if (!esp_http_client_is_chunked_response(evt->client)) {
             if (!esp_http_client_is_chunked_response(evt->client)) {
-                // Write out data
-                // printf("%.*s", evt->data_len, (char*)evt->data);
+                // If user_data buffer is configured, copy the response into the buffer
+                if (evt->user_data) {
+                    memcpy(evt->user_data + output_len, evt->data, evt->data_len);
+                } else {
+                    if (output_buffer == NULL) {
+                        output_buffer = (char *) malloc(esp_http_client_get_content_length(evt->client));
+                        output_len = 0;
+                        if (output_buffer == NULL) {
+                            ESP_LOGE(TAG, "Failed to allocate memory for output buffer");
+                            return ESP_FAIL;
+                        }
+                    }
+                    memcpy(output_buffer + output_len, evt->data, evt->data_len);
+                }
+                output_len += evt->data_len;
             }
             }
 
 
             break;
             break;
         case HTTP_EVENT_ON_FINISH:
         case HTTP_EVENT_ON_FINISH:
             ESP_LOGD(TAG, "HTTP_EVENT_ON_FINISH");
             ESP_LOGD(TAG, "HTTP_EVENT_ON_FINISH");
+            if (output_buffer != NULL) {
+                // Response is accumulated in output_buffer. Uncomment the below line to print the accumulated response
+                //ESP_LOG_BUFFER_HEX(TAG, output_buffer, output_len);
+                free(output_buffer);
+                output_buffer = NULL;
+            }
+            output_len = 0;
             break;
             break;
         case HTTP_EVENT_DISCONNECTED:
         case HTTP_EVENT_DISCONNECTED:
-            ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED");
+            ESP_LOGD(TAG, "HTTP_EVENT_DISCONNECTED");
             int mbedtls_err = 0;
             int mbedtls_err = 0;
             esp_err_t err = esp_tls_get_and_clear_last_error(evt->data, &mbedtls_err, NULL);
             esp_err_t err = esp_tls_get_and_clear_last_error(evt->data, &mbedtls_err, NULL);
             if (err != 0) {
             if (err != 0) {
                 ESP_LOGI(TAG, "Last esp error code: 0x%x", err);
                 ESP_LOGI(TAG, "Last esp error code: 0x%x", err);
                 ESP_LOGI(TAG, "Last mbedtls failure: 0x%x", mbedtls_err);
                 ESP_LOGI(TAG, "Last mbedtls failure: 0x%x", mbedtls_err);
             }
             }
+            if (output_buffer != NULL) {
+                free(output_buffer);
+                output_buffer = NULL;
+            }
+            output_len = 0;
             break;
             break;
     }
     }
     return ESP_OK;
     return ESP_OK;
 }
 }
 
 
-static void http_rest_with_url(void *pvParameters)
+void http_rest_with_url()
 {
 {
+    char local_response_buffer[MAX_HTTP_RECV_BUFFER] = {0};
+
+    uint32_t kontaktor = 1;     // The default state is always ON
+
     esp_http_client_config_t config = {
     esp_http_client_config_t config = {
         .url = "http://192.168.1.110/electrical/system/isBoilerOn.php",
         .url = "http://192.168.1.110/electrical/system/isBoilerOn.php",
         .event_handler = _http_event_handler,
         .event_handler = _http_event_handler,
+        .user_data = local_response_buffer,        // Pass address of local buffer to get response
     };
     };
     esp_http_client_handle_t client = esp_http_client_init(&config);
     esp_http_client_handle_t client = esp_http_client_init(&config);
 
 
-    //char post_data[10];
-    //sprintf(post_data,"",);
-
     esp_http_client_set_method(client, HTTP_METHOD_GET);
     esp_http_client_set_method(client, HTTP_METHOD_GET);
-    //esp_http_client_set_post_field(client, post_data, strlen(post_data));
     esp_err_t err = esp_http_client_perform(client);
     esp_err_t err = esp_http_client_perform(client);
     if (err == ESP_OK) {
     if (err == ESP_OK) {
-        ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %d",
-                esp_http_client_get_status_code(client),
-                esp_http_client_get_content_length(client));
+
+        const int status = esp_http_client_get_status_code(client);
+        const int dLen = esp_http_client_get_content_length(client);
+        ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %d",status,dLen );
+        //ESP_LOG_BUFFER_HEX(TAG,local_response_buffer,dLen);
+        
+        if( status == 200 && dLen >= 6 ) {
+            local_response_buffer[6] = '\0';
+            if( strstr(local_response_buffer,"Ok") != NULL ) {
+                ESP_LOGI(TAG, "HTTP Received: Ok" );
+                if( strstr(local_response_buffer,"OFF") != NULL ) {
+                    ESP_LOGI(TAG, "HTTP Received: OFF" );
+                    kontaktor = 0;
+                }
+                else if( strstr(local_response_buffer,"ON") != NULL ) {
+                    ESP_LOGI(TAG, "HTTP Received: ON" );
+                }
+            }
+        }
+
     } else {
     } else {
         ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err));
         ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err));
     }
     }
-
+    
     esp_http_client_cleanup(client);
     esp_http_client_cleanup(client);
-}
 
 
-static void http_get_data_task(void *pvParameters)
-{
-
-    http_rest_with_url(pvParameters);
-
-    vTaskDelete(NULL);
+    ESP_LOGI(TAG, "Change relay state: %u",kontaktor);
+    gpio_set_level(VVB_RELAY_OUTPUT_IO, kontaktor);
 }
 }
 
 
-void sendHTTPMessage() {
 
 
-    if( commIsUpAndRunning == 1 ) xTaskCreate(&http_get_data_task, "get_data_task", 8192, NULL, 5, NULL);
-}
 
 
 #endif
 #endif

+ 2 - 1
main/http_client.h

@@ -3,7 +3,8 @@
 
 
 #include "config.h"
 #include "config.h"
 
 
-void sendHTTPMessage();
+
+void http_rest_with_url();
 
 
 
 
 
 

+ 6 - 1
main/kWhCounter.c

@@ -16,6 +16,8 @@ void counterControlTask(void *pvParameters) {
 
 
     ESP_LOGI("kWhCounter", "counterControlTask starting. Core:%d",xPortGetCoreID());
     ESP_LOGI("kWhCounter", "counterControlTask starting. Core:%d",xPortGetCoreID());
 
 
+    uint32_t logCnt = 0;
+    
     uint32_t state = 0;
     uint32_t state = 0;
 
 
     TickType_t vLastWakeTime = xTaskGetTickCount();
     TickType_t vLastWakeTime = xTaskGetTickCount();
@@ -33,7 +35,10 @@ void counterControlTask(void *pvParameters) {
 
 
         if( state > 0 ) kWh_cnt++;
         if( state > 0 ) kWh_cnt++;
 
 
-        ESP_LOGI("kWhCounter", "Measure. Pin: %u  Tot:%u", state, kWh_cnt);
+        if( ++logCnt == 10 ) {
+            ESP_LOGI("kWhCounter", "Measure. Pin: %u  Tot:%u", state, kWh_cnt);
+            logCnt = 0;
+        }
 
 
         state = 0;
         state = 0;
     }
     }

+ 15 - 11
main/main.c

@@ -3,9 +3,7 @@
 #include "esp_log.h"
 #include "esp_log.h"
 #include "config.h"
 #include "config.h"
 #include "wifi.h"
 #include "wifi.h"
-#include "send.h"
 #include "mqtt.h"
 #include "mqtt.h"
-#include "relay_control.h"
 #include "kWhCounter.h"
 #include "kWhCounter.h"
 #include "http_client.h"
 #include "http_client.h"
 
 
@@ -17,11 +15,12 @@
 
 
 void app_main(void)
 void app_main(void)
 {
 {
+    char txt[50];
+
     ESP_LOGI("MAIN", "HomeEnergyMeter ESP32. Core:%d",xPortGetCoreID());
     ESP_LOGI("MAIN", "HomeEnergyMeter ESP32. Core:%d",xPortGetCoreID());
 
 
-#ifdef ENABLE_RELAY_OUTPUT
-    relay_control_init();
-#endif
+    gpio_reset_pin(VVB_RELAY_OUTPUT_IO);
+    gpio_set_direction(VVB_RELAY_OUTPUT_IO, GPIO_MODE_OUTPUT);
 
 
 #ifdef ENABLE_KWH_COUNTER
 #ifdef ENABLE_KWH_COUNTER
     kWhCounter_init();
     kWhCounter_init();
@@ -36,15 +35,20 @@ void app_main(void)
 #endif
 #endif
 
 
 
 
-#ifdef ENABLE_SEND
-    initSend();
-#endif
 
 
-    vTaskDelay(10000 / portTICK_PERIOD_MS);
+    const TickType_t xFreq = 30000 / portTICK_PERIOD_MS;
+    TickType_t vLastWakeTime = xTaskGetTickCount();
+
     while(1) {
     while(1) {
-        sendHTTPMessage();
-        vTaskDelay(30000 / portTICK_PERIOD_MS);
+
+        vTaskDelayUntil( &vLastWakeTime, xFreq );
+        http_rest_with_url();
+
+        vTaskDelayUntil( &vLastWakeTime, xFreq );
+        sprintf(txt,"%u",kWh_cnt);
+        sendMQTTMessage("basement/boiler/onTime", txt);
     }
     }
+
     vTaskDelete(NULL);
     vTaskDelete(NULL);
 }
 }
 
 

+ 1 - 1
main/mqtt.c

@@ -111,7 +111,7 @@ void sendMQTTMessage(const char * topic, const char * data) {
     if( connected ) {
     if( connected ) {
         int msg_id;
         int msg_id;
         msg_id = esp_mqtt_client_publish(client, topic, data, 0, 1, 0);
         msg_id = esp_mqtt_client_publish(client, topic, data, 0, 1, 0);
-        ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);
+        ESP_LOGI(TAG, "sent publish successful, msg_id=%d   %s   %s", msg_id, topic, data);
     }
     }
     else {
     else {
         ESP_LOGI(TAG, "Not connected to MQTT");
         ESP_LOGI(TAG, "Not connected to MQTT");

+ 0 - 43
main/relay_control.c

@@ -1,43 +0,0 @@
-#include "freertos/FreeRTOS.h"
-#include "freertos/task.h"
-#include "freertos/queue.h"
-#include "driver/ledc.h"
-#include "driver/pcnt.h"
-#include "esp_attr.h"
-#include "esp_log.h"
-
-#include "relay_control.h"
-
-#ifdef ENABLE_RELAY_OUTPUT
-
-void relayControlTask(void *pvParameters) {
-
-    ESP_LOGI("RELAY", "relayControlTask starting. Core:%d",xPortGetCoreID());
-
-    uint8_t relayState = 0;
-
-    while( 1 ) {
-        
-        relayState = !relayState;
-        ESP_LOGI("RELAY", "Change relay state: %u",relayState);
-        gpio_set_level(VVB_RELAY_OUTPUT_IO, relayState);
-
-        vTaskDelay(5000 / portTICK_PERIOD_MS);
-    }
-
-}
-
-
-
-
-void relay_control_init()
-{
-    ESP_LOGI("RELAY", "relay_control_init()");
-
-    gpio_reset_pin(VVB_RELAY_OUTPUT_IO);
-    gpio_set_direction(VVB_RELAY_OUTPUT_IO, GPIO_MODE_OUTPUT);
-
-    xTaskCreate(relayControlTask, "relayControlTask", 1024*10, NULL, 2, NULL);
-}
-
-#endif

+ 0 - 10
main/relay_control.h

@@ -1,10 +0,0 @@
-#ifndef __RELAY_CTRL_H__
-#define __RELAY_CTRL_H__
-
-#include "config.h"
-
-
-void relay_control_init(void);
-
-
-#endif

+ 0 - 94
main/send.c

@@ -1,94 +0,0 @@
-#include "send.h"
-#include "mqtt.h"
-#include "esp_log.h"
-#include <stdio.h>
-#include <string.h>
-#include "freertos/FreeRTOS.h"
-#include "freertos/task.h"
-#include "freertos/queue.h"
-#include "config.h"
-
-#ifdef ENABLE_SEND
-
-#define QUEUE_SIZE 3
-
-static QueueHandle_t dataQueue = NULL;
-static bool queueReady = false;
-
-void sendTask(void *pvParameters) {
-
-    uint8_t aliveCnt = 0;
-    DisplayData data;
-    char txt[50];
-
-    ESP_LOGI("DISPnSND", "SendTask starting. Core:%d",xPortGetCoreID());
-
-
-
-    // Create the data input queue, now that all is setup
-    dataQueue = xQueueCreate( QUEUE_SIZE, sizeof( DisplayData ) );
-    if(dataQueue == NULL) {
-        ESP_LOGE("DISPnSND","Error creating the queue");
-    }
-    ESP_LOGI("DISPnSND", "Data input queue ready.");
-    queueReady = true;
-
-    while( 1 ) {
-
-        if( xQueueReceive(dataQueue,&data, 1000 / portTICK_PERIOD_MS) == pdTRUE ) {
-
-            switch( data.type ) {
-                case type_VPP: sprintf(txt,"   %d",data.iData);
-                          sprintf(txt,"%d",data.iData);
-                          sendMQTTMessage("homeEnergyMeter/waterHeater/totalEnergy", txt);
-                          aliveCnt++;
-                          break;
-                case type_TempA:
-                          sprintf(txt,"%.2f",data.dData);
-                          sendMQTTMessage("homeEnergyMeter/internal/temp", txt);
-                          break;
-                case type_TempB:
-                          sprintf(txt,"%.2f",data.dData);
-                          sendMQTTMessage("homeEnergyMeter/waterHeater/temp", txt);
-                          break;
-                case type_kWh:
-                          sprintf(txt,"%.5f",data.dData);
-                          sendMQTTMessage("homeEnergyMeter/electricityMeter/kWh", txt);
-                          sprintf(txt,"%d",data.iData);
-                          sendMQTTMessage("homeEnergyMeter/electricityMeter/pulses", txt);
-                          break;
-                default:
-                          break;
-            }
-        }
-
-    }
-
-    vTaskDelete(NULL);
-}
-
-void addDataToQueue(int data_type, double dData_in, int iData_in) {
-
-    DisplayData d;
-
-    d.type = data_type;
-    d.dData = dData_in;
-    d.iData = iData_in;
-
-    if( queueReady == true && dataQueue != NULL  ) {
-        if( xQueueSend(dataQueue, &d, 0) != pdPASS ) {
-            ESP_LOGE("DISPnSND","Queue full");
-        }
-    }
-    else {
-        ESP_LOGE("DISPnSND","Queue not ready.");
-    }
-}
-
-void initSend() {
-    xTaskCreate(sendTask, "Send-Task", 1024*10, NULL, 2, NULL);
-}
-
-
-#endif
-

+ 0 - 26
main/send.h

@@ -1,26 +0,0 @@
-#ifndef __SEND_H__
-#define __SEND_H__
-
-
-
-
-enum data_type {
-    type_TempA,
-    type_TempB,
-    type_VPP,
-    type_kWh
-};
-
-
-typedef struct{
-  enum data_type type;
-  double dData;
-  int iData;
-} DisplayData;
-
-
-void initSend();
-void addDataToQueue(int data_type, double dData_in, int iData_in);
-
-
-#endif