From 07ec96713c23f473a68d2274e410426f572a0915 Mon Sep 17 00:00:00 2001 From: Klaus Ahrenberg Date: Sun, 26 Nov 2023 19:47:42 +0100 Subject: [PATCH] 1.38 --- WThermostat_1.36.bin => WThermostat_1.38.bin | Bin 420576 -> 421104 bytes src/WClock.h | 154 +++++++++---------- src/WThermostat.cpp | 6 +- src/WThermostat.h | 96 ++++++------ src/WThermostat_BAC_002_ALW.h | 12 +- src/WThermostat_ME102H.h | 8 +- src/WThermostat_ME81H.h | 16 +- src/WThermostat_MK70GBH.h | 8 +- src/WTuyaDevice.h | 2 +- 9 files changed, 151 insertions(+), 151 deletions(-) rename WThermostat_1.36.bin => WThermostat_1.38.bin (69%) diff --git a/WThermostat_1.36.bin b/WThermostat_1.38.bin similarity index 69% rename from WThermostat_1.36.bin rename to WThermostat_1.38.bin index 44cbad6667d8a481509f5ae57b91b4d87cdd502e..14420b5832cf758cd87f31ce6875ef5cfa9238f4 100644 GIT binary patch delta 49648 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 delta 48998 zcmZ^L3w#sB7I$`=?E^OHD^1cSE!k~L(~{6`S|A{SB)CwJDy@h`shWxk3L>uyT;YZy zTS2Q*76BEpAYS!euNQn>_4**yMUbLUU*H9WiUI;kD+qmMzyE9sKEChE?{_jgGiT1s z&g0CPbI$C!Lzzdv$lT7Rr0#BEbVu)w*PVGdvF7IuiCnRqopKHJ{;M-n{zp->WHHT4 z&6fX`mQ5-0xwJA`nt_O&R^CT!2z9#_k>1v_m|L`%_`2-32n;hd$7_)PmYzv%*K(EX zH7fs%QMooo;|vEaJ+8%=;fQh6nizr7 z7=ee7HG~?h;fYeLBBw@Tc?>T%hWA&r$)nGSHOWdV3z0j7%G5HY`(8b6VX2&VhVuUN zFY|sOst%`}RSi{*J!(^uPG>l$)17%)HfHkuylbPQZO`QUKmS}Fk@;NF#q52w)A;bH zLe`m6Xn)wHBxUb0)a!M+W?pB0NB6Kx`qFM6<7UNc<+)iIa!yu(tNlt5-l*p%>K}HA zaeper?AHn@<4|Zk-D{WM$#T$p?CTwrN$$uRH26D0!tk&UwPtIzUa&iB3a9NcqGnQY zi;izel$!1K2iz<(LcYc(gkLtgDd|1?UQT?^p130|Qi6BV*GEU2p33)IcjfzcEBSsF z;U$E}0s8^l0VI9Xs_5vKHbh5n2mBk)uLFjzj*hl}lJDP%{Qn|;=*fKln|S`>k?80* zcgM>uhd{`KSDjUA*D-ycZ%H4+OTWv-{N~v19m18uMD7 zb4z($)waV$zMJxj+_iDKDq0tKL1k~>%Q3Iy3D1KtQ*RUgPAZpdjel1wx2e9Qy`f;l z>}H=hpe&N7WP6jov$FPRAHqSyTL1V8rK~3`N0sF&iFuc+b$DKh|*rViLjc}Eyeg8k#-^12y~Medeg+R=f36>!iVQK6iIolE9p` zCkkwO318xHEJ%x_$g4R%T@M8VBo&UAe# z59aMd&ozf=N3(;cnbr`MBpiur@nCRzRo;bqd1-{Lp~lJj4B~KGU&?SBDv{Y!*6^lW zrAti|oFF;!S=88gjC5b3aJh!G$o`}qd$t^E+()0P>zsR*>D3>JUqTH}RW7J(nm3i7 z$Y4CXRGwu>rPBGnN*Rx>;Z{_dtd!WykLpnG(NPWt&ySGj{XU0SY~wjy*gQ|?@Hm{T zG#F9#O3aOz;c`rI*__83YJD_HGI(xpsPfTHRvZMRl-RRWgy&TA3PKE6QeoelDusB{ z{w$4V9&B{8C+l`^xinW>>v*xMCf&5E5K|S>PZg$eQ&Xo>%b3|r(hlXE+Q$&y#X4>V zq(zR>p@co5LzVkz|NaHTDdq?A_LTPa%<0Q-uN+sMtniE4k}Y(oA}7b^4GfFNe!~=h zAeiN;)m+O8va-KbtGV)2w70g2X7bU}1g)hQ-%wh_VK|o-+1?yVYYU}xw$q{X)=+9& ztNvefZyaxY%46K*_b(V;Ss3s%h3u|@CR6akDBrZu)3nI%d7!yT$2aBqn;&4qdNvpg zFvCOR=f1c@s>t?+1~qtsy7IZNY&#qb#=WrP?NvwUi)ZCPEX1oHT%85I;?LHi8u zWbvfRH!VP9RozuBd^k}@z0$i=r<+algPk)&!{<`}CeaGICe9i1&ZSR{GHqIld&soJtP3{vlX7f{b7M22@=8zZc4L(H0~~n{e}jA>zkn8x$vFdW z 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 MRPLXs`-O`C7jTwYH2?qr diff --git a/src/WClock.h b/src/WClock.h index 5b81cf2..ad51470 100644 --- a/src/WClock.h +++ b/src/WClock.h @@ -38,47 +38,47 @@ class WClock: public WDevice { setMainDevice(false); setVisibility(MQTT); this->ntpServer = network->settings()->setString("ntpServer", DEFAULT_NTP_SERVER); - this->ntpServer->setReadOnly(true); - this->ntpServer->setVisibility(MQTT); + this->ntpServer->readOnly(true); + this->ntpServer->visibility(MQTT); this->addProperty(ntpServer); this->useTimeZoneServer = network->settings()->setBoolean("useTimeZoneServer", true); - this->useTimeZoneServer->setReadOnly(true); - this->useTimeZoneServer->setVisibility(NONE); + this->useTimeZoneServer->readOnly(true); + this->useTimeZoneServer->visibility(NONE); this->addProperty(useTimeZoneServer); this->timeZoneServer = network->settings()->setString("timeZoneServer", DEFAULT_TIME_ZONE_SERVER); - this->timeZoneServer->setReadOnly(true); - this->timeZoneServer->setVisibility(this->useTimeZoneServer->getBoolean() ? MQTT : NONE); + this->timeZoneServer->readOnly(true); + this->timeZoneServer->visibility(this->useTimeZoneServer->asBool() ? MQTT : NONE); //this->ntpServer->setVisibility(MQTT); this->addProperty(timeZoneServer); _epochTimeFormatted = WProps::createStringProperty("epochTimeFormatted", "epochTimeFormatted"); - _epochTimeFormatted->setReadOnly(true); - _epochTimeFormatted->setOnValueRequest([this](WProperty* p) {updateFormattedTime();}); + _epochTimeFormatted->readOnly(true); + _epochTimeFormatted->onValueRequest([this](WProperty* p) {updateFormattedTime();}); this->addProperty(_epochTimeFormatted); this->validTime = WProps::createOnOffProperty("validTime", "validTime"); - this->validTime->setBoolean(false); - this->validTime->setReadOnly(true); + this->validTime->asBool(false); + this->validTime->readOnly(true); this->addProperty(validTime); - if (this->useTimeZoneServer->getBoolean()) { + if (this->useTimeZoneServer->asBool()) { this->timeZone = WProps::createStringProperty("timezone", "timeZone"); - this->timeZone->setReadOnly(true); + this->timeZone->readOnly(true); this->addProperty(timeZone); } else { this->timeZone = nullptr; } this->rawOffset = WProps::createIntegerProperty("raw_offset", "rawOffset"); - this->rawOffset->setInteger(3600); - this->rawOffset->setVisibility(NONE); + this->rawOffset->asInt(3600); + this->rawOffset->visibility(NONE); network->settings()->add(this->rawOffset); - this->rawOffset->setReadOnly(true); + this->rawOffset->readOnly(true); this->addProperty(rawOffset); this->dstOffset = WProps::createIntegerProperty("dst_offset", "dstOffset"); - this->dstOffset->setInteger(3600); - this->dstOffset->setVisibility(NONE); + this->dstOffset->asInt(3600); + this->dstOffset->visibility(NONE); network->settings()->add(this->dstOffset); - this->dstOffset->setReadOnly(true); + this->dstOffset->readOnly(true); this->addProperty(dstOffset); this->useDaySavingTimes = network->settings()->setBoolean("useDaySavingTimes", false); - this->useDaySavingTimes->setVisibility(NONE); + this->useDaySavingTimes->visibility(NONE); this->dstRule = network->settings()->setByteArray("dstRule", 8, DEFAULT_DST_RULE); //HtmlPages WPage* configPage = new WPage(this->id(), "Configure clock"); @@ -103,7 +103,7 @@ class WClock: public WDevice { void loop(unsigned long now) { //Invalid after 3 hours - validTime->setBoolean((lastNtpSync > 0) && ((!this->useTimeZoneServer->getBoolean()) || (lastTimeZoneSync > 0)) && (now - lastTry < (3 * 60 * 60000))); + validTime->asBool((lastNtpSync > 0) && ((!this->useTimeZoneServer->asBool()) || (lastTimeZoneSync > 0)) && (now - lastTry < (3 * 60 * 60000))); if (((lastTry == 0) || (now - lastTry > 10000)) && (WiFi.status() == WL_CONNECTED)) { bool timeUpdated = false; //1. Sync ntp @@ -116,7 +116,7 @@ class WClock: public WDevice { lastNtpSync = millis(); ntpTime = ntpClient.getEpochTime(); this->calculateDstStartAndEnd(); - validTime->setBoolean(!this->useTimeZoneServer->getBoolean()); + validTime->asBool(!this->useTimeZoneServer->asBool()); network()->debug(F("NTP time synced: %s"), _epochTimeFormatted->c_str()); timeUpdated = true; } else { @@ -126,7 +126,7 @@ class WClock: public WDevice { //2. Sync time zone if ((!isValidTime()) && ((lastNtpSync > 0) && ((lastTimeZoneSync == 0) || (now - lastTimeZoneSync > 60000))) - && (useTimeZoneServer->getBoolean()) + && (useTimeZoneServer->asBool()) && (!timeZoneServer->equalsString(""))) { String request = timeZoneServer->c_str(); network()->debug(F("Time zone update via '%s'"), request.c_str()); @@ -138,17 +138,17 @@ class WClock: public WDevice { int httpCode = http.GET(); if (httpCode > 0) { WJsonParser parser; - this->timeZone->setReadOnly(false); - this->rawOffset->setReadOnly(false); - this->dstOffset->setReadOnly(false); + this->timeZone->readOnly(false); + this->rawOffset->readOnly(false); + this->dstOffset->readOnly(false); WProperty* property = parser.parse(http.getString().c_str(), this); - this->timeZone->setReadOnly(true); - this->rawOffset->setReadOnly(true); - this->dstOffset->setReadOnly(true); + this->timeZone->readOnly(true); + this->rawOffset->readOnly(true); + this->dstOffset->readOnly(true); if (property != nullptr) { failedTimeZoneSync = 0; lastTimeZoneSync = millis(); - validTime->setBoolean(true); + validTime->asBool(true); network()->debug(F("Time zone evaluated. Current local time: %s"), _epochTimeFormatted->c_str()); timeUpdated = true; } else { @@ -166,9 +166,9 @@ class WClock: public WDevice { } } //check nightMode - if ((validTime) && (this->enableNightMode) && (this->enableNightMode->getBoolean())) { - this->nightMode->setBoolean(this->isTimeBetween(this->nightSwitches->getByteArrayValue(0), this->nightSwitches->getByteArrayValue(1), - this->nightSwitches->getByteArrayValue(2), this->nightSwitches->getByteArrayValue(3))); + if ((validTime) && (this->enableNightMode) && (this->enableNightMode->asBool())) { + this->nightMode->asBool(this->isTimeBetween(this->nightSwitches->byteArrayValue(0), this->nightSwitches->byteArrayValue(1), + this->nightSwitches->byteArrayValue(2), this->nightSwitches->byteArrayValue(3))); } if (timeUpdated) { _notifyOnTimeUpdate(); @@ -291,7 +291,7 @@ class WClock: public WDevice { void updateFormattedTime() { WStringStream* stream = updateFormattedTime(epochTime()); - _epochTimeFormatted->setString(stream->c_str()); + _epochTimeFormatted->asString(stream->c_str()); delete stream; } @@ -307,7 +307,7 @@ class WClock: public WDevice { } bool isValidTime() { - return validTime->getBoolean(); + return validTime->asBool(); } bool isClockSynced() { @@ -315,35 +315,35 @@ class WClock: public WDevice { } int getRawOffset() { - return rawOffset->getInteger(); + return rawOffset->asInt(); } int getDstOffset() { - return (useTimeZoneServer->getBoolean() || isDaySavingTime() ? dstOffset->getInteger() : 0); + return (useTimeZoneServer->asBool() || isDaySavingTime() ? dstOffset->asInt() : 0); } void printConfigPage(AsyncWebServerRequest* request, Print* page) { page->printf(HTTP_CONFIG_PAGE_BEGIN, id()); - page->printf(HTTP_TOGGLE_GROUP_STYLE, "ga", (useTimeZoneServer->getBoolean() ? HTTP_BLOCK : HTTP_NONE), "gb", (useTimeZoneServer->getBoolean() ? HTTP_NONE : HTTP_BLOCK)); - page->printf(HTTP_TOGGLE_GROUP_STYLE, "gd", (useDaySavingTimes->getBoolean() ? HTTP_BLOCK : HTTP_NONE), "ge", HTTP_NONE); + page->printf(HTTP_TOGGLE_GROUP_STYLE, "ga", (useTimeZoneServer->asBool() ? HTTP_BLOCK : HTTP_NONE), "gb", (useTimeZoneServer->asBool() ? HTTP_NONE : HTTP_BLOCK)); + page->printf(HTTP_TOGGLE_GROUP_STYLE, "gd", (useDaySavingTimes->asBool() ? HTTP_BLOCK : HTTP_NONE), "ge", HTTP_NONE); if (this->enableNightMode) { - page->printf(HTTP_TOGGLE_GROUP_STYLE, "gn", (enableNightMode->getBoolean() ? HTTP_BLOCK : HTTP_NONE), "gm", HTTP_NONE); + page->printf(HTTP_TOGGLE_GROUP_STYLE, "gn", (enableNightMode->asBool() ? HTTP_BLOCK : HTTP_NONE), "gm", HTTP_NONE); } //NTP Server page->printf(HTTP_TEXT_FIELD, "NTP server:", "ntp", "32", ntpServer->c_str()); page->print(FPSTR(HTTP_DIV_BEGIN)); - page->printf(HTTP_RADIO_OPTION, "sa", "sa", HTTP_TRUE, (useTimeZoneServer->getBoolean() ? HTTP_CHECKED : ""), "tg()", "Get time zone via internet"); - page->printf(HTTP_RADIO_OPTION, "sb", "sa", HTTP_FALSE, (useTimeZoneServer->getBoolean() ? "" : HTTP_CHECKED), "tg()", "Use fixed offset to UTC time"); + page->printf(HTTP_RADIO_OPTION, "sa", "sa", HTTP_TRUE, (useTimeZoneServer->asBool() ? HTTP_CHECKED : ""), "tg()", "Get time zone via internet"); + page->printf(HTTP_RADIO_OPTION, "sb", "sa", HTTP_FALSE, (useTimeZoneServer->asBool() ? "" : HTTP_CHECKED), "tg()", "Use fixed offset to UTC time"); page->print(FPSTR(HTTP_DIV_END)); page->printf(HTTP_DIV_ID_BEGIN, "ga"); page->printf(HTTP_TEXT_FIELD, "Time zone server:", "tz", "64", timeZoneServer->c_str()); page->print(FPSTR(HTTP_DIV_END)); page->printf(HTTP_DIV_ID_BEGIN, "gb"); - page->printf(HTTP_TEXT_FIELD, "Fixed offset to UTC in minutes:", "ro", "5", String(rawOffset->getInteger() / 60).c_str()); + page->printf(HTTP_TEXT_FIELD, "Fixed offset to UTC in minutes:", "ro", "5", String(rawOffset->asInt() / 60).c_str()); - page->printf(HTTP_CHECKBOX_OPTION, "sd", "sd", (useDaySavingTimes->getBoolean() ? HTTP_CHECKED : ""), "td()", "Calculate day saving time (summer time)"); + page->printf(HTTP_CHECKBOX_OPTION, "sd", "sd", (useDaySavingTimes->asBool() ? HTTP_CHECKED : ""), "td()", "Calculate day saving time (summer time)"); page->printf(HTTP_DIV_ID_BEGIN, "gd"); page->print(F("")); page->print(F("")); @@ -355,43 +355,43 @@ class WClock: public WDevice { page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("")); page->print(F("
Offset to standard time in minutes")); - page->printf(HTTP_INPUT_FIELD, "do", "5", String(dstOffset->getInteger() / 60).c_str()); + page->printf(HTTP_INPUT_FIELD, "do", "5", String(dstOffset->asInt() / 60).c_str()); page->print(F("
Month [1..12]")); - page->printf(HTTP_INPUT_FIELD, "rm", "2", String(dstRule->getByteArrayValue(STD_MONTH)).c_str()); + page->printf(HTTP_INPUT_FIELD, "rm", "2", String(dstRule->byteArrayValue(STD_MONTH)).c_str()); page->print(F("")); - page->printf(HTTP_INPUT_FIELD, "dm", "2", String(dstRule->getByteArrayValue(DST_MONTH)).c_str()); + page->printf(HTTP_INPUT_FIELD, "dm", "2", String(dstRule->byteArrayValue(DST_MONTH)).c_str()); page->print(F("
Week [0: last week of month; 1..4]")); - page->printf(HTTP_INPUT_FIELD, "rw", "1", String(dstRule->getByteArrayValue(STD_WEEK)).c_str()); + page->printf(HTTP_INPUT_FIELD, "rw", "1", String(dstRule->byteArrayValue(STD_WEEK)).c_str()); page->print(F("")); - page->printf(HTTP_INPUT_FIELD, "dw", "1", String(dstRule->getByteArrayValue(DST_WEEK)).c_str()); + page->printf(HTTP_INPUT_FIELD, "dw", "1", String(dstRule->byteArrayValue(DST_WEEK)).c_str()); page->print(F("
Weekday [0:sunday .. 6:saturday]")); - page->printf(HTTP_INPUT_FIELD, "rd", "1", String(dstRule->getByteArrayValue(STD_WEEKDAY)).c_str()); + page->printf(HTTP_INPUT_FIELD, "rd", "1", String(dstRule->byteArrayValue(STD_WEEKDAY)).c_str()); page->print(F("")); - page->printf(HTTP_INPUT_FIELD, "dd", "1", String(dstRule->getByteArrayValue(DST_WEEKDAY)).c_str()); + page->printf(HTTP_INPUT_FIELD, "dd", "1", String(dstRule->byteArrayValue(DST_WEEKDAY)).c_str()); page->print(F("
Hour [0..23]")); - page->printf(HTTP_INPUT_FIELD, "rh", "2", String(dstRule->getByteArrayValue(STD_HOUR)).c_str()); + page->printf(HTTP_INPUT_FIELD, "rh", "2", String(dstRule->byteArrayValue(STD_HOUR)).c_str()); page->print(F("")); - page->printf(HTTP_INPUT_FIELD, "dh", "2", String(dstRule->getByteArrayValue(DST_HOUR)).c_str()); + page->printf(HTTP_INPUT_FIELD, "dh", "2", String(dstRule->byteArrayValue(DST_HOUR)).c_str()); page->print(F("
")); @@ -399,17 +399,17 @@ class WClock: public WDevice { page->print(FPSTR(HTTP_DIV_END)); if (this->enableNightMode) { //nightMode - page->printf(HTTP_CHECKBOX_OPTION, "sn", "sn", (enableNightMode->getBoolean() ? HTTP_CHECKED : ""), "tn()", "Enable support for night mode"); + page->printf(HTTP_CHECKBOX_OPTION, "sn", "sn", (enableNightMode->asBool() ? HTTP_CHECKED : ""), "tn()", "Enable support for night mode"); page->printf(HTTP_DIV_ID_BEGIN, "gn"); page->print(F("")); page->print(F("")); char timeFrom[6]; - snprintf(timeFrom, 6, "%02d:%02d", this->nightSwitches->getByteArrayValue(0), this->nightSwitches->getByteArrayValue(1)); + snprintf(timeFrom, 6, "%02d:%02d", this->nightSwitches->byteArrayValue(0), this->nightSwitches->byteArrayValue(1)); page->print(F("")); char timeTo[6]; - snprintf(timeTo, 6, "%02d:%02d", this->nightSwitches->getByteArrayValue(2), this->nightSwitches->getByteArrayValue(3)); + snprintf(timeTo, 6, "%02d:%02d", this->nightSwitches->byteArrayValue(2), this->nightSwitches->byteArrayValue(3)); page->print(F("")); @@ -424,22 +424,22 @@ class WClock: public WDevice { } void saveConfigPage(AsyncWebServerRequest* request, Print* page) { - this->ntpServer->setString(request->arg("ntp").c_str()); - this->timeZoneServer->setString(request->arg("tz").c_str()); - this->useTimeZoneServer->setBoolean(request->arg("sa") == HTTP_TRUE); - this->useDaySavingTimes->setBoolean(request->arg("sd") == HTTP_TRUE); - this->rawOffset->setInteger(atol(request->arg("ro").c_str()) * 60); - this->dstOffset->setInteger(atol(request->arg("do").c_str()) * 60); - this->dstRule->setByteArrayValue(STD_MONTH, atoi(request->arg("rm").c_str())); - this->dstRule->setByteArrayValue(STD_WEEK, atoi(request->arg("rw").c_str())); - this->dstRule->setByteArrayValue(STD_WEEKDAY, atoi(request->arg("rd").c_str())); - this->dstRule->setByteArrayValue(STD_HOUR, atoi(request->arg("rh").c_str())); - this->dstRule->setByteArrayValue(DST_MONTH, atoi(request->arg("dm").c_str())); - this->dstRule->setByteArrayValue(DST_WEEK, atoi(request->arg("dw").c_str())); - this->dstRule->setByteArrayValue(DST_WEEKDAY, atoi(request->arg("dd").c_str())); - this->dstRule->setByteArrayValue(DST_HOUR, atoi(request->arg("dh").c_str())); + this->ntpServer->asString(request->arg("ntp").c_str()); + this->timeZoneServer->asString(request->arg("tz").c_str()); + this->useTimeZoneServer->asBool(request->arg("sa") == HTTP_TRUE); + this->useDaySavingTimes->asBool(request->arg("sd") == HTTP_TRUE); + this->rawOffset->asInt(atol(request->arg("ro").c_str()) * 60); + this->dstOffset->asInt(atol(request->arg("do").c_str()) * 60); + this->dstRule->byteArrayValue(STD_MONTH, atoi(request->arg("rm").c_str())); + this->dstRule->byteArrayValue(STD_WEEK, atoi(request->arg("rw").c_str())); + this->dstRule->byteArrayValue(STD_WEEKDAY, atoi(request->arg("rd").c_str())); + this->dstRule->byteArrayValue(STD_HOUR, atoi(request->arg("rh").c_str())); + this->dstRule->byteArrayValue(DST_MONTH, atoi(request->arg("dm").c_str())); + this->dstRule->byteArrayValue(DST_WEEK, atoi(request->arg("dw").c_str())); + this->dstRule->byteArrayValue(DST_WEEKDAY, atoi(request->arg("dd").c_str())); + this->dstRule->byteArrayValue(DST_HOUR, atoi(request->arg("dh").c_str())); if (this->enableNightMode) { - this->enableNightMode->setBoolean(request->arg("sn") == HTTP_TRUE); + this->enableNightMode->asBool(request->arg("sn") == HTTP_TRUE); processNightModeTime(0, request->arg("nf").c_str()); processNightModeTime(2, request->arg("nt").c_str()); } @@ -511,13 +511,13 @@ class WClock: public WDevice { } void calculateDstStartAndEnd() { - if ((!this->useTimeZoneServer->getBoolean()) && (this->useDaySavingTimes->getBoolean())) { + if ((!this->useTimeZoneServer->asBool()) && (this->useDaySavingTimes->asBool())) { int year = WClock::yearOf(_epochTime(false)); - dstStart = getEpochTime(year, dstRule->getByteArrayValue(DST_MONTH), dstRule->getByteArrayValue(DST_WEEK), dstRule->getByteArrayValue(DST_WEEKDAY), dstRule->getByteArrayValue(DST_HOUR)); + dstStart = getEpochTime(year, dstRule->byteArrayValue(DST_MONTH), dstRule->byteArrayValue(DST_WEEK), dstRule->byteArrayValue(DST_WEEKDAY), dstRule->byteArrayValue(DST_HOUR)); WStringStream* stream = updateFormattedTime(dstStart); //network()->debug(F("DST start is: %s"), stream->c_str()); delete stream; - dstEnd = getEpochTime(year, dstRule->getByteArrayValue(STD_MONTH), dstRule->getByteArrayValue(STD_WEEK), dstRule->getByteArrayValue(STD_WEEKDAY), dstRule->getByteArrayValue(STD_HOUR)); + dstEnd = getEpochTime(year, dstRule->byteArrayValue(STD_MONTH), dstRule->byteArrayValue(STD_WEEK), dstRule->byteArrayValue(STD_WEEKDAY), dstRule->byteArrayValue(STD_HOUR)); stream = updateFormattedTime(dstEnd); //network()->debug(F("STD start is: %s"), stream->c_str()); delete stream; @@ -525,7 +525,7 @@ class WClock: public WDevice { } bool isDaySavingTime() { - if ((!this->useTimeZoneServer->getBoolean()) && (this->useDaySavingTimes->getBoolean())) { + if ((!this->useTimeZoneServer->asBool()) && (this->useDaySavingTimes->asBool())) { if ((this->dstStart != 0) && (this->dstEnd != 0)) { unsigned long now = _epochTime(false); if (yearOf(now) != yearOf(dstStart)) { @@ -540,7 +540,7 @@ class WClock: public WDevice { return false; } } else { - return (dstOffset->getInteger() != 0); + return (dstOffset->asInt() != 0); } } @@ -549,8 +549,8 @@ class WClock: public WDevice { if (timeStr.length() == 5) { byte hh = timeStr.substring(0, 2).toInt(); byte mm = timeStr.substring(3, 5).toInt(); - this->nightSwitches->setByteArrayValue(arrayIndex, hh); - this->nightSwitches->setByteArrayValue(arrayIndex + 1, mm); + this->nightSwitches->byteArrayValue(arrayIndex, hh); + this->nightSwitches->byteArrayValue(arrayIndex + 1, mm); } } diff --git a/src/WThermostat.cpp b/src/WThermostat.cpp index b4ca727..7adc067 100644 --- a/src/WThermostat.cpp +++ b/src/WThermostat.cpp @@ -13,7 +13,7 @@ #include "WThermostat_DLX_LH01.h" #define APPLICATION "Thermostat" -#define VERSION "1.36" +#define VERSION "1.38" #define FLAG_SETTINGS 0x35 #define DEBUG false @@ -37,7 +37,7 @@ void setup() { thermostatModel = network->settings()->setByte("thermostatModel", MODEL_BHT_002_GBLW); //Thermostat device device = nullptr; - switch (thermostatModel->getByte()) { + switch (thermostatModel->asByte()) { case MODEL_BHT_002_GBLW : device = new WThermostat_BHT_002_GBLW(network, thermostatModel, wClock); break; @@ -66,7 +66,7 @@ void setup() { device = new WThermostat_DLX_LH01(network, thermostatModel, wClock); break; default : - network->error(F("Can't start device. Wrong thermostatModel (%d)"), thermostatModel->getByte()); + network->error(F("Can't start device. Wrong thermostatModel (%d)"), thermostatModel->asByte()); } if (device != nullptr) { device->configureCommandBytes(); diff --git a/src/WThermostat.h b/src/WThermostat.h index 9949e51..d83c6ca 100644 --- a/src/WThermostat.h +++ b/src/WThermostat.h @@ -82,17 +82,17 @@ public : this->schedulesDayOffset = network()->settings()->setByte("schedulesDayOffset", 0); //standard properties this->actualTemperature = WProps::createTemperatureProperty("temperature", "Actual"); - this->actualTemperature->setReadOnly(true); + this->actualTemperature->readOnly(true); this->addProperty(actualTemperature); this->targetTemperature = WProps::createTargetTemperatureProperty("targetTemperature", "Target"); - this->targetTemperature->setMultipleOf(1.0f / this->temperatureFactor); + this->targetTemperature->multipleOf(1.0f / this->temperatureFactor); this->targetTemperature->addListener(std::bind(&WThermostat::setTargetTemperature, this, std::placeholders::_1)); - this->targetTemperature->setOnValueRequest([this](WProperty* p) {updateTargetTemperature();}); + this->targetTemperature->onValueRequest([this](WProperty* p) {updateTargetTemperature();}); this->addProperty(targetTemperature); if (byteTemperatureFloor != NOT_SUPPORTED) { this->actualFloorTemperature = WProps::createTargetTemperatureProperty("floorTemperature", "Floor"); - this->actualFloorTemperature->setReadOnly(true); - this->actualFloorTemperature->setVisibility(MQTT); + this->actualFloorTemperature->readOnly(true); + this->actualFloorTemperature->visibility(MQTT); this->addProperty(actualFloorTemperature); } else { this->actualFloorTemperature = nullptr; @@ -110,16 +110,16 @@ public : this->switchBackToAuto = network()->settings()->setBoolean("switchBackToAuto", true); this->locked = WProps::createOnOffProperty("locked", "Lock"); this->locked->addListener(std::bind(&WThermostat::lockedToMcu, this, std::placeholders::_1)); - this->locked->setVisibility(MQTT); + this->locked->visibility(MQTT); this->addProperty(locked); this->completeDeviceState = network()->settings()->setBoolean("sendCompleteDeviceState", true); //Heating Relay and State property this->state = nullptr; this->supportingHeatingRelay = network()->settings()->setBoolean("supportingHeatingRelay", true); - if (this->supportingHeatingRelay->getBoolean()) { + if (this->supportingHeatingRelay->asBool()) { pinMode(PIN_STATE_HEATING_RELAY, INPUT); this->state = new WProperty("state", "State", STRING, TYPE_HEATING_COOLING_PROPERTY); - this->state->setReadOnly(true); + this->state->readOnly(true); this->state->addEnumString(STATE_OFF); this->state->addEnumString(STATE_HEATING); this->addProperty(state); @@ -130,18 +130,18 @@ public : page->printf(HTTP_CONFIG_PAGE_BEGIN, id()); //ComboBox with model selection page->printf(HTTP_COMBOBOX_BEGIN, "Thermostat model:", "tm"); - page->printf(HTTP_COMBOBOX_ITEM, "0", (this->thermostatModel->getByte() == 0 ? HTTP_SELECTED : ""), "BHT-002, BHT-6000, BHT-3000 (floor heating)"); - page->printf(HTTP_COMBOBOX_ITEM, "6", (this->thermostatModel->getByte() == 6 ? HTTP_SELECTED : ""), "AVATTO ME102H (Touch screen)"); - page->printf(HTTP_COMBOBOX_ITEM, "1", (this->thermostatModel->getByte() == 1 ? HTTP_SELECTED : ""), "BAC-002, BAC-1000 (heating, cooling, ventilation)"); - page->printf(HTTP_COMBOBOX_ITEM, "2", (this->thermostatModel->getByte() == 2 ? HTTP_SELECTED : ""), "ET-81W"); - page->printf(HTTP_COMBOBOX_ITEM, "3", (this->thermostatModel->getByte() == 3 ? HTTP_SELECTED : ""), "Floureon HY08WE"); - page->printf(HTTP_COMBOBOX_ITEM, "4", (this->thermostatModel->getByte() == 4 ? HTTP_SELECTED : ""), "AVATTO ME81AH"); - page->printf(HTTP_COMBOBOX_ITEM, "5", (this->thermostatModel->getByte() == 5 ? HTTP_SELECTED : ""), "Minco Heat MK70GB-H"); - page->printf(HTTP_COMBOBOX_ITEM, "7", (this->thermostatModel->getByte() == 7 ? HTTP_SELECTED : ""), "VH Control Calypso-W"); - page->printf(HTTP_COMBOBOX_ITEM, "8", (this->thermostatModel->getByte() == 8 ? HTTP_SELECTED : ""), "DLX-LH01"); + page->printf(HTTP_COMBOBOX_ITEM, "0", (this->thermostatModel->asByte() == 0 ? HTTP_SELECTED : ""), "BHT-002, BHT-6000, BHT-3000 (floor heating)"); + page->printf(HTTP_COMBOBOX_ITEM, "6", (this->thermostatModel->asByte() == 6 ? HTTP_SELECTED : ""), "AVATTO ME102H (Touch screen)"); + page->printf(HTTP_COMBOBOX_ITEM, "1", (this->thermostatModel->asByte() == 1 ? HTTP_SELECTED : ""), "BAC-002, BAC-1000 (heating, cooling, ventilation)"); + page->printf(HTTP_COMBOBOX_ITEM, "2", (this->thermostatModel->asByte() == 2 ? HTTP_SELECTED : ""), "ET-81W"); + page->printf(HTTP_COMBOBOX_ITEM, "3", (this->thermostatModel->asByte() == 3 ? HTTP_SELECTED : ""), "Floureon HY08WE"); + page->printf(HTTP_COMBOBOX_ITEM, "4", (this->thermostatModel->asByte() == 4 ? HTTP_SELECTED : ""), "AVATTO ME81AH"); + page->printf(HTTP_COMBOBOX_ITEM, "5", (this->thermostatModel->asByte() == 5 ? HTTP_SELECTED : ""), "Minco Heat MK70GB-H"); + page->printf(HTTP_COMBOBOX_ITEM, "7", (this->thermostatModel->asByte() == 7 ? HTTP_SELECTED : ""), "VH Control Calypso-W"); + page->printf(HTTP_COMBOBOX_ITEM, "8", (this->thermostatModel->asByte() == 8 ? HTTP_SELECTED : ""), "DLX-LH01"); page->print(FPSTR(HTTP_COMBOBOX_END)); //Checkbox - page->printf(HTTP_CHECKBOX_OPTION, "sb", "sb", (this->switchBackToAuto->getBoolean() ? HTTP_CHECKED : ""), "", "Auto mode from manual mode at next schedule period change
(not at model ET-81W and ME81AH)"); + page->printf(HTTP_CHECKBOX_OPTION, "sb", "sb", (this->switchBackToAuto->asBool() ? HTTP_CHECKED : ""), "", "Auto mode from manual mode at next schedule period change
(not at model ET-81W and ME81AH)"); //ComboBox with weekday page->printf(HTTP_COMBOBOX_BEGIN, "Workday schedules:", "ws"); page->printf(HTTP_COMBOBOX_ITEM, "0", (getSchedulesDayOffset() == 0 ? HTTP_SELECTED : ""), "Workday Mon-Fri; Weekend Sat-Sun"); @@ -154,9 +154,9 @@ public : page->print(FPSTR(HTTP_COMBOBOX_END)); page->printf(HTTP_CHECKBOX_OPTION, "cr", "cr", (this->sendCompleteDeviceState() ? "" : HTTP_CHECKED), "", "Send changes in separate MQTT messages"); //notifyAllMcuCommands - page->printf(HTTP_CHECKBOX_OPTION, "am", "am", (this->notifyAllMcuCommands->getBoolean() ? HTTP_CHECKED : ""), "", "Send all MCU commands via MQTT"); + page->printf(HTTP_CHECKBOX_OPTION, "am", "am", (this->notifyAllMcuCommands->asBool() ? HTTP_CHECKED : ""), "", "Send all MCU commands via MQTT"); //Checkbox with support for relay - page->printf(HTTP_CHECKBOX_OPTION, "rs", "rs", (this->supportingHeatingRelay->getBoolean() ? HTTP_CHECKED : ""), "", "Relay at GPIO 5 (not working without hw mod)"); + page->printf(HTTP_CHECKBOX_OPTION, "rs", "rs", (this->supportingHeatingRelay->asBool() ? HTTP_CHECKED : ""), "", "Relay at GPIO 5 (not working without hw mod)"); printConfigPageCustomParameters(request, page); @@ -168,12 +168,12 @@ public : } virtual void submitConfigPage(AsyncWebServerRequest* request, Print* page) { - this->thermostatModel->setByte(request->arg("tm").toInt()); - this->schedulesDayOffset->setByte(request->arg("ws").toInt()); - this->switchBackToAuto->setBoolean(request->arg("sb") == HTTP_TRUE); - this->completeDeviceState->setBoolean(request->arg("cr") != HTTP_TRUE); - this->notifyAllMcuCommands->setBoolean(request->arg("am") == HTTP_TRUE); - this->supportingHeatingRelay->setBoolean(request->arg("rs") == HTTP_TRUE); + this->thermostatModel->asByte(request->arg("tm").toInt()); + this->schedulesDayOffset->asByte(request->arg("ws").toInt()); + this->switchBackToAuto->asBool(request->arg("sb") == HTTP_TRUE); + this->completeDeviceState->asBool(request->arg("cr") != HTTP_TRUE); + this->notifyAllMcuCommands->asBool(request->arg("am") == HTTP_TRUE); + this->supportingHeatingRelay->asBool(request->arg("rs") == HTTP_TRUE); submitConfigPageCustomParameters(request, page); } @@ -303,10 +303,10 @@ public : virtual void loop(unsigned long now) { if (state != nullptr) { bool heating = false; - if ((this->supportingHeatingRelay->getBoolean()) && (state != nullptr)) { + if ((this->supportingHeatingRelay->asBool()) && (state != nullptr)) { heating = digitalRead(PIN_STATE_HEATING_RELAY); } - this->state->setString(heating ? STATE_HEATING : STATE_OFF); + this->state->asString(heating ? STATE_HEATING : STATE_OFF); } WTuyaDevice::loop(now); updateCurrentSchedulePeriod(); @@ -321,7 +321,7 @@ public : } virtual bool sendCompleteDeviceState() { - return this->completeDeviceState->getBoolean(); + return this->completeDeviceState->asBool(); } protected : @@ -391,7 +391,7 @@ protected : } byte getSchedulesDayOffset() { - return schedulesDayOffset->getByte(); + return schedulesDayOffset->asByte(); } virtual bool processCommand(byte commandByte, byte length) { @@ -437,8 +437,8 @@ protected : //2021-01-24 test for bht-002 if (!this->mcuRestarted) { newB = (receivedCommand[10] == 0x01); - changed = ((changed) || (newB != deviceOn->getBoolean())); - deviceOn->setBoolean(newB); + changed = ((changed) || (newB != deviceOn->asBool())); + deviceOn->asBool(newB); } else if (!this->deviceOn->isNull()) { deviceOnToMcu(this->deviceOn); this->mcuRestarted = false; @@ -464,7 +464,7 @@ protected : unsigned long rawValue = WSettings::getUnsignedLong(receivedCommand[10], receivedCommand[11], receivedCommand[12], receivedCommand[13]); newValue = (float) rawValue / this->temperatureFactor; changed = ((changed) || (!actualTemperature->equalsDouble(newValue))); - actualTemperature->setDouble(newValue); + actualTemperature->asDouble(newValue); knownCommand = true; } } else if ((byteTemperatureFloor != NOT_SUPPORTED) && (cByte == byteTemperatureFloor)) { @@ -474,15 +474,15 @@ protected : unsigned long rawValue = WSettings::getUnsignedLong(receivedCommand[10], receivedCommand[11], receivedCommand[12], receivedCommand[13]); newValue = (float) rawValue / this->temperatureFactor; changed = ((changed) || (!actualFloorTemperature->equalsDouble(newValue))); - actualFloorTemperature->setDouble(newValue); + actualFloorTemperature->asDouble(newValue); knownCommand = true; } } else if (cByte == byteSchedulesMode) { if (commandLength == 0x05) { //schedulesMode - newS = schedulesMode->getEnumString(receivedCommand[10]); + newS = schedulesMode->enumString(receivedCommand[10]); if (newS != nullptr) { - changed = ((changed) || (schedulesMode->setString(newS))); + changed = ((changed) || (schedulesMode->asString(newS))); if (changed) updateTargetTemperature(); knownCommand = true; } @@ -491,8 +491,8 @@ protected : if (commandLength == 0x05) { //locked newB = (receivedCommand[10] == 0x01); - changed = ((changed) || (newB != locked->getBoolean())); - locked->setBoolean(newB); + changed = ((changed) || (newB != locked->asBool())); + locked->asBool(newB); knownCommand = true; } } else if (cByte == byteSchedules) { @@ -561,10 +561,10 @@ protected : } } int newPeriod = startAddr + period * 3; - if ((this->switchBackToAuto->getBoolean()) && + if ((this->switchBackToAuto->asBool()) && (this->currentSchedulePeriod > -1) && (newPeriod != this->currentSchedulePeriod) && (this->schedulesMode->equalsString(SCHEDULES_MODE_OFF))) { - this->schedulesMode->setString(SCHEDULES_MODE_AUTO); + this->schedulesMode->asString(SCHEDULES_MODE_AUTO); } this->currentSchedulePeriod = newPeriod; } else { @@ -575,7 +575,7 @@ protected : virtual void deviceOnToMcu(WProperty* property) { if (!isReceivingDataFromMcu()) { //55 AA 00 06 00 05 01 01 00 01 01 - byte dt = (this->deviceOn->getBoolean() ? 0x01 : 0x00); + byte dt = (this->deviceOn->asBool() ? 0x01 : 0x00); unsigned char deviceOnCommand[] = { 0x55, 0xAA, 0x00, 0x06, 0x00, 0x05, byteDeviceOn, 0x01, 0x00, 0x01, dt}; commandCharsToSerial(11, deviceOnCommand); @@ -597,7 +597,7 @@ protected : void schedulesModeToMcu(WProperty* property) { if ((!isReceivingDataFromMcu()) && (schedulesMode != nullptr)) { //55 AA 00 06 00 05 04 04 00 01 01 - byte sm = schedulesMode->getEnumIndex(); + byte sm = schedulesMode->enumIndex(); if (sm != 0xFF) { unsigned char deviceOnCommand[] = { 0x55, 0xAA, 0x00, 0x06, 0x00, 0x05, byteSchedulesMode, 0x04, 0x00, 0x01, sm}; @@ -608,7 +608,7 @@ protected : void lockedToMcu(WProperty* property) { if (!isReceivingDataFromMcu()) { - byte dt = (this->locked->getBoolean() ? 0x01 : 0x00); + byte dt = (this->locked->asBool() ? 0x01 : 0x00); unsigned char deviceOnCommand[] = { 0x55, 0xAA, 0x00, 0x06, 0x00, 0x05, byteLocked, 0x01, 0x00, 0x01, dt}; commandCharsToSerial(11, deviceOnCommand); @@ -649,7 +649,7 @@ protected : void handleSchedulesChange(String completeTopic) { network()->debug(F("Send Schedules state...")); if (completeTopic == "") { - completeTopic = String(network()->getMqttBaseTopic()) + SLASH + String(this->id()) + SLASH + String(network()->getMqttStateTopic()) + SLASH + SCHEDULES; + completeTopic = String(network()->mqttBaseTopic()) + SLASH + String(this->id()) + SLASH + String(network()->mqttStateTopic()) + SLASH + SCHEDULES; } WStringStream* response = network()->getResponseStream(); WJson json(response); @@ -732,8 +732,8 @@ protected : } void setTargetTemperature(WProperty* property) { - if (!WProperty::isEqual(targetTemperatureManualMode, this->targetTemperature->getDouble(), 0.01)) { - targetTemperatureManualMode = this->targetTemperature->getDouble(); + if (!WProperty::isEqual(targetTemperatureManualMode, this->targetTemperature->asDouble(), 0.01)) { + targetTemperatureManualMode = this->targetTemperature->asDouble(); targetTemperatureManualModeToMcu(); //schedulesMode->setString(SCHEDULES_MODE_OFF); } @@ -742,9 +742,9 @@ protected : void updateTargetTemperature() { if ((this->currentSchedulePeriod != -1) && (schedulesMode->equalsString(SCHEDULES_MODE_AUTO))) { double temp = (double) schedules[this->currentSchedulePeriod + 2] / this->temperatureFactor; - targetTemperature->setDouble(temp); + targetTemperature->asDouble(temp); } else { - targetTemperature->setDouble(targetTemperatureManualMode); + targetTemperature->asDouble(targetTemperatureManualMode); } } diff --git a/src/WThermostat_BAC_002_ALW.h b/src/WThermostat_BAC_002_ALW.h index 69eccc3..3b4e173 100644 --- a/src/WThermostat_BAC_002_ALW.h +++ b/src/WThermostat_BAC_002_ALW.h @@ -71,9 +71,9 @@ protected : //cooling: 55 AA 00 06 00 05 66 04 00 01 00 //heating: 55 AA 00 06 00 05 66 04 00 01 01 //ventilation: 55 AA 00 06 00 05 66 04 00 01 02 - newS = systemMode->getEnumString(receivedCommand[10]); + newS = systemMode->enumString(receivedCommand[10]); if (newS != nullptr) { - changed = ((changed) || (systemMode->setString(newS))); + changed = ((changed) || (systemMode->asString(newS))); knownCommand = true; } } @@ -84,9 +84,9 @@ protected : //high - 55 aa 01 07 00 05 67 04 00 01 01 //medium - 55 aa 01 07 00 05 67 04 00 01 02 //low - 55 aa 01 07 00 05 67 04 00 01 03 - newS = fanMode->getEnumString(receivedCommand[10]); + newS = fanMode->enumString(receivedCommand[10]); if (newS != nullptr) { - changed = ((changed) || (fanMode->setString(newS))); + changed = ((changed) || (fanMode->asString(newS))); knownCommand = true; } } @@ -105,7 +105,7 @@ protected : void systemModeToMcu(WProperty* property) { if (!isReceivingDataFromMcu()) { - byte sm = property->getEnumIndex(); + byte sm = property->enumIndex(); if (sm != 0xFF) { //send to device //cooling: 55 AA 00 06 00 05 66 04 00 01 00 @@ -120,7 +120,7 @@ protected : void fanModeToMcu(WProperty* property) { if (!isReceivingDataFromMcu()) { - byte fm = fanMode->getEnumIndex(); + byte fm = fanMode->enumIndex(); if (fm != 0xFF) { //send to device //auto: 55 aa 00 06 00 05 67 04 00 01 00 diff --git a/src/WThermostat_ME102H.h b/src/WThermostat_ME102H.h index 0d12540..a404566 100644 --- a/src/WThermostat_ME102H.h +++ b/src/WThermostat_ME102H.h @@ -43,7 +43,7 @@ public : this->sensorSelection->addEnumString(SENSOR_SELECTION_INTERNAL); this->sensorSelection->addEnumString(SENSOR_SELECTION_FLOOR); this->sensorSelection->addEnumString(SENSOR_SELECTION_BOTH); - this->sensorSelection->setVisibility(MQTT); + this->sensorSelection->visibility(MQTT); this->sensorSelection->addListener(std::bind(&WThermostat_ME102H::sensorSelectionToMcu, this, std::placeholders::_1)); this->addProperty(this->sensorSelection); } @@ -63,9 +63,9 @@ protected : //internal: 55 aa 03 07 00 05 2b 04 00 01 00 //floor: 55 aa 03 07 00 05 2b 04 00 01 01 //both: 55 aa 03 07 00 05 2b 04 00 01 02 - newS = this->sensorSelection->getEnumString(receivedCommand[10]); + newS = this->sensorSelection->enumString(receivedCommand[10]); if (newS != nullptr) { - changed = ((changed) || (this->sensorSelection->setString(newS))); + changed = ((changed) || (this->sensorSelection->asString(newS))); knownCommand = true; } } @@ -121,7 +121,7 @@ protected : void sensorSelectionToMcu(WProperty* property) { if (!isReceivingDataFromMcu()) { - byte sm = property->getEnumIndex(); + byte sm = property->enumIndex(); if (sm != 0xFF) { //send to device //internal: 55 aa 03 07 00 05 2b 04 00 01 00 diff --git a/src/WThermostat_ME81H.h b/src/WThermostat_ME81H.h index 8046191..64b0baa 100644 --- a/src/WThermostat_ME81H.h +++ b/src/WThermostat_ME81H.h @@ -46,7 +46,7 @@ public : this->sensorSelection->addEnumString(SENSOR_SELECTION_INTERNAL); this->sensorSelection->addEnumString(SENSOR_SELECTION_FLOOR); this->sensorSelection->addEnumString(SENSOR_SELECTION_BOTH); - this->sensorSelection->setVisibility(MQTT); + this->sensorSelection->visibility(MQTT); this->sensorSelection->addListener(std::bind(&WThermostat_ME81H::sensorSelectionToMcu, this, std::placeholders::_1)); this->addProperty(this->sensorSelection); } @@ -66,7 +66,7 @@ protected : unsigned long rawValue = WSettings::getUnsignedLong(receivedCommand[10], receivedCommand[11], receivedCommand[12], receivedCommand[13]); float newValue = (float) rawValue / 10.0f; changed = ((changed) || (!actualTemperature->equalsDouble(newValue))); - actualTemperature->setDouble(newValue); + actualTemperature->asDouble(newValue); knownCommand = true; } } else if (cByte == this->byteSystemMode) { @@ -75,9 +75,9 @@ protected : //cooling: 55 AA 00 06 00 05 66 04 00 01 00 //heating: 55 AA 00 06 00 05 66 04 00 01 01 //ventilation: 55 AA 00 06 00 05 66 04 00 01 02 - newS = systemMode->getEnumString(receivedCommand[10]); + newS = systemMode->enumString(receivedCommand[10]); if (newS != nullptr) { - changed = ((changed) || (systemMode->setString(newS))); + changed = ((changed) || (systemMode->asString(newS))); knownCommand = true; } } @@ -87,9 +87,9 @@ protected : //internal: 55 aa 03 07 00 05 2b 04 00 01 00 //floor: 55 aa 03 07 00 05 2b 04 00 01 01 //both: 55 aa 03 07 00 05 2b 04 00 01 02 - newS = this->sensorSelection->getEnumString(receivedCommand[10]); + newS = this->sensorSelection->enumString(receivedCommand[10]); if (newS != nullptr) { - changed = ((changed) || (this->sensorSelection->setString(newS))); + changed = ((changed) || (this->sensorSelection->asString(newS))); knownCommand = true; } } @@ -155,7 +155,7 @@ protected : void systemModeToMcu(WProperty* property) { if (!isReceivingDataFromMcu()) { - byte sm = property->getEnumIndex(); + byte sm = property->enumIndex(); if (sm != 0xFF) { //send to device //cooling: 55 AA 00 06 00 05 66 04 00 01 00 @@ -170,7 +170,7 @@ protected : void sensorSelectionToMcu(WProperty* property) { if (!isReceivingDataFromMcu()) { - byte sm = property->getEnumIndex(); + byte sm = property->enumIndex(); if (sm != 0xFF) { //send to device //internal: 55 aa 03 07 00 05 2d 05 00 01 00 diff --git a/src/WThermostat_MK70GBH.h b/src/WThermostat_MK70GBH.h index 2eb7124..cab550f 100644 --- a/src/WThermostat_MK70GBH.h +++ b/src/WThermostat_MK70GBH.h @@ -39,8 +39,8 @@ public : this->statusMode = new WProperty("statusMode", "Status", STRING, TYPE_HEATING_COOLING_PROPERTY); this->statusMode->addEnumString(STATE_OFF); this->statusMode->addEnumString(STATE_HEATING); - this->statusMode->setReadOnly(true); - this->statusMode->setVisibility(MQTT); + this->statusMode->readOnly(true); + this->statusMode->visibility(MQTT); this->addProperty(statusMode); } @@ -56,9 +56,9 @@ protected : if (cByte == byteStatusMode) { if (commandLength == 0x05) { //status - newS = statusMode->getEnumString(receivedCommand[10]); + newS = statusMode->enumString(receivedCommand[10]); if (newS != nullptr) { - changed = ((changed) || (statusMode->setString(newS))); + changed = ((changed) || (statusMode->asString(newS))); knownCommand = true; } } diff --git a/src/WTuyaDevice.h b/src/WTuyaDevice.h index 31a3827..7b9e721 100644 --- a/src/WTuyaDevice.h +++ b/src/WTuyaDevice.h @@ -405,7 +405,7 @@ protected : //unknown //55 aa 00 00 00 00 this->receivingDataFromMcu = true; - if (notifyAllMcuCommands->getBoolean()) { + if (notifyAllMcuCommands->asBool()) { network()->debug(F("MCU: %s"), this->getCommandAsString().c_str()); } bool knownCommand = false;
from")); page->printf(HTTP_INPUT_FIELD, "nf", "5", timeFrom); page->print(F("to")); page->printf(HTTP_INPUT_FIELD, "nt", "5", timeTo); page->print(F("