Projekt für Bastelfreunde: Raspberry Wecker gesteuert durch IPS mit Text2Speech

Hallo zusammen,
für alle Bastelfreunde, die ggf. mal was zum bauen suchen möchten, mein Projekt ist so gut wie fertig:

Nachdem es nun so gut wie keine vernünftigen Wecker mit mehreren Weckzeiten zu kaufen gibt, musste was selber gebaut werden: Klar mit IPS gesteuert.

Der Wecker besteht aus:

[ul]
[li]Raspberry
[/li][li]TSOP IR Empfänger
[/li][li]Günstige IR Fernbedienung
[/li][li]Kleine USB Powered Aktiv Boxen
[/li][/ul]

Auf derm Raspberry läuft der mpd player, dieser wird mittels IPS Fernbedient.
Der Infrarot Empfänger nimmt alle Signale auf und schickt Sie an einen ServerSocket in IPS.
Dort kann man dann machen was man will - zb. Music-Stream mittels MPD abspielen, oder auch eine Weckzeit aktivieren.
Die Aktivboxen werden erst aktiviert, wenn was abgespielt wird per GPIO scharfgeschaltet (stromsparen!)
Als kleiner Gag gibt der Raspberry alle Aktionen mittels Google Text2Speech wieder zb. „Weckzeit morgen 6 Uhr 15 aktiviert“

Kommunikation zwischen Raspberry und IPS läuft wie folgt:
Raspi -> IPS: Sendet Kommandos via TCP an IPS (ServerSocket)
IPS->MPD Player (gibt eine gute PHP Klasse die ich in IPS eingebunden habe)
IPS-> RASPI (zb. GPIO öffnen etc): Auf dem Raspi läuft ein kleines Phyton Script, das auf einem Socket horcht und Befehle entgegen nimmt (zb. Boxen An -> GPIO schalten)

Falls jemand Details oder Scripte braucht - einfach melden!

PS:
Was noch denkbar wäre: der Raspberry liest Wetterberichte, Nachrichten etc vor :wink:

Ich bin mit meiner Wecker-Situation derzeit noch nicht ganz zufrieden.

Aber deine Lösung ist „ähnlich“ meinem Aufbau mit dem Samsung-Fernseher im Schlafzimmer:
-Weckzeit wird übers Webfront eingestellt
-IPS->IRTrans schaltet zur Weckzeit den Fernseher ein und…
-geht entweder auf den gewählten TV-/Radiosender oder…
-spielt über die Smart-TV-Funktionen Durchsagen etc.
-ferner werden in Abhängigkeit der Weckzeit die Jalousien gefahren, Badezimmer-Heizung aktiviert etc.

Was mir nicht gefällt:
-Einstellen der Weckzeit über Webfront. Insbesondere Frauchen aber auch ich selber wollen wie beim klassischen Wecker was Einfaches mit 2-3 Hardware-Tasten und Display, dass Uhrzeit/Weckzeit anzeigt.
-Ein Wecker ist für mich zu kritisch, um mich dort auf so komplexe Technik zu verlassen. Ausfälle passieren hier zu Schnell: IPS-Server down, oder mal was am Netzwerk, oder der IRTrans sendet einfach mal den IR-Befehl nicht sauber raus… und schon verpenne ich um 3-6 Stunden. Derzeit läuft immer zusätzlich der iPhone-Wecker als Backup.

Wie genau arbeitest du mit der billigen IR-Fernbedienung? Wie stellst du damit die Weckzeit ein?

Wünschen würde ich mir eigentlich:
a) einen verlässlichen Standalone-Wecker (ganz klassisch), der aber seine eingestellte Weckzeit an IPS übermitteln kann (zwecks Jalousie- und Heizungssteuerung etc.)
b) Die am iPhone- oder Android-Handy eingestellte Weckzeit auszulesen und an IPS zu übermitteln

Für die Weckzeit gehe ich wie folgt vor:
EINFACH FÜR FRAUCHEN:

in IPS habe ich 5 Weckzeiten definiert - Einmalig mit einer bestimmten Uhrzeit.

Die Billigfernbedienung wird dann bedient mit Tasten 1-5 - der RPI schickt ein Trigger an ein Script in IPS.
Dieses Script berechnet anhand der zugehörigen Weckzeit (1-5) die nächste Weckzeit für morgen.

dann muss ich nur im Webfront einmalig - wie bei einem Wecker die Weckzeiten definieren.
Aktivieren geht dann einfach.
Nach Aktivierung mach ich per google TextToSpeech eine ausgabe am Wecker was eingestellt ist.

Hier mal das CodeSchnipsel dazu:

Das Script wird mit RunScriptEx(ScriptID,Array(„WID“ => {WECKERID});


<?
  // Script zum aktivieren der Weckzeit
	$WID_MAX    = 4;                //Maximale Weckzeiten
	$WECKSCRIPT = 48760;     //Script ID die ausgeführt werden soll beim 'wecken'
	$WID        = intval($_IPS['WID']);   //ID Des Weckers überabe mit RunScriptEX...

/* --------------------------------------------------------------------------*/
	// Prüfung
	if($WID > $WID_MAX){
	   echo "Weckzeit $WID nicht vorhanden";
	   return;
	}
	$wecker = IPS_GetParent($_IPS['SELF']);

	// Alle deaktivieren
	if($WID == 0){
		for($i=1; $i <= $WID_MAX;$i++ ){
				$name = "Weckzeit $i";
				$eid  = IPS_GetEventIDByName($name, $wecker);
				IPS_SetEventActive($eid,false);
		}
		$echo "Alle Weckzeiten deaktiviert.";
		return;
	}
	
	// Weckzeit aktivieren / Deaktivieren.
	$name = "Weckzeit $WID";
	$eid  = @IPS_GetEventIDByName($name, $wecker);
	if(!$eid){
	   // Nicht gefunden Error handling!
		echo "Wecker-Ereignis nicht gefunden - Abbruch.";
		return;
	}
	$einfo = IPS_GetEvent($eid);

	if($einfo["EventActive"]){
		IPS_SetEventActive($eid,false);
		$txt =  "Wecker $WID aus.";
	} else {
		$h = $einfo["CyclicTimeFrom"]["Hour"];
		$m = $einfo["CyclicTimeFrom"]["Minute"];
		$hcur = date("H");
		$weckzeit = mktime(0,0,0, date("n"), date("j"), date("Y"));
		$weckzeit = $weckzeit + ($h*3600+ 60*$m);
		if($hcur > $h){
		        // morgen
			$weckzeit = $weckzeit + (3600*24);
			$txt =  "Weckzeit, morgen $h Uhr $m .";
		}else{
  			$txt =  "Wecker $WID, heute $h Uhr $m .";
		}
	   IPS_SetEventCyclic($eid,1,0,0,0,0,0); // einmaliges event
	   IPS_SetEventCyclicTimeBounds($eid, $weckzeit, 0);
	   IPS_SetEventCyclicDateBounds($eid, $weckzeit, 0);
	   IPS_SetEventActive($eid,true);

	   $code = "IPS_RunScriptEx($WECKSCRIPT, Array('WECKEVID'=>$eid));";
	   IPS_SetEventScript($eid, $code);
	}
	// Ausgabe an RPI:
	echo $txt);
	
?>

shot.png

da einige nachfragen, kamen.

den MPD Player kann man mit dieser PHP Klasse remote steuern:
http://mpd.wikia.com/wiki/Client_Libraries

GPIOs: am RPI steuer ich so:

auf dem RPI wird folgendes Phyton script abgelegt und ausführbar gemacht (sudo chmod u+x,g+x mygpio.py)

#!/usr/bin/python
import socket
import sys
import RPi.GPIO as GPIO

# Settings  für GPIO und Socket
GPSpeaker = 23
SockID    = 11025

# Setup GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPSpeaker, GPIO.OUT)
GPIO.output(GPSpeaker, GPIO.LOW)

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Bind the socket to the port
server_address = ('0.0.0.0', SockID)


print >>sys.stderr, 'starting up on %s port %s' % server_address
sock.bind(server_address)
sock.listen(1)

# Listen for incoming connections
data = "NOTHING"
while data != "CLOSE":
    conn, addr = sock.accept();
    print 'Connected with ' + addr[0] + ':' + str(addr[1])
    data = conn.recv(1024)
    data = data.strip()
    if data == "MUTE":
        GPIO.output(GPSpeaker, GPIO.LOW)
        print "Mute Speacker."
        conn.send("OK")
    elif data == "UNMUTE":
        GPIO.output(GPSpeaker, GPIO.HIGH)
        print "UNmute Speaker"
    conn.close()
sock.close()


das Script wird dann per crotab autom. nach reboot gestartet:
crontab - e
folgendes einfügen:
@reboot ~/pfadzumscript.py

auf IPS Seite kann man den „Server“ dann so ansprechen:


   $raspi_ip = "192.168.178.10"; // IP des Raspberry

		$fp = fsockopen("tcp://".$raspi_ip, 11025, $errno, $errstr);
		if (!$fp) {
		    echo "ERROR: $errno - $errstr<br />
";
		} else {
		    fwrite($fp, "MUTE");
		    $resp = trim(fread($fp,1024));
		    fclose($fp);
		   if(! $resp == "OK"){
                    echo "Error - Command not understood.";
                   }
		}