diff --git a/platformio.ini b/platformio.ini index 5b1560c..c0e538c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,7 @@ platform = espressif32 board = wt32-eth01 framework = arduino -lib_deps = siwats/ESPMegaPROR3@^2.2.4 +lib_deps = siwats/ESPMegaPROR3@^2.2.5 monitor_speed = 115200 build_flags = -DCORE_DEBUG_LEVEL=5 upload_port = COM28 diff --git a/src/codebook.txt b/src/codebook.txt index c7c6996..7fa5353 100644 --- a/src/codebook.txt +++ b/src/codebook.txt @@ -33,9 +33,9 @@ object id: 5 s_pm_toggle 6 s_time (txt) -> date 7 s_date (txt) -> time -8 s_outside_temp (txt) -> outside_temp +8 s_outside_temp (txt) -> temp_outside 9 idle_timer (timer) // wait one min for inactivity then dim screen -10 s_weather_icon (pic) +10 weather_icon (pic) picture id: diff --git a/src/ise_display.cpp b/src/ise_display.cpp index 6aaa8be..70aad6e 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -25,7 +25,7 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar this->lightLevelRow2 = 0; this->lightLevelRow3 = 0; this->lightLevelRow4 = 0; - //this->time_since_last_screen_update = 0; + // this->time_since_last_screen_update = 0; this->registerTouchCallback(bindedHandleTouch); this->reset(); delay(1000); @@ -36,12 +36,12 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar this->updateAirPurifierState(); this->updateACState(); this->updateLightGroupStatePageDashboard(); - this->outputCard->setValue(6,pm_fan_speed); - this->outputCard->setValue(5,0); - this->outputCard->setValue(1,0); - this->outputCard->setValue(2,0); - this->outputCard->setValue(3,0); - this->outputCard->setValue(4,0); + this->outputCard->setValue(6, pm_fan_speed); + this->outputCard->setValue(5, 0); + this->outputCard->setValue(1, 0); + this->outputCard->setValue(2, 0); + this->outputCard->setValue(3, 0); + this->outputCard->setValue(4, 0); this->climateCard->setTemperature(ac_temperature); this->climateCard->setFanSpeed(ac_fan_speed); this->climateCard->setMode(ac_mode); @@ -69,7 +69,7 @@ void ISEDisplay::loop() void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type) { ESP_LOGD("ISEDisplay", "Touch detected on page %d, component %d, touch type %d", page, component, touch_type); - //time_since_last_screen_update = millis(); // update time since last activity + // time_since_last_screen_update = millis(); // update time since last activity if (page == PAGE_STANDBY) { switch (component) @@ -80,7 +80,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type // TODO : Should you really jump to page 2 here? should't page jumping be handled reactivly? // EX. if atleast one light is on, then jump to active page, else jump to standby page // This will allow page to change correctly when the system is started and when controlled remotely which won't call handleTouch - //time_since_last_screen_update = millis(); + // time_since_last_screen_update = millis(); this->jumpToPage(2); // the function of the button is to open the dashboard from standby break; @@ -111,7 +111,6 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type else if (page == PAGE_DASHBOARD) { - switch (component) { @@ -211,19 +210,19 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type ac_fan_speed = (ac_fan_speed + 1) % 4; ESP_LOGI("ISEDisplay", "New AC fan speed: %d", ac_fan_speed); this->climateCard->setFanSpeed(ac_fan_speed); - //updateACState(); + // updateACState(); break; case COMPONENT_AC_TEMP_DOWN_BUTTON: if (touch_type != TOUCH_TYPE_RELEASE) break; this->climateCard->setTemperature(this->climateCard->getTemperature() - 1); - //updateACState(); + // updateACState(); break; case COMPONENT_AC_TEMP_UP_BUTTON: if (touch_type != TOUCH_TYPE_RELEASE) break; this->climateCard->setTemperature(this->climateCard->getTemperature() + 1); - //updateACState(); + // updateACState(); break; case COMPONENT_PM_TOGGLE_BUTTON: if (touch_type != TOUCH_TYPE_RELEASE) @@ -235,9 +234,9 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type break; pm_fan_speed = this->outputCard->getValue(6); ESP_LOGI("ISEDisplay", "Current PM fan speed: %d", pm_fan_speed); - if (pm_fan_speed >=1 && pm_fan_speed <= 20) + if (pm_fan_speed >= 1 && pm_fan_speed <= 20) this->outputCard->setValue(6, (pm_fan_speed - 1)); - ESP_LOGI("ISEDisplay", "New PM fan speed: %d", pm_fan_speed); + ESP_LOGI("ISEDisplay", "New PM fan speed: %d", pm_fan_speed); updateAirPurifierState(); break; case COMPONENT_PM_FAN_SPEED_INCREASE: @@ -247,7 +246,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type ESP_LOGI("ISEDisplay", "Current PM fan speed: %d", pm_fan_speed); if (pm_fan_speed >= 0 && pm_fan_speed <= 19) this->outputCard->setValue(6, (pm_fan_speed + 1)); - ESP_LOGI("ISEDisplay", "New PM fan speed: %d", pm_fan_speed); + ESP_LOGI("ISEDisplay", "New PM fan speed: %d", pm_fan_speed); updateAirPurifierState(); break; default: @@ -272,13 +271,13 @@ void ISEDisplay::handlePWMChange(uint8_t pin, bool state, uint16_t value) { // Light updateLightGroupStatePageStandby(); - //time_since_last_screen_update = millis(); // update time since last activity + // time_since_last_screen_update = millis(); // update time since last activity } else if (pin == 4 || pin == 5) { // Air Purifier updateAirPurifierStateStandby(); - //time_since_last_screen_update = millis(); // update time since last activity + // time_since_last_screen_update = millis(); // update time since last activity } } else if (current_page == PAGE_DASHBOARD) @@ -287,13 +286,13 @@ void ISEDisplay::handlePWMChange(uint8_t pin, bool state, uint16_t value) { // Light updateLightGroupStatePageDashboard(); - //time_since_last_screen_update = millis(); // update time since last activity + // time_since_last_screen_update = millis(); // update time since last activity } else if (pin == 4 || pin == 5) { // Air Purifier updateAirPurifierState(); - //time_since_last_screen_update = millis(); // update time since last activity + // time_since_last_screen_update = millis(); // update time since last activity } } else @@ -326,6 +325,10 @@ void ISEDisplay::updateWeather(char *weather_string) { weather_code = 63; } + else if (strcmp(weather_string, "sunny") == 0) + { + weather_code = 63; + } else if (strcmp(weather_string, "fair_night") == 0) { weather_code = 64; @@ -334,11 +337,11 @@ void ISEDisplay::updateWeather(char *weather_string) { weather_code = 65; } - else if (strcmp(weather_string, "clearsky_day") == 0) + else if (strcmp(weather_string, "clear-day") == 0) { weather_code = 66; } - else if (strcmp(weather_string, "clearsky_night") == 0) + else if (strcmp(weather_string, "clear-night") == 0) { weather_code = 67; } @@ -346,6 +349,10 @@ void ISEDisplay::updateWeather(char *weather_string) { weather_code = 68; } + else if (strcmp(weather_string, "partlycloudy") == 0) + { + weather_code = 68; + } else if (strcmp(weather_string, "partlycloudy_night") == 0) { weather_code = 69; @@ -366,6 +373,10 @@ void ISEDisplay::updateWeather(char *weather_string) { weather_code = 73; } + else if (strcmp(weather_string, "rainy") == 0) + { + weather_code = 73; + } else if (strcmp(weather_string, "lightrain") == 0) { weather_code = 74; @@ -378,9 +389,11 @@ void ISEDisplay::updateWeather(char *weather_string) { weather_code = 68; } + ESP_LOGI("ISEDisplay", "Updating weather to: %s (%d)", weather_string, weather_code); - this->takeSerialMutex(); - this->displayAdapter->printf("weather_icon.pic=%s", weather_code); + if (!this->takeSerialMutex()) + return; + this->displayAdapter->printf("weather_icon.pic=%d", weather_code); this->sendStopBytes(); this->giveSerialMutex(); } @@ -390,22 +403,37 @@ void ISEDisplay::updateTempOutside(float temp_outside) // change temp_outside to int then display u_int8_t temp_outside_int = (u_int8_t)temp_outside; + ESP_LOGI("ISEDisplay", "Updating temperature outside to: %d", temp_outside_int); this->takeSerialMutex(); - this->displayAdapter->printf("temp_outside.txt=%d", temp_outside_int); + this->displayAdapter->printf("outside_temp.txt=\"%d\"", temp_outside_int); this->sendStopBytes(); this->giveSerialMutex(); } void ISEDisplay::updatePMoutside(u_int16_t pm25_outside) { - this->takeSerialMutex(); - this->displayAdapter->printf("pm_outside.txt=%d", pm25_outside); - this->sendStopBytes(); - this->giveSerialMutex(); + ESP_LOGI("ISEDisplay", "Updating PM2.5 outside to: %d", pm25_outside); + u_int16_t curPage = this->currentPage; + if (curPage == 2) + { + this->takeSerialMutex(); + this->displayAdapter->printf("pm_out.txt=\"%d\"", pm25_outside); + this->sendStopBytes(); + this->giveSerialMutex(); + } // TODO : use remotevar to get PM2.5 data from appdaemon and update the display } -void ISEDisplay::updatePMinside(u_int8_t pm25_inside) +void ISEDisplay::updatePMinside(u_int16_t pm25_inside) { // TODO : get data from HA's Xiaomi air purifier sensor + ESP_LOGI("ISEDisplay", "Updating PM2.5 inside to: %d", pm25_inside); + u_int16_t curPage = this->currentPage; + if (curPage == 2) + { + this->takeSerialMutex(); + this->displayAdapter->printf("pm_in.txt=\"%d\"", pm25_inside); + this->sendStopBytes(); + this->giveSerialMutex(); + } } void ISEDisplay::setPMstate(bool is_pm_on, uint8_t pm_fan_speed) @@ -417,14 +445,13 @@ void ISEDisplay::setACstate(uint8_t ac_fan_speed, uint8_t ac_mode, uint8_t ac_te { ESP_LOGI("ISEDisplay", "Setting AC state: = fan speed: %d, mode: %d, temperature: %d", ac_fan_speed, ac_mode, ac_temperature); - this->climateCard->setFanSpeed(ac_fan_speed); ESP_LOGI("ISEDisplay", "AC fan speed set to: %d", ac_fan_speed); this->climateCard->setMode(ac_mode); ESP_LOGI("ISEDisplay", "AC mode set to: %d", ac_mode); this->climateCard->setTemperature(ac_temperature); ESP_LOGI("ISEDisplay", "AC temperature set to: %d", ac_temperature); - //updateACState(); + // updateACState(); } void ISEDisplay::toggleLightGroupState() { @@ -447,7 +474,7 @@ void ISEDisplay::toggleLightGroupStateStandby() { setLightLevel(i, state ? 0 : 3); } - //updateLightGroupStatePageStandby(); + // updateLightGroupStatePageStandby(); } void ISEDisplay::togglePM() { @@ -516,9 +543,9 @@ void ISEDisplay::changeUserACmode() } else { // ie mode is off - // do nothing as the state is keep in user_mode - // the mode will change to user_mode when turn on by toggleAC() - ESP_LOGI("ISEDisplay", "do nothing; user mode: %d , actual mode: %d", user_mode, mode); + // do nothing as the state is keep in user_mode + // the mode will change to user_mode when turn on by toggleAC() + ESP_LOGI("ISEDisplay", "do nothing; user mode: %d , actual mode: %d", user_mode, mode); } updateuserACmode(); // call to update mode part of the display seperately } @@ -696,7 +723,7 @@ void ISEDisplay::updateAirPurifierState() this->displayAdapter->print("pm_speed.val="); this->displayAdapter->print(pm_fan_speed); - //this->displayAdapter->print("\""); + // this->displayAdapter->print("\""); this->sendStopBytes(); this->displayAdapter->print("pm_speed.pco="); @@ -716,7 +743,7 @@ void ISEDisplay::updateuserACmode() ESP_LOGI("ISEDisplay", "updating display user AC mode to: %d", user_mode); switch (user_mode) { - case 1: + case 1: this->displayAdapter->print("ac_mode.pic="); this->displayAdapter->print(COMPONENT_AC_MODE_COOL_PIC); this->sendStopBytes(); @@ -827,7 +854,7 @@ void ISEDisplay::updateACState() this->displayAdapter->print("ac_temp.val="); this->displayAdapter->print(temperature); - //this->displayAdapter->print("\""); + // this->displayAdapter->print("\""); this->sendStopBytes(); this->giveSerialMutex(); diff --git a/src/ise_display.hpp b/src/ise_display.hpp index 46e4b7e..c830090 100644 --- a/src/ise_display.hpp +++ b/src/ise_display.hpp @@ -29,7 +29,7 @@ class ISEDisplay : public ESPMegaDisplay { void updateWeather(char *weather_string); void updateTempOutside(float temp_outside); void updatePMoutside(u_int16_t pm25_outside); - void updatePMinside(u_int8_t pm25_inside); + void updatePMinside(u_int16_t pm25_inside); void loop(); diff --git a/src/main.cpp b/src/main.cpp index 992f131..545bfe1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,8 +1,9 @@ #include -// RemoteVariable pm25_out = RemoteVariable(); -// RemoteVariable temp_out = RemoteVariable(); -// RemoteVariable weather = RemoteVariable(); +RemoteVariable pm25_out = RemoteVariable(); +RemoteVariable temp_out = RemoteVariable(); +RemoteVariable weather = RemoteVariable(); +RemoteVariable pm25_in = RemoteVariable(); const char *mode_names[] = {"off", "fan_only", "cool"}; const char *fan_speed_names[] = {"auto", "high", "medium", "low"}; @@ -108,11 +109,13 @@ void setup() // PM2.5 PPM Remote Variable // 12 bytes remote variable, 11 characters + null terminator // Enable value request at /iqair/pm25_request - // pm25_out.begin(6, "/aqi/value", espmega.iot, true, "/aqi/value_request"); - // // Temperature Remote Variable - // temp_out.begin(6, "/temp/value", espmega.iot, true, "/weather/temp_request"); - // // Weather Remote Variable - // weather.begin(45, "/weather", espmega.iot, true, "/weather_request"); + pm25_out.begin(6, "/aqi/value", espmega.iot, true, "/aqi/request_value"); + // Temperature Remote Variable + temp_out.begin(6, "/temp/value", espmega.iot, true, "/temp/request_value"); + // Weather Remote Variable + weather.begin(45, "/weather/value", espmega.iot, true, "/weather/request_value"); + // PM2.5 PPM Remote Variable + pm25_in.begin(6, "/pm/value", espmega.iot, true, "/pm/request_value"); } void loop() @@ -142,50 +145,71 @@ void loop() iseDisplay.updateDateTimeText(time); last_time_updated = millis(); } - // Update the PM2.5 PPM value every 5 minutes - // static uint32_t last_pm25_out_update = 0; - // if (millis() - last_pm25_out_update > 300000) - // { - // uint16_t pm25_out_value = get_pm25_out(); - // iseDisplay.updatePMoutside(pm25_out_value); - // last_pm25_out_update = millis(); - // } - // // Update the temperature value every 5 minutes - // static uint32_t last_temp_out_update = 0; - // if (millis() - last_temp_out_update > 300000) - // { - // float temp_out_value = get_temp_out(); - // iseDisplay.updateTempOutside(temp_out_value); - // last_temp_out_update = millis(); - // } - // // Update the weather value every 5 minutes - // static uint32_t last_weather_update = 0; - // if (millis() - last_weather_update > 300000) - // { - // char *weather_value = weather.getValue(); - // iseDisplay.updateWeather(weather_value); - // last_weather_update = millis(); - // } + //Update the PM2.5 PPM value every 15 seconds + static uint32_t last_pm25_out_update = 0; + if (millis() - last_pm25_out_update > 15000) + { + uint16_t pm25_out_value = get_pm25_out(); + //ESP_LOGI("loopPM2.5","updating PM2.5 from MQTT inside loop: %d", pm25_out_value); + iseDisplay.updatePMoutside(pm25_out_value); + last_pm25_out_update = millis(); + } + // Update the PM2.5 PPM value every 15 seconds + static uint32_t last_pm25_in_update = 0; + if (millis() - last_pm25_in_update > 15000) + { + uint8_t pm25_in_value = get_pm25_in(); + iseDisplay.updatePMinside(pm25_in_value); + last_pm25_in_update = millis(); + } + // Update the temperature value every 15 seconds + static uint32_t last_temp_out_update = 0; + if (millis() - last_temp_out_update > 15000) + { + float temp_out_value = get_temp_out(); + iseDisplay.updateTempOutside(temp_out_value); + last_temp_out_update = millis(); + } + // Update the weather value every 15 seconds + static uint32_t last_weather_update = 0; + if (millis() - last_weather_update > 15000) + { + char *weather_value = weather.getValue(); + iseDisplay.updateWeather(weather_value); + last_weather_update = millis(); + } } void on_pin_change(uint8_t pin, uint8_t value) { } -// uint16_t get_pm25_out() -// { -// uint16_t pm25_out_value = 0; -// // Read PM2.5 PPM from sensor -// pm25_out_value = atoi(pm25_out.getValue()); -// return pm25_out_value; -// } -// float get_temp_out() -// { -// float temp_out_value = 0; -// // Read temperature from sensor -// temp_out_value = atof(temp_out.getValue()); -// return temp_out_value; -// } +uint16_t get_pm25_out() +{ + uint16_t pm25_out_value = 0; + // Read PM2.5 PPM from sensor + pm25_out_value = atoi(pm25_out.getValue()); + ESP_LOGI("PM2.5", "getting PM2.5 PPM from MQTT: %d", pm25_out_value); + return pm25_out_value; +} + +uint16_t get_pm25_in() +{ + uint16_t pm25_in_value = 0; + // Read PM2.5 PPM from sensor + pm25_in_value = atoi(pm25_in.getValue()); + ESP_LOGI("PM2.5", "getting PM2.5 PPM from MQTT: %d", pm25_in_value); + return pm25_in_value; +} + +float get_temp_out() +{ + float temp_out_value = 0; + // Read temperature from sensor + temp_out_value = atof(temp_out.getValue()); + ESP_LOGI("Temperature", "getting Temperature from MQTT: %f", temp_out_value); + return temp_out_value; +} void handlePageChange(uint8_t page) { @@ -210,9 +234,11 @@ void handlePageChange(uint8_t page) } // iseDisplay.updatePMinside(); - /* iseDisplay.updatePMoutside(get_pm25_out()); + iseDisplay.updatePMoutside(get_pm25_out()); + iseDisplay.updatePMinside(get_pm25_in()); iseDisplay.updateWeather(weather.getValue()); - iseDisplay.updateTempOutside(get_temp_out()); */ + iseDisplay.updateTempOutside(get_temp_out()); + /* iseDisplay.updateACState(); iseDisplay.updateAirPurifierState(); iseDisplay.updateLightGroupStatePageStandby(); diff --git a/src/main.hpp b/src/main.hpp index 2100941..73b888c 100644 --- a/src/main.hpp +++ b/src/main.hpp @@ -35,4 +35,5 @@ void loop(); void on_pin_change(uint8_t pin, uint8_t value); uint16_t get_pm25_out(); +uint16_t get_pm25_in(); float get_temp_out();