Home Assistant integration for the EasyLevel caravan and motorhome leveling sensor by CaraTech AB.
The EasyLevel sensor is a Bluetooth Low Energy (BLE) accelerometer that mounts on your caravan or motorhome and broadcasts real-time tilt angles so you can level it precisely — no app required once this integration is set up.
| Entity | Unit | Description | Enabled by default |
|---|---|---|---|
sensor.easylevel_pitch |
° | Front/back tilt, 5-sample smoothed | ✅ |
sensor.easylevel_roll |
° | Left/right tilt, 5-sample smoothed | ✅ |
sensor.easylevel_pitch_raw |
° | Instantaneous pitch (no smoothing) | ❌ |
sensor.easylevel_roll_raw |
° | Instantaneous roll (no smoothing) | ❌ |
sensor.easylevel_gravity_magnitude |
— | Raw accelerometer vector length (~16384 at rest) | ❌ |
Positive pitch = nose up. Positive roll = right side up.
- Home Assistant 2024.1.0 or newer
- A Bluetooth adapter or Bluetooth proxy within range of your sensor
Important: This integration makes an active GATT connection to the sensor to read data. Broadcast-only (passive) Bluetooth proxies are not supported — you need either a direct Bluetooth adapter on your HA host or a connectable ESPHome proxy.
- Open HACS in Home Assistant
- Click the three-dot menu (⋮) → Custom repositories
- Paste
https://github.com/dominikkukacka/easylevel-home-assistant, set type to Integration, click Add - Find EasyLevel in the HACS list and click Download
- Restart Home Assistant
# From the root of this repository:
cp -r custom_components/easylevel /config/custom_components/
# Then restart Home Assistant- Power on your EasyLevel sensor and bring it within Bluetooth range of your HA host
- Go to Settings → Devices & Services
- HA auto-discovers the sensor and shows a notification banner — click Configure to confirm
- If not auto-discovered: click + Add Integration, search for EasyLevel, and select your device from the list
After setup, click Configure on the EasyLevel integration card to adjust:
| Option | Default | Description |
|---|---|---|
| Enable polling | On | Uncheck to stop connecting to the sensor entirely. Existing sensor values are kept but stop updating. Useful when parked and leveled — re-enable when you move pitch. |
| Poll interval | 30 s | How often to connect and take a fresh reading. Range: 5 – 3600 seconds. Lower = more frequent updates, more battery use. |
Changes take effect immediately — no restart required.
The sensor (BLE device name prefix: CARATI) exposes a proprietary GATT service. The integration:
- Listens passively for BLE advertisements to detect when the sensor is nearby
- Every poll interval seconds, makes an active GATT connection
- Subscribes to notifications on characteristic
faf52c21-5078-11e9-b475-0800200c9a66for ~2 seconds (~60 packets at 30 Hz) - Applies a 5-sample moving average to smooth out MEMS noise (raw accuracy ≈ ±0.1°, smoothed ≈ ±0.02°)
- Disconnects to preserve sensor battery life
Each 12-byte notification packet contains 6 × int16 little-endian values: [accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z]. Tilt angles are derived via the standard 3-axis accelerometer formula:
pitch = atan2(-accel_x, sqrt(accel_y² + accel_z²)) # front/back
roll = atan2( accel_y, sqrt(accel_x² + accel_z²)) # left/right
The second service (5f672748-...) contains static calibration data and a writable config register — these are read on first connection but not used for angle calculation.
MIT