auf Anregung von hier: http://homematic-forum.de/forum/viewtop ... =26&t=4707 jetzt auch hier:
Man kann über das Plugin Aktoren anzeigen und schalten (Schaltaktor oder Dimmer), sowie die Temperaturen der Thermostate auslesen.
Ein Dimmer kann mit der Taste 5 auf 50% gestzt werden.
Voraussetzung ist die Bibliothek /usr/lib/python2.6/xmlrpclib.py. Die ist normalerweise noch nicht auf der Dreambox.
Im Verzeichnis /usr/lib/enigma2/python/Plugins/Extensions muss ein neues Verzeichnis angelegt werden, z.B. homematic. Hierher kommt das Plugin mit dem Namen plugin.py und eine leere Datei mit dem Namen __init__.py und eventuell ein Icon für den Menüeintrag (png-Format - falls das fehlt wird das Standard-Icon verwendet).
Im Plugin erfolgt die Zuordnung des Aktors/Thermostat über die Seriennummer des Kanals. Weiter wird diese Variable in einem Dictionary mit einem Menüeintrag verknüpft. (ab Zeile 63)
In Zeile 15 nicht vergessen die IP der CCU einzutragen.
Bei mir funktioniert das Plugin unter OE1.6 und auch unter OE2.0.
Viel Spaß damit
dec
Code: Alles auswählen
# Bedienung HM auf DM - 2011
# V0.3
# by ecki
from Screens.Screen import Screen
from Components.MenuList import MenuList
from Components.ActionMap import ActionMap
from Screens.MessageBox import MessageBox
from Plugins.Plugin import PluginDescriptor
import xmlrpclib
import re
## Klasse fuer Kommunikation mit Homematik ##########################################################################
class HM(object):
__rf = xmlrpclib.ServerProxy('http://10.10.10.30:2001') # IP der CCU
# Abfrage vorbereiten - Geraetetyp und abgefragten Datenpunkt festlegen
def __init__(self, akz):
self.__akz = akz
self.__str_devdescription = str ( HM.__rf.getDeviceDescription ( akz ) ) # Geraetetyp bestimmen
if re.search( "'SWITCH'", self.__str_devdescription ):
self.__type = "STATE" # was soll abgefragt werden - STATE bei Schalter
elif re.search( "'DIMMER'", self.__str_devdescription ):
self.__type = "LEVEL" # was soll abgefragt werden - LEVEL bei Dimmer
elif re.search( "'WEATHER'", self.__str_devdescription ):
self.__type = "TEMPERATURE" # was soll abgefragt werden - Temperatur bei Thermostat
else:
self.__type = None
# Werte von Homematik einlesen
def get_Status (self ) :
print "get_Status:", self.__akz, self.__type # Debug-Ausgabe an Konsole
if self.__type: # wenn Typ definiert
return HM.__rf.getValue ( self.__akz, self.__type ) # Status holen
else:
return None # sonst gibt es nix
# Wert in Homematik-Aktor setzen
def set_Status (self, wert) :
print "set_Status:", wert # Debug-Ausgabe an Konsole
check = False
if self.__type == "LEVEL" and 0.0 <= wert <= 1.0: # Fehler abfangen
print "Dimmer" # Debug-Ausgabe an Konsole
wert = float (wert) # alles ok
check = True
elif self.__type == "STATE" and type (wert) == bool: # Fehler abfangen
print "E/A Licht" # Debug-Ausgabe an Konsole
check = True # alles ok
else:
print "TEST Fehler" # Debug-Ausgabe an Konsole
return # Fehler kein passender Wert vorhanden
if check:
print self.__akz, self.__type, wert # Debug-Ausgabe an Konsole
HM.__rf.setValue ( self.__akz, self.__type, wert ) # Aktor neuen Wert zuweisen
Status = property(get_Status, set_Status)
###########################################################################
class MyMenu(Screen): # Fenstergroesse und Position festlegen
skin = """
<screen position="100,150" size="460,470" title="HomeMatic V0.2" >
<widget name="myMenu" position="10,10" size="420,450" scrollbarMode="showOnDemand" />
</screen>"""
# Zuordnung Name - Seriennummer (Licht Schaltaktor oder Dimmer) - (Dictionary Licht)
# Name im Plugin = HM ("Kanal des Aktors")
Licht_Zimmer1 = HM ("DEQ0012345:4")
Licht_Zimmer2 = HM ("EEQ0012345:1")
Licht_Zimmer3 = HM ("EEQ0012345:2")
# zugehoerige Eintraege in Menue
# Name im Menue : Name im Plugin
dict_licht = {
"Licht_Zimmer1" : Licht_Zimmer1,
"Licht_Zimmer2" : Licht_Zimmer2,
"Licht_Zimmer3" : Licht_Zimmer3
}
# Zuordnung Name - Seriennummer (Thermostat)
# Name im Plugin = HM ("Kanal des Thermostat")
Thermostat1 = HM ("FEQ0012345:1")
Thermostat2 = HM ("FEQ0012346:1")
Thermostat3 = HM ("GEQ0012345:1")
# zugehoerige Eintraege in Menue Dictionary Temperatur)
# Name im Menue : Name im Plugin
dict_temperatur = {
"Thermostat1" : Thermostat1,
"Thermostat2" : Thermostat2,
"Thermostat1" : Thermostat3
}
def __init__(self, session, args = 0): # Vorbereitungen aktuellen Status einlesen und in Menue eintragen
self.session = session
list = []
for adresse in sorted(self.dict_licht.keys ()): # Schaltaktoren und Dimmer (Licht) abfragen
status = self.dict_licht[adresse].Status
if not status: # wenn status false
str_status = "AUS" # dann ist der Schaltaktor AUS
elif type (status) == float: # wenn nicht und Datentyp float (Dimmer)
str_status = str(status) # Wert uebernehemen
else:
str_status = "AN" # sonst ist der Schaltaktor AN
str_Menu_Eintrag = adresse + " - "+ str_status # aktueller Status fuer Menueeintrag
list.append((_(str_Menu_Eintrag), adresse)) # im Menue eintagen
for adresse in sorted(self.dict_temperatur.keys ()): # Temperatursensoren abfragen
str_Menu_Eintrag = adresse + " - " + str(self.dict_temperatur[adresse].Status) # aktueller Status fuer Menueeintrag
list.append((_(str_Menu_Eintrag), adresse)) # im Menue eintagen
#list.append((_("Exit"), "exit")) # Eintrag Exit im Menue
Screen.__init__(self, session) # Aktionen definieren
self["myMenu"] = MenuList(list)
self["myActionMap"] = ActionMap(["SetupActions"],
{
"ok": self.go, # Aktion bei Taste OK
"cancel": self.cancel, # Aktion bei Taste EXIT
"right": self.change_on, # Aktion bei Taste RECHTS
"left": self.change_off, # Aktion bei Taste LINKS
"5": self.change_fuenf # Aktion bei Taste 5
}, -1)
# nach Taste OK aktuellen Wert einlesen und in Meldungsfenster ausgeben
def go(self): # nach Betaetigen von Taste ok
returnValue = self["myMenu"].l.getCurrentSelection()[1] # aktuelle Menuezeile einlesen
print "\n[MyMenu] returnValue: " + returnValue + "\n" # Debug-Ausgabe an Konsole
if returnValue is not None: # wenn Wert vorhanden
if returnValue in self.dict_licht: # wenn Wert in Dictionary Licht
status = MyMenu.dict_licht[returnValue].Status # aktuellen Status einlesen
elif returnValue in MyMenu.dict_temperatur: # wenn Wert in Dictionary Temperatur
status = MyMenu.dict_temperatur[returnValue].Status # aktuellen Status einlesen
else:
status = "nix" # nichts passendes gefunden
print "Geraet" # Debug-Ausgabe an Konsole
self.myMsg("returnValue = %s" % status ) # aktuellen Status in Meldungsfenster ausgeben
else: # garnichts gefunden
print "\n[MyMenu] cancel\n" # Debug-Ausgabe an Konsole
self.close(None)
# nach Taste RECHTS Aktor einschalten
def change_on(self):
returnValue = self["myMenu"].l.getCurrentSelection()[1] # aktuelle Menuezeile einlesen
print "\n[MyMenu] returnValue: " + returnValue + "\n" # Debug-Ausgabe an Konsole
if returnValue is not None: # wenn Wert vorhanden
if returnValue in self.dict_licht: # wenn Wert in Dictionary Licht
MyMenu.dict_licht[returnValue].Status = True # Status auf True setzen
# nach Taste LINKS Aktor ausschalten
def change_off(self):
returnValue = self["myMenu"].l.getCurrentSelection()[1] # aktuelle Menuezeile einlesen
print "\n[MyMenu] returnValue: " + returnValue + "\n" # Debug-Ausgabe an Konsole
if returnValue is not None: # wenn Wert vorhanden
if returnValue in self.dict_licht: # wenn Wert in Dictionary Licht
MyMenu.dict_licht[returnValue].Status = False # Status auf True setzen
# Meldungsfenster
def myMsg(self, entry):
self.session.open(MessageBox,_("Status: %s") %(entry), MessageBox.TYPE_INFO)
# nach Taste EXIT Menue schliessen
def cancel(self):
print "\n[MyMenu] cancel\n" # Debug-Ausgabe an Konsole
self.close(None)
# nach Taste 5 Dimmer 50%
def change_fuenf(self):
returnValue = self["myMenu"].l.getCurrentSelection()[1] # aktuelle Menuezeile einlesen
print "\n[MyMenu] returnValue: " + returnValue + "\n" # Debug-Ausgabe an Konsole
if returnValue is not None: # wenn Wert vorhanden
if returnValue in self.dict_licht: # wenn Wert in Dictionary Licht
MyMenu.dict_licht[returnValue].Status = 0.5 # Status auf True setzen
##Main-Programm#########################################################################
def main(session, **kwargs):
print "\n[MyMenu] start\n" # Debug-Ausgabe an Konsole
session.open(MyMenu)
##Eintrag in Erweiterungsmenue#########################################################################
def Plugins(**kwargs):
return PluginDescriptor(
name="HomeMatic V0.3",
description="Bedienung HM",
where = PluginDescriptor.WHERE_PLUGINMENU, # Eintrag in Erweiterungsmenue
icon="homematic_logo_small.png",
fnc=main)