homebridge-daikon-plus
v0.1.1
Published
Homebridge platform for Daikin One Open API-compatible thermostats.
Maintainers
Readme
Daikon Plus
Homebridge platform plugin for Daikin One Open API-compatible thermostats.
Daikon Plus is a small Homebridge bridge for Daikin One+. The radish name is deliberate: Daikin One+ -> Daikone Plus -> Daikon Plus. Cute on the outside, boring adapter on the inside.
Official Daikin Open API docs: Overview, Documentation, License Terms.
Design notes live in DESIGN.md. Development notes live in DEVELOPMENT.md.
Installation
For the initial release and local validation, install on the Homebridge host with npm:
npm install -g homebridge-daikon-plusOnce the plugin is listed in Homebridge, it can be installed from the Homebridge UI by searching for homebridge-daikon-plus on the Plugins tab.
Credentials
Daikon Plus needs three Daikin Open API values:
apiKey: API key for the integration.integratorEmail: SkyportHome account email.integratorToken: Integrator Token linked to that SkyportHome account.
The Integrator Token email alone is not enough. Daikin's current documented flow:
- The owner installs SkyportHome, creates an account, and adds thermostats.
- The owner requests the Integrator Token in SkyportHome:
SkyportCare->home integration->get integration token. - The developer enables the SkyportHome developer menu.
- On iOS: iOS Settings app ->
SkyportHome-> developer menu. - On Android: SkyportHome ->
SkyportCare->home integration, then tap the page description 5 times. - The developer requests the API Key from
SkyportCare->home integration->developer.
Keep the API Key and Integrator Token secure. Daikin's API Terms say not to forward either credential to a third party.
Configuration
Configure Daikon Plus on the Homebridge host that will run it. Start read-only while validating discovery and state.
{
"platform": "DaikonPlus",
"name": "Daikon Plus",
"apiKey": "your-daikin-open-api-key",
"integratorEmail": "[email protected]",
"integratorToken": "your-integrator-token",
"readonly": true,
"developerMode": true
}Once discovery and state look right, set developerMode back to false, then set readonly to false for write testing.
Optional settings:
pollIntervalSeconds: defaults to180; lower values are ignored.requestTimeoutSeconds: defaults to20.includeDeviceName: defaults totrue.deviceIds: expose only selected thermostats/zones after discovery.developerMode: temporary verbose troubleshooting logs, including raw Open API payloads.
Runtime Behavior
- Each thermostat returned by
GET /v1/devicesis exposed as a HomeKit thermostat. - If outdoor readings are discovered, the thermostat also gets a separate HomeKit Outdoor Unit accessory with temperature and humidity sensors.
- If circulation fan fields are discovered, the thermostat also gets a separate HomeKit Circulation Fan accessory.
- The thermostat accessory includes a Schedule switch when the
scheduleEnabledfield is present, whether the current value istrueorfalse. - Optional HomeKit accessories and services are sticky once discovered. Transiently missing optional Daikin fields do not remove HomeKit surfaces, but writes that depend on currently missing fields are skipped with a warning.
- HomeKit temperatures are Celsius; Daikin Open API temperatures are treated as Celsius.
- Writes use
PUT /v1/devices/{deviceId}/mspwithmode,heatSetpoint, andcoolSetpoint. - Schedule writes use
PUT /v1/devices/{deviceId}/schedule. - Circulation fan writes use
PUT /v1/devices/{deviceId}/fan; thermostat temperature and mode changes never send fan payloads. - Successful HomeKit thermostat mode or setpoint writes disable the Daikin schedule by Open API design; the Schedule switch can be turned back on to resume Daikin scheduling.
- When Daikin reports
DeviceOfflineException, the affected HomeKit services report a fault and reads fail with a HomeKit communication error until a later refresh succeeds. - Background polling is kept to Daikin's documented minimum interval: 180 seconds.
- Successful HomeKit writes update local state immediately, then reconcile with the cloud after Daikin's documented 15-second reflection window.
- HomeKit target modes are limited from Daikin's
modeLimitbefore writes are sent to the Open API. - Emergency heat is not exposed as a separate HomeKit control. Normal HomeKit mode and setpoint writes are sent to Daikin, and the Daikin API remains the source of truth.
Set developerMode only temporarily. It logs raw API payloads, device IDs, and detailed HVAC state, and is mainly useful when checking how a zoned system appears in the Open API.
The Circulation Fan accessory controls Daikin's fan circulation setting, not the required HVAC blower during active heating or cooling. If Daikin reports fan-state changes after a thermostat write, HomeKit reflects them after the normal cloud refresh.
Troubleshooting
Discovery works, but HomeKit shows missing or conservative values
Daikon Plus validates every live thermostat payload before normalizing it for HomeKit. If Daikin omits a required thermostat field, reports a value in an unexpected type, or sends an enum value this plugin does not understand yet, the plugin logs a deduplicated Daikin payload validation warning and then uses the same safe fallback path as normal parsing. Unknown additive fields are not warnings; they are logged as developer notes only when developerMode is enabled.
This keeps Homebridge running while making Open API drift visible. When reporting an issue, include:
- the validation warning line,
- whether
readonlyis enabled, - whether this is a zoned system,
- the plugin version,
- and, if you are comfortable sharing it privately with sensitive IDs redacted, a temporary
developerModepayload.
Turn developerMode off again after troubleshooting because it can include detailed HVAC state and device identifiers.
Optional accessories disappear from Daikin but remain in HomeKit
Outdoor Unit, Circulation Fan, and Schedule surfaces are intentionally sticky once discovered. This avoids room and scene churn in HomeKit when the Open API temporarily omits optional fields. Writes for optional surfaces still fail closed when the current payload does not include the corresponding Daikin field.
