Buderus Logamatic 2107 Revision 3 2019

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

TheRock
Beiträge: 3
Registriert: 14.03.2020, 17:47
Hat sich bedankt: 2 Mal

Re: Buderus Logamatic 2107 Revision 3 2019

Beitrag von TheRock » 15.03.2020, 23:58

Ok, ich habe es fast befürchtet :-), aber wie heißt es doch so schön, man wächst mit seinen Herausforderungen :-)
Kannst du mir hier "ein" Ralais empfehlen?

DANKE für das JSON das ist ein Abend mehr mit der Familie!!!!!! Ich werde es versuchen sobald das Gerät wieder einsatzfähig ist!

Benutzeravatar
Black
Beiträge: 5471
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1071 Mal
Kontaktdaten:

Re: Buderus Logamatic 2107 Revision 3 2019

Beitrag von Black » 16.03.2020, 00:11

ohne werbung zu machen:

https://www.voelkner.de/products/693967 ... -1St..html

sowas in der art, wichtig ist 230V und Entstörbaustein
und kontakte hartvergoldet (weil du nur die 3.3V des PI schaltest und bei AG(Ni bei der kleinen Spannung de selbstreinigungseffekt wegfällt

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

alfa75ben
Beiträge: 9
Registriert: 01.04.2020, 12:35

Re: Buderus Logamatic 2107 Revision 3 2019

Beitrag von alfa75ben » 01.04.2020, 12:59

Moin,

vielen Dank für deine Arbeit und die bereitgestellten Codeschnippsel.
Ich hätte da noch ein paar Fragen:

würdest du den Code für die Webserver API noch teilen? Ich würde gerne die Steuerung über nodered vornehmen können.

und welche Codes gibt es noch für die Konfiguration der Logamatic? Ich habe bisher leider nur den Betriebsmodus ändern können.

achja und wie kann ich die Werte für Sommer ab und Frost ab berechnen?

viele Grüße
Ben

Benutzeravatar
Black
Beiträge: 5471
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1071 Mal
Kontaktdaten:

Re: Buderus Logamatic 2107 Revision 3 2019

Beitrag von Black » 01.04.2020, 15:07

der Websewrvier ist eigentlich nicht schwierig. Nur häng das Dingen nie offen ins www... da sind keine Sperrmechanismen vor, ist halt kein eine API fürs interne netz.

Code: Alles auswählen

# Threat simpler HMTL Server -  dieser dient zur Kommunikation mit CCU, IO-Broker, Laptop
# Der Port beim Aufruf ist 9090
# Sytax: 192.168.2.4:9090/WWB_TEMP:40
# Hilfe ber verfügbare Funktionen: 192.168.2.4:9090/HELP
# /bin/tclsh /usr/local/pipush.tcl "WWB_TEMP:40"

class GateWay_RequestHandler(BaseHTTPRequestHandler):

    def StringIsInt (self,string):
        try:
            int (string)
            return True
        except ValueError:
            return False

    def StringIsFloat (self,string):
        try:
            float (string)
            return True
        except ValueError:
            return False        
    
    def analyse (self,path):
        global datamode
        global a
        global LCDon
        global Params
        global Config
        global FirstReady
        global ende
        global KS_P_ON
        global BM_Relay
        for command in path[1:].upper().split ("&"):
            cmd_regex=re.compile ("([A-Z_0-9]*)")
            val_regex=re.compile ("[:=](\d*\.?\d*)")
            str_regex=re.compile ("[:=]([A-Z]*)")
            hex_regex=re.compile ("[:=]([A-F0-9]*)")
            cmd=""
            Value=""
            ValueStr=""
            HexStr=""
            erg= cmd_regex.search (command)
            if erg is not None:
                cmd= erg.group ()
            erg= val_regex.search (command)    
            if erg is not None:
                Value= erg.group ()[1:]
            erg= str_regex.search (command)
            if erg is not None:
                ValueStr= erg.group ()[1:]
            erg= erg= hex_regex.search (command)
            if erg is not None:
                HexStr= erg.group ()[1:]            
            #print (cmd,Value,ValueStr)
       #-----------------------------------------            
            #LOGMODE: Schickt das Kommando "LOGMODE" an die Logamatic
            if cmd=="LOGMODE":
                a.newJob (b"\xee\x00\x00")       
                return "Kommando Logmode"
       #-----------------------------------------
            #STATUS schickt den Zustand der Pumpen und des Kessel an IOBroker,
            # Wenn der erste Durchlauf erfolgreich abgeschlossen ist
            if cmd=="STATUS":
                if FirstReady:
                    if BM_Relay:
                        pushIObroker ( [("STUNDEN.BRENNER.STATE",KS_P_ON) ])
                    if HK1_Pumpe.getValue ()==0:
                        wert= False
                    else:
                        wert= True
                    pushIObroker ( [("STUNDEN.HK_Pumpe.STATE",wert) ])
                    if WW_Pumpe.getValue () & 0x01:
                        wert= True
                    else:
                        wert= False
                    pushIObroker ([("STUNDEN.Ladepumpe.STATE",wert)])
                    if WW_Pumpe.getValue () & 0x02:
                        wert= True
                    else:
                        wert= False
                    pushIObroker ([("STUNDEN.Zirkpumpe.STATE",wert)])
                    return "Status Pumpen an IO Broker gesendet"
                else:
                    return "Erster Druchlauf Logmode noch Aktiv"
       #-----------------------------------------            
            #LCD Display im Keller ein / ausschalten
            if cmd=="LCD":
                if (Value=="0") or (ValueStr== "OFF"): # LED Display ausschalten
                    lcd.lcd_clear ()
                    lcd.lcd_displayMode (displayOn=False,cursorOn=False,cursorBlink=False)
                    LCDon=False
                    zeile= "Kommando LCD ausschalten"
                elif (Value=="1") or (ValueStr=="ON"): # LCD einschalten
                    if not LCDon:
                        lcd.lcd_on ()
                        LCDon=True
                        LCDstate ()
                        zeile= "Kommando LCD einschalten"
                    else:
                        zeile= "Kommando LCD einschalten (LCD war schon an )"
                else:
                    zeile= "Kommando LCD ohne gueltigen Wert (0 bzw OFF oder 1 bzw ON)"        
                return zeile
       #-----------------------------------------            
            #WWB Boiler Temperatursollwert setzen
            elif cmd=="WWB_SW":
                if self.StringIsInt (Value):
                    a.newJob (b"\x0c\x07\x65\x65\x65"+bytes ([int (Value)])+ b"\x65\x65")
                else:
                    return "Kommando Sollwert Warmwasser keine gueltige Zahl"
                return "Kommando Sollwert Warmwasser auf " + Value + " Grad gesetzt"
       #-----------------------------------------            
            #Modus HK1 setzen
            elif cmd=="HK1_MODE":
                if (Value=="0") or (ValueStr=="NACHT"):
                    a.newJob (b"\x07\x00\x65\x65\x65\x65\x00\x65")
                    return "Kommando Modus HK1: Nacht"
                elif (Value=="1") or (ValueStr=="TAG"):
                    a.newJob (b"\x07\x00\x65\x65\x65\x65\x01\x65")
                    return "Kommando Modus HK1: Tag"
                elif (Value=="2") or (ValueStr=="AUTO"):
                    a.newJob (b"\x07\x00\x65\x65\x65\x65\x02\x65")
                    return "Kommando Modus HK1: Automatik"
                else:
                    return "Kommando Modus HK1 ungueltig (0,Nacht)(1,Tag)(2,Auto)"
       #-----------------------------------------                             
            # Kommando schicken: HK1 Regeleingriff Raumtemp                       
            elif cmd== "HK1_REGLER":
                if self.StringIsInt (Value):
                    IntVal= int (Value)
                    if IntVal in range (0,11): # Die Zahlen mssen im Bereich 0..10 liegen
                        a.newJob (b"\x07\x15" + bytes ([IntVal]) + b"\x65\x65\x65\x65\x65")
                        return "Kommando HK1 Reglereingriff auf " + Value + " Grad"
                    else:
                        return "Kommando HK1 Reglereingriff ungueltig: Gueltige Werte 0-10 Grad"
                else:
                    return "Kommando HK1 Reglereingriff: Vorgabe keine gueltige Zahl"
       #-----------------------------------------                             
            # Kommando schicken: Modus von WWB                            
            elif cmd== "WWB_MODE":
                if (Value=="0") or (ValueStr=="NACHT"):
                    a.newJob (b"\x0C\x0E\x00\x65\x65\x65\x65\x65")
                    return "Kommando Modus WWB: Nacht"
                elif (Value=="1") or (ValueStr=="TAG"):
                    a.newJob (b"\x0C\x0E\x01\x65\x65\x65\x65\x65")
                    return "Kommando Modus WWB: Tag"
                elif (Value=="2") or (ValueStr=="AUTO"):
                    a.newJob (b"\x0C\x0E\x02\x65\x65\x65\x65\x65")
                    return "Kommando Modus WWB: Automatik"
                else:
                    return "Kommando Modus WWB ungueltig (0,Nacht)(1,Tag)(2,Auto)"
       #-----------------------------------------                             
            # Kommando schicken: Zirkulationsmodus
            # 0 = Zirkulationspumpe aus, 1 = 1 mal Zirkulation pro Stunde, 10= 10 mal Zirkulation pro Stunde
            elif cmd== "WWB_ZIRK":
                if self.StringIsInt (Value):
                    IntVal= int (Value)
                    if IntVal in range (0,11): # Die Zahlen mssen im Bereich 0..10 liegen
                        a.newJob (b"\x0C\x0E\x65\x65\x65\x65\x65" +bytes ([IntVal]) ) 
                        return "Kommando WWB Zirkulation auf " + Value + " Zyklen pro Stunde"
                    else:
                        return "Kommando WWB Zirkulation ungueltig: Gueltige Werte 0-10 Zyklen"
                else:
                    return "Kommando WWB Zirkulation: Vorgabe keine gueltige Zahl"
       #-----------------------------------------                  
            # Kommando schicken: Programm einstellen                       
            elif cmd== "PROGRAMM":
                IntVal= -1
                if (ValueStr != "") and (ValueStr in d_PROG):
                    IntVal= int (d_PROG [ValueStr])                   
                elif self.StringIsInt (Value):
                    IntVal= int (Value)
                else:
                    return "Kommando Programm: Vorgabe keine gueltige Zahl 0-8"
                if IntVal in range (0,9): # Die Zahlen mssen im Bereich 0..8 liegen
                    a.newJob (b"\x11\x00" +bytes ([IntVal]) + b"\x65\x65\x65\x65\x65")    
                    return "Kommando Programm Nr " + str (IntVal) + " ["+ a_PROG [IntVal] + "] eingestellt"
                else:
                    return "Kommando Programm ungueltig: Gueltige Werte 0-8 "
       #-----------------------------------------
            # Kommando schicken: Sommer einstellen
            # Sommer stellt immer Heizung auf Sommer (oder <= 9 Grad)
            # Winter schaltet automatische Tempabschaltung ab (oder >=31 grad)
            # eine Gradzahl stellt die Temperatur ein, ab der Sommerbetrieb sein soll
            elif cmd== "SOMMER":
                IntVal= -1
                if ValueStr== "SOMMER":
                    IntVal=9
                elif ValueStr== "WINTER":
                    IntVal=31
                elif self.StringIsInt (Value):
                    IntVal= int (Value)
                else: 
                    return "Kommando Sommer: Vorgabe keine gueltige Zahl 9-31"
                if IntVal<9:
                    IntVal=9
                elif IntVal>31:
                    IntVal=31
                a.newJob (b"\x07\x00\x65" +bytes ([IntVal])+ b"\x65\x65\x65\x65")
                ValStr=""
                if IntVal==9:
                    ValStr= "[Sommerbetrieb]"
                if IntVal==31:
                   ValStr= "[Winterbetrieb]" 
                return "Kommando Sommer eingestellt auf " + str (IntVal) + " Grad " + ValStr
       #-----------------------------------------
            # Kommando schicken: Kesselauslegung einstellen
            elif cmd== "AUSLEGUNG":
                # Kessel Auslegungstemperatur wird geändert
                if self.StringIsInt (Value):
                    a.newJob (b"\x07\x0E\x65\x65\x65\x65" +bytes ([int (Value)])+ b"\x65")
                    return "Kommando Auslegung: Kesselauslegung geaendert auf " + Value + " Grad"
                else:
                    return "Kommando Auslegung: Vorgabe keine gueltige Zahl"
       #-----------------------------------------                  
            # Kommando schicken: URLAUB einstellen                       
            elif cmd== "URLAUB":
                if self.StringIsInt (Value):
                    IntVal= int (Value)
                    a.newJob (b"\x11\x00\x65\x65\x65" +bytes ([IntVal]) + b"\x65\x65")                    
                    return "Kommando Urlaub eingestellt auf " + Value + " Tage"
                else:
                    return "Kommando Urlaub: Vorgabe keine gueltige Zahl"
        #-----------------------------------------             
            elif cmd=="KILL":
                ende=True
                log ("error","KILL Kommando vom Webserver empfangen")
                return "Python Process Logamatic wird beendet"
        #-----------------------------------------    
            elif cmd=="HEX":
                if not (HexStr==""):
                    a.newJob (bytes.fromhex (HexStr))
                    return "HexKommando geschickt: " + HexStr
        #-----------------------------------------            
            #Hilfetextausgabe des Gateway           
            elif cmd=="HELP":
                zeile = "\n<code>Logamatic API Befehlssatz\n"
                zeile+= "LOGMODE ---------- Kommunikation einleiten mit Logamatic 2107 ueber 3964r\n"
                zeile+= "STATUS ----------- Fuehrt ein IOBroker Push durch mit Status Pumpen und Kessel\n"
                zeile+= "LCD:0 ------------ LCD aus (0) bzw LCD ein (1)\n"
                zeile+= "WWB_SW:44 -------- Solltemperatur setzen des WWB\n"
                zeile+= "WWB_ZIRK:2 ------- Anzahl Zirkulationszyklen pro Stunde\n"
                zeile+= "WWB_MODE:0 ------- Modus Warmwasser (0=Nacht, 1=Tag, 2= Auto\n"                
                zeile+= "HK1_MODE:0 ------- HK Modus (0=Nacht, 1=Tag, 2= Auto\n"
                zeile+= "HK1_REGLER:0 ----- Reglereingriff (0= Kein Eingriff, 10= maximaler Eingriff +/- 10 Grad\n"
                zeile+= "SOMMER:9 --------- Temperatur ab der Sommerbetrieb (9= Immer Sommer, 31= Immer Winter)\n"
                zeile+= "AUSLEGUNG:62 ----- Kesselauslegung: wird benutzt bei der Berechnung der Heizkurve\n"
                zeile+= "PROGRAMM:0 ------- Einstellen des Heizprogrammes\n"
                zeile+= "URLAUB:0 --------- Einstellen von Urlaubstagen (0=Aus)\n"
                zeile+= "-------------------- 0= Eigen, 1= Familie, 2= Frueh, 3= Spaet, 4=Vormittag\n"
                zeile+= "-------------------- 5= Nachmittag, 6= Mittag, 7=Single, 8=Senior\n"
                zeile+= "\n"
                zeile+= "Michael Thelen im Oktober 2017\n"                
                zeile+= "</code>"
                return zeile
            
        return "Kein Kommando"
 
    # Das dingen muss hier nicht Loggen
    def log_message (self,format,*args):
        return
    

    # GET wird aufgerufen von HTTP Server
    def do_GET(self):
        # Send response status code
        self.send_response(200)
     
        # Send headers
        self.send_header('Content-type','text/html')
        self.end_headers() 
        # Send message back to client
        message= "Logamatic 2107 Gateway\n" + self.analyse (self.path)
        if isinstance (message,str):
            message= message.replace ("\n","<br>")
        #message = "Hello world!\nNeue Zeile"       
        # Write content as utf-8 data
        self.wfile.write(bytes(message, "utf8"))
        
        return

    
class HTTPServer_ (threading.Thread):

    def __init__ (self,ServerAdress):
        log ("error","starting HTTP server...")
        self.Server_ = HTTPServer(ServerAdress, GateWay_RequestHandler)
        threading.Thread.__init__ (self)

    def run (self):
        self.Server_.serve_forever (0.5)
        self.Server_.server_close ()
        log ("error","HTTP Server terminated")
Vor der Hauptschleife im Main startest du den Webserver als separaten task ann mit

Code: Alles auswählen

GatewayServer= HTTPServer_ ( (ipHTML, portHTML) )
GatewayServer.start ()

Das war jetz tein Auszug aus dem gateway was seit 2017 unverändert bei mir unten läuft, musst du natürlich noch ein wenig auf deine Specs anpassen.
Im programmtext siehst du auch die Kodierungen, um bestimmte Konfigurationen im Kessel zu setzen.

Sommer: EIgentlich angabe von grad °... 9 = immer sommer, kessel zündet den HK nicht, wenn konfiguriert nur WWB betrieb 31 = Immer Winter = Dauerbedrieb kessel Bei Überschreitung von AUTemp > SommerTemp: Kesselbetrieb ausgesetzt

Frost und noch paar andere sind signedValuedByte, eine Art ShortInt. Musst du wie bei der Aussentemperatur so rechnen:

Code: Alles auswählen

  
                     # Achtung, das Value ist signet, also umrechnen
                    AU_T.setValuePrio (float (telegram [2]-256) if (telegram [2]>127) else float (telegram [2]) )
ich hoffe ich konnt dir erstmal weiterhelfen

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

alfa75ben
Beiträge: 9
Registriert: 01.04.2020, 12:35

Re: Buderus Logamatic 2107 Revision 3 2019

Beitrag von alfa75ben » 03.04.2020, 09:28

super geil. vielen vielen Dank
Webserver läuft schon mal. jetzt noch die signedValuedByte umrechnen und alle Werte ebenfalls über den Webserver darstellen lassen.

viele Grüße und 1000 Dank
Ben

sjs77
Beiträge: 3
Registriert: 05.04.2020, 18:44

Re: Buderus Logamatic 2107 Revision 3 2019

Beitrag von sjs77 » 05.04.2020, 19:20

Hallo zusammen!

Sehr interessanter Thread - da auch bei mir eine Logamatic 2107 steht, die ich auslesen will, bin ich auf diesem Forum gestoßen. (Fernziel ist bei mir aber nicht die Integration in eine Homematic-Installation, sondern die Integration in eine eigene Monitoring-Lösung.)

Die Hardware ist bei mir das originale Buderus KM271 und ein Raspberry Pi 3B+. Das habe ich schon zusammengestöpselt und mit Blacks 3964R-Treiber und seinem Logamatic-Klassen-Codeschnippsel von Seite 2 dieses Threads bekomme ich auch schon (halbwegs) sinnvolle Ausgaben der Logamatic:

Code: Alles auswählen

root@heizungspi:/home/pi# python3 test3.py
19:09:29.603015:[RX] 02r 10s 04r 00r 07r 01r 81r 0Er C0r 04r 10r 03r 5Ar 10s [DLE: OK]
19:09:32.604041:[RX] 02r 10s 80r 03r 28r 10r 03r B8r 10s [DLE: OK]
VL-Ist  :  40
19:09:35.604724:[RX] 02r 10s 84r 27r 36r 10r 03r 86r 10s [DLE: OK]
WW-Ist  :  54
19:09:38.601037:[RX] 02r 10s 88r 2Ar 2Dr 10r 03r 9Cr 10s [DLE: OK]
KS-Soll :  45
19:09:41.600263:[RX] 02r 10s 88r 2Br 29r 10r 03r 99r 10s [DLE: OK]
KS-Ist  :  41
19:09:44.600533:[RX] 02r 10s 88r 2Dr 34r 10r 03r 82r 10s [DLE: OK]
19:09:47.600406:[RX] 02r 10s 88r 2Er 00r 10r 03r B5r 10s [DLE: OK]
19:09:50.600683:[RX] 02r 10s 88r 2Fr 00r 10r 03r B4r 10s [DLE: OK]
19:09:53.600556:[RX] 02r 10s 88r 31r 2Ar 10r 03r 80r 10s [DLE: OK]
19:09:56.600786:[RX] 02r 10s 88r 32r 01r 10r 03r A8r 10s [DLE: OK]
19:09:59.601490:[RX] 02r 10s 88r 38r 91r 10r 03r 32r 10s [DLE: OK]
19:10:02.601387:[RX] 02r 10s 89r 3Cr 11r 10r 03r B7r 10s [DLE: OK]
19:10:05.600805:[RX] 02r 10s 89r 3Dr 10r 10r 10r 03r A7r 10s [DLE: OK]
19:10:08.873061:[RX] 02r 10s 04r 00r 07r 01r 81r 0Er C0r 04r 10r 03r 5Ar 10s [DLE: OK]
19:10:11.873704:[RX] 02r 10s 80r 03r 2Cr 10r 03r BCr 10s [DLE: OK]
VL-Ist  :  44
19:10:14.875252:[RX] 02r 10s 88r 2Br 2Cr 10r 03r 9Cr 10s [DLE: OK]
KS-Ist  :  44
19:10:17.870123:[RX] 02r 10s 88r 2Dr 32r 10r 03r 84r 10s [DLE: OK]
19:10:20.870392:[RX] 02r 10s 88r 31r 22r 10r 03r 88r 10s [DLE: OK]
19:10:23.870643:[RX] 02r 10s 88r 38r 92r 10r 03r 31r 10s [DLE: OK]


Woran ich allerdings aktuell scheitere, ist eine weitere "Entschlüsselung" der Diagramme. Genau genommen kann ich schon die Entschlüsselung in Blacks Logamatic-Codeschnippsel nur zur Hälfte nachvollziehen: Der Vorlauf- und Warmwasser-Werte decken sich ja noch mit der offiziellen Monitoringwerte-Doku, die man von Buderus zur Logamatic-4000-Serie im Netz findet. Aber bereits die Kessel-Temperaturwerte(?) kann ich nicht mehr nachvollziehen, weil hier Typ 0x88 und Offset 0x2A und 0x2B (42 und 43), die 4000er Doku aber bei Typ 0x88 nur bis 41 geht.

Lange Rede, kurzer Sinn: wo kann ich eine möglichst umfassende Erklärung zu den Datentelegrammen der Logamatic 2107 finden?
Vielen Dank schon mal für Eure Hilfe!

Viele Grüße
sjs77

Benutzeravatar
Black
Beiträge: 5471
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1071 Mal
Kontaktdaten:

Re: Buderus Logamatic 2107 Revision 3 2019

Beitrag von Black » 05.04.2020, 19:33

eine offizielle doku dazu gibts nicht... angefangen habe ich mit der "offiziellen" Buderus duku, die du auch hast... der rest ist reengiering...

882A ist KesselSollwert
882B KesselIstwert
882C ist die EInschalttemperatur der kessels
882D ist die Ausschalttemperatur des kessels

wenn du eine Komplette inoffzielle Doku findest, ich hätte da auch interesse ^^

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

sjs77
Beiträge: 3
Registriert: 05.04.2020, 18:44

Re: Buderus Logamatic 2107 Revision 3 2019

Beitrag von sjs77 » 05.04.2020, 22:44

Black hat geschrieben:
05.04.2020, 19:33
eine offizielle doku dazu gibts nicht... angefangen habe ich mit der "offiziellen" Buderus duku, die du auch hast... der rest ist reengiering...
OK, danke - dann muss ich wohl in diesen sauren Apfel beißen.
Da ich bislang ausschließlich lesend experimentiert habe (und bevor ich mir die Heizung schrotte): Hat die Logamatic 2107 ebenso wie die 4000er einen "Direct Mode" und einen "Normal Mode", zwischen denen man mittel 0xDD bzw. 0xDC hin- und herschalten kann?

TIA,
sjs77

Benutzeravatar
Black
Beiträge: 5471
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1071 Mal
Kontaktdaten:

Re: Buderus Logamatic 2107 Revision 3 2019

Beitrag von Black » 06.04.2020, 09:37

Nein, hat sie meines Wissens und ausprobierens nicht.

Am Anfang musst du einmal das Kommando logmode schicken EE0000. Daraufhin schickt dir die logamatik erstmal ihre aktuelle konfiguration und dann ihre istwertdaten.

Die istwertdaten sind das bekannte 3 Byte Telegramm.

Dann gibt's noch die konfigurationstelegramme (bank0 und bank1) 8 Byte

Und die fehlerspeichertelegramme (9 byte)

Und noch eine keep alive Telegramm, wenn keine datenänderung anstand um die Verbindung aktiv zu halten. Die sind auch 8 Byte Und fangen mit 04 an.

Daten schreibend ändern tust du mit einer besonderen Syntax der konfigurationstelegramme. Hab ich in dem programmbeispiel oben beschrieben. Wenn sie das Telegramm erfolgreich beantwortet sind die Daten übernommen

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

sjs77
Beiträge: 3
Registriert: 05.04.2020, 18:44

Re: Buderus Logamatic 2107 Revision 3 2019

Beitrag von sjs77 » 13.04.2020, 22:20

Hallo zusammen,

kaum lässte man sich mal ein paar Zehntausend Datentelegramme mitloggen, schon hat man wesentliche Erkenntnisse gewonnen. ;) Ich habe das mal alles zusammengeschrieben, soweit ich gekommen bin: https://github.com/sjs-77/logamatic2107_daten

Ich habe damit für mich erstmal (fast) alle Informationen beisammen, die für mich persönlich interessant sind, deswegen werde ich auf absehbare Zeit da wahrscheinlich nicht mehr viel Zeit in die Decodierung bzw. Reverse Engineering der Datentelegramme investieren. (Und mich stattdessen darauf konzentrieren, die Daten hübsch aufzubereiten und darzustellen. :) ) Wer mag, kann mir natürlich über GitHub gerne noch weitere Erkenntnisse zukommen lassen.

Einer der wenigen Aspekte, die ich bislang noch nicht verstanden habe, sind die Datenpunkte 0x88 0x2E und 0x88 0x2F. In der Logamatic-4000-Dokumentation wird das als "Kesselintegral" bezeichnet und zumindest bei Brennerbetrieb springen die Werte darin meistens wüst im gesamten Bereich zwischen 0 und 255 hin und her. Falls jemand eine sinnvolle Erklärung dafür hat, was diese Werte aussagen sollen, bin ich ebenfalls für Hinweise dankbar.

Ciao,
sjs77

Antworten

Zurück zu „Projektvorstellungen“