Forráskód Böngészése

Changes for the new heat pump

Thomas Chef 7 hónapja
szülő
commit
ea5cc4b63c
6 módosított fájl, 85 hozzáadás és 55 törlés
  1. 1 1
      main/config.h
  2. 3 2
      main/ir_transmit.c
  3. 7 0
      main/ir_transmit.h
  4. 56 31
      main/mqtt.c
  5. 5 15
      main/receiver.c
  6. 13 6
      main/toshiba_ir.c

+ 1 - 1
main/config.h

@@ -7,7 +7,7 @@
 
 // These defines configures which code to generate (to save download time during development)
 //#define WIFI_ENABLED
-//#define MQTT_ENABLED
+#define MQTT_ENABLED
 //#define ENABLE_DS18B20
 
 //#define MQTT_DEBUG              // Add an extra debug string to the topic-string

+ 3 - 2
main/ir_transmit.c

@@ -6,6 +6,7 @@
 #include "driver/rmt.h"
 
 #include "toshiba_ir.h"
+#include "ir_transmit.h"
 #include "config.h"
 
 #ifdef IR_TRANSMIT
@@ -36,7 +37,7 @@ void copyDataToRmtArray( const uint8_t rmtStartBit, const uint8_t* data, const u
 		uint8_t shiftBits = b % 8;
 		uint8_t bit_data = (1u << (7-shiftBits)) & byte;
 		uint32_t space = bit_data ? kPanasonicAcOneSpace : kPanasonicAcZeroSpace;
-		toshiba_rmt[b+rmtStartBit].val = (kPanasonicAcBitMark << 0) | (1 << 15) | (space << 16);
+		toshiba_rmt[b+rmtStartBit].val = ((kPanasonicAcBitMark+5) << 0) | (1 << 15) | (space << 16);
     }
 }
 
@@ -145,7 +146,7 @@ void initIrTransmit() {
 	copyDataToRmtArray(1,&irTxData[0],STATIC_PRE_BYTES,true);
 	copyDataToRmtArray(67,&irTxData[8],DYN_DATA_BYTES,true);
 
-    toshibaTxQueue = xQueueCreate( 5, kPanasonicNumberOfBytes );
+    toshibaTxQueue = xQueueCreate( 5, IR_TX_QUEUE_DATA_SIZE );
 	//xTaskCreatePinnedToCore(toshibaTxTask, "toshibaTxTask", 1024*10, NULL, 2, NULL,0);
 
 	ESP_LOGI("IR_TRANSMIT","Init done.");

+ 7 - 0
main/ir_transmit.h

@@ -7,6 +7,13 @@
 
 void initIrTransmit();
 
+typedef struct IR_TX_DATA {
+    uint8_t     fan;    /** Data for fan. 0-5 */
+    uint8_t     temp;   /** Data for temperature 160-300 */
+    uint8_t     power   /** Power mode. 0=Off, 1=On*/;
+} IR_TX_DATA;
+
+#define IR_TX_QUEUE_DATA_SIZE   sizeof(IR_TX_DATA)
 extern QueueHandle_t toshibaTxQueue;
 
 

+ 56 - 31
main/mqtt.c

@@ -39,10 +39,38 @@ static const char *TAG = "MQTT";
 
 #ifdef MQTT_ENABLED
 
+static const char *TAG_RX = "MQTT_RX";
 
 static esp_mqtt_client_handle_t client;
 static bool connected = false;
 
+int getJsonProp(const char *str,const char *prop) {
+    int propValue = -1;
+    const size_t propLen = strlen(prop);
+    char sStr[propLen+4];
+    strcpy(&sStr[1],prop);
+    sStr[0] = sStr[propLen+1] = '\"';
+    sStr[propLen+2] = ':';
+    sStr[propLen+3] = '\0';
+    char *ptr = strstr(str,sStr);
+    if( ptr != NULL ) {
+        ptr += strlen(sStr);
+        int retVal = sscanf(ptr,"%d",&propValue);
+        if( retVal == 1 ) {
+            return propValue;
+        }
+    }
+    return -1;    
+}
+
+void remove_spaces(char* s) {
+    char* d = s;
+    do {
+        while (*d == ' ') {
+            ++d;
+        }
+    } while ( (*s++ = *d++) );
+}
 
 static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event)
 {
@@ -76,39 +104,36 @@ static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event)
             ESP_LOGI(TAG, "MQTT_EVENT_DATA Topic: <%.*s>", event->topic_len, event->topic);
 #ifdef IR_TRANSMIT
             //printf("DATA=%.*s\r\n", event->data_len, event->data);
+            // {"fan":0,"power":1,"temp":245}
             if( strncmp(event->topic,"hall/ac/ir_cmd_tx",event->topic_len) == 0 ) {
 
-                uint8_t data[kPanasonicNumberOfBytes];
-
-                if( event->data_len != kPanasonicNumberOfBytes*2 ) {
-                    ESP_LOGE("MQTT","Wrong length in MQTT-data %u",event->data_len);
-                    break;
-                }
-                
-                bool exitRx = false;
-                for(uint8_t i=0;i<kPanasonicNumberOfBytes*2;i++) {
-                    const unsigned char c = event->data[i];
-                    if( c<'0' || c>'F' || (c>'9' && c<'A') ) {
-                        ESP_LOGE("MQTT","Wrong chars in MQTT-data");
-                        exitRx = true;
-                        break;
-                    }
-                }
-                if( exitRx ) break;
-                
-                char *cp = event->data;
-                for(uint8_t i=0;i<kPanasonicNumberOfBytes;i++) {
-                    int n = sscanf(cp, "%02X", (unsigned int*)&data[i]);
-                    if( n != 1 ) {
-                        ESP_LOGE("MQTT","Wrong chars (sscanf) in MQTT-data");
-                        break;
-                    }
-                    cp+=2;
-                }
-
-                ESP_LOGI("MQTT","Received a Toshiba IR Code for transmit");
-
-                xQueueSend( toshibaTxQueue, &data, 0 );
+                int v1,v2,v3;
+                v1=v2=v3=0;
+                remove_spaces(event->data);
+
+                ESP_LOGI(TAG_RX, "Temp: %d", v1 = getJsonProp(event->data, "temp"));
+                ESP_LOGI(TAG_RX, "Fan: %d", v2 = getJsonProp(event->data, "fan"));
+                ESP_LOGI(TAG_RX, "Power: %d", v3 = getJsonProp(event->data, "power"));
+
+                if( v1 < 160 || v1 > 300 ) { ESP_LOGE(TAG_RX,"Error in temp data %d",v1); return 0; }
+
+                //const uint8_t addExtraTemp = (v1%10 == 5) ? 1 : 0;
+                //const uint8_t tempData = ((v1/10) - 16) * 2 + addExtraTemp;
+                //ESP_LOGI(TAG_RX,"TempData: %d", tempData);
+
+                // Fan: 0-5 -> 10, 3-7
+                if( v2 < 0 || v2 > 5 ) { ESP_LOGE(TAG_RX,"Error in fan data %d",v2); return 0; }
+                //const uint8_t fanData = (v2==0)? 10 : v2+2;
+
+                if( v3 != 0 && v3 != 1 ) { ESP_LOGE(TAG_RX,"Error in power data %d",v3); return 0; }
+                //const uint8_t powerData = v3;
+
+                IR_TX_DATA txData;
+                txData.temp  = v1;
+                txData.fan   = v2;
+                txData.power = v3;
+
+                xQueueSend( toshibaTxQueue, &txData, 0 );
 #endif
             }
             break;

+ 5 - 15
main/receiver.c

@@ -29,12 +29,6 @@
 uint32_t dataArr[1000];
 uint32_t dataArrIdx = 0;
 
-uint8_t bitReverse(uint8_t b) {
-   b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
-   b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
-   b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
-   return b;
-}
 
 void receiverTask(void *pvParameter)
 {
@@ -53,11 +47,11 @@ void receiverTask(void *pvParameter)
             union ToshibaProtocolU* data = (union ToshibaProtocolU*)nextPulseToshiba_ir(width);
             if( data != NULL ) {
 
-                char mqtt_s[100];
-                sprintf(mqtt_s,"A %02X%02X%02X%02X%02X%02X%02X%02X",data->raw[0],data->raw[1],data->raw[2],data->raw[3],data->raw[4],data->raw[5],data->raw[6],data->raw[7]);
-                sprintf(mqtt_s,"B %02X%02X%02X%02X%02X%02X%02X%02X",data->raw[8],data->raw[9],data->raw[10],data->raw[11],data->raw[12],data->raw[13],data->raw[14],data->raw[15]);
-                sprintf(mqtt_s,"C %02X%02X%02X",data->raw[16],data->raw[17],data->raw[18]);
-                //ESP_LOGI("TOSHIBA","MQTT: %s", mqtt_s);
+                char mqtt_s[50];
+                sprintf(&mqtt_s[0], "%02X%02X%02X%02X%02X%02X%02X%02X",data->raw[0],data->raw[1],data->raw[2],data->raw[3],data->raw[4],data->raw[5],data->raw[6],data->raw[7]);
+                sprintf(&mqtt_s[16],"%02X%02X%02X%02X%02X%02X%02X%02X",data->raw[8],data->raw[9],data->raw[10],data->raw[11],data->raw[12],data->raw[13],data->raw[14],data->raw[15]);
+                sprintf(&mqtt_s[32],"%02X%02X%02X",data->raw[16],data->raw[17],data->raw[18]);
+                ESP_LOGI("TOSHIBA","MQTT: >%s<", mqtt_s);
 
 #ifdef MQTT_ENABLED
                 sendMQTTMessage("hall/ac/ir_cmd_rx", mqtt_s);
@@ -75,10 +69,6 @@ void receiverTask(void *pvParameter)
                 const uint8_t fan = data->raw[8]>>4;
                 const uint8_t power = data->raw[5]&0x01;
                 ESP_LOGI("TOSHIBA","Power:%u Temp:%.1f Fan:%u",power,setTemp,fan);
-
-#ifdef WIFI_ENABLED
-                //sendUDPMessage(dataStr, true);
-#endif
             }
         }
     }

+ 13 - 6
main/toshiba_ir.c

@@ -7,7 +7,14 @@
 #include "config.h"
 
 uint8_t sumBytes(const uint8_t * const start, const uint16_t length);
-extern uint8_t bitReverse(uint8_t b);
+
+uint8_t bitReverse(uint8_t b) {
+   b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
+   b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
+   b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
+   return b;
+}
+
 
 /**
  * @Analys of Toshiba IR Rx:
@@ -145,7 +152,7 @@ static int32_t rx_decode(uint32_t width)
             }
             else
             {
-                ESP_LOGI("T", "Err STARTER A");
+                ESP_LOGI("T", "Err STARTER A %u",width);
                 return -1; // error, reset
             }
             break;
@@ -158,7 +165,7 @@ static int32_t rx_decode(uint32_t width)
             }
             else
             {
-                ESP_LOGI("T", "Err STARTER B");
+                ESP_LOGI("T", "Err STARTER B %u",width);
                 return -1; // error, reset
             }
             break;
@@ -175,11 +182,11 @@ static int32_t rx_decode(uint32_t width)
             else if( T0_PULSE_MIN <= width && width <= T0_PULSE_MAX )
             {
                 rx_state = T1;
-                //ESP_LOGI("T", "T0");
+                //ESP_LOGI("T", "T0 %u",width);
             }
             else
             {
-                ESP_LOGI("T", "Err T0");
+                ESP_LOGI("T", "Err T0 %u",width);
                 return -1; // error, reset
             }
             break;
@@ -204,7 +211,7 @@ static int32_t rx_decode(uint32_t width)
             }
             else
             {
-                ESP_LOGI("T", "Err T1");
+                ESP_LOGI("T", "Err T1 %u",width);
                 return -1; // error, reset
             }
             rx_state = T0;