Geocaching na Linuxu

Dnes jsem se zabýval hromadnou správou položek pro Geocaching. Vždycky jsem si do telefonu stahoval jen omezené množství před plánovanou výpravou. Přesto jsem téměř nikdy listingy nečetl dopředu (nicméně po nálezu jsem to napravil). Navíc se často vyrazilo do hodiny po rozhodnutí o odjezdu. Buďto jsem si nestihl keše stáhnout, ale i když jsem je měl, sem tam nešla krabička vyhledat, protože jsem neměl staženo dost informací či nastal jiný problém způsobený chabou přípravou. Po návratu jsem litoval, že chybělo tak málo, nebo jsem něco přešel.
Od těch dob se na mě nabaluje další software. Začal jsem přispívat do OSM, v telefonu jsem nainstaloval Locus následně i Pro verzi, c:geo, v počítači JOSM, gpxview (ještě digikam na geotaging fotek). Bylo na čase podpořit i geocaching, který mě k mapování pro OSM přivedl. Po dlouhém hledání jsem objevil alespoň jednoho správce databáze pro Linux a to OpenCacheManager. Ten se spoléhá na vnější zdroj dat, takže k dolování Geocaching.com jsem zvolil geotoad, který je naprosto skvělý. Je intuitivní a není třeba nic vysvětlovat, snad jen, že „country“ je CZ a „state“ se vyhledá pomocí řetězce „CZ/.*“. Sami vyzkoušejte. Vydolovaná data přesunu do OCM, kde můžu řešit mysterky a multiny, uložit finálové souřadnice do databáze, či jen jednoduše slučovat další a další výcucy z geotoad. Keše pak můžu filtrovat a pak exportovat do souboru gpx. Ten lze jednoduše importovat do c:geo. S Locusem je práce o trochu složitější, ale jistě se vyplatí. Locus je připraven na PQ, ve které údajně dostanete soubor s detaily keší a druhý s případnými waypointy k nim. Musím tedy svůj export přizpůsobit, jinak by se nám každý waypoint povaloval v mapě samostatně a nebyl by se svojí keší nijak spojen. To není složité, stačí zvolit Export do GPX (Ctrl + S). Soubor export.gpx exportujte BEZ Child waypoints (v Options). Po dokončení exportu proveďte ještě jeden, tentokrát soubor pojmenujte na export-wpts.gpx a exportujte S Child waypoints. Spusťte následující skript, který odvede zbytek práce.
pq.sh

#!/bin/bash
comm -3 export.gpx export-wpts.gpx | sed '1,+2d' > diff.gpx
echo '<gpx>' | cat - diff.gpx > export-wpts.gpx
rm diff.gpx

Zřejmě není zcela korektní, že chybí hlavička, ale import funguje korektně. Proč jsem se vůbec snažil o import do Locus? Mělo by tam fungovat hlášení POI, už se mi totiž stalo, že jsem v turistickém zápalu přešel ráno na rychlo stažené keše 🙂 Locus mě na to doufám upozorní. Nyní máme dva soubory, které já osobně označím v Nautilu (jsou pěkně vedle sebe). Před tím, než zvolím odeslat přes Bluetooth z kontextové nabídky, zajdu v Locusu do kategorie Data/Body, ve které mám kategorii pro keše. Stisknu tlačítko nástrojů a zvolím Import, pakliže již mám ve podsložce /bluetooth stejně pojmenované soubory, dlouhým podržením je, díky bohu mohu přímo v Locus, smažu (dochází k úpravě názvů při odesílání, pokud je v cílové složce soubor stejného názvu). (EDIT: Vyzkoušeno odeslat oba soubory přes BT komprimovaně v zipu. Je to jen otázka jedné volby v odesílacím dialogu. Locus si s tím poradí a není třeba tak často soubor mazat, protože nedochází ke změně v názvu gpx souborů.) Z Nautilu potvrdím odeslání a pak již importuji soubor export.gpx, Locus se postará o druhý soubor automaticky. Nechám smazat stará data v kategorii, protože vše shromažďuji v OCM.

Ametérská astronomická fotografie

Nemám k dispozici typickou výbavu pro astrofotografii, jen běžnou zrcadlovku Pentax K-r, objektiv Sigma 70-300 mm a stativ. Nemám ještě ani paralaktický stolek, i když ho mám v plánu postavit. V případě, že objektiv nesleduje zdánlivý pohyb hvězd po nebeské sféře, je nutno volit čas trvání expozice úměrný ohniskové délce, tak aby se pohyb obrazu hvězdy po snímači v průběhu expozice minimalizoval. Na www.astro-forum.cz jsem se dozvěděl nejeden detail. Zřejmě nejlepší je samotná fotografie. Dozvíte se, že máte použít čas 0,8 s, a ISO6400 při 300 mm ohnisku. Nejlepší je, máte-li k fotoaparátu dálkové ovládání, nemusíte pak vyhazovat první rozmazaný snímek a samozřejmě intervalovou expozici. Čím víc snímků tím lépe. Ale samotné focení není legrace, začíná už dlouhou dobu před prvním stisknutím spouště výrobou Bahtinovy masky. Bez více či méně přesného zaostření budou snímky k ničemu. Dále: objekt by měl být na obloze co nejvýše, kvůli tenčí vrstvě plynu, kterou musí světlo až k objektivu urazit. To je někdy v protikladu s tím, že objektiv zajíždí dovnitř pouzdra, je-li namířen vzhůru. Je třeba jej zajistit gumičkou, či podobně. Na stanovišti s co nejmenším světelným znečištěním je nutno nejprve vyhledat objekt a několika snímky, či pomocí LiveView zaostřit za přispění Bahtinovy masky. Jsme-li připraveni rozvrhneme počet a druh snímků. Ty jsou pro začátek čtyři: light (běžný snímek hvězd), dark, flat a bias. Light snímků pořídíme co nejvíce třeba než objekt opustí zorné pole, pak může dle naší libosti následovat pořízení dark a bias snímků a znovu například několik light. Temné jsou foceny stejným nastavením jako ty barevné, jen s krytkou na objektivu, jde o to získat obraz šumu produkovaného samotným snímačem, ten se pak při zpracování odečítá od light snímků, aby byly šumu zbaveny. Bias je focen na stejné nastavení jako dark s výjimkou času, který se nastaví na nejkratší možný a objektiv je stále zakrytý. Tyto snímky pořizujeme během focení za stejných podmínek jako barevné, projevuje se totiž okolní teplota apod. Flat si pořizuji s pomocí monitoru počítače a eurofolií, které bílé světlo z monitoru (za předpokladu, že celá obrazovka bude bílá) rovnoměrně rozptýlí. Tento snímek má kompenzovat vliv optické soustavy a proto je důležité, aby soustava byla ve stejné poloze jako při focení barevných snímků.

Snímky se nechají automaticky zpracovat programem DeepSkyStacker a výsledek může vypadat i lépe než tento můj: M42

Automatizovaný příjem snímků NOAA

Nejprve byla anténa QFH, pak softwarové rádio s čipsetem Realtek RTL2832U, pak byl software na ovládání rádia zvaný gqrx, který je založený na gnuradio a pak tu byl uživatel, který musel čekat, až přiletí satelit, čekat čtvrt hodiny a sehnat několik příkazů na vytvoření obrázku pomocí programu wxtoimg. Uživatele to přestalo bavit a tak si napsal skript, který sám sestaví obrázek a nahraje jej na web server. Pak ale musel napsat skript, který ty obrázky seřadí podle data pořízení. Jenže ani to mu moc nepomohlo a nezbylo nic jiného, než přemýšlet jak automatizovat úplně všechno. První problém bylo sehnat čas příletu družice na viditelnou část oblohy. Z GPredict se nějak viditelně vydolovat nedal. Díky dobré duši, která implementovala GPredict do jazyka PHP a zveřejnila kód se dala první část odškrtnout. Zdrojové kódy stáhnete zde. Predict.php všechno zařizuje, pro vaše potřeby využijte souboru visible_passes.php ve složce examples. Tento soubor si jen poupravte dle svých potřeb. Já potřeboval čas příletu a dobu, po kterou satelit zůstává na viditelné části oblohy. Tento skript neběží na webserveru, je volán cronem vždy po 4. hodině ranní, kdy začíná první část přeletů viditelných od nás a zkontroluje přelety na dalších 24 hodin. Zatím běží na klasickém PC, běh na Raspberry Pi ještě vyzkouším. Pokud skript neběží, možná jsem udělal chybu zde při úpravách, ale je téměř samovysvětlující, takže není problém jej opravit/předělat podle svých potřeb.

noaa.php

<?php
/**
 * This is an example of how to use Predict for determining upcoming visible
 * passes of the International Space Station.  Please read the inline comments
 * for details.
 *
 * Run this from the root checkout, not from examples, or the include paths
 * will not work.
 */

require_once 'Predict.php';
require_once 'Predict/Sat.php';
require_once 'Predict/QTH.php';
require_once 'Predict/Time.php';
require_once 'Predict/TLE.php';

function sortByAos($a, $b) {
   if ($a[2] == $b[2]) {
        return 0;
    }
    return ($a[2] < $b[2]) ? -1 : 1;
}
// Track execution time of this script
$start = microtime(true);

// The observer or groundstation is called QTH in ham radio terms
$predict  = new Predict();
$qth      = new Predict_QTH();
$qth->alt = 300; // Altitude in meters

// Munich, example east of the meridian
$qth->lat = 48.1505; // Lat North
$qth->lon = 11.5809; // Lon East

// The iss.tle file is the first 3 lines of
// http://celestrak.com/NORAD/elements/stations.txt
// Make sure you update this content, it goes out of date within a day or two
exec("wget http://celestrak.com/NORAD/elements/weather.txt -O ~USERNAME/.wxtoimg/weather.txt");
$tleFile = file('http://celestrak.com/NORAD/elements/noaa.txt'); // Load up the NOAA from celestrak
$indexes = array(19, 18, 15);
$list = array();

foreach ($indexes as $index){
	$index *= 3;  //3 rows for satellite
	$tle     = new Predict_TLE(substr($tleFile[$index], 5, 2), $tleFile[$index+1], $tleFile[$index+2]); // Instantiate it
	$sat     = new Predict_Sat($tle); // Load up the satellite data
	$now     = Predict_Time::get_current_daynum(); // get the current time as Julian Date (daynum)

	// You can modify some preferences in Predict(), the defaults are below
	//
	 $predict->minEle     = 0; // Minimum elevation for a pass
	 $predict->timeRes    = 5; // Pass details: time resolution in seconds
	 $predict->numEntries = 10; // Pass details: number of entries per pass
	 $predict->threshold  = 90; // Twilight threshold (sun must be at this lat or lower)

	// Get the passes and filter visible only, takes about 4 seconds for 10 days
	$results  = $predict->get_passes($sat, $qth, $now, 1);
	$filtered = $predict->filterVisiblePasses($results);

	$zone   = 'Europe/Berlin'; // Pacific time zone
	$format = 'H:i mdy';         // Time format from PHP's date() function
	$epoch  = 'U';

	// Format the output similar to the heavens-above.com website
	//echo "<tr><td>Sat\t<td>AOS\t<td>ELE\t<td>LOS\t</tr>";
	foreach ($filtered as $pass) {
	    if (round($pass->max_el) < 17){
	       continue;
	    }
	    $list[] = array($pass->satname, Predict_Time::daynum2readable($pass->aos, $zone, $format), Predict_Time::daynum2readable($pass->aos, $zone, $epoch), Predict_Time::daynum2readable($pass->los, $zone, $epoch), round($pass->max_el));
	}
}

//delete the pass with worse max elevation from overlaping ones
usort($list, 'sortByAos');
$i=0;
while ($i < (sizeOf($list)-1)){
	if ($list[$i][3] >= $list[$i+1][2]) {
		if ($list[$i][4] > $list[$i+1][4]){
			array_splice($list, $i+1, 1);
		} else {
			array_splice($list, $i, 1);
		}		
		continue;
	}
	$i++;
}

//echo $wake_date > /sys/class/rtc/rtc0/wakealarm

foreach ($list as $pass) {
    $cmd = "echo \"cd /home/USERNAME && ./apt ".$pass[0]. " ";
    $cmd .= $pass[3] - $pass[2] - 60;
    $cmd .= "\" | at -m ";
    $cmd .= "\"". $pass[1] . " +1 minute\"\n";
    
    exec($cmd);
    //echo $cmd;
}
//echo "Execution time:  " . number_format((microtime(true) - $start) * 1000, 2) . "ms\n"; 
exit;

Zde vidíte, že php skript stáhnete TLE pro sebe a wxtoimg, Predict vypočítá potřebné časy, které php zapíše do příkazu at. At spustí mnou připravený skript, který zaznamená vysílání ze satelitu a přechroupe záznam do podoby obrázku. Ten nahraje na webovou prezentaci meteostanice pomocí nástroje curl. Nezapomeňte upravit username.
Bash skript původně zpracovával nahrávky z gqrx, z této doby pochází ta skvělá konstrukce na čtení datového razítka na začátku skriptu. Využívá programu rtl_fm z balíčku od osmocom. Dále tam najdete sox (třeba nainstalovat) pro práci se zvukovým záznamem a samozřejmě WXtotImg (také doinstalovat).

apt.sh

#!/bin/bash

bandwidth=150k
login='LOGIN:PASSWORD'

#Freq +- 0.006 ?
case $1 in
15)freq=137.54M;;
17)freq=137.5M;;
18)freq=137.9065M;;
19)freq=137.092M;;
*)exit 1;;
esac

filename=`date -u +%Y%m%d-%H%M%S`.s16
timeout $2 /usr/local/bin/rtl_fm -f $freq -s $bandwidth > $filename
#timeout $2 /usr/local/bin/rtl_sdr $filename.bin -f $freq -s 1.8e6
if [ $? -ne 124 ]; then
	rm $filename
	exit 1
fi

if [ ! -f $filename ]; then
	echo "Soubor $filename neexistuje."
	exit 2
fi

#set variables 
date=`echo $filename | cut -d- -f1`
time=`echo $filename | cut -d- -f2 | cut -d. -f1`
year=`echo $date | cut -c1-4`
month=`echo $date | cut -c5-6`
day=`echo $date | cut -c7-8`
hour=`echo $time | cut -c1-2`
minute=`echo $time | cut -c3-4`
second=`echo $time | cut -c5-6`

output=$year$month$day$hour$minute$second.wav
hvc=noaa$1-$year$month$day-$hour$minute$second-hvc.png
no=noaa$1-$year$month$day-$hour$minute$second-no.png
mcir=noaa$1-$year$month$day-$hour$minute$second-mcir.png
tmp=noaatmp.wav
map=map.png
thumbnail=noaa.png

#QTH
lat=48.1505
lon=11.5809
ele=300
#dawn=7
#dusk=17
#day/night is determined by python script

sox -r $bandwidth -c 1 -L $filename $tmp
sox $tmp $output rate 11025

touch -r $filename $output

/usr/local/bin/wxmap -T "NOAA $1" -L"$lat/$lon/$ele" -G /home/USERNAME/.wxtoimg -p 0 -l 0 -od "$day $month $year $hour:$minute:$second" $map

/usr/local/bin/wxtoimg -c -e MCIR -m $map -t "NOAA $1" -o $output $mcir
/usr/bin/curl -T $mcir ftp://ftp.server/ --user $login

if [ $? -eq 0 ]; then
	convert $mcir -resize 25% $thumbnail
	/usr/bin/curl -T $thumbnail ftp://ftp.server/ --user $login
	
	/usr/local/bin/wxtoimg -c -e NO -m $map -A -t "NOAA $1" -o $output $no
	/usr/bin/curl -T $no ftp://ftp.server/ --user $login
	
	#hourt=`echo $hour | sed 's/^0//'`
	python ./sun.py
	if [ $? -eq 1 ]; then
		/usr/local/bin/wxtoimg -c -e HVC -m $map -A -K -t "NOAA $1" -o $output $hvc
		/usr/bin/curl -T $hvc ftp://ftp.server/ --user $login
		rm $hvc
	fi	
	rm $no $mcir $thumbnail $output
fi

rm $tmp $filename $map

exit 0

Pro určení zda je den či noc používám ne zcela přesný výpočet místního hvězdného času a jeho porovnání vypočteného času východu a západu Slunce, opět hvězdného. To vše kvůli senzoru 4, který se odesílá až hodinu po východu Slunce, zde je ještě prostor pro vylepšení.
sun.py

#!/usr/bin/python

from datetime import datetime
import time
import math

def days_between(d1, d2):
    return (d2 - d1).days + (d2 - d1).seconds/84600.0
    
def echo_time(t):
    print (math.modf(t)[1])+math.ceil((math.modf(t)[0])*60)/100

#QTH
lat = math.radians(48.1505)
lon = math.radians(11.5809)
ele = 300
utcoffset = 1

#Twilight
now = datetime.utcnow()
equinox = datetime.strptime("03-20", "%m-%d")
equinox = equinox.replace(now.year)

if days_between(equinox, now) < 0:
	equinox = equinox.replace(now.year - 1)

d = days_between(equinox, now)
lamb = math.radians(360.0/365.2422 * d)
print "Lambda=", math.degrees(lamb), "d=", d

beta = 0.0
epsilon = math.radians(23.5)

delta = math.asin(math.sin(lamb)*math.sin(epsilon))
alfa = math.acos(math.cos(lamb)/math.sqrt(1-math.pow(math.sin(lamb)*math.sin(epsilon),2)))
if math.sin(lamb)*math.cos(epsilon)/math.sqrt(1-math.pow(math.sin(lamb)*math.sin(epsilon),2)) < 0:
	alfa = 2*math.pi - alfa

ts = math.acos(-math.tan(lat)*math.tan(delta))
if ts>math.pi:
	t1 = ts
	t2 = 2.0*math.pi - ts	
else:
	t1 = 2.0*math.pi - ts
	t2 = ts
	
t1 = math.degrees(t1)
t2 = math.degrees(t2)
while t1 > 360:
    t1 -= 360
while t2 > 360:
    t2 -= 360
print alfa
riselst = t1+math.degrees(alfa)
dawnlst = t2+math.degrees(alfa)
while riselst > 360:
    riselst -= 360
while dawnlst > 360:
    dawnlst -= 360

print "rise in angle",
echo_time(t1/15.0)
print "in LST",
echo_time(riselst/15.0)
print "set in angle",
echo_time(t2/15.0)
print "in LST",
echo_time(dawnlst/15.0)
	
#JD
r=now.year
m=now.month
d=now.day + (now.hour+(now.minute+now.second/60)/60)/24
if m > 2:
    r = r - 1
    m = m + 12
JD = 1720994.5 + 365.25*r + r/400.0 +- r/100.0 + 30.6*(m+1) + d + 2.0
print "JD=",JD

#JD best
unix = time.time()
J = 2440587.5 + unix/86400.0
T = (J - 2451545.0) / 36525.0
TT = 64.184 + 59.0 * T - 51.2 * math.pow(T,2) - 67.1 * math.pow(T,3) - 16.4 * math.pow(T,4)
JTT = J + TT / 86400.0
d = JTT - 2451545.0
print "JD=",JTT
print d

# Sidereal time
J2k = datetime.strptime("2000-01-01 12:00 UTC", "%Y-%m-%d %H:%M %Z")
#d = days_between(J2k, now)
print d

GMST = 280.46061837 + 360.98564736629 * d
while GMST > 360:
    GMST -= 360
LMST = 280.46061837 + 360.98564736629 * d + math.degrees(lon)
while LMST > 360:
    LMST -= 360
print "GMST",
echo_time(GMST/15.0)
print "LMST",
echo_time(LMST/15.0)

if LMST > riselst or LMST < dawnlst:
    print "Day"
    exit(1)
else:
    print "Night"
    exit(2)

t = GMST + math.degrees(lon) + 1.00273790935*(now.hour+now.minute/60 - 1)
print "t=",
echo_time(t/15.0)

h = math.degrees(math.asin(math.sin(delta)*math.sin(lat)+math.cos(delta)*math.cos(math.radians(LMST))*math.cos(lat)))
print "h=", h, "d=",
echo_time(math.degrees(delta))

GPIO přerušení

Chodil jsem na přednášky a cvičení z „Céčka“ a tak vím, že existuje nějaké přerušení. Pro kontrolu vstupu se dá v základu použít přístup: spustím nekonečnou smyčku a co chvíli se budu dívat, zda se něco neděje, jenže to nelze dělat kontinuálně, proces si musí na chvíli oddychnout a nechat prostor dalším, v tu chvíli však nesleduje vstup a ten se může během krátké chvíle změnit, aniž by to program zpozoroval. Elegantnější cesta je nechat operační systém, aby sledoval tzv. přerušení. a ve chvíli, kdy k němu dojde o události spravil náš proces, který na to zatím čeká. Protože chystám provizorní časomíru, kterou bych i přesto chtěl mít co nejpřesnější, za pomoci RPi a vím, že běžné Linuxové jádro není real-time, vzpomněl jsem si na přerušení, které bych rád porovnal s externím zařízení v podobě čítače pulsů (viz astromik.org a jeho časomíra). Hledal jsem a nakonec našel.
Sice nejde o přerušení v pravém slova smyslu, ale zastane stejnou službu.
Vybereme si pin, já zvolil GPIO 15 (tj. P1-10) a dáme jej k dispozici programům jako vstup:

echo 15 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio15/direction

Zde jsem nalezl postup. Stahujte, upravujte a kompilujte, tam odkazovaný, soubor. Spusťte a sledujte veselá přerušení vždy, když se změní stav vstupního pinu. Podle jiného programu v pythonu, je časová prodleva mezi dalším přerušením do dt=0,002 s (včetně vypisování na obrazovku), což je dostatečné pro měření do řádu setin sekundy, ale pravděpodobně si to nezadá s měřením s rozlišením na 32×10-3 s, zajištěné externím čítačem.

Teploměr

Rád bych doplnil implementaci teploměru, o kterém si přečtěte povedený návod na stránce astromik.org pod položkou „15) Teploměr DS18B20“.

Pozor: GPIO4 je nyní špatně, teploměr funguje na GPIO18, alespoň u mě, pro ověření použijte dmesg | grep w1

Vytvořil jsem dva skripty, jeden pro záznam teploty a jeden pro vizualizaci dat. První je klasický bash skript čtoucí v cyklu data z teploměru, dokud se kontrolní součet neshoduje. Občas se totiž vyskytují v měření velké chyby, které se takto minimalizují. Skript zapisuje do souboru temps.log datum do prvního sloupce, čas do druhého sloupce a teplotu do třetího. Při zpracování je třeba teplotu vydělit tisícem. Skript lze volat cronem, já zvolil desetiminutový interval, vše je na libovůli. Nezapomeňte však použít ID vašeho teploměru, řetězec znaků mezi devices/ a /w1_slave je pro každé zařízení jedinečný.

#!/bin/bash

if [ -e /sys/bus/w1/devices/28-000001b44be4/w1_slave ]; then 

 txt=`cat /sys/bus/w1/devices/28-000001b44be4/w1_slave`

 while  [ "$(echo $txt | grep 'NO')" != "" ]; do
  txt=`cat /sys/bus/w1/devices/28-000001b44be4/w1_slave`
 done
 temp=`echo $txt | grep t= | cut -d '=' -f3`
 echo `date +%F%t%T%t`$temp >> ~pi/temps.log
fi

Druhý je skript pro gnuplot, který musíte předem nainstalovat. Části jsem sehnal na různých místech v nápovědách a jiných článcích, protože je to poprvé, kdy s gnuplot pracuji přímo:

#!/usr/bin/gnuplot

set terminal png size 1280,960
set output 'temperature.png'
set title "Inside temperature"
set xlabel "Time"
set ylabel "Temperature [C]"

set style line 11 lt 1 lw 0.5 lc rgb "#AAAAAA"
set style line 12 lt 0 lw 0.1 lc rgb "#DDDDDD"
set mxtics 2
set mytics 4
set grid xtics ytics, ls 11
set grid mxtics mytics, ls 12

set xdata time
set xtics rotate by -12
set timefmt "%Y-%m-%d %H:%M:%S"
set format x "%d.%m. %H h"
plot "temps.log" using 1:($3)/1000 title "Temperature" with lines

Mám tak hotovou první část své budoucí meteostanice.

Konec jedné SIM karty

Sám volám přes internet se službou Voocall. Trochu nepohodlí vyváží bohatě cena, kterou jsem již ochoten platit za telefonní služby. Takže mám předplacenou službu, bez závazku, se kterou volám za 1 či 2 Kč do mobilní sítě a za 0,6 či 1,2 Kč do sítí pevných a to vše se sekundovou tarifikací. Prvním kreditem byla stokoruna na vyzkoušení a přesto, že jsem se přestal v hovorech krotit (ne že bych volal bez přestávky, ale při ceně 6,9 za každou minutu jsem si vždy rozmyslel, zda je nutné zmáčknout zelené tlačítko), jsem milou stokorunu zlikvidoval až za více než 3 měsíce. To je jen úvod, jak jsem se stal rodinným telefonním aktivistou.
A tak když jsem viděl, že můj otec s „kreditním tarifem“ od T-Mobile platí za minutu téměř to co já s jejich předplacenkou a ještě jim pravidelně posílá ne základních 300 Kč ale někdy i 500 či 600 začal jsem pro něj hledat cestu ven. Tou cestou byl přechod do programu, který poskytuje 02 pro různé spolky a zájmové skupiny. Ač se mi 02 nelíbí ze všech nejvíc, byla to snad rozumná volba. Tam nám totiž za poloviční cenu nabídli stejně volných minut a po jejich provolání nižší cenu za minutu hovoru. Zkoušel jsem se domluvit s T-Mobile, zda nejsou schopni dorovnat nabídku, abych nemusel podstupovat přenos čísla (a to jsem ještě nevěděl, že to bude horší než jsem si představoval). Nebyli schopní nabídnout nic podobného, jen poloviční slevu na paušál, ale to pořád nestačí při jejich cenách a tak nezbývalo než dát sbohem, stihnout měsíc před koncem smlouvy podat pro jistotu výpověď, protože jsem nechtěl riskovat prodloužení smlouvy, i když jsem se na to několika operátorů ptal, žádný mě nedokázal dostatečně ujistit, že číslo přejde na předplacenku bez mého přičinění. Paradoxně až podáním výpovědi se věci začaly hýbat, volali a nabízeli, posílaly zprávy, že můžeme uzavřít smlouvu atd. ale to už bylo pozdě. Nejlepší na celém bylo, že v momentě, kdy karta přešla na předplacenou, nabídli volání za 2,5 Kč na nějakou dobu, čímž bychom se dostali hluboko pod cenu dosud využívaných služeb.
Mezitím bylo třeba poslat smlouvu směrem 02, to jsem bohužel prošvihl a když nastalo ukončení smlouvy k 22.1.2013, bylo ještě třeba počkat do 5.2.2013 na přenos čísla. Navíc T-Mobile začal dělat problémy s přenosem čísla. Když jsem zaslali smlouvu, bylo číslo ještě „tarifní“ a když jsem zadával kód pro přenos do webové samoobsluhy, bylo již „předplacené“. Druhý den píší, že jsme nesplnili podmínky pro přenos čísla, tak pátrám, volám kam mě jen napadne a dozvím se, že když se žádalo o přenos pro tarifní číslo nelze ho dokončit, když je teď předplacené. No dobře. Volám do 02 a slečna tvrdí, že pokud by vyprodukovali nový kód pro přenos, byl by naprosto totožný a T-Mobile takto zcela běžně dělá obstrukce. Dělat může, stejně už u nich neprovoláme ani korunu, protože máme mezitím od 02 další kartu s novým číslem. Volám zpět na T-Mobile a nutím operátora přenos potvrdit, ale jsou dobře vyškolení a odolní. Tohle se opakuje ještě několikrát, když tvrdím, že už mám nové číslo pro přenos (když už má být stejné), nakonec tam celou objednávku přenosu čísla smazali a musel jsem stejně objednávat další. Přenos čísla se posunul až na 12.2.2013 a to je právě dnes.
Celou věc řeším dva a půl měsíce — zjišťování, podání výpovědi měsíc předem, podání smlouvy s novým operátorem, snad hodina hovorů s různými lidmi na infolikách. Snad to stálo za to.paegas

FET přepínač/switch

Ač nejsem elektrotechnicky vzdělán a mám mlhavou představu o funkci součástek (mlhavější, než bych si představoval), povedlo se mi vytvořit elektronické relé. Totiž můj problém je na světě snad jedinečný. Měřím sepnutí koncových spínačů na vzdálenost 100 m. Na to už je potřeba nějaký zdroj, takže vezmu autobaterii (jedná se vždy o dočasnou instalaci). Jenže jemná elektronika připojená k PC by to nejspíš nezvládla napřímo a tak vezmu 12 V relé a spínám s ním. Zde je rozkol mezi mým a běžným užitím relé. Nižším napětím se obvykle ovládá vyšší, u mě naopak. A pak máte Raspberry Pi, ke kterému potřebuji vyvést ke GPIO kolíku 3,3 V v případě, že je uzavřen 12 V vnější obvod, navíc to potřebuji co nejrychleji, to mi mechanické relé nezajistí. Protože jsem k Raspberry pořídil n-kanálový FET BS107 jako měnič mezi hladinami 5 V a 3,3 V pro připojení příslušenství. Doufal jsem, že půjde udělat i přepínač, který si představuji. Dlouho jsem hledal a nic nenašel, až jsem se jal dělat pokusy a nakonec na to přišel. Řekl jsem si, že tranzistor otevírá napětí na GATE, přivedl jsem tam tedy 12 V od spínače, k SOURCE jsem připojil společnou zem (GND) přes odpor, měl jsem tady zrovna několik kousků 330k navíc, jistě by to chtělo propočítat. Nu a k DRAIN jsem připojil zatím 5 V, v rámci vývoje. Nyní po stisku tlačítka spínače na 12 V větvi, jsem multimetrem naměřil na nožičce SOURCE kýžené nižší z obou napětí. Po uvolnění tlačítka tam však zůstávalo, vzal jsem tedy ještě jeden 330k rezistor a píchnul jej mezi GATE a GND s tím, že náboj či co tam zůstává vybije do země. Stalo se, a přepínač funguje. Zbývá jen zjistit, zda by nestačil nějký levnější a běžný tranzistor, zda je FET opravdu nutný, stejně jako velikosti rezistorů připojených do země.

LED je úmístěna špatně, oprava dole. / LED is wrong placed, explanation is at the end of article.
fet_switch

EDIT: Vyzkoušel jsem mnohem levnější BS170, hlavní rozdíl je v maximálním napětí 200 V oproti 60 V, to však v mém případě vůbec nevadí. Na GME dostanete datasheet od Philips, ale na první pohled byly obrácené nožičky Source a Drain, Při zapojení podle Datasheetu mi to neběhalo, na údajné Source nožičce bylo pořád napětí. Vsadil jsem pouzdro stejně jako předchozí BS107 a funguje, tak jak já očekávám, kde je tedy chyba?

EDIT 10.3.2013: Po sestavení zkušební desky se ukázalo, že pin nastaveny v RPi jako vstupní je obdařen velkou impedancí a dioda se, dle mého prvotního nápadu, nerozsvítí. Stačí jednoduše přehodit LED na větev jdoucí ze SOURCE do země a je po problémech. I přesto, že se LED nerozsvítí, obvod fungoval dle předpokladů, dioda tam ani být nemusí, je určen obsluze pro kontrolu sepnutí koncového snímače.mosfet_switch

Ultrazvukový měřič vzdálenosti

Koupil jsem jej z DX.com, má označení HC-SR04, hledal jsem návod jak modul zprovoznit a našel odkaz na stránku http://www.raspberrypi-spy.co.uk/2012/12/ultrasonic-distance-measurement-using-python-part-1/. S malou obměnou vše funguje. Místo děliče napětí jsem zařadil N-kanál FET BS107, dle návodu na připojení I/O expanderu portů. Ten oddělí napěťové hladiny 3,3 V pro RPi a 5 V pro modul. Jako pull-up resistor jsem použil včera omylem koupený 330 kOhm, ale funguje to i s 10 k potenciometrem protaženým přes krajní svorky. To je vše, program ze stránky raspberry-spy funguje bez potíží.

ADS-B na RTL SDR

Přesunul jsem RTL krabičku z testování na osobním počítači do mého Debianího serveru. Na Debianu mají příznivci softwarového radia balíky gnuradio už předkompilované, zkompilovat jsem ovladače z v4l podle článku na wiki.ubuntu.cz, věnujícímu se právě těmto televizním krabičkám a dále zkompiloval balíčky rtl_sdr, mezi nimiž je i rtl_tcp. Můžu tedy ovládat softwarové rádio přes síť z jiného počítače například mým oblíbeným gqrx. Protože zajímavým zdrojem radiem přenášených dat jsou letadla, pátral jsem, jak si udělat vlastní flightradar24.com s pomocí rtl_adsb a dlouho nic nenašel. Až na blogu G4VXE jsem narazil na referenci k programu dump1090 a ten funguje velmi pěkně. Dokonce chytám data v pásmu 1 GHz stále na tu všesměrovku pro 137 MHz, nicméně dosah není nijak závratný. Postup je snadný:

git clone git://github.com/antirez/dump1090.git

cd dump1090
make

A spustíme v pěkném přehledovém zobrazení příkazem

./dump1090 --interactive

Získám informace z letadel do vzdálenosti 200 km, spíše však méně, víc uvidím s lépe naladěnou anténou.

TVheadend na starém počítači

Na starém Pentiu III mi běží skladiště fotek, které se mi již nevejdou do notebooku, na diskovém poli. Druhá hlavní služba, kterou poskytuje je stream televizních kanálů do domácí sítě. V minulosti jsem používal vlastní řešení v podobě getstream, ale obsluha byla zbytečně složitá a nahrávání pomocí gnome-dvb-daemon stálo za houby. Pak jsem objevil XBMC a TVheadend. Vše funguje, jen bych rád, aby se počítač sám zapínal před nahráváním nočních pořadů. Bohužel suspend na něm nefunguje korektně, zato má v BIOS Wake on Alarm. S tím už jsem jednou koketoval a nefungovalo to, protože bylo třeba zaškrtnou i Wake on PME, pak se rozběhlo i WoL. Teď skriptování.

Tady máme pěkný návod, který se ale věnuje uspávání, to se mě nehodí, zkoušel jsem různé nejapné nápady a nakonec se poučil na odkazu k MythTV z výše zmíněné stránky a utvořil hybrid mezi oběma. Nuže:

nano /etc/init.d/wakeup pojmenujte libovolně nekonfliktně, já jsem to ponechal, abych nemusel měnit celý skript.

Vložte řádky:

#!/bin/sh

### BEGIN INIT INFO
# Provides: wakeup
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop: 0 1 6
# Short-Description: Start NTP daemon
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin

. /lib/lsb/init-functions

NAME=wakeup

case $1 in
	stop)
		# Make it wakeup from ethernet
		ethtool -s eth0 wol g
		echo PCI0 >/proc/acpi/wakeup
		echo 1 > /timer

		# bootup system 60 sec. before timer
		safe_margin=240

		# modyfy if different location for tvheadend dvr/log path
		cd ~hts/.hts/tvheadend/dvr/log

		######################

		start_date=0
		stop_date=0

		current_date=`date +%s`

		for i in $( ls ); do
			tmp_start=`cat $i | grep '"start":' | cut -f 2 -d " " | cut -f 1 -d ","`
			tmp_stop=`cat $i | grep '"stop":' | cut -f 2 -d " " | cut -f 1 -d ","`

			# check for outdated timer
			if [ $((tmp_stop)) -gt $((current_date)) -a $((tmp_start)) -gt $((current_date)) ]; then

				# take lower value (tmp_start or start_date)
				if [ $((start_date)) -eq 0 -o $((tmp_start)) -lt $((start_date)) ]; then
					start_date=$tmp_start
					stop_date=$tmp_stop
				fi
			fi
		done

		wake_date=$((start_date-safe_margin))

		echo $start_date >> /timer
		echo $wake_date >> /timer

		# set up waleup alarm
		if [ $((start_date)) -ne 0 ]; then
			echo 2 >> /timer
			echo 0 > /sys/class/rtc/rtc0/wakealarm
			echo $wake_date > /sys/class/rtc/rtc0/wakealarm
		fi
		exit 0
	;;
	*)
		echo "Usage: $0 {stop}"
		exit 2
	;;
esac

Spusťte: chmod 755 /etc/init.d/wakeup a update-rc.d wakeup defaults
Nyní se před každým vypnutím a restartem (a přihlášení jediného uživatele, když jsem tam dal i jedničku) zapíše do nvram čas probuzení počítače.

Po každé nahrávce má počítač nařízeno vypnout, ale to někdy jistě nebude rozumné, pojistíme se:
nano ~hts/shutdown.sh
Obsahuje znovu ten ověřovací kód, lehce pozměněný konec:

#!/bin/sh

# Here you can invoke your script for recording's post-processing
#exec <your_script.sh>

sleep 20
safe_margin=240
cd ~hts/.hts/tvheadend/dvr/log

######################

start_date=0
stop_date=0

current_date=`date +%s`

for i in $( ls ); do
	tmp_start=`cat $i | grep '"start":' | cut -f 2 -d " " | cut -f 1 -d ","`
	tmp_stop=`cat $i | grep '"stop":' | cut -f 2 -d " " | cut -f 1 -d ","`

        # check for recording now
        if [ $((tmp_stop)) -gt $((current_date)) -a $((tmp_start)) -lt $((current_date)) ]; then
                exit 0
        fi

	# check for outdated timer
	if [ $((tmp_stop)) -gt $((current_date)) -a $((tmp_start)) -gt $((current_date)) ]; then

		# take lower value (tmp_start or start_date)
		if [ $((start_date)) -eq 0 -o $((tmp_start)) -lt $((start_date)) ]; then
			start_date=$tmp_start
			stop_date=$tmp_stop
		fi
	fi
done

wake_date=$((start_date-safe_margin))
idle=$((current_date+1200))

# >0 is when no recording is planned, wake_date is sub zero value
if [ $((wake_date)) -lt $((idle)) - $((wake_date)) -gt 0]; then
        exit 0
fi

#sudo /usr/sbin/pm-suspend &
sudo /sbin/shutdown -h now &

Tento soubor musí být spustitelný uživatelem hts, resp. tím, který spouští tvheadend a zařadíte jej ve webovém rozhraní do postprocessingu. Zajistí, že se počítač nevypne, pokud se právě nahrává, či další nahrávka bude začínat do dvaceti minut.