SensorPush HT1 w/ full decode & historical backfill (no cloud, no account)

SensorPush HT1 – fully local Bluetooth integration with onboard history backfill (no cloud, no account)

GitHub Repo


I built a local Bluetooth integration for the SensorPush HT1 temperature and humidity sensor. No SensorPush account, no cloud, no internet required.


What it does

The HT1 broadcasts temperature and humidity over Bluetooth every second to anyone listening – no pairing required. This integration receives that data directly and updates your entities in real time.

Every 30 minutes (configurable), it briefly connects to the sensor via GATT to read battery level and download the onboard history. The HT1 stores weeks of per-minute readings in onboard flash memory. This integration retrieves all records newer than the last known timestamp and injects them into Home Assistant’s long-term statistics, giving you a continuous temperature and humidity record stretching back to when the battery was last replaced.


How this differs from other HT1 integrations

Other community implementations of the HT1 stop at passive Bluetooth advertisements – they receive the temperature and humidity broadcast and nothing else. That works, but it leaves most of what the HT1 is capable of on the table.

This integration goes further:

  • Battery level and voltage – retrieved via GATT connection. You know when the battery needs replacing before the sensor goes silent.
  • Signal strength (RSSI) – useful for diagnosing placement and range issues.
  • Onboard history backfill (this is the big one) The HT1 stores weeks of per-minute readings in onboard flash memory. No other HA integration retrieves this data. On first setup, the entire contents of the flash are injected into Home Assistant’s long-term statistics automatically. After that, every poll retrieves any records newer than the last known timestamp and fills them in. The result is a continuous, gap-free record of temperature and humidity going back to when the battery was last replaced..even covering time before HA was installed.

The history download protocol was not publicly documented anywhere prior to this integration. The characteristic UUIDs involved (ef090009 and ef09000a) are listed as RESERVED in SensorPush’s own BLE API reference with no further detail. The protocol was determined through direct BLE probing and behavioral testing.


Entities

Entity Default Description
Temperature Enabled Live reading from passive BLE advertisement
Humidity Enabled Live reading from passive BLE advertisement
Battery Enabled Battery percentage
Battery Voltage Disabled Raw battery voltage in volts
Signal Strength Disabled RSSI in dBm

Installation

Manual: download the latest release, unzip it, and copy the custom_components/sensorpush_ht1/
folder into your HA config directory. Restart Home Assistant.

HACS: add https://github.com/wxfield/ha-sensorpush-ht1 as a custom repository with category Integration.

Full instructions and protocol documentation are in my README.


Note for existing SensorPush app/cloud users

This integration is independent of the SensorPush cloud. Both can coexist. Passive advertisements are received by anyone simultaneously. Only the periodic GATT connection (battery + history) is exclusive. If the app happens to be syncing at the same moment HA polls, that poll is skipped and retried at the next interval. If you want to preserve your cloud history before switching, export it from the app first. The HT1 requires no pairing..there is nothing to unpair.


Requirements

  • Home Assistant 2024.1.0 or later
  • Bluetooth adapter accessible to HA
  • SensorPush HT1 in range