Monitor prawdopodobieństwa opadów deszczu w Domoticzu.

Na blogu u Cezara wyczytałem swego czasu świetny wpis o zaimplementowaniu w Domoticzu radaru burzowego z serwisu https://burze.dzis.net/. Działa znakomicie.

FireShot Capture 60 - Domoticz - http___91.245.83.80_9009_#_Utility.png

Nie chcąc dublować wpisu postanowiłem poszukać rozwinięcia i ewentualnego uzupełnienia tematu. Znalazłem na forum Domoticza skrypt, który na podstawie danych z http://www.wunderground.com podaje prawdopodobieństwo opadów i w zależności od wyniku ustawia przełącznik w odpowiedniej pozycji. Sprawdzałem kilkanaście dni ( aktualnie u nas co jakiś czas pada ) i działa prawidłowo. Przydaje się do np. do planowania podlewania ogródka.

Sprawa jest bardzo prosta. Tworzymy 3 wirtualne czujniki ( przełącznik prognozowanych opadów w danym dniu,  przełącznik prognozowanych opadów w aktualnej godzinie i kafelek tekstowy z procentowym prawdopodobieństwem opadów ). Skrypt jest napisany w języku dzVents. Jest to kolejna generacja LUA. Swoją drogą bardzo intuicyjny język. Aktualnie trochę się im bawię i jestem pod wrażeniem. Na początku musimy włączyć jego obsługę w Domoticzu. Przechodzimy do /Konfiguracja/Ustawienia/Inne

FireShot Capture 61 - Domoticz - http___91.245.83.80_9009_#_Setup.png

Dobrze jest ustawić poziom zapisywania do logów aby wiedzieć co aktualnie zwraca skrypt. Aby zapobiec błędom w kopiowaniu skryptu na blog proponuje pobrać kod bezpośrednio z forum Domoticza. Wątek jest tu.

Uzupełniamy dane:

FireShot Capture 62 - Domoticz - http___91.245.83.80_9009_#_Events

Najlepiej wkleić poniższy skrypt w kreatorze zdarzeń Domoticza /Konfiguracja/Więcej opcji/Zdarzenia. Nie będzie problemu ze ścieżką dostępu.

FireShot Capture 64 - Domoticz - http___91.245.83.80_9009_#_Events

Wstawiamy nazwę swojej lokalizacji, kraj, klucz API z www.wunderground.com. Jak pobrać klucz pisałem w poście Prognoza pogody z serwisów internetowych w Raspberry Pi i systemie DOMOTICZ. Tworzymy teraz 3 wirtualne czujniki, o których pisałem wcześniej.

Albo nadajemy im nazwy jak w skrypcie, albo własne, pamiętając o aktualizacji skryptu. Ważne, aby sprawdzić poprawność ścieżki do lua.  ( 21 linijka kodu ). Powinno być OK, ale u mnie musiałem poprawić. W linijce 8 kodu ustawiamy odświeżanie ( u mnie co 1 minuta – tak dla testów ). Oczywiście restart i w logach powinniśmy zobaczyć coś takiego. Pamiętamy o zaznaczeniu Event active.

FireShot Capture 63 - Domoticz - http___91.245.83.80_9009_#_Log

Efekt finalny jest taki. W zakładce przełączniki zobaczymy.

FireShot Capture 65 - Domoticz - http___91.245.83.80_9009_#_LightSwitches.png

Natomiast w zakładce /Użytkowe mamy nasz wynik procentowy.

FireShot Capture 66 - Domoticz - http___91.245.83.80_9009_#_Utility.png

 

Jeżeli w Waszej lokalizacji aktualnie nie pada ( jak u mnie ) proponuje znaleźć miasto z opadami i dla testu zmienić w skrypcie.

PS. Ikonki w przełącznikach nie są domyślne. Proponuje poszukać na forum fajnych ikonek np. tu i zaktualizować w przełącznikach.

FireShot Capture 70 - Domoticz - http___91.245.83.80_9009_#_LightSwitches

Wchodzimy w /Konfiguracja/Więcej opcji/Własne ikony wybieramy *.zip i przesyłamy. Możemy już wybierać swoje ikony.

PS2. Jeżeli będzie ktoś miał problemy ze skryptem proszę o info w komentarzach a prześlę mailem.

Teraz oczekiwanie na deszcz nabrało innego sensu 🙂

 

 

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)