Direkt zum Hauptbereich

Wait till hdmi is connected before starting kodi... and poll tvheadend for activity before shutdown

What?

 If you run tvheadend and kodi on one device you want to wait to start kodi until hdmi is conected,

Why?

kodi has bugs that cause issues when started before connected to hdmi

  • Sometimes it crashes
  • Sometimes it stops to render text in menu

How to work arround?

Wait for HDMI and timeout if no recording is upcomming

#!/bin/bash

# This scripts wait <TIMEOUTINSECONDS> till hdmi connection got established or shutdown if no tvheadend recording is running, upcomming or some stream is consumed, served by tvheaden
# Howto https://debianisttoll.blogspot.com/2021/07/wait-till-hdmi-is-connected-before.html
# Source https://gist.githubusercontent.com/stesee/9ebb11cc2db6a58e6b42afb2d74e7e7b/raw/7327e42950c449c1153ebf546f60ee1d8e3d0d0d/waitTillHdmiConnected.sh

# install stuff before using this script
#   sudo apt install libxml-xpath-perl curl

# setup systemconfiguration
#   allow current user to execute shutdown and waskup - add this line to /etc/sudoers - replace "username" with your username
#       username ALL = NOPASSWD: /usr/bin/setwakeup.sh, /usr/sbin/pm-suspend

# configure your settings

WARNINGTIMEOUTINSECONDS=800
TIMEOUTINSECONDS=900
POLLINGDURATIONINSECONDS=5
LOGFILE="$HOME/waitTillHdmiConnected.log"

# configure your tvheadend settings
URL=localhost
PORT=9981
USERNAME=kodi
PASSWORD=kodi
# Time this script will wait without shutting down for a planned recording
TIMEBEFORENEXTRECORDINMINUTES=20

#set start conditions, is this some bash magic? seems like SECONDS will be increased by every second without coding anything
SECONDS=0

triggerTimeoutActions(){
    #set next wakeup time
    OUTPUT=$(curl --anyauth -u $USERNAME:$PASSWORD --silent --max-time 5 "http://$URL:$PORT/status.xml")
    NEXTRECORD=$(echo "$OUTPUT| xpath -q -e "/currentload/recordings[1]/recording/next/text()")
    NEXTRECORD_TICKS=$(date '+%s' -d "+ $NEXTRECORD minutes")
    
    #TODO Add sanity check value and fall back to someting reasonable... e.g. 24h in future
    FAILSAFE=`date '+%s' -d '+ 24 hours'`
    #TODO Add sanity check value and fall back to someting reasonable... e.g. 24h in future
    
    sudo /usr/bin/setwakeup.sh "$NEXTRECORD_TICKS"
    
    # e.g. shutdown the system
    echo "Shuting down next wakup set to $NEXTRECORD_TICKS" | tee -a "$LOGFILE"
    echo $(date && echo "shutting realy down") | tee -a "$LOGFILE"
    shutdown +1 | tee -a "$LOGFILE"
    exit
}

triggerHdmiConnectedActions(){
    # e.g. set some overscan hack
    #xrandr --output HDMI-3 --transform 1.05,0,-34,0,1.05,-20,0,0,1
    # e.g. start kodi
    kodi &
    exit
}

isHdmiPortConnected(){
    if xrandr 2> /dev/null | grep -q 'HDMI-[0-9] connected'then
        echo "HDMI connected" | tee -a "$LOGFILE"
        return 0
    else
        echo "HDMI not connected waiting $POLLINGDURATIONINSECONDS seconds" | tee -a "$LOGFILE"
        return 1
    fi
}

isTvheadenRecordingActive(){
    # check if tvheadend is responding
    OUTPUT=$(curl --anyauth -u $USERNAME:$PASSWORD --silent --max-time 5 "http://$URL:$PORT/status.xml")
    if [ -z "$OUTPUT" ]; then
        echo "Tvheadend is not responding" | tee -a "$LOGFILE"
        return 1
    else
        # check if tvheadend is recording
        if echo "$OUTPUT" | grep "<status>Recording</status>" >/dev/null; then
            echo "Tvheadend is recording" | tee -a "$LOGFILE"
            return 0
        fi
        
        # check if tvheadend recording is upcomming in TIMEBEFORENEXTRECORDINMINUTES
        if echo "$OUTPUT" | grep "<next>" >/dev/null; then
            echo "Tvheadend waiting for an upcomming recording" | tee -a "$LOGFILE"
            echo "$OUTPUT"
            NEXTRECORD=$(echo "$OUTPUT| xpath -q -e "/currentload/recordings[1]/recording/next/text()")
            echo Next recording starts in "$NEXTRECORD" minutes | tee -a "$LOGFILE"
            if [ "$TIMEBEFORENEXTRECORDINMINUTES" -gt "$NEXTRECORD" ]; then
                echo "Tvheadend will start to record in short time" | tee -a "$LOGFILE"
                return 0
            fi
        fi
        
        # check if tvheadend rcording serving some stream
        if echo "$OUTPUT" | grep "<subscriptions>" >/dev/null; then
            SUBS=$(echo "$OUTPUT| xpath -q -e "/currentload/subscriptions/text()")
            if [ "$SUBS" -gt 1 ]; then
                echo "$SUBS subscriptions running" | tee -a "$LOGFILE"
                return 0
                elif [ "$SUBS" -eq 0 ]; then
                echo "No subscriptions" | tee -a "$LOGFILE"
            fi
        fi
    fi
    return 1
}

echo $(date && echo "Start polling") | tee -a "$LOGFILE"

while true
do
    if isHdmiPortConnected; then
        triggerHdmiConnectedActions
    fi
    
    duration=$SECONDS
    
    if isTvheadenRecordingActive; then
        SECONDS=0
    else
        echo "$(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed since first poll." | tee -a "$LOGFILE"
        if [ "$duration" -gt "$WARNINGTIMEOUTINSECONDS" ]; then
            echo "Warning: HDMI connection timeout is about to occure!" | tee -a "$LOGFILE"
            if [ "$duration" -gt "$TIMEOUTINSECONDS" ]; then
                triggerTimeoutActions
            fi
        fi
    fi
    
    sleep $POLLINGDURATIONINSECONDS
done

Allow shutdown

Add this to /etc/sudoers

htpc ALL = NOPASSWD: /usr/bin/setwakeup.sh, /usr/sbin/pm-suspend 

To lookhup how to create /usr/bin/setwakeup.sh see https://debianisttoll.blogspot.com/2021/06/send-to-sleep-and-wake-up-tvheadend.html



Kommentare

Beliebte Posts aus diesem Blog

Open DRM-Free Unencrypted DVB-T2 Tv and Radio in Austria

Most things in Austria terestical TV got encrypted since DVB-T got shut down, but there are still three TV channels and three Radio Channels unencrypted. I had some hard time to find out how to get it working using linux... and non existing documentation of the sender did not help. Howerver... if you have use for detailed channel setup arround vienna, take a look: Tvheadend seems to lack channel search support using DVB-T2, but puzzeling every value together works fine: Mux A-WNB Channel Frequency: 498000000 Bandwitdh: 8MHz Constellation; QAM/16 Mux B2 Channel Frequency: 578000000 Bandwitdh: 8MHz Constellation; QAM/16 Unstable Twin Tuner I am using some twin tuner. That was not supported on older kernel version, but is now supported on current versions. Great? nope. The system/tvheadend gets unstable if two tuner are enabled running for weeks. After disabling one tuner, tvheadend runs reliable for months. List of unencrypted streams Example stream info tv channel   Surround sound ...

Cleanup your windows machine

still working: Use these lines to get your windows system cleaned up a bit and free your disk from old temporary and backup files: RD %temp%\ /S /Q rd /s /q C:\Windows\ServiceProfiles\NetworkService\AppData\Local\VSEQT\QTController rd %windir%\temp\ /s /q rd C:\TEMP\ /s /q rd C:\Quarantine /s /q rd "%userprofile%\AppData\Local\Temp\"  /s /q del C:\Windows\Installer\.tmp RD /S /Q "%SystemRoot%\Microsoft.NET\Framework\v1.0.3705\Temporary ASP.NET Files\" RD /S /Q "%SystemRoot%\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\" RD /S /Q "%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\" RD /S /Q "%SystemRoot%\Microsoft.NET\Framework\v3.0\Temporary ASP.NET Files\" RD /S /Q "%SystemRoot%\Microsoft.NET\Framework\v3.5\Temporary ASP.NET Files\" RD /S /Q "%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\" RD /S /Q "%userprofile%\AppData\Local\Microso...

pdf to dxf

if you get a cad plan in pdf format you have a problem: Pdf can not be loaded in most cad programs. I used pstoedit to solve this problem. Pstoedit is a free tool to convert pdfs to dxf. What you have to do: Install pstoedit Install ghostscript shot at your pdfs: pstoedit.exe <pdfSource> <dxfOutput> -f dxf thanks to the author of pstoedit! Here is the pstoedit.exe -help output: No output format specified (-f option) and format could not be uniquely deduced from suffix .dxf of output file Available formats :     psf:            .fps:    Flattened PostScript (no curves)     (built-in) -------------------------------------------     ps:            .spsc:    Simplified PostScript with curves     (built-in) -------------------------------------------     debug:         ...