środa, 22 listopada 2017

Xiaomi Mi Flora i ogólnie BLE

Dzień dobry w ten pochmurny i deszczowy dzień!

Mimo że deszczowo, ale w domu sucho. A jak sucho, to i kwiatki podlewać trzeba.

A do tego się przyda Xiaomi mi flora - czujnik wilgoci, temperatury oraz światła. Ten wpis zacząłem pisać jakieś pół roku temu i tak sobie wisiał nie skończony (poradniki jak czujnik połączyć z Domoticz są również na innych blogach, więc parcia nie było), ale pod kątem mojego kolejnego wpisu postanowiłem go skończyć.

Wpis oparty jest na Raspberry Pi 3, czyli Bluetooth mamy już na pokładzie.



Po wpisaniu

apt-cache policy bluez


dostaniemy zapewne informację wersji 5.23. Trochę stara, nie obsługuje Bluetooth Low Energy. Musimy zainstalować nowszą, przynajmniej 5.3x

Po pierwsze oczywiście, jak zawsze

apt-get update
apt-get upgrade

i instalujemy potrzebne bilbioteki

sudo apt-get install libglib2.0-dev libdbus-1-dev libical-dev libreadline-dev libudev-dev

Później

cd /home/pi

Na moment pisania przeze mnie aktualna wersja bluez to 5.47

wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.47.tar.gz
tar -xvf bluez-5.47.tar.gz
cd bluez-5.47

Ustawiamy zmienne systemowe

sudo ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-tools --disable-test --disable-systemd --enable-deprecated

I kompilujemy wersję

sudo make all

sudo apt-get install python-bluez python-requests

sudo cp attrib/gatttool /usr/bin/ 

lub (wykonanie obu nie zaszkodzi)

sudo cp attrib/gatttool /usr/local/bin/

export PATH=$PATH:~/bluez-5.47/attrib/

I ściągamy kod odpowiedzialny za komunikację z Mi Flora

cd ~ && git clone https://github.com/Tristan79/miflora.git

Kopiujemy folder do folderu ze skryptami Domoticz.

cp -R ~/miflora/ ~/domoticz/scripts/python/miflora

I lecimy dalej:

sudo aptitude install python3 python3-pip
sudo pip3 install pygatt
sudo pip3 install requests

Wchodzimy do folderu bluez:

cd bluez-5.47/

I wykonujemy

sudo tools/btmgmt le on
sudo tools/btmgmt connectable on
sudo tools/btmgmt power on

Dla pewności restartujemy 

sudo hciconfig hci0 down 
sudo hciconfig hci0 up
hciconfig


Później sprawdzamy jaki jest adres MAC naszego modułu Bluetooth
sudo hcitool lescan


Kopiujemy adres MAC naszego modułu Bluetooth, za chwilę się przyda.

W międzyczasie przygotujmy Domoticz. Dodajemy, w sekcji Hardware czujnik MiFlora, jako Dummy.


Następnie, do niego tworzymy Virtual Sensors. Cztery, tak jak poniżej. Uważajcie na typy.


I teraz ważny moment - edycja pliku konfiguracyjnego dla Mi Flora.

sudo nano /home/pi/domoticz/scripts/python/miflora/domoticz.py

Najpierw adres serwera i swoje dane logowania:

domoticzserver   = "192.168.1.200:80"
domoticzusername = "User"
domoticzpassword = "YourPassword"

I na samym końcu możecie zastąpić przykładowe czujniki Waszym adresem MAC i IDX założonych czujników w Domoticz.

print("\n1: Salon")
update("C4:7C:8D:62:A9:57","132","133","134","135")

i sprawdzamy

sudo /usr/bin/python3 /home/pi/domoticz/scripts/python/miflora/domoticz.py



Pozostaje wrzucić do cron, aby skrypt automatycznie się wykonywał, na przykład co godzinę.

crontab -e

@hourly sudo /usr/bin/python3 /home/pi/domoticz/scripts/python/miflora/domoticz.py

Działa!


NIC nie stoi na przeszkodzie, aby skrypt rozszerzyć o odczyt wartości baterii. Dodatkowo, osobiście zrealizowałem kiedyś skrypt sprawdzający obecność domowników na podstawie urządzeń Bluetooth - w moim przypadku opaski, ale w sumie każde urządzenie z Bluetooth da się pod to zaadaptować. Nie podobał mi się jednak dość mały zasięg sygnału Bluetooth. Możliwości jednak są!

Życzę powodzenia w ich odkrywaniu.

9 komentarzy:

  1. Witam czy można zmodyfikować skrypt w taki sposób aby odczytywał wartości z Xiaomi Mijia bluetooth temperature & humidity sensor

    OdpowiedzUsuń
    Odpowiedzi
    1. Cześć. Z tego co widzę, ludzie korzystają z https://github.com/pFenners/mijia-sensor-domoticz, dokładnie jest to opisane tutaj: https://www.facebook.com/groups/domoticzpl/permalink/2132673033632182/?hc_location=ufi

      Usuń
    2. Też bym chciał odczytywać z Xiaomi Mijia bluetooth temperature & humidity sensor ale wykonanie powyższych komend co którąś linię wywala mi błąd i raczej z tym nie ruszę, chyba, że ktoś podeśle coś może bardziej aktualnego...?

      Usuń
    3. Cześć. Jakie to błędy? Jeżeli o braku potrzebnych paczek - po prostu je doinstaluj.

      Usuń
    4. Cześć, ten powyżej anonimowy kmentarz był mój. Wówczas poradziłem sobie poprzez RPIEasy z tym połączniem. Ale to jest bardzo niestabilne i raczej nie działa. Generalnie chodzi mi o czujniki temperatury od xiaomi (nie mi flora). Tym razem przeszedłem przez całość bez błędów. Próbuję przerobić skrypt MiFlora by odczytywał mi jedynie temperaturę. Bazuję na wręcz gotowym https://github.com/pFenners/mijia-sensor-domoticz , ale jestem totalnie zielony i nie wiem jak sobie z tym poradzić. Wygląda to jakby na problem z kodowaniem w innej wersji phytona. Przy próbie uruchomienia dostaję: Deprecation Warning: encodestring() is a deprecated alias since 3.1, use encodebytes() Czy ktoś może poradził sobie z tym do końca i mógłby podpowiedzieć?

      Usuń
    5. Cześć. Ciężko mi już będzie pomóc, ponieważ przerzuciłem się całkowicie na Home Assistant...

      Usuń
  2. dzis nie wiem czemu sie cos sypneło po wielu m-cach czy moze ktos wie co gdzie i jak :-(
    Patched: Error reading value retry after 5 seconds...
    Patched: Error reading value retry after 5 seconds...
    Patched: Error reading value

    OdpowiedzUsuń