Also absoluter Python-Anfänger wollte ich mich mal wieder mit der Sprache beschäftigen und habe einen SimpleXMLRPCServer aufgesetzt, welchen ich zur Kontaktaufnahme mit meiner Hausautomation 'benötige'.
Den Server richte ich mit folgenden Zeilen ein:
Code: Alles auswählen
IP = '192.168.27.2'
PORT = 5544
server_for_ccu = SimpleXMLRPCServer((IP, PORT), logRequests=False)
server_for_ccu.register_instance(MyFuncs())
server_for_ccu.register_multicall_functions()
...
server_for_ccu.serve_forever()
Code: Alles auswählen
class MyFuncs:
def event(*args):
print '---'
if len(args) >= 5:
dp, param, value = args[2:5]
zeitpunkt = datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S')
print 'Zeitpunkt : %s' % zeitpunkt
print 'Datenpunkt: %s' % dp
print 'Parameter : %s' % param
print 'Wert : %s' % value
logging.info('%s: %s, %s = %s', zeitpunkt, dp, param, value)
write_to_db(db_connection, zeitpunkt, dp, param, value)
if dp == 'JEQ0738820:1' and param == 'BRIGHTNESS':
logging.info('Außenhelligkeit: %s', value)
print 'Außenhelligkeit:', value
return ''
def listDevices(*args):
#for arg in args:
# print arg
return ''
def newDevices(*args):
#for arg in args:
# print arg
return ''
def newDevice(*args):
#for arg in args:
# print arg
return ''
Wie man sieht, bastel ich genau damit gerade ein wenig rum und das logging mit dem Python-Logging-Modul klappt auch einwandfrei - was man für meinen Versuch, das ganze auch in eine sqlite-Datenbank zu packen leider nicht sagen kann.

write_to_db ist eine Funktion, die ich außerhalb der Klasse MyFync definiert habe:
Code: Alles auswählen
def write_to_db(conn, date_time, data_point, parameter, value):
with conn:
cur = conn.cursor()
data = (date_time, data_point, parameter, value)
cur.execute('insert into events values (?,?,?,?)', data)
Generell finde ich das ganze recht unschön gelöst, weil ich keine Möglichkeit sehe, der Funktion event in der Klasse MyFunc einen Parameter für den Zugriff auf die Datenbank mitzugeben - die Parameter kommen ja vom entfernten XLM-Server/Client.
Deshalb die Frage, wie man das ganze sauber umsetzen würde?
Letztlich plane ich natürlich, auf gewisse events gesondert zu reagieren, so daß diese nicht nur in der Datenbank landen, sondern eben auch eine direkte Reaktion des Systems bewirken. Wie verpacke ich sowas sauber? Käme hier Interprozesskommunikation ins Spiel, sprich bräuchte ich einen weiteren XML-Server, der dann wiederum vom obigen Programm die events zugeschickt bekommt? Optimal fände ich schon eine Zwei-Teilung, sprich Empfang der events und direktes Wegschreiben in eine Datenbank in einem Skript und dann ein weiteres (oder gar mehrere), die sich gewisse events rauspicken und dann entsprechend aktiv werden.
Tausenddank,
Daniel