Skip to main content

Besen for Home Assistant & Python

GitHub Release PyPI HACS CI License


❤️ Help support this project

Support me on Ko-fi   Sponsor on GitHub

Support ongoing development and maintenance by donating on Ko-fi or sponsoring the project on GitHub. Bug reports, compatibility feedback, and contributions are welcome too.


Control and monitor Besen EV chargers locally over Bluetooth Low Energy, without a cloud service.

This repository contains both the Besen Home Assistant integration, installable through HACS, and the besen Python package that handles communication with the charger. The Python package also powers the built-in Besen integration in Home Assistant Core.

Which version should I use?

Installation Best for How updates arrive
Built-in Home Assistant integration Users who prefer stability and the normal Home Assistant release cycle. Included in Home Assistant; updated with Home Assistant Core. No HACS required.
HACS custom integration Users who want new features and fixes sooner. Releases from this repository, installed and updated through HACS.

New features and fixes are developed here first, then submitted to Home Assistant Core. HACS releases can make them available before they complete Core review and reach a Home Assistant release. The two versions do not necessarily have the same features at the same time.

For most users, start with the built-in integration. Choose HACS for earlier access to changes and be prepared to report issues. Python developers can go straight to Python package.

Supported chargers and prerequisites

The project has been verified with the Besen BS20 and supports single-phase and three-phase charger data. Other Besen chargers advertising as ACP#... and using the same Bluetooth protocol may also work.

Before setup, have:

  • The charger's 6-digit Bluetooth PIN.
  • A supported Bluetooth adapter or an ESPHome Bluetooth proxy with active connections enabled, within range of the charger.
  • A free Bluetooth connection to the charger. Disconnect any phone app, MQTT bridge, or other client already connected to it. Each charger uses one active connection slot.

Installation

Option 1: Built-in Home Assistant integration

Recommended for stability. Besen is included in Home Assistant starting with 2026.9. Use an up-to-date Home Assistant release; you do not need HACS or a manual package installation.

Add Besen to Home Assistant

  1. Click the button above, or open Settings > Devices & services > Add integration and search for Besen.
  2. Follow the setup flow and enter the charger's Bluetooth PIN. You can also configure a charger from its discovery card.
  3. Install future updates through the normal Home Assistant update process.

See the official Besen documentation for the functionality available in the built-in version.

Option 2: HACS custom integration

For earlier access to new features and fixes. The current HACS release requires Home Assistant 2026.9.2 or newer. Check release notes for the requirements of the version you install.

Install and configure HACS first, then add this repository:

Open Besen in HACS

  1. Click the button above and add/open Besen in HACS. Alternatively, open HACS > ⋮ > Custom repositories, add https://github.com/moryoav/besen, and select type Integration.
  2. Find Besen in HACS and download the latest release.
  3. Restart Home Assistant.
  4. For a new setup, click the button below or open Settings > Devices & services > Add integration > Besen. Select the discovered charger and enter its PIN.

Add Besen to Home Assistant

Already using the built-in Besen integration? Keep your existing entry. After installing through HACS and restarting, the custom integration takes precedence. Do not add a second entry for the same charger.

Manual installation instead of HACS

Download a release from GitHub Releases, and copy its custom_components/besen directory into your Home Assistant configuration directory as /config/custom_components/besen. The file /config/custom_components/besen/manifest.json must exist. Restart Home Assistant, then complete setup as above. Update this copy manually when installing a newer release.

Features

The following describes the integration in this repository. The built-in version depends on your Home Assistant release and may not yet expose all of these entities.

Control Purpose
Charge switch Start or stop charging.
Charging current number Set the current limit from 6 A to the charger's reported maximum, with a 32 A fallback when no maximum is reported.
Temperature unit select Choose Celsius or Fahrenheit on the charger's screen. This does not change Home Assistant's temperature units.
Sensors Availability on a new installation
Charging power, total energy, session energy Enabled by default.
Session start, session duration Enabled by default. See session sensors.
Internal temperature, charging status, charging message Enabled by default.
Session current limit, scheduled start, charging time limit Disabled by default.
External temperature, error state, plug state, output state, current state Diagnostic entities; disabled by default.
L1 voltage and current; L2/L3 voltage and current on three-phase chargers Diagnostic entities; disabled by default.

Enable optional entities from the charger's device page. Use Total energy for cumulative consumption in the Energy dashboard; Session energy can reset between charging sessions.

Use standard Home Assistant actions such as switch.turn_on, switch.turn_off, number.set_value, and select.select_option in automations. Temperature-select action values are celsius and fahrenheit.

Updates arrive through local Bluetooth notifications. The integration keeps a connection open and reconnects when needed. Entities become unavailable while disconnected or unauthenticated; missing or unsupported readings appear as unknown.

Wi-Fi provisioning, PIN/device resets, charging-history downloads, firmware updates, and safety-certified load balancing are not provided by this integration.

Updates and switching versions

Built-in: update Home Assistant. HACS: install the update in HACS, then restart Home Assistant. Read the release notes and changelog before upgrading.

Returning from HACS to the built-in version: make a backup and check that your installed Home Assistant release supports the features you need. Remove the downloaded Besen custom integration through HACS, or remove /config/custom_components/besen for a manual installation, then restart Home Assistant. Keep the existing Besen entry in Devices & services; deleting it is not part of switching versions. Features not yet included in that Core release will no longer be available, so check affected dashboards and automations.

Troubleshooting

Download diagnostics

Available in HACS releases starting with v0.5.5.

Open Settings > Devices & services > Besen, open the menu for your charger entry, and select Download diagnostics.

The download contains charger model and firmware details, settings, readings, and connection/authentication status. The PIN, Bluetooth address, serial number, and charger names are redacted. Raw command replies and free-text error messages are excluded because they can contain private information.

Diagnostics use cached data and do not send commands, reconnect, or interrupt charging. If setup never completed, only the redacted configuration is returned. Review the downloaded file before attaching it to an issue.

Charger not discovered or no connectable Bluetooth path

Check Settings > Connectivity > Bluetooth > Advertisement monitor for an ACP#... device. Confirm that your proxy is connected to Home Assistant and supports active connections. Move it closer to the charger and disconnect other apps or bridges holding the charger's connection.

Entities become unavailable

Check Bluetooth's Connection monitor, signal quality, and the proxy's available active-connection slots. Review the Home Assistant log for connection or authentication errors. For a persistent problem, enable debug logging for Besen, reproduce the issue, and review the logs before sharing them.

PIN rejected

Use the current 6-digit charger PIN. If Home Assistant asks you to reauthenticate, enter it in that prompt. The existing entry is kept, so there is no need to delete and re-add the integration. After changing the PIN on the charger, reload the Besen entry to get the prompt right away.

HACS installation does not appear

Confirm that Home Assistant meets the release's minimum version, that /config/custom_components/besen/manifest.json exists, and that you restarted Home Assistant. Check the log for dependency or import errors.

Python package

The reusable async Python client lives in src/besen and is published on PyPI. It provides BLE connection management, PIN authentication, typed state updates, and charger commands for applications outside Home Assistant as well.

For a standalone Python application, use Python 3.12 or newer:

pip install besen

Read the Python library guide and API reference for a working example, lifecycle and control methods, state fields, exceptions, and Bluetooth connection notes. Library capabilities are not a promise that an equivalent Home Assistant entity exists.

Feedback and contributions

For HACS or Python package bugs, feature requests, and charger compatibility reports, open an issue. Include your charger model, Home Assistant version where applicable, whether you use Core or HACS, and relevant release versions. Do not include PINs or other private information in reports or logs.

For a problem with the built-in integration, use the issue-reporting link in the official Besen documentation.

Developers can refer to CONTRIBUTING.md and the Core alignment inventory.

Safety

This software controls real electrical equipment and is not a safety controller. Keep the charger's hardware protections, wiring, and current limits appropriate for the installation. Test charging controls manually before relying on automations.

Attribution and license

The Python communication library is licensed under MIT, with protocol work based on slespersen/evseMQTT.

The Core-derived Home Assistant integration and tests are licensed under Apache 2.0. See NOTICE.md for attribution details.

Metadata

Release files for besen 0.4.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for besen 0.4.8
File Size Uploaded
besen-0.4.8.tar.gz 30.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for besen 0.4.8
File Interpreter ABI Platform
besen-0.4.8-py3-none-any.whl Python 3 none any Details

Total release size: 55.3 kB

Release files / besen-0.4.8.tar.gz

Download URL besen-0.4.8.tar.gz
Size 30.5 kB
Tags Source
SHA-256 checksum
How to use checksums
29f2dcd04f027057a1fe777fb8430b91e1cc91f7595d6709d9083a6f807dd6a2
BLAKE2b-256 checksum
How to use checksums
2566852efa7633c53a51e38936c48b88a49ec9bff6aa27f217d6d6113d242bf8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release files / besen-0.4.8-py3-none-any.whl

Download URL besen-0.4.8-py3-none-any.whl
Size 24.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fda970f40b8be0af45a5102d366ad6171567480539695eb7916d02db678f96a6
BLAKE2b-256 checksum
How to use checksums
a6134fb6d73aed03f77423a69cdce9f4fce02a7109b27cc277ed70d10540cdd4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.11

2 release files

0.4.9

2 release files

This release

0.4.8 This release

2 release files

0.4.7

2 release files

0.4.6

2 release files

0.4.5

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page