Forum: Haus & Smart Home Bus Protokoll Körting/EBV Gamma 2B


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Tim G. (timg)


Lesenswert?

Hallo,

ich besitze als Heizungssteuerung eine Körting Gamma 2B und bin an dem 
Protokoll interessiert, das die über RS485 spricht. Ich habe mal meine 
bisherigen Informationen und Code-Zeilen in ein Github-Repository und 
Wiki unter https://github.com/bogeyman/gamma/wiki gesammelt.

Ich habe einen RaspberryPi und einen USB-RS485 Dongle geholt und mir 
eine ganze Weile aus Spaß die Bytes angeguckt, die da rausfallen. Nach 
ein wenig Programmieren und Probieren hab ich einen kleines Python 
Programm geschrieben, dass die Nachrichten etwas auswertet und loggt. 
Zurzeit bekomme ich Datum und Uhrzeit, drei Temperaturen und eine 
Handvoll noch nicht zugeordneter Werte von der Heizung. Die Brenn-Zeiten 
versuche ich gerade zu ermitteln. Ein kleines Munin Skipt zum grafischen 
Auswerten der Temperaturen ist auch dabei.

Wenn jemand eine Körting, EBV(, Hoval Toptronic?), Typen Gamma/KB 2B, 
23B, 233B, 223B, 2233B oder ähnliche hat und Lust hat zu helfen, wäre 
ich über ein Feedback sehr froh. Klar kann es gut sein, dass je nach 
EEPROM Version und Hersteller die sich ganz anders verhalten.

Richtig interessiert bin ich natürlich an Mitschnitten von der 
Raumstation RS-10 oder einer Steuersoftware, falls jemand dazu Zugriff 
hat. Dann wäre vielleicht ein schreibender Zugriff möglich zum Ändern 
der Warmwasser Temperatur, Party-Taste-Emulation, usw. Wenn jemand ein 
EEPROM Dump hat, vielleicht lässt sich damit auch was anfangen ;)

Da meine Heizung plus Heizungssteuerung nicht mehr die neuste ist, habe 
ich aber nicht vor, z.B. viel Geld für eine Raumstation auszugeben. Ich 
gucke regelmäßig nach gebrauchen, aber die liegen meist um den original 
Preis und das bin ich nicht bereit zu investieren. Aber am Protokoll zu 
basteln macht jedoch noch genug Spaß, ich kann Daten auswerten, und 
vielleicht ist ja noch mehr möglich.

Schöne Grüße,
Tim

von NightFox (Gast)


Lesenswert?

Hi,
Ich habe mir die Raumstation 10 vor einiger Zeit gekauft. Wollte anfangs 
auch was eigenes basteln, hatte jedoch nicht die Zeit dazu und noch 
nicht das benötigte know-how .... Mein Plan war es mal den Datenbus 
abzuhören um per SMS oä die Heizung steuern zu können. Habe leider bis 
mitte November wenig Zeit mich mit weiteren Projekten zu beschäftigen 
:-/ Es wäre hilfreich wenn du eine Verdrahtungsskizze des Pi's mit noch 
evtl. benötigter Hardware online stellen würdest, dann könnte ich mir 
das schnell nachbauen und ein paar Sachen dumpen =)

mfG

NighFox

von Tim G. (timg)


Lesenswert?

Ich freu mich über jeden, der sich meldet. Ich hatte schon befürchtet, 
dass ich keinen mehr finde, der Interesse an der doch etwas betagten 
Hardware hat. Zeit ist immer ein knappes Gut, ist bei mir nicht anders. 
Um so schöner, dass Du eine Interesse (und Raumstation) hast. Ich bau in 
der nächsten Zeit mal die Mitmach-Seite im Wiki aus, damit jeder im 
besten Fall auch ohne Ahnung einfache Listen abarbeiten kann: Hardware 
bestellen, an Heizung anschließen, Pi einrichten. Ich schreib hier, wenn 
es was neues gibt.

Aus Interesse noch ein paar schnelle Fragen:
- Hast Du die Raumstation selber angeschlossen, oder das machen lassen? 
Anschluss über "Schraubklemmen" auf der Rückseite oder 5pol DIN Stecker?
- Wie ist die genaue Bezeichnung der Raumstation und Heizungsteuerung, 
am besten von der Bedienungsanleitung? Also Hersteller und Modellname
- Erfahrung Pi/Linux/Shell?

Schöne Grüße,
Tim

von NightFox (Gast)


Lesenswert?

Hi,
Wenn ich alles aufgebaut habe sind ja schnell ein paar Szenarien 
durchgespielt und Protokollmitschnitte gezogen. Raspberrys hab ich noch 
genügend übrig ;) Ich brauche nur einen RS485 Adapter, kannst du mir da 
einen empfehlen, nicht dass ich mir schon die Uhr breche um den am 
Raspberry zum laufen zu bringen.
Zu deinen Fragen:
-Die RS habe ich selbst über die 4-polige Schraubklemme angeschlossen 
(leider über ein nicht-abgeschirmtes Kabel, ~6m, es sind bisher aber 
noch keine Probleme aufgetaucht)
-Die Heizungssteuerung ist die Gamma 2B, firmware version 1.09.
Von der "Raumstation Gamma RS-10" finde ich keine genauere Bezeichnung. 
Eventuell steht da mehr auf der Rückseite. Firmware 1.20
- Erfahrung mit Pi, Linux und Shell habe ich schon etwas.

mfG

von Tim G. (timg)


Lesenswert?

Hi,

leider ist der Adapter, den ich damals geholt habe nicht mehr verfügbar. 
Aber eigentlich sollte jeder gehen, den Du bei Amazon/ebay/usw mit "usb 
rs485 adapter" findest, solange der Treiber beim Pi dabei ist. Ich habe 
mir zu testen mal einen zur Reseve bei ebay für unter 5 Euro direkt aus 
China geordert, dauert halt nur drei Wochen bis das ankommmt. Conrad und 
Reichelt und Co hab ich mir noch nicht angeguckt.

Zur Verkabelung und Inbetirebnahme hab ich schon was geschrieben, aber 
noch nicht im Wiki.  Bis zum Wochenende komm ich dazu, denke ich.

Schöne Grüße,
Tim

von Tim G. (timg)


Lesenswert?

An alle Interessierten:

Ich habe mittlerweile ein paar Dumps bekommen, die schon sehr 
weiterhelfen. Ich bin gerade dabei etwas mehr Licht in das Protokoll zu 
bringen, hab aber noch keinen Stand den ich dokumentieren will.

Updates folgen unter
https://github.com/bogeyman/gamma/wiki

Schöne Grüße,
Tim

von Thomas (Gast)


Lesenswert?

Hallo Tim,

ich habe inzwischen meinen (neuen) RasPi mit USB-Dongle an die RS485 
Schnittstelle der Heizung angeschlossen. Ich habe eine Körting KB233 
(V 1.03) mit RS10 Raumstation.

Nach ein bischen ausprobieren kann ich die Brenner, Vorlauf, Außen- und 
Wassertemperatur auslesen. Ebenso das Datum.
Nachrichtentypen sind 2004, 0905 und 4002 wie auch z.T. von Dir 
dokumentiert.

Realisiert habe ich dies mit Node-RED unter Iobroker zur Einbindung in 
die Hausautomatisierung. Nachdem ich 20 Jahre nicht mehr programmiert 
hatte, war die Hürde Javascript. Hat mich dann 2-3 Tage gekostet, die 
Syntax zu verstehen. Danach geht die Datenauswertung als reines 
Info-System unter Node-RED mit wenigen Zeilen Code.

Wie kann ich ggfs. noch unterstützen? Interessant wäre das Verändern der 
Parameter.

Viele Grüße
Thomas

von Tim G. (timg)


Lesenswert?

Hallo Thomas,

das hört sich gut an. Iobroker kannte ich noch gar nicht, aber ich hab 
mal eine zeit lang Javascript beruflich entwickelt, das gucke ich mir 
mal an. Ich knabbere gerade ein wenig am Timing der Steuerung und der 
Raumstation (ich habe eine günstig überlassen bekommen). Da werden 
Bytes, die ich sende schon mal schnell ignoriert, wenn sie nicht 
punktgenau ankommen. Leider haben die USB-RS485 Dongles zum effizienten 
Übertragen vieler Daten über den USB Bus einen Timer btw. eine 
Minimum-Paketgröße bzw. ein bestimmbares Event-Byte, wann der Buffer vom 
Dongle an den Rechner übertragen wird. Und das macht erstmal mein Timing 
kaputt. Ich bin aber dran. (Zur Erklärung: bei 9600 baud mit Start und 
Stopbit kommt man auf knapp 1ms pro Byte, der Minimuntimer beim 
USB-Dongle ist auch 1ms. Das scheint auch grob die Toleranz bei der 
Raumstation und der Heizungssteuerung zu sein :/ )

Wenn mir die Simulation einer Heizungssteuerung gegen einer echten 
Raumstation oder die Simulation einer Raumstation gegen einer echten 
Heizungssteuerung gelingt, dann sind die Werte nur noch eine kleine 
Detektivarbeit.

Wen Du noch Erkenntnisse hast, die noch nicht unter 
https://github.com/bogeyman/gamma/wiki/Protokoll dokumentiert sind, sag 
mal Bescheid.

Magst Du mir Deinen Javascript mal geben, zum probieren? Im wiki steht 
auch eine email Adresse.

Wenn es einen Durchbruch gibt schreib ich auch nochmal hier.

Beste Grüße,
Tim

von Bernd (Gast)


Lesenswert?

Hallo, mal eine ähnliche Frage. Ich hab ein gebrauchte KBM 233b gekauft. 
Da ist ein Code für die Fachmann Einstellung. Gibt es einen Weg den zu 
deaktivieren oder zurück zu setzen? Muss die Vorrang Einstellung ändern.

Grüße
Bernd

von Tim G. (timg)


Lesenswert?

Hallo Bernd,

wir haben leider keinen Fachmann Ebenen Code. Für mich wäre der 
interessant, da man dort die Busadresse ändern könnte. Aus Erfahrung, da 
ich auch gesucht habe:

- Du findest häufig Aussagen, wie "Ich kenne den auch nicht , aber 
probier doch mal (0000|1234|0123|0815|0615|9999) oder Kombinationen 
daraus". Ich habe was rumprobiert, aber nach dem fünfzehnten Code macht 
das keinen Spaß mehr.

- Dann gibt es Leute in Foren, die sagen "Ich hab den Code jetzt, geb 
den aber nur via PM weiter". Abgeschrieben, nichts passiert. Beiträge 
waren aber auch in der Regel einige Jahre alt...

- Frag einen entsprechenden "Fachmann". Werde ich bei meiner 
Heizungswartung jetzt machen. ;) Klar, doof, kostet Geld. Und kann sein, 
dass der sagt, dass er das entsprechend einstellt, aber Dir den Code 
nicht verrät. Weil man da Sachen einstellen kann, die die Hardware auch 
eher kaputt machen können...

Hoffe es ist wenigstens eine kleine Hilfe,
Tim

von Thomas (Gast)


Lesenswert?

Bei Körting ist der CODE 2129.
Je nach Hersteller aber unterschiedlich.

von Simon S. (simschmid)


Lesenswert?

Wenn du eine RS-10 hast probiere mal das Zauberwort 0010, wenn du eine 
RS-30 hast 0030, hab ich mal so in einem anderen Forenbeitrag gesehen 
...

von Micha M. (bavilo)


Lesenswert?

Gibt es hierzu updates?

Habe eine Ceta 104 und 106 von EBV. Währe echt dankbar wenn ich diese 
beiden über den Bus auslesen könnte.

von Tim G. (timg)


Lesenswert?

Hallo zusammen,

mittlerweile habe ich verschiedene Daten von der Gamma und Ceta Serie 
bekommen (RS-485), die ich gerade in einen Parser einarbeite, damit die 
Leute möglichst viele Werte auslesen können. Bei der Theta Serie konnte 
mir noch niemand verraten, wie das Protokoll auf Hardware-Ebene 
funktioniert (T2B), so dass man das z.Z. gar nicht anschließen kann. Das 
Schreiben von Nachrichten ist noch nicht ganz gelöst, aber ich habe das 
Interesse noch nicht verloren ;) Da es aber darauf hinauslaufen wird, 
ein separates Programm oder Hardware neben der Heimautomatisierung 
nutzen zu müssen, tendiere ich gerade dazu die Werte z.B. via JSON zur 
Verfügung zu stellen, dann muss ich weniger Code pflegen. Updates sollen 
in den nächsten Wochen folgen...

Grüße, Tim

von Da geht was (Gast)


Lesenswert?

Tim G. schrieb:
> Bei der Theta Serie konnte
> mir noch niemand verraten, wie das Protokoll auf Hardware-Ebene
> funktioniert (T2B), so dass man das z.Z. gar nicht anschließen kann.

Das Signal wird über einen Trafo ausgekoppelt. Auf der Theta findest du 
hinter der Abdeckung oben rechst eine Debug-Schnittstelle. Dort liegt 
das Signal vom UART (µC) mit Logikpegel.

von Tim G. (timg)


Lesenswert?

Da geht was schrieb:
> Tim G. schrieb:
>> Bei der Theta Serie konnte
>> mir noch niemand verraten, wie das Protokoll auf Hardware-Ebene
>> funktioniert (T2B), so dass man das z.Z. gar nicht anschließen kann.
>
> Das Signal wird über einen Trafo ausgekoppelt. Auf der Theta findest du
> hinter der Abdeckung oben rechst eine Debug-Schnittstelle. Dort liegt
> das Signal vom UART (µC) mit Logikpegel.
Ich habe leider selber keinen Zugriff auf eine Theta. Hast Du noch ein 
paar mehr Infos dazu? Hat die debug Schnittstelle einen Stecker? Ist das 
RS485 in nicht Standard? Mir würde es darum gehen, dass andere genug 
Infos bekommen, um irgendwelche Adapter anschließen zu können. Wäre 
spannend...

von Da geht was (Gast)


Lesenswert?

Tim G. schrieb:
> Hat die debug Schnittstelle einen Stecker

Es handelt sich um eine Buchsenleiste. Mit einem RS232 Wandler kannst du 
dort die Kommunikation mit lesen.

Ich muss erst wühlen bevor ich an die alten Adapter komme. Auf der 
Platine kann man die Rx/Tx Leitungen gut nachverfolgen.

von Tim G. (timg)


Lesenswert?

Schick! +5v/-5v? Hmm, ich hätte da eine Wunschliste: Ein Foto vom 
Anschluss zum Veröffentlichen auch gern via Mail und ein RAW dump der 
Daten ;) wäre super!

von Da geht was (Gast)


Lesenswert?

Tim G. schrieb:
> +5v/-5v?

Nö, direkt von den Ports abgegriffen. Also nur Logik.


Tim G. schrieb:
> Ein Foto vom
> Anschluss

Klapp den Deckel auf. ;-)


Tim G. schrieb:
> RAW dump der
> Daten

Wenn ich viel Langeweile habe, kram ich das Zeug mal wieder raus. Meine 
Motivation für das Thema ist mikroskopisch.

von Tim G. (timg)


Lesenswert?

Da geht was schrieb:
> Tim G. schrieb:
>> +5v/-5v?
>
> Nö, direkt von den Ports abgegriffen. Also nur Logik.
>
"Logikpegel", Mist, wer lesen kann, ist klar im Vorteil.

Aber der Hinweis ist schonmal Gold wert, wenn jemand anders eine Theta 
hat uns sich dran versuchen will. Ich bastel erstmal auf meinen 
Baustellen weiter...

von Micha M. (bavilo)


Lesenswert?

Hört sich vielversprechend an!

Ich hatte dir die Logs der CETA geschickt. Wenn du noch mehr brauchst 
sag einfach Bescheid.

von Sulla (Gast)


Lesenswert?

Hallo!
Ich habe eine Hoval RS-10 Raumsteuerung für einen Hoval TopTronic 23B 
Controller an einem Holz-Stückgut-Brenner Hoval Agrolyt 20.

Der Hoval Holzbrenner hat verschiedene Betriebsstatus, die er auf seinem 
kleinen Kesseldisplay (das ist nur ein LED-Display) kund tut.
1 = Anheizphase
2 = volle Leistung
...
5 = Ausbrand
6 = Kessel-Restwärmeausnutzung
7 = Temperatur im Kessel zu hoch
8 = Türe offen

Mich würde interessieren, ob man auf diese Betriebsmodi irgendwie über 
RS485 dran kommt. Auf der RS-10 habe ich die Modi nicht, daher ist 
fraglich, ob diese dem Bus grundsätzlich zugänglich sind. Die 
Programmierung der Kesselsteuerung ist nämlich so grottenschlecht 
umgesetzt, dass das System sehr viel Energie verschwendet, die 
Restwärmeausnutzung funktioniert nämlich mehr schlecht als recht.

Wäre seeeehr gut, diese in einen Raspberry einzulesen und übers 
SmartHome zugänglich zu machen. Ob das geht?
Ich mag irgendwie nicht an die Steuerplatine des LED-Displays ran. 
Theoretisch könnte man natürlich die LEDs alle abgreifen und über I/O 
Pins in einen Raspi einlesen...

Thx,
Sulla

von Thorsten (Gast)


Lesenswert?

Hallo,

gibt es bzgl. der Ceta 104 Fortschritte?
Hat schon mal jemand versucht die RC Schnittstelle auszulesen?

Gruß,
Thorsten

von Michael (Gast)


Lesenswert?

Tim G. hat sich seit über einen Jahr nicht mehr gemeldet. Ich glaube das 
Projekt ist tot...Schade.

von Kim M. (kimdo8)


Lesenswert?

Hat an der Arbeit von Tim G. noch jemand angeknüpft?
Ich überlege, mittels ESP32 Daten der Heizungssteuerung per WLAN 
abrufbar zu machen. Die Idee: z.B. Einbindung in HomeAssistant. Wenn Tim 
G. seine ersten an der Schnittstelle mit dem Raspi gemacht hatte, wie er 
schreibt, dann sollte das mit dem ESP32 auch gehen. Hat da schon mal 
jemand etwas gemacht?

von Thomas M. (tomas_m)


Lesenswert?

Kim M. schrieb:
> Hat an der Arbeit von Tim G. noch jemand angeknüpft?
>... Hat da schon mal jemand etwas gemacht?

Ich hätte auch Interesse, bereite gerade den RS485 Adapter vor.

: Bearbeitet durch User
von Centrus (Gast)


Lesenswert?

Thomas M. schrieb:
> Ich hätte auch Interesse, bereite gerade den RS485 Adapter vor.

Naja. RS485 Adapter gibt es ja billigst auch in EU.
https://www.ramser-elektro.at/shop/module-sensoren-adapter-und-co/adapter-usb-auf-rs485-modbus/

von Kim M. (kimdo8)


Lesenswert?

Ich bin jetzt soweit und kann über ein RS485-Shield mittels Arduino wie 
von Tim G. beschrieben, das Protokoll mitlesen. Mein Problem: ich komme 
aus den Protokollwerten nicht auf die tatsächlichen Temperaturwerte, die 
mich interessieren. Die von Tim G. angegebenen Bytepositionen im 
Protokoll scheinen zwar die Temperaturwerte zu sein, jedoch habe ich 
noch keinen Zusammenhang gefunden, die Protokollwerte in tatsächliche 
Temperatur umzurechnen. Tim G. schreibt ja auch, dass dies über einen 
Faktor umgerechnet wird. Dieser ist aber nicht konstant. Beim Vergleich 
von Protokollwerten und tatsächlich gemessenen Temperaturen habe ich 
keinen linearen Zusammenhang erkennen können. Hat jemand hierzu Infos 
oder eine Idee?

von Thomas M. (tomas_m)


Lesenswert?

Centrus schrieb:
> Naja. RS485 Adapter gibt es ja billigst auch in EU.
?! klar. Mit Vorbereiten meinte ich in meinem Falle eine Linux 
Installation des SBC, dass ich an den Adapter hänge.


Kim M. schrieb:
> Ich bin jetzt soweit und kann über ein RS485-Shield mittels Arduino wie
> von Tim G. beschrieben, das Protokoll mitlesen.

Mitlesen bedeutet, dass man ein Remote Gerät benötigt, dass mit der 
Regelung spricht, oder ? Wie man das "ohne" antriggert, weisst Du nicht, 
oder?

> Mein Problem: ich komme
> aus den Protokollwerten nicht auf die tatsächlichen Temperaturwerte,

Hast Du mal ein paar Werte zum Mitgrübeln ?

Gruss, Tomas

von Kim M. (kimdo8)


Lesenswert?

> Mitlesen bedeutet, dass man ein Remote Gerät benötigt, dass mit der
> Regelung spricht, oder ? Wie man das "ohne" antriggert, weisst Du nicht,
> oder?
Wenn ich den Arduino über RS485 an das vordere Interface stecke, kann 
ich die Datagramme (wie von Tim G. beschrieben) ohne besondere Aktion 
meinerseits mitlesen. Das passt zumindest zu meinem Verständnis, dass es 
sich ja hier bereits um einen Bus handelt, auf dem zyklisch Daten 
ausgetauscht werden. Mit meinem Arduino will ich zunächst nur mitlesen. 
Aktives Auslesen oder Antriggern mache ich zumindest nicht bewußt.

> Hast Du mal ein paar Werte zum Mitgrübeln ?
Hier mal ein paar Datagramm-Ausschnitte (beginnend mit "FF 82 10 20 20 4 
...") sowie abgelesene Werte. Die Beispiele 1.+2. liegen zeitlich nur 
wenige Min. auseinander.
1.) ... 85 10 1 10 0 0 0 0 0 0 0 0 0 0 0 7E 10 1 10 0 0 0 0 0 0 0 0 0 0 
0 60 4C ...
AußenT: 15,0
KesselT: 44
VorlaufT: 33
Brenner läuft

2.) ... 85 10 0 0 0 0 0 0 0 0 0 0 0 0 0 52 10 0 10 0 0 0 0 0 0 0 0 0 0 0 
62 4C ...
AußenT: 15,0
KesselT: 44
VorlaufT: 35
Brenner hat gestoppt

3.) ... 7B 10 1 10 0 0 0 0 0 0 0 0 0 0 0 7E 10 1 10 0 0 0 0 0 0 0 0 0 0 
0 68 4C ...
AußenT: 9,5
KesselT: 47
VorlaufT: 40

4.) ... 77 10 0 0 0 0 0 0 0 0 0 0 0 0 0 68 10 0 10 0 0 0 0 0 0 0 0 0 0 0 
70 4C ...
AußenT: 8,0
KesselT: 50
VorlaufT: 42

5.) ... 75 10 0 0 0 0 0 0 0 0 0 0 0 0 0 69 10 1 10 0 0 0 0 0 0 0 0 0 0 0 
6E 4C ...
AußenT: 6,5
KesselT: 50
VorlaufT: 44

Die Aussentemperatur wurde direkt an der Steuerung ausgelesen.
Kessel- und Vorlauftemperatur wurden von analogen Anzeigen an der 
Heizung abgelesen. Da kann es also Ablese-/Anzeigefehler geben. Auch ist 
denkbar, dass diese analogen Anzeigen und die Steuerungsinternen 
Sensoren unterschiedlich träge sind, so dass es bei Temperaturänderungen 
zu Abweichungen kommt.

Gruß Kim

von Thomas M. (tomas_m)


Lesenswert?

Hi Kim,
du machst nichts mit Gallipoli ? Ich hab es installiert und erstmal 
versucht ans Laufen zu bekommen, aber ich verstehe nicht so ganz, wie 
das funktionieren soll, also werde ich mich glaube ich jetzt auch 
erstmal ans manuelle Dekodieren machen. Ich schau mir Deine 
Beispiel-Datensätze mal an (Hatte völlig vergessen, dass ich Dich danach 
gefragt hatte und war zwischendurch krank).

von Kim M. (kimdo8)


Lesenswert?

Nein, meine Idee war, mittels ESP32 und einem RS485-Adapter den Bus der 
Heizung mit zu lesen und die für mich interessanten Werte per http 
abfragbar zu machen. Daher hatte ich auf Basis der Doku von Tim G. die 
Dekodierung im ESP „zu Fuß“ vornehmen wollen und komme da jetzt nicht 
weiter.

: Bearbeitet durch User
von Thomas M. (tomas_m)


Lesenswert?

Ok, so werde ich das "langfristig" vermutlich auch machen, bzw. nicht 
per http, sondern der ESP wird die Werte per MQTT pushen.

Wenn ich mir Deine Werte so anschaue, dann passt die Aussentemperatur 
auf jeden Fall mit den Angaben in
https://github.com/bogeyman/gamma/wiki/Protokoll

ueberein:

#2  dez  x/2-52  Aussentemp
85  133  14.5    15
85  133  14.5    15
7b  123   9.5    9,5
77  119   7.5    8,0
75  117   6.5    6,5

die Kesseltemperatur, mit einer relativ konstanten Abweichung (die 
analoge Anzeige duerfte nicht zu genau sein) auch:

#32 dez  x/2  Kessel
60  96   48   44
62  98   49   44
68  104  52   47
70  112  56   50
6e  110  55   50

Hinter den Vorlaufwert bin ich noch nicht gekommen, aber da kann 
natuerlich tatsaechlich die von Dir genannten Traegheit zum Tragen 
kommen, denn die Vorlauftemperatur aendert sich ja bei offenen Ventilen 
relativ schnell.
Gruss/Tomas

: Bearbeitet durch User
von Thomas M. (tomas_m)


Lesenswert?

Ich hab gestern meine Steuerung mal angeklemmt und im Nachgang ist mir 
aufgefallen, dass ich die falschen Klemmen benutzt habe, (weil die mit 
AB bezeichnet waren und an den RC Klemmen keine Polaritaet angegeben 
war). Die Datagramme, die da raus kommen, sehen ein wenig anders aus, 
aber beinhalten vermutlich die gleichen Informationen etwas anders 
repraesentiert. Ich hab's erstmal nicht umgeklemmt, weil ich hoffe 
eventuell das Brenner ein/ausschalten mitbekommen zu koennen.
Ich hab die ganze Nacht geloggt, in der Hoffnung, dass ich was erkennen 
kann:

https://termbin.com/l48z

von Phire S. (phire_s)


Lesenswert?

Hallo zusammen.

Ich hab den Thread nur halb gelesen aber da das hier eine von zwei 
Konversationen die man übernhaupt im Internet zu dem Thema findet ist 
erwähne ich es mal:

Ich habe in den letzten Tagen eine Brücke von meiner Theta N 23B zu MQTT 
und Home Assistant geschrieben (per serieller Debug-Schnittstelle). Mein 
Code dazu und info zum Protokoll das das Ding verwendet ist hier 
zusammengefasst:

https://github.com/phiresky/ebv-theta-to-mqtt

Das was ich sehe sieht recht ähnlich aus was Thomas in seiner letzten 
Nachricht geschickt hat, und recht anders als das was in dem Wiki zur 
Gamma oben verlinkt ist.

von Oliver S. (oliverso)


Lesenswert?

Phire S. schrieb:
> Das was ich sehe sieht recht ähnlich aus was Thomas in seiner letzten
> Nachricht geschickt hat, und recht anders als das was in dem Wiki zur
> Gamma oben verlinkt ist.

Nun ja, deine ist eine Theta, die oben eine Gamma. Das sind 
unterschiedliche Steuerungsgenerationen, und die haben bis auf den 
selben Hersteller nicht allzu viel miteinander zu tun.

Oliver

von Thomas M. (tomas_m)


Lesenswert?

Phire S. schrieb:

>
> Das was ich sehe sieht recht ähnlich aus was Thomas in seiner letzten
> Nachricht geschickt hat, und recht anders als das was in dem Wiki zur
> Gamma oben verlinkt ist.

Ich hab etwas ähnliches über die Ceta angefangen:

https://github.com/tmuehlhoff/ceta

Da Du -speziell in Sachen MQTT- schon weiter bist werde ich vermutlich 
das ein oder andere von Dir übernehmen! Danke ;)

von Phire S. (phire_s)


Lesenswert?

> Ich hab etwas ähnliches über die Ceta angefangen

Super!

Das Nachrichtenformat sieht echt ziemlich gleich aus, du könntest mal 
versuchen meinen Code unverändert bei dir laufen zu lassen. Also erst 
`justdump.py` um zu loggen und dann protocol_parse.py um die logs zu 
parsen (und einen plot zu erstellen mit den interesting_values über 
zeit.

Lass mich wissen wenn ich irgendwie helfen kann.

Bis auf das grundlegende Nachrichtenformat (210a0a + 16-bit nachrichten 
typ + nachrichten länge + ... + CRC16) ist an meinem Code eigentlich 
nichts speziell. Die Nachrichteninhalte sind in deklarative liste von 
interessanten Offsets/Namen in interesting_values.yaml.

von Thomas M. (tomas_m)


Lesenswert?

Phire S. schrieb:
...
> versuchen meinen Code unverändert bei dir laufen zu lassen. Also erst
> `justdump.py` um zu loggen und dann protocol_parse.py um die logs zu
> parsen (und einen plot zu erstellen mit den interesting_values über
> zeit.

Ich hatte die Plots schon von Hand in gnumeric erstellt, sehen Deinen 
ziemlich ähnlich. Kann ich natütlich trotzdem mal machen.
Vor allem diese Stati sind mir noch unklar, da wollte ich mal ein paar 
Sachen "rumstellen" an der Steuerung und die entsprechenden Änderungen 
anschauen... Bin ich noch nicht zu gekommen.

Ich bin nicht so firm in JSON, ist irgendwie nicht mein Format, aber 
muss ich mich wohl durchwuseln ;) Macht ja für SONOFF-MQTT eh Sinn.

von Thomas M. (tomas_m)


Lesenswert?

1
root@bananapim2ultra:/home/tomas/ebv-theta-to-mqtt# python3 protocol_parse.py  dump-2023-02-12T23\:03\:59+01\:00.jsonl 
2
Traceback (most recent call last):
3
  File "/home/tomas/ebv-theta-to-mqtt/protocol_parse.py", line 75, in <module>
4
    timestamp: datetime, message: bytes, plot_data: dict[str, list[dict]] | None
5
TypeError: unsupported operand type(s) for |: 'types.GenericAlias' and 'NoneType'

Hab ich da eine falsche Lib ?

: Bearbeitet durch User
von Phire S. (phire_s)


Lesenswert?

Wenn du sie schon hast ist nat. auch gut ;)

Ich hab grad mal deinen dump von oben durch meinen code geschoben:

    wget https://termbin.com/l48z
    cat l48z|cut -c 1-52 > cut
    pdm run protocol_parse.py cut



 und es hat sie tatsächlich richtig verarbeitet. Also die CRC summe und 
das nachrichtenformat sind gleich.

Du hast in deinem dump irgendwie in jeder Zeile irgendwie links eine 
valide nachricht und rechts noch eine die abgeschnitten aussieht - 
zumindest endet sie nicht in einer CRC16 summe und die nachrichtenlänge 
scheint auch nicht zu stimmen.


> unsupported operand type
Äh ja du brauchst für meinen code python 3.10 weil ich gerne im cutting 
edge lebe ^^, der syntax fehler kommt von python <=3.9.

von Phire S. (phire_s)


Angehängte Dateien:

Lesenswert?

Mit folgender interesting_values.yaml:

- message_type: [0x84, 0x17]
  byte_offset: 1
  format: u8
- message_type: [0x84, 0x17]
  byte_offset: 3
  format: u16le
- message_type: [0x84, 0x17]
  byte_offset: 5
  format: u16le
- message_type: [0x84, 0x17]
  byte_offset: 7
  format: u16le
- message_type: [0x84, 0x17]
  byte_offset: 9
  format: u16le


gibt mein code für deinen obigen paste-bin dump folgendes aus: (siehe 
Anhang)

Sieht also ziemlich gut aus :)

: Bearbeitet durch User
von Thomas M. (tomas_m)


Lesenswert?

Phire S. schrieb:
...
>     wget https://termbin.com/l48z
...
> Du hast in deinem dump irgendwie in jeder Zeile irgendwie links eine
> valide nachricht und rechts noch eine die abgeschnitten aussieht -

Richtig ;) Ich hatte die Daten "da noch" mit dem Script von Tim 
ausgelesen, dass aber von einer festen und falschen Länge ausgegangen 
ist (von der Gamma halt).
Ich hatte die Tage Corona und hab das mit Brummschädel erstmal nicht 
bemerkt, mir war zwar klar, dass da "irgendwas nicht in Ordnung" war, 
aber ich hatte mich erst mit den Werten beschäftigt.

Kann ich in Deinem Repo einen Branch aufmachen und meine Ceta Sachen 
einfach hinzufügen ?

Python 3.10, kein Thema, ich hatte die Büchse allerdings erst mühsam auf 
2.7 runtergepatcht (was bei Debian 11 gar nicht so einfach war), um Tims 
Code laufen zu lassen. Bin selbst weder Coder noch mag ich Python 
sonderlich, daher ist das für mich einfacher die Umgebung so 
hinzubasteln, dass der Code läuft und nicht umgekehrt ;)

von Phire S. (phire_s)


Lesenswert?

> Kann ich in Deinem Repo einen Branch aufmachen und meine Ceta Sachen
einfach hinzufügen ?

Ja klar, klingt gut.

Macht vielleicht auch Sinn über spezifisches wo anders zu diskutieren 
(z.B. hier: https://github.com/phiresky/ebv-theta-to-mqtt/discussions ) 
um den Thread hier nicht zu sehr ausarten zu lassen.

von Christian H. (christian_h748)


Lesenswert?

Hallo zusammen,

dank eurer Vorarbeit hier im Forum habe ich meine CETA 100 erfolgreich 
verbinden können. Andere CETA Versionen sollten ähnlich sein.

Ich habe dazu einen ESP32 (Wemos D1 mini) mit einem RS485 Adapter 
verbunden.
Als Platform habe ich ESPhome verwendet.

Über die UART kann ich jetzt folgende Parameter auslesen:
1. Temperatur am Solarmodul
2. Temperatur im Heizkessel
3. Pumpenmodus / Zirkulationspumpe ein/aus
4. Anzahl Pumpenstarts
5. Betriebstunden

alles read-only!

Hier noch mein Code (bestimmt nicht schön geschrieben - aber es 
funktioniert :-)):

CETA100.YAML
1
esphome:
2
  name: "name"
3
  includes:
4
    - my_CETA100_uart.h
5
6
esp32:
7
  board: esp32dev
8
  framework:
9
    type: arduino
10
11
# Enable logging
12
logger:
13
14
# Enable Home Assistant API
15
api:
16
  encryption:
17
    key: "XXXXXXX"
18
19
ota:
20
  password: "XXXXXXX"
21
22
23
wifi:
24
  ssid: !secret wifi_ssid
25
  password: !secret wifi_password
26
27
  # Enable fallback hotspot (captive portal) in case wifi connection fails
28
  ap:
29
    ssid: "XXXXXXX"
30
    password: "XXXXXXX"
31
32
captive_portal:
33
34
35
36
#CETA100 control
37
uart:
38
  id: uart_bus
39
  tx_pin: 3
40
  rx_pin: 1
41
  baud_rate: 9600 #port = serial.Serial(serialDevice, baudrate=9600, timeout=60.0, bytesize=serial.EIGHTBITS, stopbits=serial.STOPBITS_ONE, parity=serial.PARITY_NONE, xonxoff=False, rtscts=False, dsrdtr=False)
42
  stop_bits: 1
43
#  debug:
44
#    direction: BOTH
45
46
binary_sensor:
47
  - platform: template
48
    name: "CETA100 Pumpen Mode"
49
    device_class: "running"
50
    lambda: |-
51
      if (id(CETA100_Pumpen_Mode).state > 0) {
52
        return true;
53
      } else {
54
        return false;
55
      }
56
57
58
sensor:
59
  - platform: custom
60
   #     auto CETA100_Sensor = new CETA100Sensor(id(uart_bus),60000);
61
    lambda: |-
62
      auto CETA100_Sensor = new CETA100Sensor(id(uart_bus));
63
      App.register_component(CETA100_Sensor);
64
      return {CETA100_Sensor->burnerMode_sensor,
65
              CETA100_Sensor->PVTemp_sensor,
66
              CETA100_Sensor->ActWasserspeicherTemp_sensor,
67
              CETA100_Sensor->BetriebsStundenPumpe_sensor,
68
              CETA100_Sensor->AnzahlStartsPumpe_sensor};
69
    sensors: 
70
    - name: "CETA100 Pumpen Mode temp"
71
      internal: true
72
      id: CETA100_Pumpen_Mode
73
#      filters:
74
#        - lambda: !lambda |-
75
#            if (x == 3) return {true};
76
#            return false;
77
    - name: "CETA100 Solar Modul Temperature"
78
      unit_of_measurement: °C
79
      device_class: temperature
80
      accuracy_decimals: 1
81
    - name: "CETA100 Speicher Temperature"
82
      device_class: temperature
83
      unit_of_measurement: °C
84
      accuracy_decimals: 1
85
    - name: "CETA100 Betriebsstunden Pumpe"
86
      unit_of_measurement: h
87
      device_class: duration
88
    - name: "CETA100 Anzahl Starts Pumpe"
89
      id: CETA100_Anzahl_Starts_Pumpe
my_CETA100_uart.h
1
#include "esphome.h"
2
3
class CETA100Sensor : public Component, public UARTDevice , public Sensor{
4
 public:
5
  
6
  CETA100Sensor(UARTComponent *parent) : UARTDevice(parent) {}
7
  
8
  Sensor *burnerMode_sensor = new Sensor();
9
  Sensor *PVTemp_sensor = new Sensor();
10
  Sensor *ActWasserspeicherTemp_sensor = new Sensor();
11
  Sensor *BetriebsStundenPumpe_sensor = new Sensor();
12
  Sensor *AnzahlStartsPumpe_sensor = new Sensor();
13
  
14
  
15
  void setup() override {
16
    // nothing to do here
17
  }
18
19
  std::vector<int> bytes;
20
  int count = 0;
21
22
//  void update() override {
23
  void loop() override {
24
    const int message_length = 43;
25
    const int pushinterval = 15;
26
    
27
    while (available()) {
28
        
29
      bytes.push_back(read()); //UART Read into Bytes variable.  HIer muss geändert werden auf die letzten 43 Bytes.
30
31
      if(bytes.size() < message_length)       
32
      {
33
        continue;  
34
      }
35
       //ESP_LOGD("custom", "checking bytes");
36
      if(bytes[0] != 0x21 || bytes[1] != 0x0A || bytes[2] != 0x15 ) {
37
      //sync to start
38
        bytes.erase(bytes.begin()); //remove first byte from buffer
39
        continue;
40
      } 
41
42
      if(bytes.size() == message_length) {
43
          
44
          if(count == pushinterval) {  //meachanism to only send every X received messages from UART - otherwise overflow of Data
45
          
46
          //burnerMode_sensor->publish_state(burnermode);
47
          burnerMode_sensor->publish_state(bytes[13]);
48
          //ESP_LOGD("custom", "Parsed burnerMode_sensor: %i", bytes[13]);
49
          
50
          //Temperatur Wärmelieferant
51
          TwoByte PVTemp;
52
          PVTemp.Byte[0] = bytes[14];
53
          PVTemp.Byte[1] = bytes[15];  
54
          PVTemp_sensor->publish_state(float(PVTemp.Int16)/10); 
55
          //ESP_LOGD("custom", "Parsed PVTemp_sensor: %.1f", float(PVTemp.Int16)/10);
56
          
57
          // Temperatur Wasserspeicher
58
          TwoByte ActWasserspeicherTemp;
59
          ActWasserspeicherTemp.Byte[0] = bytes[16];
60
          ActWasserspeicherTemp.Byte[1] = bytes[17];  
61
          ActWasserspeicherTemp_sensor->publish_state(float(ActWasserspeicherTemp.UInt16)/10);
62
          //ESP_LOGD("custom", "Parsed ActWasserspeicherTemp_sensor: %.1f", float(ActWasserspeicherTemp.UInt16)/10);
63
          
64
          // Betriebsstunden Pumpe
65
          TwoByte BetriebsStundenPumpe;
66
          BetriebsStundenPumpe.Byte[0] = bytes[18];
67
          BetriebsStundenPumpe.Byte[1] = bytes[19];  
68
          BetriebsStundenPumpe_sensor->publish_state(BetriebsStundenPumpe.UInt16);
69
          //ESP_LOGD("custom", "Parsed BetriebsStundenPumpe: %i", BetriebsStundenPumpe);
70
          
71
          // Starts Pumpe
72
          TwoByte AnzahlStartsPumpe;
73
          AnzahlStartsPumpe.Byte[0] = bytes[20];
74
          AnzahlStartsPumpe.Byte[1] = bytes[21];  
75
          AnzahlStartsPumpe_sensor->publish_state(AnzahlStartsPumpe.UInt16);
76
          //ESP_LOGD("custom", "Parsed AnzahlStartsPumpe: %i", AnzahlStartsPumpe.UInt16);     
77
          
78
          //ESP_LOGD("custom", "Countreached: %i", count);
79
          count=0;
80
          
81
          }
82
        //ESP_LOGD("custom", "Countinterim status: %i", count);
83
        bytes.clear();
84
        count++;
85
      }
86
    }
87
  }
88
  
89
typedef union
90
  {
91
    unsigned char Byte[2];
92
    int16_t Int16;
93
    uint16_t UInt16;
94
    unsigned char UChar;
95
    char Char;
96
  }TwoByte;  
97
  
98
};


grüße,
Christian

von Thomas G. (tomatos666)


Lesenswert?

Hallo,
Tot gesagte leben länger...
Die Sieger S59a hat das gleiche Protokoll wie bei 
https://github.com/bogeyman/gamma/wiki beschrieben.

Gibt es Neuigkeiten bezüglich Auslesen Temperaturen wie 
Vorlauftemperaturen und direkt Ansteuerung von Mischer und Pumpen?

von S. F. (s_f)


Lesenswert?

moin,
ich beschäftige mich aktuell gerade etwas damit.
zwar mit ESP32 + RS485 adapter.

für Arduino:



#include <HardwareSerial.h>

HardwareSerial rs485(1);

void setup() {
  // Seriellen Monitor starten
  Serial.begin(115200);
  Serial.println("Setup gestartet");

  // RS485 Serial konfigurieren
  rs485.begin(9600, SERIAL_8N1, 17, 16); // RX_PIN = 17, TX_PIN = 16
  Serial.println("RS485 Leser gestartet");
}

void loop() {
  // Prüfen, ob genügend Daten verfügbar sind
  if (rs485.available() >= 33) { // Mindestens 33 Bytes für alle Daten 
einschließlich Kesseltemperatur
    // Daten von RS485 lesen
    byte incomingData[33];
    for (int i = 0; i < 33; i++) {
      incomingData[i] = rs485.read();
    }

    // Überprüfen, ob die Daten auf Warmwassertemperatur hinweisen
    for (int i = 0; i < 33 - 3; i++) {
      // Überprüfen, ob das aktuelle Byte und die nächsten drei Bytes 
dem Muster entsprechen
      if (incomingData[i] == 0x04 && incomingData[i + 2] == 0x10 && 
(incomingData[i + 3] == 0x00 || incomingData[i + 3] == 0x02 || 
incomingData[i + 3] == 0xFF)) {
        // Hier können Sie weitere Bedingungen hinzufügen, um 
sicherzustellen, dass die Temperatur korrekt erkannt wird

        // Annahme: Die Temperatur befindet sich im nächsten Byte
        float temperatur = incomingData[i + 4];

        // Debug-Ausgabe der Warmwassertemperatur
        Serial.print("Potenzielle Warmwassertemperatur gefunden: ");
        Serial.println(temperatur);

        // Außentemperaturbedingungen überprüfen
        if (incomingData[0] == 0x04 && incomingData[2] == 0x10 && 
(incomingData[3] == 0x00 || incomingData[3] == 0x02 || incomingData[3] 
== 0xFF)) {
          // Außentemperatur berechnen
          float aussentemperatur = (int)incomingData[1] / 2.0 - 52.0;

          // Kesseltemperatur berechnen (aus hexadezimalem Wert)
          int kesselTempValue = int(incomingData[32]); // 
Hexadezimalwert in Ganzzahl umwandeln

          // Hier nehmen wir eine neue Formel an, um den Wert zu 
korrigieren
          float kesseltemperatur = kesselTempValue / 1.52; // 
Experimenteller Faktor, um den Wert zu korrigieren

          // Debug-Ausgaben
          Serial.print("Kesseltemperatur: ");
          Serial.println(kesseltemperatur);

          // Außentemperatur über den seriellen Monitor ausgeben
          Serial.print("Außentemperatur: ");
          Serial.println(aussentemperatur);
        }
      }
    }

    // Uhrzeit und Datum überprüfen und verarbeiten
    if (incomingData[0] == 0x05 && (incomingData[1] == 0x00 || 
incomingData[1] == 0x02)) {
      byte sekunde = incomingData[2];
      byte minute = incomingData[3];
      byte stunde = incomingData[4];
      byte tag = incomingData[5];
      byte monat = incomingData[6] & 0x0F; // Einerstelle des Monats
      byte tagWoche = (incomingData[6] >> 4) & 0x07; // Tag in der Woche
      byte jahr = incomingData[7];

      // Überprüfen, ob die Uhrzeit und das Datum gültig sind
      if (stunde < 0x24 && minute < 0x60 && sekunde < 0x60 &&
          tag < 0x32 && monat < 0x13 && tagWoche < 0x07 && jahr >= 0x20) 
{

        // Wochentag ermitteln
        const char* wochentage[] = {"Sonntag", "Montag", "Dienstag", 
"Mittwoch", "Donnerstag", "Freitag", "Samstag"};
        const char* monate[] = {"Januar", "Februar", "März", "April", 
"Mai", "Juni", "Juli", "August", "September", "Oktober", "November", 
"Dezember"};

        Serial.print("Datum: ");
        Serial.print(wochentage[tagWoche - 1]); // Wochentage-Index 
beginnt bei 0
        Serial.print(", den ");
        Serial.print(tag, HEX);
        Serial.print(". ");
        Serial.print(monate[monat + 1]); // Monate-Index beginnt bei +1
        Serial.print(" 20");
        Serial.println(jahr, HEX);

        Serial.print("Uhrzeit: ");
        if (stunde < 0x10) Serial.print("0"); // Führende Null für 
einstellige Stunden
        Serial.print(stunde, HEX);
        Serial.print(":");
        if (minute < 0x10) Serial.print("0"); // Führende Null für 
einstellige Minuten
        Serial.print(minute, HEX);
        Serial.print(":");
        if (sekunde < 0x10) Serial.print("0"); // Führende Null für 
einstellige Sekunden
        Serial.println(sekunde, HEX);
      }
    }
  }
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.