Raspberry Pi Zero 2 W – Creación de un Docker para detección por Bluetooth

En esta entrada os explicare como crear un Docker para tener un escáner Bluetooth aprovechando el Bluetooth clásico de la Raspberry pi Zero 2 , lo primero crear la estructura de carpetas

mkdir /home/antonio/Containers/nuc_bluetooth
mkdir /home/antonio/Containers/hassio_bluetooth
cd /home/antonio/Containers/nuc_bluetooth

Crearemos el fichero run.sh

sudo nano /home/antonio/Containers/nuc_bluetooth/run.sh

E insertaremos este texto

service dbus start
service bluetooth start
if [ "$(ls -A $DIR)" ]; then
     echo "Scripts and settings allready created. Continuing..."
else
    echo "Init scripts for the first time, copy scripts and settings..."
    cp -R /scripts/* /app
fi

( exec "/app/presence.sh" -d )

Crearemos el dockerfile

sudo nano /home/antonio/Containers/nuc_bluetooth/dockerfile

Y le pondremos este texto

#ARG BUILD_FROM=hassioaddons/ubuntu-base-amd64:2.0.0 
ARG BUILD_FROM=debian:jessie  
# hadolint ignore=DL3006
FROM ${BUILD_FROM}

# Setup base system
ARG BUILD_ARCH=amd64

RUN printf "deb http://archive.debian.org/debian/ jessie main\ndeb-src http://archive.debian.org/debian/ jessie main\ndeb http://security.debian.org jessie/updates main\ndeb-src http://security.debian.org jessie/updates main" > /etc/apt/sources.list

#RUN sudo apt-key adv --refresh-keys
RUN echo "deb [check-valid-until=no] http://cdn-fastly.deb.debian.org/debian jessie main" > /etc/apt/sources.list.d/jessie.list
RUN echo "deb [check-valid-until=no] http://archive.debian.org/debian jessie-backports main" > /etc/apt/sources.list.d/jessie-backports.list
RUN sed -i '/deb http:\/\/deb.debian.org\/debian jessie-updates main/d' /etc/apt/sources.list
RUN apt-get -o Acquire::Check-Valid-Until=false update


RUN echo "Acquire::Check-Valid-Until \"false\";\nAcquire::Check-Date \"false\";" | cat > /etc/apt/apt.conf.d/10no--check-valid-until

RUN \
    apt-get update \
    && apt-get install -y \
        bluetooth \
        bluez \
        bluez-tools \
        rfkill \
        libmosquitto-dev \
        mosquitto \
        mosquitto-clients

  
COPY rootfs /scripts
COPY run.sh /

VOLUME /app

WORKDIR /app

CMD ["bash", "/run.sh"]

Cambiando la imagen base BUILD_FROM podremos crear un versión para x86 , en este caso usaremos una versión jessie compatible con arm

Acto seguido crearemos el docker-compose

sudo nano /home/antonio/Containers/nuc_bluetooth/docker-compose.yaml

Y le insertaremos este texto , cambiándolo según nuestras necesitadas

version: '3'
services:
  hass_bluetooth:
    build: .
    image: helto/bluetooth
    container_name: hass_bluetooth
    network_mode: host
    restart: always    
    volumes:
      - /home/antonio/Containers/hassio_bluetooth:/app 

copiar carpeta rootfs a /home/antonio/Containers/nuc_bluetooth , os dejo aquí el enlace del contenido de dicha carpeta y tendréis que ajustarlo a vuestras necesidades

cd /home/antonio/Containers/nuc_bluetooth
docker-compose up -d

Y en Portainer deberíais tener activo el docker

Y en el apartado de logs lo veremos escanear buscando dispositivos Bluetooth

Si no tenéis Portaienr activo los pasos para ponerlo en marcha son los siguientes

mkdir /home/antonio/Containers/dockercompose
cd /home/antonio/Containers/dockercompose

Crear el fichero docker-compose.yml y el fichero .env

sudo nano /home/antonio/Containers/dockercompose/docker-compose.yaml

Y lo rellenaremos con este texto

version: '3'

services:
            
  portainer:
    image: portainer/portainer:alpine
    hostname: portainer
    container_name: portainer
    environment:
      - PUID=${PUID} 
      - PGID=${PGID} 
      - TZ=${TZ}    
    ports:
      - "9000:9000"      
    volumes:
      - ${DOCKERDIR}/portainer/data:/data
      - /var/run/docker.sock:/var/run/docker.sock:ro
    stdin_open: true
    tty: true      
    restart: always
    networks:
      # - traefik 
      - default      
      
networks:
  traefik:
    external: true
  default:
    external: false

Y crearemos el Docker

docker-compose up -d

Al acabar nos conectaremos con http://ip_pi2w:9000

Con esto ya tenemos nuestros primeros dos dockers funcionado en la pi

Veremos como ya aparecen datos en el servidor mqtt

Para integrarlo en Home Assistant crearemos un sensor MQTT por cada uno de los dispositivos configurados en owners_devices

  - platform: mqtt
    name: "tracker_bt_movil_antonio"
    state_topic: "tracker_bt/owner/casa/9C:BC:F0:AA:79:FE"
    unit_of_measurement: '%'
    value_template: "{{ value_json.confidence }}"

Y le añadiremos un delay para evitar falsos negativos

  - platform: template
    sensors:
      sensor_presencia_bt_antonio_delay:
        friendly_name:  'Sensor presencia BT antonio delay'
        delay_off:
          minutes: 2
        value_template: >-
            {{ is_state('sensor.sensor_tracker_bt_movil_antonio', 'on') }}  

Con esto ya lo tenemos integrado en nuesto Home Assistant

BONUS : He subido la imagen ya preparada para descargar en docker hub , antrivas/bt_scanner:1.0

Añadir al docker-compose.yaml esto para descargarla de docker hub :

  hass_bluetooth:
    image: antrivas/bt_scanner:1.0
    container_name: hass_bluetooth
    network_mode: host
    restart: always    
    volumes:
      - /home/antonio/Containers/hassio_bluetooth:/app 

Es una imagen que prácticamente no consume recursos ni memoria

Con esto y un bizcocho …………….