>> wybierz styl >> es :: ns :: bs

Weblog Tomasza Przechlewskiego [Zdjęcie T. Przechlewskiego] [[Ikona]]


scrum
random image [Photo gallery]
Zestawienie tagów
1-wire | 18b20 | 1wire | 2140 | 3rz | alsamixer | amazon | anniversary | antypis | apache | api | arm | astronomy | asus | atom.xml | awk | aws | balcerowicz | balta | bash | berlin | bibtex | bieszczady | biznes | blogger | blogging | blosxom | borne-sulinowo | breugel | bt747 | canon | cedewu | chello | chown | chujowetaśmy | cmentarz | contour | cron | css | csv | curl | d54250wykh | debian | dejavu | dhcp | dht22 | dia | docbook | dom | ds18b20 | dyndns | dynia | ebay | economy | ekonomia | elka | elm | emacs | emacs23 | english | ess | eu | excel | exif | exiftool | f11 | fc | fc11 | fc15 | fc5 | fc8 | fedora | fedora21 | ffmpeg | finepix | firefox | flickr | fontforge | fontspec | fonty | fop | foto | france | francja | fripp | fuczki | fuji | fuse | gammu | garmin | gawk | gdynia | geo | georgia | gft | git | github | gmail | gnokii | gnus | google | googlecl | googleearth | googlemaps | gphoto | gphoto2 | gps | gpsbabel | gpsphoto | gpx | gpx-viewer | greasemonkey | gruzja | grzyby | haldaemon | handbrake | historia | history | hitler | holocaust | holokaust | hpmini | humour | iblue747 | ical | iiyama | ikea | imap | inkscape | inne | internet | j10i2 | javascript | jhead | k800i | kamera | kml | kmobiletools | knuth | kod | kolibki | komorowski | konwersja | krutynia | kuchnia | latex | latex2rtf | latex3 | lcd | legend | lenny | lesund | lewactwo | liberation | linux | lisp | lisrel | litwa | logika | lwp | mapsource | marvell | math | mathjax | mazury | mbank | mediolan | mencoder | mh17 | michalak | microsoft | monitor | mp4box | mplayer | ms | msc | msw | mtkbabel | muzyka | mymaps | mysql | nanopi | natbib | navin | neo | neopi | netbook | niemcy | niemieckie zbrodnie | nikon | nowazelandia | nuc | nxml | oauth | oauth2 | obituary | okular | olympus | ooffice | ooxml | opera | otf | otftotfm | other | overclocking | panoramio | pdf | pdfpages | pdftex | pdftk | perl | photo | photography | picasa | picasaweb | pim | pine | pit | plotly | pls | plugin | po | politics | polityka | polsat | postęp | powerpoint | prelink | problem | propaganda | pstoedit | putin | python | r | radio | random | raspberry pi | relaxng | router | rower | rowery | rpi | rsync | rtf | ruby | rugby | russia | rwc | rwc2007 | rwc2011 | rzym | samba | sem | sheevaplug | sienkiewicz | signature | sks | skype | skytraq | smoleńsk | srtm | ssl | statistics | stats | statystyka | stix | svg | svn | swornegacie | szwajcaria | terrorism | tex | texgyre | texlive | thunderbird | tomato | tourism | tramp | trang | truetype | ttf | turystyka | tusk | tv | tv5monde | twitter | typetools | ubuntu | udev | umap | unix | upc | updmap | ups | utf8 | varia | video | vienna | virb edit | vostro | wammu | wdc | wdfs | webcam | webdav | wh2080 | wiedeń | wikicommons | wilno | windows | windows8 | wine | wioślarstwo | word | wordpress | wrt54gl | wtyczka | ww2 | www | wybory | wybory2015 | włochy | xemex | xetex | xft | xhtml | xine | xml | xmllint | xsd | xslt | xvidtune | youtube | yum | zakopane | zakupy | zdf | łeba | świdnica
Pobrania via google: [[Ikona]]
Archiwum
Inne blogi
N. Walsh | Morten H. Frederiksen | B. Clementson | prawo.vagla.pl | F. Hecker | M. Olson | J. Tennison | J. Clark | M. Nottingham | M. Shuttleworth | T. Isakowicz-Zalewski | J. Anglim | José A. Ortega Ruiz Modern Perl
Inne tematyczne
Ashwin Amanna | wiesia.nets.pl | Wojt | rwm.org.pl | DataBlog | Revolutions | Learning R | A. Gelman | C. Nel | J. Vogelgesang | ubl.xml.org/ | J.D. Long |
O stronie
wykorzystywany jest blosxom plus następujące wtyczki: tagging, flatarchives, rss10, lastbuilddatexhtmlmime. Niektóre musiałem dopasować nieco do swoich potrzeb. Więcej o blosxom jest tutaj
Subskrypcja
RSS 1.0
Wysyłanie maila z raspberry Pi/Sheevaplug przez gmail

Dla nieuświadomionych Sheevaplug to taki dziadek RaspberryPi. Kiedy jeszcze nie sprzedawali Rpi kupiłem Sheevaplug i używam do dzisiaj. Na obu komputerach jest zainstalowany Debian, ale w różnych wersjach.

Listy mam wysyłać skryptem Perla więc rozpoczynam od zainstalowania stosowego modułu Net::SMTP::TLS:

sudo apt-cache search TLS | grep perl
libnet-smtp-tls-butmaintained-perl - Perl module for providing SMTP... 
libnet-smtp-tls-perl - Perl SMTP client library supporting TLS and AUTH
libwww-curl-perl - Perl bindings to libcurl

sudo apt-get install libnet-smtp-tls-perl

W Debianie działającym na Sheevaplug (Debian Lenny) nie ma gotowego pakietu więc instaluję co trzeba za pomocą cpan:

cpan install Net::SMTP::TLS

Skrypt do wysyłania listu (mail-snd.pl):

#!/usr/bin/perl
# http://dipinkrishna.com/blog/2010/12/sending-emails-gmail-smtp-perl/
use Net::SMTP::TLS;

my $smtp = new Net::SMTP::TLS(
        'smtp.gmail.com',
        Port    =>      587,
        User    =>      'USER1@gmail.com',
        Password=>      '??PASSWORD??',
        Timeout =>      30
        );
 
#  -- Enter email FROM below.   --
$smtp->mail('USER1@gmail.com');
 
#  -- Enter recipient mails addresses below --
my @recipients = ('USER2@gmail.com');
$smtp->recipient(@recipients);
 
$smtp->data();
 
#This part creates the SMTP headers you see
$smtp->datasend("To: USER2\@gmail.com\n");
$smtp->datasend("From: USER1\@gmail.com\n");
$smtp->datasend("Content-Type: text/html \n");
$smtp->datasend("Subject: A Test Mail");
# line break to separate headers from message body
$smtp->datasend("\n");
$smtp->datasend("This is a test mail body");
$smtp->datasend("\n");
$smtp->dataend();
 
$smtp->quit;

W Sheevaplug działa i wysyła, a Raspberry Pi nie:

invalid SSL_version specified at /usr/share/perl5/IO/Socket/SSL.pm line 332

Żeby było śmieszniej w Debianie Lenny z Sheevaplug jest jakaś bardzo stara wersja IO::Socket:SSL:

## sprawdź numer wersji modułu
cpan -D IO::Socket::SSL
Installed: 1.16

A na Raspberry Pi znacznie nowsza (ale nie działa):

cpan -D IO::Socket::SSL
Installed: 1.76
CPAN:      1.994  Not up to date

Aktualizuję

sudo cpan
cpan> install  IO::Socket:SSL

Ale to nie pomaga:

invalid SSL_version specified at /usr/local/share/perl/5.14.2/IO/Socket/SSL.pm

Rozwiązanie jest podane tutaj. Należy:

## w pliku SSL.pm
sudo nano usr/share/perl5/IO/Socket/SSL.pm
## zmienić
m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))$}i
## na
m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))}i

Zamiast rzeźbienia w Perlu można zainstalować gotowe rozwiązanie pn. sendemail:

apt-get install sendemail

List wysyłamy w następujący sposób:

sendEmail -f USER1@gmail.com -t USER2@other.com \
     -u "Title1" -m "this is a test message" \
     -s smtp.gmail.com \
     -o tls=yes \
     -xu USER1 -xp '??PASSWORD??'

url | Sat, 12/07/2014 20:20 | tagi: , ,
Great uptime of pinkaccordions.homelinux.org server

My tiny SheevaPlug ARM-based server has reached 366 days of uptime today. Proof included.

SheevaPlug is a sort of Raspberry Pi. One of the first such computers on the market, killed by Rpi a few years ago.

url | Sun, 29/06/2014 13:50 | tagi: , ,
3rd anniversary of pinkaccordions.homelinux.org

Three years from now pinkaccordions.homelinux.org was created. It runs for 3 years on sheevaplug Arm-based server running Debian installed on SDHC 8Gb card (details here).

url | Sun, 19/05/2013 20:05 | tagi: , , ,
1000 days online for pinkaccordions.homelinux.org

Today is the 1000th day that pinkaccordions.homelinux.org at sheevaplug is online.

During that period the only problem experienced was Sheevaplug's PSU breakdown.

Cf. Kopia zapasowa karty SDHC, rsync i problemy and Konfigurowanie Apacha (in Polish)

url | Wed, 13/02/2013 07:52 | tagi: , ,
Running old Debian on a new Plug computer

Although Sheevaplug has appeared to be not particularly reliable piece of hardware (this claim is based on personal experience and numerous reports of other users), it is a great fun as well, so I gave it next (the last one) chance and have bought another new plug to replace the broken one.

I planned to use SDHC card with Debian which worked seamessly with my previous plug computer, so I follow the procedure described below.

Connect PC to Sheevaplug with USB-miniUSB cable

Turn on the plug computer.

Run cu:

cu -s 115200 -l /dev/ttyUSB0

press any key. In response to boot loader prompt type:

Marvel>> version
U-Boot 1.1.4 (Dec 27 2009 - 22:03:21) Marvell version: 3.4.27

The u-boot boot loader have to be upgraded before installing Debian (cf. http://www.cyrius.com/debian/kirkwood/sheevaplug/uboot-upgrade.html).

Copy the U-Boot binary u-boot.kwb to a USB stick formated with the FAT filesystem.

Plug the USB stick into a plug computer, connect the serial console and type the following commands:

usb start
fatload usb 0:1 0x0800000 u-boot.kwb
nand erase 0x0 0x60000
nand write 0x0800000 0x0 0x60000

Regardless of how U-Boot was installed, one have to restart the machine to load the new version of U-Boot:

reset

Boot the system (cf. http://www.cyrius.com/debian/kirkwood/sheevaplug/unpack.html).

Configure the boot loader now. First of all, one has to change a setting so the device will boot the kernel which is used by Debian:

setenv mainlineLinux yes
setenv arcNumber 2097
saveenv
reset

Restart the device so the changes will take effect. Now configure the machine to boot:

setenv bootargs_console console=ttyS0,115200
setenv bootargs_root 'root=/dev/mmcblk0p2'
setenv bootcmd_mmc 'mmc init; ext2load mmc 0:1 0x00800000 /uImage; ext2load mmc 0:1 0x01100000 /uInitrd'
setenv bootcmd 'setenv bootargs $(bootargs_console) $(bootargs_root); run bootcmd_mmc; bootm 0x00800000 0x01100000'
saveenv

At this point SheevaPlug is ready to boot Debian automatically from SD card. So, I inserted my SDHC card with Debian 5.0 installed some 2 years ago and tried to connect via ssh.

ssh -l <user> 192.168.1.88

Linux neptune.pinkaccordions.org 2.6.30-5-kirkwood #1 Wed Jan 12 15:27:07 UTC 2011 armv5tel

System is up and running so it seems reusing SDHC card with old Debian installation was sucessfull, but shortly I discovered there were problems...

System clock is terribly fast and there are problems communicating with USB port. Upon consulting google I have discovered kernel upgrade is recommended (cf. http://www.cyrius.com/debian/kirkwood/sheevaplug/boot.html and http://www.cyrius.com/journal/debian/kirkwood/sheevaplug/):

apt-get update
apt-get dist-upgrade
flash-kernel     

First command generated lots of 404 errors because Lenny is not supported anymore (I was not aware of that). I decided not to upgrade to Lenny and fixed /etc/apt/sources.list instead (cf. http://superuser.com/questions/404806/did-debian-lenny-repositories-vanish):

deb http://archive.debian.org/debian/ lenny main non-free contrib
deb-src http://archive.debian.org/debian/ lenny main non-free contrib
# Volatile:
deb http://archive.debian.org/debian-volatile lenny/volatile main contrib non-free
deb-src http://archive.debian.org/debian-volatile lenny/volatile main contrib non-free
# Backports:
deb http://archive.debian.org/debian-backports lenny-backports main contrib non-free
# Previously announced security updates:
deb http://archive.debian.org/debian-security lenny/updates main

Then, apt-get dist-upgrade and flash-kernel was completed without errors.

After reboot, system works fine. I plan to upgrade it to Squeeze in the nearest future.

The moral from the story is: with God's and Google help one has not to be an expert to cope with running Linux.

url | Tue, 07/08/2012 16:57 | tagi: , , , , ,
My sheevaplug seems to be broken

Żarło, żarło i zdechło -- odpowiedział chłop na pytanie czemu krowa nie żyje...

Sheevaplug mi padła znienacka doszedłszy do 240 dni uptime'u. Diody w większości się świecą, ale po podłączeniu kablem USB nic się nie dzieje (nie ma /dev/ttyUSB0 ani żadnego innego /dev/tty*) , wzw. z tym nie można się skomunikować z urządzeniem.

url | Tue, 17/07/2012 17:23 | tagi:
Sheevaplug half anniversary

My tiny server running on Debian/SDHC card/Sheevaplug has reached 183 days of uptime today.

url | Thu, 17/05/2012 08:36 | tagi: , ,
Niepotrzebne mlocate

Dziś wpisując df przeraziłem się widząc, że pozostało mi 17% wolnej przestrzeni na pinkaccordions.homelinux.org (8Gb karta SDHC) bo do niedawna było to ca. 70%. Szukając winnego znalazłem ponad 3Gb plik w katalogu /var/lib/mlocate, który powstał (i powiększał się) ponieważ lekkomyślnie zamontowałem katalog ,,/'' z dugiej szewy poprzez fusermount. Z kolei ta druga szewa ma podłączony 2 Tb dysk (który nie jest przez nią indeksowany dzięki dodaniu czego trzeba do /etc/updatedb.conf).

W pierwszej chwili chciałem zablokować indeksowanie podmontowanego katalogu. Po chwili namysłu zdecydowałem się na bardziej radykalne wywalenie mlocate:

apt-get remove mlocate && rm -rf /var/lib/mlocate/*

Alternatywnie można dodać do /etc/updatedb.conf

vim  /etc/updatedb.conf
# PRUNEPATHS to, które _nie będą_ indeksowane, dodaję /<ssfhs-katalog> żeby
# nie był indeksowany katalog zamontowany via fusermount
# PRUNEPATHS="/tmp /var/spool /<ssfhs-katalog>"

Ale po co mi w ogóle indeksowanie systemu plików na serwerze? Niepotrzebne... A im mniej zapisów tym -- podobno -- karta dłużej wytrzyma.

Przy okazji problemów z szewą: mój sposób synchronizacji czasu nie działa na jednej szewie jeżeli przy starcie systemu ntp nie połączył się z serwerem czasu... Poprawiłem czas (z pomocą kol. Rafiego):

# /etc/init.d/ntp stop 
* Stopping NTP server ntpd [ OK ] 
# ntpdate ntp.ubuntu.com
# /etc/init.d/ntp start

url | Thu, 23/06/2011 17:49 | tagi: , , , ,
Rocznica pinkaccordions.homelinux.org

Minął rok odkąd zarejestrowałem w www.dyndns.com adres pinkaccordions.homelinux.org (dokładnie pierwszy wpis w access.log ma datę 23 maja 2010 r.). Działa doskonale....

Przy okazji: dzisiaj przeniosłem anemometr z płotu na dach bloku. Prędkości wiatru od razu wzrosły...

url | Wed, 25/05/2011 19:56 | tagi: , , , ,
Weather station

The unit I have bought is Termometerfabriken Viking 02049--a clone of Fine Offset Electronics WS 2080 which in turn is a newer version of the well known WS 1080/1090 models. This weather station measures wind speed and direction, outside temperature and humidity, inside temperature and humidity, rainfall and barometric pressure. It is equipped with 4 outside sensors namely: a thermo-hygrometer (THS), a wind direction sensor, a wind speed sensor, and a rain gauge. Only the temperature and humidity sensor is equipped with radio transmitter unit, so wind & rainfall sensors are connected to THS with telephone cables.

I have decided not to follow mounting as described in the manual. I put THS inside my wooden Stevenson screen which I have built some time ago and which I consider much better than the plastic ersatz included with the station. A rainfall sensor is mounted nearby. A real problem is the wind sensors. I plan to buy 30 m extension cable (original cable is only 2,5 m long) and mount the sensor at the roof of my flat. Complicated, but there are no other viable alternatives :-)

The software included is of no use to me as well. Fortunately there are free alternatives: wview and pywws. I have started with the first one not being aware of pywws existence.

Wview installs w/o problems in Lenny:

apt-get install wview

but fails to work:

/etc/init.d/wview start
/etc/init.d/wview: line 57:  1934 Illegal instruction     $WVIEWD_BIN
htmlgend[1936]: &1302287846673> : system init failed!
wvalarmd[1937]: &1302287846719> : wviewd process is not running - aborting!
wvcwopd[1938]: &1302287846764> : wviewd process not running - aborting!
wvhttpd[1939]: &1302287846807> : wviewd process no running - aborting!
wviewftpd[1940]: &1302287846850> : wview daemon lock file /var/lib/wview/wviewd.pid does not exist - aborting!
wviewsshd[1941]: &1302287846896> : wviewd process not running - aborting!
wvpmond[1942]: &1302287846942> : wviewd process not running - aborting!

Looking via Google how to proceed I have found nothing except the impression that wview is not finely maintained nor top quality software. Fortunately I have discovered pywws which installs and works flawlessly.

Useful links: Personal Weather Station using BifferBoardpywwsWatson W8681 Wireless Weather Station ReviewPersonal Weather Station.

Example pages generated with pywws: www.jump.me.ukwww.lauritsnielsen.dkmy page.

url | Fri, 08/04/2011 20:53 | tagi: , , ,
WDC MyBook Essential USB 3.0 i problem z kompatybilnością

Wymieniłem dysk zewnętrzny WDC MyBook 500 Mb na model WDC MyBook Essential 2 Tb (kod producenta: WDBACW0020HBK). Ten model ma już USB w wersji 3.0, które rzekomo jest 100% kompatybilne z 2.0.

Okazało się, że nie do końca. Dysk jest widziany w systemie (Debian Lenny na Sheevaplug) jak podpinam dziada przez przedłużkę z kabla USB 2.0. Jak łączę bezpośrednio grubaśnym kablem USB 3.0, to kicha.

Taka sobie ciekawostka...

url | Thu, 17/02/2011 18:48 | tagi: , , ,
Przestał działać youtube-dl

Pythonowy skrypy youtube-dl przestał działać pyszcząc: ERROR: unable to download video (format may not be available). Trzeba ściągnąć nową wersję:

http://rg3.github.com/youtube-dl/download.html

Z zapisków wynika, że kiedyś zainstalowałem go aptem, więc może pomógłby jakiś update. Ale to następnym razem. Teraz już nie będę próbował, bo zainstalowałem youtube-dl ręcznie.

url | Wed, 16/02/2011 19:48 | tagi: , ,
Wadliwy zasilacz w Sheevaplug
SheevaPlug PSU
PSU starego typu (zepsute)

Popsuł się zasilacz w Sheevaplug co objawiało się tym, że po włączeniu migała tylko żółta dioda i dioda przy porcie RJ45 (także na żółto). Na szczęście problem był mi znany ponieważ jest masa doniesień i żalów co do jakości zasilacza aka PSU (power supply unit). Przykładowo tutaj:

Mine is flickering green and also ethernet port. No blue light. Do you think I have the same problem? Please let me know...

No więc zepsuł się 28. stycznia, tj. w piątek wieczorem. Od razu zamówiłem replacement psu, które wysłane 31. stycznia doszło w piątek... Nawiasem mówiąc dziś (sobota 5. lutego) na stronie jest napis Pre-Order now, due in late February -- musiałem kupić ostatni. Widać mocno schodzący towar:-) i warto mieć zapas ale o tym później...

Teoretycznie zmiana jest prosta, ale po rozkręceniu nie byłem tego już taki pewien. Obudowa tego komputera jest z plastiku a PSU i gniazdo zasilania wsadzone na zicher pomiędzy obudowę a wewnętrzne zaczepy (cf. tutaj). Bojąc się połamania obudowy poszedłem do fachowca (Piotr Strzelczyk) i to był dobry ruch. Zwłaszcza wsadzenie z powrotem gniazda zasilania było trudne.

Szewę kupiłem w październiku 2009 co oznacza, że popsuła się po 15 miesiącach. Not bad -- innym psuje się już po kilku... Mam jeszcze drugą szewę więc dobrze by było mieć zapasowy zasilacz pod ręką na wypadek braków w magazynie. Zamierzam zatem wypróbować procedurę reklamacji opisaną tutaj:

We can of course supply these under your warranty, but first we need to have your failed PSU returned to us (this is a stipulation from Globalscale, we have had to buy the PSU's and will get refunded for the failed PSU's we return to them), before we can send out the replacement. The charge for sending out the replacement PSU will be based on your location:

UK Customers -- GPB 2.50 [and] EU Customers -- GBP 5.00

If you feel you are not confident to do this replacement you can of course send the unit to us for us to carry out the replacement, there will however be a charge for returning the unit to you, this will again be based on your location:

UK Customers -- GBP 7.00 [and] EU Customers -- GBP 10.00

Nawet już napisałem do mr. Jasona, ale mnie olał... No cóż będziemy namolni.

Wygląda na to, że wadliwy PSU Sheevaplug to tzw. pikuś przy problemach z GuruPlug, reklamowanym jako następca Sheevaplug, który się nadmiernie grzeje. Niektórzy wprawdzie twierdzą, że nie ale problem chyba jest skoro producent [w desperacji] wyposażył GuruPlug w wiatrak, który:

makes a sound resembling that of a hair dryer...

Innym przypomina to odkurzacz (They are ridiculously noisy, similar to a high powered vacuum cleaner) Anyway, sprawa wygląda kiepsko. Kiedyś chciałem kupić GP, ale teraz już nie chcę...

Potencjalnym rozwiązaniem może być zewnętrzny zasilacz. Przykładowo tutaj jest opisane takie rozwiązanie. Jak się nowy [podobno lepszy] zepsuje, to może też się zdecyduję na zewnętrzny...

Dopisane 19 lutego 2011: Problem jest wałkowany in extenso w tym wątku na forum plugcomputer.org

url | Sat, 05/02/2011 09:40 | tagi: , , ,
Dodanie paru rzeczy do Sheeva #2

Doinstalowałem kilka rzeczy, które mam na Szewie #1 (Ubuntu pamięć NAND) a do tej pory nie było ich na Szewie #2 (Debian na karcie), mianowicie: 1) esniper, 2) digitemp/pomiar temperatury, 3) różne moje skrypty Perla, 4) program youtube-upload.py.

#1. Kompilowanie esnipera wymaga doinstalowania curla:

apt-get install curl
apt-get install curlftpfs

Skrypt ./configure dalej kończy się błędem, zatem:

## http://www.linuxquestions.org/questions/linux-newbie-8/libcurl-and-curl-config-problems-453166/
apt-get install libcurl3-dev libwww-curl-perl python2.4-pycurl

Teraz działa i można skompilować esnipera.

#2. Przełączyłem kabel od termometrów ze starej Szewy na nową. Oprócz zainstalowania digitemp należało dodać do katalogu /etc/udev/rules.d/, plik np. 85-ttyusb.rules, zawierający:

# relax the permissions just for ttyUSB0
KERNEL=="ttyUSB0",              MODE="0666"

bo inaczej zwykły user nie ma dostępu do /dev/ttyUSB0. Teraz należy ponownie wyjąć/włożyć kabel USB. Ponieważ do tworzenia wykresu temperatury używam biblioteki perl-GD trzeba także dociągnąć:

apt-get install libgd-graph-perl

#3. Różne moje skrypty Perla (flickr/ebay) instalują ręcznie w katalogu:

/usr/local/share/perl/

Wreszcie instalują paczkę python-gdata na potrzeby skryptu youtube-upload.py do wysyłania moich filmików na YTube poprzez API:

wget http://gdata-python-client.googlecode.com/files/gdata-2.0.11.final.tar.gz

Powyższe zabiegi mają/miały na celu unifikację tego co jest na jednym i drugim komputerku... Mówiąc konkretnie chciałem żeby zamiast Ubuntu na Szewie #1 też była karta z Debianem. Ale, ale w trakcie naszły mnie wątpliwości: w sumie na cholerę? kupować jeszcze jedną kartę... Jak się pamięć zużyje to się będę martwił. A ponieważ katalogi, które nie są prawie-że-wyłącznie czytane przeniosłem poza pamięć NAND (tj. /home//var/) więc może aż tak szybko to nie nastąpi....

url | Mon, 06/09/2010 15:32 | tagi: , ,
Konfigurowanie Apacha

Rozpoczynam od założenia w serwisie dyndns.org konta. Potem przechodzę do My ServicesHost services, wybieram nazwę hosta (w moim przypadku pinkaccordions) i domeny (homelinux.org). Typ usługi: Host with IP address. Resztę pól można zostawić niewypełnione. Darmowe konto pozwala na przydzielenie 5 adresów...

Sheevaplug
Tomato: DynDNS

SDHC
Tomato: port forwarding

Teraz w menu Tomato klikam w Basic→DDNS. Jako service wybieram DynDNS -- static, Username/Password to dane z rejestracji w serwisie DynDNS, hostname to z kolei wybrana przez nas nazwa hosta, tj. w moim przypadku pinkaccordions.homelinux.org. Więcej niczego nie trzeba wpisywać wystarczą dane domyślne. Można ustawić w ten sposób dwa adresy... Por też notatki tutaj.

Pozostaje wreszcie uruchamienie usługi port forwarding na routerze z działającym Tomato. Jest to bardzo proste i sprowadza się do wypełnienia pól Proto, Ext Ports, Int Address oraz opcjonalnie Description (por. ekran obok).

Instalacja serwera apache oraz php w systemie Debian Lenny.

apt-get install apache2  apache2-mpm-prefork apache2-utils apache2.2-common 
apt-get install php5 libapache2-mod-php5 php5-common php5-curl
apt-get install php5-dev php5-gd  php5-imagick php5-mcrypt php5-memcache php5-mhash \
    php5-mysql php5-pspell php5-snmp php5-sqlite php5-xmlrpc php5-xsl

W pliku /etc/apache2/ports.conf umieszczam komentarz przed dyrektywą NameVirtualHost:

#NameVirtualHost *:80

Zaś powyższą dyrektywę umieszczam w /etc/apache2/httpd.conf.

Konfiguracja wirtualnego hosta; plik /etc/apache2/sites-available/pinkaccordions powstaje przez skopiowanie pliku domyślnego:

cd /etc/apache2/sites-available/ ; cp default pinkaccordions

Następnie plik modyfikuję dopisując ServerName i ServerAlias


<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        ServerName pinkaccordions.homelinux.org
        ServerAlias pinkaccordions.homelinux.org

        DocumentRoot /var/www_pinkaccordions/
   <!-- dalej w zasadzie niezmienione -->
</VirtualHost>

Teraz:

cd /etc/apache2/sites-enabled && ln -s ../sites-available/pinkaccordions pinkaccordions

To samo dla drugiego i ewentualnie kolejnych hostów. Innych plików za wyjątkiem opisanych wyżej httpd.conf, ports.conf oraz plików z katalogu ./sites-available/ i linków z katalogu ./sites-enabled/ nie ruszam. Teraz

/etc/init.d/apache2 restart
# albo apache2ctl graceful

No i powinno działać...

Dopisane 15 września 2010: Aby logrotate nie usuwał najstarszego przechowywanego pliku modyfikuję /etc/logrotate.d/apache2 i dodając stosowane prerotate...endscript:

sharedscripts
prerotate
  if [ -f "/path2logs/access.log.52.gz" ] ; then  
     cp /path2logs/access.log.52.gz /path2archive/access.`date +%Y%m%d`.log.gz ; fi
  if [ -f "/path2logs/access.fabians.log.52.gz" ] ; then
     cp /path2logs/access.log.52.gz /path2logs/access.`date +%Y%m%d`.log.gz ; fi
endscript

Teraz (mam nadzieję), plik access.log.52.gz przed skasowaniem zostanie skopiowany w inne miejsce i ocaleje. Pewnie można by prościej, przykładowo brutalnie wpisując po prostu rotate 156.

url | Thu, 27/05/2010 21:04 | tagi: , , , , , ,
Rekursywne przeglądanie wszystkich plików

Na potrzeby dostosowana adresów URL do innej konfiguracji innego serwera wykorzystałem następujący skrypt:

#!/usr/bin/perl -w
use strict;
undef $/; ## na potrzeby czytania każdego pliku (process_file)

sub recurse($) {
  my($path) = @_;

  ## append a trailing / if it's not there
  $path .= '/' if($path !~ /\/$/);
  ## print the directory being searched
  print STDERR $path,"\n";

  ## loop through the files contained in the directory
  for my $eachFile (glob($path.'*')) {

    ## if the file is a directory
    if( -d $eachFile) {
      ## pass the directory to the routine ( recursion )
      recurse($eachFile);
    } else {

      ## przetwarzaj plik
      process_file ($eachFile);
    }
  }
}

sub process_file {
 my $file = shift;
 ## Tylko pliki .html i .php
 if ($file =~ /\.html|\.php$/) {
     my $tmp_file = "$file.temp";
     rename($file, $tmp_file);

     open (F, $tmp_file); open (FO, ">$file");
     my $ff = <F>;

     ## zamień bezwględne URLe na lepsze
     $ff =~ s/href=(["'])http:\/\/gnu.univ.gda.pl\/~tomasz/href=$1/g; ## zamień
     $ff =~ s/src=(["'])http:\/\/gnu.univ.gda.pl\/~tomasz/src=$1/g; ## zamień

     print STDERR "-> $file\n";
     print FO $ff;
     close(F); 
     close (FO);
 }
}

## initial call ... $ARGV[0] is the first command line argument
recurse($ARGV[0]);

Wymieniając procedurę process_file można oczywiście ww. skrypt zaadaptować do innych zadań, np. poprawienia zepsutej daty modyfikacji plików:-)

url | Thu, 27/05/2010 13:50 | tagi: , ,
Kopia zapasowa karty SDHC, rsync i problemy

Uruchomiłem na Szewie #2 serwer WWW, dostępny pod adresem pinkaccordions.homelinux.org (darmowa domena z serwisu dyndys.com -- w moim przypadku konieczność, bo mam tzw. zmienne IP). Jak już jest serwer, to trzeba robić -- w sposób systematyczny, a nie ad hoc -- kopie zapasowe na wypadek gdyby, np. karta padła (co podobno nie jest takie rzadkie...). Po konsultacji z tym co w tym temacie proponują inni postanowiłem robić to za pomocą rsynca, uruchamianego z zewnętrznego komputera.

Sheevaplug
SheevaPlug

SDHC
Pamięć zewnętrzna + kopia

W tym celu trzeba zainstalować rsync na obu komputerach źródłowym i tym, na którym będzie tworzona kopia:

apt-get install rsync

Teraz należy skonfigurować rsync po stronie źródła (czyli tego komputera, z którego mają być kopiowane dane) modyfikując /etc/rsyncd.conf. Zawartość pliku /etc/rsyncd.conf w moim przypadku wygląda następująco:

## http://encodable.com/tech/blog/2005/10/13/Secure_Remote_Backups_via_rsync
uid = 0
gid = 0
hosts allow = *****
transfer logging = no
read only = yes

[wholefs]
path = /
comment whole root fs

[pinkaccordions]
path = /var/www_pinkaccordions/
comment pinkaccordions www

Można sprawdzić czy działa (neptune jest zadeklarowany w /etc/hosts):

rsync neptune::wholefs/ 

Tworzenie kopii realizuje skrypt rsync_neptune.sh uruchamiany po stronie przeznaczenia:

#!/bin/bash
SOURCE=neptune::wholefs/
EXCLUDE=/root/.rsync/backup_exclude.lst
DESTDIR=/backup/neptune/rootfs

echo "=== Syncing ${SOURCE} at `date` ==="
rsync -av --exclude-from=${EXCLUDE} --delete ${SOURCE} ${DESTDIR}

Plik $EXCLUDE zawiera te katalogi, które nie powinny -- z oczywistych względów -- być kopiowane (zawartości katalogów /proc, /sys oraz /tmp):

## Exclude
- /proc/*
- /sys/*
- /tmp/*

Skrypt rsync_neptune.sh jest zaś uruchamiany poprzez crona:

0 4 * * 7 /root/bin/rsync_neptune.sh >> /root/logs/RSync/RSync.log 2>&1

Idea jest taka: kopia całego rootfs z karty SDHC ma być wykonywana na dysk USB raz w tygodniu (z innego komputera, konkretnie Szewy #1). W razie potrzeby (awarii karty SDHC) kopia ta może być szybko przeniesiona na inną kartę SDHC... Można też kopiować bezpośrednio na kartę SDHC wsadzoną na zicher w czytnik kart, ale nie widzę sensu podłączania czytnika wyłącznie i tylko po to, żeby w razie awarii, mieć kopię karty od razu a nie po 3 minutach.

Zatem:

#!/bin/bash
EXCLUDE=/root/.rsync/backup_exclude.lst
SOURCE=/public/sheeva/backup/neptune/rootfs/
DESTDIR=/media/sd_backup

# http://www.cyberciti.biz/tips/shell-root-user-check-script.html
# Make sure only root can run our script
if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root" 1>&2 ; exit 1
fi

## sprawdz czy karta jest w czytniku i jest zamontowana
if [ -d "$DESTDIR" ]  ; then 
    echo "** OK: $DESTDIR!"
else
    echo "** ERROR: $DESTDIR not mounted!"; exit 1;
fi

rsync -av --exclude-from=${EXCLUDE} --delete ${SOURCE} ${DESTDIR}

No i tu porażka:

rsync: readlink_stat("/media/sd_backup/etc/shadow") failed: Input/output error (5)
rsync: readlink_stat("/media/sd_backup/etc/resolv.conf") failed: Input/output error (5)
rsync: recv_generator: failed to stat "/media/sd_backup/etc/resolv.conf": Input/output error (5)
rsync: recv_generator: failed to stat "/media/sd_backup/etc/shadow": Input/output error (5)
rsync: recv_generator: failed to stat "/media/sd_backup/etc/network/run/ifstate": Input/output error (5)
rsync: recv_generator: failed to stat "/media/sd_backup/var/lib/urandom/random-seed": Input/output error (5)
rsync: recv_generator: failed to stat "/media/sd_backup/var/log/lastlog": Input/output error (5)
rsync: recv_generator: failed to stat "/media/sd_backup/var/run/dhclient.eth0.pid": Input/output error (5)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1058) [sender=3.0.5]

Trefne pliki (w liczbie sześciu, jak widać) mają długość 0 bajtów, a próba np. ls -li /media/sd_backup/etc/shadow powoduje komunikat I/O error. Usunąć tego też się nie da (rm -f nie daje rady)...

Wobec powyższego, sformatowałem partycję i wykonałem kopię za pomocą następującego polecenia wykorzystując tara:

tar cf - . | (cd /media/sd_backup/; tar xvpf - ) 2> ../../tar.log

Po wsadzeniu kopii zamiast oryginału do Szewy, system wydaje się działać. Czemu rsync zawiódł nie wiem (na razie)...

Dopisane 27 maja 2010 (po południu): Log tara (2> ../../tar.log) zawierał masę wpisów: implausibly old time stamp 1960-04-13 04:17:36. Data jest absurdalna. Żeby było śmieszniej w systemie była inna (w przód 2028 rok -- licznik się przekręcił tarowi?). Pliki z błędnym czasem modyfikacji były głównie w katalogach /dev/ /var/ oraz /etc/; wygląda jakby w czasie inicjalizacji, przed uruchomieniem ntpdate ,,fabryczny'' zegar Szewy wskazywał coś dziwacznego.

Czasy poprawiłem touchem. Zrobiłem rsync na dysk, a potem z dysku na kartę zapasową. Tym razem błędów nie było...

Dopisane 10 Kwietnia 2011: Poprawiłem skrypt rsync_neptune.sh na możliwą okoliczność wykonania kopii z uszkodzonych danych. W nowej wersji tworzone są trzy kopie z dwutygodniowym horyzontem czasowym:

#!/bin/bash
# rsync_neptune.sh (wersja poprawiona)
SOURCE=neptune::wholefs/

EXCLUDE=/root/.rsync/backup_exclude.lst
DESTDIR=/public/sheeva/backup/neptune/rootfs
COPYDIR=/public/sheeva/backup/neptune

### Zachowaj stara kopie pod inna nazwa:
cp -f ${COPYDIR}/1week.tar.gz ${COPYDIR}/2week.tar.gz

### Zachowaj stare dane (sprzed tygodnia):
tar -zcPf ${COPYDIR}/1week.tar.gz ${DESTDIR}

echo "=== Syncing ${SOURCE} at `date` ==="
rsync -av --exclude-from=${EXCLUDE} --delete ${SOURCE} ${DESTDIR}

Powinienem w ciągu dwóch tygodni się połapać, że coś jest nie tak, np. z kartą.

url | Tue, 25/05/2010 12:38 | tagi: , , , ,
Sheeva #2

Zainstalowałem Debiana Lenny na karcie SD (Patriot 16Gb class 6) wg. wskazówek ze strony Manually unpacking a tar ball of Debian on SheevaPlug, ale nie poszło gładko. Ponieważ boot loader mojej szewy był w wersji wcześniejszej od zalecanej 3.4.19, zatem kierując się wskazówkami ze strony Upgrading SheevaPlug's U-Boot, rozpocząłem od wgrania nowego U-boata stosując technikę wykorzystującą USB (a nie serwera TFTP). W rezultacie już za pierwszym podejściem zbrikowałem szewę na amen.

Na szczęście się okazało, że wgranie nowego programu rozruchowego i systemu do pamięci NAND nie jest aż takie trudne i sprowadza się do pobrania czegoś co się nazywa SheevaPlug Installer. Relewantna informacja zaczyna się od śródtytułu How to install 1.0?. Należy mianowicie:

  1. pobrać i rozpakować archiwum .tar.gz
  2. przegrać zawartość katalogu installer do katalogu głównego PenDrive'a
  3. w katalogu uboot/uboot-env znaleźć pliki uboot-nand-custom.txt oraz uboot-mmc-custom.txt i poprawić MAC adres odczytując go z obudowy SheevaPlug.
  4. Połączyć SheevaPlug z komputerem za pomocą kabla miniUSB oraz włączyć urządzenie. Z poziomu katalogu głównego instalatora uruchomić program (jako root):
    php ./runme.php nand
    

    Odczekać aż wszystko się nagra. U mnie nie do końca działa: system się ładuje ale root nie może się zalogować... Pech...

Ponieważ ostatecznie chcę uruchomić system z karty SD, a nie wbudowany z pamięci NAND, to powyższa niedogodność jest w sumie bez znaczenia. Ważne że U-boat jest zaktualizowany do wersji 3.4.19. Można zatem instalować Debiana.

Kartę podzieliłem na partycje i sformatowałem zgodnie z opisem, tyle że zamiast Ext2 użyłem Ext3, co okazało się błędem (ale o tym za chwilę). Następnie pobrałem archiwum z systemem:

wget http://people.debian.org/~tbm/sheevaplug/lenny/base.tar.bz2
wget http://people.debian.org/~tbm/sheevaplug/lenny/base.tar.bz2.asc

Zamontowałem kartę i skopiowałem co trzeba

tar -xjvf ~/base.tar.bz2

Ustawiłem środowisko programu ładującego:

setenv mainlineLinux yes
setenv arcNumber 2097
saveenv
reset

oraz

setenv bootargs_console console=ttyS0,115200
setenv bootargs_root 'root=/dev/mmcblk0p2'
setenv bootcmd_mmc 'mmcinit; ext2load mmc 0 0x01100000 /uInitrd; ext2load mmc 0 0x00800000 /uImage'
setenv bootcmd 'setenv bootargs $(bootargs_console) $(bootargs_root); run bootcmd_mmc; bootm 0x00800000 0x01100000'
saveenv

Teraz run bootcmd i kicha... System nie może odnaleźć partycji systemowej. Próbowałem różnych kombinacji, nic... Wreszcie dla świętego spokoju, sformatowałem kartę jako Ext2 a nie Ext3, tak jak jest to zalecane. Zadziałało... Morał: nie kombinować....

Teraz zrobiłem to wszystko co jest zalecane na stronie Manually unpacking a tar ball of Debian on SheevaPlug, tj.:

rm /etc/ssh/ssh_host*
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ""
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""

## Synchronizacja czasu
ntpdate pool.ntp.org

apt-get dist-upgrade

## Ustawienie daty/czasu
dpkg-reconfigure tzdata

## wybieram (spacją) pl_PL.utf8 pl_PL.88592, domyślnie pl_PL.utf8
dpkg-reconfigure locales

## zmienić nazwę hosta dodając ją do
vi /etc/hostname

A ponadto:

apt-get install ntp
apt-get install fuse-utils
apt-get install libxml-dom-xpath-perl libxml-dom-perl
apt-get install vim apache2
apt-get install php5 php5-cli
apt-get install make zip unzip

Na razie wystarczy...

Dopisane 20 maja 2010: Na podstawie zaleceń ze strony Debian Lenny -- installing Apache2 and PHP5 doinstalowuję porządnie PHP.

Dopisane 20 maja 2010: Formatowanie karty 8Gb za pomocą gparted. Partycja #1: 102 Mb (boot), partycja #2: 7044 Mb (system), partycja #3: ok. 500 Mb (swap). Za pomocą fdiska dodałem flagę boot do pierwszej partycji:

/sbin/fdisk /dev/sdc
a # toggle a bootable flag
1 # pierwsza partycja
w # zapisz tabelę partycji

Wczoraj próbowałem kartę SDHC Patriot LX (klasa 10), ale przesadziłem:

SDHC found. Card desciption is:
Manufacturer:       0x27, OEM "PH"
Product name:       "SD08G", revision 3.0
Serial number:      2952790466
Manufacturing date: 4/2010
CRC:                0x00, b0 = 0

** Unable to read "/uInitrd" from mmc 0:1 **

** Unable to read "/uImage" from mmc 0:1 **
## Booting image at 00800000 ...
Bad Magic Number

Wygląda że Patriot LX 8Gb (class 10) is one of them, czyli z gatunku tych z którymi U-boat nie działa.

url | Wed, 12/05/2010 20:52 | tagi: , , ,
Ładowanie filmów na YouTube off-line

Ponieważ opisany poprzednio uploader filmów na YT przestał działać przyjrzałem się bliżej skryptowi youtube-upload.py. Od pierwszego strzału nie działa, ale... Skrypt ten wymaga do działania programu ffmpeg, który to program służy wyłącznie do obliczenia czasu trwania filmu. W przypadku szewy uruchamianie ffmpeg chyba nie jest dobrym pomysłem, a uruchamianie tylko po to żeby obliczyć ile trwa film to w ogóle beznadziejna sprawa...

Zatem ,,rozbroiłem'' skrypt, wpisując na zicher w odpowiednie miejsce długość filmu jako 60 (pewnie sekund):

def get_video_duration(video_path):
    """Return video duration in seconds."""
    #errdata = ffmpeg("-i", video_path)
    #match = re.search(r"Duration:\s*(.*?),", errdata)
    #if not match:
    #    return
    #strduration = match.group(1)
    #return sum(factor*float(value) for (factor, value) in 
    #           zip((60*60, 60, 1), strduration.split(":")))
    return 60 

Wygląda że działa.... Opis filmu dodaję po załadowaniu... Skrypt youtube-upload.py korzysta z API jest zatem dużo większa szansa, że nagle przestanie działać (jak to było z poprzednio wykorzystywanym programem). Do działania potrzebna jest też biblioteka python-gdata, która wszakże zainstalowała się na szewie w/o problems.

url | Wed, 12/05/2010 13:32 | tagi: , ,
Ładowanie filmów na YouTube off-line

Trudno jest znaleźć gotowe i działające rozwiązanie pn. jak wysłać (upload) film na YT, nie używając formularza i przeglądarki. Teoretycznie jest API; jest tam nawet to opisane, ale jakoś tak na tyle pokrętnie, że nie mogę się połapać na szybko jak to zaimplementować. Szukałem po linii Pythona, por. Getting comments from youtube via... oraz python uploading scripts for youtube. Nic z tego nie wyszło...

Działa za to skrypt opisany na stronie How to Upload YouTube Videos Programmatically. Nie korzysta on wprawdzie z API--udaje przeglądarkę i analizuje kod HTML metodą data scrapping. Data scrapping ma ten minus, że w każdej chwili może przestać działać ale może nie będzie aż tak źle. Takie sztuczki sam kiedyś stosowałem, zresztą (por. Czy flickr umie liczyć -- rozwiązanie).

Przechodząc do konkretów. Uruchomienie skryptu ytup.pl wygląda następująco:

perl ytup.pl -l login -p hasło -c nr_kategorii -d opis - t tytuł_filmu -x słowa-kluczowe -f plik

Ja chcę uruchamiać ytup.pl w nocy, jak wszyscy śpią. W tym celu opis filmu wstawiam do pliku z rozszerzenie .descr, np.:

-t Elka plays accordion
-d Elka's warm-up exercises
-x elka,accordion,weltmaister,rehearsal,music,warm-up
-c 24
-f Zi6_0042.MOV

Jak widać, plik zawiera wszystko co trzeba do uruchomienia skryptu ytup.pl. Teraz inny plik przegląda wybrane katalogi, czyta pliki .descr i uruchamia ytup.pl [pliki Video i pliki .descr muszą być w tym samym katalogu]:

#!/usr/bin/perl
use File::Spec;
use File::Basename;

my $YTlogin = 'login'; ## wstaw login 
my $YTpassword = 'hasło'; ## wstaw hasło
my $YTlog_file = "/home/tomek/SD/ytube/logs/YT_Upload.log";
my $PerlProg = "/usr/bin/perl";
my $PerlScript = '/home/tomek/bin/ytup.pl';
my @YT_watch_dirs=('/home/tomek/SD/ytube/upload', '/public/sheeva/winstuff/YTube');

open LOG, ">>$YTlog_file";

for my $dir (@YT_watch_dirs) {
    # Read directory and collect description files.
    opendir(DIR, $dir) or die "*** Can't open directory $dir: $!.";

    print STDERR "*** Processing directory: $dir\n";

    my $count = 0;
    while (defined(my $file = readdir(DIR))) {
       if ($file =~ /^\./) { next ; } # pomin plik z kropka na poczatku
       if ($file =~ /\.descr$/) {
          $file = File::Spec->rel2abs(File::Spec->join($dir,$file));
          print STDERR "*** Description file: $file\n";
          Upload_video($file);
          rename($file, "${file}_") || print LOG "Problem ze zmiana $file => ${file}_\n";
          $count++;
       }
    }
    closedir(DIR);
    print STDERR " $count .dscr file" . ($count!=1?'s':'') . ".\n";
}

close(LOG);

### ### ###

sub Upload_video {
# Przeczytaj plik z opisem, wyslij plik video za pomoca system(...)
   my $file_name = shift ;
   my $key, $val;

   my @Options = ();

   open (DESCRIPTION, $file_name);

   while (<DESCRIPTION>) {
      # plik zawiera w kazdym wierszu: opcja spacja wartosc-opcji
      $_ =~ /([-\w]+)\s+(\S.*)/;
      $key = $1; $val = $2; # na wszelki wypadek
      if ($key =~ /-f/) { $val = dirname($file_name) . "/$val" ; 
   }
   push (@Options, ("$key", "$val"));  }
   my @UploadScript = ($PerlProg, $PerlScript, '-l', $YTlogin, '-p', $YTpassword, @Options);
   print STDERR "*** Executing: @UploadScript\n";

   system ( @UploadScript ) == 0 || print LOG "Problem z zaladowaniem pliku $file_name\n" ;
}

Powyższy plik jest uruchamiany -- w stosownym momencie -- przez crona, a przesłany film jest tutaj.

url | Sat, 13/02/2010 09:01 | tagi: , ,
Rejestracja temperatury aka po co kupiłem SheevaPlug

Do podłączenia czujników temperatury DS18B20 firmy Dallas (kupionych za ca 5 PLN/sztuka na Allegro) dokupiłem -- też na Allegro -- Moduł 1Wire na USB, chipset DS2480B + FT232RL, który jest ,,Od strony programowej zgodny z konwerterami opartymi na układach DS2480B, czyli np. z oryginalnymi interfejsami serii DS9097 firmy MAXIM-DALLAS z tą różnicą, że interfejs podłączamy do portu USB zamiast portu szeregowego RS232 [...] Do konwersji ze standardu RS232 na USB zastosowano układ FT232RL firmy FTDI''. Więcej szczegółów można doczytać tutaj (Kod produktu: MP00202).

zdjęcie
Zdjęcie #1
zdjęcie
Zdjęcie #2
zdjęcie
Zdjęcie #3
zdjęcie
Zdjęcie #4

Teraz uwaga: czujnik DS18B20 ma trzy nogi (aka piny). Skrajne łączę i dolutowuję do jednej żyły (brązowej) przewodu telefonicznego a środkowy do drugiej (żółtej); dwie pozostałe żyły są niepotrzebne. [Kolory oczywiście nie są ważne; podaję je na swój prywatny użytek, gdybym za jakiś czas chciał rozbudować instalacją i dolutować kolejny sensor.] Ponieważ DS18B20 jest bardzo mały, to żeby piny się nie stykały izoluję każdą żyłę cienką rurką termokurczliwą (por. zdjęcie #1, umieszczone obok). Żeby ładniej wyglądało, ale przede wszystkim żeby połączenie czujnik-kabel było mocniejsze (żyły są bardzo cienkie) to na cały przewód naciągam szerszą rurkę (por. zdjęcie #2) i też zgrzewam (por. zdjęcie #3). Zgrzewam zapalniczką....

Moduł MP00202 nie łączę bezpośrednio z przewodem telefonicznym, bo żyły są tak cienkie że wolę zrobić to na dwa pas. Krótki dwużyłowy przewód elektryczny lutuję z żyłami kabla telefonicznego, po czym wzmacniam połączenie naciągając rurkę termokurczliwą. Dużo grubsze żyły kabla elektrycznego znacząco pewniej tkwią w stykach modułu MP00202. Nota bene: żyłę dolutowaną do skrajnych pinów należy połączyć z górnym stykiem, a tą drugą ze stykiem obok (dwa dolne styki są niewykorzystane; por. rys. #4).

Ostatecznie połączyłem równolegle 4 czujniki: pokój, tzw. weranda, kaloryfer i jeden zewnątrzny. Tzn. najpierw podłączyłem jeden i testowałem czy toto w ogóle działa. Ale to tak na marginesie...

Do rejestracji temperatury korzystam z programu digitemp:

sheeva> apt-get install digitemp

Konkurencyjny owfs.org nie jest dostępny w repozytoriach, zaś jego kompilowanie w wersji na SheevaPlug nie jest prostą sprawą. Z kolei digitemp nie działa out of the box, przynajmniej z tą wersją kernela, która była zainstalowana w moim komputerku... Sheeva ma ,,odchudzoną wersję'' kernela -- bez wielu modułów, w tym modułu ftdi_sio do obsługi konwertera USB→Serial, FT232R. Że coś jest nie ten-teges świadczy brak /dev/ttyUSB0. O tym wszystkim zaś doczytałem tutaj.

Nową wersję jądra, zawierającą stosowny moduł ściągnąłem i zainstalowałem z http://sheeva.with-linux.com/sheeva/:

sheeva> wget http://sheeva.with-linux.com/sheeva/README-2.6.32.7

Uwaga #1: po zainstalowaniu jądra niezbędne są zmiany środowiska Uboota (U-Boot environment variables) -- co trzeba zrobić jest opisane na początku pliku README-2.6.32.7. Aby zainstalować jądro wystarczy:

sheeva> ./README-2.6.32.7

Uwaga #2: jeżeli na ekranie pojawi się /bin/bash: bad interpreter: Permission denied, to sprawdźmy (uruchamiając mount bez argumentów) czy aby nie uruchomiamy skryptu w systemie plików montowanym z parametrem noexec.

Jak wszystko pójdzie dobrze (mi poszło) to teraz należy zaktualizować U-Boot environment variables. W tym celu należy połączyć się z SheevaPlug kablem z wtyczkami USB/miniUSB, wyłączyć komputerek, a po włączeniu połączyć się szybciutko poleceniem:

## jeżeli nie ma /ttyUSB1 spróbuj inny /ttyUSB*
cu -s 115200 -l /dev/ttyUSB1

Naciskając dowolny klawisz (należy się spieszyć) spowodujemy wyświetlenie się znaku zachęty U-boota. Wtedy należy wpisać, to co podano w README-2.6.32.7 (lub stosownym innym pliku jeżeli skopiowana była inna wersja jądra). Mówiąc konkretnie wpisać trzeba (działam metodą kopiuj wklej oczywiście; znak ↓ na końcu wiersza oznacza kontynuację):

setenv mainlineLinux yes
setenv arcNumber 2097
setenv bootargs rootfstype=jffs2 console=ttyS0,115200 mtdparts=orion_nand:0x400000@0x100000(uImage),↓
 0x1fb00000@0x500000(rootfs) rw root=/dev/mtdblock1 ↓
 rw ip=192.168.1.9:192.168.1.4:192.168.1.4:255.255.255.0:DB88FXX81:eth0:none

Teraz

saveenv
reset

Reset nie reboot, por. tutaj. Powinno się pojawić urządzenie /dev/ttyUSB0 (jeżeli podłączymy moduł MP00202 oczywiście). Zatem wreszcie:

sheeva> digitemp_DS9097U -a -i -s/dev/ttyUSB0

Program wypisze coś w stylu:

DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Turning off all DS2409 Couplers
.....
Searching the 1-Wire LAN
10E8EF98010800E6 : DS1820/DS18S20/DS1920 Temperature Sensor
105C1C990108005A : DS1820/DS18S20/DS1920 Temperature Sensor
1029400102080084 : DS1820/DS18S20/DS1920 Temperature Sensor
1065259901080056 : DS1820/DS18S20/DS1920 Temperature Sensor
ROM #0 : 10E8EF98010800E6
ROM #1 : 105C1C990108005A
ROM #2 : 1029400102080084
ROM #3 : 1065259901080056
Wrote .digitemprc
Feb 02 20:18:08 Sensor 0 C: 17.75 F: 63.95
Feb 02 20:18:09 Sensor 1 C: 20.50 F: 68.90
Feb 02 20:18:10 Sensor 2 C: 43.81 F: 110.86
Feb 02 20:18:11 Sensor 3 C: -4.94 F: 23.11

Temperaturę rejestruję uruchamiając digitempa co godzinę, via crontaba:

##0 * * * * /usr/bin/digitemp_DS9097U -a -l/media/sd/tomek/logs/Digitemp/digitemp.log -s/dev/ttyUSB0
0 * * * * /home/tomek/bin/dt2ht.sh

Skrypt dt2ht.sh uruchamia digitemp_DS9097U (w sposób jaki podano w zakomentowanym wierszu wyżej) a następnie skryptem Perla obrabia plik /media/sd/tomek/logs/Digitemp/digitemp.log do formatu HTML. Wynik można obejrzeć tutaj. Uwaga #3: aby ,,zwykły'' użytkownik mógł uruchomić digitempa trzeba zmienić domyślne prawa dostępu do /dev/ttyUSB0:

cat 'KERNEL=="ttyUSB0", MODE="0666"' >> /etc/udev/rules.d/80-ttyusb.rules

Popularne jest wykorzystanie do graficznej prezentacji programu RRDTool, na co się -- póki co przynajmniej -- nie zdecydowałem. Przy okazji zmagań z termometrami zwiedziłem różne strony i blogi, niektóre całkiem interesujące (porządek linków dowolny): 1234567.

Bez Google ale i Piotra Strzelczyka, który wcześniej się okazało już coś takiego zlutował nie dałbym rady...

Dopisane 25 marca 2010 (Rozbudowa instalacji): Dokupiłem kabel energetyczny (dwużyłowy), bo na zewnątrz budynku przewód telefoniczny wydaje się za delikatny. W tym kablu jedna żyła jest niebieska a druga brązowa. Skrajne lutuję do niebieskiej, a środkowy do brązowej.

url | Tue, 02/02/2010 20:49 | tagi: , , ,