Raspberry Pi – RingO – Türklingel

Da es zu teuer langweilig einfach wäre eine fertige Türsprechstelle zu kaufen, könnte man auf die Idee kommen selbst eine zu basteln.

  • Hardware
    • Raspberry Pi (2/3 Model B) ~40€
    • Micro SD Karte (8GB) ~5€
    • Raspberry Cam (nach Wahl) 10-30€
    • USB Soundkarte(z.B. diese) ~10€
    • Lautsprecher/Mikrofon (vielleicht das) ~25€
    • Ein Gehäuse (vielleicht eines von denen) ~20€
    • Einen Taster (vielleicht diesen) ~10€

Wer jetzt schon sagt „Aber um das gleiche Geld bekomme ich das als Komplettgerät!“ ist hier eindeutig falsch.

  • Funktionen
    • Tätigt Anrufe über einen SIP Account
    • Kann angerufen werden
    • Dient als IP Kamera
    • Kann durch Scripting einfach erweitert werden (z.B Schaltausgänge)

ALs Grundlage dient ein Raspberry OS Lite Image, das man unter Windows z.B. mit dem Balena Etcher auf die Micro SD Karte schreibt.

Bevor man die Karte in den Raspberry Pi steckt, legt man am besten gleich auf der „boot“ Partition (erstes unter Windows sichtbares Laufwerk auf der Karte) ein leeres File „ssh“ an. Das ermöglich den Zugriff auf das Gerät ohne physische Konsole (z.B. mit PuTTY).

Hier in einem „One shot“ Script zusammengefasst die Installation

#!/bin/bash

### Konfiguration

base="/opt/Ring-O"
zielrufnummer="666"
gpio="2"

stille="/home/pi/silence.wav"
siprufnummer="777"
sipproxy="my.sip.proxy"
sipuser="benutzername"
sippassword="passwort"

giturlmjpgstreamer="https://github.com/jacksonliam/mjpg-streamer.git"
giturlgpiowatch="https://github.com/larsks/gpio-watch.git"


### Ordnerstruktur anlegen
sudo mkdir -p $base
sudo chown -R pi:pi $base
mkdir -p $base/mjpg-streamer/www
mkdir -p $base/gpio-watch/scripts
mkdir -p $base/scripts
mkdir -p /home/pi/.baresip


### Software installieren
sudo apt install alsa-base baresip curl gcc g++ cmake libjpeg8-dev git

mkdir -p /home/pi/src
cd /home/pi/src
git clone $giturlmjpgstreamer
git clone $giturlgpiowatch

cd /home/pi/src/mjpg-streamer/mjpg-streamer-experimental
make
cp /home/pi/src/mjpg-streamer/mjpg-streamer-experimental/mjpg_streamer $base/mjpg-streamer/
cp /home/pi/src/mjpg-streamer/mjpg-streamer-experimental/input_raspicam.so $base/mjpg-streamer/
cp /home/pi/src/mjpg-streamer/mjpg-streamer-experimental/output_http.so $base/mjpg-streamer/

cd /home/pi/src/gpio-watch
make
cp /home/pi/src/gpio-watch/gpio-watch $base/gpio-watch/


### 5 Sekunden Stille aufnehmen
arecord -q -r8000 -fU8 -twav -c1 -d5 $stille


### Sounds für baresip ersetzen (keine Signalisierung an der Sprechstelle)
sudo mv /usr/share/baresip/ /usr/share/baresip.dist/
sudo mkdir -p /usr/share/baresip
sudo cp $stille /usr/share/baresip/busy.wav
sudo cp $stille /usr/share/baresip/callwaiting.wav
sudo cp $stille /usr/share/baresip/message.wav
sudo cp $stille /usr/share/baresip/notfound.wav
sudo cp $stille /usr/share/baresip/ring.wav
sudo cp $stille /usr/share/baresip/ringback.wav
sudo cp /usr/share/baresip.dist/logo.png /usr/share/baresip/
sudo cp /usr/share/baresip.dist/error.wav /usr/share/baresip/

## Systemkonfiguration anpassen
sudo touch /etc/modprobe.d/alsa-base.conf
echo "options snd_usb_audio index=0
options snd_bcm2835 index=1
options snd slots=snd-usb-audio,snd-bcm2835" | sudo tee /etc/modprobe.d/alsa-base.conf

echo "pcm.!default {
  type asym
  playback.pcm {
    type plug
    slave.pcm \"output\"
  }
  capture.pcm {
    type plug
    slave.pcm \"input\"
  }
}

pcm.output {
  type hw
  card 0
}

pcm.input {
  type hw
  card 0
}
" > /home/pi/.asoundrc


### Statische Scripts und HTML erstellen
echo "<html>
  <head>
    <title>Tuerglocke</title>
  </head>
  <body>
    <center>
      <img src="./?action=stream" />
    </center>
  </body>
</html>" > $base/mjpg-streamer/www/index.html

# Startscript gpio-watch
echo "#!/bin/bash
$base/gpio-watch/gpio-watch -s $base/gpio-watch/scripts -e switch 2 &" > $base/gpio-watch/start.sh
chmod +x $base/gpio-watch/start.sh

# Startscript mjpg-streamer
echo "#!/bin/bash
export LD_LIBRARY_PATH=\"$base/mjpg-streamer\"
$base/mjpg-streamer/mjpg_streamer -o \"output_http.so -n -p 8001 -w $base/mjpg-streamer/www\" -i \"input_raspicam.so -fps 15 -x 1280 -y 720\"" > $base/mjpg-streamer/start.sh
chmod +x $base/mjpg-streamer/start.sh

# Actionscript für Türklingel
echo "#!/bin/bash
/usr/bin/curl -s -o /dev/null http://localhost:8000/?d$zielrufnummer
/usr/bin/curl -s -o /dev/shm/tuere.jpg http://localhost:8001/?action=snapshot" > $base/scripts/doorbell-action.sh
chmod +x $base/scripts/doorbell-action.sh
ln -s $base/scripts/doorbell-action.sh $base/gpio-watch/scripts/$gpio

# SIP Account
echo "<sip:$siprufnummer@$sipproxy>;auth_user=$sipuser;auth_pass=$sippassword;stunserver=stun:stun4.l.google.com:19302;answermode=auto" > /home/pi/.baresip/accounts


# Lazy Startup über rc.local ...
sudo cp /etc/rc.local /etc/rc.local.dist
sudo touch /etc/rc.local
echo "#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will \"exit 0\" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Run gpio-watch
su pi -c \"$base/gpio-watch/start.sh\"

# Run baresip daemon
su pi -c \"/usr/bin/baresip -d\"

# Run mjpg-streamer
su pi -c \"$base/mjpg-streamer/start.sh\"


# Print the IP address
_IP=\$(hostname -I) || true
if [ \"\$_IP\" ]; then
  printf \"My IP address is %s\n\" \"\$_IP\"
fi

exit 0
" | sudo tee /etc/rc.local
sudo chmod +x /etc/rc.local

Nacharbeiten, die noch nicht im Script erfasst sind

  • nach dem ersten Start von baresip in /home/pi/.baresip/config die auskommentierte Zeile „module httpd.so“ aktiveren.
  • über „sudo raspi-config“ die Kamera aktivieren
  • Die Soundfiles ersetzen – das funktioniert nicht, weil ursprünglich kein Mikrophon vorhanden
stille="/home/pi/silence.wav"

### 5 Sekunden Stille aufnehmen
arecord -q -r8000 -fU8 -twav -c1 -d5 $stille

### Sounds für baresip ersetzen (keine Signalisierung an der Sprechstelle)
sudo mv /usr/share/baresip/ /usr/share/baresip.dist/
sudo mkdir -p /usr/share/baresip
sudo cp $stille /usr/share/baresip/busy.wav
sudo cp $stille /usr/share/baresip/callwaiting.wav
sudo cp $stille /usr/share/baresip/message.wav
sudo cp $stille /usr/share/baresip/notfound.wav
sudo cp $stille /usr/share/baresip/ring.wav
sudo cp $stille /usr/share/baresip/ringback.wav
sudo cp /usr/share/baresip.dist/logo.png /usr/share/baresip/
sudo cp /usr/share/baresip.dist/error.wav /usr/share/baresip/
Author: Peter