Ankündigung

Einklappen
Keine Ankündigung bisher.

eBus->USB->Plugin->KNX

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #91
    Wie sieht denn Dein Plugin aus ?

    P.S: Welche Modell hast Du gelötet? Hat der ne galvanische Trennung?
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    Kommentar


      #92
      also mein adapter siehe anhang + max 232.

      jetzt läuft das Plugin, gibt mir einen Rückgabewert zurück (siehe Anhang)

      so sieht mein plugin aus (siehe anhang)

      gruß
      andreas
      Angehängte Dateien

      Kommentar


        #93
        Das kann auch nicht funktionieren
        Das Script dient lediglich zum manuellen eingeben eines Befehls zur anschließenden CRC-Berechnung. Dann gibt Die das Script einmal das CRC-Byte und die gesamte Befehlskette aus.

        Sinnvoll ist das nur als CRC.pl zu speichern und mit der Konsole über perl crc.pl aufzurufen.
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          #94


          hab ich mir schon gedacht, meine kenntnisse sind da gegen null, ich hangel mich da immer irgendwie durch.

          kannst du mal licht ins dunkle bringen?

          gruß
          andreas

          Kommentar


            #95
            Stand bis dato ist folgender und bezieht sich nur auf meine Vaillant Wärmepumpe:
            1. es gibt (noch) kein Plugin für das Wiregate
            2. derzeit entwickle ich erstmal ein einfaches Kommandozeilen-Script
            3. mein Focus liegt zuerst auf dem Senden von Befehlen
            4. einige Befehle müssen noch entschlüsselt werden
            5. da es keinen Standard gibt befürchte ich ein je nach Modell und Hersteller unendlich viele Varianten


            Bisherige Erfolge und Niederlagen:
            • Kommandozeilen-Script läuft und sendet erste Befehle
            • das ganze funktioniert nicht mit dem Wiregate aber auf einem anderen Alix1D und Netbook


            Gruß Mirko
            Umgezogen? Ja! ... Fertig? Nein!
            Baustelle 2.0 !

            Kommentar


              #96
              Vielleicht kann ich ja den ein oder anderen damit ein wenig motivieren .

              Hier mal ein Perl-Kommandozeilenscript zum senden von Daten an meine Vaillant Wärmepumpe. Ich habe noch nicht alle Befehle ausprobiert, aber es könnte sich da nur um kleinere Bugs im Script handeln.

              Nutzung:
              perl testbus.pl [Befehl] [Wert]
              # perl testbus.pl RT_soll 22

              *EBus.pm erforderlich

              Grundsätzlich gefällt mir das mit den vielen Subs noch nicht, aber da fehlt mir momentan die Muse das nochmal neu zu stricken.

              testbus.pl
              Code:
              use warnings;
              use strict;
              use EBus;
              
              my $usb = '/dev/ttyUSB0';	#eBus Schnittstelle
              
              ### Vaillant Konfiguration ###
              my @sets;
              push @sets, { name => "RT_soll", 	GA => "0/0/0", 		QQ => "00", ZZ => "50", PB => "B5", SB => "05", NN => "02", DB1 => "01", DB2 => "" };
              push @sets, { name => "RT_min", 	GA => "0/0/0", 		QQ => "00", ZZ => "50", PB => "B5", SB => "05", NN => "02", DB1 => "0A", DB2 => "" };
              push @sets, { name => "HK_mode",	GA => "0/5/102", 	QQ => "00", ZZ => "50", PB => "B5", SB => "05", NN => "02", DB1 => "02", DB2 => "" };
              push @sets, { name => "HK_curve", 	GA => "0/0/0", 		QQ => "00", ZZ => "50", PB => "B5", SB => "05", NN => "03", DB1 => "0B", DB2 => "", DB3 => "00" };
              push @sets, { name => "HK_party", 	GA => "0/0/0", 		QQ => "00", ZZ => "50", PB => "B5", SB => "05", NN => "02", DB1 => "05", DB2 => "" };
              push @sets, { name => "HK_spar", 	GA => "0/0/0", 		QQ => "00", ZZ => "50", PB => "B5", SB => "05", NN => "02", DB1 => "07", DB2 => "" };
              push @sets, { name => "AT_off", 	GA => "0/0/0", 		QQ => "00", ZZ => "50", PB => "B5", SB => "09", NN => "04", DB1 => "0E", DB2 => "36", DB3 => "00", DB4 => "", DB5 => "00" };
              push @sets, { name => "WW_load", 	GA => "0/5/101", 	QQ => "10", ZZ => "FE", PB => "B5", SB => "05", NN => "02", DB1 => "06", DB2 => "" };
              push @sets, { name => "WW_soll", 	GA => "0/0/0", 		QQ => "00", ZZ => "25", PB => "B5", SB => "09", NN => "05", DB1 => "0E", DB2 => "82", DB3 => "00", DB4 => "", DB5 => "" };
              push @sets, { name => "WW_min", 	GA => "0/0/0", 		QQ => "00", ZZ => "25", PB => "B5", SB => "09", NN => "05", DB1 => "0E", DB2 => "82", DB3 => "00", DB4 => "", DB5 => "" };
              push @sets, { name => "WW_mode", 	GA => "0/0/0", 		QQ => "00", ZZ => "25", PB => "B5", SB => "09", NN => "04", DB1 => "0E", DB2 => "2B", DB3 => "00", DB4 => ""};
              push @sets, { name => "HOL_date", 	GA => "0/0/0", 		QQ => "00", ZZ => "FE", PB => "B5", SB => "0B", NN => "08", DB1 => "01", DB2 => "Nr", DB3 => "ST", DB4 => "SM", DB5 => "SJ", DB6 => "ET", DB7 => "EM", DB8 => "EJ"};###FIXME DATATYP
              push @sets, { name => "HOL_temp", 	GA => "0/0/0", 		QQ => "00", ZZ => "FE", PB => "B5", SB => "05", NN => "02", DB1 => "2A", DB2 => ""};
              push @sets, { name => "HK_int", 	GA => "0/5/0", 		QQ => "10", ZZ => "08", PB => "B5", SB => "05", NN => "05", DB1 => "0E", DB2 => "7C", DB3 => "00", DB4 => "", DB5 => "FF" };
              ### Ende Vaillant Konfiguration ###
              
              ###############
              ### M A I N ###
              ###############
              
              my $do = $ARGV[0];
              my $value = $ARGV[1];
              
              chomp $do;
              chomp $value;
              print ("Befehl = $do","\n"); 
              print ("Wert = $value","\n"); 
              
              foreach my $set (@sets) {
              if ($do eq $set->{name} )
              {	
              my $val = $value;
              my $subname = $set->{name};     # $subname bekommt den Namen der entsprecheden sub
              my $subref = \&$subname;        # jetzt wird $subref die entsprechende sub zugewiesen
              
              my $command = addCRC(&$subref($val));
              print ("Command = $command","\n"); 
              &send ($command);
              }
              }
              
              ################################
              ### V A I L L A N T  S U B S ###
              ################################
              #lassen sich bestimmt noch optimieren in dem man die Konfiguration etwas erweitert
              
              ### Sparen bis ...  30min = 0,5 Stunden (21:30Uhr = 21,5) ###
              sub HK_spar
              {
              foreach my $set(@sets){
              if ($set->{name} eq "HK_spar")
              {
              my $input = $_[0];
              my $val = (sprintf "%02d",$input); 				
              $val = encode_d1c ($val);
              my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
              return $message;
              }
              }
              }
              ###
              
              ### Ferientemperatur ###
              sub HOL_temp
              {
              foreach my $set(@sets){
              if ($set->{name} eq "HOL_temp")
              {
              my $input = $_[0];
              my $val = (sprintf "%02d",$input); 				
              $val = encode_d1b ($val);
              my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
              return $message;
              }
              }
              }
              ###
              
              
              ### Raumtemperatur Soll ###
              sub RT_soll
              {
              foreach my $set(@sets){
              if ($set->{name} eq "RT_soll")
              {
              my $input = $_[0];
              my $val = (sprintf "%02d",$input); 				
              $val = encode_d1b ($val);
              my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
              return $message;
              }
              }
              }
              ###
              
              ### Raumtemperatur Absenkung ###
              sub RT_min
              {
              foreach my $set(@sets){
              if ($set->{name} eq "RT_min")
              {
              my $input = $_[0];
              my $val = (sprintf "%02d",$input); 				
              $val = encode_d1b ($val);
              my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
              return $message;
              }
              }
              }
              ###
              
              ### 1-Heizen, 2-Aus, 3-Auto, 4-Eco, 5-Absenken ###
              sub HK_mode
              {
              foreach my $set(@sets){
              if ($set->{name} eq "HK_mode")
              {
              my $input = $_[0];
              my $val = (sprintf "%02d",int($input)); 
              my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
              return $message;
              }
              }
              }
              ###
              
              ### Heizkurve 0,20 etc ###
              sub HK_curve
              {
              foreach my $set(@sets){
              if ($set->{name} eq "HK_curve")
              {
              my $input = $_[0];
              $input *= 100;
              my $val = (sprintf "%02d",$input); 
              $val = encode_d1b($val);
              my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val.$set->{DB3};
              return $message;
              }
              }
              }
              ###
              
              ### 0-Partymodus aus, 1-Partymodus an ###
              sub HK_party
              {
              foreach my $set(@sets){
              if ($set->{name} eq "HK_party")
              {
              my $input = $_[0];
              my $val = (sprintf "%02d",$input);
              my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
              return $message;
              }
              }
              }
              ###
              
              ### Betriebsmodus WW 1-aus, 2-an, 3-auto ###
              sub WW_mode
              {
              foreach my $set(@sets){
              if ($set->{name} eq "WW_mode")
              {
              my $input = $_[0];
              my $val = (sprintf "%02d",$input);
              my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$set->{DB2}.$set->{DB3}.$val;
              return $message;
              }
              }
              }
              ###
              
              ### 0-Speicherladung abbrechen, 1-Speicherladung ###
              sub WW_load
              {
              foreach my $set(@sets){
              if ($set->{name} eq "WW_load")
              {
              my $input = $_[0];
              my $val = (sprintf "%02d",$input);
              my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
              return $message;
              }
              }
              }
              ###
              
              
              ### Energieintegral setzen ###
              sub HK_int
              {
              foreach my $set(@sets){
              if ($set->{name} eq "HK_int")
              {
              my $input = $_[0];
              my $val = (sprintf "%02d",$input);
              $val = encode_d1b($val);
              my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$set->{DB2}.$set->{DB3}.$val.$set->{DB3};
              return $message;
              }
              }
              }
              ###
              
              ### Außentemperatur Abschaltgrenze ###
              sub AT_off
              {
              foreach my $set(@sets){
              if ($set->{name} eq "AT_off")
              {
              my $input = $_[0];
              my $val = (sprintf "%02d",$input);
              $val = encode_d1b($val);
              my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$set->{DB2}.$set->{DB3}.$val.$set->{DB3};
              return $message;
              }
              }
              }
              ###
              
              ### Solltemperatur WW-Speicher ### 
              sub WW_soll
              {
              foreach my $set(@sets){
              if ($set->{name} eq "WW_soll")
              {
              my $input = $_[0];
              my $val = (sprintf "%02d",$input);
              $val = encode_d2c($val);
              my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$set->{DB2}.$set->{DB3}.$val;
              return $message;
              }
              }
              }
              ###
              
              ### Min.-Temperatur WW-Speicher ### 
              sub WW_min
              {
              foreach my $set(@sets){
              if ($set->{name} eq "WW_min")
              {
              my $input = $_[0];
              my $val = (sprintf "%02d",$input); 	
              $val = encode_d2c($val);
              my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$set->{DB2}.$set->{DB3}.$val;
              return $message;
              }
              }
              }
              ###
              
              ############################################
              ### D A T E N K O N V E R T I E R U N G ####
              ############################################
              
              ### FIX ME !!!!!
              ### BCD ### 
              sub decode_bcd {
                  #return (unpack "H*", pack "C*",hex($_[0]));
              	unpack "H*", $_[0]; ####?????
              }
              
              sub encode_bcd {
              	return pack 'H*', join '', $_[0];
              }
              
              ### DATA1b ###
              
              sub decode_d1b{         #1byte signed 
                  my $val = hex(shift);
                  return $val > 127 ? $val-256 : $val;
              }
              
              sub encode_d1b {        #### F I X M E !!!!!
                  my $y = shift;
                  $y *= 256;
                  $y = $y & 0xffff if ($y < 0);
                  my $hb = int $y/256;
                  return (sprintf("%0.2X", $hb));
              }
              
              
              ### DATA1c
              
              sub decode_d1c {
              my $y = hex ($_[0])/2;
              return $y;
              }
              
              sub encode_d1c {
                  return sprintf "%x",(($_[0])*2);
              }
              
              
              ### DATA2b ###
              
              sub decode_d2b { 
              	return unpack("s", pack("s", hex($_[0].$_[1]))) / 256; 
              }
              
              sub encode_d2b {
              	my ($hb, $lb) = unpack("H[2]H[2]", pack("s", $_[0] * 256));
              	return $lb.$hb;
              }
              
              ### alternativ
              #sub decodex_d2b{
              #    my $hb = hex($_[0]);
              #    my $lb = hex($_[1]);
              #
              #   if ($hb & 0x80) {
              #      return -( (~$hb & 255) + ((~$lb & 255) + 1)/256 );
              #    }
              #   else {
              #        return $hb + $lb/256;
              #    }
              #}
              #
              #sub encodex_d2b {
              #    my $y = shift;
              #    $y *= 256;
              #    $y = $y & 0xffff if ($y < 0);
              #    my $hb = int $y/256;
              #    my $lb = $y % 256;
              #    return (sprintf("%0.2X", $hb), sprintf("%0.2X", $lb));
              #}
              
              
              ### DATA2c ###
              
              sub decode_d2c{
              my $high = $_[1];
              my $low = $_[0];
              return unpack("s",(pack("H4", $low.$high)))/16;
              }
              
              sub encode_d2c{
              my $val = $_[0];
              my $temp_hex = unpack("H4", pack("n", ($val)*16));
              # change lowbyte/highbyte -> lowbyte first
              return substr($temp_hex,2,4).substr($temp_hex,0,2);
              }
              
              ####################
              ### A D D  C R C ###
              ####################
              
              ### CRC hinzufuegen
              sub addCRC
              {
              my $string = $_[0];
              my $temp_string = pack("H*","$string"); ### geht auch!
              my $crc = new EBus();
              my $check = $crc->calcCrcExpanded($temp_string);
              my $crcfinal = uc(sprintf("%02x", $check));
              my $finalStr = $string.$crcfinal;
              }
              ###
              
              ###################
              ### S E N D E N ###
              ###################
              
              sub send
              {	
              my $raw = shift;
              $raw =~ s/([0-9a-f]{2})/chr( hex( $1 ) )/gie;
              open(my $fh,'|-',"socat -t1 - $usb,b2400") or return 0;
              binmode( $fh );
              print $fh $raw;
              close( $fh ) or return 0;
              return 1;
              }
              #print ("echo $command | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie' | socat -t1 - $usb,b2400 | od -tx1");
              Umgezogen? Ja! ... Fertig? Nein!
              Baustelle 2.0 !

              Kommentar


                #97
                Bin zwar Dein Script erst mal nur kurz durchgegangen, aber das hört sich alles sehr gut an, auch wenn ich selbst erst noch am Decodieren auf meiner Windoof Kiste festhänge.... Aber einen ersten Ansporn hast Du mir dennoch schon gegeben und ich habe mir eben mal den EBUS in mein Büro gelegt...

                Kommentar


                  #98
                  Heute hat mich mal wieder die Muse geküsst ... ich würde eher sagen die Schl**** hat mich zu Boden geknutscht

                  Das Ergebnis...lang erwartet ... Die Socket-Verbindung steht, nun müsste man dies nur noch irgendwie zusammen bekommen, aber das wird schon.

                  Das ist ein Telegramm: 10 23 B5 04 01 31 F6 00 AA
                  Code:
                  2012-10-05 20:33:50.451,eBus1.pl,Received: 1023,0s,
                  2012-10-05 20:33:50.978,eBus1.pl,Received: B5040131,0s,
                  2012-10-05 20:33:51.503,eBus1.pl,Received: F6,0s,
                  2012-10-05 20:33:52.030,eBus1.pl,Received: 00AA,0s,
                  Angehängte Dateien
                  Umgezogen? Ja! ... Fertig? Nein!
                  Baustelle 2.0 !

                  Kommentar


                    #99
                    Für das Senden auf den eBus hier das passende Wiregate-Plugin:

                    SourceForge.net Repository - [openautomation] Contents of /wiregate/plugin/generic/eBus-Vaillant.pl

                    eBus-Vaillant.pl
                    Code:
                    # Beta fuer eBus-Anbindung von Heizungen/Waermepumpen
                    # Diese Beta bezieht sich auf eine Vaillant VWS 82-3 Waermepumpe
                    # Fuer jeden Befehl wurde vorher eine sub erstellt die die Daten an die richtige Stelle setzt und
                    # richtig codiert. Dies laesst sich bestimmt noch schlanker gestalten in dem man die Konfigurationszeilen erweitert.
                    # Der generelle Aufbau eines eBus-Telegramms: QQ ZZ PB SB NN DB1...DBx CRC
                    # QQ = Quelladresse, ZZ = Zieladresse, PB = Primaerbefehl, SB = Sekundarbefehl, NN = Anzahl der Datenbytes, DB1...DBx = Datenbytes, CRC = Checksummenbyte.
                    # Teils liegen die Daten die es zu senden gibt an unterschiedlichen Stellen, in der Konfiguration sind diese dann leer (z.B. DB2="").
                    #
                    # Wiregte-Socket-Einstellungen:
                    # Socket 1: "-" und "Socket: /dev/ttyUSB0" (hier eigenen Adapter) und "Optionen: raw,b2400,echo=0"
                    # Socket 1: "udp-datagram" und "Socket: localhost:50110  und "Optionen: bind=localhost:50111,reuseaddr"
                    # aktiviert und bidirektional
                    #
                    # Das Perl-Modul EBus.pm muss installiert sein, vergleiche hierzu:
                    # https://knx-user-forum.de/253728-post64.html
                    #
                    # 06.10.2012
                    # JuMi2006 (https://knx-user-forum.de)
                    # Version 0.1
                    
                    use warnings;
                    use strict;
                    use EBus;
                    
                    my $socknum = 303; # Eindeutige Nummer des Sockets +1
                    my $send_ip = "localhost"; # Sendeport (UDP, siehe in Socket-Einstellungen)
                    my $send_port = "50111"; # Sendeport (UDP, siehe in Socket-Einstellungen)
                    my $recv_ip = "localhost"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
                    my $recv_port = "50110"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
                    
                    ### Vaillant Konfiguration ###
                    my @sets;
                    push @sets, { name => "RT_soll", 	GA => "0/0/0", 		QQ => "00", ZZ => "50", PB => "B5", SB => "05", NN => "02", DB1 => "01", DB2 => "" };
                    push @sets, { name => "RT_min", 	GA => "0/0/0", 		QQ => "00", ZZ => "50", PB => "B5", SB => "05", NN => "02", DB1 => "0A", DB2 => "" };
                    push @sets, { name => "HK_mode",	GA => "0/5/102", 	QQ => "00", ZZ => "50", PB => "B5", SB => "05", NN => "02", DB1 => "02", DB2 => "" };
                    push @sets, { name => "HK_curve", 	GA => "0/0/0", 		QQ => "00", ZZ => "50", PB => "B5", SB => "05", NN => "03", DB1 => "0B", DB2 => "", DB3 => "00" };
                    push @sets, { name => "HK_party", 	GA => "0/0/0", 		QQ => "00", ZZ => "50", PB => "B5", SB => "05", NN => "02", DB1 => "05", DB2 => "" };
                    push @sets, { name => "HK_spar", 	GA => "0/0/0", 		QQ => "00", ZZ => "50", PB => "B5", SB => "05", NN => "02", DB1 => "07", DB2 => "" };
                    push @sets, { name => "AT_off", 	GA => "0/0/0", 		QQ => "00", ZZ => "50", PB => "B5", SB => "09", NN => "04", DB1 => "0E", DB2 => "36", DB3 => "00", DB4 => "", DB5 => "00" };
                    push @sets, { name => "WW_load", 	GA => "0/5/101", 	QQ => "10", ZZ => "FE", PB => "B5", SB => "05", NN => "02", DB1 => "06", DB2 => "" };
                    push @sets, { name => "WW_soll", 	GA => "0/0/0", 		QQ => "00", ZZ => "25", PB => "B5", SB => "09", NN => "05", DB1 => "0E", DB2 => "82", DB3 => "00", DB4 => "", DB5 => "" };
                    push @sets, { name => "WW_min", 	GA => "0/0/0", 		QQ => "00", ZZ => "25", PB => "B5", SB => "09", NN => "05", DB1 => "0E", DB2 => "82", DB3 => "00", DB4 => "", DB5 => "" };
                    push @sets, { name => "WW_mode", 	GA => "0/0/0", 		QQ => "00", ZZ => "25", PB => "B5", SB => "09", NN => "04", DB1 => "0E", DB2 => "2B", DB3 => "00", DB4 => ""};
                    push @sets, { name => "HOL_date", 	GA => "0/0/0", 		QQ => "00", ZZ => "FE", PB => "B5", SB => "0B", NN => "08", DB1 => "01", DB2 => "Nr", DB3 => "ST", DB4 => "SM", DB5 => "SJ", DB6 => "ET", DB7 => "EM", DB8 => "EJ"};###FIXME DATATYP
                    push @sets, { name => "HOL_temp", 	GA => "0/0/0", 		QQ => "00", ZZ => "FE", PB => "B5", SB => "05", NN => "02", DB1 => "2A", DB2 => ""};
                    push @sets, { name => "HK_int", 	GA => "0/0/0", 		QQ => "10", ZZ => "08", PB => "B5", SB => "05", NN => "05", DB1 => "0E", DB2 => "7C", DB3 => "00", DB4 => "", DB5 => "FF" };
                    ### Ende Vaillant Konfiguration ###
                    
                    
                    ###############
                    ### M A I N ###
                    ###############
                    
                    ### Socket einrichten ###
                    $plugin_info{$plugname.'_cycle'} = 300;
                    if (!$socket[$socknum]) { # socket erstellen
                            $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
                                                      Proto => "udp",
                                                      LocalAddr => $recv_ip,
                                                      PeerPort  => $send_port,
                                                      PeerAddr  => $send_ip,
                                                      ReuseAddr => 1
                                                       )
                        or return ("open of $recv_ip : $recv_port failed: $!");
                    
                        $socksel->add($socket[$socknum]); # add socket to select
                    
                        $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
                        plugin_log($plugname,'Soket verbunden. Soketnummer: ' . $socknum);
                        return "opened Socket $socknum";   
                    }
                    ###
                    
                    ### Konfiguration einlesen ###
                    foreach my $set (@sets) {
                    $plugin_subscribe{$set->{GA}}{$plugname} = 1;   # An Gruppenadresse anmelden
                    
                    if ($msg{'dst'} eq $set->{GA})                  # Auf eintreffendes KNX-Telegramm reagiern + anhand der GA filtern
                    
                    {	
                    plugin_log($plugname, "Befehlsgruppe: $set->{name}");   # Logging der Befehlsgruppe
                    my $val = $msg{'value'};                                # Wert aus Telegramm filtern
                    my $subname = $set->{name};                             # $subname bekommt den Namen der entsprecheden sub
                    my $subref = \&$subname;                                # jetzt wird $subref die entsprechende sub zugewiesen
                    my $command = addCRC(&$subref($val));                   # Befehls-Sub ausf�hren und CRC anh�ngen
                    
                    &send ($command);   # Befehl senden
                    }
                    }
                    
                    ###################
                    ### S E N D E N ###
                    ###################
                    
                    sub send
                    {
                        my $cmd = shift;
                        my $raw = $cmd;
                        $raw =~ s/([0-9a-f]{2})/chr( hex( $1 ) )/gie;      # !!! Umwandlung des Hex-Strings
                        plugin_log($plugname, "send: $cmd");
                        syswrite($socket[$socknum], $raw); 
                    }
                    
                    
                    ################################
                    ### V A I L L A N T  S U B S ###
                    ################################
                    #lassen sich bestimmt noch optimieren in dem man die Konfiguration etwas erweitert
                    
                    ### Sparen bis ...  30min = 0,5 Stunden (21:30Uhr = 21,5) ###
                    sub HK_spar
                    {
                    foreach my $set(@sets){
                    if ($set->{name} eq "HK_spar")
                    {
                    my $input = $_[0];
                    my $val = (sprintf "%02d",$input); 				
                    $val = encode_d1c ($val);
                    my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
                    return $message;
                    }
                    }
                    }
                    ###
                    
                    ### Ferientemperatur ###
                    sub HOL_temp
                    {
                    foreach my $set(@sets){
                    if ($set->{name} eq "HOL_temp")
                    {
                    my $input = $_[0];
                    my $val = (sprintf "%02d",$input); 				
                    $val = encode_d1b ($val);
                    my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
                    return $message;
                    }
                    }
                    }
                    ###
                    
                    
                    ### Raumtemperatur Soll ###
                    sub RT_soll
                    {
                    foreach my $set(@sets){
                    if ($set->{name} eq "RT_soll")
                    {
                    my $input = $_[0];
                    my $val = (sprintf "%02d",$input); 				
                    $val = encode_d1b ($val);
                    my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
                    return $message;
                    }
                    }
                    }
                    ###
                    
                    ### Raumtemperatur Absenkung ###
                    sub RT_min
                    {
                    foreach my $set(@sets){
                    if ($set->{name} eq "RT_min")
                    {
                    my $input = $_[0];
                    my $val = (sprintf "%02d",$input); 				
                    $val = encode_d1b ($val);
                    my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
                    return $message;
                    }
                    }
                    }
                    ###
                    
                    ### 1-Heizen, 2-Aus, 3-Auto, 4-Eco, 5-Absenken ###
                    sub HK_mode
                    {
                    foreach my $set(@sets){
                    if ($set->{name} eq "HK_mode")
                    {
                    my $input = $_[0];
                    my $val = (sprintf "%02d",int($input)); 
                    my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
                    return $message;
                    }
                    }
                    }
                    ###
                    
                    ### Heizkurve 0,20 etc ###
                    sub HK_curve
                    {
                    foreach my $set(@sets){
                    if ($set->{name} eq "HK_curve")
                    {
                    my $input = $_[0];
                    $input *= 100;
                    my $val = (sprintf "%02d",$input); 
                    $val = encode_d1b($val);
                    my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val.$set->{DB3};
                    return $message;
                    }
                    }
                    }
                    ###
                    
                    ### 0-Partymodus aus, 1-Partymodus an ###
                    sub HK_party
                    {
                    foreach my $set(@sets){
                    if ($set->{name} eq "HK_party")
                    {
                    my $input = $_[0];
                    my $val = (sprintf "%02d",$input);
                    my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
                    return $message;
                    }
                    }
                    }
                    ###
                    
                    ### Betriebsmodus WW 1-aus, 2-an, 3-auto ###
                    sub WW_mode
                    {
                    foreach my $set(@sets){
                    if ($set->{name} eq "WW_mode")
                    {
                    my $input = $_[0];
                    my $val = (sprintf "%02d",$input);
                    my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$set->{DB2}.$set->{DB3}.$val;
                    return $message;
                    }
                    }
                    }
                    ###
                    
                    ### 0-Speicherladung abbrechen, 1-Speicherladung ###
                    sub WW_load
                    {
                    foreach my $set(@sets){
                    if ($set->{name} eq "WW_load")
                    {
                    my $input = $_[0];
                    my $val = (sprintf "%02d",$input);
                    my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$val;
                    return $message;
                    }
                    }
                    }
                    ###
                    
                    
                    ### Energieintegral setzen ###
                    sub HK_int
                    {
                    foreach my $set(@sets){
                    if ($set->{name} eq "HK_int")
                    {
                    my $input = $_[0];
                    my $val = (sprintf "%02d",$input);
                    $val = encode_d1b($val);
                    my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$set->{DB2}.$set->{DB3}.$val.$set->{DB3};
                    return $message;
                    }
                    }
                    }
                    ###
                    
                    ### Au�entemperatur Abschaltgrenze ###
                    sub AT_off
                    {
                    foreach my $set(@sets){
                    if ($set->{name} eq "AT_off")
                    {
                    my $input = $_[0];
                    my $val = (sprintf "%02d",$input);
                    $val = encode_d1b($val);
                    my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$set->{DB2}.$set->{DB3}.$val.$set->{DB3};
                    return $message;
                    }
                    }
                    }
                    ###
                    
                    ### Solltemperatur WW-Speicher ### 
                    sub WW_soll
                    {
                    foreach my $set(@sets){
                    if ($set->{name} eq "WW_soll")
                    {
                    my $input = $_[0];
                    my $val = (sprintf "%02d",$input);
                    $val = encode_d2c($val);
                    my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$set->{DB2}.$set->{DB3}.$val;
                    return $message;
                    }
                    }
                    }
                    ###
                    
                    ### Min.-Temperatur WW-Speicher ### 
                    sub WW_min
                    {
                    foreach my $set(@sets){
                    if ($set->{name} eq "WW_min")
                    {
                    my $input = $_[0];
                    my $val = (sprintf "%02d",$input); 	
                    $val = encode_d2c($val);
                    my $message = $set->{QQ}.$set->{ZZ}.$set->{PB}.$set->{SB}.$set->{NN}.$set->{DB1}.$set->{DB2}.$set->{DB3}.$val;
                    return $message;
                    }
                    }
                    }
                    ###
                    
                    ############################################
                    ### D A T E N K O N V E R T I E R U N G ####
                    ############################################
                    
                    
                    ### BCD ### ### FIX ME !!!!!
                    sub decode_bcd {
                        #return (unpack "H*", pack "C*",hex($_[0]));
                    	unpack "H*", $_[0]; ####?????
                    }
                    
                    sub encode_bcd {
                    	return pack 'H*', join '', $_[0];
                    }
                    
                    ### DATA1b ###
                    
                    sub decode_d1b{         #1byte signed 
                        my $val = hex(shift);
                        return $val > 127 ? $val-256 : $val;
                    }
                    
                    sub encode_d1b {        #### F I X M E !!!!!
                        my $y = shift;
                        $y *= 256;
                        $y = $y & 0xffff if ($y < 0);
                        my $hb = int $y/256;
                        return (sprintf("%0.2X", $hb));
                    }
                    
                    
                    ### DATA1c
                    
                    sub decode_d1c {
                    my $y = hex ($_[0])/2;
                    return $y;
                    }
                    
                    sub encode_d1c {
                        return sprintf "%x",(($_[0])*2);
                    }
                    
                    
                    ### DATA2b ###
                    
                    sub decode_d2b { 
                    	return unpack("s", pack("s", hex($_[0].$_[1]))) / 256; 
                    }
                    
                    sub encode_d2b {
                    	my ($hb, $lb) = unpack("H[2]H[2]", pack("s", $_[0] * 256));
                    	return $lb.$hb;
                    }
                    
                    ### alternativ
                    #sub decodex_d2b{
                    #    my $hb = hex($_[0]);
                    #    my $lb = hex($_[1]);
                    #
                    #   if ($hb & 0x80) {
                    #      return -( (~$hb & 255) + ((~$lb & 255) + 1)/256 );
                    #    }
                    #   else {
                    #        return $hb + $lb/256;
                    #    }
                    #}
                    #
                    #sub encodex_d2b {
                    #    my $y = shift;
                    #    $y *= 256;
                    #    $y = $y & 0xffff if ($y < 0);
                    #    my $hb = int $y/256;
                    #    my $lb = $y % 256;
                    #    return (sprintf("%0.2X", $hb), sprintf("%0.2X", $lb));
                    #}
                    
                    
                    ### DATA2c ###
                    
                    sub decode_d2c{
                    my $high = $_[1];
                    my $low = $_[0];
                    return unpack("s",(pack("H4", $low.$high)))/16;
                    }
                    
                    sub encode_d2c{
                    my $val = $_[0];
                    my $temp_hex = unpack("H4", pack("n", ($val)*16));
                    # change lowbyte/highbyte -> lowbyte first
                    return substr($temp_hex,2,4).substr($temp_hex,0,2);
                    }
                    
                    ####################
                    ### A D D  C R C ###
                    ####################
                    
                    ### CRC hinzufuegen
                    sub addCRC
                    {
                    my $string = $_[0];
                    my $temp_string = pack("H*","$string"); ### geht auch!
                    my $crc = new EBus();
                    my $check = $crc->calcCrcExpanded($temp_string);
                    my $crcfinal = uc(sprintf("%02x", $check));
                    my $finalStr = $string.$crcfinal;
                    }
                    ###
                    
                    
                    ###################################
                    ### V O M  E - B U S  L E S E N ###
                    ###################################
                    
                    #if ($fh) { # Wenn eBus ein Telegramm sendet, wird ab hier der entsprechende Status ausgelesen.
                    #  my $buf;
                    #  recv($fh,$buf,255,0);
                    #  my $bufhex = $buf;
                    #  $bufhex =~ s/(.)/sprintf("%.2X",ord($1))/eg;
                    #  return "Received: $bufhex";
                    #}
                    ###
                    
                    
                    return;
                    Umgezogen? Ja! ... Fertig? Nein!
                    Baustelle 2.0 !

                    Kommentar


                      Hi,

                      das ist super. Leider bin ich zu viel unterwegs. Ich werde es definitv testen, sobald ich wieder Zeit habe.

                      Gruß

                      Kommentar


                        Ich frage jetzt mal ganz doof: Woher weiß ich, ob meine Vaillant Therme einen eBus hat und wenn ja, wo finde ich den?!

                        Kommentar


                          Schreib doch mal welche Therme du hast
                          Umgezogen? Ja! ... Fertig? Nein!
                          Baustelle 2.0 !

                          Kommentar


                            Zitat von JuMi2006 Beitrag anzeigen
                            Schreib doch mal welche Therme du hast
                            Sorry...konnte ich gestern Abend vom Bett aus nicht mehr :-)

                            Also die Therme ist eine "ecoTEC Plus mit CalorMATIC" sowie eine Solarsteuerung für's warme Wasser "auroMATIC 560".

                            Hab zur Sicherheit mal zwei Bilder angehangen...
                            Angehängte Dateien

                            Kommentar


                              So richtig genau weiß ich es nicht, würde aber behaupten dass zumindest die Therme (calormatic) eBus spricht ... die Auromatic sollte das eigentlich auch tun, aber am Besten mal die Handbücher dazu raussuchen und in den Schaltbildern gucken.

                              ecoTec plus + Calormatic: -> Vaillant Therme über eBus steuern
                              Umgezogen? Ja! ... Fertig? Nein!
                              Baustelle 2.0 !

                              Kommentar


                                Zitat von JuMi2006 Beitrag anzeigen
                                So richtig genau weiß ich es nicht, würde aber behaupten dass zumindest die Therme (calormatic) eBus spricht ... die Auromatic sollte das eigentlich auch tun, aber am Besten mal die Handbücher dazu raussuchen und in den Schaltbildern gucken.
                                Stimmt, die Therme kann es. Zumindestens steht dort was von eBus. Da die Calormatic eingebaut ist, habe ich noch keinen blassen Schimmer, wie ich an den Bus komme...muss ich irgendwann mal mit dem Schraubenzieher nachschauen :-)

                                Was die Automatic angeht....da steht nur "C1/C2 - Anbindung an Heizeinheit". Die zwei Adern klingen ja auch verdächtig nach eBus.

                                Die müssten ja wenn dann auch dem selben Bus liegen und damit müsste ich sie ja sowieso lesen können?!

                                Kommentar

                                Lädt...
                                X