Modul für EBV / Rotex Heizung

Begonnen von heiko322, 01 April 2015, 10:10:32

Vorheriges Thema - Nächstes Thema

bogeyman

Hallo Michael,

die Theta Serie scheint anders angeschlossen zu werden, als die Gamma Serie, die wir hier bisher zwischen hatten. Schau bitte nochmal im Handbuch nach, was da zu dem Raumstation Anschluss steht. Kann gut sein , dass das gar kein RS485 ist. Dann ist auch die Frage, ob Du im gültigen Spannungsbereich des Logic Analyser bist?

Bin gespannt, da ich bis jetzt keine Theta gesehen habe / Theta Daten gesehen habe....

Beste Grüße,
Tim

Mucki

Hallo Tim,

deine Vermutung könnte richtig sein. Auf Deinen Hinweis hin habe ich nochmal nachgeguckt. In der Fachmannanleitung zum Zentralgerät sind die Anschlussenklemmen  "Datenbusanschluss Signal A und Signal B" vorhanden. Bislang hatte ich vermutet, dass es sich um einen RS 485 handelt. Aber das Kesselschaltfeld hat zwei Datenbusanschlüsse, nämlich T2B und RS 485 (nur bei Brennwertausführung).

Bei der Raumstation ist keine Angabe vorhanden, um was für einen Bus es sich handelt. Es heißt nur, dass die 2-adrige Datenbusleitung an den Klemmen A und B der 2-poligen Klemmleiste angeschlossen wird, und dass A und B nicht vertauscht werden dürfen.

Hat jemand einen Hinweis für mich bezüglich Datenbusanschluss T2B?

Der Spannungsbereich des Logik Analyzer sollte ok sein. Beim Aus- und Einschalten der Netzspannung am Regeler werden Impulse aufgezeichnet, aber leider nur dann. Wirklich auswertbar sind die Impulse nicht.


Viele Grüße von
Michael

dbox2user

Hallo Tim!
Ich wollte mal "vorsichtig" nachfragen ob es Neuigkeiten mit dem EBV-Modul gibt?  :)
Kannst Du vielleicht mittlerweile z.B. die Betriebsstunden auslesen?

Gruß,
Christian
Fhem 5.8 auf Raspberry Pi2; 1 Wire OWSERVER mit DS9490R und OWX DS2480;AVR-NET-IO mit 1Wire;  LOGO8; Kostalpiko; Selbstbau CUL; Arduino mit cFirmata; Denon AVR; Samsung TV; Fritzbox;

Bavilo

Würde auch gerne erfahren ob es hier updates zu gibt.

Danke!

bogeyman

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

dbox2user

Hallo Tim!
Ich bin natürlich auch immernoch darauf gespannt was dein Parser dann alles für Werte bringt.
Freu mich schon auf deine kommenden Updates.

Gruß Christian
Fhem 5.8 auf Raspberry Pi2; 1 Wire OWSERVER mit DS9490R und OWX DS2480;AVR-NET-IO mit 1Wire;  LOGO8; Kostalpiko; Selbstbau CUL; Arduino mit cFirmata; Denon AVR; Samsung TV; Fritzbox;

anon1

Hallo,
habe mich vor kurzem auch mal mit der Rotex Oelheizung mit der RoCon Steuerung befasst.
Herausgekommen sind zwei quick and dirty Skripte fuer Raspberry Pi, die per Bluetooth + ELM 327 Adapter den CAN Bus ueberwachen.
Der ELM ist ein normaler (Chinakopie) Autoadapter, der mit Pegelwandler 24V->12V von der Heizung versorgt wird.

stats.pl wertet aus, welche CAN-IDs da sprechen, taggt die Empfaenger und Kommandos und hilft beim reverse-engineering, indem man live die Daten beobachten kann
rotex2mqtt.pl dient als Dienst, die Daten laufend zu erfassen.

Aktuell erfasse ich nur die wichtigsten Temperaturen, es gibt aber auch schon die Kennwerte aus Heiz- und Mischermodul.

Hoffe, das hilft jemandem.

stats.pl
#!/usr/bin/perl

# usage:
# cat can.log | ./stats.pl
# ./stats.pl can.log
# ./stats.pl /dev/ttyAMA0 <baud>
# ./stats.pl /dev/rfcomm0 <baud> elm327
# exit with Ctrl-C to get stats

# Bluetooth ELM327 device
# apt install libdevice-serialport-perl libdevice-modem-perl
# apt install bluez bluez-tools
# hcitool scan
# rfcomm connect hci0 00:0D:18:B2:F3:35 &
# then use /dev/rfcomm0 38400 modem

#use strict;
$| = 1;
use Device::SerialPort qw( :PARAM :STAT 0.07 );
require "./config.inc";
# no args, STDIN
if (!$ARGV[0]){
*CAN=*STDIN
}

# one arg, open file
elsif (!$ARGV[1]){
open(*CAN,"<$ARGV[0]")  || die "Can't open $ARGV[0]: $!\n";
}


# open serial port or modem
else {
print "opening serial $ARGV[0]$/";
my $PortObj = tie (*CAN, 'Device::SerialPort', $ARGV[0])               || die "Can't tie: $!\n";
my $baud=$ARGV[1];
$baud||=38400;
$PortObj->baudrate($baud);
$PortObj->databits(8);
$PortObj->parity("none");
$PortObj->stopbits(1);
};

# ELM327 needs one more push to send CAN data
if ($ARGV[2]) {
print "sending ATL1$/";
print CAN "ATL1\r\n";
sleep(1);
$_=<CAN>;
print;
print "sending ATH1$/";
print CAN "ATH1\r\n";
sleep(1);
$_=<CAN>;
print;
print "sending ATMA$/";
print CAN "ATMA\r\n";
sleep(1);
$_=<CAN>;
print;
}


# switch from our own names to elster list
# %command_names=%elster_names;


my %ids_seen=();
my %pairs=();
my %commands=();

# show stats when killed by Ctrl-C
# have this code before the while loop and after stats variable delaration
$SIG{INT} = sub {
print "$/CAN IDs:$/";
foreach $_ (sort(keys(%ids_seen))) { print "$_\t$can_names{$_} $/" };

print "$/Communication:$/";
foreach $_ (sort(keys(%pairs))) { print "$_\t$can_names{$_} $/" };

print "$/Commands\tcommand name\t\t\tlast dec value$/";
foreach $_ (sort(keys(%commands))) { print "$_\t\t".sprintf("%-20s",$command_names{$_}[1])."\t\t$commands{$_}$/" };
exit(0);
};

print "CAN msg\t\t\t\tsource\t\t\tdestination\t\tmsgtype\t\tcommand\t\tdata(hex)\tdata(dec)$/";
while (1) {                                                     # keep polling until Ctrl-C
    $_=<CAN>;
    next unless /^\d{3} /;                                      # noise filter
    $_=~s/[\r\n]*//g;
    my $line=$_;
    $_=~s/ //g;
    my ($src, $rec1,$type, $unknown,$rec4, $pl1,$pl2, $pl3, $pl4)=unpack('A3AAAAA2A2A2A4');             # split byte field
    my $dest=hex($rec1)*80+$rec4;                               # destination address is $rec1 * 80 plus $rec4 (terminal id?), type is byte

    my ($cmnd,$data);

    if (hex($pl1)<250) {                        # single byte elster command
     $cmnd="00$pl1";
     $data="$pl2$pl3";
    } else {
     # extended telegram, FA then double byte command
     $cmnd="$pl2$pl3";
     $data="$pl4";
    };

    my $dec=hex($data);

    # collect stats
    $ids_seen{$src}=1;                                          # unique sources
    $ids_seen{$dest}=1;                                         # unique destinations
    $pairs{"$src -> $dest"}=1;                                  # source/dest edges
    $commands{lc($cmnd)}=$dec;                                  # commands seen with last value

    print "$line\t$src ($can_names{$src})\t$dest ($rec1$rec4 $can_names{$dest})\t$type ($msgtypes{$type})\t$cmnd ($command_names{lc($cmnd)}[1])\t\t$data\t\t$dec $/";
    sleep(0.1);
}



rotex2mqtt.pl
#!/usr/bin/perl

# usage:
# cpan install Net::MQTT::Simple
# edit config.inc, %mqtt_config
# rotex2mqtt.pl

# Bluetooth ELM327 device
# apt install libdevice-serialport-perl libdevice-modem-perl
# apt install bluez bluez-tools
# hcitool scan
# rfcomm connect hci0 00:0D:18:B2:F3:35 &
# then use /dev/rfcomm0 38400 modem

#use strict;
$| = 1;
use Device::SerialPort qw( :PARAM :STAT 0.07 );
use Net::MQTT::Simple;
require "/root/config.inc";

# open serial port or modem
print "opening serial $ARGV[0]$/";
my $PortObj = tie (*CAN, 'Device::SerialPort', $mqtt_config{device})            || die "Can't tie: $!\n";
my $baud=$mqtt_config{baud};
$baud||=38400;
$PortObj->baudrate($baud);
$PortObj->databits(8);
$PortObj->parity("none");
$PortObj->stopbits(1);

# ELM327 needs one more push to send CAN data
if ($mqtt_config{devicetype} eq "modem") {
print "sending ATZ$/";
print CAN "ATZ\r\n";
sleep(1);
print <CAN>;
print "sending ATL1$/";
print CAN "ATL1\r\n";
sleep(1);
$_=<CAN>;
print;
print "sending ATH1$/";
print CAN "ATH1\r\n";
sleep(1);
$_=<CAN>;
print;
print "sending ATMA$/";
print CAN "ATMA\r\n";
sleep(1);
$_=<CAN>;
print;
}

# switch from our own names to elster list
# %command_names=%elster_names;

my $mqtt = Net::MQTT::Simple->new($mqtt_config{mqtt_server});
#$mqtt->login($mqtt_config{mqtt_user}, $mqtt_config{mqtt_password});


while (1) {                                                     # keep polling until Ctrl-C
    $_=<CAN>;
    sleep(1);
    next unless /^\d{3} /;                                      # noise filter
    $_=~s/[\r\n]*//g;
    my $line=$_;
    $_=~s/ //g;
    my ($src, $rec1,$type, $unknown,$rec4, $pl1,$pl2, $pl3, $pl4)=unpack('A3AAAAA2A2A2A4');             # split byte field
    my $dest=hex($rec1)*80+$rec4;                               # destination address is $rec1 * 80 plus $rec4 (terminal id?), type is byte

    my ($cmnd,$data);

    if (hex($pl1)<250) {                        # single byte elster command
     $cmnd="00$pl1";
     $data="$pl2$pl3";
    } else {
     # extended telegram, FA then double byte command
     $cmnd="$pl2$pl3";
     $data="$pl4";
    };

    my $dec=hex($data);
#    print "$line\t$src ($can_names{$src})\t$dest ($rec1$rec4 $can_names{$dest})\t$type ($msgtypes{$type})\t$cmnd ($command_names{lc($cmnd)}[1])\t\t$data\t\t$dec $/";
    if ($mqtt_config{channels}{lc($cmnd)}){
      if ($mqtt_config{channels}{lc($cmnd)}=~/\d*\.\d*/) {
        # multiplier
        $dec*=$mqtt_config{channels}{lc($cmnd)};
      }
      print "publish stat/HEIZUNG_AB/$command_names{lc($cmnd)}[1] : $dec$/";
      $mqtt->publish("stat/HEIZUNG_AB/$command_names{lc($cmnd)}[1]" => "$dec");
    };
}


config.inc

%can_names = (
000    =>      "direkt ",
"10A"  =>      "unbekannt",
160    =>      "Bedienteil",
180    =>      "Steuerung",
240    =>      "unbekannt",
300    =>      "Bediener 0?",
301    =>      "Bediener 1?",
302    =>      "Bediener 2?",
400    =>      "Raumbedienung?",
480    =>      "Manager?",
481    =>      "unbekannt",
489    =>      "Broadcast?",
500    =>      "Brenner",
580    =>      "Buskoppler?",
600    =>      "Mischer 0?",
601    =>      "Mischer",
640    =>      "unbekannt",
641    =>      "unbekannt",
680    =>      "PC?",
780    =>      "DCF-Modul?",
800    =>      "unbekannt",
889    =>      "Broadcast?",
960    =>      "unbekannt",
969    =>      "Broadcast?",
1048   =>      "unbekannt",
);

%msgtypes=(
0      =>      "write",
1      =>      "request",
2      =>      "response",
3      =>      "ack",
4      =>      "write ack",
5      =>      "write respond",
6      =>      "system",
7      =>      "sys respond",
20     =>      "r lg data",
21     =>      "w lg data"
);
%command_names = (
"0001" => [    "0"                     ,"000"                          ],
"0002" => [    "0"                     ,"T-WE-SOLL"                            ],
"0003" => [    "0"                     ,"T-WW-SOLL"                            ],
"0004" => [    "0"                     ,"T-HK-SOLL"                            ],
"0005" => [    "0"                     ,"T-RAUM-SOLL1"                         ],
"0006" => [    "0"                     ,"T-RAUM-SOLL2"                         ],
"0007" => [    "0"                     ,"T-RAUM-SOLL3"                         ],
"0008" => [    "0"                     ,"T-ABSENK"                             ],
"000a" => [    "0"                     ,"000"                          ],
"000c" => [    "0"                     ,"T-AUSSEN"                             ],
"000d" => [    "0"                     ,"T-WE"                         ],
"000e" => [    "0"                     ,"T-WW"                         ],
"000f" => [    "0"                     ,"T-HK0"                                ],
"0010" => [    "0"                     ,"000"                          ],
"0013" => [    "0"                     ,"T-WWSOLL1"                            ],
"0016" => [    "0"                     ,"T-RL"                         ],
"001c" => [    "0"                     ,"WASSERDRUCK"                          ],
"0023" => [    "0"                     ,"000"                          ],
"0051" => [    "0"                     ,"BRENNER AN/AUS"                               ],
"0052" => [    "0"                     ,"000"                          ],
"0053" => [    "0"                     ,"3UV-VENTIL"                           ],
# 0 HZ
"0056" => [    "0"                     ,"MISCHER AUF"                          ],
"0057" => [    "0"                     ,"MISCHER ZU"                           ],
"0058" => [    "0"                     ,"000"                          ],
"005a" => [    "0"                     ,"000"                          ],
"005b" => [    "0"                     ,"000"                          ],
"005d" => [    "0"                     ,"000"                          ],
"005e" => [    "0"                     ,"000"                          ],
"006d" => [    "0"                     ,"000"                          ],
"006f" => [    "0"                     ,"000"                          ],
"0071" => [    "0"                     ,"000"                          ],
"008c" => [    "0"                     ,"LEIST SOLL"                           ],
"0100" => [    "0"                     ,"MK PUMPE STATUS"                              ],
"0112" => [    "0"                     ,"BETRIEBSART"                          ],
# 3072=auto2 2816=auto1 1280=sommer 768=heizen 1024=absenken
# 256=bereitschaft
"011a" => [    "0"                     ,"000"                          ],
"0122" => [    "0"                     ,"000"                          ],
"0123" => [    "0"                     ,"000"                          ],
"0124" => [    "0"                     ,"000"                          ],
"0125" => [    "0"                     ,"000"                          ],
"0126" => [    "0"                     ,"000"                          ],
"0131" => [    "0"                     ,"PWM MK PUMPE"                         ],
"013D" => [    "0"                     ,"T-ABWESEND"                           ],
"013E" => [    "0"                     ,"T-WWSOLL-3"                           ],
"0145" => [    "0"                     ,"T-ABGAS"                              ],
"0148" => [    "0"                     ,"000"                          ],
"0176" => [    "0"                     ,"000"                          ],
"0199" => [    "0"                     ,"000"                          ],
"01ec" => [    "0"                     ,"000"                          ],
"01ec" => [    "0"                     ,"000"                          ],
"01f2" => [    "0"                     ,"000"                          ],
"02f4" => [    "0"                     ,"000"                          ],
"0409" => [    "0"                     ,"BRENNER LAUFZ"                                ],
"05d9" => [    "0"                     ,"OEL/GAASVENTIL"                               ],
"05da" => [    "0"                     ,"000"                          ],
"06d9" => [    "0"                     ,"000"                          ],
"071b" => [    "0"                     ,"000"                          ],
"093c" => [    "0"                     ,"000"                          ],
"09f5" => [    "0"                     ,"REGELDIFF"                            ],
"1356" => [    "0"                     ,"000"                          ],
"1358" => [    "0"                     ,"PARTY DAUER"                          ],
"1388" => [    "0"                     ,"000"                          ],
"0a06" => [    "0"                     ,"T-WWSOLL2"                            ],
"0a2b" => [    "0"                     ,"000"                          ],
"0a5d" => [    "0"                     ,"000"                          ],
"0a8c" => [    "0"                     ,"STATUS Kesselpumpe"                           ],
"fdc1" => [    "0"                     ,"000"                          ]
);

%mqtt_config = (
device                 =>      "/dev/rfcomm0",
devicetype             =>      "modem",
baud                   =>      38400,
mqtt_user              =>      "MQTT",
mqtt_password          =>      "MQTT",
mqtt_server            =>      "mqtt_server",
mqtt_port              =>      1883,
data_frequency         =>      60,               # collect and send every n seconds
main_loop_frequency    =>      10,
channels               =>      {  # send these commands to mqtt
        "000c"                  =>      "0.1",
        "000d"                  =>      "0.1",
        "000e"                  =>      "0.1",
        "000f"                  =>      "0.1",
        "0016"                  =>      "-",
        "001c"                  =>      "-",
        "0053"                  =>      "-",
        "008c"                  =>      "-",
        "0145"                  =>      "-",
        "09f5"                  =>      "-"
}
);





Gruesse,
Stefan

disaster123

Es ging ja hier ursprünglich um eine Rotex GSU 540 und nicht um die zahlreichen anderen Modelle oder Wärmepumpen und co. Weiß jemand, wie man an einer normalen GSU das USB Modul ohne Raumregler anschließen muss?

disaster123

Hat irgendjemand denn das Modul mit einer GSU am laufen?

phiresky

Hallo zusammen!

Ich hab den Thread nicht ganz gelesen aber da das hier eine von zwei
Konversationen die man überhaupt im Internet zum Thema Theta Heizungssteuerung auslesen findet ist
verlinke ich es mal hier:

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