Daikin online controller reverse engineering - revk/ESP32-Faikin GitHub Wiki
This description is based on reverse engineering Daikin BRP068B41 and BRP072C42 controllers. Can be used for two purposes:
- Linking S21 commands to values, presented by this API
- Implementing this API in Faikin for compatibility with existing automation systems, relying on this API
List of these endpoints has been obtained by reverse engineering Daikin online controller android app. Responses listed are produced by a simulated FTXF20D5V1B. Simulator profile is based on a real unit.
Some controllers (found in BRP072C42) use https protocol instead of http; and also require all requests to be authenticated with a UUID. The UUID must be supplied in hexadecimal form with '-' stripped. For example:
curl --insecure -H "X-Daikin-uuid: 039c1fd567fe4f72af227f6f42249072" "https://192.168.0.104/common/basic_info"
--insecure is specified because connection certificate is signed by unknown authority (most likely Daikin themselves, i didn't bother to check)
In order for the controller to recognize the given UUID, it must be registered using /common/register_terminal. The registration can be revoked by using /common/unregister_terminal endpoint.
Authentication requirement is also reflected in /common/basic_info as "en_secure=1" parameter.
Huge thanks to MuzzaMcD for hints provided.
Every query returns a ret= value, containing result code. From Daikin online controller app, the following codes are known:
- UNKNOWN
- OK - operation completed successfully
- NG
- IMPOSSIBLE
- ACCOUNT_NG
- PMODE_NG
- LOCK_NG
- SERIAL_NG
- NO_RECORD
- PART_OK
- ADV_NG
- THROUGH
- NOT_DEVICE_TOKEN
- LPW_NG - Lock Password Not Good ???
- PARAM_NG (Parameters not good) - invalid GET query arguments given
- INTERNAL_NG
- STATUS_NG
- SERIAL IF FAILURE - appears if the unit is not responding or sending invalid data (can be caused by simulator)
Response: ret=OK,type=aircon,reg=eu,dst=1,ver=1_14_88,rev=8A618141,pow=0,err=0,location=0,name=%44%61%69%6b%69%6e%41%50%36%33%37%31%32,icon=0,method=polling,port=30050,id=55687f7c-7595-40b0-bda6-2c4cbcf857a7,pw=,lpw_flag=0,adp_kind=3,pv=2,cpv=2,cpv_minor=00,led=1,en_setzone=1,mac=204EF6663D8A,adp_mode=run,en_hol=0,ssid1=my_wlan_ssid_here,radio1=-54,ssid=DaikinAP63712,grp_name=,en_grp=0
-
type=[string]
Device type. From "Daikin online controller" app the following types are known:- "aircon" - Air conditioner
- "Water Heater" - self-explanatory
- "Floor Heater" - self-explanatory
- "common_adp" - "Common adapter", whatever this is.
Apparently there are several families of Daikin devices, sharing (more or less) the same protocol.
-
reg=[string]
Region. Currently known values: "jp" (from the app), "eu" (reported by BRP069 series), "th" (reported by BRP072C42). This code is a firmware's property, having nothing to do with ac_dst parameter from /aircon/model_info. Used for region-locking mobile applications. -
dst=[boolean ?]
No information yet. Could be "daylight saving time active" -
ver=[string]
Firmware's own version string -
rev=[string]
Firmware's own revision string. Yes, looks like git commit hash. -
pow=[boolean]
Device's power on status. Duplicated in aircon/get_control_info -
err=[integer]
Current error code. 0 = all OK. Other known value is 252. -
location=[integer]
Unknown -
name=[string]
Conditioner's human readable name, percent-encoded. Displayed by the app. -
icon=[integer]
Icon, representing this conditioner in the app. There are several choices -
method=[string]
Known values are "polling" and "home only". Looks like reflects whether cloud connection has been set up or not. -
port=[integer]
Probably cloud port number. -
id=[guid]
GUID in string form. Probably cloud identifier. -
pw=[string ?]
Clearly has to do with password. -
lpw_flag=[boolean ?]
Lock password is set ? -
adp_kind=[integer]
"Adapter kind". Specifies hardware platform of the wi-fi controller, used for firwmware updates. Known values are:- 0 - GainSpan
- 1 - STMicroWired
- 2 - STMicroWireless
- 3 - MarvelWireless. Used by BRP069A41, BRP069B41 (eu) and BRP072C42 (thai) controllers.
- 4 - Reported by BRP069C41, which is also using Marvel platform, but completely different firmware.
These names are names of folders within assets/ directory in the APK, where a firmware update file for the respective controller is stored. The firmware update doesn't seem to be downloaded online; instead it comes in the APK, and gets updated together with the APK. Interesting that binary files for GainSpan are 0 bytes long. Perhaps obsolete and not supported any more.
If adp_kind= value is outside of known range, the app ignores the discovered unit and does not display it in the list.
-
pv=[integer]
Conditioner protocol version. Duplicates /aircon/get_model_info -
cpv=[integer]
Suggested controller protocol version major number. Duplicates /aircon/get_model_info -
cpv_minor=[string]
Suggested controller protocol version minor number. Duplicates /aircon/get_model_info -
led=[boolean]
Status of controller's own LEDs (on/off). Not confirmed. -
en_setzone=[boolean]
Enable timezone set ? -
mac=204EF6663D8A
Controller's MAC address -
adp_mode=[string]
Adapter mode. A properly functioning wi-fi controller shows "run". Other possible values aren't known. -
en_hol=[boolean]
Enable holiday mode ? -
ssid1=[string]
WLAN SSID for client mode (home local network) -
radio1=[signed integer]
Wi-fi signal level -
ssid=[string]
Controller's own SSID in access point mode (when no WLAN connection is available) -
grp_name=[string ?]
Group name ? -
en_grp=[boolean]
Enable groups ? -
en_secure=[boolean]
If set to 1, every request must be authenticated by supplying "X-Daikin-uuid:" header with a registered UUID (see authentication above). Seen in BRP072C42.
Response: ret=OK,sta=2,cur=2024/9/23 1:33:23,reg=eu,dst=1,zone=252
Get current date and time
Response: ret=OK,csum=148eedb
Get firmware checksum
Response: ret=OK,reg=eu
Get controller's region code. Duplicates "reg" field, reported by /common/basic_info
The region code is stored in NVRAM and can be reprogrammed using /common/set_regioncode Daikin apps may required it to have a certain value. For example, "Daikin mobile controller", being asian app, only recognizes Thai (th) or Japanese (jp) controllers.
Known values: "eu" for BRP069 series, "th" for BRP072C42.
Response: ret=OK
Accessing this URL reboots the controller.
Response: ret=OK,pow=0,mode=3,adv=,stemp=22.5,shum=0,dt1=25.0,dt2=M,dt3=22.5,dt4=25.0,dt5=25.0,dt7=25.0,dh1=AUTO,dh2=50,dh3=0,dh4=0,dh5=0,dh7=AUTO,dhh=50,b_mode=3,b_stemp=22.5,b_shum=0,alert=255,f_rate=5,f_dir=0,b_f_rate=5,b_f_dir=0,dfr1=5,dfr2=5,dfr3=5,dfr4=5,dfr5=5,dfr6=5,dfr7=5,dfrh=5,dfd1=0,dfd2=0,dfd3=0,dfd4=0,dfd5=0,dfd6=0,dfd7=0,dfdh=0
- pow=[boolean]
Power on state: 0 = Off, 1 = On - mode=[integer]
Operation mode: 0 = Fan, 1 = Heat, 2 = Cool, 3 = Auto, 4 = Humidify, 7 = Dry - shum=[string]
Humidity setting: 0 = Off, AUTO_L = Low, AUTO = Standard, AUTO_H = High, CONTINUE = Continuous - en_demand=[boolean]
Demand mode enable/disable - dmnd_run=[boolean]
"Power saving mode is active" flag. When reported 1, the app displays a banner with respective message and suggests to change settings in case of discomfort. Related S21 functionality isn't known.
Response:
ret=OK,type=1,en_demand=0,mode=0,max_pow=70,scdl_per_day=4,moc=0,tuc=0,wec=0,thc=0,frc=0,sac=0,suc=0
-
type=[integer]
Suggested interface type (version). 0 = demand control not supported, 1 - current version. Other values are supposedly reserved for future; they allow for different, incompatible parameter schemes URL. -
en_demand=[boolean]
Demand mode enabled. Duplicates /aircon/get_control_info -
mode=[integer]
- 0 - manual
- 1 - schedule
- 2 - auto
-
max_pow=[integer]
maximum power limit setting for manual mode. The value is expressed as percentage; with 0 being theoretical minimum; and 100 being maximum. The app knows the following preset values:- Low - 40
- Medium - 50
- High - 60
Note that the controller does not read the demand setting back from the controller (F7 command byte 0), instead it remembers values, set by the app via /aircon/set_demand_control internally and writes to the controller (using D7 command) only when settings are changed by the app. The value being written to the conditioner is inverted (i. e. 100 - max_pow), in other words while max_pow represent consumption limit, the A/C value represent "saving percentage" with 0 being "no saving" (i. e. demand mode off) and 100 being theoretical maximum (save 100%).
-
scdl_per_day=[integer]
Has to do with schedule timer. Perhaps duplicates /aircon/get_scdltimer_info. If not present, the app defaults it to 4.
Response: ret=OK,price_int=27,price_dec=0
Response: ret=PARAM NG,msg=404 Not Found
Not supported
Response: ret=OK,target=0
Response: ret=OK,curr_day_heat=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_heat=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,curr_day_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0
Response: ret=OK,htemp=24.5,hhum=-,otemp=20.5,err=0,cmpfreq=42
Get sensor values (temperature, humidity, etc)
Response: ret=OK,format=v1,target=1,en_scdltimer=1,moc=0,tuc=0,wec=0,thc=0,frc=0,sac=0,suc=0
Parameters: target - timer ID from 1 to 3
Response: ret=PARAM NG,msg=404 Not Found
Not supported
Response: ret=OK,format=v1,f_detail=total#18;_en#1;_pow#1;_mode#1;_temp#4;_time#4;_vol#1;_dir#1;_humi#3;_spmd#2,scdl_num=3,scdl_per_day=6,en_scdltimer=0,active_no=1,scdl1_name=,scdl2_name=,scdl3_name=
Response: ret=OK,s_dayw=5,week_heat=0/0/0/0/0/0/0/0/0/0/0/0/0/0,week_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0
Response: ret=OK,today_runtime=27,datas=0/0/0/0/0/0/0
Response: ret=OK,previous_year=0/0/0/0/0/0/0/0/0/0/0/0,this_year=0/0/0/0/0/0/0/391
Response: ret=OK,curr_year_heat=0/0/0/0/0/0/0/0/0/0/0/0,prev_year_heat=0/0/0/0/0/0/0/0/0/0/0/0,curr_year_cool=0/0/0/0/0/0/0/0/0/0/0/0,prev_year_cool=0/0/0/0/0/0/0/0/0/0/0/0
Response (protocol v2):
ret=OK,model=135D,type=N,pv=2,cpv=2,cpv_minor=00,mid=NA,humd=0,s_humd=0,acled=0,land=0,elec=1,temp=1,temp_rng=0,m_dtct=0,ac_dst=--,disp_dry=0,dmnd=0,en_scdltmr=1,en_frate=1,en_fdir=1,s_fdir=1,en_rtemp_a=0,en_spmode=0,en_ipw_sep=0,en_mompow=0,en_onofftmr=1
Response (protocol v3.20):
ret=OK,model=135D,type=N,pv=3.20,cpv=3,cpv_minor=20,mid=NA,humd=0,s_humd=0,acled=0,land=0,elec=1,temp=1,temp_rng=0,m_dtct=0,ac_dst=--,disp_dry=0,dmnd=1,en_scdltmr=1,en_frate=1,en_fdir=1,s_fdir=1,en_rtemp_a=0,en_spmode=3,en_ipw_sep=1,en_mompow=1,en_onofftmr=1,hmlmt_l=10.0
A/C model info and optional features:
- model=[string]
model code, as reported by FC command. Four ASCII characters, reported by the A/C, are passed with no changes. The code reads as a hexadecimal number, which supposedly can be looked up in Daikin's internal model database. - type=[character]
Can be C or N, depending on F2 byte 1 bit 3. Unknown. - pv=[decimal]
Conditioner protocol version, as reported by FY00 and F8 commands. For v3+ also includes minor number, for example: pv=3.20 - cpv=[integer]
Controller Protocol Version, or Current Protocol Version. "Daikin online controller" app checks this instead of pv. Meaning of this is a guess, based on experiments and usage in Daikin app. My BRP069B41 sets cpv=0 in response to any other version than 2, reported by F8. Perhaps the controller should actually know pv version number, and 0 is a fallback with minimum functionality. - cpv_minor=[string]
Controller/Current Protocol Version minor number. "Daikin online controller" app checks for cpv=3,cpv_minor="00" (yes, string comparison) in couple of places, related to password and "demand" mode. - mid=[string]
My controller reports mid=NA for v2 protocol. For protocol versions 0 and 1 the app checks for mid=W instead of temp_rng=1 in order to choose temperature ranges for japanese models. - humd=[boolean]
"Humidify" operation mode is available - s_humd=[integer]
Humidity target setting availability From "Daikin online controller" app disassembly, the integer value is actually bit flags:- bit 0 Humidity setting is available in "Auto" mode
- bit 1 Humidity setting is available in "Cool" mode
- bit 2 Humidity setting is available in "Heat" mode
- bit 3 Humidity setting is available in "Fan" mode
- bit 4 Humidity setting is available in "Dry" mode
- bit 5 Humidity setting is available in "Humidify" mode
- bit 7 Humidity setting is available in principle. If disabled, the app doesn't present target humidity selection.
- acled=[boolean]
Depends on FK byte 0 bit 2. Perhaps provides LED control availability. No references found in "Daikin online controller" app. - land=[boolean]
"Laundry" operation mode is available. The app doesn't really handle this mode; only decoded name was found. - elec=[boolean]
Depends on FK byte 1 bit 0. Not used by the app. - temp=[boolean ?]
Unknown, no S21 command found, no use in the app - temp_rng=[boolean]
Depends on FK byte 1 bit 2. Specifies available temperature ranges, but only for protocol versions 2 or 3 and only if reg=jp parameter is present. Values are as follows (from Daikin online controller app):
Mode | temp_rng | Max | Min |
---|---|---|---|
Cool | 1 | 32 | 21 |
Cool | other | 32 | 18 |
Heat | 1 | 30 | 18 |
Heat | other | 30 | 14 |
-
m_dtct=[boolean]
Depends on FK byte 1 bit 3. Perhaps stands for "motion detector present" AKA "Intelligent eye", but unconfirmed. The app doesn't use this parameter. -
ac_dst=[string]
Depends on FK byte 2 bit 0. Value of 0 is reported as "jp", value of 1 is "--". Clearly relates to region (jp or EU ?), but the app ignores this particular setting; and experiments show no connection with reg= in /common/basic_info. -
disp_dry=[boolean ?]
Totally unknown. -
dmnd=[boolean]
Demand mode available. Specified by bit 0 of byte 3 in FK, only if protocol >= v3. -
en_scdltmr=[integer]
Supposedly a weekly schedule timer availability flag.
The app knows two values: 1 and 2. Probably the number specifies timer API version (see /aircon/get_scdltimer_info. Since this feature is quite complex, it's most likely implemented by controller itself, and does not map to any S21 functionality. -
en_frate=[boolean]
Fan speed control is available -
en_fdir=[boolean]
Fan direction (swing) control is available -
s_fdir=[integer]
Available swing directions (bitmask). Bit 0 = vertical, bit 1 = horizontal
These three bits are encoded in response to FK command. Daikin apps present fan controls depending on these values. -
en_rtemp_a=[boolean]
Unknown. Enabled for protocol v3+ if byte 0 bit 6 of FK is set to zero. Daikin online controller app doesn't use it.
When enabled, also enables presence of atlmt_l= and atlmt_h= parameters, (see below) -
en_spmode=[integer]
Bitmask, telling which special modes are present. Taken from FU00, requires protocol v3.20.- bit 0 - Powerful
- bit 1 - Eco
- bit 2 - Streamer
-
en_ipw_sep=[boolean]
Something to do with password lock. Controller's feature, not related to S21. -
en_mompow=[boolean]
Unknown. Not used by app. -
en_onofftmr=[boolean]
Reads like "enable on/off timer". Has always been seen reporting 1, and in fact F3 is mandatory; BRP069B41 controller keeps looping with NAK response and fails to start up if simulator returns NAK to this command. The app also does not contain any references to this flag. -
atlmt_l=[float] Unknown, only present when en_rtemp_a=1. Daikin online controller app doesn't use it.
-
atlmt_h=[float] Unknown, only present when en_rtemp_a=1. The value is determined by FU02 byte 1, Daikin online controller app doesn't use it.
-
hmlmt_l=[float]
Minimum allowed temperature for Heat mode. Depends on FU02 byte 3. This parameter is only present in v3 protocol; and only ifFU02
reports valid value. If missing, the "Daikin online controller" app defaults to 10.0.
The following parameters are not reported by my controller, but i found them in app disassembly:
- cmlmt_h=[float]
Maximum allowed temperature for Cool mode (non-japanese version). Defaults to 32. - cmlmt_l=[float]
Minimum allowed temperature for Cool mode (non-japanese version). Defaults to 18. - hmlmt_h=[float]
Maximum allowed temperature for Heat mode (non-japanese version). Defaults to 30. - subtype=[string]
If the value is "qa", temperature range of {cmlmt_h, hmlmt_l} will be used for Auto mode. Otherwise defaults to {30, 18}. - en_frate_auto=[boolean]
Specifies whether the A/C has "Auto" fan speed option. For protocol v2 defaults to 1 if not present. - en_frate_silent=[boolean]
Specifies whether the A/C has "Silent" fan speed option. For protocol v2 defaults to 1 if not present. - frate_steps=[integer]
Specifies how many fixed fan speeds (1 to 5, i. e. low to high) are available:
frate_steps | Speeds |
---|---|
empty value | None |
2 | 1, 5 |
3 | 1, 3, 5 |
anything else | 5 |
If not present, all speeds 1-5 are available
- reg=[string] The app checks for reg=jp in multiple places; certain capabilities depend on it a lot. Looks like denotes a japanese version, but needs japanese controller. It's unclear whether reg= has any relationship with dst= parameter.
Looks like monitor for some raw S21 values. Not used by the app, info provided by MUN0X: https://github.com/revk/ESP32-Faikin/issues/408#issuecomment-2332441985
Response (protocol 3.20):
ret=OK,mondata=pv=3.20,cpv=3,cpv_minor=20,mac=204ef6663d8a,fan=303532,tap=35,mode=33,pow=30,rawrtmp=2b323435,humid=ff,trtmp=2b323135,fangl=2b323335,hetmp=2b313835,itelc=3030303031303031,eepid=31333544,cmpfrq=303432,otmp=2b323035,gx00=0000,gx01=0000,gx02=00000000,gx03=0000,gx04=0000,gx05=0000,gx06=30303030,gx07=00000000,gx08=00000000,gx09=00000000,gx0A=00000000,gx0B=0000,gx0C=0000
Response (protocol 3.40):
ret=OK,mondata=pv=3.40,cpv=3,cpv_minor=40,mac=204ef6663d8a,fan=303532,tap=35,mode=33,pow=30,rawrtmp=2b323435,humid=ff,trtmp=2b323135,fangl=2b323335,hetmp=2b313835,itelc=3030303031303030,eepid=31333544,cmpfrq=303432,otmp=2b323035,stemp=49,deltaH=3034,tgthum=3332,fdir=303f,gx00=3241,gx01=3637,gx02=30303030,gx03=3030,gx04=3430,gx05=3030,gx06=30303030,gx07=30313930,gx08=00000000,swid=3137303135313831,gx09=46464646,gx0A=37343041,gx0B=3030,gx0C=3030,gx0D=3030303030303030,gx0E=3030303030303030,gx0F=3030303030303030,gx10=3030303030303030,gx11=3030303030303030,gx12=3033,gx13=303030030303030,gx14=3030303030313030,gx15=30303030,gx16=3643,gx17=3030,gx18=3032,fdir_ud=00,f_dir_lr=00,prod_model=46545841333543325631425320202020202020202020,prod_site=31202020,prod_line=202020202020,prod_order=322020202020202020202020202020,inp_site=3330,inp_base=30,inp_dev=30,inp_mdate=3230303030303030,inp_serial=303030303030303030303030,outp_site=3420,outp_base=20,outp_dev=20,outp_mdate=2020202020202020,outp_serial=202020202020202020202020,ResetCount=0,LastResetTime=----/--/-- --:--:--,RouterDisconCnt=0,PollingErrCnt=0
- pv, cpv, cpv_minor
Conditioner and controller protocol version. Duplicate information from /aircon/get_model_info - mac
Wi-fi adapter MAC address. Duplicates information from /common/basic_info - fan
Raw hexadecimal representation of fan RPM, reported by RL - tap
Unknown - mode
Raw hex representation of current operation mode, reported by byte 1 of F1 - pow
Raw hex representation of power on/off state, reported by byte 0 of F1 - rawrtmp
Raw hex representation of home temperature, reported by RH - humid
Humidity sensor value ? Needs confirmation - trtmp
Raw hex representation of target temperature value, reported by RX - fangl
Raw hex representation of louver angle value, reported by RN - hetmp
Raw hex representation of inlet temperature value, reported by RI - itelc
A 8-byte hexadecimal string; which is composed of responses from several other commands: - eepid
Raw hexadecimal representation of model ID, reported by FC - cmpfrq
Raw hexadecimal representation of compressor RPM, reported by Rd - otmp
Raw hexadecimal representation of outside temperature, reported by Ra - gx??
Not verified, but it's easy to see that these are raw hex responses of respective FXxx commands (protocol v3+). gx00=0000,gx01=0000,gx02=00000000,gx03=0000,gx04=0000,gx05=0000,gx06=30303030,gx07=00000000,gx08=00000000,gx09=00000000,gx0A=00000000,gx0B=0000,gx0C - swid=[8 bytes hex] Raw hexadecimal representation of indoor unit firmware version string, reported by bytes 0...7 of VS000M
- fdir_ud
TBD - f_dir_lr
TBD - prod_model
Raw hexadecimal representation of model number string, reported by FU05 with trailing FF bytes omitted - prod_site=[4 bytes hex]
Production site ??? Raw hexadecimal representation of bytes 0...3, reported by FU15 - prod_line=[6 bytes hex]
Production line ??? Raw hexadecimal representation of bytes 4...9, reported by FU15 - prod_order
Production order ??? Raw hexadecimal representation of data, reported by FU25 - inp_site=[2 bytes hex]
Raw hexadecimal representation of bytes 0...1, reported by FU35 - inp_base=[1 byte hex]
Raw hexadecimal representation of byte 2, reported by FU35 - inp_dev=[1 byte hex]
Raw hexadecimal representation of byte 3, reported by FU35 - inp_mdate=[8 bytes hex]
Raw hexadecimal representation of bytes 4...11, reported by FU35 - inp_serial=[12 bytex hex]
Raw hexadecimal representation of bytes 12...23, reported by FU35 - outp_site=[2 bytex hes]
Raw hexadecimal representation of bytes 0...1, reported by FU45 - outp_base=[1 byte hex]
Raw hexadecimal representation of byte 2, reported by FU45 - outp_dev=[1 byte hex]
Raw hexadecimal representation of byte 3, reported by FU45 - outp_mdate=[8 bytes hex]
Raw hexadecimal representation of bytes 4...11, reported by FU45 - outp_serial=[12 bytex hex]
Raw hexadecimal representation of bytes 12...23, reported by FU45
Response: ret=PARAM NG,msg=404 Not Found
Not supported
Parameters: key=[hex_string]
Register a client UUID. Supplied key must be the same key as printed on controller's sticker. If correct, responds with "ret=OK" and adds "X-Daikin-uuid:" header value to internal controller's database, thus authorizing the specified client.
Parameters: type=[integer] Unregister a client's UUID or everyone accorging to 'type' value given:
- 0 - Unregister self (only given UUID)
- 1 - Unregister others (except given UUID)
- 2 - Unregister everyone
Parameters: reg=[code]
Changes controller's region code, reported by /common/basic_info. The code is programmed into controller's NVRAM.
Description: TBD
Parameters: price_int=[integer],price_dec=[integer]
Provided values are stored in controller's NVRAM and provided back in /aircon/get_price. No S21 commands are issued