Jest to nowa wersja poradnika uruchomienia bramki dla czujników Xiaomi LYWSD03MMC w oparciu o oficjalne repozytorium Supla Device for Linux na Raspberry Pi Zero 2 W z zainstalowanym Raspberry Pi OS 64-bit. Oczywiście możliwości SD4Linux daleko wykraczają poza odczyt termometrów Xiaomi. Więcej zastosowań opisanych jest w przykładach na GitHub.

Procesu instalacji samego Raspberry Pi OS na karcie microSD oraz konfiguracji klienta SSH (np. PuTTY) nie będę tutaj omawiał. Można znaleźć poradniki w sieci Internet, lub w moich poprzednich wpisach. W niniejszym poradniku skupię się na procesie instalacji Supla Device for Linux (SD4Linux), skryptu MiTemperature2 autorstwa JsBergbau, niezbędnych pakietów dodatkowych oraz konfiguracji całego środowiska.

Zaczynamy od zaktualizowania Raspbian OS do najnowszej wersji:

sudo apt update
sudo apt full-upgrade -y

Następnie instalujemy niezbędne pakiety:

sudo apt install mc git libssl-dev libyaml-cpp-dev cmake supervisor libglib2.0-dev python3-pip libbluetooth-dev python3-smbus -y

Po zainstalowaniu wszystkich pakietów robimy restart RPi:

sudo reboot now

Następnie instalujemy pakiety wymagane przez skrypt MiTemperature2 do odczytu termometrów Xiaomi po bezprzewodowej komunikacji Bluetooth:

mkdir -p ~/.config/pip
echo "[global]" >> ~/.config/pip/pip.conf
echo "break-system-packages = true" >> ~/.config/pip/pip.conf

pip install bluepy requests
pip install git+https://github.com/pybluez/pybluez.git#egg=pybluez
pip install pycryptodomex
sudo setcap cap_net_raw,cap_net_admin+eip $(eval readlink -f `which python3`)

Instalujemy i konfigurujemy skrypt MiTemperature2:

git clone https://github.com/JsBergbau/MiTemperature2.git
cd MiTemperature2/

Tworzymy i edytujemy pliki:

nano start-listening.sh
nano save-to-file.sh

Zawartość pliku start-listening.sh:

#!/bin/bash
./LYWSD03MMC.py -p --atc --battery --round --debounce --callback save-to-file.sh

Zawartość pliku save-to-file.sh:

#!/bin/bash
echo $3 > $2.txt
echo $4 >> $2.txt
echo $6 >> $2.txt

Nadajemy odpowiednie uprawnienia do plików:

chmod +x start-listening.sh
chmod +x save-to-file.sh

Na tym etapie konfiguracji możemy uruchomić skrypt odczytujący wartości temperatury i wilgotności z urządzeń Xiaomi poleceniem:

./start-listening.sh

Po około 1 – 2 minutach przerywamy działanie skryptu klawiszami ctrl+c. W katalogu /home/pi/MiTemperature2 powinny utworzyć się pliki tekstowe z nazwą w formacie xx:xx:xx:xx:xx:xx.txt, gdzie xx:xx:xx:xx:xx:xx to adres MAC naszych urządzeń Xiaomi (po jednym pliku na termometr). Każdy plik zawiera trzy wiersze, gdzie pierwszy wiersz to wartość temperatury, drugi to wartość wilgotności, a trzeci to stan baterii.

Kolejnym etapem jest konfiguracja procesu Supervisor pozwalającego na odczytywanie naszych czujników w tle. W tym celu wykonujemy następujące polecenia:

cd
sudo nano /etc/supervisor/supervisord.conf

Sekcja [unix_http_server] powinna wyglądać następująco:

[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
chmod=0770 ; sockef file mode (default 0700)
chown=root:pi
sudo nano /etc/supervisor/conf.d/mi-listener.conf
[program:mi-listener]
command=/home/pi/MiTemperature2/start-listening.sh
directory=/home/pi/MiTemperature2
autostart=true
autorestart=true
user=pi

I restartujemy proces:

sudo service supervisor restart

Testowo restartujemy nasze Raspberry Pi, a po ponownym zalogowaniu przez SSH sprawdzamy, czy nasze pliki z danymi z czujników Xiaomi aktualizują się automatycznie.

Kolejny etap to instalacja i konfiguracja SD4Linux.

git clone https://github.com/SUPLA/supla-device.git

export SUPLA_DEVICE_PATH=~/supla-device
cd supla-device/extras/examples/linux
mkdir build
cd build
cmake .. && make

Kompilacja programu trochę trwa, więc jest to dobry moment na zaparzenie i wypicie kawy lub herbaty.
Po zakończeniu procesu kompilacji możemy sprawdzić wersję SD4Linux poleceniem:

./supla-device-linux --version

Na dzień pisania niniejszego poradnika SD4Linux dostępny był w wersji 25.01.

Kolejne czynności to utworzenie pliku konfiguracyjnego dla SD4Linux:

sudo nano /etc/supla-device.yaml

Przykładowa zawartość takiego pliku konfiguracyjnego dla 5 szt. LYWSD03MMC, który należy wyedytować zgodnie z własnymi danymi:

name: Bramka Xiaomi
log_level: debug
state_files_path: "/var/local/supla-device"
security_level: 2

supla:
  server: svr123.supla.org
  mail: mail@server.pl

channels:
  - type: ThermHygroMeterParsed
    name: T/H - salon
    initial_caption: "TEMPERATURA I WILGOTNOŚĆ"
    parser:
      type: Simple
      refresh_time_ms: 5000
    temperature: 0
    humidity: 1
    battery_level: 2
    multiplier_temp: 1
    multiplier_humi: 1
    multiplier_battery_level: 1
    source:
      type: File
      file: "/home/pi/MiTemperature2/A4:C1:38:B0:71:51.txt"
      expiration_time_sec: 120

  - type: ThermHygroMeterParsed
    name: T/H - sypialnia
    initial_caption: "TEMPERATURA I WILGOTNOŚĆ"
    parser:
      type: Simple
      refresh_time_ms: 5000
    temperature: 0
    humidity: 1
    battery_level: 2
    multiplier_temp: 1
    multiplier_humi: 1
    multiplier_battery_level: 1
    source:
      type: File
      file: "/home/pi/MiTemperature2/A4:C1:38:39:51:4E.txt"
      expiration_time_sec: 120

  - type: ThermHygroMeterParsed
    name: T/H - pokój Kuby
    initial_caption: "TEMPERATURA I WILGOTNOŚĆ"
    parser:
      type: Simple
      refresh_time_ms: 5000
    temperature: 0
    humidity: 1
    battery_level: 2
    multiplier_temp: 1
    multiplier_humi: 1
    multiplier_battery_level: 1
    source:
      type: File
      file: "/home/pi/MiTemperature2/A4:C1:38:3F:3F:D0.txt"
      expiration_time_sec: 120

  - type: ThermHygroMeterParsed
    name: T/H - kuchnia
    initial_caption: "TEMPERATURA I WILGOTNOŚĆ"
    parser:
      type: Simple
      refresh_time_ms: 5000
    temperature: 0
    humidity: 1
    battery_level: 2
    multiplier_temp: 1
    multiplier_humi: 1
    multiplier_battery_level: 1
    source:
      type: File
      file: "/home/pi/MiTemperature2/A4:C1:38:BE:BB:B9.txt"
      expiration_time_sec: 120

  - type: ThermHygroMeterParsed
    name: T/H - łazienka
    initial_caption: "TEMPERATURA I WILGOTNOŚĆ"
    parser:
      type: Simple
      refresh_time_ms: 5000
    temperature: 0
    humidity: 1
    battery_level: 2
    multiplier_temp: 1
    multiplier_humi: 1
    multiplier_battery_level: 1
    source:
      type: File
      file: "/home/pi/MiTemperature2/A4:C1:38:D6:EF:EE.txt"
      expiration_time_sec: 120
sudo mkdir -p /var/lib/supla-device
sudo chown supla_user_name /var/lib/supla-device

Teraz możemy włączyć w Supla Cloud rejestrację urządzeń i testowo uruchomić SD4Linux poleceniem:

./supla-device-linux -c /etc/supla-device.yaml

Po kilkunastu sekundach w Supla Cloud zarejestruje się nam Bramka Xiaomi z kanałami zdefiniowanymi w pliku konfiguracyjnym. Przerywamy działanie programu ctrl+c i konfigurujemy SD4Linux aby uruchamiał się automatycznie jako serwis.

cd
sudo nano /etc/systemd/system/supla-device.service
[Unit]
Description=Supla Device
After=network-online.target

[Service]
User=pi
ExecStart=/home/pi/supla-device/extras/examples/linux/build/supla-device-linux -s

[Install]
WantedBy=multi-user.target

Następnie:

sudo systemctl enable supla-device.service
sudo systemctl start supla-device.service

Polecenie:

sudo systemctl status supla-device.service

Powinno dać wynik podobny do poniższego:

● supla-device.service - Supla Device
     Loaded: loaded (/etc/systemd/system/supla-device.service; enabled; preset: enabled)
     Active: active (running) since Sat 2025-01-18 20:49:28 CET; 2h 16min ago
   Main PID: 498 (supla-device-li)
      Tasks: 3 (limit: 179)
        CPU: 6min 59.719s
     CGroup: /system.slice/supla-device.service
             └─498 /home/pi/supla-device/extras/examples/linux/build/supla-device-linux -s

Jan 18 23:01:16 rpi supla-device-linux[498]: Channel(4) value changed to temp(19.10), humi(42.00)
Jan 18 23:01:56 rpi supla-device-linux[498]: Channel(6) value changed to temp(23.30), humi(51.00)
Jan 18 23:02:07 rpi supla-device-linux[498]: Channel(7) value changed to 39.70
Jan 18 23:02:16 rpi supla-device-linux[498]: Channel(4) value changed to temp(19.10), humi(43.00)
Jan 18 23:02:46 rpi supla-device-linux[498]: Channel(6) value changed to temp(23.20), humi(51.00)
Jan 18 23:03:03 rpi supla-device-linux[498]: Channel(1) value changed to temp(21.70), humi(48.30)
Jan 18 23:03:07 rpi supla-device-linux[498]: Channel(7) value changed to 39.20
Jan 18 23:04:03 rpi supla-device-linux[498]: Channel(1) value changed to temp(21.70), humi(47.80)
Jan 18 23:05:03 rpi supla-device-linux[498]: Channel(1) value changed to temp(21.60), humi(47.80)
Jan 18 23:06:03 rpi supla-device-linux[498]: Channel(1) value changed to temp(21.70), humi(47.80)

 

Możemy ponownie zrestartować naszą malinkę. Wszystkie niezbędne procesy powinny uruchomić się automatycznie w tle, a w aplikacji Supla powinniśmy widzieć 5 kanałów z danymi z naszych termometrów Xiaomi.

Spodobał Ci się artykuł? Udostępnij go.