Giter Club home page Giter Club logo

garage-pi's Introduction

garage-pi

Raspberry Pi setup for a very low latency WebRTC camera stream (via go2rtc) plus Bluetooth Low Energy sensor (via BluePy) and humidity sensor (Adafruit SI7021) for home automation.

I wanted a good presence detection solution for the cars in my garage to drive automations in Home Assistant (for example, opening and closing garage doors). This accomplished that via object detection applied to the camera stream (I use Frigate) and by sensing a BLE beacon (my Tesla has a one built in, but you could potentially keep a third party beacon in the glovebox - I haven't tested this). The temp and humidity sensor is an added bonus.

BLE and climate readings are published via MQTT.

No extra hardware is needed for video and BLE functionality but you'll need an Adafruit SI7021 to enable the climate sensor . The code could be easily modified for another sensor if you have one handy.

Download & Configure

To download, simply git clone https://github.com/bdunn44/garage-pi. To configure, modify garage-pi/config/config.yaml in the following format:

scan-interval: 5 #<-- scan every 5 seconds 
mqtt:
  hostname: my-mqtt.my-domain.com #<-- MQTT server host/IP
  port: 1883 #<-- MQTT server port
  auth:
    username: mqtt_client #<-- MQTT client username
    password: my_password #<-- MQTT client password
  topic: garage-pi #<-- MQTT topic to post to
climate:
  enabled: true #<-- Enable/disable the climate sensor
  publish-threshold-pct: 1 #<-- Only publish changes in temp/humidity that are +/- 1% of the previous reading
ble:
  enabled: true #<-- Enable/disable the BLE sensor
  mac-watch-list: #<-- List of BLE beacon MAC addresses to scan for
    - 'eb:8e:ef:d3:e7:98' 
  publish-threshold-pct: 10 #<-- Only publish changes in signal strength (RSSI) that are +/- 10% of the previous reading
video:
  enabled: true #<-- Enable/disable video streaming

The video stream configuration is generated during installation and can be found in config/go2rtc.yaml. See the go2rtc documentation for more details on configuration.

Logs will be found in garage-pi.log the project's root directory. You can modify config/logging.conf to modify log levels and output. See documentation on the Python logging module for details.

Install

To install:

cd garage-pi
chmod +x scripts/install.sh
./scripts/install.sh

Once installed it will automatically start upon boot. You can check the service's status and start/stop with standard systemd commands:

service garage-pi status
sudo service garage-pi stop
sudo service garage-pi start
sudo service garage-pi restart

Test

You can easily test functionality with scripts/test.sh. Available commands are:

  • ./test.sh ble - continuously scans for BLE beacons and prints details.
  • ./test.sh climate - continuously takes climate readings and prints details.
  • ./test.sh video - starts the go2rtc server and video stream. You can view the go2rtc UI at your-pi-address:1984.

MQTT Messages

MQTT messages are published to the garage-pi/ble/[MAC address], garage-pi/temperature, and garage-pi/humidity topics by default (the garage-pi piece is configurable). The log entries below provide good example messages:

2023-07-16 11:01:49,951 - garage-pi - INFO - Published: {'topic': 'garage-pi/ble/eb:8e:ef:d3:e7:98', 'payload': '{"detected": true, "rssi": -81}', 'retain': True}
2023-07-16 11:01:49,954 - garage-pi - INFO - Published: {'topic': 'garage-pi/temperature', 'payload': '80.49', 'retain': True}
2023-07-16 11:01:49,960 - garage-pi - INFO - Published: {'topic': 'garage-pi/humidity', 'payload': '33.07', 'retain': True}

Integration with Home Assistant

You can configure MQTT sensors to read the MQTT messages and create a sensor to capture the current state. For example:

mqtt:
  sensor: 
    - name: car_detected
      state_topic: "garage-pi/ble/eb:8e:ef:d3:e7:98"
      value_template: "{{ value_json.detected }}"
      icon: mdi:bluetooth-connect

    - name: car_rssi
      state_topic: "garage-pi/ble/eb:8e:ef:d3:e7:98"
      value_template: "{{ value_json.rssi }}"
      icon: mdi:signal

    - name: garage_temperature
      state_topic: "garage-pi/temperature"
      suggested_display_precision: 1
      unit_of_measurement: "°F"
      icon: mdi:thermometer

    - name: garage_humidity
      state_topic: "garage-pi/humidity"
      unit_of_measurement: "%"
      icon: mdi:water-percent

A basic automation could simply check for the BLE sensor to flip between True (detected) and False (not detected). The example below leverages a 30-second timer to ensure any rapid changes between detected and not detected while the car is at the boundary of signal range won't cause the garage door to go up and down.

TODO: add Frigate object detection to double check if a car is present in the parking space, and trigger the departure event when a car object leaves the parking space zone.

alias: Control Garage Door
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.car_detected
    from: "False"
    to: "True"
    id: arrived
  - platform: state
    entity_id:
      - sensor.car_detected
    from: "True"
    to: "False"
    id: departed
condition:
  - condition: not
    conditions:
      - condition: state
        entity_id: timer.garage_automation_active
        state: active
action:
  - choose:
      - conditions:
          - condition: trigger
            id: arrived
        sequence:
          - service: cover.open_cover
            data: {}
            target:
              entity_id: cover.garage_door
      - conditions:
          - condition: trigger
            id: departed
        sequence:
          - service: cover.close_cover
            data: {}
            target:
              entity_id: cover.garage_door
  - service: timer.start
    data: {}
    target:
      entity_id: timer.garage_automation_active
mode: single

garage-pi's People

Contributors

bdunn44 avatar

Stargazers

Arthur Burgin Jr avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.