Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
Blaz Smehov 7e75e8309f chore: remove unused files, add dev docker compose and dockerfile for live rebuilds and testing pirms 1 mēnesi
api Replace broken link in api folder examples. pirms 5 gadiem
assets chore: remove unnecessary .keep files pirms 6 gadiem
build chore: remove unused files, add dev docker compose and dockerfile for live rebuilds and testing pirms 1 mēnesi
cmd chore: remove unused files, add dev docker compose and dockerfile for live rebuilds and testing pirms 1 mēnesi
configs fix a word mistake in writing pirms 5 gadiem
deployments chore: remove unnecessary .keep files pirms 6 gadiem
docs chore: add documentation pirms 2 mēnešiem
examples remove dead link pirms 3 gadiem
githooks chore: remove unnecessary .keep files pirms 6 gadiem
init chore: remove unnecessary .keep files pirms 6 gadiem
internal chore: remove unused files, refactor trackers api to do the functionlity beacons api did before pirms 1 mēnesi
pkg Update README.md pirms 2 gadiem
scripts feat: extend API pirms 1 mēnesi
third_party chore: remove unnecessary .keep files pirms 6 gadiem
tools Dapr examples for cmd, docs, pkg and tools pirms 6 gadiem
web more notes and notes in major directories pirms 7 gadiem
website Capitalize the H in GitHub pirms 5 gadiem
.editorconfig Created .editorconfig pirms 5 gadiem
.gitattributes Create .gitattributes pirms 2 gadiem
.gitignore feat: clean http response pirms 1 mēnesi
LICENSE.md empty repo pirms 8 gadiem
Makefile Add missing newlines pirms 1 gada
README.md chore: add documentation pirms 2 mēnešiem
go.mod feat: add postgresql container, ORM packages, refactor bridge to use paho MQTT library not the unmaintained one, refactor code to filter BLE beacons at bridge to reduce network traffic in Kafka pirms 1 mēnesi
go.sum feat: add postgresql container, ORM packages, refactor bridge to use paho MQTT library not the unmaintained one, refactor code to filter BLE beacons at bridge to reduce network traffic in Kafka pirms 1 mēnesi

README.md

AFA Systems Presence Detection

A comprehensive Bluetooth Low Energy (BLE) presence detection system that tracks beacon devices in real-time, calculates locations based on signal strength, and integrates with popular IoT platforms like Home Assistant and Node-RED.

🏗️ System Architecture

The system follows a microservices architecture with Apache Kafka as the central message bus:

┌─────────────┐    MQTT     ┌─────────────┐   Kafka    ┌─────────────┐
│   MQTT      │ ────────► │   Bridge    │ ────────► │  Decoder    │
│   Gateway   │           │   Service   │           │  Service    │
└─────────────┘           └─────────────┘           └─────────────┘
                                                          │
                                                          ▼
┌─────────────┐   WebSocket  ┌─────────────┐   Kafka    ┌─────────────┐
│   Web UI    │ ◄────────── │   Server    │ ◄───────── │  Location   │
│  Dashboard  │             │   Service   │           │  Algorithm  │
└─────────────┘             └─────────────┘           └─────────────┘

Core Components

🔌 Bridge Service (cmd/bridge/)

  • Purpose: MQTT to Kafka message gateway
  • Function: Subscribes to publish_out/# MQTT topics and forwards messages to Kafka rawbeacons topic
  • Features: Configurable MQTT connection, automatic reconnection, error handling

🔍 Decoder Service (cmd/decoder/)

  • Purpose: Processes raw BLE beacon advertisements
  • Supported Formats: Ingics, Eddystone, Minew B7
  • Functions:
    • Battery level monitoring
    • Fall detection events
    • Button press detection
    • Device telemetry extraction
  • Output: Processed events to alertbeacons Kafka topic

📍 Location Algorithm (cmd/location/)

  • Purpose: Calculates device locations based on RSSI and proximity
  • Features:
    • Weighted location calculation using RSSI values
    • Confidence scoring system
    • Location change notifications
    • Configurable thresholds and parameters
  • Output: Location events to locevents Kafka topic

🌐 Server Service (cmd/server/)

  • Purpose: HTTP API and WebSocket server
  • Features:
    • RESTful API for beacon management (CRUD operations)
    • Real-time WebSocket communication
    • Settings management interface
    • CORS-enabled web interface
    • Home Assistant integration endpoints

📊 Supporting Services

  • Kafka 3.9.0: Central message bus with automatic topic creation
  • Kafdrop: Web-based Kafka monitoring and management UI
  • Node-RED: IoT workflow automation with pre-configured flows
  • Redis: Real-time data caching and WebSocket session management
  • BoltDB: Embedded database for persistent storage

🚀 Quick Start

Prerequisites

  • Docker and Docker Compose
  • Go 1.24+ (for local development)
  • MQTT broker (compatible with BLE gateways)

Installation

  1. Clone the repository:

    git clone https://github.com/AFASystems/presence.git
    cd presence
    
  2. Start the system:

    cd build
    docker-compose up -d
    
  3. Verify services:

Configuration

Set the following environment variables:

# Web Server
HTTP_HOST_PATH=":8080"
HTTP_WS_HOST_PATH=":8081"

# MQTT Configuration
MQTT_HOST="tcp://mqtt-broker:1883"
MQTT_USERNAME="your_username"
MQTT_PASSWORD="your_password"

# Kafka Configuration
KAFKA_URL="kafka:29092"

# Database
DB_PATH="./volumes/presence.db"

📡 Supported Beacon Types

Ingics Beacons

  • Battery level monitoring
  • Event detection (fall detection, button presses)
  • Signal strength tracking

Eddystone Beacons

  • Eddystone-UID protocol support
  • Battery telemetry (Eddystone-TLM)
  • Proximity detection

Minew B7 Beacons

  • Vendor-specific format decoding
  • Button counter tracking
  • Battery status monitoring
  • Multiple button modes

🔧 Configuration Options

System Settings (SettingsVal)

Parameter Type Default Description
location_confidence int64 80 Minimum confidence level for location changes
last_seen_threshold int64 300 Time (seconds) before beacon considered offline
beacon_metrics_size int 10 Number of RSSI measurements to keep for averaging
ha_send_interval int64 60 Home Assistant update interval (seconds)
ha_send_changes_only bool true Send updates only on location changes
rssi_min_threshold int64 -90 Minimum RSSI value for beacon detection
enforce_rssi_threshold bool true Filter out weak signals

API Endpoints

Beacon Management

  • GET /api/beacons - List all registered beacons
  • POST /api/beacons - Register a new beacon
  • PUT /api/beacons/{id} - Update beacon information
  • DELETE /api/beacons/{id} - Remove a beacon

Settings

  • GET /api/settings - Get current system settings
  • POST /api/settings - Update system settings

WebSocket

  • /ws/broadcast - Real-time beacon updates and notifications

🏠 Home Assistant Integration

MQTT Auto-Discovery

The system automatically generates MQTT messages for Home Assistant:

# Example device tracker configuration
device_tracker:
  - platform: mqtt
    devices:
      beacon_001: "Presence/Beacons/beacon_001"

Battery Monitoring

# Battery level sensor
sensor:
  - platform: mqtt
    name: "Beacon Battery"
    state_topic: "Presence/Beacons/beacon_001/battery"
    unit_of_measurement: "%"
    device_class: battery

Button Detection

# Button press sensor
binary_sensor:
  - platform: mqtt
    name: "Beacon Button"
    state_topic: "Presence/Beacons/beacon_001/button"
    device_class: "button"

📊 Data Models

Core Entities

Beacon

type Beacon struct {
    Name                      string              `json:"name"`
    ID                        string              `json:"beacon_id"`
    BeaconType                string              `json:"beacon_type"`
    BeaconLocation            string              `json:"beacon_location"`
    LastSeen                  int64               `json:"last_seen"`
    Distance                  float64             `json:"distance"`
    LocationConfidence        int64               `json:"location_confidence"`
    HSButtonCounter           int64               `json:"hs_button_counter"`
    HSBattery                 int64               `json:"hs_button_battery"`
    // ... additional fields
}

BeaconAdvertisement

type BeaconAdvertisement struct {
    Hostname        string `json:"hostname"`
    MAC             string `json:"mac"`
    RSSI            int64  `json:"rssi"`
    Data            string `json:"data"`
    BeaconType      string `json:"beacon_type"`
    UUID            string `json:"uuid"`
    Major           string `json:"major"`
    Minor           string `json:"minor"`
    // ... additional fields
}

LocationChange

type LocationChange struct {
    Method           string `json:"method"`
    BeaconRef        Beacon `json:"beacon_info"`
    Name             string `json:"name"`
    PreviousLocation string `json:"previous_location"`
    NewLocation      string `json:"new_location"`
    Timestamp        int64  `json:"timestamp"`
}

🐳 Docker Services

Available Services

Service Image Ports Description
kafka apache/kafka:3.9.0 9092, 9093 Apache Kafka message broker
kafdrop obsidiandynamics/kafdrop 9000 Kafka monitoring UI
presence-bridge local/build - MQTT to Kafka bridge
presence-decoder local/build - BLE beacon decoder
presence-location local/build - Location calculation service
presence-server local/build 8080, 8081 HTTP API and WebSocket server

Volumes

  • ./volumes/presence.db - BoltDB database file
  • ./volumes/node-red/ - Node-RED configuration and flows
  • ./volumes/kafka-data/ - Kafka persistent data

🔧 Development

Local Development Setup

  1. Install dependencies:

    go mod download
    
  2. Run individual services:

    # Run bridge service
    go run cmd/bridge/main.go
    
    # Run decoder service
    go run cmd/decoder/main.go
    
    # Run location algorithm
    go run cmd/location/main.go
    
    # Run API server
    go run cmd/server/main.go
    
  3. Run tests:

    go test ./...
    

Building Docker Images

# Build all services
docker build -t presence-system .

# Build individual service
docker build -f build/package/Dockerfile.bridge -t presence-bridge .

Project Structure

/
├── cmd/                    # Main application entry points
│   ├── server/            # HTTP API & WebSocket server
│   ├── bridge/            # MQTT to Kafka bridge
│   ├── decoder/           # BLE beacon decoder
│   ├── location/          # Location calculation algorithm
│   └── testbench/         # Testing/development utilities
├── internal/              # Private application code
│   ├── app/               # Application components
│   └── pkg/               # Shared internal packages
│       ├── model/         # Data structures and types
│       ├── kafkaclient/   # Kafka producer/consumer
│       ├── config/        # Configuration management
│       ├── persistence/   # BoltDB operations
│       ├── redis/         # Redis client
│       └── bridge/        # MQTT bridge logic
├── build/                 # Build artifacts and Docker configs
│   ├── package/           # Dockerfile for each component
│   └── docker-compose.yaml # Complete system deployment
├── web/                   # Web interface files
├── volumes/               # Persistent data and configurations
├── scripts/               # Utility scripts
└── docs/                  # Documentation

📈 Monitoring and Debugging

Kafka Topics

  • rawbeacons - Raw BLE beacon advertisements
  • alertbeacons - Processed beacon events (battery, buttons)
  • locevents - Location change notifications

Health Checks

  • Kafka: Topic creation and broker connectivity
  • Services: Automatic restart on failure
  • Database: BoltDB integrity checks

Logs

# View service logs
docker-compose logs -f [service-name]

# View all logs
docker-compose logs -f

🔌 Integrations

Node-RED Flows

Pre-configured Node-RED flows are available in /volumes/node-red/:

  • Beacon monitoring dashboards
  • Location-based automations
  • Battery level alerts
  • Notification systems

MQTT Topics

System publishes to the following MQTT topics:

  • Presence/Beacons/{beacon_id}/location - Current beacon location
  • Presence/Beacons/{beacon_id}/battery - Battery level
  • Presence/Beacons/{beacon_id}/button - Button press events
  • Presence/Beacons/{beacon_id}/distance - Distance from nearest gateway

🤝 Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Development Guidelines

  • Follow Go conventions and best practices
  • Write comprehensive tests for new features
  • Update documentation for API changes
  • Use meaningful commit messages

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🆘 Support

🔮 Roadmap

Upcoming Features

Current Development Status

  • Bridge Service: Complete and stable
  • Decoder Service: Core functionality implemented
  • Location Algorithm: Basic algorithm functional
  • Server Service: API and WebSocket implementation
  • 🚧 Web Interface: Basic UI, enhancements in progress
  • 🚧 Documentation: Comprehensive documentation being created
  • 📋 Testing: Automated tests being expanded

AFA Systems Presence Detection - Real-time BLE beacon tracking and location intelligence for modern IoT environments.