Jak się okazuje, w podstawowym zakresie Z-Wave jest prosty i względnie tani. Nie trzeba sterownika za 1.5k PLN, wystarczy Raspbberry Pi (189,- w Botland) + RaZberry (229,- na Allegro), kilka minut zabawy (dosłownie: “kilka minut”, “zabawy”) i wszystko działa.
Ja sam protokół Z-Wave wykorzystuję głównie do komunikacji z termostatami Danfoss Connect Z, do pozostałych zastosowań będę używał albo Domoticza (trochę mi się gryzie z Z-Way, nie szukałem na razie jak to obejść), albo własnego softu (na razie raczej celuje we własny, ale jak mi się uda wszystko dobrze pożenić to może i Domoticz też zostanie :) ).
Ogólnie, trochę jestem w szoku jak łatwo i sprawnie dało się to uruchomić. Pomijając to że ja zawsze coś muszę zrobić po swojemu, to całość sprowadza się do:
To tyle. Po takich opercjach (doskonale opisanych krok po kroku na podlinkowanych stronach) mamy sprawnie działający kontroler Z-Wave, umożliwiający pewną automatyzację niektórych rzeczy w domu. Ja po podanych krokach (tylko lekko zmodyfikowanych, jak wspomniałem, ja muszę po swojemu - np. część softu sam sobie napisałem ;) ) mam w tej chwili:
Dla mnie rewelacja.
Nie znaczy że to koniec pracy nad systemem… Soft dostarczany do RaZberry (Z-Way) nie ma pełni wymaganaych przeze mnie możliwości, ale z tym się liczyłem i idę na to z nastawieniem że sobie sam napiszę. Do tego docelowo dojdzie do tego sterowanie światłem w domu i kilka podobnych.
Oczywiście moje przygody z ESP8266 (1, 2, 3, 4) są z tym ściśle powiązane :)
No dobra, wydawało mi się że już koniec z prototypowaniem, ale dotarły do mnie jeszcze dwie słabości tego co wymyśliłem:
Czyli jeszcze co nieco zmian mnie czeka. A już chciałem się brać za wymyślanie jaką to powinno mieć obudowę ;)
Na dzień dzisiajszy mam zbudowany podstawowy soft na serwerze, który zaczął już zbierać dane z wersji prototypowej. Soft obsługuje wiele czujników, dowolny z nich można przypisać do dowolnego pomieszczenia etc. Takie tam :)
Etap prototypowania chyba za mną… Rozwiązałem chyba dzisiaj ostatnie problemy (wspominałem o nich w części drugiej) - okazało się że nie ogarnąłem jednej rzeczy. Podłączyłem do układu jeszcze jeden sensor (natężenia dźwięku). Sensor działa też na 5V, więc podłączyłem go do prądu przed LM1117, wyjście do ESP8266, i śmiga. Czasem. Trochę. No. Raz się całość zrestartuje, raz zawiesi, raz wywali tablicę partycji na kontrolerze albo inne śmieci. Ale w międzyczasie działa ;)
Rzecz w tym, że sensor działa w logice 5V, a ESP8266 za bardzo się po 5V nie dogaduje ;) Dodany dzielnik napięcia, i teraz jest już lepiej (no, zobaczymy jak dłużej pochodzi ;) ).
W międzyczasie natknąłem się też na jeszcze jeden problem: miałem na kontrolerze zapuszczone w pętli spradzanie pomiarów i wysyłanie ich na serwer. W logach sobie sprawdzałem połączenia - na razie nic z tymi danymi nie robię, ot sprawdzam w access-logu czy działa i co mi wysyła. No i wysyłał mi grzecznie 14x dane, a później zwis. Czasem godzina, czasem kilka, i nagle znów wysyła (od początku - wysyłałem sobie także licznik pętli). I tak 14x ;)
Domyślałem się że coś z pamięcią - ale czemu randomowo się restartuje? o_O Brak pomysłu… Podpiąłem się dziś z “komputrem”, zrestartowałem układ, zaczęło się wysyłać. Wysłało 14x, i komunikat: ENOMEM. No dobra, czyli dobrze się domyślałem ;) Ale czemu restart co jedną do pięciu godzin? Tego nie ogarnąłem. Same zwisy do ogarnięcia dość prosto: i tak ma mi to działać na akumulatorach, więc bez deepsleep nie podchodź ;) Wywaliłem pętelkę, dodałem sprawdzanie na zdalnym hoście czy ma przerwać pętlę (żeby móc się dostać do kontrolera na żądanie - inaczej po serialu się w ogóle nie dopchac, trzeba by czyścić pamięć kontrolera), i jeśli nie - wchodzi w deepsleep na jakiś czas. Tutaj jeszcze zagwozdka na którą się natknąłem: trzeba połączyć piny 16 z RESET na ESP8266, bez tego nie da się go wybudzić.
W tej chwili wygląda na to że działa bez problemu, sprawdzę jutro ;)
Dziś był kolejny ciąg zabaw z ESP8266. Najpierw podłączyłem do niego, poprzez I2C (och,na jednej parze pinów kilka czujników, mniam ;) ), czujnik BMP180 (czyli czujnik ciśnienia atmosferycznego). Czujnik działa od strzału, biblioteka https://github.com/micropython-IMU/micropython-bmp180 również działa od strzału, jest OK. Trzeba tylko pamiętać że BMP180 domyślnie zwraca wartość w pascalach, a ja chciałem hPa (czyli do wynik trzeba podzielić przez 100).
Później próbowałem powalczyć ze wskazaniami czujnika ruchu (PIR). Tutaj poszło gorzej… nie udało mi się go jeszcze zmusić do sensownych wskazań. W czasie walki znalazłem info że ten czujnik działa najlepiej z napięciem bliskim 5V, a ja cały układ mam na razie na 3.3V. No dobra - przestawiłem zasilanie na 5V, podpięłem zasilanie do układu poprzez LM1117, uruchomiłem - nie udało się zbootować, zaczęło się w kółko restartować. No dobra, zapomniałem filtrować wejście i wyjście z LM1117 - dwa kondensatory, zgodnie z notą katalogową: 10µF, 100nF. Boot: znów się restartuje. Zacząłem się zastanawiać: skoro kondensatory są, to może całość za dużo prądu pobiera? Zajrzałem do noty katalogowej ESP8266, ale to w najgorszym momencie pobiera 200mA, a LM1117 ma wydajność około 800mA, więc to nie to.
Ale spróbowałem jednak odpiąć jeden z czujników (padło na DHT22), i całość wstała… wot, ciekawostka. Spróbowałem uruchomić pomiar - wywaliło się, bo nie znalazło czujnika DHT22 ;) Poprawiłem skrypt żeby się nie wykładał, spróbowałem uploadu - restart o_O Że co? Trochę się pobawiłem, pokombinowałem, okazało się że albo mam walnięte kondesatory, albo coś mocniej szumi - dałem mocniejsze kondesatory (33µF, 470nF) koło LM1117 i problemy z zasilaniem się skończyły. Wgrywam znów poprawiony skrypt - OSError 28 (no space left on device). Że co? Okazało się że chyba przez te restarty prawie całą dostępną przestrzeń zapisały pliki których nazwy zaczęły się składać z samych zer binarnych, których nie dało się usunąć ani nic z tym zrobić :( Trzeba było przeflashować układ. Z tym że po flashu nic się nie zmieniło… Że co? ;) OK, kolejny krok do zapamiętania: przed flashem najpierw wyczyść całość (komenda do esptool.py
: erase_flash
), znów flash - tym razem było dużo lepiej, moje pliki zniknęły, ale te z zerami binarnymi też. Uf :)
Wgrałem od nowa swoje pliki (w trakcie wcześniejszych zabaw zmieniłem zasilanie do wersji 3.3V bez LM1117, teraz podpiąłem całość znów na 5V + LM1117), i całość śmiga już ładnie na zasilaniu 5V + LM1117 -> 3.3V dla ESP8266, a czujnik PIR ma swoje 5V.
Zajęło to nieco czasu, i PIR ciągle nie wskazuje mi tak jakbym chciał, ale czegoś nowego się nauczyłem: nie ufaj notom katalogowym - lub chińskim kondensatorom :P
Kupiłem niedawno ESP-12E, próbowałem je zaprogramować/skomunikować się z nim, ale miałem tylko programator USB-ASP, którego mi się do współpracy z ESP-12E nie udało zmusić. Zakupiłem zatem inny programator: USB to UART, i z nim już poszło lepiej. Oczywiście - nie bez problemów :)
Próbowałem wielu kombinacji okablowania i komunikacji. U mnie zadziałało dopiero wersja opisana na hackaday.com
Podłączenie w ten sposób spowodowało że komputer grzecznie zaczął się komunikować z ESP-12E, to był pierwszy sukces :)
Najpierw próbowałem gadać z ESP-12E z użyciem Arduino. Za którymś razem się udało, trzeba było ustawić baud-rate na 74880 - w życiu bym sam nie wpadł na taką wartość ;) Albo 9600, albo 115200 - z niczym innym jeszcze się nie spotkałem (albo nie pamiętam :P ). Jak już zadziałała komunikacja po serialu, przyszedł czas na…
Próbowałem robić to z użyciem esptool.py, ale się nie udało… dopiero użycie ESPlorera mi pomogło. Jak już ESPlorer wrzucił mi jakieś pliki (z błędami - nie wrzucał znaków nowej lini!), to udało mi się zmusić także esptool do współpracy. Wtedy już było dość łatwo: wrzucenie MicroPythona, wrzucenie swoich skryptów etc. No i nauka różnic między normalnym Pythonem a tym w wersji Micro ;)
Wyczyszczenie bieżącego ROMu:
esptool.py -p /dev/tty.usbserial-A700JTUU -b 460800 erase_flash
Wrzucenie nowego ROMu:
esptool.py -p /dev/tty.usbserial-A700JTUU -b 460800 write_flash 0x00000 ~/Downloads/esp8266-20161110-v1.8.6.bin --flash_size=detect —verify
W tej chwili mam działając ESP-12E które mi potrafi zaczytać temperaturę, wilgotność, jasność i sprawdzić ruch (tu jeszcze trochę muszę poeksperymentować, jakieś przekłamania są), oraz wszystko to wrzucić na zdalny serwer.
Ogólnie, trzeba koniecznie zwrócić uwagę na następujące problemy:
Dzisiaj dowiedziałem się, że:
Puszczenie na Arduino Pro Mini 5V napięcia 18V przez kilka sekund nie powoduje że APM5V zjara się doszczętnie. Poszedł mały dymek, ale całość działa OK :)
Przetwornica step-down
po puszczeniu dużego napięcia (18V) na wyjściu przepuszcza je “nieruszone” (ciągle 18V) na wejście.
Podłączenie przetwornicy prawidłowo powoduje że APM5V działa lepiej (a na pewno dłużej). Szkoda że uwaliłem w ten sposób jedno APM5V :P Ale dobrze, że kupując w pakietach od przyjaciół zza wody kosztuje takowe tylko 8zł, mniej boli ;)
Jakiś czas temu kupiłem sobie Arduino. Generalnie dla zabawy :)
Na celowniku mam chwilowo lampki nocne włączane zarówno włącznikiem zwykłym jak i przez stronę. Po co? Bo mogę ;)
Elektroniki od czasu technikum za dużo nie ruszałem, i ogólnie mam strasznie mało czasu na takie zabawy, ale co jakiś czas udaje mi się cokolwiek wydziergać. Dziś trzy kroki: 1. zlutować poprawnie goldpiny do Arduino Pro Mini 2. podłączyć Arduino Pro Mini poprzez USBASP i zaprogramować 3. skorzystać z przekaźnika do włączenia diody ;)
Udać się udało, Arduino sterowało przekaźnikiem, który załączał LED korzystając z zewnętrznego źródła prądu.
Cztery następne kroki jakie na mnie czekają:
I have many domains handled by one nginx instance. Some are just hosted (serves only index.html
), some are redirects to other domains, other are password protected or just serves simple api (there is no webroot) and only a two or three are with some concrete, public content.
When Let’s Encrypt service started, for every of my domains (redirects, password protected and placeholders too) I created secured versions (https://
) and set for most of my domains redirects from plain http
to https
version.
Everything is fine, but every domain which we want to be secured with Let’s Encrypt is verified by sending request to our domain, and letsencrypt tool place some file for verification purposes in webroot of every of our domains. What about redirects, domains protected with password or this without webroot?
I created one folder in some location (ie. /home/letsencrypt
) and set proper permissions for it - nginx
must have permissions to read from it. Now, for every domain which has to be accesible via https
, there is entry in it’s server section:
location /.well-known/ {
root /home/letsencrypt;
}
Yes, there is just one directory for all of our domains and servers.
Now, just restart nginx and run:
letsencrypt renew --webroot -w /home/letsencrypt
:)
UPDATE: Fixed paths and renew command.
Some time ago I started using ProtonMail. OK, I didn’t start, I tried to start. But hard to use this when address book is empty :/
So, we need to export contacts from Gmail, and import in ProtonMail. Help in PM says that we need to export it in Outlook format, and then import it. Do not listen them - it will break non-ascii letters in your contacts. Export contacts as .vcf (Apple Mail) from Gmail, and then import them to the PM - your UTF-8 characters are saved ;)
Second problem is you can’t have contacts without email address :( Bad idea, this can be useful only if you use your address book for sending emails, but you can’t save any contact for other purposes.
There are also some minor bugs related to address book and importing, but I reported them, and I hope they fix them soon :)
In Ubuntu (I don’t know how in other distros) there is very old version of supervisord in repo. This version has few very annoying bugs, and I can’t live with them ;)
So, below is easy path to upgrade supervisord from system one to newest version in few simple steps:
Stop service:
service supervisor stop
Backup current configuration:
mkdir ~/supervisor
cp -r /etc/supervisor ~/etc-supervisor
cp /etc/default/supervisor ~/supervisor/etc-default-supervisor
cp /etc/init.d/supervisor ~/supervisor/etc-init.d-supervisor
Remove current installation:
apt-get purge supervisor
rm -fr /etc/supervisor
Install new supervisor:
pip install supervisor
Restore configs:
cp ~/supervisor/etc-default-supervisor /etc/default/supervisor
cp ~/supervisor/etc-init.d-supervisor /etc/init.d/supervisor
cp -r ~/etc-supervisor /etc/supervisor
ln -s /etc/supervisor/supervisor.conf /etc/supervisor.conf
Start new supervisor:
service supervisor start
Verify:
supervisorctl
Set to run at startup:
update-rc.d supervisor defaults