Coś dla fanów piłki nożnej – skrypt dzVents

Dzisiaj coś dla fanów piłki nożnej. Ja osobiście nim nie jestem, ale nie w tym rzecz. Poniższy skrypt (w dwóch wersjach, dla wersji dzVents z ostatniej wersji stabilnej Domoticz – czyli 2.2 – oraz dla najnowszej w wersji Beta) jest wspaniałym przykładem tego, co można zrobić z danymi pobieranymi ze stron www. Pobrać, przemielić, wyświetlić.

Nie jestem autorem kodu, autorem jest elmortero, kod można znaleźć na forum Domoticz.

Dla przypomnienia, kod wstawiamy tutaj:



local scorefile = '/tmp/score.json’
local fetchIntervalMins = 3     — interval to check the info (don’t set to lower than 3)
return {
active = true,
on = {
timer = { 'every minute’ },
},
execute = function(domoticz, device)
local callUrl = false
if (os.date(’*t’).min % fetchIntervalMins) == 0 then
callUrl = true
elseif ((os.date(’*t’).min -1) % fetchIntervalMins) ~= 0 then
return
end
local board = domoticz.devices(’Scoreboard’)
local prevboard = tostring(board.text)
local linker = tostring(’http://worldcup.sfg.io/matches/today’)
if callUrl then
os.execute(’curl -s „’..linker..'” > ’..scorefile..’&’)
print(’json written to file’)
return — Nothing more to do for now, we’ll be back in a minute to read the data!
end
local function readLuaFromJsonFile(fileName)
local file = io.open(fileName, 'r’)
if file then
package.path = ’./scripts/lua/?.lua;’..package.path
local jsonParser = require(’JSON’)
local _json = file:read(’*a’)
local json = jsonParser:decode(_json)
io.close(file)
return json
end
return nil
end
local scoreData = readLuaFromJsonFile(scorefile)

if not scoreData then
print(’** Scoreboard// Could not read scoreData from file: ’.. scorefile)
return
end

tl = #scoreData
if tl > 0  then
tc = 1
repeat
local status = tostring(scoreData[tc].status)
local date = tostring(scoreData[tc].datetime)
local home = tostring(scoreData[tc].home_team.country)
local away = tostring(scoreData[tc].away_team.country)
local hgoal = tostring(scoreData[tc].home_team.goals)
local agoal = tostring(scoreData[tc].away_team.goals)

local pattern = „(%d+)%-(%d+)%-(%d+)T(%d+):(%d+):(%d+)”
local year, month, day, hour, minute, seconds = date:match(pattern)
hour = hour + 2

show = (home..’ ’..hgoal..’ – ’..agoal..’ ’..away)

if status == 'in progress’ then tc = tl + 1 end
if status == 'completed’ then
local score = (hgoal..’ – ’..agoal)
local winner = tostring(scoreData[tc].winner)
if winner == 'Draw’ then 
   show = (’Draw ’..home..’ ’..hgoal..’ – ’..agoal..’ ’..away)
   else 
   show = (’Match won by ’..winner..’ with ’..score)
end
tc = tc + 1
end
if status == 'future’ then 
    show = (show..’ KO ’..hour..’:’..minute)
    tc = tl + 1 
end
until tc > tl
if show ~= prevboard then
    print (’result ’..show)
board.updateText(show)
end

    end
end

}

Poniżej wersja dla dzVents w wersji przynajmniej 2.4.

return {
on = {
timer = { 'every 2 minutes’ },
httpResponses = { 'scoreboard2′ } — matches callback string below
},

execute = function(domoticz, triggerItem)
    local board = domoticz.devices(’Scoreboard2′)    –a virtual text sensor
    local prevboard = tostring(board.text)          –get current value of text sensor

if (triggerItem.isTimer) then
domoticz.openURL({
url = 'http://worldcup.sfg.io/matches/today’,
method = 'GET’,
callback = 'scoreboard2′
})

elseif (triggerItem.isHTTPResponse) then

local response = triggerItem
if (response.ok and response.isJSON) then
tl = #response.json
tc = 1
repeat
local status = tostring(response.json[tc].status)
local home = tostring(response.json[tc].home_team.country)
local away = tostring(response.json[tc].away_team.country)
local hgoal = tostring(response.json[tc].home_team.goals)
local agoal = tostring(response.json[tc].away_team.goals)
if away == 'Spain’ or away == 'Belgium’ or home == 'Spain’ or home == 'Belgium’ then
sender = true
end
show = (home..’ ’..hgoal..’ – ’..agoal..’ ’..away)

if status == 'in progress’ then tc = tl + 1 end
if status == 'completed’ then
local score = (hgoal..’ – ’..agoal)
local winner = tostring(response.json[tc].winner)
show = (’Match won by ’..winner..’ with ’..score)
tc = tc + 1
end
if status == 'future’ then tc = tl + 1 end
until tc > tl
if show ~= prevboard then
    print (’result ’..show)
board.updateText(show)
if sender then
–put your notification method here (mine is telegram)
end
end
else
print(’**scoreboard2 failed to fetch info’)
end
end
end

}

Dodajemy Virtual switch typu text:

I w sumie gotowe 🙂

Trzymamy kciuki aby wygrali!

Obsługa zdarzeń w Domoticz używając dzVents

Osobiście nie lubię terminu 'inteligentny dom’. Inteligentny może być człowiek, dom może być umiejętnie sterowany na podstawie pewnych zdarzeń. Chociaż oglądając ostatnie poczynania Google Duplex zaczynam powoli zastanawiać się nad zmianą mojej opinii 😉

W poprzednim wpisie opisałem proste zdarzenia na czujnikach, switch’ach, itp. W Domoticz jest (jak napisałem) możliwość wykorzystania kilku schematów zdarzeń:

– bezpośrednio na samych czujnikach
– schematy blokowe w Blockly
– skrypty Lua lub Python
– dzVents

Dzisiaj skupię się na dzVents – wewnętrznym języku skryptów Domoticz. W sumie bazuje na Lua, czyli załatwiamy po części punkt trzeci 😉 Takie małe skróty.

Warto zainwestować czas w naukę, ponieważ schematy Blockly, mimo że ładne, swoje ograniczenia mają. Nadmieniam – nie jestem w tym temacie (jeszcze) ekspertem – to moje początkowe próby.

Opieram się na wersji 2.2.0, dostępnej w ostatniej stabilnej wersji Domoticz!

Dokumentacja tej wersji dostępna jest pod linkiem:
https://github.com/domoticz/domoticz/blob/9f75e45f994f87c8d8ce9cb39eaab85886df0be4/scripts/dzVents/documentation/README.md

No bo proszę, jakże naturalne jest wpisanie:

Co 10 minut w dni powszednie uruchom akcje:
– Jeżeli to nie wieczór i nie noc, przepisz wartość zmiennej do innej zmiennej, upewnij się, że światła w salonie wyłączone, a do tego, jeżeli czujka ruchu nie odpowiada – wyłącz światło w łazience

return {
active = true,
on = {
timer = {’Every 10 minutes on mon,tue,wed,thu,fri’}
},
execute = function(domoticz)
if (domoticz.time.isDayTime and domoticz.variables(’Zmienna1′).value == 10) then
domoticz.variables(’Zmienna2′).set(15)

domoticz.setScene(’Światła Salon’, 'Off’)

if (domoticz.devices(’CzujkaRuchu’).lastUpdate.minutesAgo > 5) then
                domoticz.devices(’Bathroom lights’).switchOff()
            end
end
end
}

To tylko jednak przykład. Sam używam kilku innych skryptów, które okazały się bardzo przydatne.

Zacznijmy od tego jak je pisać i gdzie możemy je znaleźć.

Setup -> More Options -> Events. Tam znajdziemy edytor z kilkoma możliwymi typami:
– Blockly
– Lua
– dzVents
– Python

Nas interesuje aktualnie dzVents i taki typ musimy wybrać przy tworzeniu nowego pliku. Nie zapomnijcie również wpisać nazwy oraz zmienić Event active na włączony. Dla wyjaśnienia – skrypty można tworzyć i z poziomu Raspberry Pi, z basha zapisując je w odpowiednim folderze, ale tutaj mamy pewność, że Domoticz sam je sobie w dobrym miejscu osadzi. I będzie mniej problemu przy przenoszeniu systemu.

Mała sugestia – sprawdzajcie log Domoticz, szczególnie na początku tworzenia – często są tam przydatne informacje – czy skrypt się załadował, czy wystartował, jak działa, w jakiej zmiennej się pomyliliśmy, jaka funkcja ma złą nazwę (patrzcie dokładnie ma małe/duże litery – ma to ogromne znaczenie!).

1. Na początek – nie podobało mi się jak barometr Xiaomi jest prezentowany w Domoticz. Pokazuje złe wartości. Oczywistym jest, że ciśnienie 969 Bar nie jest poprawne… Głupota, szczegół? Owszem, ale uważam, że ten szczegół trzeba poprawić.

No to raz, dwa, trzy:

return {
    active = true,
    on = {
        [’timer’] = {’every 30 minutes’}
    },
    execute = function(domoticz)

    local Baro = domoticz.devices(’Xiaomi Baro Kuchnia’).pressure
    
    domoticz.devices(’Baro Kuchnia’).updateBarometer(Baro, domoticz.BARO_NOINFO)
        
    end
}

Zwróćcie uwagę na konstrukcję:
– początek funkcji
– warunek wyzwolenia – tutaj czasowy
– zawartość funkcji

Co zrobiliśmy? Co 30 minut uruchom przepisanie wartości z czujnika do zmiennej, a później zmienną przepisz do osobno założonego czujnika ciśnienia.

I już, działa.

Zauważcie, że czujnik ciśnienia można zaktualizować o parametry, tutaj BARO_NOINFO (czyli nie zmieniamy), ale może on przyjmować również wartości:
BARO_CLOUDYBARO_CLOUDY_RAINBARO_STABLEBARO_SUNNYBARO_THUNDERSTORMBARO_NOINFOBARO_UNSTABLE

Nie jestem fizycznie w stanie opisać tutaj wszystkich parametrów wszystkich czujników – zapraszam do czytania dokumentacji i własnych prób.

2. Kolejny temat – biegam. Dużo biegam. Wstaję rano, banan, woda i w drogę. Ale lubię wiedzieć jak mam się ubrać. Albo inny przykład – w zimie warto wiedzieć czy jest przymrozek.

Oczywiście – można sprawdzić prognozę pogody albo wyjrzeć za okno, ale często gdy wstanę sprawdzam pocztę i akurat takie podstawowe informacje mi pomagają.

return {
    on = {
        [’timer’] = {’at sunrise’}
    },
    execute = function(domoticz)
    local Tmp = domoticz.devices(’Temp na zewnątrz’).temperature
   
    function round(num, numDecimalPlaces)
          local mult = 10^(numDecimalPlaces or 0)
          return math.floor(num * mult + 0.5) / mult
        end
   
        domoticz.notify(’Temperatura’, 'O wschodzie słońca było ’ ..round(Tmp,1), domoticz.PRIORITY_NORMAL)
    end
}

Tytułem wytłumaczenia – funkcja round() pojawiła się w nowszej wersji dzVents, ja musiałem poszukać innego rozwiązania (Łukasz Rybak – dziękuję).

W sumie przyszło mi do głowy w trakcie pisania, że dobrze byłoby rozwiązanie uczynić bogatszym o dane większej ilości czujników z domu – temperatura w kilku pokojach, status świateł, itp. Zapisuję na liście 'Do zrobienia’ 🙂

3. Jest sobie u mnie w domu ekran do projektora. Wisi (Tak przy okazji to zestaw ekran + projektor to jeden z lepszych zakupów w życiu). Stworzyłem sceny, np. 'Oglądamy film’, które wyłączają światła w salonie, włączają subwoofer, projektor i obniżają ekran. Problem z nim jednak był taki, że nie rozwijam go do końca, tylko musi się zatrzymać w konkretnej pozycji. Jak, po wydaniu komendy 'W dół’, zatrzymać go? dzVents ma funkcję stop().afterSec().

return {
    active = true,
    on = {
        devices = {
            'Ekran’
        }
    },
    execute = function(domoticz,switch)
        
        if (switch.state == 'On’) then
            switch.stop().afterSec(51)
        end
    end
}

Czyli start ręcznie w Domoticz, czekamy 51 sekund, stop. Bajka.

4. Kolejny temat – powiadomienia przy pewnych warunkach. Tutaj – zbyt wysoka temperatura sugeruje, że coś złego może się dziać w domu. Oczywiście można na każdym z osobna to 'wyklikać’, ale nie jest to zbyt optymalne.

return {
    active = true,
    on = {
        devices = {
            'Temperatura Salon’,            
            'Temperatura Kuchnia’,            
            'Temperatura Sypialnia’,        
            }
    },
    execute = function(domoticz,device)
        
        if (device.name == 'Temperatura Salon’ and device.temperature >= 45) then
            domoticz.email(’Możliwy pożar!’, 'Zbyt wysoka temperatura!’, 'adres@gmail.com’)
        end 
        if (device.name == 'Temperatura Kuchnia’ and device.temperature >= 45) then
            domoticz.email(’Możliwy pożar!’, 'Zbyt wysoka temperatura!’, 'adres@gmail.com’)
        end
        if (device.name == 'Temperatura Sypialnia’ and device.temperature >= 45) then
            domoticz.email(’Możliwy pożar!’, 'Zbyt wysoka temperatura!’, 'adres@gmail.com’)
        end        
    end
}

Dodajcie swoje warunki (np. tylko w nocy, bo wtedy na pewno nie świeci słońce na termometr) i do dzieła!

5. Jak do tej pory najciekawsza funkcja, którą zrobiłem to 'Tryb wakacyjny’. 

Nie ma się co śmiać, dopiero zaczynam 😉

Mam oto przełącznik w Domoticz, który zowie się 'Wakacje’. I pod niego powoli podpinam różne akcje. Na przykład: gdy wyjedziemy, Domoticz ma włączyć światła o losowej minucie po 22:00 (ale w zakresie 30 minut) i wyłączyć również losowo po 23:30. Taki symulator tego, że ktoś jest w domu.

local RANDOM_DELAY_MINS = 30
return {
active = true,
on = {
[’timer’] = {
’at 22:00′,
’at 23:30′
}
},
execute = function(domoticz,_,triggerInfo)

        if (domoticz.devices(’Wakacje’).state == 'On’) then

if (domoticz.devices(’Kinkiety’).state == 'Off’) and (triggerInfo.trigger == 'at 22:00′)
then 
domoticz.devices(’Kinkiety’).switchOn().withinMin(RANDOM_DELAY_MINS)
domoticz.email(’Światła włączone!’, 'Światła włączone!’, 'adres@gmail.com’)
else 
    domoticz.devices(’Kinkiety’).switchOff().withinMin(RANDOM_DELAY_MINS)
domoticz.email(’Światła wyłączone!’, 'Światła wyłączone!’, 'adres@gmail.com’)
end

end

end
}

Mam tam jeszcze kilka innych 'ifów’, ale ważny jest początek i sens funkcjonalności. Rozbudować go można dowolnie – włącz raz na górze, raz na dole, w zależności od dnia tygodnia włącz różne, itp., itd. Ogranicza Was wyobraźnia. No i czas 😀

6. Funkcja z dnia wczorajszego 😉 Powiadomienie, jeżeli drzwi są otwarte zbyt długo, a jeżeli są, to przez jaki czas. Dla drzwi na taras dałem limit 30 minut, bo są częściej i dłużej otwierane. Dla drzwi na inny taras – krótszy okres, bo praktycznie ich nie używamy. Zwróćcie uwagę na drugi warunek – jeżeli czas jest mniejszy niż 3 * limit – czyli w tym przypadku na przykład dla 'Drzwi – czujnik’ jest to 90 minut – przestań wysyłać powiadomienia, bo widocznie tak ma być. Oczywiście po zamknięciu zmienne zostaną wyzerowane.

local devicesToCheck = {
{ [’name’] = 'Drzwi – czujnik’, [’threshold’] = 30 },
{ [’name’] = 'Drzwi mały taras’, [’threshold’] = 10 },
}

return {
active = true,
    on = {
        timer = {’every 10 minutes’},
    },
    logging = {
        level = domoticz.LOG_DEBUG,
        marker = „Door”
    },    

execute = function(domoticz)
    local times = 3
for i, deviceToCheck in pairs(devicesToCheck) do
local name = deviceToCheck[’name’]
local threshold = deviceToCheck[’threshold’]
local state = domoticz.devices(name).state
local minutes = domoticz.devices(name).lastUpdate.minutesAgo

if ( state == 'Open’) then 
    if (minutes > threshold) and (minutes < 3 * threshold) then
        domoticz.notify(’Device ’ .. name .. ’ otwarte ’ .. minutes .. ’ minut.’, domoticz.PRIORITY_HIGH)
                end
end
end
end
}

Jak na razie to koniec – mam jeszcze kilka zdarzeń podpiętych, ale nie są aż tak warte opisania. Do tego kilkanaście kolejnych w głowie, które muszę sobie stworzyć.

Dzięki temu system nabiera sensowności. Bo cóż z tego, że sprawdzam temperaturę, jeżeli nic za tym nie idzie? Dopiero obudowanie Domoticz reagowaniem na czynniki zewnętrzne tworzy nam rozwiązanie godne miana 'Smart home’.

Przyjemnego kodowania życzę!

Mi Light – podłączamy, parujemy, dodajemy w Domoticz

To się chyba nigdy nie skończy 😀 Coraz więcej rozwiązań, coraz więcej możliwości!

Skoro już robiliśmy remont i sufit podwieszany – nie obejdzie się bez LEDów. A jeżeli LEDy – to nie pozwoliłbym sobie na zakup tylko takich sterowanych pilotem. Postawiłem na Mi Light. Jest to już pewnym standardem, jest kilka innych rozwiązań, jednak cena i wsparcie mnie tutaj przekonały.

Jak to u mnie – bez problemów ani rusz. Kupiłem, ze względu na ograniczenia czasowe, na 'znanym polskim serwisie’. Od razu piszę, że nie było żadnych problemów, błyskawiczna przesyłka, fachowe podejście, ale… Nie chciało działać z Domoticz.

Co się okazało? Kupiłem sterownik JEDNOSTREFOWY. Który, owszem, świetnie działa z pilotem, aplikacją Mi Light, ale NIE z Domoticz. A przecież to było celem! Damn me! Nic to – pozostały szybkie zakupy w Chinach.

Nowinka – na stronie http://cezarowy.blogspot.se/p/co-na-stanie-ma-cezar.html dodałem spis sprzętów i oprogramowania z jakiego korzystam wraz z cenami, linkami, itp. Ceny podane są na moment mojego zakupu, mogę się więc (czasem znacznie) różnić od tego co Wam się uda upolować.

Ten poniżej jest JEDNOstrefowy. Działa z pilotem (również jednokanałowym) Mi Light, aplikacją, itp. bez problemu, ale z Domoticz go nie sparujecie. Warto wiedzieć.

A ten – i owszem. CZTEROstrefowy.

I taki oto pilot do niego pasuje.

WiFi iBox w wersji 2. On z kolei jest potrzebny, aby sterować przez WiFi. Czyli aplikacją w telefonie (bajer) i przez niego możemy się dostać do Domoticz (mniam, na to czekamy).

W aplikacji Mi Light parowanie w sumie w standardowy sposób jak w innych urządzeniach:
– reset routera iBox
– z poziomu telefonu zalogowanie się do sieci urządzenia (Milight*)
– konfiguracja za pomocą AP
– podanie użytkownika/hasła do swojej sieci
– wyłączenie zasilacza LED
– teraz wymagana zręczność – włączenie i sparowanie strefy (Zone1, Zone2, etc.) do 3 sekund po włączeniu. U mnie, z nieznanych mi na razie przyczyn, sterownik sparował się tylko do strefy 2

Jeżeli uda się sterować kolorem, natężeniem, programami za pomocą aplikacji to praktycznie jesteśmy już w domu.

Z ciekawostek: do iBox’a można się zalogować przez WWW. Wystarczy podać adres, standardowo użytkownik/hasło to admin/admin. Możemy tam skonfigurować wszystkie parametry. Co prawda nie widziałem tam jakichś magicznych sztuczek, ale warto wiedzieć, że jest możliwość.

W Domoticz dodajemy Limitless/AppLamp/Mi Light with LAN/WiFi interface, podajemy IP. WAŻNE! W sieci są podane dwa porty do sterowania. W starszych wersjach był to 8899, teraz jest to 5987.

W sekcji Devices pojawią nam się wszystkie strefy, nawet jeżeli mamy zaprogramowaną tylko jedną.

Dla wyjaśnienia. Group1 do Group4 to oczywiście nasze strefy. AppLamp All to włączenie/wyłączenie wszystkich stref.

A AppLamp Bridge to inna wersja iBox’a – ona sama w sobie również świeci, dlatego możemy nią sterować.

Po dodaniu naszej strefy mamy nowy Switch:

Włączanie/wyłączanie,  wybór jasności, koloru – standardowy dla Domoticz sposób wyboru. Podobnie jak w przypadku Yeelight.

Ale dla mnie to mało. Jak zawsze. Tak jak pisałem wcześniej – we włącznikach Xiaomi wykorzystałem tylko trzy z czterech dostępnych włączników. Ostatni, czwarty, intencjonalnie został pozostawiony na pasek LED.

Dodany już jest, fizycznie nie jest podłączony pod żaden kabel, więc mogę mu dodać funkcję taką, jaka mi się podoba.

Edytujemy…

i przypisujemy akcje pod On oraz Off:

http://192.168.1.200/json.htm?type=command&param=setcolbrightnessvalue&idx=305&hex=FFFFFF

http://192.168.1.200/json.htm?type=command&param=switchlight&idx=305&switchcmd=Off

Chciałem mieć białe światło po włączeniu, dlatego wartość HEX jest równa FFFFFF. Każdy z dwójki bitów określa jaką chcecie mieć wartość RGB (Red, Green, Blue – Czerwony, Niebieski, Zielony).
W IDX oczywiście IDX urządzenia w Domoticz.
Działa! 
’Alexa, living room off’ i dobranoc!

Domoticz i zmiana domyślnych ikon (dla pewności – na przełącznikach :) )

Domoticz jaki jest każdy widzi. Działać – działa, jest dość schludny, ale na pewno nie piękny.

Można zrobić jednak kilka rzeczy, żeby wyglądał lepiej. Na przykład zmienić niektóre ikony, żeby go ożywić.

Społeczność Domoticz stworzyła pewną bazę ikon, które można zobaczyć tutaj:
https://drive.google.com/drive/folders/0B-ZLFoCiqzMRSkFaaWdHV1Qxbm8. Nie jest imponująca, znalazłem jednak kilka, które mi się spodobały.

Aktualizacja. Kolega z bloga https://raspberrywpraktyce.wordpress.com/ sugeruje również link: https://drive.google.com/drive/folders/0B4fi5h8mtKF3UVpkcXBoVFNJUkU

Jeżeli ktoś ma talent – można zrobić swoje. Powinny zawierać trzy statusy (miniatura, On, Off), mieć plik txt z nazwami i być zarchiwizowane w ZIP. Z wyżej wymienionej strony ściągamy potrzebny plik zip i postępujemy zgodnie z poniższym.

Przechodzimy do Setup -> More Options -> Custom Icons

Wskazujemy plik do załadowania, wybieramy Upload. Ikona pokaże się na liście.

Później przechodzimy do wybranego Switch’a, wciskamy Edit.

Z rozwijalnej listy wybieramy ikonę, którą chcemy użyć.

Moim zdaniem jest to pewne urozmaicenie.

Większość z niedogodności domyślnego wyglądu Domoticz została usunięta w skórce Aurora (na przykład podgląd na żywo z kamer), ale wymaga wersji Beta Domoticz, na co się osobiście na razie nie chcę zdecydować.

Kamera IP w Domoticz

Dzisiaj krótki post, prosty temat, może jednak nie dla wszystkich znany. Szczególnie końcówka.

Kamery IP w Domoticz. Prawdę mówiąc niezbyt mi się ich obsługa w Domoticz podoba. Nie można osadzić ich w żaden sposób aby stale pokazywał się obraz na żywo. Z pomocą przyszedł Dashticz, ale to inna historia.

Jednak trzeba się cieszyć z tego co jest i to wykorzystać.

Przechodzimy do Setup -> More Options -> Cameras.

I tutaj zaczyna być ciekawie. Większość kamera pozwala na dostęp przez adres IP i adres URL do obrazka/źródła obrazu. Ja korzystam z kamer D-Link, chciałem być pewien, że wszystko będzie działało bez problemu, jednak warto poszukać Waszych modeli przed zakupem na stronie http://www.ispyconnect.com/sources.aspx, gdzie są podane wszelkie możliwe modele wraz z możliwym dostępem.

Wpisujemy nazwę, adres IP, port, użytkownika, hasło (jeżeli wymagane) i koniecznie ImageURL. Mnie osobiście Test Connection nigdy nie działa, ale możecie spróbować 😉

Po dodaniu kamery obraz się jednak pokazuje, a o to nam przecież chodziło.

Czyli jest, działa. Można używając zaznaczonych ikon zrobić zdjęcie lub wybrać pokaz obrazu na żywo.

Jednak wchodzenie (szczególnie na telefonie, tablecie) cały czas na zakładkę z kamerami i sprawdzanie nie jest, delikatnie mówiąc, najbardziej komfortowe. Tutaj mi doskwiera brak jakiegoś sensownego mechanizmu to wspierania pokazywania obrazu.

Obejście, jak zwykle, jest 😉 Stworzyłem do każdej kamery Virtual Switch.

Następnie na stronie konfiguracji kamer połączyłem switch z kamerą.

Po tej operacji mam dwa przełączniki. Jeżeli kliknę w ikonę z kamerą, na ekranie pojawia się obraz z kamery. Ciągle niezbyt wygodnie, ale chociaż tyle, że mam je na moim Dashboard’zie z możliwością szybkiego dostępu.

Kolejne informacje udostępnił kolega na blogu: https://raspberrywpraktyce.wordpress.com/2018/01/26/obsluga-kamery-foscam-fi8918w-w-domoticzu/. Znajdziecie tam sposób konfiguracji powiadomień na e-mail, obsługę zdarzeń przez Blockly, etc.

Tasmota i MQTT w Domoticz

Dzień dobry. A może dobry wieczór?

W jednym z poprzednich wpisów opisałem sposób załadowania alternatywnego (albo głównego – zależy od podejścia) oprogramowania do sprzętów Sonoff. Piszę sprzętów, ponieważ ich oferta jest dość bogata i stale się powiększa. Sonoff Basic, Sonoff TH (z termometrem), Sonoff Pow (z pomiarem energii), Sonoff G1 (z miejscem na kartę SIM, dla kontaktu w miejscach bez WiFi), gniazda Sonoff S20, Sonoff Touch (naścienne włączniki zdalne), sterowane uchwyty do żarówek – 'żyć, nie umierać’, jak to mówią.

Do roboty!

Po pierwsze, jak zawsze, aktualizujmy nasz system. Ja ciągle opieram się na raspbian Jessie, w tym przypadku różnic jednak nie powinno być.

sudo apt-get update
sudo apt-get upgrade

I teraz chwila wstępu. Czym jest MQTT i czemu jest używany? Cytując Wikipedię : 'oparty o wzorzec publikacja/subskrypcja, ekstremalnie prosty, lekki protokół transmisji danych. Przeznaczony jest do transmisji dla urządzeń niewymagających dużej przepustowości. Poprzez ograniczenie prędkości transmisji, protokół zapewnia większą niezawodność. Protokół ten idealnie sprawdza się przy połączeniach maszyna-maszyna, w internecie rzeczy (IoT), w urządzeniach mobilnych, oraz tam, gdzie wymagana jest oszczędność przepustowości, oraz energii.’

Tasmota korzysta akurat z MQTT.

Czyli jest serwis, który nasłuchuje, oczekuje i wysyła pewne komunikaty. W Domoticz obsługa tego protokołu jest zaimplementowana w szczątkowy sposób, ale jest. Jeżeli chcielibyśmy z niego korzystać w większym stopniu, musimy się przygotować do przejścia na Home Assistant.

Przystępujemy do instalacji Mosquitto, najpopularniejszego brokera na Raspberry Pi.

sudo apt-get install mosquitto mosquitto-clients

W sumie tyle – już działa 🙂
Wystarczy skonfigurować użytkownika, nadać mu hasło za pomocą komendy:
sudo mosquitto_passwd -c /etc/mosquitto/passwd [username]
I możemy 'podsłuchiwać’ co się dzieje na naszym kanale.
Komenda która podsłucha wszystkie kanały to:
mosquitto_sub -h localhost -t „#” -u „username” -P „password” -v
’#’ Oznacza wszystkie w tym przypadku.
Przy okazji – ponownie podziękowania dla Macieja za pomoc przy ogarnięciu tematu.
Jak widać – komunikaty już sobie 'latają’. Obrazek trochę wyprzedza późniejszą konfigurację – bez skonfigurowania MQTT na Sonoff żaden komunikat oczywiście nie zostanie wysłany…
Skonfigurujmy Domoticz, aby obsługiwał MQTT.
Zaczynamy od Hardware, dodajemy 'MQTT Client Gateway with LAN interface’, podając tam dane brokera MQTT. Podajemy IP, port (domyślnie 1883), wcześniej założonego użytkownika i hasło. Publish Topic zostawiamy na Out.
Następnie tworzymy Virtual Switch i zapamiętujemy jego IDX.
Jak widać, Domoticz już wysyła komunikaty:
Teraz skupimy się na naszym włączniku Sonoff i wgranym sofcie Tasmota.
Wchodzimy, przez stronę, w konfigurację i wybieramy Configure MQTT.

Podajemy nasze parametry MQTT.

Następnie Configure Domoticz i w Idx 1 podajemy IDX naszego Switcha. Jeżeli macie inne wersje Sonoff (z termometrem, licznikiem zużycia energii, itp.) musicie podać Wasze IDX odpowiednich czujników w Domoticz.

Po zapisaniu od razu można użyć przełącznika w Domoticz, będzie współpracował z MQTT.
Mission accomplished!
Ku pamięci (bardziej mojej). Można stworzyć pliki konfiguracyjne, jeżeli ich potrzebujecie.
sudo nano /etc/mosquitto/conf.d/mosquitto.conf

I kopiujemy:

# Config file for mosquitto
#
# See mosquitto.conf(5) for more information.

user mosquitto
max_queued_messages 200
message_size_limit 0
allow_zero_length_clientid true
allow_duplicate_messages false

listener 1883
autosave_interval 900
autosave_on_changes false
persistence true
persistence_file mosquitto.db
allow_anonymous true
password_file /etc/mosquitto/passwd

Broadlink i Domoticz – walki ciąg dalszy

Taki wniosek na szybko – czasem nie warto oszczędzać 😉 W sumie nie żałuję zakupu pilota Broadlink RM Mini 3, ale sposób w jaki muszę podłączać go do Domoticz jest, delikatnie mówiąc, skomplikowany.

Zacznijmy od tego, że nauka kodów wszystkich pilotów nie jest tym, co tygrysy lubią najbardziej. Ja wiem, że można zamapować kilka głównych przycisków (chociaż i to działa spontanicznie), ale w sieci są kody do wielu różnych urządzeń, które można wykorzystać. Tak jest również w przypadku Broadlink, ale w aplikacji e-Control jest to zorganizowane bardzo nieporządnie. Jako że dodają je użytkownicy, to wielokrotnie mimo szczerych chęci opisy się powtarzają, nie ma żadnego standardu – trzeba celować na przykład w kilkanaście tych samych opisów w stylu 'Samsung TV’.

Powiedzmy jednak, że znaleźliśmy wzór pilota jaki chcieliśmy. W moim przypadku podstawowe funkcje działały na prawie każdym – włączenie/wyłączenie, głośniej/ciszej/wycisz.

Mamy w nich zamapowane kilkanaście przycisków. Szkoda robić to wszystko od nowa – tym bardziej, że z nieznanych mi powodów plugin Broadlink w Domoticz przestał mi odczytywać kody IR z pilotów – zawsze są tam zera. W aplikacji działa…

Jak w takim razie wyłuskać zapisane już dane? Jest możliwość. 
Po pierwsze – potrzebujemy telefonu z Androidem. iPhone sobie z plikami nie radzi, także na nim wiele w tym przypadku nie zdziałamy. Na nim instalujemy aplikację e-Control i łączymy się z naszym pilotem Broadlink. Konfigurujemy co chcemy, wyszukujemy albo robimy to sami klawisz po klawiszu.
Wchodzimy w Opcje (po lewej, na górze)
I Share
Następnie 'Share to other phones in WLAN’

I teraz zaczyna się ciekawe. Musimy znaleźć w strukturze plików (na szczęście Android przeglądarkę takowych udostępnia) folder

/broadlink/newremote/SharedData/

I stamtąd musimy pobrać trzy pliki:

jsonSubIr
jsonButton
jsonIrCode

Najważniejszy jest jsonIrCode, ale do zaimportowania w Domoticz potrzebujemy wszystkich trzech.

Poniżej opis funkcji, za pomocą których można zaimportować dane kodów IR do Domoticz.

Przycisk Webstart uruchamia serwis za pomocą którego będziemy mogli przesłać pliki z telefonu do Raspberry Pi. Możemy wtedy wpisać adres naszego Raspberry Pi w przeglądarkę na telefonie z portem 9000 (np. http://192.168.1.200:9000/import). Co ważne – serwis zakończy pracę ze względów bezpieczeństwa po 10 minutach.

Jeżeli wiemy jak to zrobić sami (np. FTP czy też Samba share), to ładujemy je do folderu /import wewnątrz folderu Broadlink. WAŻNE! NIE plików folderu pluginu, ale folderu, który podaliśmy w konfiguracji!

Generate odczyta i zapisze te pliki. Odczyta wszystko w formacie json i stworzy z nich pliki *.ini z kodami IR do poszczególnych pilotów.

I teraz zaczyna się zabawa… Ja osobiście nie chciałem mieć stu nowych przycisków w Domoticz, dlatego przeniosłem je do folderu roboczego…

…i jeden po drugim (czasem domyślając się po opisie, czasem testując samemu) ładowałem je do folderu /import i przyciskałem…

Import – przeniesie pliki z folderu Import do Broadlink i założy odpowiednie 'przyciski’ w Domoticz.

Tralalala, działa. Żeby sprawdzić jak to wszystko będzie pracowało na 'żywym organizmie’.

Stworzyłem Scenę

i dodałem:

Po kolei:
1. Zapal delikatne światła (po co ma mnie od razu oślepić…) w salonie – to akurat Xiaomi
2. Podnieś ekran – tutaj RFLink
3. Daj sygnał IR z Broadlink do projektora aby się wyłączył
4. Potwierdź – taki wymóg projektora
5. Wyłącz wzmacniacz

Scenę przez HABridge połączyłem z Alexą i można już po filmie powiedzieć 'Alexa, after movie’ i sprawdzić jak nasze sprzęty reagują. Magia!

Włączniki Xiaomi – aktualizacja po remoncie

Stało się ! Kolejny element 'smart home’ zainstalowany.

Dzięki uprzejmości i talentowi mojego drogiego teścia – Xiaomi Aqara Wall Switch w ścianie i działa!

Pierwsze testy opisałem wcześniej: http://cezarowy.blogspot.com/2018/03/sterowane-przeaczniki-od-xiaomi-w-koncu.html

Od razu na początek ważna sprawa – włączniki nie pasują do standardowych, przeważnie montowanych u nas w kraju okrągłych puszek. Musiałem kupić kwadratowe, na szczęście udało się znaleźć takie w Castoramie:

https://www.castorama.pl/produkty/instalacja/instalacje-elektryczne/systemy-i-osprzet-instalacyjny/puszki/natynkowe/puszka-podwojna-ospel-impresja-antracyt.html

Odrobinę talentu w kuciu ścian – pozdrowienia dla teścia za wykonanie pracy, podłączenie i mamy jak poniżej.

Teraz już moja praca, całkiem raczej przyjemna, na pewno czystsza. Gniazdka parujemy wybierając z aplikacji Mi Home typ gniazdka (Aqara ZigBee) i przyciskając dowolny klawisz na przynajmniej 5 sekund. Później przypisanie do pokoju, opis i możemy szaleć.

W Domoticz wystarczy włączyć rozpoznawanie nowych sprzętów na 5 minut i włączyć każdy z przycisków. Później, standardowo, przenosimy je na listę aktywnych urządzeń.

To wszystko później do HABridge i już możemy się cieszyć komunikatami w stylu 'Alexa, big lights in living room on’.

Ja sobie je jeszcze dodatkowo połączyłem w grupę, aby włączyć i wyłączyć wszystko razem.

Coś jednak z tymi gadżetami wypadałoby zrobić… Na początek zdarzenia i powiadomienia na czujnikach…

Samo czytanie danych z czujników już jest fajne.

Dobrze by jednak było jakoś tym wszystkim sterować i wykonywać pewne zadania na podstawie danych zewnętrznych, innych czujników albo przełączników.

I tym zajmę się w tym i kolejnych wpisach.

Generalnie Domoticz ma kilka możliwości notyfikacji oraz wykonywania zadań:
– bezpośrednio na samych czujnikach
– schematy blokowe w Blockly
– skrypty Lua lub Python
– dzVents

Na początek pierwszy punkt. Każdy z czujników w Domoticz ma cztery przyciski:
– Log
– Edit
– Timers
– Notifications

Nas interesują w tym momencie dwa ostatnie.

Jak widać, jeżeli 'pod nimi’ jest cokolwiek stworzone, zapisane – kolor się zmienia. Znaczy to ni mniej ni więcej niż to, że gdzieś tam jest skrypt lub akcja, która ma zostać wywołana.

Tak w sumie to była jedna z pierwszych rzeczy jakie zrobiłem. Nawet nie w Domoticz, jeszcze wcześniej w małym systemie Pilight. Miałem wtedy podłączone na breadboard tani nadajnik i odbiornik, gniazdka 433MHz zakupione w Biedronce i byłem zafascynowany tym, że mogę je zdalnie włączyć z poziomu Raspberry Pi. Jak tak patrzę, to wiele się przez te dwa lata zmieniło.

Ok, dość sentymentalnych wspomnień. Cel – włączyć światła przed domem godzinę po zachodzie słońca i wyłączyć zawsze o 22. I jeszcze do tego dostać powiadomienie na e-mail.

W polu Type możemy wybrać sposób 'wyzwalania’ zdarzenia. Przed/po wschodzie/zachodzie słońca, o konkretnej godzinie, w dniach parzystych/nieparzystych, miesięcznie (na przykład zawsze 3 dnia, albo w drugi wtorek miesiąca, itp.) oraz rocznie (na podobnych zasadach).

Ja wybrałem:
– włącz 1 godzinę po zachodzie słońca w każdy dzień tygodnia (można ustawić na przykład dni pracujące, weekend, albo wybrane konkretne dni)
– wyłącz zawsze o 22

No, to mamy za sobą. W lecie był czas, kiedy światła włączały się o 21:57 i gasły o 22 😉

Teraz powiadomienia e-mail. Przede wszystkim trzeba skonfigurować adres.

Setup -> Email jest odpowiednim miejscem na zrobienie tego.

Podajemy adres wyjściowy (z parametrami serwera pocztowego) oraz docelowy.

Gdy już to mamy za sobą – dalej proste ustawienie 'wyzwalacza’ zdarzenia. Jeżeli przełącznik przejdzie w stan On, mam otrzymać e-mail z konkretną wiadomością.

Jak poniżej:

Dobra, skoro to już mamy, kolejny temat.

Mamy sobie odkurzacz Roomba. Świetny, rewelacyjny patent, który od razu zaczął być używany u nas w domu codziennie. Jednak drażni mnie w nim jedna rzecz – zasilasz 'strzela’ co pewien czas. Nie lubię tego, denerwuje mnie to. Oczywiście rozumiem, że Roomba musi być jakoś ładowana, ale (mimo, że teoretycznie powinien) nie chcę aby zasilacz był włączony cały czas.

Tutaj pomocne było automatyczne wyłączenie przełącznika po zadanym czasie (Off Delay). Czyli – jeżeli kiedykolwiek zostanie włączony, uruchamia się timer, który wyłączy go po skończeniu odliczania. Wyłączenie i ponowne włączenie resetuje licznik.

Ok, kolejny temat z głowy.

Co by tu wymyślić…

O, na przykład temperatura. Jeżeli wzrośnie w którymś z pokojów – może warto o tym dostać informację i (jeżeli macie, ja akurat niestety nie) – włączyć klimatyzator. Albo dostać po prostu powiadomienie na e-mail.

Nic prostszego: przycisk Notifications na czujniku temperatury, później kilka kliknięć, gotowe.

Dobra. Ale skąd teraz pewność, że nie będę dostawał tych powiadomień co minutę? Przecież temperatura może taka być przez kilka godzin.

Aaaaa, na to też mamy radę: Setup -> Settings -> zakładka Notifications.

Na końcu strony mamy Notification Intervals. I dla czujników ja osobiście mam ustawione 12 godzin. Switches – natychmiastowo.

Czyli – co 12 godzin, jeżeli nie nastąpiła zmiana statusu, dostaję powiadomienia.

To samo zastosowałem w przypadku Xiaomi MiFlora.

Jeżeli wilgotność w doniczce jest mniejsza niż 50% – e-mail.

Można sobie w ten sposób zapewnić powiadamianie w przypadku otwarcia drzwi, przekroczenia zużycia energii, pogorszenia jakości powietrza (i docelowo włączenia oczyszczacza), przekroczenia ilości czasu spędzonego przy konsoli przez dziecko, włączenia jakichś urządzeń, itp., itd.

W kolejnym wpisie – proste Blockly i przejdziemy do dzVents.

Do zobaczenia. Albo 'do poczytania’.

Wracam do remontu… Co też spłodzi kilka wpisów!

Gniazdko Sonoff S20 i Tasmota – na dzień dobry rozwiązanie problemu

Blogowanie ma wiele plusów. Raz, że można przelać własne myśli na 'papier’, a dwa – poznaje się fajnych i ambitnych ludzi. I jedna taka osoba (Maciej – Ty wiesz ;)) zmotywowała mnie do wypróbowania innego softu do ESP8266, który jest wykorzystywany w urządzeniach firmy Sonoff. Czy to Sonoff Basic, czy też Sonoff S20. Wcześniej opierałem się głównie na na ESPEasy, teraz Maciej zasugerował Tasmota. To będzie również przyczynkiem do skonfigurowania i zapoznania się z MQTT, który – było nie było – jest standardem w IoT.
UWAGA. Jak się sam na swojej skórze przekonałem – są różne gniazdka dedykowane na Europę. W Polsce trzeba wybrać typ https://www.worldstandards.eu/electricity/plugs-and-sockets/e/. Ja, żeby było zabawniej i niezbyt prosto – kupiłem oczywiście wersję F – czyli wtyczka nie pasuje do gniazdek z bolcem. Cóż… Człowiek się czasem uczy na własnych błędach…

Gniazdko jakie jest – każdy widzi. Tutaj wielkich różnic nie ma w stosunku do gniazdek na RF lub Xiaomi. No, Xiaomi jest mniejsze, ale wymaga przejściówki.

UWAGA 2! Dużo ważniejsza niż poprzednio. Gniazdko pracuje na 230 Volt. Czyli, przy nieodpowiedniej pracy można zginąć albo spalić na ten przykład mieszkanie. Zalecam daleko idącą ostrożność, obserwowanie działania i zachowania – czy zbytnio się nie grzeje, czy nie ma przebić, źle dokręconych lub dolutowanych kabli.

Po rozkręceniu, w lewym dolnym rogu, widać cztery otwory. Teoretycznie wypadałoby tam wlutować piny. Ale akurat w przypadku tego gniazdka nie ma takiej potrzeby. Przy odrobinie sprytu można przeprogramować układ samemu.

Najnowsza wersja Tasmota zawsze pod adresem: https://github.com/arendst/Sonoff-Tasmota/releases. Pobieramy i przygotowujemy się do programowania. Ja napisałem krótki skrypt, wykorzystałem esptool z ESPEasy. Jest nawet polska wersja Tasmota (wtedy musicie zmienić nazwę z sonoff.bin na Waszą, albo odwrotnie ;)).

Połączenia pinów to (w Sonoff S20 liczę od żółtego elementu. Wstyd się przyznać, ale nie wiem co to…):
RXI -> 2
TX0 -> 3
VCC -> 4
GND -> 1

Czyli jakby 'odwrotnie’ do tego co jest w Sonoff Basic.

I teraz wymagana odrobina zręczności pawiana. Prawą ręką przytrzymujemy kable oraz wciskamy przycisk. Po podłączeniu programatora to on wprowadzi ESP w tryb programowania. Gdy zaświeci się niebieskie światło – możemy puścić przycisk. Moje kable działają nawet jeżeli ich nie trzymam…

Uruchamiamy nasz przygotowany skrypt. Programowanie przebiega identycznie jak w przypadku ESPEasy.
I teraz kolejny problem. Wgrałem. Drżącymi ręcami włożyłem do przedłużacza. No, jak już znalazłem taki bez bolca…
I nic. Zamrugał na zielono i tyle. Standardowego Access Pointa ani widu, ani słychu. Tyle, że wiedziałem, że dobrze wgrałem, ponieważ przycisk działał, a to znaczyło, że Tasmota od razu zamapowała sobie GPIO. Ogromny plus. Dla przypomnienia, w ESPEasy i Sonoff Basic – musieliśmy pisać kod w Rules, aby obsłużyć GPIO. Tutaj zasada jest taka sama – w przypadku ESPEasy musielibyśmy tak zrobić. Tasmota obsługuje ten przypadek 'od strzału’.
’Spaliłem WiFi’ – pomyślałem. 
Dla pewności wgrałem znane mi już ESPEasy. Żadnej sieci ESP, jakiej wersji bym nie wgrywał.
’Cóż, wejdzie w koszty nauki. Ładnie świeci, to chociaż tyle’.
Wzmiankowany tutaj Maciej zasugerował mi coś innego – 'Wbijaj do niego przez COM’a i ustaw sieć WiFi ręcznie. Może się uda’. Podał mi następujący sposób:
– instalujemy Termite (Putty nie podołał – ekran przy tych samych parametrach był 'rozjechany’)
– wprowadzamy nasz port COM (u mnie jak widać COM8) i prędkość
– łączymy się z Sonoff
– na samym dole jest pasek z możliwością wpisania komendy
– SSId <WaszeIDSieciBezprzewodowej>, Enter
– Password <WaszeHasłoDoSieciBezprzewodowej>, Enter

ZA DZIA ŁA ŁO! Podłączył się do sieci od razu, włączenie przełącznika również zadziałało. Dobrze posłuchać mądrego.

Na dzisiaj tyle. Dłuższy opis Tasmota w kolejnym wpisie. I przy okazji na pewno MQTT aby dostać się do Domoticz.