BLE сенсорный демон для Linux. Собирает данные с BLE устройств, обрабатывает и сохраняет/отправляет.
- Установка
- Конфигурация
- Запуск
- BLE объекты
- Парсеры
- Обработчики (handlers)
- Неизвестные устройства
- Сборка
- Systemd
- Примеры
- Дополнение
# Скачать с релизов
# amd64
sudo cp bin/linux/amd64/blevaettir /usr/local/bin/
# arm64
sudo cp bin/linux/arm64/blevaettir /usr/local/bin/
# Создать директории
sudo mkdir -p /etc/blevaettir /var/lib/blevaettir /var/log
# Скопировать конфиг
sudo cp blevaettir.yaml.example /etc/blevaettir/blevaettir.yaml
# Установить права
sudo chown root:root /usr/local/bin/blevaettir
sudo chmod +x /usr/local/bin/blevaettirgit clone https://github.com/saintbyte/BleVaettir.git
cd BleVaettir
make buildКонфигурация хранится в YAML файле. Полный пример: blevaettir.yaml.example
ble:
hci: 0 # HCI интерфейс Bluetooth (обычно 0)
storage:
path: "/var/lib/blevaettir/data.db" # Путь к SQLite базе
intervals:
scan_duration_sec: 5 # Длительность одного сканирования (секунды)
scan_interval_sec: 30 # Интервал между сканированиями (секунды)
log:
level: "info" # Уровень логирования: debug, info, warn, error
handlers: # Глобальные обработчики (применяются к объектам без собственных)
- type: "db"
db:
enabled: true
- type: "http"
http:
enabled: false
endpoint: "http://localhost:8080/api/sensors"
api_key: ""
ca_cert: "" # Путь к CA сертификату (опционально)
client_cert: "" # Путь к клиентскому сертификату (опционально)
client_key: "" # Путь к ключу клиента (опционально)
skip_verify: false # Пропустить проверку TLS (не рекомендуется)
- type: "log"
- type: "narodmon"
narodmon:
enabled: false
endpoint: "http://narodmon.ru/json"
owner: "Your Name"
lat: "55.7558"
lon: "37.6173"
alt: "150"
- type: "datacake"
datacake:
enabled: false
endpoint: "https://api.datacake.co"
skip_verify: false
unknown_objects:
enabled: true # Обрабатывать неизвестные устройства
handlers:
- type: "log"
ble_objects: # Список отслеживаемых BLE устройств
- name: "Kitchen"
mac: "A4:C1:38:12:34:56"
parsers:
- type: "xiaomi_lywsd03mmc"
handlers: # Собственные обработчики (опционально)
- type: "db"| Параметр | Тип | Описание | По умолчанию |
|---|---|---|---|
hci |
int | HCI интерфейс Bluetooth | 0 |
| Параметр | Тип | Описание | По умолчанию |
|---|---|---|---|
path |
string | Путь к SQLite базе данных | "" |
| Параметр | Тип | Описание | По умолчанию |
|---|---|---|---|
scan_duration_sec |
int | Длительность одного сканирования (сек) | 5 |
scan_interval_sec |
int | Интервал между сканированиями (сек) | 30 |
| Параметр | Тип | Описание | По умолчанию |
|---|---|---|---|
level |
string | Уровень логирования: debug, info, warn, error | info |
# Интерактивный режим (вывод в консоль)
blevaettir -config /etc/blevaettir/blevaettir.yaml
# Демон (отключается от консоли)
blevaettir -d -config /etc/blevaettir/blevaettir.yaml
# С логированием в файл
blevaettir -d -config /etc/blevaettir/blevaettir.yaml -log-file /var/log/blevaettir.log| Флаг | Описание | По умолчанию |
|---|---|---|
-config |
Путь к конфигу | blevaettir.yaml |
-d |
Запуск как демон | false |
-log-file |
Файл логов (для демона) | stdout |
ble_objects - список устройств для мониторинга.
ble_objects:
- name: "Имя устройства" # Человеческое имя
mac: "AA:BB:CC:DD:EE:FF" # MAC адрес (обязательно)
parsers: # Парсеры данных (минимум 1)
- type: "xiaomi_lywsd03mmc"
handlers: # Собственные обработчики (опционально)
- type: "db"
db:
enabled: true| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
name |
string | Да | Человеческое имя устройства |
mac |
string | Да | MAC адрес устройства |
parsers |
[]object | Да | Список парсеров |
handlers |
[]object | Нет | Собственные обработчики (если указаны, глобальные игнорируются) |
Парсер определяет формат данных из advertisement пакета.
| Тип | Описание | Данные |
|---|---|---|
xiaomi_lywsd03mmc |
Xiaomi LYWSD03MMC | temperature, humidity |
atc_thermometer |
ATC/BLE термометры | temperature, humidity |
jaalee |
Jaalee датчики | temperature, humidity, battery, rssi |
raw |
Сырые данные | raw (первый байт) |
parsers:
- type: "xiaomi_lywsd03mmc"Выводит:
temperature- температура (°C)humidity- влажность (%)
parsers:
- type: "atc_thermometer"Выводит:
temperature- температура (°C)humidity- влажность (%)
parsers:
- type: "jaalee"Выводит:
temperature- температура (°C)humidity- влажность (%)battery- заряд батареи (%)rssi- уровень сигнала (dBm)
parsers:
- type: "raw"Выводит значение первого байта manufacturer data.
К одному устройству можно применить несколько парсеров:
ble_objects:
- name: "Test Device"
mac: "AA:BB:CC:DD:EE:FF"
parsers:
- type: "xiaomi_lywsd03mmc"
- type: "raw"Обработчики определяют что делать с полученными данными.
| Тип | Описание |
|---|---|
db |
Сохранение в SQLite |
http |
HTTP POST запрос |
log |
Логирование через slog |
narodmon |
Отправка на Narodmon.ru |
datacake |
Отправка в DataCake |
Глобальные обработчики (handlers) применяются ко всем устройствам без собственных обработчиков:
handlers:
- type: "db"
db:
enabled: true
- type: "log"Объектные обработчики переопределяют глобальные для конкретного устройства:
ble_objects:
- name: "Kitchen"
mac: "A4:C1:38:12:34:56"
parsers:
- type: "xiaomi_lywsd03mmc"
handlers:
- type: "db"
db:
enabled: true
- type: "log"Сохранение показаний в SQLite базу.
handlers:
- type: "db"
db:
enabled: trueТаблица readings:
| Поле | Тип | Описание |
|---|---|---|
id |
INTEGER | PRIMARY KEY |
sensor_mac |
TEXT | MAC адрес |
sensor_name |
TEXT | Имя из конфига |
type |
TEXT | Тип данных (temperature, humidity, raw) |
value |
REAL | Значение |
unit |
TEXT | Единица измерения |
timestamp |
TIMESTAMP | Время измерения |
Отправка данных HTTP POST запросом в JSON формате.
handlers:
- type: "http"
http:
enabled: true
endpoint: "http://localhost:8080/api/sensors"
api_key: "secret_key" # Bearer token (опционально)
ca_cert: "/path/to/ca.pem" # CA сертификат (опционально)
client_cert: "/path/to/cert.pem" # Клиентский сертификат (опционально)
client_key: "/path/to/key.pem" # Ключ клиента (опционально)
skip_verify: false # Пропустить проверку TLSФормат POST запроса:
[
{
"sensor_mac": "A4:C1:38:12:34:56",
"sensor_name": "Kitchen",
"type": "temperature",
"value": 22.5,
"unit": "°C",
"timestamp": "2026-03-23T12:00:00Z"
}
]Заголовки:
Content-Type: application/jsonAuthorization: Bearer <api_key>(если указан)
Простое логирование через slog.
handlers:
- type: "log"Вывод (level=debug):
level=INFO msg="sensor reading" mac=A4:C1:38:12:34:56 name=Kitchen type=temperature value=22.5 unit="°C"
Отправка данных на сервис Narodmon.ru.
handlers:
- type: "narodmon"
narodmon:
enabled: true
endpoint: "http://narodmon.ru/json"
owner: "Your Name"
lat: "55.7558"
lon: "37.6173"
alt: "150"Параметры:
| Параметр | Тип | Описание |
|---|---|---|
enabled |
bool | Включить обработчик |
endpoint |
string | URL API Narodmon |
owner |
string | Имя владельца |
lat |
string | Широта |
lon |
string | Долгота |
alt |
string | Высота над уровнем моря |
Отправка данных в сервис DataCake.
handlers:
- type: "datacake"
datacake:
enabled: true
endpoint: "https://api.datacake.co"
skip_verify: falseПараметры:
| Параметр | Тип | Описание |
|---|---|---|
enabled |
bool | Включить обработчик |
endpoint |
string | URL API DataCake |
skip_verify |
bool | Пропустить проверку TLS |
Устройства, обнаруженные при сканировании, но не присутствующие в ble_objects.
unknown_objects:
enabled: true
handlers:
- type: "log"
- type: "narodmon"
narodmon:
enabled: false
endpoint: "http://narodmon.com/post"При обнаружении отправляют:
sensor_mac- MAC адресsensor_name- "unknown"type- "raw"value- количество байт manufacturer dataunit- "bytes"
# Собрать все платформы
make build
# Очистить
make clean
# Пересобрать
make clean && make buildlinux/amd64- 64-бит Intel/AMDlinux/arm64- 64-бит ARMlinux/386- 32-бит Intel
bin/
├── amd64/blevaettir
├── arm64/blevaettir
└── 386/blevaettir
sudo cp bin/linux/amd64/blevaettir /usr/local/bin/
sudo cp blevaettir.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable blevaettir
sudo systemctl enable --now blevaettir.timer
sudo systemctl start blevaettir# Статус
sudo systemctl status blevaettir
# Логи
sudo journalctl -u blevaettir -f
# Перезапуск
sudo systemctl restart blevaettir
# Остановка
sudo systemctl stop blevaettir
#ble:
hci: 0
storage:
path: "/var/lib/blevaettir/data.db"
intervals:
scan_duration_sec: 5
scan_interval_sec: 30
log:
level: "info"
handlers:
- type: "db"
db:
enabled: true
ble_objects:
- name: "Thermometer"
mac: "A4:C1:38:12:34:56"
parsers:
- type: "xiaomi_lywsd03mmc"ble:
hci: 0
storage:
path: "/var/lib/blevaettir/data.db"
intervals:
scan_duration_sec: 5
scan_interval_sec: 30
log:
level: "info"
handlers:
- type: "db"
db:
enabled: true
- type: "http"
http:
enabled: false
endpoint: "http://homeassistant:8123/api/sensors"
api_key: ""
ble_objects:
- name: "Kitchen"
mac: "A4:C1:38:11:11:11"
parsers:
- type: "xiaomi_lywsd03mmc"
handlers:
- type: "db"
- type: "http"
- name: "Living Room"
mac: "A4:C1:38:22:22:22"
parsers:
- type: "atc_thermometer"
handlers:
- type: "db"
- name: "Outdoor"
mac: "A4:C1:38:33:33:33"
parsers:
- type: "xiaomi_lywsd03mmc"
handlers:
- type: "log"
unknown_objects:
enabled: true
handlers:
- type: "log"log:
level: "debug"Логи всех показаний:
level=INFO msg="sensor reading" mac=A4:C1:38:11:11:11 name=Kitchen type=temperature value=22.5 unit="°C"
level=INFO msg="sensor reading" mac=A4:C1:38:11:11:11 name=Kitchen type=humidity value=65 unit="%"
ble:
hci: 0
storage:
path: "/var/lib/blevaettir/data.db"
intervals:
scan_duration_sec: 5
scan_interval_sec: 30
log:
level: "info"
handlers:
- type: "narodmon"
narodmon:
enabled: true
endpoint: "http://narodmon.ru/json"
owner: "My Home"
lat: "55.7558"
lon: "37.6173"
alt: "150"
ble_objects:
- name: "Balcony"
mac: "A4:C1:38:AA:BB:CC"
parsers:
- type: "xiaomi_lywsd03mmc"handlers:
- type: "http"
http:
enabled: true
endpoint: "https://secure-api.example.com/sensors"
api_key: "my_token"
ca_cert: "/etc/blevaettir/ca.pem"
client_cert: "/etc/blevaettir/client.pem"
client_key: "/etc/blevaettir/client.key"- Linux с BlueZ
- Bluetooth адаптер с поддержкой BLE
- Go 1.25+
# Проверить HCI интерфейс
hciconfig -a
# Сбросить адаптер
sudo hciconfig hci0 down
sudo hciconfig hci0 up
# Запустить от root
sudo ./blevaettir -config config.yaml- Убедитесь что MAC адрес правильный
- Проверьте поддерживаемый тип парсера
- Включите debug логирование
- Проверьте что сенсор вещает advertise пакеты
# Проверить права доступа
ls -l /dev/hci*
groups $USER
sudo usermod -a -G bluetooth $USER
# Перелогиниться- BleVaettirDbPlot - тулза чтобы строить графики по данным БД