Tips en Trucs 2021

Multifunctionele timer

Aftelklokjes of timers zijn er in overvloed, maar wat als je een aftelklok nodig hebt die verschillende fasen in een proces moet begeleiden. Met een script heb je die zo in elkaar geknutseld.

Zo stond ik voor het volgende timerprobleem: een behandeling bestaat uit een voorbereidende fase van 8 minuten, gevolgd door de behandeling zelf van 6 sessies van telkens 1 minuut waarbij na elke minuut een handeling moet worden uitgevoerd.

Elke fase moet begeleid worden door visuele en auditieve meldingen. Dit kan zowel in een terminalvenster, maar ook grafisch.

Systeemgeluiden

Elk Desktop systeem heeft standaard een aantal geluiden aan boord. Zo gebruikt een openSUSE Leap 15.2 FreeDesktop en KDE geluiden, die je met de volgende opdrachten kunt beoordelen:

dany@main:~> ogg123 /usr/share/sounds/freedesktop/stereo/*.oga

Geluidsapparaat: PulseAudio Output

Afspelen: /usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga
Ogg-Vorbisstroom: 2 kanaal, 48000 Hz
                                                                                 
Klaar.
Afspelen: /usr/share/sounds/freedesktop/stereo/audio-channel-front-center.oga
Ogg-Vorbisstroom: 1 kanaal, 48000 Hz
                                                                                 
Klaar.
...
Afspelen: /usr/share/sounds/freedesktop/stereo/window-attention.oga
Ogg-Vorbisstroom: 2 kanaal, 44100 Hz
                                                                                 
Klaar.
Afspelen: /usr/share/sounds/freedesktop/stereo/window-question.oga
Ogg-Vorbisstroom: 2 kanaal, 44100 Hz
                                                                                 
Klaar.

En

dany@main:~> ogg123 /usr/share/sounds/Oxygen-*.ogg

Geluidsapparaat: PulseAudio Output

Afspelen: /usr/share/sounds/Oxygen-Im-Cant-Connect.ogg
Ogg-Vorbisstroom: 2 kanaal, 48000 Hz
                                                                                 
Klaar.
Afspelen: /usr/share/sounds/Oxygen-Im-Connection-Lost.ogg
Ogg-Vorbisstroom: 2 kanaal, 48000 Hz
                                                                                 
Klaar.
...
Afspelen: /usr/share/sounds/Oxygen-Window-Shade-Down.ogg
Ogg-Vorbisstroom: 1 kanaal, 44100 Hz
                                                                                 
Klaar.
Afspelen: /usr/share/sounds/Oxygen-Window-Shade-Up.ogg
Ogg-Vorbisstroom: 1 kanaal, 44100 Hz
                                                                                 
Klaar.

Breek deze opdrachten niet af met Ctrl+c, de opdracht ogg123 zal wel stoppen met afspelen, maar niet afsluiten. Je kunt ogg123 wel afsluiten in een ander terminalvenster met de opdracht:

dany@main:~> killall ogg123

Visuele meldingen

Voor de visuele meldingen kan je in KDE gebruik maken van kdialog. Kdialog zorgt voor interactie met een script via grafische vensters en/of meldingen. Handig om scripts toegankelijk te maken voor niet terminal gebruikers.

Soundcheck melding Voorbereiding groeibalk Sessie groeibalk Afronden melding

Het script

Onderstaande script kan je aanmaken met jouw favoriete editor (bijv. Kate) en daarna opslaan in de bin map van jouw Persoonlijke map. De bestandsnaam van het script kan je vrij kiezen (ik koos voor mftimer.sh). De bin map in de Persoonlijke map is de standaardmap voor zelf geschreven programma's en scripts.

Na het opslaan van het script, moet je het script uitvoerbaar maken om het te kunnen starten, met de opdracht:

dany@main:~> chmod +x bin/mftimer.sh
#!/bin/bash
# Multifunctionele timer
#
# Stel de timer in met de volgende variabelen
# Bereken de duur van de voorbereiding in seconden
voorbereiding=$(( 8 * 60 ))
# Aantal behandelingssessies
sessies=6
# Duur sessies in seconden
sessieTijd=60

# Systeeminstellingen
titel="Multifunctionele timer"
# Aftelfunctie
# oproepen met telaf $1 $2
# waarbij $1 de aftelduur in seconden bevat
# waarbij $2 de tekst van de groeibalk bevat
function telaf {
  echo $2
  groeibalk=$(kdialog --title "$titel" --progressbar "$2")
  qdbus-qt5 $groeibalk showCancelButton false
  # Tijd waarbij het aftellen begint in seconden
  startSeconden=$(date +%s)
  # Er is nog geen tijd verlopen
  verlopen=0
  # Hoelang moet het aftellen duren in seconden
  duur=$1
  # Herhaal tot de afteltijd verlopen is
  while [ "$verlopen" -le "$duur" ]; do
    # Overblijvende tijd in minuten en seconden berekenen
    minuten=$(( (duur - verlopen) / 60))
    seconden=$(( (duur - verlopen) % 60))
    # Wacht een halve seconde (niets doen)
    sleep 0.5
    # Plaats op steeds dezelfde regel de nog overblijvende tijd in minuten en seconden (telkens met 2 cijfers)
    printf "  %02d:%02d \r" $minuten $seconden
    qdbus-qt5 $groeibalk Set org.kde.kdialog.ProgressDialog value $(( (verlopen * 100) / duur ))
    # Huidige tijd in seconden
    tijdSeconden=$(date +%s)
    # Bereken de reeds verlopen tijd in seconden
    verlopen=$((tijdSeconden - startSeconden))
  done
  qdbus-qt5 $groeibalk org.kde.kdialog.ProgressDialog.close
}

# Geluid afspelen om de voorbereiding te starten
# En tegelijkertijd een geluidstest uit te voeren (volume e.d.m.)
(ogg123 /usr/share/sounds/Oxygen-Sys-Log-In-Short.ogg >/dev/null 2>&1) &
echo "Soundcheck"
kdialog --title "$titel" --passivepopup "Soundcheck" 5
# Voorbereidende fase met melding, timer en afsluitende alarmsignaal (geluid)
telaf $voorbereiding "Voorbereiding"
(ogg123 /usr/share/sounds/freedesktop/stereo/phone-incoming-call.oga >/dev/null 2>&1) &
# De behandelende fase bestaat uit verschillende sessies die allemaal even lang duren
echo "Start de behandeling"
for (( i=1; i<=sessies; i++)); do
  # Elke sessie heeft een timer en toont op het einde een melding en een geluidssignaal
  telaf $sessieTijd "Sessie $i"
  (ogg123 /usr/share/sounds/freedesktop/stereo/complete.oga >/dev/null 2>&1) &
done
# De behandeling is afgewerkt
kdialog --title "$titel" --passivepopup "De behandeling afronden" 5
echo "De behandeling afronden" 
(ogg123 /usr/share/sounds/Oxygen-Im-Phone-Ring.ogg >/dev/null 2>&1) &

Voer je het script uit in een terminal, dan krijg je naast de auditieve en grafische meldingen ook tekstmeldingen en een aftelklok in de terminal.

dany@main:~> mftimer.sh
Soundcheck
Voorbereiding
Start de behandeling
Sessie 1
Sessie 2
Sessie 3
Sessie 4
Sessie 5
Sessie 6
  00:45
De behandeling afronden

He spreekt voor zich dat je scripts naar hartenlust kunt aanpassen, om het aan ieders wensen te laten voldoen. Succes ermee.