HowTo: CCU Sprachausgabe auf Linux-Rechner

Nutzung von XML RPC, Remote Script, JSON RPC, XMLAPI

Moderator: Co-Administratoren

Antworten
Schlawina
Beiträge: 10
Registriert: 01.03.2013, 13:53

HowTo: CCU Sprachausgabe auf Linux-Rechner

Beitrag von Schlawina » 01.03.2013, 16:21

Hi!

Bei mir läuft ein Linux-Rechner im Netz. Also lasse ich mir das Log der CCU in dessen syslog schicken.
Dann hatte ich die Idee, dass man ja einen Logeintrag künstlich erzeugen und am Linux-Rechner verarbeiten könnte.
Es funktioniert! Eine Zeile Script reicht aus und das gewünschte wird gesprochen.

Achtung: Das ist eine Bastelanleitung, keine voll funktionsfähige Lösung die man einfach einspielt! Falsche Einträge können den Linux-Rechner ernsthaft beschädigen. Daher bitte unbedingt nur mit ausreichendem Vorwissen anwenden.

So gehts:

0) am Linux-Rechner (mint maya): erforderlich: espeak (eventuell zusätzlich mbrola für ordentliche stimmen), rsyslog
auf der CCU empfohlen: CUx-Daemon

1) Einrichten des Log-Forward an den syslog-server:
auf der CCU: Einstellungen/Zentralen-Wartung/Fehlerprotokoll: Syslog-Server Adresse: 10.0.0.41 (der Linux Rechner)
Es ist egal, was geloggt wird. kann auch alles deaktiviert sein. Das Beispiel geht dann trotzdem noch.

2) Linux: syslog anpassen:
in der /etc/rsyslog.conf udp aktivieren

Code: Alles auswählen

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514  

$RepeatedMsgReduction off   #(wenn man öfter mal das selbe schickt. das war bei mir standard auf on)
empfohlen (und von mir umgesetzt) wurde noch folgendes:

Code: Alles auswählen

#$PrivDropToUser syslog
#$PrivDropToGroup syslog
Die Zeilen soll man auskommentieren. Ob es wirkt weiss ich nicht. Einfach selber ausprobieren.

nach einem Service-restart sollte bereits das CCU-Log im syslog des Linux-Rechners auftauchen
eventuell muss noch die Firewall angepasst werden.
Notfalls gibt es zum Thema "homematic syslog server" Hilfe im Forum oder bei Google

3) User-Syslog-conf anpassen: (bei mir ist das die /etc/rsyslog.d/50-default.conf)

zuerst werden einige Variablen angelegt.
Eine für das tägliche Logging aller Nachrichten und 2 für die Spezialnachrichten
Dann wird alles von der HM in ein eigenes Logfile (und nicht mehr in syslog) geschrieben
Zusätzlich werden Nachrichten die den Text "Sprich: !" enthalten in ein eigenes Logfile geschrieben und zuletzt wird das script hallo.sh aufgerufen und der komplette text der message als Parameter an das script übergeben.
Am Schluss noch ein Befehl, dass keine weitere Bearbeitung zu erfolgen hat

Code: Alles auswählen

# logging von Homematic messages
$template DynFile,"/var/log/homematic/%$year%%$month%%$day%.log"
$template DYNmessages,"var/log/homematic/messages.log"
$template eText,"%msg%"
:fromhost-ip, isequal, "10.0.0.81" ?DynFile
:msg, contains, "Sprich: !" ?DYNmessages
:msg, contains, "Sprich: !" ^/home/Username/hallo.sh;eText
:fromhost-ip, isequal, "10.0.0.81" ~
(ja, ich weiss, "Sprich: !" wird auch verarbeitet wenn es von einem anderen Host kommt. Aber was solls)

4) Script erstellen:
in /home/Username ein Script "hallo.sh"anlegen (nicht vergessen:ausführbar machen ;))

in $1 steht der logtext. das vordere Stück muss entfernt werden da dort ja "Sprich :" drin steht.
dann wird auf den User umgeschalten da der alsaplayer im root nicht so gut läuft und espeak wird aufgerufen.
die ( ... &) sorgt dafür, dass es als eigener asynchroner task aufgerufen wird und der syslog nicht wartet.

Am besten erst mal auf der shell mit espeak so lange spielen bis es gut geht und dann in das script übernehmen
am Mint zB liefert espeak massig fehlermeldungen ohne --stdout|paplay
wer schnell ein ergebnis will kann es auch erst mal ohne mbrola-stimmen probieren.

Code: Alles auswählen

atext=`echo $1 | cut -c 10-999`
hk='"'
su Username -c '( espeak -v mb-de2 -s 150 -g 2 -p 5 '.$hk"$atext"$hk.' --stdout|paplay &)'
Vorsicht mit der Hochkomma-Setzung. Das lässt sich sicher noch optimieren aber so funktioniert es zumindest bei mir.

5) HM-Script
im cuxDaemon ein Gerät einrichten (Gerätetyp 28:System).
wenn es das erste ist hat es aber die Nr CUX2801001 und nicht 002 wie hier bei mir

jetzt reicht folgende Zeile um den Text "das sieht gut aus" am Linux-Rechner zu hören:

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801002:1.CMD_EXEC").State("logger -t Sprich -p user.debug !  das sieht gut aus");
(würde auch mit System.exec funktionieren, ist aber zu riskant wegen der bekannten Probleme)
Konkret wird einfach ein Log-Eintrag erzeugt mit dem Tag "Sprich" und von der CCU wird der an den zentralen Logger übermittelt.

Das war es auch schon. :)

Was, wenn es nicht geht?
Zunächst mal prüfen, ob im Linux-Log was ankommt.
Syslog restarten nicht vergessen. (sudo service rsyslog restart)
dann dem syslog auf die finger sehen: strace -f -p <pid> (die PID hat man vorher beim restart erfahren)
gibts Fehlermeldungen?
wenn 50-default.conf noch nicht angepasst wurde sollten die CCU-Einträge im regulären syslog auftauchen (sudo tail -f /var/log/syslog).
das script 'hallo.sh' mit parameter als root aufrufen. ist etwas zu hören?
auf die Hochkommas achten. ich hab wild einfache, doppelte und schräge gemischt.

und zuletzt: mein Mint hat ständig gemeckert, dass es nicht in die xconsole schreiben kann.
Das hat zu heftigen Verzögerungen bei der Ausgabe mit espeak geführt.
entweder wird xconsole installiert oder in rsyslog-conf und 50-default.conf alle entsprechenden zeilen auskommentieren!

hier noch einige links die mir weitergeholfen haben:
http://www.rsyslog.com/doc/rsyslog_conf_actions.html
http://www.rsyslog.com/doc/rsyslog_conf_templates.html

http://wiki.ubuntuusers.de/eSpeak
http://superuser.com/questions/172043/h ... hell-exits
http://askubuntu.com/questions/108924/m ... r-services

Immer daran denken: Computer machen, was wir ihnen sagen. Man muss es nur richtig sagen :mrgreen:

lg, Manfred

Fehler gefunden? Fragen? Gute Idee die man noch einbauen könnte?
Nur her damit.

ps: Danke an MashTM für die Hardcore-Linux-Ratschläge

Antworten

Zurück zu „Softwareentwicklung von externen Applikationen“