Archiv pro měsíc: Leden 2013

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.

Ahoj všichni!

Vedu si různě několik sporadicky vyplňovaných blogů, jeden o hasičských závodech, jeden o tom co se mi povedlo s Linuxem, abych nezapomněl postup, kterým jsem toho dosáhl. Teď navíc poskytuji mapové podklady — Českou republiku s turistickým značkami a tak bych to rád všechno shrnul na jedno místo. To bude právě zde, na mojí první doméně, kterou jsem si pořídil, protože jsem mohl.

Ráno moudřejší večera: EASYCAP — čtyřkanálový zachytávač videa

Včera dorazila ona zásilka z Číny, ve které byl čtyřkanálový zachytávač videa, nestál moc, na rozdíl od nabídek v naší zemi a tak mi příliš nevadilo pokud by nefungoval, šel jsem do toho i s tímto rizikem. Podle lsusb:

ID 1c88:0007 Somagic, Inc. SMI Grabber (EasyCAP DC60+ clone) (no firmware) [SMI-2021CBE]

jsem vyhledal stránku http://code.google.com/p/easycap-somagic-linux/ na které byly připraveny Debianí balíčky, chvatem jsem je nainstaloval a pak teprve koukal jak to funguje. Musím vzít CD a přes wine spustit Driver/Setup.exe a nainstalovat ovladače pro Windows, z nich somagic-extract-firmware vypreparuje ovladač, somagic-init přepíše identifikátor zařízení a somagic-capture pustí do oběhu video. Nebylo to tak jednoduché.

Kdybych neprováděl tyhle skopičiny v noci ušetřil bych si čas a námahu. Když to nefungovalo z balíků, stáhnul jsem si zdrojáky, to nepomohlo, stahoval jsem různé části kódu z tamního repozitáře a v jednu hodinu ráno práci vzdal. Nakonec stačilo jen gitem stáhnout celý archiv, zajít do tool a user a tam spustit make a díky práci přispěvatelů do kódu hned všechno fungovalo všechno až na tři ze čtyř vstupů, zatím totiž běží zařízení pod identifikací jiného zařízení jen s jedním video vstupem. Takže zapojit do čísla 3 a spustit příkaz:

sudo somagic-capture | mplayer -demuxer rawvideo -rawvideo „pal:format=uyvy:fps=25“ -aspect 4:3 –

Teď se budu snažit o součinnost s programem motion.

Zásilka z Číny

Dnes dorazil balíček z dx.com s hlavní várkou věciček na bastlení. Jmenovitě ultrazvukový měřič vzdálenosti (80 Kč), modul reálného času (90 Kč) a krokový motor s řadičem ULN2003 (90 Kč za sadu). Ceny jsou u nás nesrovnatelně vyšší, pokud se vůbec dá věc sehnat a navíc i kdybych si nechal poslat každou věc zvlášť, neplatil bych za poštovné nic.
Krokový motor nebylo obtížné zprovoznit pomocí návodu ze stránek http://www.raspberrypi-spy.co.uk/2012/07/stepper-motor-control-in-python/

Tamní kód lze použít po upravě připojených GPIO pinů, autor článku uvádí, že připojil IN# postupně k pinům 18, 22, 24, 26. Mě však pin 26 odmítal poslušnost a tak jsem jej nahradil pinem 25, který se kódu také vyskytuje. Okopíruji si pro své potřeby kód původního autora a vymažu pro můj osmikrokový motor nepotřebné části.

#-----------------------------------
# Name: Stepper Motor
#
# Author: matt.hawkins
#
# Created: 11/07/2012
# Copyright: (c) matt.hawkins 2012
#-----------------------------------
#!/usr/bin/env python


# Import required libraries
import time
import RPi.GPIO as GPIO


# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)


# Define GPIO signals to use
# Pins 18,22,24,26
# GPIO24,GPIO25,GPIO8,GPIO7
StepPins = [18,22,24,25]


# Set all pins as output
for pin in StepPins:
  print "Setup pins"
  GPIO.setup(pin,GPIO.OUT)
  GPIO.output(pin, False)


# Define some settings
StepCounter = 0
WaitTime = 0.1


# Define advanced sequence
# as shown in manufacturers datasheet
StepCount = 8
Seq = []
Seq = range(0, StepCount)
Seq[0] = [1,0,0,0]
Seq[1] = [1,1,0,0]
Seq[2] = [0,1,0,0]
Seq[3] = [0,1,1,0]
Seq[4] = [0,0,1,0]
Seq[5] = [0,0,1,1]
Seq[6] = [0,0,0,1]
Seq[7] = [1,0,0,1]


End = 200
Steps = 0


# Start main loop
while Steps<End:


  for pin in range(0, 4):
    xpin = StepPins[pin]
    if Seq[StepCounter][pin]!=0:
      print " Step %i Enable %i" %(StepCounter,xpin)
      GPIO.output(xpin, True)
    else:
      GPIO.output(xpin, False)


  StepCounter += 1
  Steps += 1


  # If we reach the end of the sequence
  # start again
  if (StepCounter==StepCount):
    StepCounter = 0
  if (StepCounter<0):
    StepCounter = StepCount


  # Wait before moving on
  time.sleep(WaitTime)


for pin in StepPins:
 GPIO.output(pin, False)
exit(0)

Na konec přidávám uvolnění pinů, pokud se podle původního návodu ukončí běh stiskem Ctrl+C, motor zůstane viset v jedné poloze a zbytečně se hřeje (možná je to ale na něco dobré). Plánuji však místo Pythonu programovat v C, které jsem kdysi ovládal a teď je možnost znalosti oprášit, Tento program je velice jednoduchý, ale jako první náhled na věc je neocenitelný.

Další zprovozněnou věcí je RTC modul pro udržování přibližného času, i bez přítomnosti internetové přípojky, RPi totiž nemá baterku a po nastartování bere poslední uložený čas, tedy ten při vypnutí.
V obchodě jsem si vybral ten označený nápisy mini_RTC a JY_MCU, obsahuje čip DS1307Z a po hodině ( spíš dvou nebo třech hodinách) hledání a škubání vlasů jsem zjistil, že volba tohoto byla správná. Stačí vzít dráty a připojit konektor VCC na 5V pin (02 nebo 04), začínal jsem totiž s napájením 3,3V a to hodinky prostě sloužit nemohou. GND typicky na zem SDA na SDA pin (03) a SCL na SCL pin (05) pozn.: RPi rev. 2.

Pokud jste ještě se sériovým rozhraním nepracovali budete nejspíš potřebovat nainstalovat nástroje:

sudo aptitude install i2c-tools

Dále si povolit následující moduly:

sudo modprobe i2c-dev
sudo modprobe i2c-bcm2708
sudo modprobe rtc-ds1307

Máte-li revizi 2 jako já pište následující, pro revizi 1 je na konci nula:

sudo i2cdetect -y 1

Vypíše nalezená zařízení, hodinky mají adresu 68, takže spustě následující příkazy:

sudo bash
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
exit

A pokud se zadařilo, následující příkaz sdělí, že v hodinách je binec:

sudo hwclock -r

Pokud máte aktualizovaný čas např. přes ntp, zapiště jej do hodinek:

sudo hwclock -w

Aby se RPi dívalo na čas zbývají ještě drobnosti, do souborů zapsat to co už jsme provedli, tak aby se počítač staral sám:

Do /etc/modules:

sudo nano /etc/modules

Přidat řádky:

i2c-bcm2708
i2c-dev
rtc-1307

Do /etc/rc.local:

sudo nano /etc/rc.local

přidat řádky před řádek exit 0:

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
hwclock -s

A to je vše. Nemám to ale ze své hlavy, všchno jsem našel pěkně úhledně sepsané v návodu od adafruit, který si můžete prohlédnout na adrese: http://learn.adafruit.com/adding-a-real-time-clock-to-raspberry-pi. Tímto jim děkuji. Thanks to adafruit.

Ultrazvukový měřič vzdálenosti si nechám na jindy, nemám totiž ještě sadu odporů. I tak mě ještě čeká zprovoznit čtyřkanálový digitizér videa který mě vyšel na 180 Kč, v ČR pokud je k dostání tak hodně přes 1000 Kč, osobně jsem si v minulosti zakazoval nakupovat čínské výrobky, ale za zdejší ceny bych si prostě nic nekoupil, neměl bych na to.