openHAB und Sprachausgabe bei zu lange geöffnetem Fenster

Diesen Beitrag schrieb ich 9 Jahre und 6 Monate zuvor; die nachfolgenden Ausführungen müssen heute weder genau so nach wie vor funktionieren, noch meiner heutigen Meinung entsprechen. Behalte das beim Lesen (und vor allem: beim Nachmachen!) bitte stets im Hinterkopf.

Geschätzte Lesezeit: 2 Minuten

Mein letzter Schluss war, dass ich Sprachausgaben auf dem RaspberryPi vergessen kann – mit speechdispatcher, den tts-Bindings & Co. war das Maschinchen gnadenlos überlastet.

Doch heute Nacht kam mir plötzlich eine Idee, wie ich die Sprachausgabe eben doch realisieren kann: per Google Translate :D Das ist vielleicht ein bisschen gestört, macht aber irrsinnig Spaß – vor allem, wenn man sein openHAB polnisch quasseln oder einen wüst beschimpfen lässt…

Wie es dazu kam

Als Beispiel nehme ich unser Schlafzimmerfenster: es liegt ein Stockwerk höher, und wenn ich lüfte vergesse ich ganz gerne, das Fenster wieder zu schließen. In Folge heizt der Heizkörper (den ich in der Regel auch abzustellen vergesse) ins Nichts, der Raum kühlt aus und schlimmstenfalls setze ich mich ins Auto und fahre los –

Deshalb gibt es an diesem Fenster einen Homematic-Kontakt (HM-Sec-SC-2), der mit einem Heizkörper-Thermostat (HM-CC-RT-DN) verbunden ist: die beiden kommunizieren direkt miteinander, brauchen dazu weder die CCU2 noch openHAB, und geht das Fenster auf, fährt die Heizung herunter; wird das Fenster geschlossen, geht der Heizkörper für zehn Minuten in den Boost (Ventilöffnung 95%). Das Schließen des Fensters ist jedoch nach wie vor mein Part und somit am fehleranfälligsten; im Sinne eines guten Raumklimas lasse ich mich vom System nerven, sobald das Fenster mehr als zehn Minuten geöffnet ist – in diesem Falle fängt openHAB an zu quasseln, an den RaspberryPi habe ich nämlich einen Lautsprecher angeschlossen (eine Isonetta von Isophon, die ich vor vielen Jahren ersteigerte).

Variable auf der CCU2 einrichten

Auf der CCU2 richte ich mir eine Logik-Variable ein, die auf 1 springt, wenn das Fenster zu lange geöffnet ist, und ansonsten den Wert 0 hat. Ich nenne sie ElwSchlafzimmerAlarm. Auf diesem Wert wird mein openHAB-Regelwerk basieren.

Die Programme auf der CCU2

Ist das Fenster mehr als zehn Minuten geöffnet, soll die eben erstellte Variable auf 1 gesetzt werden (Fenster_Alarm_Setzen). Wird es wieder geschlossen, dann soll der Wert auf 0 gesetzt werden (Fenster_Alarm_Löschen). In beiden Fällen muss der geänderte Wert an openHAB publiziert werden! Daher der um zwei Sekunden verzögerte Aufruf ReloadTrigger, der in meinem Setup genau das realisiert. Damit lässt sich schon ganz gut spielen, und theoretisch wäre eine Eskalation auch innerhalb der CCU2 umsetzbar. Ich weiche ab hier jedoch auf openHAB aus.

Das Script zur Sprachausgabe

Das Script ist denkbar simpel: es übergibt den String, der gesprochen werden soll, an die Google-TTS-Adresse und spielt das Ganze per mplayer ab. Diese Vorgehensweise unterliegt gewissen Beschränkungen (Anzahl der Zeichen usw.), aber für unsere Zwecke ist das unerheblich – bei Interesse einfach nach „google tts api“ suchen.

## file: "/home/pi/bin/SagEs.sh"
#!/bin/bash
# Don't forget to chmod +x
 
SagEsPerGoogle()
{
  mplayer -really-quiet -ao alsa "http://translate.google.com/translate_tts?tl=de&q=$*"
}
 
SagEsPerGoogle $*
pi@pelle ~ $ mplayer -ao alsa "http://translate.google.com/translate_tts?tl=pl&q=Jestem z Niemiec"
MPlayer svn r34540 (Raspbian), built with gcc-4.6 (C) 2000-2012 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
 
Playing http://translate.google.com/translate_tts?tl=pl&q=Jestem z Niemiec
.
Resolving translate.google.com for AF_INET...
Connecting to server translate.google.com[173.194.112.194]: 80...
 
Cache size set to 320 KBytes
Cache fill:  0.00% (0 bytes)
 
Audio only file format detected.
==========================================================================
Requested audio codec family [mpg123] (afm=mpg123) not available.
Enable it at compilation.
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
libavcodec version 53.35.0 (external)
Mismatching header version 53.32.2
AUDIO: 16000 Hz, 1 ch, floatle, 32.0 kbit/6.25% (ratio: 4000->64000)
Selected audio codec: [ffmp3float] afm: ffmpeg (FFmpeg MPEG layer-3 audio)
==========================================================================
AO: [alsa] 16000Hz 1ch floatle (4 bytes per sample)
Video: no video
Starting playback...
A:   0.7 (00.7) of 1.0 (01.0)  1.2% 0%

Die target language lässt sich natürlich einstellen. Es kann jedoch sein, dass beim Aufruf Warnungen erscheinen, die mit dem LIRC support zu tun haben; Abhilfe schafft dann in /home/pi/.mplayer/config der Eintrag lirc=no.

Die items in openHAB

Das File fenster.items.

Group:Contact:OR(OPEN, CLOSED) Fenster
  "Offene Fenster [(%d)]"
  <contact>
  (All)

Contact ELW_Schlafzimmer_Fenster
  "Fenster ELW Schlafzimmer [MAP(de.map):%s]"
  <contact>
  (ELW_Schlafzimmer, Fenster)
  { homematic="address=LEQ0409512, channel=1, parameter=STATE" }
  
Switch  CCU2_ELW_Schlafzimmer_Fenster_Alarm
  "Fenster ELW Schlafzimmer zu lange geöffnet [%s]"
  <contact>
  (ELW_Schlafzimmer,Fenster)
  { homematic="variable=ElwSchlafzimmerAlarm" }

Die rules in openHAB

Das File fenster.rules.

import org.openhab.core.library.types.*

val String SagEs = "/home/pi/bin/SagEs.sh "
val string SZF_Offen = "Das Fenster im Schlafzimmer ist schon zu lange offen"

rule "Fenster zu lange offen"
  when
    Item CCU2_ELW_Schlafzimmer_Fenster_Alarm received update ON
  then
    pushNotification("Schlafzimmer ELW", "Mach das Fenster zu!")
    var String Sprachausgabe = SagEs + SZF_Offen
    executeCommandLine(Sprachausgabe)
end

Na, und das ist auch schon der ganze Zauber; parallel zur Sprachausgabe lasse ich mir in diesem Setup eine Prowl-Nachricht aufs iPhone schicken, muss man natürlich nicht. Have fun beim Experimentieren ;-)

Eure Gedanken zu „openHAB und Sprachausgabe bei zu lange geöffnetem Fenster“

Ich freue mich über jeden Kommentar, es sei denn, er ist blöd. Deshalb behalte ich mir auch vor, die richtig blöden kurzerhand wieder zu löschen. Die Kommentarfunktion ist über GitHub realisiert, weshalb ihr euch zunächst dort einloggen und „utterances“ bestätigen müsst. Die Kommentare selbst werden im Issue-Tracker und mit dem Label „✨💬✨ comment“ erfasst – jeder Blogartikel ist ein eigenes Issue. Über GitHub könnt ihr eure Kommentare somit jederzeit bearbeiten oder löschen.