Ho terminato in questi giorni il debug della nuova versione dello script che consente alla mia VDR di accendersi e spegnersi in funzione dei timers programmati.
Lo script è derivato dallo script preparato da Lukkino, NVRAM WakeUP - Autoaccensione del PC
Lo script è adatto per versioni del kernel successive allo 2.6.22. Da questo punto in poi la gestione dell'allarme passa da /proc/acpi/alarm a /sys/class/rtc/rtc0/wakealarm. Le info dettagliate le ho raccolte da questo ottimo how-to dei nostri cugini di Mythtv Mythtv - ACPI Wakeup.
Le funzionalità sono:
- all'avvio capire se l'accensione di VDR è stata determinata da un timer o eseguita dall'utente;
- al termine della registrazione spegnere VDR se l'accensione era stata determinata da un timer;
- forzare lo spegnimento di VDR al termine di una registrazione;
- bloccare lo spegnimento automatico di VDR (avviso via osd 30 sec prima dell'evento);
- una semplice funzione di log per il debuging, personalizzabile.
Per utilizzare ACPIWakeUp.sh, per esempio mettetelo in /usr/local/sbin.
Cambiate i valori di configurazione all'inizio dello script per adattarli al vostro ambiente.
ACPIWakeUp.sh
Codice: Seleziona tutto
#!/bin/bash
# ACPIWAkeUp.sh v0.0.2
# by Stef, 06.03.2010
# derivato da
# NVRamWakeUp v0.0.4
# By Lukkino, 12/05/2007
# HISTORY
# versione 0.0.1 10.09.08 per kernel precedenti < 2.6.22
# versione 0.0.2 06.03.10 per kernel => 2.6.22
#
#
#set -x
######### Variabili ############
# File timers.conf di VDR
VDR_TIMERS="/vdr/config/timers.conf"
# Directory configurazione di ACPI-wakeup
DIR_CONF="/vdr/config/plugins/acpi-wakeup"
# file registrazioni
FILE_REC="acpi.rec"
# file tipo di programmazione
FILE_TYPE="acpi.type"
# file ora di programmazione
FILE_TIMER="acpi.timer"
# file allarme
FILE_ALARM="acpi.alarm"
# file log
FILE_LOG="acpi-wakeup.log"
#######################################
#######################################
# Funzione di creazione dei file di base
function init_acpi()
{
#mkdir $DIR_CONF
echo -n "0" > $DIR_CONF/$FILE_REC
echo -n "manual" > $DIR_CONF/$FILE_TYPE
echo -n "0" > $DIR_CONF/$FILE_TIMER
touch $DIR_CONF/$FILE_LOG
echo -n "0" > $DIR_CONF/$FILE_ALARM
}
#######################################
################################
# Funzione di avvio della vdrbox
function start_vdr()
{
# Calcolo la differenza tra il timer impostato e l'ora corrente
let DIFF=${TIMER}-${NOW}
logw "differenza calcolata $DIFF"
# Controllo se il momento di accensione è compreso tra 3 min prima e 3 min
# dopo il timer impostato e se acpi.alarm è 1
# allora imposto il tipo di programmazione su "auto"
if [ "$DIFF" -lt "181" ] && [ "$DIFF" -gt "-181" ] && [ $ALARM -eq "1" ]
then
TYPE="auto"
logw "accensione automatica"
else
TYPE="manual"
logw "accensione manuale"
fi
# Scrivo il tipo di programmazione nel file
echo -n "$TYPE" > $DIR_CONF/$FILE_TYPE
}
#######################################
######################################
# Funzione di spegnimento della vdrbox
function stop_vdr()
{
if [[ -s $VDR_TIMERS ]]
then
logw "file timers.conf contiene dei timers"
#attendo che vdr cancelli un eventuale timer
sleep 5
# Se il numero di registrazioni attive è maggiore di 0, esco dal programma
if [ "$RECS" -gt "0" ]
then
#controllo se vdr è in regitrazione
RESULT=$(/usr/local/sbin/svdrpsend.pl NEXT REL | awk '/^250/ { print $3 }')
if [[ $RESULT <1 ]]; then
logw "registrazione in corso - stop bloccato"
return
else
# errore in acpi.rec (>0). non ci sono registrazioni in corso
$RECS = 0
fi
fi
# epoch-timers
T1="`sort -t : -k 3,4 $VDR_TIMERS | head -n 1 `"
T2="`echo "$T1" | awk '{ split( $0, VALUE, ":" ); print VALUE[3] " " substr( VALUE[4], 1, 2 ) ":" substr( VALUE[4], 3, 2 ); }'`"
TIMER_PROX=`date -d "$T2" +%s`
logw "1. variabile TIMER_PROX $TIMER_PROX"
echo -n "$TIMER_PROX" > $DIR_CONF/$FILE_TIMER
TIMER_PLUS_15="`date --date="+15 min" +%s`"
# Se il timer ricavato ha una differenza di tempo minore di 15 min
# rispetto all'ora corrente non spengo la macchina
# e attendo
if [ "$TIMER_PROX" -lt "$TIMER_PLUS_15" ]
then
/usr/local/sbin/svdrpsend.pl MESG Prossimo timer tra 15 min, riamago accesa
return
fi
# Programmo la sveglia
# e sottraggo 3 min per consentire al sistema di partire
let "TIMER_PROX -= 180"
echo 0 /sys/class/rtc/rtc0/wakealarm
echo "1" > $DIR_CONF/$FILE_ALARM
echo $TIMER_PROX > /sys/class/rtc/rtc0/wakealarm
logw "2. variabile TIMER_PROX -3 min= $TIMER_PROX"
TMP=`date -d @$TIMER_PROX +%F" "%T`
logw "3. variabile TIMER_PROX -3 min= $TMP"
logw "allarme impostato `cat /sys/class/rtc/rtc0/wakealarm`"
TMP=`cat /sys/class/rtc/rtc0/wakealarm`
TMP1=`date -d @$TMP +%F" "%T`
logw "allarme impostato $TMP1"
# Scrivo il valore del timer nel file ora di programmazione
echo -n "$TIMER" > $DIR_CONF/$FILE_TIMER
else
logw "file timers.conf NON contiene dei timers"
echo "0" > $DIR_CONF/$FILE_ALARM
fi
# Scrivo il valore "manual" nel file tipo di programmazione
TYPE="manual"
echo -n "$TYPE" > $DIR_CONF/$FILE_TYPE
MPL=`ps aux | grep mplayer | wc --lines`
logw "nessun processo mplayer attivo (" $MPL
if [ "$MPL" -le 2 ]
then
# Spengo la vdrbox
logw "ho spento la vdrbox"
shutdown -h now
else
# qualcuno sta usando mplayer
logw "non ho spento vdr, mplayer attivo"
fi
}
#####################################
#####################################
# Funzione inizio registrazione
function before_recording()
{
# Incremento la variabile RECS e scrivo su file
let RECS=${RECS}+1
echo -n "$RECS" > $DIR_CONF/$FILE_REC
}
#####################################
#####################################
# Funzione fine registrazione
function after_recording()
{
logw "Funzione fine registrazione"
# Decremento la variabile RECS e scrivo su file
let RECS=${RECS}-1
if [ "$RECS" -lt 0 ]
then
$RECS = 0
fi
echo -n "$RECS" > $DIR_CONF/$FILE_REC
# Se la vdrbox si è avviata in "auto" eseguo la funzione stop_vdr
if [ "$TYPE" == "auto" ]
then
logw "vdrbox avviata modo auto. eseguo stop_vdr"
#avviso l'utente che sto per spegnere la vdr
#gli suggerisco di bloccare l'auto spegnimento con il comando
/usr/local/sbin/svdrpsend.pl MESG Spegnimento automatico di VDR
sleep 5
/usr/local/sbin/svdrpsend.pl MESG Annullare con il comando - Bloccare auto-off -
sleep 30
if [ "$TYPE" == "auto" ]
then
stop_vdr
fi
fi
}
#####################################
#####################################
#funzione di log
function logw()
{
echo "`date +"%D %T"` "$1" "$2"" >> $DIR_CONF/$FILE_LOG
}
#####################################
########### Inizio programma ##########
# Inizializzo il sistema se necessario
if [ ! -e "$DIR_CONF" ]
then
init_acpi
fi
if [ ! -e "$DIR_CONF/$FILE_REC" ]
then
init_acpi
fi
if [ ! -e "$DIR_CONF/$FILE_TYPE" ]
then
init_acpi
fi
if [ ! -e "$DIR_CONF/$FILE_TIMER" ]
then
init_acpi
fi
if [ ! -e "$DIR_CONF/$FILE_LOG" ]
then
init_acpi
fi
if [ ! -e "$DIR_CONF/$FILE_ALARM" ]
then
init_acpi
fi
# Ora corrente del sistema
NOW="`date +%s`"
# Numero di registrazioni attive
RECS="`cat $DIR_CONF/$FILE_REC`"
# Tipo di avvio della vdrbox
TYPE="`cat $DIR_CONF/$FILE_TYPE`"
# Ora di avvio programmata
TIMER="`cat $DIR_CONF/$FILE_TIMER`"
# Opzioni di avvio
logw "comando vdr $1"
case "$1" in
start)
# Funzione eseguita all'avvio della vdrbox
start_vdr
;;
stop)
# Funzione eseguita allo spegnimento della vdrbox
stop_vdr
;;
before)
# Funzione eseguita all'inizio di una registrazione programmata
before_recording
;;
after)
# Funzione eseguita al termine di una registrazione programmata
after_recording
;;
esac
######################################
exit 0
/usr/local/sbin/ACPIWAkeUp.sh start
/usr/local/sbin/vdr -w 10 -l 3 -c /vdr/config -v /vdr/video/ -L /usr/local/lib/vdr-plugins \
--lirc --shutdown='/usr/local/sbin/ACPIWAkeUp.sh stop' --record='/usr/local/sbin/ACPIWAkeUp.sh' \
-Pstreamdev-server -Pcontrol -P'mplayer -S mplayer' -Pwirbelscan -Ploadepg -Pfemon -Ptext2skin -Pdevstatus
Per aggiungere le funzioni attiva e blocca auto-off dal menu comandi è necessario creare 2 piccoli script. Li potete mettere dove preferite, io li ho messi sempre in /user/local/sbin
active_auto-off.sh
Codice: Seleziona tutto
#!/bin/bash
#active_auto-off.sh
# Attivare auto-off al termine della registrazione
echo "auto" > /vdr/config/plugins/acpi-wakeup/acpi.type
RESULT=`/vdr/config/plugins/acpi-wakeup/acpi.type`
if [ "$RESULT" == "auto" ]
then
/usr/local/sbin/svdrpsend.pl MESG VDR auto-off attivato
else
/usr/local/sbin/svdrpsend.pl MESG VDR auto-off non riuscito
fi
Codice: Seleziona tutto
#!/bin/bash
#block_auto-off.sh
# Blocca lo spegnimento automatico di VDR
echo "manual" > /vdr/config/plugins/acpi-wakeup/acpi.type
RESULT=`/vdr/config/plugins/acpi-wakeup/acpi.type`
if [ "$RESULT" == "manual" ]
then
/usr/local/sbin/svdrpsend.pl MESG VDR auto-off bloccato
else
/usr/local/sbin/svdrpsend.pl MESG VDR blocco di auto-off non riuscito
fi
Codice: Seleziona tutto
Attiva auto-off : printf /usr/local/sbin/active_auto-off.sh | at now
Blocca auto-off : printf /usr/local/sbin/block_auto-off.sh | at now
Vi può succedere che i messaggi abbiano una durata estrememante ridotta. Il tempo di visualizzazione è impostato nel menu Opzioni --> OSD --> Durata del messaggio (s) .
Ringrazio calorosamente Lukkino per lo script originale, e tutti coloro che seminano il mondo con i loro script
Enjoy
edit dom 7.03.2010: ho corretto un'imperfezione che mi era sfuggita. Sono passate solo 10 ore spero di non aver fatto danni
Bibliografia:
NVRAM WakeUP - Autoaccensione del PC
MythTV-ACPI Wakeup
Svdrp-isrecord traduzione "Aufnahme läuft" la registrazione corre/gira, "keine Aufnahme" nessuna registrazione
SVDRP - VDR Wiki