New DaikinOne+ Thermostat Integration

UPDATE: I have a working integration made: https://github.com/apetrycki/daikinskyport

It currently supports all the normal climate info and configuration, plus adds a few of the Daikin specific settings. Looking for people with this thermostat to try it out and provide feedback

I have one of the new DaikinOne+ smart thermostats (https://daikinone.com/) and I’m looking to create an integration for it. Unfortunately I’m not the best programmer, but I’ve decompiled the Android app (Daikin One Home) since they won’t give me the API documentation and found a bit of what I need. It looks similar to some other REST interfaces I’ve seen. It accesses api.daikinskyport.com using a token. It looks like that’s yet another API from Daikin, so I can’t just use someone else’s work and modify it. It may be similar to the ecobee, though. I also did a port scan on the thermostat itself and got nothing, so doesn’t look like it has a local API.

I’m hoping someone with better programming skills can help me out with decoding the decompiled code. I found a javascript in the app that looks to have quite a bit of the functions in it, but it’s going to take me a long time to read through the whole thing and try to understand it. If anyone has some cycles and is interested in helping reverse engineer this app for Home Assistant, please let me know. I don’t want to have to go back to a Honeywell just so I can get integration.

6 Likes

I’m in the same situation. Have a new North American Daikin One+ part number DTST-CWBSA-NI-A, model number One Plus - D9000. I’m not a great programmer either, but have an IT background. I’ve noticed that the thermostat isn’t detected by my network scans, but the router shows it giving a lease to a MAC address that shows the vendor as Goodman Manufacturing. In 2012, Goodman “became a member” of Daikin. Their earlier CTK04 thermostat is identical to our old Honeywell ones, even using the RedLink Gateway. So it appears to me that Daikin One+ may be nothing like other Daikin products. But in the press release from Jan 7 2019, it states “The Daikin One cloud also seamlessly integrates with open smart home architectures including Amazon Alexa and Google Assistant. It has an open application programming interface (API) for other home automation platforms, allowing consumers to effortlessly use features such as voice control.”

And after some digging, I located the document below, which appears to be the API for the platform. At least to me it does, as I think there is only one Daikin North America cloud, I assume. I highly doubt there are many home-assistant users with this thermostat as well as the ability to figure the integration out, but the documentation is here: https://cms.daikincomfort.com/docs/default-source/professional-documents/residential/manuals/daikin-dkn-cloud-wi-fi-adaptor.pdf

I don’t think that’s the same API, but maybe the auth is the same, so I’ll try it out. Do you have a link to the press release? I can’t find it. Maybe I can use that as leverage to get the Daikin rep to give me the real documentation.

I think I found a lot of the URIs for accessing information and setting the data from the javascript file. If I can just get the auth to work, I can try the URIs and see what comes back.

There aren’t a lot of people with this thermostat yet, but it’s going to be prevalent soon. Daikin is a big name and they’re pushing their communicating systems, so unless Nest and Ecobee get their thermostats to do the 2-wire comms, they’re going to lose a large chunk of the market.

On a side note, I find the DaikinOne+ to be slow and it has some bugs. I also expected to be able to pull more information from it. I’m told the next firmware release will include logging, so we’ll see how that works. I didn’t like the Honeywell it replaced, but it was a better thermostat IMO.

Auth isn’t the same either. I wiresharked the auth process and it goes to the api.daikinskyport.com. I tried using the same curl commands for both websites and it says I need to provide a token for the skyport and says my user isn’t found on the cloud site. I’m working on setting up fiddler to see if I can decrypt the traffic going from the app. It’ll probably be easier than trying to figure out the decompiled code.

Haha! I got it!

curl --location --request POST "https://api.daikinskyport.com/users/auth/login" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data '{"email": "<email>", "password": "<password>"}'

This returns:

{"accessToken":"<token>","accessTokenExpiresIn":3600,"refreshToken":"<token>","tokenType":"Bearer"}'
curl --location --request GET "https://api.daikinskyport.com/users/me" \
--header "Accept: application/json" \
--header "Authorization: Bearer <access token>"

Returns

{"id":"<some UUID-type string>","name":"<first> #<last>","email":"<email>"}
curl --location --request GET "https://api.daikinskyport.com/locations" \
--header "Accept: application/json" \
--header "Authorization: Bearer <access token>"

Returns an array of locations

[{"id":"<UUID of location>","name":"<Location Name>","address":"<street address>","city":"<city>","province":"<state/province>","postalCode":"<zip code>","country":"<country>","timeZone":"America/New_York","latitude":<lat>,"longitude":<long>,"hasOwner":true}]
curl --location --request GET "https://api.daikinskyport.com/devices" \
--header "Accept: application/json" \
--header "Authorization: Bearer <access token>"

Returns an array of devices

[{"id":"<UUID of the device>","locationId":"<UUID of location>","name":"<name of device>","model":"ONEPLUS","firmwareVersion":"1.4.5","createdDate":1563568617,"hasOwner":true,"hasWrite":true}]

The device’s UUID is used in the URI to get info on the device

curl --location --request GET "https://api.daikinskyport.com/deviceData/<UUID of device>" \
--header "Accept: application/json" \
--header "Authorization: Bearer <access token>"

Returns a ton of info

{"sysFault7Date":0,
"quietModeActive":1,
"alertDehumFilterRuntime":0,
"runtimeDay7Date":0,
"modeForceOff":false,
"schedWedPart1Label":"wake",
"schedSatPart6csp":27,
"fault4Date":0,
"schedWedPart2Action":0,
"oneCleanFanSpeed":1,
"schedTuePart4Label":"sleep",
"schedMonPart2csp":25.6,
"ctAHHumidificationFanSpeedPercent":255,
"ctHumidifierControl":2,
"ctIFCHumRequestedDemandPercent":255,
"schedSunPart3Label":"home",
"ctOutdoorCapacityPriority":255,
"messageHistory9Text":"",
"modeEmHeatAvailable":true,
"schedMonPart6Action":0,
"ctOutdoorSuctionTemperature":660,
"ctOutdoorHeatMaxRPS":585,
"schedMonPart3Action":0,
"schedSunPart3hsp":20,
"schedTuePart3Enabled":true,
"hspHome":17.2,
"fault3Level":255,
"schedWedPart3Time":68,
"ctEEVCoilCriticalFault":255,
"sysFault19Code":255,
"ctOutdoorTonnage":8,
"mode":3,
"aqIndoorValue":0,
"fault10Code":255,
"humSP":45,
"fault9Code":255,
"schedTuePart1Time":26,
"schedThuPart4Time":88,
"ctStatMinorFault":0,
"fault8Code":255,
"displayBrightness":90,
"alertCustom3Repeat":false,
"fault24Date":0,
"tipAirCirculationShown":false,
"runtimeDay1Cool2":0,
"ctOutdoorSuctionPressure":195,
"schedThuPart3Action":0,
"ctAHAccessorySetting":3,
"fault14Code":255,
"ctOutdoorDeHumidificationRequestedDemand":140,
"alertHEPAAirFilterActive":false,
"ctIFCGasHeatOnDelay":255,
"runtimeDay2Date":0,
"ctOutdoorBoostModeEnable":2,
"ctIFCCoolOnDelayNonCT":255,
"fault18Code":255,
"schedSatPart2Time":32,
"fault25Level":255,
"alertUVActive":false,
"schedSatPart4csp":23.3,
"schedOverride":0,
"fault11Level":255,
"weatherDay2Cond":"Scattered Thunderstorms",
"schedThuPart5Label":"",
"ctIFCCriticalFault":255,
"ctAHSuctionTemperature":657,
"runtimeDay6Heat4":0,
"alertMediaAirFilterRuntimeLimit":0,
"fault7Level":255,
"rfEnabled":false,
"schedSunPart5Enabled":false,
"alertDehumFilterDaysLimit":0,
"fault20Equipment":255,
"schedTuePart5Enabled":false,
"hspAway":14,
"commissionPreferences":1,
"ctOutdoorHPTrimFactorInt":6,
"ctOutdoorCompressorDelay":255,
"schedWedPart2csp":25.6,
"ctIFCFurnaceSize":255,
"schedFriPart6Time":0,
"sysFault1Date":1565648538,
"ctIFCGasHeatOffDelay":255,
"hspActive":20,
"alertElectronicAirFilterRuntimeLimit":0,
"alertCustom1Active":false,
"schedThuPart1Enabled":true,
"schedWedPart5Action":0,
"dehumSP":55,
"schedWedPart5Label":"",
"schedTuePart3hsp":20,
"schedWedPart6csp":27,
"ctSysTestFan":1,
"aqIndoorVOCValue":0,
"adrEnabled":true,
"tipGeofencingShown":false,
"schedOverrideDuration":0,
"displayLockPIN":0,
"schedSunPart4Enabled":true,
"ctIFCCoolAirflowTrimNonCT":255,
"ctSystemCapCool":true,
"fault3Date":0,
"alertCustom5Repeat":false,
"schedSatPart6Time":0,
"proximityEnabled":false,
"tempOffset":0,
"nightModeEnabled":false,
"schedSatPart6Label":"",
"schedThuPart1Time":26,
"schedMonPart3hsp":20,
"messageHistory5Date":0,
"messageHistory1Date":0,
"sysFault8Code":255,
"fault10Level":255,
"ctOutdoorSystemVerificationTest":1,
"NumElectronicfilters":0,
"ctSysTestDehumidifier":255,
"oneCleanParticleTrigger":500,
"messageHistory1Text":"",
"alertVentilationDays":0,
"dealerWebsite":"",
"schedTuePart6csp":27,
"alertUVRuntimeLimit":0,
"schedMonPart5csp":27,
"messageHistory4Type":0,
"humOffset":0,
"schedSatPart5hsp":18,
"ctOutdoorInverterSoftwareVersion":"4042    ",
"ctIFCUnitType":255,
"ctAHFanCurrentDemandStatus":50,
"schedWedPart4Enabled":true,
"geofencingAway":false,
"control":2,
"fault23Equipment":255,
"schedFriPart1csp":25,
"fault7Code":255,
"ctOutdoorHPTrimFactorLow":6,
"sysFault9Date":0,
"schedTuePart6Action":0,
"ctIFCCoolOffDelayNonCT":255,
"sysFault4Code":255,
"alertServiceDaysLimit":0,
"schedSunPart6Enabled":false,
"aqOutdoorOzone":67,
"fault12Code":255,
"schedTuePart6Enabled":false,
"ctCoilControlSoftwareVersion":"o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=",
"fault17Code":255,
"schedThuPart2csp":25.6,
"schedMonPart4csp":23.3,
"schedThuPart2hsp":20,
"weatherDay1Hum":76,
"schedTuePart4csp":23.3,
"schedWedPart3csp":25,
"schedMonPart6csp":27,
"schedSatPart5csp":27,
"runtimeDay5Cool2":0,
"schedWedPart1csp":25,
"schedMonPart1Enabled":true,
"ctEEVCoilMinorFault":255,
"schedThuPart1Action":0,
"schedThuPart3Label":"home",
"runtimeDay2Cool2":0,
"aqIndoorParticlesLevel":0,
"schedSatPart1hsp":20,
"schedMonPart2Enabled":true,
"heatPumpLockoutEnable":1,
"schedSatPart5Time":0,
"sysFault2Date":0,
"fault14Date":0,
"commissionStatus":1,
"ctHumidifierConnection":0,
"runtimeDay7Cool2":0,
"fault19Level":255,
"schedFriPart2hsp":20,
"runtimeDay5Cool1":0,
"ctSysTestHumidifier":255,
"sysFault8Date":0,
"alertDehumFilterActive":false,
"schedFriPart5Label":"",
"rfNetworkSignal":0,
"ctOutdoorPumpDown":1,
"geofencingEnabled":true,
"alertCustom3Description":"",
"schedSunPart1Label":"wake",
"adrStaticHeat":20,
"messageHistory8Text":"",
"runtimeDay5HeatCycles":"0",
"ctAHControlSoftwareVersion":"14002202       ",
"ctSystemCapDehumidification":true,
"ctSystemCapElectricHeat":true,
"sysFault17Code":255,
"schedTuePart4Time":88,
"schedMonPart1Time":26,
"alertHumPadRuntimeLimit":0,
"schedThuPart4Label":"sleep",
"adrOffsetHeat":-2,
"ctIFCGasHeatTrimFactorPercent":255,
"sysFault15Code":255,
"fanExtendCool":300000,
"schedMonPart6Enabled":false,
"schedMonPart5Action":0,
"ctStatModelNoCharacter1_15":"",
"sysFault20Date":0,
"ctAHHeatOFFDelay":60,
"runtimeDay5CoolCycles":"0",
"ctAHAUXAlarm":255,
"schedMonPart3Enabled":true,
"schedThuPart3hsp":20,
"runtimeDay7Heat2":0,
"ctEEVCoilSuperHeatValue":32767,
"schedSatPart2Action":0,
"ctStatBalancePoint":0,
"ctAHHumidificationSetting":255,
"schedFriPart4hsp":19.4,
"ctOutdoorCompressorReductionMode":1,
"fault14Level":255,
"schedTuePart2csp":25.6,
"fault24Equipment":255,
"schedMonPart3Time":68,
"messageHistory4Text":"",
"alertHumPadDays":0,
"ctIFCHumiditySetting":255,
"fault6Date":0,
"schedTuePart6Time":0,
"adrState":0,
"schedSatPart1Enabled":true,
"heatPumpLockoutTemp":-1,
"fault6Code":255,
"weatherDay2TempC":30,
"ctIFCDehumRequestedDemandPercent":255,
"runtimeDay5Heat1":0,
"alertCustom2Repeat":false,
"schedSunPart4Time":88,
"ctAHLiquidTemperature":628,
"alertMediaAirFilterDays":0,
"messageHistory3Text":"",
"weatherDay5TempC":29,
"schedTuePart1Label":"wake",
"schedSatPart3Label":"home",
"ctEEVCoilSuctionTemperature":32767,
"auxHeatLockoutEnable":1,
"schedTuePart2Time":32,
"schedThuPart2Label":"work",
"ctOutdoorCoilTemperature":979,
"adrStaticCool":27,
"runtimeDay2Heat3":0,
"ctOutdoorVerticalRise":2,
"fault22Level":255,
"fault8Equipment":255,
"ctOutdoorModelNoCharacter1_15":"DZ18VC0481     ",
"schedMonPart2Label":"work",
"fault4Code":255,
"units":0,
"schedSatPart3hsp":20,
"oneCleanFanDuration":3,
"runtimeDay4Date":0,
"humDeltaMin":10,
"alertCustom5Date":0,
"ctAHElectricHeatKitWattage":2,
"ctAHElectricHeatKitSize":5,
"ctCoilSerialNoCharacter1_15":"o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=",
"alertUVDays":0,
"schedThuPart3Time":68,
"quietModeStartTime":88,
"schedMonPart6hsp":18,
"dealerName":"",
"messageHistory2Date":0,
"ctOutdoorCoolAirflowProfiles":4,
"tempSPMin":10,
"nightModeLightBarAllowed":true,
"sysFault12Code":255,
"schedFriPart2Label":"work",
"ctAHHeatONDelay":0,
"weatherDay3Hum":80,
"compressorMinOn":600000,
"tempDeltaMin":2.2,
"ctAHHumidificationRequestedDemand":0,
"schedTuePart4Enabled":true,
"schedThuPart6Action":0,
"schedTuePart3Label":"home",
"ctAHCurrentIndoorAirflow":500,
"ctOutdoorBoostTemperature":7,
"schedMonPart1csp":25,
"ctOutdoorDefrostHeat":255,
"ctIFCFanRequestedDemandPercent":255,
"ctHumidifierNumPads":0,
"runtimeDay1CoolCycles":"0",
"fault20Code":255,
"schedSunPart2Action":0,
"fault21Code":255,
"NumUVBulbs":0,
"equipmentSettingsReady":true,
"sysFault14Code":255,
"alertsWeatherEnabled":false,
"ctDehumidifierConnection":0,
"ctAHLiquidGasTemperature":32767,
"schedMonPart2Time":32,
"fault7Equipment":255,
"schedMonPart6Label":"",
"fault5Date":0,
"ctStatSerialNoCharacter1_15":"",
"tipAccountShown":false,
"runtimeDay6CoolCycles":"0",
"ctStatCriticalFault":0,
"ctAHRefrigerantType":"R-410A",
"schedSatPart4Action":0,
"fault20Level":255,
"soundEnabled":true,
"aqOutdoorLevel":0,
"nightModeStart":88,
"schedTuePart6hsp":18,
"schedSunPart6Label":"",
"alertHumPadActive":false,
"messageHistory7Text":"",
"schedFriPart4Action":0,
"messageHistory2Text":"",
"schedFriPart2Time":32,
"ctOutdoorUnitType":6,
"statFirmware":"1.4.5",
"ctOutdoorHPBlowerOnDelay":1,
"schedFriPart5csp":27,
"alertServiceActive":false,
"schedMonPart4Label":"sleep",
"sysFault5Code":255,
"sysFault20Code":255,
"fault22Equipment":255,
"schedSunPart4csp":23.3,
"schedSunPart5hsp":18,
"messageHistory3Type":0,
"alertCustom4Description":"",
"schedSunPart1Enabled":true,
"aqIndoorLevel":0,
"schedTuePart4Action":0,
"fault25Equipment":255,
"schedSatPart3Enabled":true,
"alertCustom1Description":"",
"runtimeDay7Heat4":0,
"weatherDay2Hum":81,
"runtimeDay4Heat2":0,
"schedSunPart1Time":26,
"schedFriPart3Time":68,
"schedWedPart2hsp":20,
"aqOutdoorAvailable":true,
"schedThuPart3csp":25,
"schedFriPart1Action":0,
"ctAHElectricHeatTrim":1,
"sysFault15Date":0,
"fault1Code":255,
"runtimeDay6Heat3":0,
"schedSunPart2Enabled":true,
"fault3Code":255,
"statModel":"ONEPLUS",
"rfNetworkType":0,
"ctOutdoorRequestedIndoorAirflow":980,
"alertHEPAAirFilterRuntime":0,
"fanCirculateActive":false,
"ctOutdoorHPBlowerOffDelay":1,
"systemTime24":false,
"fanExtendHeat":300000,
"ctIFCAUXAlarm":255,
"schedMonPart5Label":"",
"schedSatPart1Action":0,
"alertsServiceEnabled":false,
"alertCustom5Active":false,
"fault10Date":0,
"runtimeDay1HeatCycles":"0",
"schedSatPart3csp":25,
"fault16Code":255,
"schedMonPart4Time":88,
"schedFriPart2Enabled":true,
"sysFault10Date":0,
"schedWedPart4csp":23.3,
"runtimeDay7Heat3":0,
"schedSatPart4Enabled":true,
"ctAHMinorFault":0,
"runtimeDay3Heat3":0,
"fault16Equipment":255,
"ctOutdoorMinorFault":0,
"ctOutdoorSerialNoCharacter1_15":"1903018049     ",
"fault21Equipment":255,
"cspAway":28,
"schedWedPart4hsp":19.4,
"schedTuePart5csp":27,
"oneCleanFanActive":false,
"ctStatUnitType":1,
"runtimeDay3Heat2":0,
"schedSunPart2Time":32,
"ctOutdoorDischargeTemperature":1479,
"runtimeDay6Heat1":0,
"schedWedPart4Label":"sleep",
"schedThuPart1Label":"wake",
"runtimeDay4Heat3":0,
"sysFault11Code":255,
"runtimeDay2HeatCycles":"0",
"ctAHSerialNoCharacter1_15":"1804403447     ",
"ctOutdoorMode":"Stop           ",
"weatherDay1Cond":"Partly Cloudy",
"runtimeDay4Cool1":0,"ctZone1orOther":false,
"runtimeDay2CoolCycles":"0",
"ctSystemCapGasHeat":false,
"fault15Code":255,
"fault23Date":0,
"schedThuPart4Action":0,
"runtimeDay3HeatCycles":"0",
"alertHumPadRuntime":0,
"fault13Date":0,
"ctOutdoorDefrostInterval":4,
"runtimeDay5Heat2":0,
"runtimeDay7Cool1":0,
"schedSunPart5csp":27,
"alertCustom4Date":0,
"alertCustom3Name":"",
"schedTuePart2Action":0,
"fault11Code":255,
"sysFault4Date":0,
"fault2Equipment":255,
"schedFriPart5Time":0,
"alertHEPAAirFilterDays":0,
"ctSystemCapHeat":true,
"ctOutdoorCriticalFault":0,
"ctOutdoorCoolBlowerOnDelay":1,
"ctCoilUnitType":255,
"ctOutdoorFanRPM":3,
"schedThuPart1hsp":20,
"schedFriPart3Action":0,
"schedMonPart4hsp":19.4,
"adrOffsetCool":2,
"alertCustom2Name":"",
"alertElectronicAirFilterDaysLimit":0,
"ctOutdoorCoolMaxRPSOffset":21,
"ctIFCOperatingHeatCoolMode":"o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=",
"schedWedPart5csp":27,
"schedFriPart5Enabled":false,
"runtimeDay7CoolCycles":"0",
"alertHEPAAirFilterDate":0,
"ctAHPressureSensor":166,
"fault20Date":0,
"screenSaverMode":0,
"language":0,
"fault1Date":0,
"cspSched":25.6,
"alertCustom4Name":"",
"sysFault13Date":0,
"schedFriPart2Action":0,
"schedSatPart4hsp":19.4,
"tipWifiShown":false,
"ctAHCriticalFault":0,
"schedThuPart2Time":32,
"ctStatUISoftwareVersion":"",
"schedSatPart6hsp":18,
"fault15Level":255,
"messageHistory4Date":0,
"alertCustom1Date":0,
"ctIFCCurrentCoolActualStatus":255,
"fanCirculateDuration":1,
"schedWedPart1Enabled":true,
"schedMonPart1Label":"wake",
"runtimeDay2Heat2":0,
"ctDehumidifierControl":3,
"schedMonPart3Label":"home",
"schedSatPart4Time":88,
"schedWedPart2Time":32,
"weatherDay3TempC":30,
"commissionPersonalization":1,
"schedFriPart1Time":26,
"schedTuePart5Time":0,
"weatherTodayIcon":"partlycloudy",
"ctOutdoorCoolTrimFactorHigh":8,
"runtimeDay3CoolCycles":"0",
"adrEventId":0,
"alertMediaAirFilterDate":0,
"runtimeDay4Cool2":0,
"weatherDay2Icon":"tstorms",
"schedFriPart1Label":"wake",
"messageHistory8Type":0,
"ctOutdoorSetMaxCurrent":1,
"runtimeDay3Heat1":0,
"fault21Date":0,
"displayDefaultBrightness":90,
"schedSunPart4Label":"sleep",
"dealerMessage":"",
"ctAHFanRuntime":2292,
"schedWedPart4Action":0,
"schedResumeTime":0,
"sysFault1Code":5,
"ctOutdoorNoofCoolStages":15,
"fault25Code":255,
"ctIFCControlSoftwareVersion":"o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=",
"messageHistory8Date":0,
"ctEEVCoilLiquidTemperature":32767,
"ctIFCIndoorBlowerAirflow":65535,
"schedWedPart6hsp":18,
"ctIFCCurrentFanActualStatus":255,
"alertCustom3Active":false,
"adrActualStop":0,
"fault25Date":0,
"fault19Code":255,
"ctAHIndoorBlowerMotorSizeHP":12,
"schedFriPart4Enabled":true,
"fault19Equipment":255,
"schedTuePart5hsp":18,
"schedSunPart4hsp":19.4,
"schedSunPart2hsp":20,
"ctAHDehumidificationRequestedDemand":255,
"fault23Level":255,
"alertElectronicAirFilterActive":false,
"ctIFCHeatRequestedDemandPercent":255,
"messageHistory10Text":"",
"schedSunPart6Action":0,
"ctIFCHeatAirflowProfile":255,
"schedTuePart1csp":25,
"nightModeStop":28,
"fanCirculateStop":72,
"messageHistory10Type":0,
"ctOutdoorCoolTrimFactorLow":6,
"runtimeDay4CoolCycles":"0",
"schedThuPart6Enabled":false,
"alertVentilationActive":false,
"fault22Date":0,
"fault9Level":255,
"weatherDay1Icon":"partlycloudy",
"schedFriPart6hsp":18,
"schedSunPart3csp":25,
"schedSunPart4Action":0,
"fault17Date":0,
"schedSunPart3Enabled":true,
"schedWedPart1Time":26,
"cspHome":24.4,
"fault2Code":255,
"tipAutoModeShown":false,
"commissionOptimization":1,
"messageHistory6Type":0,
"messageHistory3Date":0,
"schedThuPart6Time":0,
"alertCustom2Active":false,
"alertDehumFilterDate":0,
"schedThuPart2Action":0,
"schedThuPart3Enabled":true,
"ctOutdoorQuietModeEnabled":1,
"aqIndoorVOCLevel":0,
"runtimeDay4Heat4":0,
"ctAHModelNoCharacter1_15":"DV61PECD14     ",
"schedThuPart6Label":"",
"alertServiceDate":0,
"schedFriPart4Time":88,
"schedSatPart5Action":0,
"ctOutdoorHeatMaxRPSOffset":21,
"fault4Level":255,
"schedThuPart4csp":23.3,
"sysFault14Date":0,
"schedSatPart1Time":26,
"ctAHFanRequestedDemand":50,
"alertCustom1Name":"",
"fault6Level":255,
"aqIndoorAvailable":false,
"schedWedPart3Enabled":true,
"tempOutdoor":29,
"ctOutdoorSizeofHouse":2200,
"alertCustom5Description":"",
"fault4Equipment":255,
"ctOutdoorDehumidificationEnable":2,
"schedWedPart3hsp":20,
"schedSunPart2csp":25.6,
"ctSysTestHeatPumpHeat":1,
"weatherTodayTempC":29,
"schedFriPart1hsp":20,
"oneCleanAQITrigger":500,
"ctStatHighStageHeatDifferential":0,
"schedThuPart4Enabled":true,
"hspSched":20,
"commissionCommunication":1,
"weatherDay4Cond":"Thunderstorms/Wind",
"alertServiceDays":0,
"oneCleanAction":0,
"schedWedPart6Time":0,
"tipScheduleShown":false,
"rfNetworkName":"",
"schedWedPart4Time":88,
"weatherTodayCond":"Partly Cloudy",
"ctOutdoorHPTrimFactorHigh":6,
"alertElectronicAirFilterDays":0,
"ctSystemCapCompressorHeat":true,
"humIndoor":59,
"ctOutdoorNoiseDownLevel":255,
"schedFriPart5Action":0,
"alertHEPAAirFilterDaysLimit":0,
"schedWedPart3Action":0,
"schedTuePart1Enabled":true,
"runtimeDay1Heat2":0,
"ctSysTestElectricHeat":1,
"runtimeDay6Heat2":0,
"messageHistory1Type":0,
"runtimeDay1Heat4":0,
"ctAHSubCoolValue":-49,
"weatherDay3Cond":"Thunderstorms/Wind",
"adrAction":0,
"runtimeDay2Cool1":0,
"sysFault12Date":0,
"schedSatPart4Label":"sleep",
"quietModeStopTime":28,
"ctIFC24ACExists":0,
"equipmentCommunication":0,
"schedWedPart5Enabled":false,
"runtimeDay7HeatCycles":"0",
"overcoolAmount":0.6,
"schedThuPart5Enabled":false,
"ctAHUnitType":4,
"schedWedPart5hsp":18,
"fanCirculateSpeed":0,
"schedSatPart6Action":0,
"schedSunPart5Label":"",
"runtimeDay1Heat3":0,
"alertCustom3Date":0,
"sysFault6Date":0,
"schedSunPart3Action":0,
"messageHistory7Date":0,
"sysFault5Date":0,
"schedTuePart3csp":25,
"ctStatControlID":1,
"fault24Code":255,
"oneCleanVOCtrigger":60000,
"runtimeDay1Cool1":0,
"messageHistory5Type":0,
"ctOutdoorDefrostSensorTemperature":942,
"schedWedPart6Enabled":false,
"adrStatus":0,
"adrPrice":65535,
"alertUVDaysLimit":0,
"fault11Equipment":255,
"schedSunPart2Label":"work",
"schedEnabled":true,
"nightModeActive":false,
"alertDehumFilterDays":0,
"fault15Date":0,
"schedFriPart3Label":"home",
"schedTuePart6Label":"",
"sysFault7Code":255,
"runtimeDay3Heat4":0,
"fault18Date":0,
"ctIFCCoolRequestedDemandPercent":255,
"fault3Equipment":255,
"fault10Equipment":255,
"runtimeDay4Heat1":0,
"runtimeDay1Heat1":0,
"schedTuePart5Action":0,
"schedMonPart6Time":0,
"sysFault18Date":0,
"schedFriPart2csp":25.6,
"fault9Equipment":255,
"schedSatPart3Time":68,
"ctAHSuperHeatValue":81,
"sysFault16Date":0,
"ctSysTestCool":1,
"messageHistory10Date":0,
"modeLimit":1,
"schedSunPart1csp":25,
"fault8Date":0,
"fault11Date":0,
"weatherDay5Hum":85,
"runtimeDay5Heat3":0,
"fault5Equipment":255,
"runtimeDay1Date":0,
"runtimeDay6Cool1":0,
"fault18Level":255,
"alertElectronicAirFilterDate":0,
"messageHistory2Type":0,
"fault19Date":0,
"schedWedPart6Label":"",
"schedSatPart2hsp":20,
"schedTuePart1Action":0,
"schedSunPart1Action":0,
"schedWedPart2Label":"work",
"fault17Level":255,
"schedFriPart6Action":0,
"runtimeDay7Heat1":0,
"schedWedPart3Label":"home",
"humDeadband":10,
"schedTuePart2hsp":20,
"alertVentilationDate":0,
"alertCustom2Date":0,
"fanCirculate":0,
"lightBarEnabled":true,
"ctOutdoorCoolRequestedDemand":0,
"schedMonPart3csp":25,
"fault13Equipment":255,
"alertsSharingEnabled":false,
"fault23Code":255,
"rfAllowControl":false,
"schedWedPart1hsp":20,
"schedMonPart5hsp":18,
"ctIFCCoolCFMNonCT":255,
"runtimeDay3Date":0,
"schedThuPart5Action":0,
"alertMediaAirFilterDaysLimit":0,
"runtimeDay3Cool1":0,
"compressorMinOff":600000,
"ctDehumidifierFanSpeed":200,
"weatherDay4Icon":"tstorms",
"messageHistory9Type":0,
"sysFault6Code":255,
"schedThuPart5hsp":18,
"schedThuPart6hsp":18,
"ctSysTestGasHeat":255,
"fault5Level":255,
"fault2Date":0,
"schedMonPart1Action":0,
"deviceName":3,
"schedWedPart2Enabled":true,
"ctOutdoorNoofHeatStages":15,
"schedMonPart5Time":0,
"ctOutdoorCoolTrimFactorInt":7,
"schedMonPart2hsp":20,
"fault1Equipment":255,
"alertCustom2Description":"",
"schedFriPart5hsp":18,
"equipmentStatus":5,
"alertMediaAirFilterActive":false,
"schedSunPart6csp":27,
"alertElectronicAirFilterRuntime":0,
"fault21Level":255,
"schedThuPart5Time":0,
"fault12Level":255,
"tempIndoor":24.9,
"ctStatHighStageHeatTimer":0,
"messageHistory5Text":"",
"fault16Date":0,
"schedSatPart1csp":25,
"ctIFCCoolAirflowProfileNonCT":255,
"weatherDay5Cond":"Thunderstorms/Wind",
"ctZoneBoardExists":0,
"fault1Level":255,
"alertCustom4Repeat":false,
"ctIFCNoofGasHeatStages":255,
"fault7Date":0,
"schedFriPart6csp":27,
"ctAHMode":"Cool           ",
"fan":false,
"fault17Equipment":255,
"auxHeatLockoutTemp":10,
"sysFault18Code":255,
"sysFault13Code":255,
"cspActive":25.6,
"ctIFCCurrentHeatActualStatus":255,
"adrActualStart":0,
"schedFriPart6Label":"",
"messageHistory6Text":"",
"schedFriPart6Enabled":false,
"alertHEPAAirFilterRuntimeLimit":0,
"schedSunPart6Time":0,
"ctStatCTSoftwareVersion":"\u0001\u0007\n\u0000\u0000\u0000\u0001\u0000#\u0000\u0000\u0000\u0000\u0000\u0000",
"ctOutdoorCoolBlowerOffDelay":1,
"ctOutdoorDehumidificationCapable":1,
"alertHumPadDate":0,
"alertMediaAirFilterRuntime":0,
"schedMonPart5Enabled":false,
"messageHistory9Date":0,
"rfStatus":0,
"schedWedPart6Action":0,
"ctStatOSSoftwareVersion":"",
"alertUVRuntime":0,
"alertVentilationDaysLimit":0,
"timeZone":"America/New_York",
"schedFriPart4csp":23.3,
"ctAHnonDVPECHeaterKitExists":false,
"schedSatPart5Enabled":false,
"ctOutdoorControlSoftwareVersion":"4769           ",
"ctIFCHumidityFanSpeed":255,
"ctIFCSerialNoCharacter1_15":"o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=",
"schedThuPart6csp":27,
"NumMediafilters":1,
"humOutdoor":78,
"sysFault3Code":255,
"runtimeDay5Date":0,
"ctIFCModelNoCharacter1_15":"o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=o?=",
"schedWedPart1Action":0,
"sysFault9Code":255,
"schedSunPart6hsp":18,
"ctOutdoorCompressorRunTime":2129,
"fault15Equipment":255,
"fault14Equipment":255,
"schedFriPart3Enabled":true,
"schedFriPart3csp":25,
"aqOutdoorParticles":5,
"ctAHDVPECModelForHeaterKit":0,
"schedMonPart4Action":0,
"dealerEmail":"",
"fault13Code":255,
"weatherDay4Hum":83,
"runtimeDay6Date":0,
"adrEventCoolMax":29,
"ctOutdoorLiquidTemperature":952,
"ctAHHeatRequestedDemand":0,
"schedSatPart2Label":"work",
"aqOutdoorValue":32,
"schedSatPart2csp":25.6,
"sysFault10Code":255,
"fault9Date":0,
"ctOutdoorForceDefrost":255,
"schedTuePart2Enabled":true,
"tempSPMax":32,
"schedSunPart3Time":68,
"schedSatPart5Label":"",
"deviceNameCustom":"Other",
"schedThuPart1csp":25,
"sysFault19Date":0,
"schedFriPart1Enabled":true,
"sysFault11Date":0,
"fault5Code":255,
"ctOutdoorFanRequestedDemandPercentage":98,
"sysFault17Date":0,
"schedThuPart4hsp":19.4,
"schedThuPart5csp":27,
"fault8Level":255,
"schedTuePart3Time":68,
"weatherDay1TempC":30,
"schedSatPart6Enabled":false,
"runtimeDay6Cool2":0,
"fault12Date":0,
"runtimeDay5Heat4":0,
"ctSystemCapVentilation":false,
"schedWedPart5Time":0,
"schedSatPart1Label":"wake",
"ctIAQsensorExists":false,
"schedSatPart3Action":0,
"schedTuePart3Action":0,
"ctAHHeatCurrentDemandStatus":0,
"ctEEVCoilPressureSensor":32767,
"alertCustom1Repeat":false,
"ctIFCBlowerMotorSizeHP":255,
"alertCustom4Active":false,
"schedSunPart1hsp":20,
"schedMonPart4Enabled":true,
"schedTuePart5Label":"",
"runtimeDay2Heat1":0,
"alertCustom5Name":"",
"alertsEducationEnabled":true,
"ctOutdoorCoolMaxRPS":540,
"fault22Code":255,
"schedFriPart3hsp":20,
"schedTuePart4hsp":19.4,
"weatherDay4TempC":29,
"aqIndoorParticlesValue":0,
"adrEventHeatMin":18,
"runtimeDay2Heat4":0,
"fanCirculateStart":48,
"schedThuPart2Enabled":true,
"alertHumPadDaysLimit":0,
"sysFault16Code":255,
"fault13Level":255,
"schedTuePart1hsp":20,
"fault2Level":255,
"schedSunPart5Action":0,
"schedSunPart5Time":0,
"weatherTodayHum":78,
"runtimeDay3Cool2":0,
"schedTuePart2Label":"work",
"dealerPhone":"",
"fault6Equipment":255,
"runtimeDay4HeatCycles":"0",
"schedSatPart2Enabled":true,
"ctEEVCoilSubCoolValue":32767,
"fault18Equipment":255,
"NumHEPAfilters":0,
"ctSystemCapEmergencyHeat":true,
"commissionEquipment":1,
"ctOutdoorAirTemperature":921,
"sysFault3Date":0,
"schedMonPart2Action":0,
"schedMonPart1hsp":20,
"fault12Equipment":255,
"ctSystemCapHumidification":true,
"messageHistory6Date":0,
"runtimeDay6HeatCycles":"0",
"alertUVDate":0,
"ctOutdoorChargeMode":1,
"weatherDay5Icon":"tstorms",
"fault16Level":255,
"ctIFCMinorFault":255,
"schedFriPart4Label":"sleep",
"weatherDay3Icon":"tstorms",
"sysFault2Code":255,
"ctOutdoorHeatRequestedDemand":0,
"alertDehumFilterRuntimeLimit":0,
"fault24Level":255,
"messageHistory7Type":0,
"equipmentCapability":0,
"statType":"production"}

To refresh a token:

curl --location --request POST "https://api.daikinskyport.com/users/auth/token" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data '{"email": "<email>", "refreshToken": "<refresh token>"}'

To change to manual from schedule:

curl --location --request PUT "https://api.daikinskyport.com/deviceData/<device UUID>" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data '{"geofencingAway": "False", "schedEnabled": "False","schedOverride":0}'

Just change schedEnabled to True to enable the schedule

How times work:
They decided to be weird with how times work. Basically every 1=15mins. So midnight (00:00) is 0, 00:15=1, 08:00=8x4=32, etc.

hsp=heating set point
csp=cooling set point
“hspHome”: main manual heating set point in C
“cspHome”: main manual cooling set point in C

Set the operating mode:
“mode”: 2 is cool, 3 is auto, 1 is heat, 0 is off, emergency heat is 4

Set screen brightness:
“displayBrightness”: 0-100, percentage

Night mode:
“nightModeEnabled”: True/False
“nightModeLightBarAllowed”: true/false
“nightModeStart”: (see times)
“nightModeStop”: (see times)
“nightModeActive”: True/False (read only status)

Sensors:
“tempIndoor”: in C
“tempOutdoor”: in C
“humIndoor”: in %
“humOutdoor”: in %
“weatherDay[1-5]TempC”: forecast of the temps for days 1-5 (ex. weatherDay1TempC)
“weatherDay[1-5]Icon”: tstorms, partlycloudy, (these are all I have right now)
“weatherDay[1-5]Cond”: text description of conditions
“weatherDay[1-5]Hum”: humidity forecast
“ctAHFanCurrentDemandStatus”: looks like a %, current fan demand
“ctAHFanRequestedDemand”: looks like a %, the requested fan demand by thermostat
“ctAHCurrentIndoorAirflow”: maybe CFM?, current airflow

There are plenty of other sensors, but those are probably the most relevant to most people.

Fan:
“fanCirculate”: 0=off, 1=always on, 2=schedule, manual fan control
“oneCleanFanActive”: true/false runs the fan at high speed for 3 hours
“fanCirculateDuration”: 0=entire schedule, 1=5mins, 2=15mins, 3=30mins, 4=45mins runs the fan for this amount of time every hour in schedule

I started working on the python part of this. Hopefully someone will help me out since I’m just learning python. I stole the ecobee python code and made mods to it. It’s fairly similar except the ecobee stores all thermostats on the same URI where the Daikin Skyport uses different ones for each device:

This is not functional yet, but should be pretty close.

Oh wow! I should check my email more often! That is awesome! You may not need it now, but the original release announcement is here: https://www.businesswire.com/news/home/20190107005353/en/Introducing-Daikin-One™-Smart-Thermostat-Ecosystem-Intelligent

I’d be happy to test and fiddle, but I’m really not much help in that area!!!

But I’m impressed! Great progress!!!

Also, in case it helps you or others, scanning the QR codes in the box will lead you to https://daikinone.com/smart_thermostats/oneplus/pros/DaikinOnePlusProfessionals.pdf

In the dealer navigation section, on the 2nd page of the section, that apparently isn’t just an example. My dealer took a couple stabs at configuration. I wanted that dealer code to correct any issues if there were. I was amazed it shows you how to get the actual code. In the 2nd pic on the page, literally tap the info circle at the top right. It will display your actual code for your unit on the screen.

I’m checking to see if I can get a real API document from Daikin with that article as leverage. There are some values that would be nice to know what they mean like the fault codes. If they’re even in the app, they’d probably be difficult to find in the code.

If I find out Daikin is not going to cooperate, you could probably help out with documenting all the elements in the JSON. You can use curl to grab the current settings from your thermostat as I described above, then change something, grab the info again with curl, and do a diff on the two JSONs to see what changed when you did something in the thermostat. This is pretty much what I’ve been doing. I was using KOPLAYER as an Android emulator and Fiddler to intercept the traffic as a proxy, but the app doesn’t completely work on that version of Android. You could try using Fiddler to intercept a phone or tablet, but a newer version of Android might not allow the app to work with the Fiddler certificate. I haven’t tried it. Fiddler is pretty awesome and gives you an easy way to look at the JSON sent by the app. No need to diff JSONs to figure out what it did.

I can think of a lot of cool things we could do with some of the info in this API.

Sure! Glad to! Probably tomorrow.

Well, it won’t be today after all. That storm is hitting sustained 175mph and gusts 185mph. And the forecast path that was moving off-shore is now wiggling back west towards our shore. I may evacuate.

I’m in the same boat, I’m in Cocoa Beach. I’ll be heading inland tonight or tomorrow depending on what the forecast says this evening. Already all buttoned up.

Oh wow, small world. I live in Rockledge. I just decided to stay since it’s offshore still, not trending to move west, and I have hurricane impact windows. So, there lies an incredibly unexpected opportunity. You’ve got a willing cohort with a Daikin One+ just 2 bridges away. Heck, I worked in CB from 1990 through 2004 in what used to be the Holiday Office Center. It’s now a gym across from the Holiday Inn. My friend’s son-in-law is a CBPD officer. He’s about to go on duty for the next couple days. I’ve lived in this county since the 60’s.

I wouldn’t be surprised if Brevard Cooling and Heating installed it, then. They installed my new system when it went out a few months ago. Exchanged my thermostat when the One+ became available.

Bingo! They installed mine last year. I’d asked the sales rep to be sure the new thermostat supported Alexa and Homekit. Then they installed the Honeywell. Pretty frustrated it was 5 year old technology, so they promised the Daikin One+ swap when it was released. After many, many phone calls, it was put in on 8/12/19.

Oh, if it helps, I found the menu structure/options online at https://daikinone.com/smart_thermostats/oneplus/pros/DaikinOnePlus-CommissioningMenuOutline.pdf

Good luck with the storm! Be safe!

I’ve made a good bit of progress. It loads without errors, but it doesn’t create a climate entity. My suspicion is I’m not creating the list of thermostats correctly or I’m not retrieving it right. I really wish someone who actually knows Python would jump in and help out. I think I’m like 95% there with this.

Alright, it seems to be working to some degree now. I just got it and I’m sure there are plenty of bugs, but grab it and see what happens for you. It at least displays my setpoints.

It doesn’t seem to work in the custom_components folder, so you’ll have to put it in the main components folder. I’m guessing this is due to the linking for imports in home assistant. You’ll need to copy the init.py in the root of the github to site-packages/daikinskyport and the other folder to your components folder. Then just add:

daikinskyport:
  email: <your email>
  password: <your password>

Let me know if it works for you.

Most stuff is working now. I’ve tested changing modes, changing fan config, setting presets, added sensors for the outdoor sensor, and the information seems to be updating correctly. Let me know if someone else gives it a try.