Advanced Usage Examples
This page provides advanced usage examples for the bthome-logger tool beyond basic scanning.
Production Monitoring
Long-Running Monitoring
Monitor sensors continuously:
# Basic continuous monitoring
bthome-logger -f "Production-Sensor"
# With timestamp logging
bthome-logger -f "Sensor" | while read line; do
echo "$(date +%Y-%m-%d\ %H:%M:%S) $line"
done >> sensor-log.txt
# In screen session for remote monitoring
screen -S bthome-monitor
bthome-logger -f "Remote-Sensor"
# Press Ctrl+A, D to detach
# screen -r bthome-monitor to reattach
Automated Testing
Use in test scripts:
#!/bin/bash
# test-sensor.sh - Automated sensor verification
SENSOR_NAME="Test-Sensor"
TIMEOUT=60
echo "Testing sensor: $SENSOR_NAME"
# Check if sensor advertises within timeout
timeout $TIMEOUT bthome-logger -f "$SENSOR_NAME" | grep -q "Temperature"
if [ $? -eq 0 ]; then
echo "✓ Sensor is advertising"
exit 0
else
echo "✗ Sensor not found"
exit 1
fi
Multi-Device Scenarios
Home Monitoring Setup
Monitor multiple rooms:
# Terminal 1: Living room
bthome-logger -f "Living-Room"
# Terminal 2: Bedroom
bthome-logger -f "Bedroom"
# Terminal 3: Kitchen
bthome-logger -f "Kitchen"
# Or use tmux for split screen:
tmux new-session \; \
split-window -h \; \
split-window -v \; \
send-keys -t 0 'bthome-logger -f "Living"' C-m \; \
send-keys -t 1 'bthome-logger -f "Bedroom"' C-m \; \
send-keys -t 2 'bthome-logger -f "Kitchen"' C-m
Filter by Name Pattern
Monitor related devices:
# All climate sensors
bthome-logger -f "Climate"
# All sensors with common prefix
bthome-logger -f "Home-"
# Specific location
bthome-logger -f "Basement"
Data Analysis
Log and Parse Data
Capture data for analysis:
# Log to file
bthome-logger -f "Climate" > climate-data.log
# Parse temperature values
grep "Temperature" climate-data.log | \
sed 's/.*Temperature: \([0-9.]*\).*/\1/' > temps.txt
# Calculate average
awk '{sum+=$1} END {print "Average:", sum/NR, "°C"}' temps.txt
Extract Specific Measurements
# Extract humidity values
bthome-logger -f "Sensor" | \
grep "Humidity" | \
sed 's/.*Humidity: \([0-9.]*\).*/\1/'
# Extract RSSI values for range testing
bthome-logger -f "Sensor" | \
grep "RSSI" | \
sed 's/.*RSSI: \(-[0-9]*\).*/\1/'
Time-Series Data Collection
#!/usr/bin/env python3
# collect-data.py - Collect time-series sensor data
import subprocess
import re
import time
from datetime import datetime
sensor_name = "Climate-Sensor"
data_file = "sensor-data.csv"
# Write CSV header
with open(data_file, 'w') as f:
f.write("timestamp,temperature,humidity,battery\n")
# Start logger process
proc = subprocess.Popen(
['bthome-logger', '-f', sensor_name],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
temp = humidity = battery = None
try:
for line in proc.stdout:
# Parse temperature
match = re.search(r'Temperature: ([\d.]+)', line)
if match:
temp = match.group(1)
# Parse humidity
match = re.search(r'Humidity: ([\d.]+)', line)
if match:
humidity = match.group(1)
# Parse battery
match = re.search(r'Battery: (\d+)', line)
if match:
battery = match.group(1)
# All values collected, write to CSV
if temp and humidity:
timestamp = datetime.now().isoformat()
with open(data_file, 'a') as f:
f.write(f"{timestamp},{temp},{humidity},{battery}\n")
print(f"Logged: {timestamp}, {temp}°C, {humidity}%, {battery}%")
# Reset for next reading
temp = humidity = battery = None
except KeyboardInterrupt:
print("\nStopped data collection")
finally:
proc.terminate()
Development Workflows
Rapid Prototyping
Test changes quickly:
# Terminal 1: Edit and compile
vim src/main.cpp
pio run --target upload
# Terminal 2: Watch output
bthome-logger -f "Dev-Sensor"
# See changes immediately after upload
Debugging Advertisement Issues
# Step 1: Check if device advertises at all
bthome-logger -v | grep "Your-Device"
# Step 2: Check BThome company ID
bthome-logger -v -f "Your-Device" | grep "0xFCD2"
# Step 3: Verify sensor data
bthome-logger -f "Your-Device"
Range and Signal Testing
#!/bin/bash
# range-test.sh - Test signal strength at distances
SENSOR="Test-Sensor"
echo "Place sensor at different distances and press Enter"
echo "Distance (m), RSSI (dBm)"
for distance in 1 2 5 10 15 20; do
read -p "Sensor at ${distance}m - Press Enter..."
# Capture 5 RSSI readings
rssi=$(timeout 30 bthome-logger -f "$SENSOR" | \
grep "RSSI" | head -5 | \
sed 's/.*RSSI: \(-[0-9]*\).*/\1/' | \
awk '{sum+=$1} END {print sum/NR}')
echo "$distance, $rssi"
done
Integration Examples
Home Assistant MQTT Bridge
Forward sensor data to Home Assistant:
#!/usr/bin/env python3
# bthome-mqtt-bridge.py
import subprocess
import re
import json
import paho.mqtt.client as mqtt
# Configuration
SENSOR_NAME = "Climate-Sensor"
MQTT_BROKER = "localhost"
MQTT_PORT = 1883
MQTT_TOPIC_PREFIX = "homeassistant/sensor/bthome"
# Connect to MQTT
client = mqtt.Client()
client.connect(MQTT_BROKER, MQTT_PORT)
client.loop_start()
# Start logger
proc = subprocess.Popen(
['bthome-logger', '-f', SENSOR_NAME],
stdout=subprocess.PIPE,
text=True
)
data = {}
try:
for line in proc.stdout:
# Parse values
if "Temperature:" in line:
match = re.search(r'Temperature: ([\d.]+)', line)
if match:
data['temperature'] = float(match.group(1))
elif "Humidity:" in line:
match = re.search(r'Humidity: ([\d.]+)', line)
if match:
data['humidity'] = float(match.group(1))
elif "Battery:" in line:
match = re.search(r'Battery: (\d+)', line)
if match:
data['battery'] = int(match.group(1))
# Publish when complete reading received
topic = f"{MQTT_TOPIC_PREFIX}/{SENSOR_NAME}/state"
payload = json.dumps(data)
client.publish(topic, payload)
print(f"Published: {payload}")
data = {}
except KeyboardInterrupt:
print("\nStopping bridge")
finally:
proc.terminate()
client.loop_stop()
client.disconnect()
Prometheus Exporter
Export metrics for Prometheus:
#!/usr/bin/env python3
# bthome-prometheus-exporter.py
from prometheus_client import start_http_server, Gauge
import subprocess
import re
import time
# Metrics
temperature = Gauge('bthome_temperature_celsius', 'Temperature in Celsius')
humidity = Gauge('bthome_humidity_percent', 'Humidity in Percent')
battery = Gauge('bthome_battery_percent', 'Battery level in Percent')
rssi = Gauge('bthome_rssi_dbm', 'RSSI in dBm')
# Start HTTP server
start_http_server(8000)
print("Prometheus exporter running on :8000")
# Start logger
proc = subprocess.Popen(
['bthome-logger', '-f', 'Climate'],
stdout=subprocess.PIPE,
text=True
)
try:
for line in proc.stdout:
# Update metrics
match = re.search(r'Temperature: ([\d.]+)', line)
if match:
temperature.set(float(match.group(1)))
match = re.search(r'Humidity: ([\d.]+)', line)
if match:
humidity.set(float(match.group(1)))
match = re.search(r'Battery: (\d+)', line)
if match:
battery.set(int(match.group(1)))
match = re.search(r'RSSI: (-\d+)', line)
if match:
rssi.set(int(match.group(1)))
except KeyboardInterrupt:
print("\nStopping exporter")
finally:
proc.terminate()
Alert System
Send alerts based on sensor values:
#!/bin/bash
# alert-monitor.sh - Monitor and alert on thresholds
SENSOR="Freezer-Sensor"
MAX_TEMP="-18" # Alert if above -18°C
ALERT_EMAIL="admin@example.com"
bthome-logger -f "$SENSOR" | while read line; do
if echo "$line" | grep -q "Temperature"; then
temp=$(echo "$line" | sed 's/.*Temperature: \([-0-9.]*\).*/\1/')
if (( $(echo "$temp > $MAX_TEMP" | bc -l) )); then
# Send alert
echo "ALERT: Freezer temp $temp°C exceeds $MAX_TEMP°C" | \
mail -s "Freezer Temperature Alert" "$ALERT_EMAIL"
echo "Alert sent: $temp°C > $MAX_TEMP°C"
fi
fi
done
Advanced Filtering
Multiple Device Patterns
# Monitor all sensors matching pattern
for device in "Living" "Bedroom" "Kitchen"; do
bthome-logger -f "$device" > "${device}-log.txt" 2>&1 &
done
# Wait for all background jobs
wait
Device Discovery
Find all BThome devices:
# Scan for 60 seconds and list unique devices
timeout 60 bthome-logger -v | \
grep "0xFCD2" | \
sed 's/.*📱 \([^ ]*\).*/\1/' | \
sort -u
Tips and Tricks
Keyboard Shortcuts
Ctrl+C - Stop scanner
Ctrl+Z - Suspend (use
fgto resume)Ctrl+L - Clear screen (most terminals)
Output Redirection
# Save to file
bthome-logger -f "Sensor" > output.log
# Append to existing file
bthome-logger -f "Sensor" >> output.log
# Discard output
bthome-logger -f "Sensor" > /dev/null
# Separate stdout and stderr
bthome-logger -f "Sensor" > output.log 2> errors.log
Performance
# Reduce CPU usage with longer scan intervals
# (Modify source if needed)
# Monitor resource usage
top -p $(pgrep -f bthome-logger)
See Also
bthome-logger Tool - Tool documentation
API Reference - Library API
Development Workflow - Development workflow