ACPI-wakeup per VDR
Inviato: 06 mar 2010, 23:45
Un saluto alla comunità
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
Nello script che lancia VDR aggiungete queste righe
/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
block_auto-off.sh
Ora inseriamo i comandi in commands.conf
"Attiva auto-off" dice a VDR di spegnersi al termine della registrazione che abbiamo fatto partire, mentre "Blocca auto-off" serve per evitare che VDR si spenga al termine di una registrazione automatica mentre noi ci stiamo guardando la tv. In quest'ultimo caso lo script principale ci avvisa con un messagio che VDR si sta per spegnere e suggerisce di attivare il comando "Blocca auto.off"
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
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