Mit Raspberry Pi Nabaztag/Karotz ersetzen
Dass ich mich gerne mit den Nabaztag/Karotz-Hasen beschäftigte, hatten wir ja bereits hier. Vor einigen Wochen grub ich das Thema aus den Tiefen meiner Elektronikschränke wieder auf und reaktivierte die Hasen und den dazugehörigen Raspberry Pi-Server. So nett sich der Nabaztag durch NabaztagLives und der Karotz durch OpenKarotz auch benutzen lassen, waren mir die Möglichkeiten nach der anfänglichen Begeisterung nun doch etwas zu limitiert. Doch was ist die Alternative? Der Raspberry Pi selbst!Erst einmal: was erwarte ich von so einem "Haustier" bei der täglichen Begleitung und was hätte ich gerne zusätzlich zu den vorhandenen Funktionen?
Eine Bestandsaufnahme:
- das Ding sollte über den Tag verteilt zufallsgeneriert blöde Sprüche loslassen
- das Ding sollte mich informieren, sobald auf irgendeinem meiner E-Mail-Konten eine neue E-Mail reinkommt
- das Ding sollte jeweils zur vollen Stunde die Uhrzeit vorlesen
- das Ding sollte einmal stündlich das aktuelle Wetter und die Prognose für die nächsten Tage vorlesen
- das Ding sollte auf Wunsch/zufällig Musik abspielen
- das Ding sollte Zeit-/Ereignis gesteuert News vorlesen
- das Ding sollte die anstehenden Geburtstage (aktueller/kommender Tag) vorlesen
- das Ding sollte nachts selbständig die Klappe halten um niemanden zu wecken
- das Ding sollte knuffig und „Blink-Blink“ aussehen
- das Ding sollte stabil und wartungsfrei laufen
Zusammengefasst wären die technisch gesehen folgenden drei groben Themenblöcke:
- Sound-Files abspielen (Sprüche und Musik)
- Zugriffe auf externe Dienste/Daten (E-Mails, Geburtstage Wetter, News)
- Umgebungskonfiguration (Ruhemodus)
- Text-to-Speech (TTL, zum Vorlesen von Zeugs)
Die meisten dieser Aufgaben könnte ein Raspberry Pi ja eigentlich direkt übernehmen. Also wurde schnell ein RasPi wie folgt konfiguriert:
- die Linux-Distribution Raspbian installiert
- Omxplayer zur wiedergabe von MP3-Dateien installiert
- PHP (inkl. Openssl- und Imap-Erweiterungen auf der CLI installiert (alternativ zu PHP kann man natürlich auch jede andere Skriptsprache nehmen. Ich bevorzuge einfach PHP gewohnheitsbedingt. )
- TTL-Engines eSpeak und Festival installiert (mal zum Vergleichen)
- alle Soundfiles (MP3s) der Nabaztag/Karotz auf dem RasPi abgelegt (die Soundfiles könne direkt per FTP von den Hasen gezogen werden. Ich habe im Web irgendwann eine bessere Version der ganzen Soundfiles gefunden – quasi digital remastered mit klarerem Klang und mit weniger Rauschen im Hintergrund)
- Lautsprecher und Mikro (hierzu in einem späteren Artikel mehr) angeschlossen
- Zwischen dem Stromadapter und dem RasPi eine kleine Powerbank (5000 mA) dazwischen gesteckt (günstigste unterbrechungsfreie Stromversorgung - USV )
Anschließend wurden für die einzelnen Aufgaben PHP-Skripte geschrieben und per Crontab eingebunden. Einige Beispiele hierzu:
Einträge Crontab
*/10 * * * * php /home/pi/automated/time.php
*/3 * * * * php /home/pi/automated/imap_checker.php
E-Mail-Benachrichtigung mit der Abfrage des IMAP-Servers
<?php
$currentHour = date("H");
$currentMinute = date("i");
// beachte Ruhezeiten
if ((int)$currentHour < 22 && (int)$currentHour > 6) {
$unreadedMailsNew = 0;
// prüfe Anzahl der E-Mails am IMAP-Server
$mbox = imap_open("{SERVER: PORT/imap/ssl/novalidate-cert}INBOX", "USER", "PASSWORD");
$check = imap_mailboxmsginfo($mbox);
$unreadedMailsNew = $check->Unread;
// persistiere die aktuelle Anzahl der E-Mails (zum Vergleich bei der nächsten Anfrage)
$unreadedMailsOld = file_get_contents('/home/pi/automated/imap_checker_last_count');
file_put_contents('/home/pi/automated/imap_checker_last_count', $unreadedMailsNew);
$newMails = $unreadedMailsNew - $unreadedMailsOld;
imap_close($mbox);
// wenn die neue Anzahl höher ist als die alte, gebe die Notification aus
if ($newMails > 0) {
echo exec("omxplayer /home/pi/automated/sounds/AOL_Sie_haben_Post.mp3");
}
}
Zeit und Wetter vorlesen, Sprüche los lassen
<?php
// Optionen
// Pfade zu den Soundfiles
$pathSoundFilesClock = '/var/www/vl/broad_de/config/clock/de/';
$pathSoundFilesSurprice = '/var/www/vl/broad_de/config/surprise/de/';
$pathSoundFilesWeather = '/var/www/vl/broad_de/config/weather/de/';
// URL zum Wetterservice
$weatherUrl = 'http://api.openweathermap.org/data/2.5/weather?id=ID_DES_ORTES&APPID=API_KEY&units=metric';
$currentHour = date("H");
$currentMinute = date("i");
// beachte Ruhezeiten
if ((int)$currentHour < 22 && (int)$currentHour > 6) {
// lese die Uhrzeit vor, alle 5 Minuten vor eine vollen Stunde
if ((int)$currentMinute >= 0 && (int)$currentMinute <= 5) {
$path = $pathSoundFilesClock . $currentHour . '/';
$foundSoundFiles = array();
$dh = opendir($path);
while (false !== ($filename = readdir($dh))) {
if ($filename != '.' && $filename != '..') {
$foundSoundFiles[] = $filename;
}
}
play($pathSoundFilesClock . 'signature.mp3');
$selectedSoundFileId = array_rand($foundSoundFiles);
play($path . $foundSoundFiles[$selectedSoundFileId]);
play($pathSoundFilesClock . 'signature.mp3');
}
// lass einen zufallgenerierten Spruch alle 5 Minuten zwischen 10 Minuten und 50 Minuten einer Stunde
if ((int)$currentMinute > 5 && (int)$currentMinute < 50) {
$foundSoundFiles = array();
$dh = opendir($pathSoundFilesSurprice);
while (false !== ($filename = readdir($dh))) {
if ($filename != '.' && $filename != '..') {
$foundSoundFiles[] = $filename;
}
}
$selectedSoundFileId = array_rand($foundSoundFiles);
play($pathSoundFilesSurprice . $foundSoundFiles[$selectedSoundFileId]);
}
// sage das Wetter zur jeder Stunde um 55 Minuten
if ((int)$currentMinute >= 50) {
$weatherData = json_decode(file_get_contents($weatherUrl));
play($pathSoundFilesWeather . 'signature.mp3');
play($pathSoundFilesWeather . 'temp/' . (int)$weatherData->main->temp . '.mp3');
play($pathSoundFilesWeather . 'degree.mp3');
play($pathSoundFilesWeather . 'signature.mp3');
}
}
function play($path) {
echo exec("omxplayer --vol -100 {$path}");
}
Fazit:
Der erste Schritt ist getan, der RasPi läuft nun stabil und erledigt Strom-sparend einige mehr oder weniger sinnvolle Zeit-gesteuerte und Audiodatei-basiere Aufgaben. Und das Beste am Setting ist, das System ist sowohl Hard- wie auch Software-seitig höchst erweiterbar. Mehr dazu und das optische Upgrade des Ganzen, folgt in weiteren Artikeln.