Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
Blaz Smehov 28d70bea24 feat: gracefully close kafka connections on docker sigterm signal há 5 dias
api Replace broken link in api folder examples. há 5 anos
assets chore: remove unnecessary .keep files há 6 anos
build feat: reimplement redis support, using hash maps for quick insert and read há 1 semana
cmd feat: gracefully close kafka connections on docker sigterm signal há 5 dias
configs fix a word mistake in writing há 5 anos
copy_files chore: refactor, extending decoder func há 1 mês
deployments chore: remove unnecessary .keep files há 6 anos
docs chore: add documentation há 1 semana
examples remove dead link há 3 anos
githooks chore: remove unnecessary .keep files há 6 anos
init chore: remove unnecessary .keep files há 6 anos
internal feat: gracefully close kafka connections on docker sigterm signal há 5 dias
log_files chore: add health check for EMQX, bridge service awaits check há 1 mês
pkg Update README.md há 1 ano
scripts feat: reimplement redis support, using hash maps for quick insert and read há 1 semana
test feat: implement basic API, reimplement Redis and some methods for quick insert (persistence in case of crash) using hash maps há 1 semana
third_party chore: remove unnecessary .keep files há 6 anos
tools Dapr examples for cmd, docs, pkg and tools há 6 anos
web more notes and notes in major directories há 7 anos
website Capitalize the H in GitHub há 5 anos
.editorconfig Created .editorconfig há 4 anos
.gitattributes Create .gitattributes há 2 anos
.gitignore feat: locations algorithm, chore: remove unused files há 1 semana
LICENSE.md empty repo há 8 anos
Makefile Add missing newlines há 1 ano
README.md chore: add documentation há 1 semana
ResLevis-Diagram-2.0.drawio chore: refactor api server, add tests há 1 mês
ResLevis-Diagram.drawio chore: refactor api server, add tests há 1 mês
beacon.csv chore: add beacons file, add kafka health check há 3 semanas
gateway.csv chore: add beacons file, add kafka health check há 3 semanas
go.mod feat: add MQTT -> kafka bridge, template for decoder há 1 mês
go.sum feat: add MQTT -> kafka bridge, template for decoder há 1 mês
presence.db feat: add MQTT -> kafka bridge, template for decoder há 1 mês
presense.container feat: add MQTT -> kafka bridge, template for decoder há 1 mês

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.