Dreambox Plugin

diverse Zusatzsoftware

Moderator: Co-Administratoren

DEC
Beiträge: 11
Registriert: 15.11.2008, 15:20

Dreambox Plugin

Beitrag von DEC » 09.06.2013, 15:36

Hallo,

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)

Dateianhänge
xmlrpclib.zip
__init__.py
plugin.py
xmlrpclip.py
(15.31 KiB) 526-mal heruntergeladen
Zuletzt geändert von Roland M. am 27.03.2018, 16:53, insgesamt 1-mal geändert.
Grund: Thema verschoben

AxIT
Beiträge: 2
Registriert: 16.03.2013, 17:17

Re: Dreambox Plugin

Beitrag von AxIT » 04.01.2014, 21:31

Cool :) - Danke für den Anstupser... wolle schon ewig mit der Dream meine HM steuern...

frague
Beiträge: 89
Registriert: 21.10.2006, 22:09

Re: Dreambox Plugin

Beitrag von frague » 27.12.2014, 18:50

Hallo

habe eben diese Seite gefunden, ist da Thema weiter entwickelt worden. Habe eben versucht das Plugin zum laufen zu bringen. leider ohne Erfolg
es kommt immer die Meldung

extensiun/homematic(<Fault-2: 'Unknown instance>)

Ich habe allerdings python2.7 drauf und einen receiver gigablue Quad

Kann mir einer helfen

joe13
Beiträge: 67
Registriert: 10.11.2013, 22:16

Re: Dreambox Plugin

Beitrag von joe13 » 06.01.2015, 23:40

screenshot.jpg
Hallo,
habe heute mal probiert Zustände auf der Dreambox zu zeigen, geht gut.

Hat jemand eine Idee, wie mal Systemvariable darstellt ?

gruss joe

Jürgen0749
Beiträge: 120
Registriert: 10.04.2013, 16:40

Re: Dreambox Plugin

Beitrag von Jürgen0749 » 08.01.2015, 13:18

Hi Joe13

Hab das Plugin auch mal installiert.


Leider zeigen bei mir die Heizungsregler (Thermostat) "none" an.

Frage1: Hast du die alten oder neuen Heizungsregler, wenn neu welcher software stand?


Licht läßt sich schalten und auch Dimmen (Taste5)

Frage2: Wenn du Licht schaltest, ändert sich bei dir die Anzeige von Aus auf An usw ? Ich muß immer das Plugin verlassen und neu rein um den Aktuellen zustand zu sehen


Frage3: Wie schreibe ich z.Bsp "Wohnzimmer Stehlampe" ins Plugin? Mit "Wohnzimmer%20Stehlampe" geht das nicht..


Evtl kannst mir auch Deine Plugin.py zukommen lassen, dann versuche ich selber eine Lösung zu finden..


Gruß Jürgen

joe13
Beiträge: 67
Registriert: 10.11.2013, 22:16

Re: Dreambox Plugin

Beitrag von joe13 » 08.01.2015, 23:20

Hallo,

1. habe beide Thermostate
FÜR DIE ALTEN elif re.search( "'WEATHER'", self.__str_devdescription ):
self.__type = "TEMPERATURE"

FÜRDIE NEUEN elif re.search( "'CLIMATECONTROL_RT_TRANSCEIVER'", self.__str_devdescription ):
self.__type = "ACTUAL_TEMPERATURE"

2.ich lasse nichts schalten, aber die denke, nur der akt. Zustand wird gezeigt

3. einfache ein Schreiben
# Name im Menue : Name im Plugin
dict_licht = {
"1 Fenster im Schlafzimmer offen ?" : Licht_Zimmer1,
"2 Tuer im Wohnzimmer offen ?" : Licht_Zimmer2,
"3 Heizung aus ?" : Licht_Zimmer3



gruss joe

Jürgen0749
Beiträge: 120
Registriert: 10.04.2013, 16:40

Re: Dreambox Plugin

Beitrag von Jürgen0749 » 09.01.2015, 10:15

Hi Joe

Danke für deine antworten, hat alles supi geklappt.
Licht schalten und Temperatur auslesen geht.

Ergänzend dazu, Bei den neuen Heizungsregler muß man "KEQ0123456:4" eingeben, falls hier noch jemand mit liest.

Wäre schön falls du im Plugin noch irgendwie weiter kommst, wenn du es uns/mir mitteilen könntest.

Danke nochmal und Gruß

Jürgen

joe13
Beiträge: 67
Registriert: 10.11.2013, 22:16

Re: Dreambox Plugin

Beitrag von joe13 » 09.01.2015, 11:30

Super Jürgen,

und hast du eine Idee, wie man Systemvariablen darstellt ?

gruss joe

Jürgen0749
Beiträge: 120
Registriert: 10.04.2013, 16:40

Re: Dreambox Plugin

Beitrag von Jürgen0749 » 09.01.2015, 13:13

Hi Joe
joe13 hat geschrieben: ...und hast du eine Idee, wie man Systemvariablen darstellt ?
Leider Nein

Vielleicht hilft dir dieser Beitrag ? http://homematic-forum.de/forum/viewtop ... ox#p187046

Muß gestehen weiß nich mal genau, was du genau meinst? :( Kenn mich mit der Materie nicht so gut aus :(

Gruß Jürgen

frague
Beiträge: 89
Registriert: 21.10.2006, 22:09

Re: Dreambox Plugin

Beitrag von frague » 10.01.2015, 17:06

Hallo Joe,

leider bekomme ich das Script nicht zum laufen,
ich bekomme immer folgende Fehlermeldung

extensiun/homematic(<Fault-2: 'Unknown instance>)

Ich habe allerdings python2.7 drauf und einen receiver gigablue Quad.
Habe mittlerweile einen Ordner mit python 2.6 erstellt und das Script von der ZIP Datei hineinkopiert,leider kein Erfolg.
Hast Du einen Tip für mich

Antworten

Zurück zu „Sonstige Addons“