Jeszcze tańsza wersja odtwarzacza sieciowego mediów na bazie Raspberry Pi.

Na moim blogu coraz rzadziej pojawiają się wpisy dotyczące bezpośrednio RasberryPi. Wynika to z tego, że dosyć mocno poszedłem w rozwój automatyki domowej i Domoticza i malinka jest dla mnie tylko bazą do dalszego rozwoju mojego systemu. Nadal zajmuje eksponowane miejsce i z ochotą wracam do zaniechanych z braku czas projektów. Jeden z nich, o roboczej nazwie „Muzyka w każdym pokoju” cały czas rozwijam. W poprzednich wpisach o Volumio i HiFiBerry już pisałem. Jak można w nich przeczytać wyjście dźwięku z mini jack w raspberry jest za słabe i potrzebne są aktywne głośniki, a dobry DAC kosztuje od 100 zł w górę. Dla kilku pokoi robią się nie małe pieniądze. Ceny raspberrypi nie liczę ponieważ przez poprzedni rok nazbierałem ich „kilka” i czekają na wykorzystanie. Po kilku nieudanych próbach znalezienia tańszego wzmacniacza znalazłem w końcu coś takiego.

htb1nwt1zkcwbunjy0faq6xulxxaj.jpg

Jest to dwukanałowy 6W wzmacniacz z wyjściem mini jack. Kupiłem go tu. Cena poraża. Nie wierzyłem szczerze powiedziawszy że zadziała. Podłączenie jest dziecinnie proste. Zasilanie 5V i GDN z RaspberryPi do gniazda obok czerwonej diody, głośniki do zacisków z lewej i wyjście dźwięku z malinki do wejścia w urządzeniu. Musi działać. Potencjometr reaguje bardzo płynnie, nie słychać trzasków i przeskoków. Miałem stare głośniki od wieży i doczekały się w końcu swojej drugiej szansy. Wersja na roboczo wygląda tak.

Do budowy mojego projektu wykorzystałem Logitech Media Server z odtwarzaczami  piCorePlayer. Jako że miałem już 2 odtwarzacze na bazie RaspberryPi Zero i HiFiBerry MiniAmp działające w oparciu o Volumio postanowiłem ten najnowszy wpiąć w sieć i stworzyć multi-room. Logitech Media Server zainstalowałem na tej samej maszynie na której chodzi Domoticz. Na razie nic się nie gryzie. Zobaczymy jak będzie dalej. Dla tych, którzy stawiają LMS na Raspbianie polecam wpis Cezara . Tam są wszystkie szczegóły. U mnie Domoticz chodzi na Ubuntu Server, więc instalacja Logitech Media Server sprowadzała się do pobrania i zainstalowania paczki ze strony http://downloadsorigin.slimdevices.com/LogitechMediaServer_v7.9.0/ . Po restarcie odpalamy server podając nasze IP i port 9000. Na malinkach, które będą odtwarzaczami wypalamy piCorePlayer. I tyle.

FireShot Capture 4 - Logitech Media Server - http___192.168.2.214_9000_

FireShot Capture 5 - Logitech Media Server - http___192.168.2.214_9000_

Oczywiście możemy użyć aplikacji Squeezer oraz obsłużyć wszystko z Domoticza.

Screenshot_20180909-142451.jpg

FireShot Capture 7 - Domoticz - http___192.168.2.214_9009_#_LightSwitches

Audiofilski system to to nie jest, ale nie taki nie taki miał być. Myślę, że pomysł może się przydać dla tych, u których w szufladzie przewalają się zapomniane malinki a nie ma pomysłu a zwłaszcza funduszy na ich zagospodarowanie. Moim zdaniem zakup tego wzmacniacza to jeden z lepszych pomysłów na wydanie 2.5 $.

 

 

 

 

 

 

 

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)