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)

18 komentarzy do “Obsługa radia FM w Xiaomi Getaway poprzez Domoticza.

  1. U mnie nie działa … po wciśnięciu ” Get Chanell ID” w logach mam tylko :
    2018-05-21 15:04:30.561 User: Admin initiated a switch command (80/miGateway FM/Set Level)
    2018-05-21 15:04:30.566 (Virtual_sensors) Light/Switch (miGateway FM

    Wygląda jak by skrypt dzVentz się nie wykonywał 😦

    Polubienie

    • Okazało się , że w ustawieniach domoticz miałem wyłączoną opcję dzVents (2.2.0)
      Teraz w logach mam tylko:
      2018-05-21 15:15:06.279 User: Admin initiated a switch command (80/miGateway FM/Set Level)
      2018-05-21 15:15:06.404 dzVents: Info: Handling events for: „miGateway FM”, value: „Get Channel ID”
      2018-05-21 15:15:06.412 (Virtual_sensors) Light/Switch (miGateway FM)

      Polubienie

  2. U mnie w logach pokazuje taki błąd, skrypt kopiowany ze strony.

    2018-05-24 12:05:25.085 dzVents: Error (2.4.1): An error occured when calling event handler XiaomiFM
    2018-05-24 12:05:25.085 dzVents: Error (2.4.1): …/domoticz/scripts/dzVents/generated_scripts/XiaomiFM.lua:32: attempt to concatenate global ‚param’ (a nil value)

    Polubienie

  3. Czy sposób ze zmianą DNS (DNS Changer – Android) powinien dalej zadziałać? Zmieniam na: 82.146.38.202, przechodzę do ustawień radia w Mi Home, jednak nie pokazuje mi większej liczby stacji. Any updates?

    Polubienie

  4. Witam, po wpisaniu komendy „sudo apt install php7.0” mam stronę „Apache2 Debian Default Page”
    to jest pierwsza strona po zainstalowaniu Apache. Jak się tego pozbyć!!!

    Polubienie

  5. Udało mi się odzyskać stronę Domoticz’a ale dopiero po odinstalowaniu PHP7.0. Więc ze sterowania radyjkiem Xiaomi nici 😦

    Polubienie

  6. Witam,
    Dziękuje za instrukcję, sposób oczywiście działa super :))
    mam tylko pytanie jak już było wyżej o możliwość zmiany głośności radia.

    Polubienie

Dodaj odpowiedź do Łukasz Anuluj pisanie odpowiedzi