czwartek, 11 stycznia 2018

Xiaomi Air Purifier 2 - integracja z Domoticz

W końcu dotarł do nas Xiaomi Air Purifier 2. Udało się znaleźć go w dobrej cenie, wystarczyło poczekać 2 miesiące i już jest ;) Smog na wsi nie jest tym, co tygrysy lubią najbardziej. Głównie chodzi o zdrowie dzieci.

Sprzęt, jak na Xiaomi przystało - dotarł w zwykłym pudle, bez setki kolorów, ale dobrze zapakowany. Miła niespodzianka - dostarczył go kurier.

Osobiście jestem bardzo zadowolony ze sprzętów tej marki. Działają niezawodnie, cechują się świetnym designem i łatwo się z nimi integrować.

Z tym oczyszczaczem jest podobnie - otwierasz, mówisz 'Ładne to', włączasz, działa.



Po dodaniu do aplikacji (w standardowy dla nich sposób - podłączamy się do WiFi sprzętu i podajemy swoje dane WiFi) możemy od razu nim zarządzać.






Szybka aktualizacja ;)


I jesteśmy online!


Możemy oczywiście dodać widget do telefonu


Ale dobra, to było proste. Bardzo proste.

Teraz wypadałoby go zintegrować z Domoticz, to jest przecież moim głównym celem ;)

Według poradnika z forum Domoticz powinna zadziałać komenda jak poniżej.

sudo apt-get install npm sudo screen

Może i zadziałała, ale nie mogłem później zainstalować miio...

Jak się okazało - chodziło o wersję nodejs. Ruszamy więc z instalacją 'poprawnej' wersji.

sudo curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -

sudo apt-get install -y nodejs

I już można:

sudo npm install --save miio

sudo npm install -g miio

Teraz już zadziała 'discover' - czyli wyszukiwanie kompatybilnych sprzętów.

sudo miio --discover --sync

Po jej wydaniu musicie zobaczyć IP oczyszczacza i jego status, jak poniżej:


Skoro jest, to jedziemy dalej! Do odważnych świat należy.

Poradniki różnie radzą, niektóre są bardziej skomplikowane, inne mniej. U mnie zadziałało to co poniżej.

Dodajemy skrypt, który będzie wysyłał komendy do oczyszczacza. Ja się uparłem i wszystkie wrzuciłem do folderu /scripts, ponieważ jest archiwizowany co noc.

sudo nano /home/pi/domoticz/scripts/airpurifier.js

#!/usr/bin/node
/* eslint-disable */

// Set path to node modules miio
const miio = require('miio');

// No need to change any lines in this section
var deviceip = process.argv[2];
var secondarg = process.argv[3];
var thirdarg = process.argv[4];
function exit() {
process.exit(-1);
}

// Power On (on / off specified as true or false)
if ( secondarg === "power" ) {
        setTimeout(exit, 7000);
        console.log('Sending Power', thirdarg, 'command');
        miio.device({
        address: deviceip
}).then(device => {
                return device.setPower(JSON.parse(thirdarg));
})}

// Status
if ( secondarg === "status" ) {
        miio.device({
        address: deviceip
}).then(device => {
                stats = device.getProperties([ 'power', 'mode', 'aqi', 'temperature', 'humidity' ])
                console.log(stats);
                process.exit();
})}

// Specify favorite manual fan speed (1 to 16) eg usage: fanspeed 16
if ( secondarg === "fanspeed" ) {
        setTimeout(exit, 7000);
        console.log('Setting manual fan speed to:', thirdarg);
        miio.device({
        address: deviceip
}).then(device => {
                return device.setFavoriteLevel(parseInt(thirdarg));
})}

// Set fan mode option, specify: idle, auto, silent or favorite which needs to be set for manual speed control
if ( secondarg === "fanmode" ) {
        setTimeout(exit, 7000);
        console.log('Telling device to use', thirdarg, 'fan speed mode');
        miio.device({
        address: deviceip
}).then(device => {
                return device.call('set_mode', [ thirdarg ])
})}

// Control the device led (specify as bright, dim or off)
if ( secondarg === "led" ) {
        setTimeout(exit, 7000);
        console.log('Setting device led to:', thirdarg);
        miio.device({
        address: deviceip
}).then(device => {
                return device.setLedBrightness(thirdarg);
})}

// Switch the device buzzer on or off (specify as true or false)
if ( secondarg === "buzzer" ) {
        setTimeout(exit, 7000);
        console.log('Setting device buzzer to:', thirdarg);
        miio.device({
        address: deviceip
}).then(device => {
                return device.setBuzzer(JSON.parse(thirdarg));
})}


Jeżeli wszystko zrobiliście poprawnie, komenda jak poniżej pokaże jego status:

node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 status

Próbować możecie z różnymi komendami:

node airpurifier.js 192.168.1.115 power true - Włączenie
node airpurifier.js 192.168.1.115 power false - Wyłączenie
node airpurifier.js 192.168.1.115 status - Wyświetlenie statusu
node airpurifier.js 192.168.1.115 led off - Wyłączenie diody led
node airpurifier.js 192.168.1.115 buzzer true - Włączenie sygnałów głosowych
node airpurifier.js 192.168.1.115 fanmode auto - Tryb Auto
node airpurifier.js 192.168.1.115 fanmode favorite - Tryb Ulubiony

node airpurifier.js 192.168.1.115 fanspeed 16 - Maksymalna prędkość wiatraka



No to teraz pora na Domoticz.

Mała aktualizacja!

Dla pewności i wyjaśnienia. Zaczynamy od zdefiniowania nowego Hardware!


Dopiero później na jego podstawie zakładamy dwa Virtual sensor'y.


Dla jakości powietrza - Custom Sensor


Dla temperatury i wilgotności - Temp + Hum


Zapisujemy ich (Devices) IDX
i wstawiamy do skryptu poniżej

sudo nano /home/pi/domoticz/scripts/xair2domoticz.sh

#!/bin/bash

# Get the data
data=$(node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 status)
# Sort it
temperature=$(echo "$data" | grep "temperature" | sed -e s/[^0-9.]//g)
humidity=$(echo "$data" | grep "humidity" | sed -e s/[^0-9.%]//g)
aqi=$(echo "$data" | grep "aqi" | sed -e s/[^0-9.]//g)

# Load it into Domoticz
curl -s "http://192.168.1.200/json.htm?type=command&param=udevice&idx=247&nvalue=0&svalue=${temperature};${humidity};0"
curl -s "http://192.168.1.200/json.htm?type=command&param=udevice&idx=248&svalue=${aqi}"

Nadajemy uprawnienia do uruchamiania:
sudo chmod +x /home/pi/domoticz/scripts/xair2domoticz.sh

I wrzucamy do crontab

crontab -e 

*/15 * * * * sudo ~/domoticz/scripts/xair2domoticz.sh


Działa. Łaski nie robi :) U mnie nazywa się to Aqi (tak prawdę mówiąc to identycznie jak w  poradniku...). Temperatura i wilgotność w odpowiedniej zakładce.

Ok, dane już odbieramy. Teraz wypadałoby nauczyć się nim sterować.

Założyłem Selector Switch (na podstawie Hardware), zmieniłem wartości z domyślnych na:
- Off
- Auto
- Low
- Max
- Silent



Pozostało wpisać skrypt LUA. Nie będę cwaniakował - zmieniłem skrypt autora z forum Domoticz (http://www.domoticz.com/forum/viewtopic.php?t=15537)

Skrypt, na podstawie nazwy urządzenia i jego statusów w Domoticz, wysyła komendy do Xiaomi Air Purifier 2.

sudo nano /home/pi/domoticz/scripts/lua/script_device_xair.lua

commandArray = {}
if devicechanged['Oczyszczacz powietrza'] == 'Auto' then
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 power true')
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 fanmode auto')
end
if devicechanged['Oczyszczacz powietrza'] == 'Off' then
    os.execute ('sudo screen -S airpurifieroff -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 power false')
end
if devicechanged['Oczyszczacz powietrza'] == 'Low' then
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 fanmode favorite')
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 fanspeed 3')
end
if devicechanged['Oczyszczacz powietrza'] == 'Max' then
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 fanmode favorite')
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 fanspeed 16')
end
if devicechanged['Oczyszczacz powietrza'] == 'Silent' then
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 power true')
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 fanmode silent')
end
return commandArray

I to by było na tyle. Działa, raportuje, oczyszcza. Mam mały problem z czasami nie działającymi ustawieniami Max i Low (komendy wysyłane z linii poleceń działają bez problemu, w powyższym skrypcie może muszę wstawić mały delay). Ale On, Off, Silent, Auto działa bez problemu.

Do tego wypadałoby jeszcze zrobić pobieranie statusu Włączony/Wyłączony i aktualizowanie w Domoticz - automatycznie się to nie dzieje.

Swoją drogą - warto było go nabyć.

101 komentarzy:

  1. Przy próbie wykonania sudo npm install --save miio pojawia się taki komunikat https://imgur.com/ERTp1fZ
    Co robię nie tak?

    OdpowiedzUsuń
    Odpowiedzi
    1. To tylko Warning. U mnie to samo, ale działa wszystko jak powinno.

      Usuń
    2. No ja po tym warningu wykonuję sudo npm install -g miio a następnie sudo miio --discover --sync i niestety nie widzę oczyszczacza.
      Widoczny jest gateway, wzmacniacz wifi oraz żarówka rgbw (a więc cały sprzęt xiaomi który mam podłączony do wifi) a oczyszczacza niestety nie widać.

      Usuń
  2. Hmmm. Co najmniej dziwne. Nie robiłem niczego specjalnego - po prostu soft go odnalazł...

    OdpowiedzUsuń
  3. Po długim czekaniu przy discovery pojawia się oczyszczacz (192.168.1.3) ale potem przy sprawdzaniu statusu jest to co na screenie https://imgur.com/a/1YNuY

    OdpowiedzUsuń
    Odpowiedzi
    1. Eh, jeden znak się nie wkopiował. Powinno być: #/usr/bin/node w pierwszej linii. Już poprawiłem, bardzo dziękuję za zwrócenie uwagi!

      Usuń
    2. Poprawiłem, ale dalej to samo, tzn. różnica jest taka, że teraz jest komunikat Invalid or unexpected token, reszta taka sama.

      Usuń
    3. Przekleiłem cały skrypt 1:1 z Raspberry. Powinno być ok

      Usuń
    4. Jest już jakiś postęp:) Co prawda nie działa, ale teraz po sprawdzeniu statusu pojawia się jedna linka z takim komunikatem:
      (node:5661) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Call to device timed out

      Usuń
    5. Tak jakby miio miało problemy z dostaniem się do niego w odpowiednim czasie. Zapewne dlatego też długo Ci go wykrywał. U mnie wynik minutę temu, na efekt nawet sekundę nie czekałem: https://imgur.com/a/WqITZ

      Usuń
  4. Po dniu przerwy wracam do tematu, jednak dalej nie działa.
    Postawiłem od nowa system, zainstalowałem Domoticza, wszystko robię krok po kroku a na koniec takie błędy https://imgur.com/a/ERrGD

    OdpowiedzUsuń
  5. Wreszcie zadziałało, problemem chyba był słaby sygnał wifi w oczyszczaczu i dlatego nie dało się sprawdzić statusu. Teraz już jest OK, konfiguracja poprawna, status sprawdzam, sterowanie działa, ale jest problem z przesyłaniem danych do domoticza. Dodaję czujniki, ich idx wpisuję w skrypcie, oczywiście podaję poprawne adresy IP ale nic w Domoticzu się nie wyświetla.

    OdpowiedzUsuń
    Odpowiedzi
    1. A komendy json wklejone do przeglądarki aktualizują czujniki? Powinny

      Usuń
    2. Czyli na przykład http://192.168.1.200/json.htm?type=command&param=udevice&idx=248&svalue=100 powinno wpisać 100 w czujnik. 192.168.1.200 to adres mojego Domoticz.

      Usuń
    3. Nie, nic się nie dzieje. U mnie RPi ma adres z końcówką 100, idx czujniki AQI to 54 więc w przeglądarce na komputerze wklejam to: http://192.168.1.100/json.htm?type=command&param=udevice&idx=54&svalue=100 i nic w czujniki w domoticzu się nie dzieje.

      Usuń
    4. Masz ustawiony akcept obsługi z sieci lokalnej w konfiguracji?

      Usuń
    5. Masz na myśli w opcjach w domoticzu w Sieci lokalne (bez hasła/loginu):? Mam tam wpisane 127.0.0.*;192.168.1.*

      Usuń
    6. Już wiem gdzie był błąd, zarówno przy ręcznej próbie ustawienia wartości jak i w skrypcie powinien być podany poza IP domoticza także port, a więc http://192.168.1.100:8080/json.htm?type=command&param=udevice&idx=54&svalue=100
      Teraz już wszystko działa:)

      Usuń
    7. No to jeszcze została ostatnia część, czyli sterowanie przez domoticz. Nie do końca rozumiem co ma robić sudo screen -S airpurifieron -d -m ... ale właśnie to mi nie działa. Tak jakby "screen" nie był zainstalowany (jeśli dobrze to rozumiem).

      Usuń
  6. Screen odpala komendy w tle. To ważne w przypadku akurat oczyszczacza bo zauważ ze nawet z aplikacji ma opóźnienia. W ogóle niestety to całe sterowanie jest słabo zrealizowane

    OdpowiedzUsuń
  7. Gdzie udało się znaleźć Xiaomi Air w dobrej cenie?

    OdpowiedzUsuń
    Odpowiedzi
    1. Gearbest. Wyszło z przesyłką 370 PLN

      Usuń
    2. U mnie dokładnie tak samo, na Gearbest za 370zł z przesyłką priority line. Ale takie ceny to były 11 listopada, teraz zapewne w okolicach 120$, taniej się nie uda. No albo ok. 150$ z wysyłką z Polski.

      Usuń
  8. Przy próbie sprawdzenia statusu wyskakuje mi błąd:

    module.jd:471
    throw err;

    Error: Cannot find module 'ścieżka_skryptu'
    at Function.Module._resolveFilename (module.js:469:15)
    at Function.Module._load (module.js:417:25)
    at Module.runMain (module.js:383:10)
    at run (bootstrap_node.js:383:7)
    at startup (bootstrap_node.js:149:9)
    at bootstrap_node.js:496:3

    Jakiś pomysł? Właściwie to dopiero zaczynam zabawę z RPi i nie mam nawet podejrzenia, co to może być :(

    OdpowiedzUsuń
    Odpowiedzi
    1. No to zaczynamy ;) Pierwsze pytanie (chociaż to nie powinno mieć znaczenia, ale lepiej zapytać) - jaki Raspbian? Jessie czy Stretch?

      Usuń
    2. Dziękuję za odpowiedź! :) Według cat /etc/os-release moja wersja to "stretch"

      Usuń
    3. Nie mam jeszcze doświadczenia w Stretchu... Instalacja nodejs przebiegła bez problemu?

      Usuń
    4. Całkowicie bezproblemowo :) eh, no nic, będę kombinował dalej :(

      Usuń
    5. Ale moment. Ty tam masz wprost gdzieś podany tekst 'ścieżka skryptu'?

      Usuń
    6. Nie, mam podaną ścieżkę od Ciebie :) Po prostu wszystko robię "z palca" w Malince i jak mi wyskakują błędy, to przepisuję na komputer do Googla w poszukiwaniu ich rozwiązania.

      Usuń
    7. W pliku airpurifier.js pierwszą linię masz #!/usr/bin/node ? Nie bardzo wiem skąd w tym skrypcie mogłaby się znaleźć jakakolwiek ścieżka do pliku...

      Usuń
    8. WESZŁO! Wczoraj cały wieczór nad tym siedziałem, dzisiaj uruchomiłem Malinkę (żeby sprawdzić, czy rzeczywiście skrypt był ok) i zadziałało! Dziękuję za poświęcony czas :)

      Usuń
    9. Jeszcze zapytam, korzystając z okazji: widzę, że masz dużą wiedzę i że te rozwiązania przychodzą Ci naturalnie - czy uczyłeś się obsługi Raspberry z jakiegoś konkretnego źródła, czy to wynik godzin spędzonych w stylu "nie działa, nie wiem dlaczego, ale spróbuję to rozwiązać"? :)

      Usuń
    10. Paaaanie... To tylko tak wygląda :D Ja jestem fanem rozwiązań serwerowych Microsoft i miałem ciężki czas przy przejściu na Linuxa. Pomogło to, że te 25 lat temu siedziałem w MS-DOS i wiersz poleceń nie jest dla mnie czymś strasznym.
      Czy znam Raspberry? Tylko na potrzeby tego co chcę zrobić. Elektronika jest mi trochę obca, efekty lutowania są tak straszne, że wolę poprosić kolegę o pomoc. Tematy, które tutaj prezentuję to godziny wyrwane w nocy na własne hobby :) Przed/podczas/po przeglądam mnóstwo różnych stron i staram się nauczyć i zrozumieć. Książki przeglądałem tylko na początku, ale czytanie ich od deski do deski jest, cóż, nudne :) Do tego mam jakoś tak w głowie, że jeżeli na coś się uprę - prędzej czy później, w taki czy inny sposób - muszę zrealizować. To bardzo gimnastykuje umysł!
      Nie będę też cwaniakował - wiele z tych rozwiązań jest podpatrzone, przetrawione przeze mnie i opisane po polsku. Robię to dla siebie, ale bardzo miło, że i inni to czytają.

      Usuń
    11. Ok, o taką odpowiedź mi chodziło! :D Bardzo fajnie, że pokazujesz to innym - dla mnie, laika, taka pomoc jest nieoceniona zwłaszcza, że - jeśli mi coś działa i mam do tego rozwiązanie - na bazie tego łatwiej mi potem robić moje rzeczy. Dziękuję jeszcze raz !

      Usuń
  9. Z rzeczy, które zauważyłem podczas instalacji:
    1. Zamiast sudo nano /home/pi/domoticz/scripts xair2domoticz.sh nie powinno być sudo nano /home/pi/domoticz/scripts/xair2domoticz.sh (brakuje /, inaczej chmod nie znajdował pliku)?
    2. W tym samym pliku w sekcji "GET DATA" wpisujemy IP naszego Purifier?
    3. W tym samym pliku w sekcji " LOAD IT" wpisujemy IP naszego Domoticza (czyli to, którym logujemy się do panelu)?

    OdpowiedzUsuń
    Odpowiedzi
    1. I jeszcze kwestia na której się zatrzymałem - u mnie to pierwszy dodany czujnik, IDX to 2, a jak wpisuje z idx=2 to nic mi dalej nie pokazuje na panelu :(

      Usuń
    2. 1. Dziękuję, poprawiłem. Oczywiście masz rację.
      2. Tak
      3. Tak, ale nie zapomnij, że zależy na jakim porcie masz Domoticz. Ja mam na 80, więc nic więcej nie trzeba, ale jeżeli masz na przykład na 8080 to musi to być 192.168.1.200:8080.
      4. Sprawdź bezpośrednio w przeglądarce http://TwojeIP/json.htm?type=command&param=udevice&idx=2&svalue=100 czy wartość czujnika zmieni Ci się na 100. Jeżeli nie - błąd nie jest po stronie skryptu.

      Usuń
    3. Wpisałem tak, jak kazałeś i zmienił się czujnik PM2.5 na zadaną wartość, a temp+hum został taki sam.

      Tak kolejno: node status działa, pokazuje mi coś takiego:
      { power: true,
      mode: 'auto',
      aqi: 9,
      temperature: 22.8,
      humidity: 57 }

      Odświeżacz na IP: 192.168.8.104
      Domoticz na IP: 192.168.8.110:8080

      Sprzęt założony pod nazwą "Smog" na IDX=2 jako "Dummy". Od tego dodane czujniki wg instrukcji.

      Kod skryptu:

      #!/bin/bash

      # Get the data
      data=$(node /home/pi/domoticz/scripts/airpurifier.js 192.168.8.104 status)
      # Sort it
      temperature=$(echo "$data" | grep "temperature" | sed -e s/[^0-9.]//g)
      humidity=$(echo "$data" | grep "humidity" | sed -e s/[^0-9.%]//g)
      aqi=$(echo "$data" | grep "aqi" | sed -e s/[^0-9.]//g)

      # Load it into Domoticz
      curl -s "http://192.168.8.110:8080/json.htm?type=command&param=udevice&idx=2&nvalue=0&svalue=${temperature};${humidity};0"
      curl -s "http://192.168.8.110:8080/json.htm?type=command&param=udevice&idx=2&svalue=${aqi}"

      Widzisz tu na pierwszy rzut oka jakiś błąd? Coś więcej podesłać?

      Usuń
    4. Do jednego idx starasz się przypisać dwie różne wartości. One się nadpisują. Poza tym piszesz o idx Hardware. Ja trochę skrótem myślowym pisałem - musisz założyć dwa Virtual sensors o podanych typach. Poprawię to później. Teraz koncert :)

      Usuń
    5. Ok, bez pośpiechu - to i tak hobbystycznie :D Miłej zabawy!

      Usuń
    6. Dodałem małą aktualizację. Mam wrażenie, że starasz się przypisać dane do złego IDX - Hardware a nie Devices.

      Usuń
  10. Hej, myślisz, że będzie to działało z Air Purifier 2s?

    OdpowiedzUsuń
    Odpowiedzi
    1. Na pewno warto spróbować :)

      Usuń
    2. Tokenu nie znajduje. Muszę pokombinować. Dam znać jak znajdę rozwiązanie.

      Usuń
    3. HA! Mam.
      Nowa apka nie zapisuje w bazie tokena. W miio2.db nie ma nic więc trzeba zainstalować starsze Mi Home w wersji 5.0.19 np stąd https://www.apkmirror.com/apk/xiaomi-inc/mihome/mihome-5-0-19-release/mihome-5-0-19-android-apk-download/
      I użyć MiToolkit. Token jest na dłoni

      Usuń
    4. Bardzo dziękuję za sugestie! Może kiedyś zmienię model, przyda się.

      Usuń
    5. Ten komentarz został usunięty przez autora.

      Usuń
    6. Witam, czy może komuś się udało dodać AP2S do Domoticza?? Niby robię wszystko według znalezionego na jakimś forum poradnika, ale niestety mi nie chce działać, jak sprawdzam status urządzenia z commandline to nie wyświetla nic. Po dodaniu do Domoticza również nie mam żadnych parametrów. Nie wiem dokładnie czy dobrze robię z tokenem wpisując go po ip urządzenia, ale tak przynajmniej nie wywala mi błędów. Nie jestem co prawda dobrze obeznany z programowaniem, Linuxem, scryptami, ale jakoś sobie radzę. Z góry dzięki za odpowiedzi i sugestie.
      Pozdrawiam.
      Sławek

      Usuń
    7. Sławek_KRK
      udało ci sie poradzić z konfiguracją domoticza i purifiera 2S?
      znalazłem tokeny update zrobiłem ale nie do końca mi to chce działać. na Domoticzu mam wartości 0.

      Usuń
    8. Cześć, niestety nie miałem czasu na zabawę z tym, ale będę może w tym tygodniu miał chwilę w końcu i się zabiorę za uruchomienie.

      Usuń
    9. Cześć, udało mi się trochę ogarnąć temat oczyszczacza a mianowicie :
      1.Z konsoli jestem w stanie nim sterować, stworzyłem sobie skrypty *.sh którymi wywołuję odpowiednią akcję oczyszczacza natomiast nie jestem w stanie tych skryptów odpalać z Domoticza, nie ma reakcji niestety.
      2.Przez jakiś czas miałem przesył temp,hum,aqi ale coś przestało działać i na razie to olałem.

      Jak macie jakieś pomysły co mogę zrobić żeby sterowanie mi ruszyło to chętnie o tym przeczytam.
      Na razie nie chcę się bawić ze skryptem w lua bo mimo że mi działał to były ogromne opóźnienia.

      Usuń
    10. A jeszcze co do skryptów to wyglądają tak :
      #!/bin/sh
      node airpurifier.js IP token power false > /dev/null &

      Usuń
  11. Fajny wpis i świetna robota z opisaniem integracji z Domoticz. U mnie wszystko działa. Dzięki.

    OdpowiedzUsuń
    Odpowiedzi
    1. Dzień dobry! Miło czytać, bardzo się cieszę.

      Usuń
  12. U mnie niby wszystko zainstalowane ale nie chce to działać. zapytanie sudo miio --discover --sync nie działa ale jak usunę -- czyli sudo miio discover sync to działa ale pokazuje tylko urządzenia po ip, nie pokazuje Device Id, model czy token, te pozycje są puste, są tylko IP. Zapytanie node /home/pi/domoticz/scripts/airpurifier.js ip_oczyszczacza status też nie działa ale to może dlatego że poprzednia funkcja nie działa prawidłowo ? co może być przyczyną? może w najnowszym nodejs coś się pozmieniało.

    OdpowiedzUsuń
    Odpowiedzi
    1. niektóre urządzenia ukrywają token, jeżeli zostały wcześniej sparowane, ale można go wydobyć jest to opisane szerzej tutaj: https://github.com/jghaanstra/com.xiaomi-miio/blob/master/docs/obtain_token.md

      Usuń
  13. Cześć, posiadam air purifier 2s, przy próbie sprawdzenia statusu otrzymuję:
    pi@DOMOTICZ:~ $ node /home/pi/domoticz/scripts/airpurifier.js 192.168.8.20 status
    { power: undefined,
    mode: undefined,
    aqi: undefined,
    temperature: undefined,
    humidity: undefined }

    masz jakiś pomysł co jest nie tak?

    OdpowiedzUsuń
    Odpowiedzi
    1. Nie mam tego modelu, ale kilka wpisów wyżej kolega Krzysztof Pudełek podawał rozwiązanie.

      Usuń
    2. https://github.com/aholstenson/miio/pull/185/commits/c30e7aeb73a4997cd0e3067121b82b3626bc43f3

      Dodasz i działa.

      Usuń
    3. gaber, a możesz jaśniej ? :-) bardziej krok po kroku ?;-)

      Usuń
  14. Wow, programowanie to dla mnie czarna magia, ale widać, że to przydatna umiejętność. ;) Oczyszczacz super, prezentuje się bardzo estetycznie. Naprawdę macie smog na wsi? Masakra. :(

    OdpowiedzUsuń
    Odpowiedzi
    1. Jest, jest, niestety. Jeszcze wiele lat upłynie, zanim ludzie przestaną śmieci palić...

      Usuń
  15. No to teraz ja stoję :-) Wersja stretch. Nie działa switch. Wszystko mi chodzi oprócz sterowania urządzeniem. Nie mam żadnych widocznych błędów, Jak wcisne off czy co kolwiek innego to jest informacja o włączeniu, żadnych błędów. Nie mam pojęcia gdzie szukać.

    OdpowiedzUsuń
    Odpowiedzi
    1. Z rzeczy, które udało mi się ustalić to polecenia z palca po ssh działają, działa też screen, też odczytuje i wysyła polecenia. Jest tak jakby sam switch nie uruchamiał komend.

      Usuń
    2. Już wszystko działa. W pierwszej fazie screen nie działało, bo go nie było. Zainstalowałem i poszło. Ostatnim moim błędem było nie zmienione IP w skrypcie Lua, wcześniej zmieniałem ale potem urządzenie dostało nowe IP i zapomniałem Zawsze trzeba wszystko sprawdzać Dobra nauka :-)

      Usuń
    3. A przepraszam, ominąłem komentarz. Dobrze jest gdy już zadziała przypisać stałe IP na routerze.

      Usuń
  16. Dziś ukończyłem modyfikacje dla Mi Air Purifier PRO.
    Trochę uprzątnę kod i mogę podesłać jak ktoś będzie zainteresowany.

    OdpowiedzUsuń
    Odpowiedzi
    1. jestem zainteresowany, jak można prosić na av7@wp.pl

      Usuń
    2. Would be great to get this working on my PRO, what modifications did you do?

      Usuń
  17. Witam. Super blog. Działałem według tego poradnika i wszystko działało ale... Musiałem zmienić region na China (i też była chyba jakaś aktualizacja urządzzenia) bo dokupiłem inne urządzenia i teraz nie jestem w stanie odczytać Tokena za żadne skarby. Ma może ktoś jakiś pomysł?

    OdpowiedzUsuń
  18. Jak rozwiązanie może już tylko służyć stara wersja Xiaomi Home - wersja 0.29 (backup i odczytanie tokena z miio2.db

    OdpowiedzUsuń
  19. Cześć walcze z moim Purifier 2S od przedwczoraj, mam jużtoken, działa sterowanie aleeeee mam problem ze skryptem do update czujników

    #!/bin/bash
    echo "script started"

    # Get the data
    data=$(node /home/pi/domoticz/scripts/airpurifier.js 192.168.0.115 status)
    sleep 2
    # Sort it
    temperature=$(echo "$data" | grep "temperature" | sed -e s/[^0-9.]//g)
    humidity=$(echo "$data" | grep "humidity" | sed -e s/[^0-9.%]//g)
    aqi=$(echo "$data" | grep "aqi" | sed -e s/[^0-9.]//g)

    echo "${aqi}"
    # Load it into Domoticz
    curl -s "http://192.168.0.100:8080/json.htm?type=command&param=udevice&idx=171&nvalue=0&svalue=${tempera$
    curl -s "http://192.168.0.100:8080/json.htm?type=command&param=udevice&idx=170&svalue=${aqi}"

    echo " script finished"

    Jeśli odpalam go przez bash to działa elegancko
    pi@raspberrypi:~ $ bash /home/pi/domoticz/scripts/xair2domoticz.sh
    script started
    9
    {
    "status" : "OK",
    "title" : "Update Device"
    }
    {
    "status" : "OK",
    "title" : "Update Device"
    }
    script finished

    Ale Jeśli odpalam go przez sudo albo nawet jak jest skonfigurowany w cronie


    * * * * * bash /home/pi/domoticz/scripts/xair2domoticz.sh
    * * * * * bash /home/pi/domoticz/scripts/xair2domoticz.sh >> /home/pi/log.txt 2>&1

    to mam błędy :(


    pi@raspberrypi:~ $ sudo bash -x /home/pi/domoticz/scripts/xair2domoticz.sh
    + echo 'script started'
    script started
    ++ node /home/pi/domoticz/scripts/airpurifier.js 192.168.0.115 status
    /home/pi/domoticz/scripts/xair2domoticz.sh: linia 5: node: nie znaleziono polecenia
    + data=
    + sleep 2
    ++ echo ''
    ++ grep temperature
    ++ sed -e 's/[^0-9.]//g'
    + temperature=
    ++ echo ''
    ++ grep humidity
    ++ sed -e 's/[^0-9.%]//g'
    + humidity=
    ++ echo ''
    ++ grep aqi
    ++ sed -e 's/[^0-9.]//g'
    + aqi=
    + echo ''

    + curl -s 'http://192.168.0.100:8080/json.htm?type=command&param=udevice&idx=171&nvalue=0&svalue=;;0'
    {
    "status" : "OK",
    "title" : "Update Device"
    }
    + curl -s 'http://192.168.0.100:8080/json.htm?type=command&param=udevice&idx=170&svalue='
    {
    "status" : "ERR"
    }
    + echo ' script finished'
    script finished

    Pomysły czemu?



    OdpowiedzUsuń
  20. Trochę nie ogarniam :-(

    wyciągnąłem starą apką mihome tokeny moich trzech oczyszczaczy (2x 2 i 1x 2s). Zrobiłem update tych tokenów do tych urządzeń i po każdym z nich mam taki oto komunikat:

    INFO Updating token for 192.168.1.38
    INFO Connected to miio:81002364 - trying to change token
    Token has been updated

    Wygląda jakby było bardzo dobrze.

    Po użyciu komendy miio discover pokazują mi się trzy urzadzenia z przypisanymi tokenami:

    pi@domoticz:~/domoticz/scripts $ sudo miio discover
    INFO Discovering devices. Press Ctrl+C to stop.

    Device ID: 81002364
    Model info: zhimi.airpurifier.mc1
    Address: 192.168.1.38
    Token: d66a1f9f***********43567b10 via stored token
    Support: At least generic

    Device ID: 61340711
    Model info: zhimi.airpurifier.m1
    Address: 192.168.1.22
    Token: c6e2dd5************ed9c6476f9 via stored token
    Support: At least basic

    Device ID: 61330988
    Model info: zhimi.airpurifier.m1
    Address: 192.168.1.33
    Token: 310ad2b****************aad7ba78223 via stored token
    Support: At least basic

    Wygląda bardzo obecująco.

    Następnie chciałem sprawdzić status urądzeń i wyskakują mi komunikaty:

    pi@domoticz:~/domoticz/scripts $ node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.38 status
    /home/pi/domoticz/scripts/airpurifier.js:2
    #!/usr/bin/node
    ^

    SyntaxError: Invalid or unexpected token
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:188:16)
    at bootstrap_node.js:609:3

    Co może być nie tak? Czy tokeny wyciągnięte za pomocą MiHome 5.4.54 która zapisuje tokeny w pliku tekstowym.
    Czy te tokeny to fejki ? Gdzieś popełniam błąd ?

    OdpowiedzUsuń
    Odpowiedzi
    1. No dobrze, udało mi się. Popełniłem drobny błąd w skrypcie airpurifier.js.

      Niestety nie działa mi air purifier 2s. Tego nie moge kontrolować jeszcze przez raspberry. Dwa starcze modele (2) działają poprawnie i w domoticzu są wyświetlane.

      Jakie powinienem zrobić modyfikacje w powyższym opisie gdybym chciał dodać kolejne air purifiery ?

      Usuń
  21. Stałą się dziwna rzecz. W nocy przestał wysyłać dane Xiaomi Air Purifier 2s. Dzisiaj po pracy postawnoiłem sprawdzić co się z nim dzieje i nie chciał się uruchomić. Zresetowałem go, wstał, połączyłem z aplikacją MiHome i moją siecią Wifi. Wszystko działa jak należy.
    Problem tylko taki, że nie wykrywa mi go mój raspberry
    Po wpisaniu komendy sudo miio discovery wykrywa mi dwa inne urządzenia a tego nie. Co ciekawe zegarka tez nie wykrywa a wcześniej go widział.
    Spróbowałem więc ręcznie dodać klucz, który wyciągnąłem z aplikacji MiHome - efekt żaden.

    sudo miio tokens update 192.168.1.38 --token 79ab27cb467a82811a8cf3c5f861a293
    INFO Updating token for 192.168.1.38
    WARNING Could not find device


    Gdzie może leżeć problem? o co chodzi ?

    OdpowiedzUsuń
  22. Pytanie laika. W jaki sposób wgrać pliki js na raspberry? Wyjąć kartę i skopiować?

    OdpowiedzUsuń
    Odpowiedzi
    1. No tak to raczej nie, chyba że masz sprzęt z Linuksem ;) FTP lub Samba share, połączyć się później ze swojego komputera z udostępnionym folderem i wgrać.

      Usuń
  23. Dla tych, którzy chcą korzystać z Air Purifiera 2s:
    w skrypcie airpurifier.js zamiast:

    const miio = require('miio');
    wpisać:
    const miio = require('/usr/lib/node_modules/miio')

    bez powyższego nie czytał mi parametrów.

    Dodatkowo w pliku /usr/lib/node_modules/miio/lib/models.js

    dodać zapis 'zhimi.airpurifier.mc1': AirPurifier, w miejscu jak poniżej:

    // Air Purifier 2S
    'zhimi.airpurifier.ma2': AirPurifier,
    'zhimi.airpurifier.mc1': AirPurifier,

    'zhimi.humidifier.v1': Humidifier,

    po powyższym zabiegu 2s śmiga jak ta lala :-)
    Dzięki Cezar za bloga !

    OdpowiedzUsuń
  24. Cześć, udało mi się wydobyć token z oczyszczacza. Pytanie laika, gdzie go teraz wkleić by skrypt zadziałał. Opcja update nie przynosi efektu lub też pojawia sie komunikat, że nie udało się nawiązać połaczenia z oczyszczaczem (malinka go widzi ale wciaż z ukrytym tokenem). po wpisaniu node /home/pi/domoticz/scripts/airpurifier.js IP adres status
    ...wyskakuje komunikat sugerujący, że nie znalazło takiego sprzętu. Czy w airpurifier.js wpisać gdzies token na stałe?

    OdpowiedzUsuń
    Odpowiedzi
    1. Wpisujesz poniższą komendę która zapisuje token:

      sudo miio tokens update 192.168.1.38 --token twojtoken

      Adres IP to adres oczyszczacza.

      Usuń
  25. Czesc Adamie, no właśnie nic to nie daje, po komunikacie, że sie łączy..wyskakuje komunikat...nie znaleziono urządzenia...czy wpisze ip czy id urzadzenia ... po czym pp wyszukiwaniu urzadzenie jest ...dalej wyswietla sie bez tokena ... tu mam problem

    OdpowiedzUsuń
  26. Chciałbym w domoticzu odczytać czas wschodu i zachodu słońca. Czy jest jakas zmienna która to podaje?

    OdpowiedzUsuń
    Odpowiedzi
    1. Oczywiście! Po pierwsze trzeba uzupełnić swoje koordynaty w konfiguracji Domoticz -> Settings -> System. Później można używać czasu wschodu/zachodu zdefiniowanego na tej podstawie w automatyzacjach. U mnie na przykład światło przed domem zapala się zawsze godzinę po zachodzie słońca, a wyłącza o 22.

      Usuń
  27. Witam posiadam Xiaomi Air Purifier 2H czy można dodać go do domoticza wg powyższej instrukcji ? Widzę, że był problem z wersją S i zastanawiam się czy z H nie jest podobnie, pozdrawiam.

    OdpowiedzUsuń
    Odpowiedzi
    1. Udało ci się? Ja to właśnie wałkuję i narazie nie idzie.

      Usuń
    2. Z 2S nie było większego problemu. Trzeba było jedynie dodać jeden wpis tutaj opisany na forum.
      2 a tym bardziej 3H nie posiadam ale może sobie pożyczę od kogoś kiedyś i protestuję.

      Usuń
  28. Dodam, że jak robię wszystko wg instrukcji podczas wpisania komendy:
    sudo miio --discover --sync

    pokazuje się coś takiego:
    miio

    Commands:
    miio configure Control a device by invoking the
    given method
    miio control Control a device by invoking the
    [params..] given method
    miio discover Discover devices on the local
    network
    miio inspect Inspect a device
    miio protocol Inspect and test raw miIO-commands
    miio tokens Manage tokens of devices

    Options:
    --help Show help [boolean]
    --version Show version number [boolean]

    Not enough non-option arguments: got 0, need at least 1

    OdpowiedzUsuń
    Odpowiedzi
    1. Wpis jest dość stary, nie aktualizowałem go. Pierwsze wyszukiwanie w Google pokazuje rozwiązanie: sudo miio discover --sync

      Usuń
    2. Będzie jakaś aktualizacja?

      Usuń
  29. Witam, może czegos nie rozumiem. Czy w airpurifier.js wpisuje gdzies ip oczyszczacza oraz uzyskany token? przy komendzie status wola wlasnie o token.

    OdpowiedzUsuń
  30. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  31. mam AP 3H

    polecenie w pliku airpurifier.js zamienione na:
    const miio = require('/usr/lib/node_modules/miio')


    wpis nowego modelu jest:
    // Air Purifier 2S
    'zhimi.airpurifier.ma2': AirPurifier,
    'zhimi.airpurifier.ma4': AirPurifier,
    'zhimi.humidifier.v1': Humidifier,

    komunikacja jest:
    Device ID: 293284710
    Model info: zhimi.airpurifier.ma4
    Address: 192.168.1.181
    Token: 80d7b88fd**********9c5 via stored token
    Support: At least basic



    dostaję puste dane:
    pi@domoticz:~ $ sudo node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.181 status
    { power: undefined,
    mode: undefined,
    aqi: undefined,
    temperature: undefined,
    humidity: undefined }

    OdpowiedzUsuń
  32. Może ktoś mi z tym pomóc?:)

    OdpowiedzUsuń
  33. Wiem, że wpis ma już swoje lata, ale może ktoś ostatnio coś dłubał i miał taki oto komunikat po wywołaniu komendy node airpurifier.js 192.168.1.131 status

    (node:20665) UnhandledPromiseRejectionWarning: Error: Could not connect to device, token needs to be specified
    at /home/pi/node_modules/miio/lib/network.js:329:16
    (node:20665) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
    (node:20665) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

    Token mam, wpisany poleceniem tokens update.

    OdpowiedzUsuń
  34. Wszystko zostało niezwykle szczegółowo opisane.

    OdpowiedzUsuń