BLUETTI

BLUETTI power station telemetry

Current Release
1.0.0
Developer
Percy2Live
License
MIT
BLUETTI

ioBroker.bluetti

Read-only ioBroker adapter for BLUETTI power stations — battery, solar, grid and load telemetry from the BLUETTI cloud.


Bring your BLUETTI power station's live data into ioBroker: state of charge, PV/grid input and AC/DC output power, plus connection and health indicators for UPS-style automations. Authentication uses the same BLUETTI cloud login as the official Home Assistant integration — no app passwords, no scraping.

Status: working and verified end-to-end against a live BLUETTI account (Elite 30 V2) on js-controller 7.0.7. Not yet published to the ioBroker repositories. The core telemetry is stable; richer per-model telemetry is still being validated against real payloads.

✨ Features

  • 🔋 Battery & power telemetry — state of charge, PV input, grid input, AC/DC output power
  • 🔐 Secure cloud login — BLUETTI OAuth with built-in credentials; the token is stored encrypted and refreshed automatically
  • 🔎 Device discovery — pick your device from a list after login
  • 🩺 Health & connection states — reachability, consecutive failures and a conservative outage-suspicion signal for UPS automations
  • 👀 Read-only & safe — the adapter never writes to your device (no mode/AC/DC/firmware changes)

🔌 Supported devices

ModelProduct codesStatus
BLUETTI Elite 30 V2EL30V2, PR30V2✅ Verified

Other BLUETTI models that expose the same cloud API are likely to work but are not yet validated. Sanitized real-world payloads are welcome to help extend support.

📦 Requirements

  • ioBroker with js-controller ≥ 6.0.11 and admin ≥ 7.6.20
  • A BLUETTI account with your device bound in the BLUETTI app
  • The device connected to the BLUETTI cloud (online in the app)

🚀 Installation & setup

The adapter is not yet in the ioBroker repository. Once accepted, you can install it directly from the ioBroker Admin UI (Adapter → search for "bluetti").

  1. Install the adapter and create a bluetti.0 instance.
  2. Open the instance configuration in ioBroker Admin.
  3. Click Authenticate with BLUETTI and complete the login in the browser window that opens. The adapter uses its built-in BLUETTI client credentials, so no client ID/secret fields are shown in the admin UI.
  4. Pick your device from the device selector.
  5. Save. Polling starts automatically; info.connection turns true once the first poll succeeds.

You only authenticate once — the token is kept encrypted in the auth.tokenJson state and refreshed in the background.

Security note: The OAuth token is stored in an encrypted ioBroker state (auth.tokenJson) with read: false, write: false. The encryption protects against casual exposure and backup/file-system access. Any ioBroker admin user can still read and decrypt the state via scripting or the REST API, since the encryption key is instance-wide. This is an accepted tradeoff: ioBroker admin users already have full system access, so the encrypted state does not weaken the overall security posture.

If you need to override the built-in client credentials for expert/debug use, edit the instance's native object directly in ioBroker. The adapter still falls back to its shipped defaults when those native values are empty.

📊 Objects & states

All states are read-only.

info

StateTypeDescription
info.connectionbooleanTrue when authenticated and a selected device returns usable data

device

StateTypeDescription
device.serialstringDevice serial number
device.modelstringDevice model
device.namestringDevice name
device.onlinebooleanWhether the device is online in the BLUETTI cloud
device.workModestringCurrent working mode as reported by the device (raw enum, e.g. workmode_3)

battery

StateTypeDescription
battery.socnumber %Battery state of charge
battery.dischargeRemainingnumber minEstimated minutes until empty at the current load
battery.chargeRemainingnumber minEstimated minutes until fully charged; 0 when not charging

power

StateTypeDescription
power.pvInputnumber WPhotovoltaic (solar) input power
power.gridInputnumber WGrid input power
power.acOutputnumber WAC output (load) power
power.dcOutputnumber WDC output (load) power
power.acOutputActivebooleanWhether the AC output is currently switched on
power.dcOutputActivebooleanWhether the DC output is currently switched on
power.acEcobooleanWhether AC ECO power-saving mode is enabled
power.dcEcobooleanWhether DC ECO power-saving mode is enabled

health

StateTypeDescription
health.outageSuspectedbooleanConservative outage-suspicion trigger
health.consecutiveFailuresnumberConsecutive polling failures
health.authFailedbooleanWhether the last failure was an authentication problem

status

StateTypeDescription
status.lastUpdatestringTimestamp of the last successful poll
status.lastErrorstringLast sanitized error message

⚙️ Configuration

OptionDefaultDescription
Poll interval300 sHow often the BLUETTI cloud is polled for fresh telemetry
OAuth client ID / secretbuilt inNot exposed in Admin; expert overrides remain available via direct native-object edit

⚠️ Cloud dependency & UPS caveat

This adapter reads from the BLUETTI cloud, so it depends on your internet connection and BLUETTI's servers being reachable.

A cloud-only adapter cannot prove a grid outage on its own. It can only expose evidence — stale telemetry, cloud/device reachability, and repeated polling failures. For reliable power-outage automations, combine these states with at least one local signal, such as a router/ping check, a smart meter, a Shelly/energy meter, or a dedicated UPS signal.

🛠️ Development

The adapter is a TypeScript, class-based ioBroker adapter with a JSON admin config, scaffolded with @iobroker/create-adapter.

ScriptPurpose
npm run buildCompile TypeScript sources
npm run checkType-check without emitting
npm run lintRun ESLint
npm testRun unit and package tests
npm run test:integrationRun the ioBroker startup integration test
npm run test:repoRun the ioBroker repository checker locally

Architecture and research notes:

Until the adapter is published and tagged, npm run test:repo reports expected pre-release findings (package not on npm, release not tagged, adapter not yet in the ioBroker repository).

Changelog

WORK IN PROGRESS

  • (ioBroker-Bot) Adapter requires admin >= 7.8.23 now.

1.0.0

  • First stable release: full repochecker compliance, OIDC trusted publishing with provenance signing.
  • All pre-release repochecker findings resolved (#103–#107, #123, #124).
  • Object structure dump validated and attached to ioBroker repository submission (#108).
  • Adapter submitted to ioBroker latest repository (#81).

0.0.2

  • Trusted publishing setup: OIDC-based npm publish with provenance signing, registry-url and npm 11 in CI.
  • Populate device.model and device.name from getUserProducts cache; resolve workMode labels via supportModeValues.
  • Device selector always visible; empty list signals unauthenticated state.
  • Degrade gracefully when persisted OAuth token is corrupt instead of crashing the adapter.
  • Refresh device list after OAuth completes without reopening the config dialog.
  • Redact device serial in info-level polling log line.
  • Repo cleanup: remove non-adapter files, redundant publishConfig, and GitHub/npm install instructions from README.
  • Remove prepare lifecycle script and set common.nogit to suppress repochecker warnings.
  • Add local repochecker audit results and prepare ioBroker.repositories submission entry.

0.0.1

  • Initial release: BLUETTI cloud OAuth login, device discovery/selection, and read-only telemetry polling for the Elite 30 V2.
  • Added verified Elite 30 V2 telemetry from a real deviceStates payload: battery discharge/charge time remaining, AC/DC output and ECO status, and working mode.

Older entries are kept in CHANGELOG_OLD.md.

License

MIT License

Copyright (c) 2026 Percy2Live