Ankündigung

Einklappen
Keine Ankündigung bisher.

Russound C5/C7 Python Steuerung (RIO)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Multimedia] Russound C5/C7 Python Steuerung (RIO)

    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
    Code:
    python -V
    heraus.

    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
    Dann mit Rechtsklick den Code aus der Zwischenablage einfügen.
    Danach bitte die Settings anpassen (IP vom C5, Mac Adresse)
    Code:
    Strg + X
    Dann mit Y das Speichern bestätigen.
    Code:
    chown apache russcontrol.py
    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.

    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()
    Angehängte Dateien

    #2
    Den Status des Russound bekommt man damit aber nicht mit, oder? Also es gibt keine Möglichkeit, dass der Russound von sich aus dem HS etwas mitteilt?

    Für sh.py habe ich ein Russound Plugin geschrieben. Damit kann der HS und der Russound bidirektional miteinander kommunizieren. Klar ist es etwas aufwändiger in der Einrichtung als eine einfache Webabfrage, aber hinterher hat man den Status des Russound auf dem KNX Bus und kann damit dann den HS oder auch irgendwelche Taster direkt aussteuern.

    Für eine einfache Steuerung des Russound vom HS aus und wenn dieser nur vom HS gesteuert wird, ist dein Skript sicher ausreichend und hilfreich für manchen... daher, Danke dafür!
    Mit freundlichen Grüßen
    Niko Will

    Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
    - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

    Kommentar


      #3
      Ehe es bei mir auf der Festplatte einstaubt, dachte ich könnte ich es auch hier reinstellen. Gibt bestimmt jemanden, der es mal brauchen könnte.

      @sky: Ja, ne richtige vollwertige Steuerung, die die Keypads ersetzen könnte ist es nicht und soll es auch nicht sein. Die Statusabfrage der Keypads könnte man natürlich noch einbauen, diese sind dann aber nicht Echtzeit sondern quasi "on request".

      Aber für diese oben genannten einfachen Anwendungsfälle ist es eine gute Alternative, ohne viel Overhead. Wenn ihr Probleme beim Einbau haben solltet, helfe ich euch gerne weiter.

      Kommentar


        #4
        Hi 55er drive,

        hast du dein Script eventuell aufgebohrt um damit zb. Channel, radioText etc. auszulesen und auf den Bus zu übertragen? Vielleicht hattest du da eine Idee dazu ?

        Danke.

        Gruß,
        lumo

        Kommentar


          #5
          Nein, habe ich noch nicht gemacht.
          Das würde noch einiges an Aufwand bedeuten, den andere Projekte zb das von 2ndSky schon umgesetzt haben.

          Ich überlege aber auch schon, ob man soetwas nicht auch auf einem Raspberry Pi umsetzen sollte mit entsprechenden Quad Client Funktionsvorlagen. Das würde mich reizen.

          Aber ich würds nur anfangen, wenn auch Interesse besteht Für mich reicht das, was ich oben gepostet habe aus.

          Kommentar


            #6
            Wenn sowieso schon in python, wieso dann nicht gleich als Homeserver Logikbaustein? Das sqlite wird eh nicht verwendet und cgi* brauchst du dann ja nicht mehr. Rest ist alles auf dem HS vorhanden.
            Nils

            aktuelle Bausteine:
            BusAufsicht - ServiceCheck - Pushover - HS-Insight

            Kommentar


              #7
              Zitat von NilsS Beitrag anzeigen
              Wenn sowieso schon in python, wieso dann nicht gleich als Homeserver Logikbaustein? Das sqlite wird eh nicht verwendet und cgi* brauchst du dann ja nicht mehr. Rest ist alles auf dem HS vorhanden.
              Wäre ne Idee, wüsste nur auf Anhieb jetzt nicht, wie Bin zwar im Gira Entwicklerforum, habe dort aber keine entsprechende Doku gefunden?

              Kommentar


                #8
                Hi,

                nein radioext und channel sind zumindest im plugin für smarthome.py nicht integriert. Ein Gira-Plugin wäre genial, muss ja auch nicht zwingend kostenlos sein ;-).

                Siehst du sonst eine Chance das in dem jetzigen Script unterzubringen?

                Beste Grüße,
                lumo

                Kommentar


                  #9
                  Zitat von lumo Beitrag anzeigen
                  Hi,

                  nein radioext und channel sind zumindest im plugin für smarthome.py nicht integriert. Ein Gira-Plugin wäre genial, muss ja auch nicht zwingend kostenlos sein ;-).

                  Siehst du sonst eine Chance das in dem jetzigen Script unterzubringen?

                  Beste Grüße,
                  lumo
                  Ich werde mir die RIO API nochmal ansehen, aber was ich jetzt schon sagen kann ist, dass die ziemlich Banane ist. Ich habe meine Zweifel, dass die den RDS Text auslesen kann. Mit der API kann man quasi nur "knöpfchen drücken" mittels Textbefehlen. Die Frequenz eines Radiosenders zu wechseln, ist auch abenteuerlich:

                  Um 89,8 MHz zu hören muss man bei laufender Zone:

                  Zahl 8, Zahl 9, Zahl 8, Zahl 0, OK an den Russound senden. Das ist genau die Art der Bedienung, die man so von Fernbedienungen aus der 80ern kennt. Und selbstredend hakelt der Ton ganz kurz nach jeder Ziffer... Unterirdisch. Hab jedenfalls keine andere Möglichkeit gefunden, eine Frequenz einzustellen.

                  Da ist meine Motivation, etwas zu programmieren nicht besonders hoch. Wenn ich das vorher gewusst hätte, hätte ich etwas weiter gesucht und ein anderes System genommen.

                  Kommentar


                    #10
                    Zitat von 55er driver Beitrag anzeigen
                    Bin zwar im Gira Entwicklerforum, habe dort aber keine entsprechende Doku gefunden?
                    Die gibts auch nicht da
                    In der Richtung wäre das dann

                    https://knx-user-forum.de/knx-eib-fo...nd-andere.html
                    Nils

                    aktuelle Bausteine:
                    BusAufsicht - ServiceCheck - Pushover - HS-Insight

                    Kommentar


                      #11
                      HI 55er Drive,

                      also wäre für mich endlich eine Abrundung des Gesamtsystems, wenn radioText und channel einbauen würdest. Interesse ist groß und testen kann ich es auch.

                      In der RIO-Doku sieht es so aus, ob es am besten mit "WATCH C[1].Z[4] ON" funktioniert.
                      Der Output sieht dann in etwa so aus :
                      Code:
                      C[1].Z[4].status=”ON” 
                      C[1].Z[4].volume=”20” 
                      C[1].Z[4].bass=”10” 
                      C[1].Z[4].treble=”10” 
                      C[1].Z[4].balance=”10” 
                      C[1].Z[4].loudness=”OFF” 
                      C[1].Z[4].currentSource=”2” 
                      N S[4].programServiceName=”<RADIO XY>” 
                      N S[4].radioText=”<Auf der Alm gibs koa.....>”
                      N S[4].channel=”<Radio ALM>”
                      ;-)

                      Jetzt müsste wohl jede Zeile geparst werden ? Zumindest mit PUTTY im RAW Mode funktioniert das gut?
                      Danke.

                      Viele Grüße,
                      Lumo

                      Kommentar


                        #12
                        Das ist wohl wahr. Hast Du mein Skript denn im Einsatz?
                        Man müsste das dann schon umbauen. Entweder ich baue einen Daemon dafür selbst oder ich setze es als Logikbaustein um. Ich bin noch unentschlossen.

                        Kommentar


                          #13
                          Hi,

                          nein derzeit habe ich dein Script noch nicht in Einsatz, aber ich habe sowohl Rapsi und Homeserver zur Verfügung. Könnte also beide Varianten testen. Rapsi-Lösung würde mir sonst gut gefallen, denke da bist du universeller. Die HS-Lösung wäre halt um einiges integrierter. Schneller geht es wohl aber über die RASPI/LINUX Lösung,
                          wobei das ja eigentlich auf jeden Linux-like OS funktionieren dürfte.

                          Gruß,
                          lumo

                          Kommentar


                            #14
                            Ich glaube, das können wir uns schenken:
                            Russound to Launch KNX Interface at ISE 2015; Adds Spotify to Streamers - Article from CE Pro

                            Sollte es preislich ähnlich unattraktiv sein wie das russound knx interface von mediacraft. 499 sind jawohl absolut übertrieben für die paar funktionen. Hoffen wir, dass das russound interface besser wird.

                            Edit: produkt video russound rio 1: http://www.google.de/url?sa=t&rct=j&...85970519,d.d24

                            Kommentar


                              #15
                              Hi,

                              dachte ja schon dich packt die Entwicklerlaune ;-). Also falls doch noch Bock hast,
                              würde ich mich um eine Integration freuen. Eine Alternative ist ja nie schlecht und wer weiß schon wann das Produkt verfügbar ist ;-) und ich würde vielleicht noch was lernen können ...... habe keine Vorstellung wie man das umsetzen könnte, bin da einfach ein Laie :/.


                              Gruß,
                              lumo

                              Kommentar

                              Lädt...
                              X