{"id":178,"date":"2013-02-21T23:12:28","date_gmt":"2013-02-21T22:12:28","guid":{"rendered":"http:\/\/honza.paws.cz\/?p=178"},"modified":"2013-04-02T13:27:27","modified_gmt":"2013-04-02T12:27:27","slug":"automatizovany-prijem-snimku-noaa","status":"publish","type":"post","link":"http:\/\/honza.paws.cz\/?p=178","title":{"rendered":"Automatizovan\u00fd p\u0159\u00edjem sn\u00edmk\u016f NOAA"},"content":{"rendered":"<p style=\"text-align: justify;\">Nejprve byla ant\u00e9na QFH, pak softwarov\u00e9 r\u00e1dio s \u010dipsetem Realtek RTL2832U, pak byl software na ovl\u00e1d\u00e1n\u00ed r\u00e1dia zvan\u00fd <em>gqrx<\/em>, kter\u00fd je zalo\u017een\u00fd na gnuradio a pak tu byl u\u017eivatel, kter\u00fd musel \u010dekat, a\u017e p\u0159ilet\u00ed satelit, \u010dekat \u010dtvrt hodiny a sehnat n\u011bkolik p\u0159\u00edkaz\u016f na vytvo\u0159en\u00ed obr\u00e1zku pomoc\u00ed programu wxtoimg. U\u017eivatele to p\u0159estalo bavit a tak si napsal skript, kter\u00fd s\u00e1m sestav\u00ed obr\u00e1zek a nahraje jej na web server. Pak ale musel napsat skript, kter\u00fd ty obr\u00e1zky se\u0159ad\u00ed podle data po\u0159\u00edzen\u00ed. Jen\u017ee ani to mu moc nepomohlo a nezbylo nic jin\u00e9ho, ne\u017e p\u0159em\u00fd\u0161let jak automatizovat \u00fapln\u011b v\u0161echno. Prvn\u00ed probl\u00e9m bylo sehnat \u010das p\u0159\u00edletu dru\u017eice na viditelnou \u010d\u00e1st oblohy. Z GPredict se n\u011bjak viditeln\u011b vydolovat nedal. D\u00edky dobr\u00e9 du\u0161i, kter\u00e1 implementovala GPredict do jazyka PHP a zve\u0159ejnila k\u00f3d se dala prvn\u00ed \u010d\u00e1st od\u0161krtnout. Zdrojov\u00e9 k\u00f3dy st\u00e1hnete <a href=\"https:\/\/github.com\/shupp\/Predict\">zde<\/a>. Predict.php v\u0161echno za\u0159izuje, pro va\u0161e pot\u0159eby vyu\u017eijte souboru visible_passes.php ve slo\u017ece examples. Tento soubor si jen poupravte dle sv\u00fdch pot\u0159eb. J\u00e1 pot\u0159eboval \u010das p\u0159\u00edletu a dobu, po kterou satelit z\u016fst\u00e1v\u00e1 na viditeln\u00e9 \u010d\u00e1sti oblohy. Tento skript neb\u011b\u017e\u00ed na webserveru, je vol\u00e1n cronem v\u017edy po 4. hodin\u011b rann\u00ed, kdy za\u010d\u00edn\u00e1 prvn\u00ed \u010d\u00e1st p\u0159elet\u016f viditeln\u00fdch od n\u00e1s a zkontroluje p\u0159elety na dal\u0161\u00edch 24 hodin. Zat\u00edm b\u011b\u017e\u00ed na klasick\u00e9m PC, b\u011bh na Raspberry Pi je\u0161t\u011b vyzkou\u0161\u00edm. Pokud skript neb\u011b\u017e\u00ed, mo\u017en\u00e1 jsem ud\u011blal chybu zde p\u0159i \u00faprav\u00e1ch, ale je t\u00e9m\u011b\u0159 samovysv\u011btluj\u00edc\u00ed, tak\u017ee nen\u00ed probl\u00e9m jej opravit\/p\u0159ed\u011blat podle sv\u00fdch pot\u0159eb.<\/p>\n<p><strong>noaa.php<\/strong><\/p>\n<pre>\r\n&lt;?php\r\n\/**\r\n * This is an example of how to use Predict for determining upcoming visible\r\n * passes of the International Space Station.  Please read the inline comments\r\n * for details.\r\n *\r\n * Run this from the root checkout, not from examples, or the include paths\r\n * will not work.\r\n *\/\r\n\r\nrequire_once 'Predict.php';\r\nrequire_once 'Predict\/Sat.php';\r\nrequire_once 'Predict\/QTH.php';\r\nrequire_once 'Predict\/Time.php';\r\nrequire_once 'Predict\/TLE.php';\r\n\r\nfunction sortByAos($a, $b) {\r\n   if ($a[2] == $b[2]) {\r\n        return 0;\r\n    }\r\n    return ($a[2] &lt; $b[2]) ? -1 : 1;\r\n}\r\n\/\/ Track execution time of this script\r\n$start = microtime(true);\r\n\r\n\/\/ The observer or groundstation is called QTH in ham radio terms\r\n$predict  = new Predict();\r\n$qth      = new Predict_QTH();\r\n$qth-&gt;alt = 300; \/\/ Altitude in meters\r\n\r\n\/\/ Munich, example east of the meridian\r\n$qth-&gt;lat = 48.1505; \/\/ Lat North\r\n$qth-&gt;lon = 11.5809; \/\/ Lon East\r\n\r\n\/\/ The iss.tle file is the first 3 lines of\r\n\/\/ http:\/\/celestrak.com\/NORAD\/elements\/stations.txt\r\n\/\/ Make sure you update this content, it goes out of date within a day or two\r\nexec(\"wget http:\/\/celestrak.com\/NORAD\/elements\/weather.txt -O ~USERNAME\/.wxtoimg\/weather.txt\");\r\n$tleFile = file('http:\/\/celestrak.com\/NORAD\/elements\/noaa.txt'); \/\/ Load up the NOAA from celestrak\r\n$indexes = array(19, 18, 15);\r\n$list = array();\r\n\r\nforeach ($indexes as $index){\r\n\t$index *= 3;  \/\/3 rows for satellite\r\n\t$tle     = new Predict_TLE(substr($tleFile[$index], 5, 2), $tleFile[$index+1], $tleFile[$index+2]); \/\/ Instantiate it\r\n\t$sat     = new Predict_Sat($tle); \/\/ Load up the satellite data\r\n\t$now     = Predict_Time::get_current_daynum(); \/\/ get the current time as Julian Date (daynum)\r\n\r\n\t\/\/ You can modify some preferences in Predict(), the defaults are below\r\n\t\/\/\r\n\t $predict-&gt;minEle     = 0; \/\/ Minimum elevation for a pass\r\n\t $predict-&gt;timeRes    = 5; \/\/ Pass details: time resolution in seconds\r\n\t $predict-&gt;numEntries = 10; \/\/ Pass details: number of entries per pass\r\n\t $predict-&gt;threshold  = 90; \/\/ Twilight threshold (sun must be at this lat or lower)\r\n\r\n\t\/\/ Get the passes and filter visible only, takes about 4 seconds for 10 days\r\n\t$results  = $predict-&gt;get_passes($sat, $qth, $now, 1);\r\n\t$filtered = $predict-&gt;filterVisiblePasses($results);\r\n\r\n\t$zone   = 'Europe\/Berlin'; \/\/ Pacific time zone\r\n\t$format = 'H:i mdy';         \/\/ Time format from PHP's date() function\r\n\t$epoch  = 'U';\r\n\r\n\t\/\/ Format the output similar to the heavens-above.com website\r\n\t\/\/echo \"&lt;tr&gt;&lt;td&gt;Sat\\t&lt;td&gt;AOS\\t&lt;td&gt;ELE\\t&lt;td&gt;LOS\\t&lt;\/tr&gt;\";\r\n\tforeach ($filtered as $pass) {\r\n\t    if (round($pass-&gt;max_el) &lt; 17){\r\n\t       continue;\r\n\t    }\r\n\t    $list[] = array($pass-&gt;satname, Predict_Time::daynum2readable($pass-&gt;aos, $zone, $format), Predict_Time::daynum2readable($pass-&gt;aos, $zone, $epoch), Predict_Time::daynum2readable($pass-&gt;los, $zone, $epoch), round($pass-&gt;max_el));\r\n\t}\r\n}\r\n\r\n\/\/delete the pass with worse max elevation from overlaping ones\r\nusort($list, 'sortByAos');\r\n$i=0;\r\nwhile ($i &lt; (sizeOf($list)-1)){\r\n\tif ($list[$i][3] &gt;= $list[$i+1][2]) {\r\n\t\tif ($list[$i][4] &gt; $list[$i+1][4]){\r\n\t\t\tarray_splice($list, $i+1, 1);\r\n\t\t} else {\r\n\t\t\tarray_splice($list, $i, 1);\r\n\t\t}\t\t\r\n\t\tcontinue;\r\n\t}\r\n\t$i++;\r\n}\r\n\r\n\/\/echo $wake_date &gt; \/sys\/class\/rtc\/rtc0\/wakealarm\r\n\r\nforeach ($list as $pass) {\r\n    $cmd = \"echo \\\"cd \/home\/USERNAME && .\/apt \".$pass[0]. \" \";\r\n    $cmd .= $pass[3] - $pass[2] - 60;\r\n    $cmd .= \"\\\" | at -m \";\r\n    $cmd .= \"\\\"\". $pass[1] . \" +1 minute\\\"\\n\";\r\n    \r\n    exec($cmd);\r\n    \/\/echo $cmd;\r\n}\r\n\/\/echo \"Execution time:  \" . number_format((microtime(true) - $start) * 1000, 2) . \"ms\\n\"; \r\nexit;\r\n<\/pre>\n<p style=\"text-align: justify;\">Zde vid\u00edte, \u017ee <em>php<\/em> skript st\u00e1hnete TLE pro sebe a <em>wxtoimg<\/em>, <em>Predict<\/em> vypo\u010d\u00edt\u00e1 pot\u0159ebn\u00e9 \u010dasy, kter\u00e9 php zap\u00ed\u0161e do p\u0159\u00edkazu <em>at<\/em>. <em>At<\/em> spust\u00ed mnou p\u0159ipraven\u00fd skript, kter\u00fd zaznamen\u00e1 vys\u00edl\u00e1n\u00ed ze satelitu a p\u0159echroupe z\u00e1znam do podoby obr\u00e1zku. Ten nahraje na webovou prezentaci meteostanice pomoc\u00ed n\u00e1stroje <em>curl<\/em>. Nezapome\u0148te upravit <strong>username<\/strong>.<br \/>\nBash skript p\u016fvodn\u011b zpracov\u00e1val nahr\u00e1vky z gqrx, z t\u00e9to doby poch\u00e1z\u00ed ta skv\u011bl\u00e1 konstrukce na \u010dten\u00ed datov\u00e9ho raz\u00edtka na za\u010d\u00e1tku skriptu. Vyu\u017e\u00edv\u00e1 programu rtl_fm z bal\u00ed\u010dku od <a href=\"http:\/\/sdr.osmocom.org\/trac\/wiki\/rtl-sdr#Software\">osmocom<\/a>. D\u00e1le tam najdete sox (t\u0159eba nainstalovat) pro pr\u00e1ci se zvukov\u00fdm z\u00e1znamem a samoz\u0159ejm\u011b <a href=\"http:\/\/www.wxtoimg.com\/downloads\/\">WXtotImg<\/a> (tak\u00e9 doinstalovat).<\/p>\n<p><strong>apt.sh<\/strong><\/p>\n<pre>\r\n#!\/bin\/bash\r\n\r\nbandwidth=150k\r\nlogin='LOGIN:PASSWORD'\r\n\r\n#Freq +- 0.006 ?\r\ncase $1 in\r\n15)freq=137.54M;;\r\n17)freq=137.5M;;\r\n18)freq=137.9065M;;\r\n19)freq=137.092M;;\r\n*)exit 1;;\r\nesac\r\n\r\nfilename=`date -u +%Y%m%d-%H%M%S`.s16\r\ntimeout $2 \/usr\/local\/bin\/rtl_fm -f $freq -s $bandwidth > $filename\r\n#timeout $2 \/usr\/local\/bin\/rtl_sdr $filename.bin -f $freq -s 1.8e6\r\nif [ $? -ne 124 ]; then\r\n\trm $filename\r\n\texit 1\r\nfi\r\n\r\nif [ ! -f $filename ]; then\r\n\techo \"Soubor $filename neexistuje.\"\r\n\texit 2\r\nfi\r\n\r\n#set variables \r\ndate=`echo $filename | cut -d- -f1`\r\ntime=`echo $filename | cut -d- -f2 | cut -d. -f1`\r\nyear=`echo $date | cut -c1-4`\r\nmonth=`echo $date | cut -c5-6`\r\nday=`echo $date | cut -c7-8`\r\nhour=`echo $time | cut -c1-2`\r\nminute=`echo $time | cut -c3-4`\r\nsecond=`echo $time | cut -c5-6`\r\n\r\noutput=$year$month$day$hour$minute$second.wav\r\nhvc=noaa$1-$year$month$day-$hour$minute$second-hvc.png\r\nno=noaa$1-$year$month$day-$hour$minute$second-no.png\r\nmcir=noaa$1-$year$month$day-$hour$minute$second-mcir.png\r\ntmp=noaatmp.wav\r\nmap=map.png\r\nthumbnail=noaa.png\r\n\r\n#QTH\r\nlat=48.1505\r\nlon=11.5809\r\nele=300\r\n#dawn=7\r\n#dusk=17\r\n#day\/night is determined by python script\r\n\r\nsox -r $bandwidth -c 1 -L $filename $tmp\r\nsox $tmp $output rate 11025\r\n\r\ntouch -r $filename $output\r\n\r\n\/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\r\n\r\n\/usr\/local\/bin\/wxtoimg -c -e MCIR -m $map -t \"NOAA $1\" -o $output $mcir\r\n\/usr\/bin\/curl -T $mcir ftp:\/\/ftp.server\/ --user $login\r\n\r\nif [ $? -eq 0 ]; then\r\n\tconvert $mcir -resize 25% $thumbnail\r\n\t\/usr\/bin\/curl -T $thumbnail ftp:\/\/ftp.server\/ --user $login\r\n\t\r\n\t\/usr\/local\/bin\/wxtoimg -c -e NO -m $map -A -t \"NOAA $1\" -o $output $no\r\n\t\/usr\/bin\/curl -T $no ftp:\/\/ftp.server\/ --user $login\r\n\t\r\n\t#hourt=`echo $hour | sed 's\/^0\/\/'`\r\n\tpython .\/sun.py\r\n\tif [ $? -eq 1 ]; then\r\n\t\t\/usr\/local\/bin\/wxtoimg -c -e HVC -m $map -A -K -t \"NOAA $1\" -o $output $hvc\r\n\t\t\/usr\/bin\/curl -T $hvc ftp:\/\/ftp.server\/ --user $login\r\n\t\trm $hvc\r\n\tfi\t\r\n\trm $no $mcir $thumbnail $output\r\nfi\r\n\r\nrm $tmp $filename $map\r\n\r\nexit 0<\/pre>\n<p>Pro ur\u010den\u00ed zda je den \u010di noc pou\u017e\u00edv\u00e1m ne zcela p\u0159esn\u00fd v\u00fdpo\u010det m\u00edstn\u00edho hv\u011bzdn\u00e9ho \u010dasu a jeho porovn\u00e1n\u00ed vypo\u010dten\u00e9ho \u010dasu v\u00fdchodu a z\u00e1padu Slunce, op\u011bt hv\u011bzdn\u00e9ho. To v\u0161e kv\u016fli senzoru 4, kter\u00fd se odes\u00edl\u00e1 a\u017e hodinu po v\u00fdchodu Slunce, zde je je\u0161t\u011b prostor pro vylep\u0161en\u00ed.<br \/>\n<strong>sun.py<\/strong><\/p>\n<pre>\r\n#!\/usr\/bin\/python\r\n\r\nfrom datetime import datetime\r\nimport time\r\nimport math\r\n\r\ndef days_between(d1, d2):\r\n    return (d2 - d1).days + (d2 - d1).seconds\/84600.0\r\n    \r\ndef echo_time(t):\r\n    print (math.modf(t)[1])+math.ceil((math.modf(t)[0])*60)\/100\r\n\r\n#QTH\r\nlat = math.radians(48.1505)\r\nlon = math.radians(11.5809)\r\nele = 300\r\nutcoffset = 1\r\n\r\n#Twilight\r\nnow = datetime.utcnow()\r\nequinox = datetime.strptime(\"03-20\", \"%m-%d\")\r\nequinox = equinox.replace(now.year)\r\n\r\nif days_between(equinox, now) < 0:\r\n\tequinox = equinox.replace(now.year - 1)\r\n\r\nd = days_between(equinox, now)\r\nlamb = math.radians(360.0\/365.2422 * d)\r\nprint \"Lambda=\", math.degrees(lamb), \"d=\", d\r\n\r\nbeta = 0.0\r\nepsilon = math.radians(23.5)\r\n\r\ndelta = math.asin(math.sin(lamb)*math.sin(epsilon))\r\nalfa = math.acos(math.cos(lamb)\/math.sqrt(1-math.pow(math.sin(lamb)*math.sin(epsilon),2)))\r\nif math.sin(lamb)*math.cos(epsilon)\/math.sqrt(1-math.pow(math.sin(lamb)*math.sin(epsilon),2)) < 0:\r\n\talfa = 2*math.pi - alfa\r\n\r\nts = math.acos(-math.tan(lat)*math.tan(delta))\r\nif ts>math.pi:\r\n\tt1 = ts\r\n\tt2 = 2.0*math.pi - ts\t\r\nelse:\r\n\tt1 = 2.0*math.pi - ts\r\n\tt2 = ts\r\n\t\r\nt1 = math.degrees(t1)\r\nt2 = math.degrees(t2)\r\nwhile t1 > 360:\r\n    t1 -= 360\r\nwhile t2 > 360:\r\n    t2 -= 360\r\nprint alfa\r\nriselst = t1+math.degrees(alfa)\r\ndawnlst = t2+math.degrees(alfa)\r\nwhile riselst > 360:\r\n    riselst -= 360\r\nwhile dawnlst > 360:\r\n    dawnlst -= 360\r\n\r\nprint \"rise in angle\",\r\necho_time(t1\/15.0)\r\nprint \"in LST\",\r\necho_time(riselst\/15.0)\r\nprint \"set in angle\",\r\necho_time(t2\/15.0)\r\nprint \"in LST\",\r\necho_time(dawnlst\/15.0)\r\n\t\r\n#JD\r\nr=now.year\r\nm=now.month\r\nd=now.day + (now.hour+(now.minute+now.second\/60)\/60)\/24\r\nif m > 2:\r\n    r = r - 1\r\n    m = m + 12\r\nJD = 1720994.5 + 365.25*r + r\/400.0 +- r\/100.0 + 30.6*(m+1) + d + 2.0\r\nprint \"JD=\",JD\r\n\r\n#JD best\r\nunix = time.time()\r\nJ = 2440587.5 + unix\/86400.0\r\nT = (J - 2451545.0) \/ 36525.0\r\nTT = 64.184 + 59.0 * T - 51.2 * math.pow(T,2) - 67.1 * math.pow(T,3) - 16.4 * math.pow(T,4)\r\nJTT = J + TT \/ 86400.0\r\nd = JTT - 2451545.0\r\nprint \"JD=\",JTT\r\nprint d\r\n\r\n# Sidereal time\r\nJ2k = datetime.strptime(\"2000-01-01 12:00 UTC\", \"%Y-%m-%d %H:%M %Z\")\r\n#d = days_between(J2k, now)\r\nprint d\r\n\r\nGMST = 280.46061837 + 360.98564736629 * d\r\nwhile GMST > 360:\r\n    GMST -= 360\r\nLMST = 280.46061837 + 360.98564736629 * d + math.degrees(lon)\r\nwhile LMST > 360:\r\n    LMST -= 360\r\nprint \"GMST\",\r\necho_time(GMST\/15.0)\r\nprint \"LMST\",\r\necho_time(LMST\/15.0)\r\n\r\nif LMST > riselst or LMST < dawnlst:\r\n    print \"Day\"\r\n    exit(1)\r\nelse:\r\n    print \"Night\"\r\n    exit(2)\r\n\r\nt = GMST + math.degrees(lon) + 1.00273790935*(now.hour+now.minute\/60 - 1)\r\nprint \"t=\",\r\necho_time(t\/15.0)\r\n\r\nh = math.degrees(math.asin(math.sin(delta)*math.sin(lat)+math.cos(delta)*math.cos(math.radians(LMST))*math.cos(lat)))\r\nprint \"h=\", h, \"d=\",\r\necho_time(math.degrees(delta))\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Nejprve byla ant\u00e9na QFH, pak softwarov\u00e9 r\u00e1dio s \u010dipsetem Realtek RTL2832U, pak byl software na ovl\u00e1d\u00e1n\u00ed r\u00e1dia zvan\u00fd gqrx, kter\u00fd je zalo\u017een\u00fd na gnuradio a pak tu byl u\u017eivatel, kter\u00fd musel \u010dekat, a\u017e p\u0159ilet\u00ed satelit, \u010dekat \u010dtvrt hodiny a sehnat n\u011bkolik p\u0159\u00edkaz\u016f na vytvo\u0159en\u00ed obr\u00e1zku pomoc\u00ed programu wxtoimg. U\u017eivatele to p\u0159estalo bavit a tak si [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/posts\/178"}],"collection":[{"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=178"}],"version-history":[{"count":39,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/posts\/178\/revisions"}],"predecessor-version":[{"id":308,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/posts\/178\/revisions\/308"}],"wp:attachment":[{"href":"http:\/\/honza.paws.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=178"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}