Da es leider keine Lösung für die Steuerung eines Russound Gerätes gibt, die standalone ohne Zusatzgeräte funktioniert, habe ich mal eben für mich ein Python Skript geschrieben. Gedacht war es eigentlich nur für eigene Zwecke, aber ich dachte, der eine oder andere könnte es auch gebrauchen können.
Voraussetzungen:
Raspberry Pi oder andere Unix Kiste, auf der Python läuft.
Python Version: min. 2.4.3 (Neuere nicht getestet)
Apache Webserver + mod_python
Die Python Version bekommt ihr mit
heraus.
Möglichkeiten mit dem Homeserver:
Features:
Installation:
Einfach das Skript unten kopieren, und in eine Datei speichern.
Dann mit Rechtsklick den Code aus der Zwischenablage einfügen.
Danach bitte die Settings anpassen (IP vom C5, Mac Adresse)
Dann mit Y das Speichern bestätigen.
Damit das Python File über den Webserver (apache) ausgeführt werden kann.
Benutzung:
Das Skript kann nicht von der Shell aus ausgeführt werden, es ist dafür ausgelegt, über den Webbrowser (HTTP Request) angesteuert zu werden.
Der Homeserver kann über den Menüpunkt Kommunikation > Webseite/IP Geräte dieses Skript ansteuern. Details findet ihr in den beiden Anhängen.
Wenn man das angelegt hat, kann man einfach über die Funktion "Webseiten/IP-Gerät auswerten" im Logikbaustein den Russound ansteurn und etwas abpsielen.
Voraussetzungen:
Raspberry Pi oder andere Unix Kiste, auf der Python läuft.
Python Version: min. 2.4.3 (Neuere nicht getestet)
Apache Webserver + mod_python
Die Python Version bekommt ihr mit
Code:
python -V
Möglichkeiten mit dem Homeserver:
- Ansteuerung des Russound C5/C7 über KNX möglich
- Abspielen von Musik bei Betreten des Hauses
- Zentral-Aus Funktion könnte auch die Musik abschalten
- Weckfunktion könnte man damit realisieren (KNX gesteuert)
Features:
- Zone(n) anschalten, Quelle wählen, abspielen
- Falls der C5/C7 in den Ruhezustand geht, wird er per Wake on Lan wieder aufgeweckt. Das funkioniert aber nur, wenn ihr die Mac Adresse in den Settings auf die Eures Gerätes ändert.
- UKW Frequenz ansteuerbar
- Alle Zonen an/aus
- Partymode an/aus
- weitere Features auf Anfrage
Installation:
Einfach das Skript unten kopieren, und in eine Datei speichern.
Code:
nano russcontrol.py
Danach bitte die Settings anpassen (IP vom C5, Mac Adresse)
Code:
Strg + X
Code:
chown apache russcontrol.py
Benutzung:
Das Skript kann nicht von der Shell aus ausgeführt werden, es ist dafür ausgelegt, über den Webbrowser (HTTP Request) angesteuert zu werden.
Der Homeserver kann über den Menüpunkt Kommunikation > Webseite/IP Geräte dieses Skript ansteuern. Details findet ihr in den beiden Anhängen.
Wenn man das angelegt hat, kann man einfach über die Funktion "Webseiten/IP-Gerät auswerten" im Logikbaustein den Russound ansteurn und etwas abpsielen.
Code:
#!/usr/bin/env python #//////////////////////////////////////////////////////////////////////// #//// AUTHOR: Christoph Suess <christoph.suess@playzo.biz> ////////////// #//// VERSION: 1.0 ////////////////////////////////////////////////////// #//// LAST UPDATE: 21.11.2014 /////////////////////////////////////////// #//// EXAMPLE USE: http://x.x.x.x/russcontrol.py?action=play&controller=1&zone=1,3&frequency=10720&source=1 #//////////////////////////////////////////////////////////////////////// #//// MANDATORY PARAMETERS ////////////////////////////////////////////// #//////////////////////////////////////////////////////////////////////// #//// parameter ////////// possible values /////// behavior ///////////// #//// action ////////// play /////// turn given zone(s) on and plays a source (and frequency for am/fm tuner) #//// action ////////// alloff /////// turns all zones off without to change source #//// action ////////// allon /////// turns all zones on without to change source #//// action ////////// partymode_on /////// turn on the party mode on a given zone and make it master #//// action ////////// partymode_off /////// turn off the party mode on a given zone #//// controller ///////// 1-n /////// defines the controller to use, default: 1 #//// zone ////////// 1-n (for ex: 1,2,4)//// zones to play on. mainly used for action='play'. Logical zones as they appear in the russound menu. #//// source ////////// 1-n /////// source to play. #//// frequency ////////// 90.25 or 10725 /////// With or without '.'. 107.25MHz -> 10725, 90.25MHz -> 9025. #//////////////////////////////////////////////////////////////////////// import os import cgi import cgitb import socket import struct import datetime import sys import sqlite as lite import time #//// SETTINGS OF Russound Device //// host = '192.168.31.16' port = 9621 macAddr = '00:21:c7:00:29:4c' #//// Russound-specific settings, dont change lines below! //////////// digits = ['DigitZero', 'DigitOne', 'DigitTwo', 'DigitThree', 'DigitFour', 'DigitFive', 'DigitSix', 'DigitSeven', 'DigitEight', 'DigitNine'] #//// OUTPUT START //////////////////////////////////////////////////// cgitb.enable() print "Content-Type: text/html;charset=utf-8" print form = cgi.FieldStorage() if not form.has_key("controller"): print "no controller given, using 1" controller = 1 if not form.has_key("source"): print "no source given, using 1" source = 1 if not form.has_key("zone"): print "no zone given, using 1" zone = ['1'] if not form.has_key("action"): print "no action given, using play" action = 'play' if not form.has_key("frequency"): print "no frequency given, using 0" frequency = "0" #////// PUT HTTP-GET VALUES INTO PYTHON VARIABLES //////////////////// controller = str(form["controller"].value) zone = str(form["zone"].value).split(',') source = str(form["source"].value) action = str(form["action"].value) frequency = str(form["frequency"].value).replace('.','') #////// CONNECT ////////////////////////////////////////////////////// try: s = socket.socket( socket.AF_INET, socket.SOCK_STREAM) print 'connecting...' s.connect( (host, port)) except socket.error: print 'error occured, try to wake device using WOL...' #////// try to wake the russound //////////////////////////// addr_byte = macAddr.split(':') hw_addr = struct.pack('BBBBBB', int(addr_byte[0], 16), int(addr_byte[1], 16), int(addr_byte[2], 16), int(addr_byte[3], 16), int(addr_byte[4], 16), int(addr_byte[5], 16)) msg = '\xff' * 6 + hw_addr * 16 # send magic packet dgramSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) dgramSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) dgramSocket.sendto(msg, ("255.255.255.255", 9)) #/////// now try to connect again ////////////////////////// s = socket.socket( socket.AF_INET, socket.SOCK_STREAM) print 'reconnecting...' s.connect( (host, port)) s.send('GET System.status\r\n') status = s.recv(1024) print 'status of device: '+status if action == 'play': for zn in zone: s.send('EVENT C['+controller+'].Z['+zn+']!ZoneOn\r\n') print s.recv(1024) s.send('EVENT C['+controller+'].Z['+zn+']!KeyRelease SelectSource '+source+'\r\n') print s.recv(1024) if frequency != '': freqparts = list(frequency) for freq in freqparts: s.send('EVENT C['+controller+'].Z['+zn+']!KeyRelease ' + digits[int(freq)] + '\r\n') print s.recv(1024) s.send('EVENT C['+controller+'].Z['+zn+']!KeyRelease Enter\r\n') print s.recv(1024) else: s.send('EVENT C['+controller+'].Z['+zn+']!KeyRelease Play\r\n') print s.recv(1024) elif action == 'alloff': s.send('EVENT C['+controller+'].Z[1]!AllOff\r\n') print s.recv(1024) elif action == 'allon': s.send('EVENT C['+controller+'].Z[1]!AllOn\r\n') print s.recv(1024) elif action == 'partymode_on': s.send('EVENT C['+controller+'].Z['+zone[0]+']!PartyMode on\r\n') print s.recv(1024) s.send('EVENT C['+controller+'].Z['+zone[0]+']!PartyMode master\r\n') print s.recv(1024) elif action == 'partymode_off': s.send('EVENT C['+controller+'].Z['+zone[0]+']!PartyMode off\r\n') print s.recv(1024) s.close()
Kommentar