Obsługa radia FM w Xiaomi Getaway poprzez Domoticza.

Centralka Xiaomi Getaway stanowi u mnie jeden z ważniejszych elementów sytemu. Podłączyłem pod nią masę czujników i przełączników. Za jej pomocą monitoruje temperaturę i wilgotność w pomieszczeniach, steruję oświetleniem, uruchamiam bojler itp. Posiada również funkcję radia, którego słucham do śniadania. Domyślnie obsługuje tylko kilka chińskich stacji, ale po zmianie DNS można już znaleźć np. Trójkę, Zet czy RMF. Domoticz nie obsługuje jednak wbudowanego w centralkę radia. Jednak na forum Domoticza znalazłem na to sposób.

Na początek dodajemy polskie stacje do listy. W sieci jest dużo poradników jak to zrobić. Najprostszy moim zdaniem sposób wygląda jak poniżej.

  1. Wchodzimy na stronę http://ximiraga.ru/?chlang=en#install i zapamiętujemy DNS: 82.146.38.202
  2. Dowolnym programem na Andrioda np. DNS Changer zmieniamy DNS w telefonie
  3. Uruchamiamy Mi Home i  przechodzimy do radia
  4. Aplikacja powinna sama pobrać całą masę dodatkowych stacji.
  5. Znajdujemy interesującą nas rozgłośnie i dodajemy do ulubionych i gotowe. Trzeba się trochę naszukać ponieważ nie działa filtrowanie stacji. Po tej operacji można ponownie zmienić DNS na preferowane.

Screenshot_2018-05-02-08-54-29-223_com.xiaomi.smarthome.png

Ja sprawę wygodnego sterowania rozwiązałem przy pomocy przycisku Xiaomi Wireless Switch. Umieściłem włącznik na ścianie. Naciśnięcie włącza mi domyślne radio, drugie wyłącza. Ale do starowania z Domoticza jeszcze daleka droga. Na forum znalazłem jednak skrypt dzVents, który robi takie czary.

W pierwszej kolejności znajdujemy Ip i token centrali. Na początek wersja trudniejsza. Instalujemy pakiet php-miio.

sudo apt update
sudo apt upgrade
sudo apt install php7.0
git clone https://github.com/skysilver-lab/php-miio.git php-miio

Przechodzimy do katalogu php-miio i szukamy podłączonych urządzeń.

cd /home/pi/php-miio/
php miio-cli.php --discover all

Niestety u mnie nie zadziałało. Może u innych będzie ok, więc opisuje sposób.

Po wielu próbach olśniło mnie i zajrzałem do aplikacji MiHome. W zakładce Hub Info, pomiędzy krzaczkami znajdujemy nasz token i Ip. Jeżeli nie wyświetli się wszystko naciskamy prawy przycisk na dole.

InkedScreenshot_2018-05-02-09-21-53-670_com.xiaomi.smarthome_LI.jpg

Teraz musimy utworzyć przełącznik, który sczyta ID radia i oczywiście przełącznik do wyboru i uruchomienia radia. Proponuje pozostawić domyślne nazwy ze skryptu aby uniknąć literówek. Proponuje tworzyć skrypt w Zdarzeniach bezpośrednio w Domoticzu.

Screenshot-2018-5-2 Domoticz(7)

Poniżej kod.

return {
	on = {
		--timer = {'every minute'},
		devices = {'miGateway FM', 'miGateway FM - Source'}
	},
	logging = {
        level = domoticz.LOG_ERROR
    },
	execute = function(dz, item)

	     local Path   = "/home/pi/php-miio/"                  -- php-miio path
	     local IP     = 'xxxxxxxxxxxx'                        -- Xiaomi Gateway IP
	     local Token  = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'    -- Xiaomi Gateway Token
         local FM     = dz.devices('miGateway FM')
         local Source = dz.devices('miGateway FM - Source')

       --  Channel ID, Channel Name
         ch1ID, ch1Name = '527782024', 'Trojka'
         ch2ID, ch2Name = '527782027', 'Zet'
         ch3ID, ch3Name = '527782029', 'Eska'
         ch4ID, ch4Name = '527782034', 'Złote przeboje'
         ch5ID, ch5Name = '527782069', 'RMF Maxxx'

         chID = {}
        chID[#chID+1] = {ch1ID, ch1Name}
        chID[#chID+1] = {ch2ID, ch2Name}
        chID[#chID+1] = {ch3ID, ch3Name}
        chID[#chID+1] = {ch4ID, ch4Name}
        chID[#chID+1] = {ch5ID, ch5Name}

 function SendCommand()
    cmd = "cd "..Path.." && php miio-cli.php --ip "..IP.." --token "..Token.." --sendcmd '{\"id\":1,\"method\":\""..method.."\",\"params\":"..param.."}'"
 end   

        if (item.isDevice) then
               if (item.name == 'miGateway FM') then
                      if (item.levelName == 'Get Channel ID') then
                          method = "get_prop_fm"
                          param  = "[]"
                          SendCommand()
                          local h = io.popen(cmd)
	                      local r = h:read("*a")
	                      h:close()
                          _, _, num1, num2, num3, num4, channel = string.find(r, "(%d+)[^%d]+(%d+)[^%d]+(%d+)[^%d]+(%d+)[^%d]+(%d+)[^%d]")
                          print('Channel ID = '..channel)
                          item.switchOff().afterSec(1).silent()
                     else
                          method = "play_fm"
                             if (item.levelName == 'On') then
                                 param =  "[\"on\"]"
                             elseif
                                (item.levelName == 'Off') then
                                 param =  "[\"off\"]"
                                 Source.switchOff().checkFirst().silent()
                             end
                          SendCommand()
                          dz.utils.osExecute('('..cmd..' > /dev/null)&')
                     end
              end
              if (item.name == 'miGateway FM - Source') then
                     if (item.state == 'Off') then
                         method = "play_fm"
                         param =  "[\"off\"]"
                         dz.devices('miGateway FM').switchOff().silent()
                     else
                        for i in pairs(chID) do
                           if (item.levelName == chID[i][2]) then
                               method = "play_specify_fm"
                               param = "["..chID[i][1].."]"
                                  if (FM.levelName ~= 'On') then
                                      FM.switchSelector(30).silent()
                                  end
                           end
                        end
                     end
                  SendCommand()
                  dz.utils.osExecute('('..cmd..' > /dev/null)&')
              end
        end
        if (item.isTimer) then
            method = "get_prop_fm"
            param  = "[]"
            SendCommand()
            local h = io.popen(cmd)
	        local r = h:read("*a")
	        h:close()
               if (string.find(r, '"pause"')) then
                   Source.switchOff().checkFirst().silent()
                   FM.switchOff().checkFirst().silent()
               end
               if (string.find(r, '"run"')) then
                   _, _, num1, num2, num3, num4, channel = string.find(r, "(%d+)[^%d]+(%d+)[^%d]+(%d+)[^%d]+(%d+)[^%d]+(%d+)[^%d]")
                       if (channel == ch1ID and Source.levelName ~= ch1Name) then Source.switchSelector(10).silent()
                           elseif (channel == ch2ID and Source.levelName ~= ch2Name) then Source.switchSelector(20).silent()
                           elseif (channel == ch3ID and Source.levelName ~= ch3Name) then Source.switchSelector(30).silent()
                           elseif (channel == ch4ID and Source.levelName ~= ch4Name) then Source.switchSelector(40).silent()
                           elseif (channel == ch5ID and Source.levelName ~= ch5Name) then Source.switchSelector(50).silent()
                           elseif (channel ~= ch1ID)
                              and (channel ~= ch2ID)
                              and (channel ~= ch3ID)
                              and (channel ~= ch4ID)
                              and (channel ~= ch5ID) then
                                      if (Source.levelName ~= 'Unknown') then
                                          Source.switchSelector(60).silent()
                                      end
                       end
                       if (FM.levelName ~= 'On') then
                           FM.switchSelector(30).silent()
                       end
               end
        end
	end
}

Zmieniamy dane w poniższych liniach na własne.

local Path   = "/home/pi/php-miio/"                  -- php-miio path
local IP     = 'xxxxxxxxxxxx'                        -- Xiaomi Gateway Ip
local Token  = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'    -- Xiaomi Gateway Token

Następnie tworzymy 2 zwykłe przełączniki.

Screenshot-2018-5-2 Domoticz

Screenshot-2018-5-2 Domoticz(3)

Screenshot-2018-5-2 Domoticz(4)

Teraz magia. Uruchamiamy radio np. Trójkę poprzez MiHome. W trakcie odtwarzania naciskamy przycisk Get Channel ID na przełączniku miGateway FM. W logach zobaczymy

Screenshot-2018-5-2 Domoticz(5)

Aktualizujemy skrypt wpisując sczytany channel id i nazwę stacji.

--  Channel ID, Channel Name
         ch1ID, ch1Name = '527782241', 'Trojka'
         ch2ID, ch2Name = '527782027', 'Zet'
         ch3ID, ch3Name = '527782029', 'Eska'
         ch4ID, ch4Name = '527782034', 'Złote przeboje'
         ch5ID, ch5Name = '527782069', 'RMF Maxxx'

I cała filozofia. Teraz na pulpicie mam

Screenshot-2018-5-2 Domoticz(8)

Xiaomi Aqara Smart Light Switch Wireless. Włącznik światła w Domoticzu.

Żarówki Yeelight, które bardzo dobrze się u mnie sprawują ( konfiguracje i integracje z Domoticzem opisałem tu ) mają jedną, podstawową wadę. Muszą być cały czas zasilane. Jeżeli są umieszczone w żyrandolu w salonie, trzeba cały czas uważać aby nie wyłączyć światła włącznikiem ściennym. Rozwiązaniem jest zastosowanie bezprzewodowego włącznika ściennego typu dzwonkowego. Oczywiście Xiaomi właśnie takie ma w ofercie. Przypadek ?

1502825220112444678.JPG

Ja kupiłem przycisk podwójny, trzyfunkcyjny. ( 1 przycisk, 2 przycisk i naciśnięcie obu ) . Jest to wersja WIFI, zasilana bateryjnie ( podobno czas działania baterii to 2 lata ). Instalacja jest bardzo prosta. Parujemy urządzenie z MiHome zgodnie z podpowiedziami w aplikacji ( podczas parowania naciskamy dłużej jeden z przycisków ). Następnie w aplikacji przypisujemy odpowiednie zdarzenia.

Przechodzimy do urządzenia głównego Getaway i sekcji Automation.

 

Sprawdzamy czy wszystko działa i przechodzimy do Domoticza. Najpierw musimy jednak przygotować instalacje. Ja postanowiłem odkręcić włącznik i na jego miejsce przykleić Xiaomi Aqara Smart Light Switch Wireless.

 

Aby żarówki były cały czas zasilane musimy połączyć kable w puszce. U mnie są trzy więc możliwości nie jest za dużo. Po tej czynności żarówka powinna świecić w sposób ciągły. Ukryłem przewody w puszce i nakleiłem ( przy pomocy dołączonej taśmy ) przełącznik.

img_20171118_111458.jpg

Tak wygląda na ścianie.

Jeżeli mamy już inne urządzenia Xiaomi w Domoticzu system wykryje go automatycznie. Jeżeli to dopiero początek pracy z czujnikami Xiaomi zachęcam do zapoznania się z wpisem Xiaomi Smart Home Starter Kit w Raspberry Pi i Domoticzu.

FireShot Capture 11 - Domoticz - http___192.168.2.81_9090_#_Devices

W Domoticzu dodajemy zdarzenia /Konfiguracja/Więcej opcji/Zdarzenia. U mnie jest tak:

Switch On – naciśnięcie lewego klawisza

FireShot Capture 12 - Domoticz - http___192.168.2.81_9090_#_Events

Switch Off

fireshot-capture-13-domoticz-http___192-168-2-81_9090__events.png

Dodajemy do pulpitu nasz włącznik zmieniając domyślne opisy wedle uznania.

FireShot Capture 14 - Domoticz - http___192.168.2.81_9090_#_LightSwitches.png

Po aktualizacji Poziomów wyboru i Nazwy włącznika zdarzenia nie uaktualnią się automatycznie. Trzeba zaktualizować utworzone zdarzenia.

Efekt końcowy jest bardzo przyjemny.FireShot Capture 16 - Domoticz - http___192.168.2.81_9090_#_Dashboard.png

Można już wyłączyć oddzielne sterowanie dla każdej z żarówek Yeelight robiąc trochę miejsca na pulpicie.

FireShot Capture 17 - Domoticz - http___192.168.2.81_9090_#_Dashboard.png

Podsumowanie.

Tym sposobem możemy sterować oświetleniem na 3 sposoby: poprzez aplikacje MiHome, Domoticzem i bezpośrednio włącznikami na ścianie. Można kupić przyciski montowane bezpośrednio do puszki, ale chińskie puszki są kwadratowe i większe, więc trzeba przerabiać otwory. Plusem jednak takiego rozwiązania jest możliwość użycia normalnych żarówek. Sterowanie odbywa się wewnątrz modułu. Ja zdecydowałem się na mniej inwazyjną metodę bateryjną. Na Gearbest.com cena takiego włącznika to ok. 40 zł. Za białą żarówkę musimy dać ok 60 zł. Biorą pod uwagę, że jednym przyciskiem możemy obsłużyć 3 żarówki cena nie jest już tak zaporowa. Zamówiłem już dwa kolejne.

Przycisk Xiaomi Wireless Switch w Domoticzu.

Znalezione obrazy dla zapytania Xiaomi Wireless Switch

Kolejny element inteligentnego domu od Xiaomi dotarł do mnie z Chin. Urządzenie to nic innego jak trzyfunkcyjny przełącznik służący do sterowania  kompatybilnym sprzętem podłączonym do centrali Gateway poprzez protokół ZigBee. Przełącznik ma trzy funkcje:

  • pojedynczy klik
  • podwójny klik
  • długie przytrzymanie

Po sparowaniu go z aplikacją MiHome ( analogicznie jak przy innych urządzeniach opisanych wcześniej ) postanowiłem dodać go do Domoticza.

Jeżeli nie dodaliśmy jeszcze bramy Gateway to robimy to jak poniżej. W przypadku gdy mamy już podłączone inne elementy systemu Xiaomi przełącznik doda się automatycznie do sekcji /Urządzenia.

Screenshot_20171022_120123.png

Screenshot_20171022_120427.png

Teraz należy ustawić odpowiednią akcję, która wykona się w momencie naciśnięcia przycisku. Przechodzimy do /Konfiguracja/ Więcej opcji/ Zdarzenia i budujemy przykładowy blok.

Screenshot_20171022_120640

Należy pamiętać o zaznaczeniu „Event active:”. U mnie był domyślnie wyłączony i trochę się namęczyłem zanim doszedłem dlaczego nie działa.

Screenshot_20171022_120706.png

Mój przycisk, po długim naciśnięciu włącza bojler. Oczywiście możemy przypisać trzy zdarzenia i sterować pojedynczym klikiem, podwójnym klikiem lub długim przytrzymaniem odpowiednio rozbudowując blok.

Ustawiamy typ przełącznika na /Selector

Screenshot_20171022_122617.png

Od teraz możemy wykorzystać dodatkowe trzy akcje przy użyciu jednego urządzenia.

YeeLight LED Bulb – inteligentne żarówki od Xiaomi w Domoticzu

Mój Domoticz powiększył się ostatnio o kolejne elementy. Jednym z nich są żarówki od Xiaomi – YeeLight LED Bulb. Aktualnie w wersji jednokolorowej, ponieważ paczka z wersją RGB zaginęła po drodze z Chin. Znalezione obrazy dla zapytania YeeLight LED Bulb

Integracja żarówek z systemem okazała się banalnie prosta. Wspomnieć należy, iż obsługa Xiaomi Getaway  awansowała w ostatnim wydaniu sytemu do wersji stabilnej. Oczekuje więc, że od tej pory ilość problemów powinna się zmniejszyć.

Podłączenie YeeLight LED Bulb.

Dodajemy Sprzęt i tyle. System powinien automatycznie wykryć żarówki.

FireShot Capture 006 - Domoticz - http___91.245.83.80_9090_#_Hardware

Znajdujemy je w Urządzeniach.

FireShot Capture 008 - Domoticz - http___91.245.83.80_9090_#_Devices

Jest jednak pewien mały problem. Kupiłem 2 żarówki jednak system wykrywa tylko jedną z nich. Nie umiem go zmusić aby dodał obie. W aplikacji MiHome wszystko działa jak należy.  W oficjalnym Wiki widać, że system obsługuje kilka żarówek. Jeżeli uda mi się to przeskoczyć dodam mały update postu.

Tak to wygląda na gotowo.

FireShot Capture 009 - Domoticz - http___91.245.83.80_9090_#_LightSwitches

PS.  Przypominam oczywiście o dodaniu najpierw żarówek do aplikacji MiHome. To pierwsza czynność przy podłączaniu wszystkich urządzeń Xiaomi.

Uwaga. Należy również ustawić w żarówkach tryb developerski. W wersji 3.0 aplikacji Yeelight nazywa się on „LAN control”. Ustawiamy do jak poniżej:

  1. Naciskamy żarówkę, której tryb chcemy przestawić i przechodzimy do ustawień ( prawy górny róg )

    2. Następnie naciskamy przycisk w prawym dolnym rogu, wybieramy „LAN control” i zmieniamy położenie przełącznika.

    Od tej chwili żarówki będą dostępne dla innych systemów sterowania.