Wstępniak
Od ponad 3 miesięcy żyliśmy w remoncie. Większość tego czasu również towarzyszyły nam jakieś choroby (czego tam mały z przedszkola nie przyniósł). No i nadszedł ten weekend – koniec remontu!
Dodam, że ja od samego początku trzymałem się nieźle – w zasadzie w ogóle nie chorowałem. Owszem – byłem już cholernie zmęczony kurzem, syfem, pyłem, łomotem, przenoszeniem mebli itd – ale żyłem tym dniem, gdy to wszystko się skończy.
Ta sobota zaczęła się inaczej. W zasadzie nie mogłem wstać z łóżka. Czułem się jakby mnie walec rozjechał. Nie byłem tak chory od kilku albo i kilkunastu lat. Yeahhhh…. Samej soboty nie pamiętam wiele – podobnie noc z soboty na niedzielę nie wyglądała najlepiej. I nadeszła niedziela. Temperatura nadal, ale walec ze mnie zjechał. Nie chciało mi się cholernie wstawać z łóżka, ale nieszczęśliwie – coś nie teges z internetem. A, że “serwerownia” znajduje się w piwnicy – musiałem się tam wybrać. Nie, żebym był szczęśliwy, ale wiecie – są pewne priorytety, a internet jest na początku tej listy.
Coś się dzieje…
Podejrzewałem, że klasycznie powiesił się router Neostrady – mimo, że dopiero co wymieniany (bo stary wieszał się ciągle). Jako, że nie mogłem się dobić do jego interfejsu tak też musiałem tam iść i załatwić to osobiście (ale już niedługo – namierzyłem tanie listwy zasilające IP – zobaczymy co wtedy powie).
Gdy już moja szanowne cztery litery zeszły do Mordoru, pierwsze co usłyszałem to “kap,kap,kap”. Cóż – “*urwa, *urwa, *urwa” pomyślałem. W trakcie remontu wymieniliśmy (co nie było w planie) wszystkie kaloryfery i sporo hydrauliki. Raz już się to zdarzyło po tej wymianie – a teraz znowu:
Na zdjęciu powyżej tego nie widać, ale piec ma miernik ciśnienia wody – akurat wskazywał max pozycję (pow. 4 atmosfer) – pewnie było więcej, bo po prostu się skala skończyła. Woda zaczęła kapać, bo po prostu uszczelka puściła. Szczęście, że uszczelka, a nie jakaś złączka gdzieś w ścianie. Notabene gdy się to wcześniej stało to pod piecem nie było wiadra a sanki małego – plastikowe. Zebrały sporo wody wtedy ;)
Simple visual monitoring
Konstrukcja niestety nie pozwala tutaj spuścić wody z obiegu – trzeba to zrobić gdzieś indziej (na górze – w mieszkaniu – bezpośrednio z jednego z kaloryferów). A to jest problem, bo nie można spuścić jej zbyt wiele – bo wtedy się zapowietrzą kaloryfery, trzeba dolewać od nowa itd. Nie myśląc zbyt wiele pobiegłem po netbooka (Toshiba NB500) i ustawiłem go na starym foteliku małego – na przeciw pieca:
Ten netbook ma kamerkę, więc w tej chwili mógłbym po prostu połączyć się z nim via Skype. Ale to mało koszerne, bo Skype ma swoje widzimisie i zdarzało mi się, że traciłem z nim połączenie. Stąd też pomysł, aby postawić serwer kamery internetowej – na netbooku mam Fedorę 17, więc: yum install motion
I sprawa załatwiona (no prawie – nie było internetu, więc reset routera, potem jeszcze Wireshark w ruch bo to pudło się kompletnie zresetowało i po kilku chwilach już było ok). Teraz jeszcze tylko go uruchomić (service motion start), wyszukać netstatem, na którym porcie nasłuchuje i przepuścić go przez iptables (8081) i obraz gotowy. Rozłożyłem więc zestaw do spuszczania wody na górze, odpaliłem laptopa, połączyłem się z kamerką i rozpocząłem procedurę awaryjną ;)
No dobra. W ten sposób spuściłem trochę wody do wiadra i ciśnienie wróciło z powrotem do normy. Poprawiłem siłę dokręcenia kurka wody w piecu i trzymałem kciuki. Niestety po godzinie sprawa znów się pogorszyła – zarówno ciśnienie wody skoczyło do góry jak i moja temperatura.
Co tam – nie takie sytuacje się załatwiało – padały replikacje baz danych, równocześnie poole memcache’a, odpieraliśmy ataki DDos, dyski przestawały działać, ginęły backupy, wybuchały (!!!) serwerownie – i niby ciśnienie wody w piecu ma mnie pokonać? :D
DEFCON 1 – Black Ops response
Problem – rozpoznanie:
- ciśnienie wody w obiegu szwankuje, gdy osiąga granicę 3-4 atmosfer uszczelka zaczyna puszczać wodę. Cholera wie przy jakim ciśnienie woda rozsadzi coś innego niż uszczelkę w piecu
- jest niedziela – zapomnij o hydrauliku czy serwisie pieca
- zapomnij o jakichkolwiek zakupach – jesteś chory, więc radź sobie z tym co masz w domu
Możliwości:
- zakręcić dopływ wody do pieca – jednak to odetnie nas w domu od ciepłej wody w kranie. niekoszerne…
- mając już zorganizowane stanowisko spuszczania wody można tą akcję powtórzyć kilka razy i sprawdzić czy może lekkie dokręcenie głównego zaworu w dopływie wody nie rozwiąże go – może mniejsze ciśnienie wejściowe da nam trochę czasu?
Automatyzujemy proces monitoringu
Niestety nie znalazłem nigdzie na CPANie czy php.necie biblioteki “jpg2pressure”, więc z palca nie udało mi się rozwiązać problemu. Rozpocząłem więc research. Po kilku minutach doszedłem do wniosku, że rozpoznawanie pozycji strzałki nie jest dobrą drogą, bo można by z tego napisać doktorat. Dużo łatwiej jest porównywać obrazy. Do tego można spokojnie skorzystać z biblioteki ImageMagick. Znalazłem tam funkcję porównywania – pozostaje się w niej zdoktoryzować: http://www.imagemagick.org/Usage/compare/
Checklista:
- Kamera internetowa musi być ustawiona stabilnie. Fotelik małego nie działa dobrze, znaleźć inne rozwiązanie
- Kamera internetowa generuje 2 obrazy na sekundę a do tego obciąża netbooka bardzo mocno (LAVG w okolicach 1, czyli max). Wystarczy nam jedno zdjęcie co minutę.
- Potrzebuję trzech zdjęć – dla poziomu “alert” (2 atmosfery, dla poziomu “warning” (1,5 atmosfery) oraz dla poziomu “OK” (lekko poniżej 1 atmosfery).
- Potrzebny jest automat, który będzie przycinał zdjęcia tak aby było widać tylko aktywne pole, po którym wędruje strzałka. Dzięki temu porównanie będzie dużo łatwiejsze.
- Potrzebny jest patent do porównywania tych obrazów (to już raczej załatwione – ImageMagick oraz compare)
- Na koniec wpinamy to w domowego Nagiosa i SMSy :)
ad1. Kamera internetowa musi być ustawiona stabilnie. Fotelik małego nie działa dobrze, znaleźć inne rozwiązanie.
ad2. Kamera internetowa generuje 2 obrazy na sekundę a do tego obciąża netbooka bardzo mocno (LAVG w okolicach 1, czyli max). Wystarczy nam jedno zdjęcie co minutę.
width 640height 480framerate 2minimum_frame_time 60quality 100picture_type jpeg
ad3. Potrzebuję trzech zdjęć – dla poziomu “alert” (2 atmosfery, dla poziomu “warning” (1,5 atmosfery) oraz dla poziomu “OK” (lekko poniżej 1 atmosfery).
ad4. Potrzebny jest automat, który będzie przycinał zdjęcia tak aby było widać tylko aktywne pole, po którym wędruje strzałka. Dzięki temu porównanie będzie dużo łatwiejsze.
/usr/bin/convert -crop 110×50+60+250 alert.jpg alert.jpg
ad5. Potrzebny jest patent do porównywania tych obrazów
for i in
ls imgs/*jpg
; do /usr/bin/compare -metric mae probe.jpg $i null: 2>>data_out.csv; done
cut -d . -f 1 data_out.csv > data_out2.csv

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#!/bin/bash BASEDIR=/root/pressure_monitoring rm -rf $BASEDIR/data_*csv $BASEDIR/imgs/* # let's move images from camera dir to our tmp dir: mv /var/motion/*jpg $BASEDIR/imgs/ # we are interested only in checking 1 file - when this script is executed every N seconds (where N == frequency of image-generation by camera) then this is not a problem. Finally I'm running this script in crontab every 60 seconds, but this is not an issue as there's no way the pressure could rise so quick to warning or alarm level (and if so - then I'm really fucked... PROBE=`ls $BASEDIR/imgs | tail -1` WGET=/usr/bin/wget mv $BASEDIR/imgs/$PROBE $BASEDIR/probe.jpg # converting to proper size: /usr/bin/convert -crop 110x50+60+250 $BASEDIR/probe.jpg $BASEDIR/probe.jpg # let's compare probe.jpg to level templates: for i in $BASEDIR/alert.jpg $BASEDIR/warning.jpg $BASEDIR/ok.jpg; do /usr/bin/compare -metric mae $BASEDIR/probe.jpg $i null: 2>>$BASEDIR/data_out.csv; done cut -d . -f 1 $BASEDIR/data_out.csv > $BASEDIR/data_out2.csv cut -d ' ' -f 1 $BASEDIR/data_out2.csv > $BASEDIR/data_out.csv ALERT_LEV=`head -1 $BASEDIR/data_out.csv` WARNING_LEV=`head -2 $BASEDIR/data_out.csv | tail -1` OK_LEV=`tail -1 $BASEDIR/data_out.csv` if [ "$ALERT_LEV" -le "1800" -a "$ALERT_LEV" -le "$OK_LEV" ]; then MSG="PRESSURE is about 2ba! Comparison level: $ALERT_LEV ($WARNING_LEV/$OK_LEV)" echo $MSG | mail -s "PRESSURE ALERT" docent.net@gmail.com echo `date +"%Y-%m-%d %H:%M:%S"` $MSG >> /var/log/pressure.log MSG_SMS=$(perl -MURI::Escape -e 'print uri_escape($ARGV[0]);' "$MSG") $WGET "https://somewhere_in_the_space.pl?message=$MSG_SMS" -O /dev/null cp $BASEDIR/probe.jpg "$BASEDIR/alert_imgs/`date +\"%Y-%m-%d %H-%M-%S\"`.jpg" elif [ "$WARNING_LEV" -le "1800" -a "$WARNING_LEV" -le "$OK_LEV" ]; then MSG="PRESSURE is about 1.5ba! Comparison level: $WARNING_LEV ($ALERT_LEV/$OK_LEV)" echo `date +"%Y-%m-%d %H:%M:%S"` $MSG >> /var/log/pressure.log cp $BASEDIR/probe.jpg "$BASEDIR/alert_imgs/`date +\"%Y-%m-%d %H-%M-%S\"`.jpg" # echo "$MSG" | mail -s "PRESSURE WARNING" [email protected] # MSG_SMS=$(perl -MURI::Escape -e 'print uri_escape($ARGV[0]);' "$MSG") # $WGET "https://somewhere_in_the_space.pl?message=$MSG_SMS" -O /dev/null elif [ "$OK_LEV" -le "1800" ]; then MSG="PRESSURE is ok :) Comparison levels (ALERT/WARNING/OK): $ALERT_LEV/$WARNING_LEV/$OK_LEV" echo `date +"%Y-%m-%d %H:%M:%S"` $MSG >> /var/log/pressure.log # echo "$MSG" | mail -s "PRESSURE info" [email protected] # MSG_SMS=$(perl -MURI::Escape -e 'print uri_escape($ARGV[0]);' "$MSG") # $WGET "https://somewhere_in_the_space.pl?message=$MSG_SMS" -O /dev/null fi if [ "$ALERT_LEV" -ge "1800" -a "$WARNING_LEV" -ge "1800" -a "$OK_LEV" -ge "1800" ]; then MSG="PRESSURE level is UNKNOWN! Comparison levels (ALERT/WARNING/OK): $ALERT_LEV/$WARNING_LEV/$OK_LEV" echo `date +"%Y-%m-%d %H:%M:%S"` $MSG >> /var/log/pressure.log cp $BASEDIR/probe.jpg "$BASEDIR/alert_imgs/`date +\"%Y-%m-%d %H-%M-%S\"`.jpg" # echo "$MSG" | mail -s "PRESSURE UNKNOWN" [email protected] # MSG_SMS=$(perl -MURI::Escape -e 'print uri_escape($ARGV[0]);' "$MSG") # $WGET "https://somewhere_in_the_space.pl?message=$MSG_SMS" -O /dev/null fi |
ad5. Na koniec wpinamy to w domowego Nagiosa i SMSy :)
Kończ waść…
Tak jak teraz na to patrzę z perspektywy czasu… chyba na prawdę byłem chory :) Ale co by tu nie mówić – to zadziałało :) Dostałem 3 SMSy z alertami, za każdym razem spuszczałem delikatnie wodę i dokręcałem główny zawór delikatnie aż sytuacja się unormowała. Nikogo nie wzywałem już – w wakacje i tak piec wymieniam, więc zabawa się zacznie od początku.
Teraz już patent zlikwidowałem, jednak do serwera, który siedzi w piwnicy mam zamiar podpiąć kamerkę USB – tak na wszelki wypadek :) A nowy piec mam nadzieję, że będzie miał już jakiś ludzki interfejs tak, aby to monitorować po ludzku a nie metodą chałupniczą.
Co mogę powiedzieć na koniec – OpenSource rządzi :)
Aaaa.. macie na koniec zdjęcie głównego zaworu wody: