Ankündigung

Einklappen
Keine Ankündigung bisher.

AlphaInnotec / Luxtronik Ansteuerung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    AlphaInnotec / Luxtronik Ansteuerung

    Aloha,

    ich habe schon hier im Forum gelesen und mir auch das Luxtronik.pm Perumodul runtergeladen, aber irgendwie tut's das nicht.
    Das Skript läuft bei mir unter OS X (Linux) und die Anbindung klappt auch. Wenn ich über coolterm den Code 1800 sende bekomme ich brav eine Rückmeldung mit Zahlen alle durch Semikolon getrennt, aber wenn ich das Skript starte, dann sehe ich nur kryptische Zeichen.

    Code:
    mail:Desktop macadmin$ ./luxtronik.pl 
    send request->1800
    count_out = 6
    count = 11,  response :
    D ?R
    777
    
    
    Response check for request 1800 NOT ok at Luxtronik.pm line 97.
    send request->1800
    count_out = 6
    count = 11,  response :
    IBR
    777
    
    
    Response check for request 1800 NOT ok at Luxtronik.pm line 97.
    send request->1800
    count_out = 6
    count = 10,  response :
    ?00
    777
    
    
    Response check for request 1800 NOT ok at Luxtronik.pm line 97.
    send request->1800
    count_out = 6
    count = 2,  response :
    L
    
    Error: We have a problem here... at Luxtronik.pm line 104.
    mail:Desktop macadmin$
    Wo liegt das Problem?!?
    Ich habe die aaskommentierten print Befehle aktiviert, um diese Ausgabe zu bekommen.
    Und noch eine Frage woran erkenne ich, dass es Luxtronik 1 oder 2 ist? Meine WP ist übrigens von 2008. Ich hoffe mir kann jemand einen Tip geben.
    Danke

    #2
    Ich habe weiter getestet und kurz mit einem Python-Script die serielle Schnittstelle ausgelesen. Das sieht dann schon besser aus:

    Code:
     [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]SERIAL OUT:[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1800[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1800;8[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1100;12;261;258;265;231;65;356;440;90;106;750;0;0[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1200;6;0;0;0;1;1;0[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1300;13;0;0;1;1;0;1;0;0;0;0;0;0;0[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1400;29;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;56;20;0;0;0;0;0;15;0;0;0;0;0;0[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1450;9;43610439;23451;1859;0;0;0;1152370;0;43610439[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1500;5[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1500;1500;6;717;30;4;9;8;57[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1500;1501;6;717;30;4;9;9;48[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1500;1502;6;717;30;4;9;19;56[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1500;1503;6;717;5;5;9;11;20[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1500;1504;6;717;31;12;15;15;13[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1500;5[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1600;5[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1600;1600;6;010;2;1;16;3;31[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1600;1601;6;010;2;1;16;5;38[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1600;1602;6;010;2;1;16;7;32[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1600;1603;6;010;2;1;16;7;48[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1600;1604;6;010;2;1;16;11;23[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1600;5[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1700;12;11; V2.33;1;3;31;12;15;15;29;29,0,0[/SIZE][/FONT][/COLOR]
      [COLOR=#29F914][FONT=Andale Mono][SIZE=12px]1800;8[/SIZE][/FONT][/COLOR]
    Aber wieso funktioniert es nicht mit dem Perl-Skript?!?

    Kommentar


      #3
      Hi,

      die Luxtronik-Regler schauen schon unterschiedlich aus.

      Luxtronik 1:
      http://www.haustechnikdialog.de/news...19_03_04-1.jpg

      Luxtronik 2.
      http://www.geosolar.hu/katalogus/com...0be176b32b.jpg

      Das Skript funktioniert nur mit Luxtronik 1. Welche Firmwareversion hat deine Luxtronik?
      Welche Version von Luxtronik.pm verwendest du (s. Header)?

      Gruß,
      thoern

      Kommentar


        #4
        Hi thoern,

        frohes neues wünsch' ich dir.

        Folgendes Luxtronik-Script habe ich probiert:
        Code:
        #
        # Luxtronik.pm
        # Date: 18.10.2014
        # Version: 0.5
        # Copyright: Thomas Hoerndlein, 2012-2013
        # Provides an OO-Interface to a Luxtronik 1 heating control
        #
        Laut deinen Fotos ist meine Steuerung definitiv Luxtronik V1. Die Firmwareversion muss ich noch nachschauen. Ich meine Version 1.73 oder 1.77...muss ich aber prüfen. Finde es nur eigenartig, dass ich via Python die Schnittstelle prima auslesen kann und mit dem Perlskript kommt nur Buchstabensalat heraus....muss ja eher an der Library Device::SerialPort liegen oder?

        Ich wollte mir halt ersparen, dein Perl-Script unter Python neu zu programmieren
        Vielen Dank für die bisherige Hilfe!

        Kommentar


          #5
          Hi,

          wünsche auch ein frohes Neues!

          Also die Firmwareversion müsste definitiv höher sein. Bei mir ist sie 2.40. Du kannst das nachschauen unter
          Informationen -> Anlagenstatus -> SW-Version

          Wie ist deine WP mit deinem Mac verbunden? Direkt oder nutzt du irgendwelche USB2Servial-Converter, etc?
          Hättest du die Möglichkeit, das Skript unter Linux zu testen?

          Ich habe mir dein 1800-Listing weiter oben angeschaut. Genauso muss die Rückmeldung auch aussehen.

          Mit welchen Parametern ist dein Coolterm/Python-Skript eingestellt? Das Luxtronik.pm verwendet folgende Einstellungen:
          Code:
          $SP->handshake("xoff"); # set parameter
          $SP->baudrate(57600);
          $SP->parity("none");
          $SP->databits(8);
          $SP->stopbits(1); # POSIX does not support 1.5 stopbits
          Gruß,
          thoern

          Kommentar


            #6
            Hi,

            die Softwareversion habe ich nachgeschaut v2.33:
            IMG_3441.JPG

            Also momentan läuft alles unter OS X 10.11 (El Capitan) und soll dann in openHAB eingebunden werden.
            OS X basiert ja auf Linux und ist auch dementsprechend kompatibel. Deine oben genannten Parameter habe ich so im Perumodul verwendet:

            Code:
                        my $SP = new Device::SerialPort ($self->{serialport}, '', $self->{lockfile});
            
                    $SP->handshake("xoff");                         # set parameter
                    $SP->baudrate(57600);
                    $SP->parity("none");
                    $SP->databits(8);
                    $SP->stopbits(1);                               # POSIX does not support 1.5 stopbits
            In Coolterm sieht es so aus:
            Screen Shot 2016-01-02 at 19.11.52.png

            und wie gesagt es funktioniert, aber mit dem Perlscript kommt nur Buchstabensalat raus. Muss ich eventuell noch etwas in Perl konfigurieren?!?
            Danke
            Zuletzt geändert von pheno; 02.01.2016, 19:33. Grund: Bilder fehlten

            Kommentar


              #7
              Hm,

              also normalerweise musst du im luxtronik.pl nur den serialport setzen, wenn dieser vom Default (/dev/ttyS0) abweicht:

              Code:
              my $luxtronik = Luxtronik->new(serialport => '/dev/ttyS0');
              Aber das scheint ja schon zu funktionieren (die 777 kommt ja als Antwort).

              Ansonsten fällt mir nur auf, dass im Luxtronik.pm "xoff" gesetzt ist und in deinem Terminal "xon". Kannst ja mal versuchen, das im Luxtronik.pm abzuändern (glaube aber nicht, dass das das Problem ist...).

              Kannst du mal die Ausgabe der folgenden Kommandos posten:
              Code:
              root@xxx:~/luxtronik# perl -v | head -2
              
              This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi
              
              root@xxx:~/luxtronik# locale
              LANG=en_US.UTF-8
              LANGUAGE=en_US:en
              LC_CTYPE="en_US.UTF-8"
              LC_NUMERIC="en_US.UTF-8"
              LC_TIME="en_US.UTF-8"
              LC_COLLATE="en_US.UTF-8"
              LC_MONETARY="en_US.UTF-8"
              LC_MESSAGES="en_US.UTF-8"
              LC_PAPER="en_US.UTF-8"
              LC_NAME="en_US.UTF-8"
              LC_ADDRESS="en_US.UTF-8"
              LC_TELEPHONE="en_US.UTF-8"
              LC_MEASUREMENT="en_US.UTF-8"
              LC_IDENTIFICATION="en_US.UTF-8"
              LC_ALL=

              Kommentar


                #8
                Hi,

                also bei mir sieht das so aus:

                Code:
                mail:Desktop macadmin$ perl -v|head -2
                
                This is perl 5, version 22, subversion 1 (v5.22.1) built for darwin-thread-multi-2level
                mail:Desktop macadmin$ locale
                LANG="en_US.UTF-8"
                LC_COLLATE="en_US.UTF-8"
                LC_CTYPE="en_US.UTF-8"
                LC_MESSAGES="en_US.UTF-8"
                LC_MONETARY="en_US.UTF-8"
                LC_NUMERIC="en_US.UTF-8"
                LC_TIME="en_US.UTF-8"
                LC_ALL="en_US.UTF-8"
                mail:Desktop macadmin$
                Nur verstehe ich nicht warum unter Perl nur eine kryptische Antwort kommt. Alles andere funktioniert Python, Coolerem und sogar der screen Befehl.

                Kommentar


                  #9
                  Hi, kannst du mir mal die beiden Skripte, also Luxtronik.pm und luxtronik.pl so wie du sie jetzt verwendest zuschicken? Dann lasse ich sie mal bei mir laufen. Gruß
                  Zuletzt geändert von thoern; 04.01.2016, 09:40.

                  Kommentar


                    #10
                    Das sind die Skripte luxronik.pl:

                    Code:
                    #!/usr/local/opt/perl/bin/perl -w
                    
                    #
                    # luxtronik.pl
                    # Date: 05/2012
                    # Version: 0.1
                    # Copyright: Thomas Hoerndlein, 2012
                    # Testskript for Luxtronik.pm
                    #
                    
                    
                    use lib '/Users/macadmin/perl5//lib/perl5/darwin-thread-multi-2level';
                    use Luxtronik;
                    
                    #my $luxtronik = Luxtronik->new();
                    my $luxtronik = Luxtronik->new(serialport => '/dev/cu.usbserial');
                    $luxtronik->update_infos;
                    
                    print "Temperatur Vorlauf:                     " . $luxtronik->temperaturen('vorlauf')                  . "°C\n";
                    print "Temperatur Ruecklauf (Soll):            " . $luxtronik->temperaturen('ruecklauf')                . "°C\n";
                    print "Temperatur Ruecklauf :                  " . $luxtronik->temperaturen('ruecklauf_soll')           . "°C\n";
                    print "Temperatur Heissgas:                    " . $luxtronik->temperaturen('heissgas')                 . "°C\n";
                    print "Temperatur Aussen:                      " . $luxtronik->temperaturen('aussen')                   . "°C\n";
                    print "Temperatur Brauchwasser (Ist):          " . $luxtronik->temperaturen('brauchwasser_ist')         . "°C\n";
                    print "Temperatur Brauchwasser (Soll):         " . $luxtronik->temperaturen('brauchwasser_soll')        . "°C\n";
                    print "Temperatur Waermequelle Ein:            " . $luxtronik->temperaturen('waermequelle_ein')         . "°C\n";
                    print "Temperatur Kaeltekreis:                 " . $luxtronik->temperaturen('kaeltekreis')              . "°C\n";
                    print "Temperatur Mischkreis 1 Vorlauf:        " . $luxtronik->temperaturen('mischkreis1_vorlauf')      . "°C\n";
                    print "Temperatur Mischkreis 1 Vorlauf (Soll): " . $luxtronik->temperaturen('mischkreis1_vorlauf_soll') . "°C\n";
                    print "Temperatur Raumstation:                 " . $luxtronik->temperaturen('raumstation')              . "°C\n";
                    
                    @temperaturen =  $luxtronik->temperaturen;
                    print "Alle Temperaturen: "; 
                    foreach (@temperaturen) { print "$_ " };
                    print "\n\n";
                    
                    
                    print "Eingang ASD: " . $luxtronik->eingaenge('asd') . "\n";
                    print "Eingang EVU: " . $luxtronik->eingaenge('evu') . "\n";
                    print "Eingang HD:  " . $luxtronik->eingaenge('hd')  . "\n";
                    print "Eingang MOT: " . $luxtronik->eingaenge('mot') . "\n";
                    print "Eingang ND:  " . $luxtronik->eingaenge('nd')  . "\n";
                    print "Eingang PEX: " . $luxtronik->eingaenge('pex') . "\n";
                    
                    @eingaenge =  $luxtronik->eingaenge;
                    print "Alle Eingaenge: "; 
                    foreach (@eingaenge) { print "$_ " };
                    print "\n\n";
                    
                    
                    print "Ausgang Abtauventil:                   " . $luxtronik->ausgaenge('abtauventil') . "\n";
                    print "Ausgang Brauchwasserumwaelzpumpe:      " . $luxtronik->ausgaenge('bup') . "\n";
                    print "Ausgang Fussbodenheizungsumwaelzpumpe: " . $luxtronik->ausgaenge('fup1') . "\n";
                    print "Ausgang Heizungsumwaelzpumpe:          " . $luxtronik->ausgaenge('hup') . "\n";
                    print "Ausgang Mischer 1 Auf:                 " . $luxtronik->ausgaenge('mischer1_auf') . "\n";
                    print "Ausgang Mischer 1 Zu:                  " . $luxtronik->ausgaenge('mischer1_zu') . "\n";
                    print "Ventilation:                           " . $luxtronik->ausgaenge('ventilation') . "\n";
                    print "Ventil BOSUP:                          " . $luxtronik->ausgaenge('ventil_bosup') . "\n";
                    print "Verdichter 1:                          " . $luxtronik->ausgaenge('verdichter1') . "\n";
                    print "Verdichter 2:                          " . $luxtronik->ausgaenge('verdichter2') . "\n";
                    print "ZUP-ZIP:                               " . $luxtronik->ausgaenge('zup_zip') . "\n";
                    print "ZWE1:                                  " . $luxtronik->ausgaenge('zwe1') . "\n";
                    print "ZWE2 SST:                              " . $luxtronik->ausgaenge('zwe2_sst') . "\n";
                    
                    @ausgaenge =  $luxtronik->ausgaenge;
                    print "Alle Ausgaenge: "; 
                    foreach (@ausgaenge) { print "$_ " };
                    print "\n\n";
                    
                    
                    print "Ablaufzeit WP seit:                            " . $luxtronik->ablaufzeiten('wp_seit') . "\n";
                    print "Ablaufzeit ZWE 1 seit:                         " . $luxtronik->ablaufzeiten('zwe1_seit') . "\n";
                    print "Ablaufzeit ZWE 2 seit:                         " . $luxtronik->ablaufzeiten('zwe2_seit') . "\n";
                    print "Ablaufzeit Netzeinschaltverz.:                 " . $luxtronik->ablaufzeiten('netzeinv') . "\n";
                    print "Ablaufzeit Schaltspielsperre (SSP) Standzeit:  " . $luxtronik->ablaufzeiten('ssp_zeit_standzeit') . "\n";
                    print "Ablaufzeit Schaltspielsperre (SSP) Einschverz: " . $luxtronik->ablaufzeiten('ssp_zeit_einschverz') . "\n";
                    print "Ablaufzeit VD Stand:                           " . $luxtronik->ablaufzeiten('vd_stand') . "\n";
                    print "Ablaufzeit HRM Zeit:                           " . $luxtronik->ablaufzeiten('hrm_zeit') . "\n";
                    print "Ablaufzeit HRW Zeit:                           " . $luxtronik->ablaufzeiten('hrw_zeit') . "\n";
                    print "Ablaufzeit TDI seit:                           " . $luxtronik->ablaufzeiten('tdi_seit') . "\n";
                    print "Ablaufzeit Sperre BW:                          " . $luxtronik->ablaufzeiten('sperre_bw') . "\n";
                    
                    @ablaufzeiten =  $luxtronik->ablaufzeiten;
                    print "Alle Ablaufzeiten: "; 
                    foreach (@ablaufzeiten) { print "$_ " };
                    print "\n\n";
                    
                    
                    print "Betriebsstunden VD1:         " . $luxtronik->betriebsstunden('vd1') . "\n";
                    print "Betriebsstunden VD1 Impulse: " . $luxtronik->betriebsstunden('vd1imp') . "\n";
                    print "Betriebsstunden VD1 deZ:     " . $luxtronik->betriebsstunden('vd1dez') . "\n";
                    print "Betriebsstunden VD2:         " . $luxtronik->betriebsstunden('vd2') . "\n";
                    print "Betriebsstunden VD2 Impulse: " . $luxtronik->betriebsstunden('vd2imp') . "\n";
                    print "Betriebsstunden VD2 deZ:     " . $luxtronik->betriebsstunden('vd2dez') . "\n";
                    print "Betriebsstunden ZWE1:        " . $luxtronik->betriebsstunden('zwe1') . "\n";
                    print "Betriebsstunden ZWE2:        " . $luxtronik->betriebsstunden('zwe2') . "\n";
                    print "Betriebsstunden WP:          " . $luxtronik->betriebsstunden('wp') . "\n";
                    
                    @betriebsstunden =  $luxtronik->betriebsstunden;
                    print "Alle Betriebsstunden: "; 
                    foreach (@betriebsstunden) { print "$_ " };
                    print "\n\n";
                    
                    
                    print "Anlagenstatus WP-Typ:             " . $luxtronik->anlagenstatus('wp-typ') . "\n";
                    print "Anlagenstatus SW-Stand:           " . $luxtronik->anlagenstatus('sw-stand') . "\n";
                    print "Anlagenstatus Biv-Stufe:          " . $luxtronik->anlagenstatus('biv-stufe') . "\n";
                    print "Anlagenstatus Betriebszustand:    " . $luxtronik->anlagenstatus('betriebszustand') . "\n";
                    print "Anlagenstatus Einschaltzeitpunkt: " . $luxtronik->anlagenstatus('einschaltzeitpunkt') . "\n";
                    print "Anlagenstatus Compact:            " . $luxtronik->anlagenstatus('compact') . "\n";
                    print "Anlagenstatus Comfort:            " . $luxtronik->anlagenstatus('comfort') . "\n";
                    
                    @anlagenstatus =  $luxtronik->anlagenstatus;
                    print "Alle Anlagenstatus: "; 
                    foreach (@anlagenstatus) { print "$_ " };
                    print "\n\n";
                    
                    
                    print "Fehlerspeicher 0: " . $luxtronik->fehlerspeicher(0) . "\n";
                    print "Fehlerspeicher 1: " . $luxtronik->fehlerspeicher(1) . "\n";
                    print "Fehlerspeicher 2: " . $luxtronik->fehlerspeicher(2) . "\n";
                    print "Fehlerspeicher 3: " . $luxtronik->fehlerspeicher(3) . "\n";
                    print "Fehlerspeicher 4: " . $luxtronik->fehlerspeicher(4) . "\n";
                    
                    @fehlerspeicher =  $luxtronik->fehlerspeicher;
                    print "Alle Fehlerspeicher: "; 
                    foreach (@fehlerspeicher) { print "$_ " };
                    print "\n\n";
                    
                    
                    print "Abschaltung 0: " . $luxtronik->abschaltungen(0) . "\n";
                    print "Abschaltung 1: " . $luxtronik->abschaltungen(1) . "\n";
                    print "Abschaltung 2: " . $luxtronik->abschaltungen(2) . "\n";
                    print "Abschaltung 3: " . $luxtronik->abschaltungen(3) . "\n";
                    print "Abschaltung 4: " . $luxtronik->abschaltungen(4) . "\n";
                    @abschaltung =  $luxtronik->abschaltungen;
                    print "Alle Abschaltungen: "; 
                    foreach (@abschaltung) { print "$_ " };
                    print "\n\n";
                    
                    
                    print "Alle Informationen als CSV:\n" . $luxtronik->informationen('csv') . "\n\n";
                    @informationen =  $luxtronik->informationen;
                    print "Alle Informationen:\n"; 
                    foreach (@informationen) { print "$_ " };
                    print "\n\n";
                    
                    print "Abfragezeit: " . localtime($luxtronik->info_time());
                    print "\n\n";
                    Luxtronik.pm:
                    Code:
                    package Luxtronik;
                    
                    #
                    # Luxtronik.pm
                    # Date: 18.10.2014
                    # Version: 0.5
                    # Copyright: Thomas Hoerndlein, 2012-2013
                    # Provides an OO-Interface to a Luxtronik 1 heating control
                    #
                    
                    
                    use warnings;
                    use strict;
                    #use Carp;
                    use Device::SerialPort;
                    
                    
                    # Constructor and initialization
                    sub new {
                            my $class = shift;
                            my $self = {@_};
                            bless($self, $class);
                            $self->_init;
                            return $self;
                    }
                    
                    sub _init {
                            my $self = shift;
                        $self->{serialport} || ($self->{serialport} = "/dev/ttyS0");    # make /dev/ttyS0 default
                    
                        my $devname = @{ [reverse split /\//, $self->{serialport}] }[0];
                        $self->{lockfile} || ($self->{lockfile} = "/tmp/" . $devname . ".lock"); # default is/tmp/ttyS0.lock 
                    
                        $self->{request_retries} ||  ($self->{request_retries} = 5);
                    
                    #       carp "New object created";
                    }
                    
                    sub _send2luxtronik {
                            my $self = shift;
                        my $request = shift;
                        $request = $request."\r\n";
                    print "send request->".$request;
                        my $i = 0;                                # check if serial port is in use
                        while (-e $self->{lockfile}) {
                            warn "$self->{lockfile} exists => serial port is locked. Have to wait....\n";
                            sleep 1;
                            $i++;
                            if ($i >= $self->{request_retries}) {
                                            die "Error: Aborting after " . $self->{request_retries} . " unsuccessful luxtronik request retries";
                            }
                        }
                    
                        my $SP = new Device::SerialPort ($self->{serialport}, '', $self->{lockfile});
                    
                        $SP->handshake("xoff");                # set parameter
                        $SP->baudrate(57600);
                        $SP->parity("none");
                        $SP->databits(8);
                        $SP->stopbits(1);                # POSIX does not support 1.5 stopbits
                    
                    
                        my $count_out = $SP->write("$request");
                        warn "write failed\n"         unless ($count_out);
                        warn "write incomplete\n"     if ( $count_out != length($request) );
                        #print "count_out = $count_out\n";
                    print "count_out = $count_out\n";
                    
                    
                        $SP->read_const_time(1000);
                        my ($count, $response) = $SP->read(1000);
                        #print "count = $count,  response :\n";
                        #print "$response\n\n";
                    print "count = $count,  response :\n";
                    print "response->".$response."\n\n";
                    
                        undef $SP;                        # calls $PortObj->close and destroys object
                    
                        $response =~ s/\r/\n/g;                    # change carriage return into newline
                        $response =~ s/\n+/\n/g;                # remove redundant newlines
                    
                        return $response;
                    }
                    
                    sub update_infos {
                        my $self = shift;
                    
                        my $code = '1800';
                    
                        my $result = $self->_send2luxtronik($code);
                    
                        my $counter = 0;                    # check for valid response
                        while ($counter <= 2) {
                            if ($self->_check_response($code, $result)) {
                                last;
                            } else {
                                warn "Response check for request $code NOT ok";
                                $result = $self->_send2luxtronik($code);
                            }
                            $counter++;
                        }
                        
                        unless ($self->_check_response($code, $result)) {
                            die "Error: We have a problem here...";
                        }
                    
                    
                        $self->{info_time} = time;
                    
                        my (@lines) = split /\n/, $result;            # split on carriage return/line feed
                        my @temperaturen     = split /;/, $lines[2];
                        my @eingaenge        = split /;/, $lines[3];
                        my @ausgaenge        = split /;/, $lines[4];
                        my @ablaufzeiten     = split /;/, $lines[5];
                        my @betriebsstunden  = split /;/, $lines[6];
                        my @fehlerspeicher0  = split /;/, $lines[8];
                        my @fehlerspeicher1  = split /;/, $lines[9];
                        my @fehlerspeicher2  = split /;/, $lines[10];
                        my @fehlerspeicher3  = split /;/, $lines[11];
                        my @fehlerspeicher4  = split /;/, $lines[12];
                        my @abschaltung0     = split /;/, $lines[15];
                        my @abschaltung1     = split /;/, $lines[16];
                        my @abschaltung2     = split /;/, $lines[17];
                        my @abschaltung3     = split /;/, $lines[18];
                        my @abschaltung4     = split /;/, $lines[19];
                        my @anlagenstatus    = split /[;,]/, $lines[21];
                    
                        splice @temperaturen, 0, 2;                 # first two elements are overhead    
                        $self->{temperaturen_ref} = \@temperaturen;
                    
                        splice @eingaenge, 0, 2;                 # first two elements are overhead    
                        $self->{eingaenge_ref} = \@eingaenge;
                    
                        splice @ausgaenge, 0, 2;                 # first two elements are overhead    
                        $self->{ausgaenge_ref} = \@ausgaenge;
                    
                        splice @ablaufzeiten, 0, 2;                 # first two elements are overhead    
                        my @temp;
                        push @temp, "$ablaufzeiten[0]:$ablaufzeiten[1]:$ablaufzeiten[2]";
                        push @temp, "$ablaufzeiten[3]:$ablaufzeiten[4]:$ablaufzeiten[5]";
                        push @temp, "$ablaufzeiten[6]:$ablaufzeiten[7]:$ablaufzeiten[8]";
                        push @temp, "$ablaufzeiten[9]";
                        push @temp, "$ablaufzeiten[10]:$ablaufzeiten[11]";
                        push @temp, "$ablaufzeiten[12]:$ablaufzeiten[13]";
                        push @temp, "$ablaufzeiten[14]:$ablaufzeiten[15]:$ablaufzeiten[16]";
                        push @temp, "$ablaufzeiten[17]:$ablaufzeiten[18]:$ablaufzeiten[19]";
                        push @temp, "$ablaufzeiten[20]:$ablaufzeiten[21]:$ablaufzeiten[22]";
                        push @temp, "$ablaufzeiten[23]:$ablaufzeiten[24]:$ablaufzeiten[25]";
                        push @temp, "$ablaufzeiten[26]:$ablaufzeiten[27]:$ablaufzeiten[28]";
                        @ablaufzeiten = @temp;
                        $self->{ablaufzeiten_ref} = \@ablaufzeiten;
                    
                        splice @betriebsstunden, 0, 2;                 # first two elements are overhead    
                        $self->{betriebsstunden_ref} = \@betriebsstunden;
                    
                        splice @anlagenstatus, 0, 2;                 # first two elements are overhead    
                        my $eszpdatum = join('.', splice @anlagenstatus, 4, 3);
                        my $eszpzeit  = join(':', splice @anlagenstatus, 4, 3);
                        my $einschaltzeitpunkt = "$eszpdatum $eszpzeit";
                        push @anlagenstatus, $einschaltzeitpunkt;
                        $self->{anlagenstatus_ref} = \@anlagenstatus;
                        #print "Anlagenstatus @anlagenstatus\n";
                    
                        my ($fcode, $fdate, $ftime);
                        my @fs_ref = (\@fehlerspeicher0, \@fehlerspeicher1, \@fehlerspeicher2, \@fehlerspeicher3, \@fehlerspeicher4);
                        my @fehlerspeicher;
                        foreach (@fs_ref) {
                            splice @$_, 0, 3;                 # first three elements are overhead    
                            $fcode = shift @$_;
                            $fdate = join('.', splice @$_, 0, 3);
                            $ftime = join(':', splice @$_, 0, 2);
                            push @fehlerspeicher, "$fcode $fdate $ftime";
                        } 
                        @fehlerspeicher = reverse @fehlerspeicher;
                        $self->{fehlerspeicher_ref} = \@fehlerspeicher;
                    
                        my ($acode, $adate, $atime);
                        my @as_ref = (\@abschaltung0, \@abschaltung1, \@abschaltung2, \@abschaltung3, \@abschaltung4);
                        my @abschaltungen;
                        foreach (@as_ref) {
                            splice @$_, 0, 3;                 # first three elements are overhead    
                            $acode = shift @$_;
                            $adate = join('.', splice @$_, 0, 3);
                            $atime = join(':', splice @$_, 0, 2);
                            push @abschaltungen, "$acode $adate $atime";
                        } 
                        @abschaltungen = reverse @abschaltungen;
                        $self->{abschaltungen_ref} = \@abschaltungen;
                    
                        return 1;
                    }
                    
                    sub heizkurve {
                        my $self = shift;
                        my $hk_ref = shift;
                    
                        my $savecode   = '999';
                        my $statuscode = '3400';
                        my $progcode   = '3401';
                        my $result;
                    
                        my %hk;
                    
                        if (! defined $hk_ref) {
                            my $result = $self->_send2luxtronik($statuscode);
                        
                            my $counter = 0;                    # check for valid response
                            while ($counter <= 2) {
                                if ($self->_check_response($statuscode, $result)) {
                                    last;
                                } else {
                                    warn "Response check for request $statuscode NOT ok";
                                    $result = $self->_send2luxtronik($statuscode);
                                }
                                $counter++;
                            }
                            
                            unless ($self->_check_response($statuscode, $result)) {
                                die "Error: We have a problem here...";
                            }
                        
                            my @lines = split /\n/, $result;            # split on carriage return/line feed
                            my @hk  = split /;/, $lines[1];
                            
                            %hk = (
                                codeword        => $hk[0],
                                elements        => $hk[1],
                                abweichung        => $hk[2],
                                endpunkt        => $hk[3],
                                parallelverschiebung    => $hk[4],
                                absenkung        => $hk[5],
                                key6            => $hk[6],
                                key7            => $hk[7],
                                key8            => $hk[8],
                                key9            => $hk[9],
                                key10            => $hk[10],
                            );
                        
                            return \%hk;
                    
                        } elsif (ref($hk_ref) eq 'HASH')  {
                    
                            $hk_ref->{'codeword'} = $progcode; 
                    
                            my $hk = join ';',      ($hk_ref->{'codeword'},
                                        $hk_ref->{'elements'},
                                        $hk_ref->{'abweichung'},
                                        $hk_ref->{'endpunkt'},
                                        $hk_ref->{'parallelverschiebung'},
                                        $hk_ref->{'absenkung'},
                                        $hk_ref->{'key6'},
                                        $hk_ref->{'key7'},
                                        $hk_ref->{'key8'},
                                        $hk_ref->{'key9'},
                                        $hk_ref->{'key10'});
                            # print "\$hk: $hk\n";
                    
                    
                            $result = $self->_send2luxtronik($progcode);
                            die "Error: Problem occured while entering prog mode"     unless ($self->_check_response($progcode, $result));
                    
                            $progcode = $hk;
                            $result = $self->_send2luxtronik($progcode); 
                            die "Error: Problem occured while sending in prog mode" unless ($self->_check_response("$progcode", $result));
                    
                            $result = $self->_send2luxtronik($savecode);
                            die "Error: Problem occured while saving changes"       unless ($self->_check_response($savecode, $result));
                    
                        } else {
                                my $arg_type = ref($hk_ref);
                                die "Error: Argument is of type §arg_type. Must be a  hash reference";
                        }
                    
                        return 1;
                    }
                    
                    sub heizung {
                        my $self = shift;
                        my $switch = shift;                    # Ein/Aus
                    
                        $self->_betriebsmodus('heizung', $switch);
                    }
                    
                    sub warmwasser {
                        my $self = shift;
                        my $switch = shift;                    # Ein/Aus
                    
                        $self->_betriebsmodus('warmwasser', $switch);
                    }
                    
                    sub _betriebsmodus {
                        my $self = shift;
                        my $machine = shift;
                        my $switch = shift;                    # Ein/Aus
                    
                        my $savecode = '';
                        my $statuscode = '';
                        my $progcode = '';
                        my $result;
                    
                        if ($machine eq 'heizung') {
                            $statuscode = '3405';
                            $progcode   = '3406';
                        } elsif  ($machine eq 'warmwasser') {
                            $statuscode = '3505';
                            $progcode   = '3506';
                        } else {
                            die "Error: Machine is invalid: $machine";
                        }
                    
                        if (! defined $switch) {
                            
                            $result = $self->_send2luxtronik($statuscode);
                        
                            my $counter = 0;                    # check for valid response
                            while ($counter <= 2) {
                                if ($self->_check_response($statuscode, $result)) {
                                    last;
                                } else {
                                    warn "Response check for request $statuscode NOT ok";
                                    $result = $self->_send2luxtronik($statuscode);
                                }
                                $counter++;
                            }
                            
                            unless ($self->_check_response($statuscode, $result)) {
                                die "Error: We have a problem here...";
                            }
                        
                            my @lines = split /\n/, $result;            # split on carriage return/line feed
                            my [USER="4802"]mode[/USER]  = split /;/, $lines[1];
                    
                            return 'automatik' if $mode[2] == 0;
                            return 'zwe'       if $mode[2] == 1;
                            return 'party'     if $mode[2] == 2;
                            return 'ferien'    if $mode[2] == 3;
                            return 'aus'       if $mode[2] == 4;
                            die "Error: Mode is invalid: $mode[2]";
                    
                        } elsif ($switch =~ /^automatik$|^zwe$|^party$|^aus$/) {
                    
                            $result = $self->_send2luxtronik($progcode);
                            die "Error: Problem occured while entering prog mode"     unless ($self->_check_response($progcode, $result));
                            if ($switch eq 'automatik') {
                                $progcode = "$progcode;1;0";
                                $result = $self->_send2luxtronik($progcode);
                            } elsif ($switch eq 'zwe') {
                                $progcode = "$progcode;1;1";
                                $result = $self->_send2luxtronik($progcode);
                            } elsif ($switch eq 'party') {
                                $progcode = "$progcode;1;2";
                                $result = $self->_send2luxtronik($progcode);
                    #        } elsif ($switch eq 'ferien') {
                    #            $progcode = "$progcode;1;3";
                    #            $result = $self->_send2luxtronik($progcode);
                            } elsif ($switch eq 'aus') {
                                $progcode = "$progcode;1;4";
                                $result = $self->_send2luxtronik($progcode);
                            } else {
                                die "Error: Illegal argument: $switch";
                            }
                            die "Error: Problem occured while sending in prog mode" unless ($self->_check_response("$progcode", $result));
                            $savecode = '999';
                            $result = $self->_send2luxtronik($savecode);
                            die "Error: Problem occured while saving changes"            unless ($self->_check_response($savecode, $result));
                        } else {
                            die "Error: Illegal argument: $switch";
                        }
                    
                        return $switch;
                    }
                    
                    sub exit_progmode {
                    
                        # Wenn die Steuerung mit nem Fehler auf den Programmiervorgang antwortet
                        # (777 oder 779) dann sendest Du eine # 3401;0 und dann eine  999.
                        # Damit werden die alten Werte wieder aktiviert und die Steuerung
                        # verlässt den Programmiermodus.
                    
                    }
                    
                    sub _check_response {
                        my $self = shift;
                        my $code = shift;
                        my $response = shift;
                        my @checkstring;
                        my ($checkstring, $reference) = '';
                    
                        my (@lines) = split /\n/, $response;                    # split on carriage return/line feed
                        my $i = 0;
                        
                        if ($code eq '1800') {
                                foreach (@lines) {
                                        push @checkstring, $lines[$i]                               if ($i == 0);
                                        push @checkstring, splice @{ [split /;/, $lines[$i]] }, 0,2 if ($i == 1);        # Split into an anonymous list and
                                        push @checkstring, splice @{ [split /;/, $lines[$i]] }, 0,2 if ($i >= 2 && $i <= 6);    # create a reference [..] to it, turn
                                        push @checkstring, splice @{ [split /;/, $lines[$i]] }, 0,2 if ($i == 7);        # the reference into an anonymous
                                        push @checkstring, splice @{ [split /;/, $lines[$i]] }, 0,3 if ($i >= 8 && $i <= 12);    # array @{..} and splice the required
                                        push @checkstring, splice @{ [split /;/, $lines[$i]] }, 0,2 if ($i == 13);        # elements off. This is necessary
                                        push @checkstring, splice @{ [split /;/, $lines[$i]] }, 0,2 if ($i == 14);        # because splice is an array operator
                                        push @checkstring, splice @{ [split /;/, $lines[$i]] }, 0,3 if ($i >= 15 && $i <= 19);    # and not a list operator.
                                        push @checkstring, splice @{ [split /;/, $lines[$i]] }, 0,2 if ($i == 20);
                                        push @checkstring, splice @{ [split /;/, $lines[$i]] }, 0,2 if ($i == 21);
                                        push @checkstring, splice @{ [split /;/, $lines[$i]] }, 0,2 if ($i == 22);
                                        $i++;
                                }
                                $reference = '18001800811001212006130013140029145091500515001500615001501615001502615001503615001504615005160051600160061600160161600160261600160361600160461600517001218008';
                    
                        } elsif ($code eq '3400' || $code eq '3401' || $code eq '3405' || $code eq '3406' || $code eq '3505' || $code eq '3506'){
                        
                                push @checkstring, $lines[0];
                            push @checkstring, splice @{ [split /;/, $lines[1]] }, 0,2;
                            $reference = '340034009' if $code eq '3400';            # Heizkurve
                            $reference = '340134019' if $code eq '3401';            # Heizkurve (Programmierung)
                            $reference = '340534051' if $code eq '3405';            # Heizung Stauts
                            $reference = '340634061' if $code eq '3406';            # Heizung Programmierung
                            $reference = '350535051' if $code eq '3505';            # Warmwasser Status
                            $reference = '350635061' if $code eq '3506';            # Warmwasser Programmierung
                    
                        } elsif ($code =~ /3406;1;[0-4]/){
                    
                            push @checkstring, splice @{ [split /;/, $lines[0]] }, 0,2;
                            push @checkstring, splice @{ [split /;/, $lines[1]] }, 0,2;
                            $reference = '3406134061';
                    
                        } elsif ($code =~ /3506;1;[0-4]/){
                    
                            push @checkstring, splice @{ [split /;/, $lines[0]] }, 0,2;
                            push @checkstring, splice @{ [split /;/, $lines[1]] }, 0,2;
                            $reference = '3506135061';
                    
                        } elsif ($code =~ /3401;9;/){
                    
                            push @checkstring, splice @{ [split /;/, $lines[0]] }, 0,2;
                            push @checkstring, splice @{ [split /;/, $lines[1]] }, 0,2;
                            $reference = '3401934019';
                    
                        } elsif ($code eq '999'){
                    
                                push @checkstring, $lines[0];
                                push @checkstring, $lines[1];
                            $reference = '999993';
                    
                        } else {
                            ######    $reference = $checkstring;
                        }
                    
                               $checkstring = join '', @checkstring;
                    
                        # print "Checkstring: $checkstring, Reference: $reference\n";
                    
                            if ($checkstring eq $reference) {
                                    return 1;
                            }
                    
                            return 0;
                    
                    }
                    
                    sub temperaturen {
                        my ($self, $name) = @_;
                    
                        if (! defined $self->{info_time}) {
                            die "Error: Luxtronik object is empty (ensure update_info() is called at first)";
                        }
                    
                        my @temp =  @{$self->{temperaturen_ref}};
                        foreach (@temp) {
                            $_ = $_ / 10;
                        }
                        if ($name) {
                            return $temp[0]  if $name eq 'vorlauf';
                            return $temp[1]  if $name eq 'ruecklauf';
                            return $temp[2]  if $name eq 'ruecklauf_soll';
                            return $temp[3]  if $name eq 'heissgas';
                            return $temp[4]  if $name eq 'aussen';
                            return $temp[5]  if $name eq 'brauchwasser_ist';
                            return $temp[6]  if $name eq 'brauchwasser_soll';
                            return $temp[7]  if $name eq 'waermequelle_ein';
                            return $temp[8]  if $name eq 'kaeltekreis';
                            return $temp[9]  if $name eq 'mischkreis1_vorlauf';
                            return $temp[10] if $name eq 'mischkreis1_vorlauf_soll';
                            return $temp[11] if $name eq 'raumstation';
                        } else {
                    #        return @{$self->{temperaturen_ref}};
                            return @temp;
                        }
                    }
                    
                    sub eingaenge {
                        my ($self, $name) = @_;
                    
                        if (! defined $self->{info_time}) {
                            die "Error: Luxtronik object is empty (ensure update_info() is called at first)";
                        }
                    
                        if ($name) {
                            return $self->{eingaenge_ref}->[0]  if $name eq 'asd';
                            return $self->{eingaenge_ref}->[1]  if $name eq 'evu';
                            return $self->{eingaenge_ref}->[2]  if $name eq 'hd';
                            return $self->{eingaenge_ref}->[3]  if $name eq 'mot';
                            return $self->{eingaenge_ref}->[4]  if $name eq 'nd';
                            return $self->{eingaenge_ref}->[5]  if $name eq 'pex';
                        } else {
                            return @{$self->{eingaenge_ref}};
                        }
                    }
                    
                    sub ausgaenge {
                        my ($self, $name) = @_;
                    
                        if (! defined $self->{info_time}) {
                            die "Error: Luxtronik object is empty (ensure update_info() is called at first)";
                        }
                    
                        if ($name) {
                            return $self->{ausgaenge_ref}->[0]  if $name eq 'abtauventil';
                            return $self->{ausgaenge_ref}->[1]  if $name eq 'bup';
                            return $self->{ausgaenge_ref}->[2]  if $name eq 'fup1';
                            return $self->{ausgaenge_ref}->[3]  if $name eq 'hup';
                            return $self->{ausgaenge_ref}->[4]  if $name eq 'mischer1_auf';
                            return $self->{ausgaenge_ref}->[5]  if $name eq 'mischer1_zu';
                            return $self->{ausgaenge_ref}->[6]  if $name eq 'ventilation';
                            return $self->{ausgaenge_ref}->[7]  if $name eq 'ventil_bosup';
                            return $self->{ausgaenge_ref}->[8]  if $name eq 'verdichter1';
                            return $self->{ausgaenge_ref}->[9]  if $name eq 'verdichter2';
                            return $self->{ausgaenge_ref}->[10]  if $name eq 'zup_zip';
                            return $self->{ausgaenge_ref}->[11]  if $name eq 'zwe1';
                            return $self->{ausgaenge_ref}->[12]  if $name eq 'zwe2_sst';
                        } else {
                            return @{$self->{ausgaenge_ref}};
                        }
                    }
                    
                    sub ablaufzeiten {
                        my ($self, $name) = @_;
                    
                        if (! defined $self->{info_time}) {
                            die "Error: Luxtronik object is empty (ensure update_info() is called at first)";
                        }
                    
                        if ($name) {
                            return $self->{ablaufzeiten_ref}->[0]  if $name eq 'wp_seit';
                            return $self->{ablaufzeiten_ref}->[1]  if $name eq 'zwe1_seit';
                            return $self->{ablaufzeiten_ref}->[2]  if $name eq 'zwe2_seit';
                            return $self->{ablaufzeiten_ref}->[3]  if $name eq 'netzeinv';
                            return $self->{ablaufzeiten_ref}->[4]  if $name eq 'ssp_zeit_standzeit';
                            return $self->{ablaufzeiten_ref}->[5]  if $name eq 'ssp_zeit_einschverz';
                            return $self->{ablaufzeiten_ref}->[6]  if $name eq 'vd_stand';
                            return $self->{ablaufzeiten_ref}->[7]  if $name eq 'hrm_zeit';
                            return $self->{ablaufzeiten_ref}->[8]  if $name eq 'hrw_zeit';
                            return $self->{ablaufzeiten_ref}->[9]  if $name eq 'tdi_seit';
                            return $self->{ablaufzeiten_ref}->[10]  if $name eq 'sperre_bw';
                        } else {
                            return @{$self->{ablaufzeiten_ref}};
                        }
                    }
                    
                    sub betriebsstunden {
                        my ($self, $name) = @_;
                    
                        if (! defined $self->{info_time}) {
                            die "Error: Luxtronik object is empty (ensure update_info() is called at first)";
                        }
                    
                        if ($name) {
                            return _secs2hours($self->{betriebsstunden_ref}->[0])  if $name eq 'vd1';
                            return             $self->{betriebsstunden_ref}->[1]   if $name eq 'vd1imp';
                            return _secs2hours($self->{betriebsstunden_ref}->[2])  if $name eq 'vd1dez';
                            return _secs2hours($self->{betriebsstunden_ref}->[3])  if $name eq 'vd2';
                            return             $self->{betriebsstunden_ref}->[4]   if $name eq 'vd2imp';
                            return _secs2hours($self->{betriebsstunden_ref}->[5])  if $name eq 'vd2dez';
                            return _secs2hours($self->{betriebsstunden_ref}->[6])  if $name eq 'zwe1';
                            return _secs2hours($self->{betriebsstunden_ref}->[7])  if $name eq 'zwe2';
                            return _secs2hours($self->{betriebsstunden_ref}->[8])  if $name eq 'wp';
                        } else {
                            my @bs = (); my $i = 0;
                            foreach (@{$self->{betriebsstunden_ref}}) {
                                if ($i == 1 || $i == 4) {
                                    push @bs, $_;
                                } else {
                                    push @bs,  _secs2hours($_);
                                }
                                $i++;
                    
                            }    
                            return @bs;
                        }
                    }
                    
                    sub anlagenstatus {
                        # betriebszustand 3 entpricht 'EVU'
                        # betriebszustand 1 entpricht 'Brauchwasser'
                        my ($self, $name) = @_;
                    
                        if (! defined $self->{info_time}) {
                            die "Error: Luxtronik object is empty (ensure update_info() is called at first)";
                        }
                    
                        my @as = @{$self->{anlagenstatus_ref}};
                        $as[3] = 'Heizen'       if ($as[3] eq '0');
                        $as[3] = 'Warmwasser'   if ($as[3] eq '1');
                        $as[3] = 'EVU Sperre'   if ($as[3] eq '3');
                        $as[3] = 'Bereitschaft' if ($as[3] eq '5');
                        if ($name) {
                            return $as[0]  if $name eq 'wp-typ';
                            return $as[1]  if $name eq 'sw-stand';
                            return $as[2]  if $name eq 'biv-stufe';
                            return $as[3]  if $name eq 'betriebszustand';
                            return $as[4]  if $name eq 'compact';
                            return $as[5]  if $name eq 'comfort';
                            return $as[6]  if $name eq 'einschaltzeitpunkt';
                        } else {
                            return @as;
                        }
                    }
                    
                    sub fehlerspeicher {
                        # valid values for $index : 0,1,2,3,4
                        my ($self, $index) = @_;
                    
                        if (! defined $self->{info_time}) {
                            die "Error: Luxtronik object is empty (ensure update_info() is called at first)";
                        }
                    
                        if (defined $index) {
                            return $self->{fehlerspeicher_ref}->[$index];
                        } else {
                            return @{$self->{fehlerspeicher_ref}};
                        }
                    }
                    
                    sub abschaltungen {
                        # valid values for $index : 0,1,2,3,4
                        # Code 010 => Weniger Waerme, 001 => Waermepumpenstörung
                        my ($self, $index) = @_;
                    
                        if (! defined $self->{info_time}) {
                            die "Error: Luxtronik object is empty (ensure update_info() is called at first)";
                        }
                    
                        my ($ascode, $asdate, $astime);
                        my @as = ();
                        if (defined $index) {
                            ($ascode, $asdate, $astime) = split / /,  $self->{abschaltungen_ref}->[$index];
                            $ascode = "Waermepumpenstoerung" if ($ascode eq '001');
                            $ascode = "Anlagenstoerung"      if ($ascode eq '002');
                            $ascode = "Weniger Waerme"       if ($ascode eq '010');
                            return "$ascode $asdate $astime";
                        } else {
                            foreach (@{$self->{abschaltungen_ref}}) {
                                ($ascode, $asdate, $astime) = split / /,  $_;
                                $ascode = "Waermepumpenstoerung" if ($ascode eq '001');
                                $ascode = "Anlagenstoerung"      if ($ascode eq '002');
                                $ascode = "Weniger Waerme"       if ($ascode eq '010');
                                push @as, "$ascode $asdate $astime";
                            }
                            return @as;
                        }
                    }
                    
                    sub info_time {
                        my ($self) = @_;
                    
                        if (! defined $self->{info_time}) {
                            die "Error: Luxtronik object is empty (ensure update_info() is called at first)";
                        }
                    
                        return $self->{info_time};
                    }
                    
                    sub informationen {
                        my $self = $_[0];
                    
                        if (! defined $self->{info_time}) {
                            die "Error: Luxtronik object is empty (ensure update_info() is called at first)";
                        }
                    
                        my $format = '';
                        $format = $_[1] if $_[1];
                    
                        my @infos = ();
                        push @infos, $self->{info_time};
                        push @infos, @{ $self->{temperaturen_ref} };
                        push @infos, @{ $self->{eingaenge_ref} };
                        push @infos, @{ $self->{ausgaenge_ref} };
                        push @infos, @{ $self->{ablaufzeiten_ref} };
                        push @infos, @{ $self->{betriebsstunden_ref} };
                        push @infos, @{ $self->{fehlerspeicher_ref} };
                        push @infos, @{ $self->{abschaltungen_ref} };
                        push @infos, @{ $self->{anlagenstatus_ref} };
                    
                        if ($format eq 'csv') {
                            return join ';',  @infos;
                            
                        }
                    
                        return @infos;
                    
                    }
                    
                    sub _secs2hours {
                        my $time = shift;
                        my $hours = int($time / 3600);
                        $time -= ($hours * 3600);
                        my $minutes = int($time / 60);
                        my $seconds = $time % 60;
                    
                        $time = "$hours:$minutes:$seconds";
                        return $time;
                    }
                    
                    
                    1;
                    
                    
                    =head2 NAME
                    
                    Luxtronik - Steuern und Abfragen einer Luxtronik 1 Steuerung
                    
                    =head2 VERSION
                    
                    Dieses Dokument bezieht sich auf die Version 0.5 der Luxtronik-Schnittstelle.
                    Veroeffentlicht am 18.10.2014
                    
                    =head2 SYNOPSIS
                    
                     use Luxtronik;
                    
                     my $luxtronik = Luxtronik->new();
                    
                     # Hole Informationsdaten der Luxtronik-Steuerung:
                     $luxtronik->update_infos();
                    
                     # Speichere alle Temperatuerwerte in Liste @temperatur:
                     my @temperatur = $luxtronik->temperaturen();
                    
                     # Lege Ruecklauftemperatur in $tr ab:
                     my $tr = $luxtronik->temperaturen('ruecklauf')
                    
                     # Schalte Warmwasserbereitung ab:
                     $luxtronik->warmwasser('aus');
                    
                    =head2 BESCHREIBUNG
                    
                    Luxtronik.pm stellt eine objektorientierte Schnittstelle zur Kommunikation mit einer Luxtronik-Steuerung (Hardwareversion 1) bereit.
                    
                    =head2 KONSTRUKTORMETHODEN
                    
                    
                    
                    =over
                    
                    =item $luxtronik = Luxtronik->new();
                    
                    =item $luxtronik = Luxtronik->new(serialport => '/dev/ttyS0', request_retries => 5);
                    
                    Diese Methode erzeugt das Luxtronik-Objekt und gibt es zurueck.
                    
                       Option            Voreinstellung   Beschreibung
                       ------            --------------   ------------
                       serialport        /dev/ttyS0       Gibt die zu verwendente serielle Schnittstelle an.
                       request_retries   5                Gibt an, wie oft im Belegungsfall versucht wird,
                                                          eine Kommunikation mit der Luxtronik ueber die
                                                          serielle Schnittstelle durchzufuehren.
                    
                    =back
                    
                    =head2 OBJEKTMETHODEN
                    
                    =over
                    
                    Bei den Objektmethoden wird zwischen aktiven und passiven Methoden unterschieden.
                    
                    Aktive Methode: Baut bei Aufruf eine Kommunikationsverbindung zur Luxtronik auf und liest oder schreibt Daten ueber diese Verbindung.
                    
                    Passive Methode: Baut bei Aufruf keine Kommunikationsverbindung zur Luxtronik auf. Gibt nur Objekteigenschaften zurueck, die ggf. vorher durch eine aktive Methode gesetzt wurden.
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->heizung;
                    
                    =item $luxtronik->heizung($action);
                    
                    Bei Aufruf ohne Argument wird die Betriebsart der Heizung zurueckgegeben. Mit Argument kann die gewuenschte Betriebsart gesetzt werden.
                    
                    Methodenart: I<aktiv>
                    
                       Moegliche Betriebsarten   Argument ($action)
                       -----------------------   ------------------
                       Automatik                 automatik
                       Zweitwaermeerzeuger       zwe
                       Party                     party
                       Ferien                    (wird derzeit noch nicht unterstuetzt)
                       Aus                       aus
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->warmwasser;
                    
                    =item $luxtronik->warmwasser($action);
                    
                    Bei Aufruf ohne Argument wird die Betriebsart der Warmwasserbereitung zurueckgegeben. Mit Argument kann die gewuenschte Betriebsart gesetzt werden.
                    
                    Methodenart: I<aktiv>
                    
                       Moegliche Betriebsarten   Argument ($action)
                       -----------------------   ------------------
                       Automatik                 automatik
                       Zweitwaermeerzeuger       zwe
                       Party                     party
                       Ferien                    (wird derzeit noch nicht unterstuetzt)
                       Aus                       aus
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->heizkurve;
                    
                    =item $luxtronik->heizkurve(\%hk);
                    
                    Bei Aufruf ohne Argument wird eine Referenz auf einen Hash zurueckgegeben, der die aktuelle Heizkurve enthaelt.
                    
                    Methodenart: I<aktiv>
                    
                       Hashkey:            Bedeutung:
                       --------            ----------
                       codeword            Luxtronik Protokollcodewort
                       elements            Anzahl der aller Werte (ohne Codeword)
                       abweichung            Heizkurvenabweichug vom Standardwert -5 - +5
                       endpunkt            Heizkurvenendpunkt
                       parallelverschiebung        Parallelverschiebung der Heizkurve
                       absenkung            Nachtabsenkung
                       key6                unbekannter Wert
                       key7                unbekannter Wert
                       key8                unbekannter Wert
                       key9                unbekannter Wert
                       key10            unbekannter Wert
                    
                    Alle zurueckgegebenen Temperaturwerte werden als zehntel Grad Celsius dargestellt.
                    Ein Wert von 35 entspricht also 3,5 Grad Celsius.
                    
                    Wird der Methode eine Referenz auf einen Hash uebergeben, welcher die Heizkurve enthaelt, dann 
                    diese Heizkurve gesetzt. Der Rueckgabewert entspricht in diesem Fall 1 (true). 
                    
                       Praxisbeispiel
                       --------------
                    
                       $hkref = $luxtronik->heizkurve;        erzeuge Referenz auf Heizkurvenhash
                       $hkref->{'abweichung'} = -15;        Heizkurve um -1,5 Grad Celsius absenken
                       $luxtronik->heizkurve($hkref);        neue Heizkurve abspeichern
                    
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->exit_progmode;
                    
                    Noch nicht implementiert.
                    
                    Methodenart: I<aktiv>
                    
                    =back
                    
                    
                    =over
                    
                    =item $luxtronik->update_infos
                    
                    Holt die aktuellen Informationsdaten der Luxtronik-Steuerung ab und speichert diese in den Objekteigenschaften. Diese Methode muss mindestens einmal aufgerufen werden, bevor eine der nachfolgend aufgefuehrten Abfragemethoden aufgerufen wird.
                    
                    Methodenart: I<aktiv>
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->info_time
                    
                    Gibt Datum und Uhrzeit des letzten Aufrufs von $luxtronik->update_infos zurueck.
                    
                    Methodenart: I<passiv>
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->temperaturen
                    
                    =item $luxtronik->temperaturen('vorlauf')
                    
                    =item $luxtronik->temperaturen('ruecklauf')
                    
                    =item $luxtronik->temperaturen('ruecklauf_soll')
                    
                    =item $luxtronik->temperaturen('heissgas')
                    
                    =item $luxtronik->temperaturen('aussen')
                    
                    =item $luxtronik->temperaturen('brauchwasser_ist')
                    
                    =item $luxtronik->temperaturen('brauchwasser_soll')
                    
                    =item $luxtronik->temperaturen('waermequelle_ein')
                    
                    =item $luxtronik->temperaturen('kaeltekreis')
                    
                    =item $luxtronik->temperaturen('mischkreis1_vorlauf')
                    
                    =item $luxtronik->temperaturen('mischkreis1_vorlauf_soll')
                    
                    =item $luxtronik->temperaturen('raumstation')
                    
                    Bei Aufruf ohne Argument wird eine Liste mit den u.g. Temperaturen in der aufgefuehrten Reihenfolge zurueckgegeben. Mit Argument wird der Wert der angefragten Temperatur als Skalar zurueckgegeben. Vor Aufruf diese Methode muss mindestens einmal $luxtronik->update_infos aufgerufen worden sein.
                    
                    Methodenart: I<passiv>
                    
                       Temperaturen in Grad Celsius
                       ----------------------------
                       Vorlauf
                       Ruecklauf
                       Ruecklauf Soll
                       Heissgas
                       Aussen
                       Brauchwasser Ist
                       Brauchwasser Soll
                       Waermequelle Eingang
                       Kaeltekreis
                       Mischkreis 1 Vorlauf
                       Mischkreis 1 Vorlauf Soll
                       Raumstation
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->eingaenge
                    
                    =item $luxtronik->eingaenge('asd')
                    
                    =item $luxtronik->eingaenge('evu')
                    
                    =item $luxtronik->eingaenge('hd')
                    
                    =item $luxtronik->eingaenge('mot')
                    
                    =item $luxtronik->eingaenge('nd')
                    
                    =item $luxtronik->eingaenge('pex')
                    
                    Bei Aufruf ohne Argument wird eine Liste mit den u.g. Eingaengen in der aufgefuehrten Reihenfolge zurueckgegeben. Mit Argument wird der Wert des angefragten Eingangs als Skalar zurueckgegeben. Vor Aufruf diese Methode muss mindestens einmal $luxtronik->update_infos aufgerufen worden sein.
                    
                    Methodenart: I<passiv>
                    
                       Eingaenge
                       ---------
                       ASD
                       EVU
                       HD
                       MOT
                       ND
                       PEX
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->ausgaenge
                    
                    =item $luxtronik->ausgaenge('abtauventil')
                    
                    =item $luxtronik->ausgaenge('bup')
                    
                    =item $luxtronik->ausgaenge('fup1')
                    
                    =item $luxtronik->ausgaenge('hup')
                    
                    =item $luxtronik->ausgaenge('mischer1_auf')
                    
                    =item $luxtronik->ausgaenge('mischer1_zu')
                    
                    =item $luxtronik->ausgaenge('ventilation')
                    
                    =item $luxtronik->ausgaenge('ventil_bosup')
                    
                    =item $luxtronik->ausgaenge('verdichter1')
                    
                    =item $luxtronik->ausgaenge('verdichter2')
                    
                    =item $luxtronik->ausgaenge('zup_zip')
                    
                    =item $luxtronik->ausgaenge('zwe1')
                    
                    =item $luxtronik->ausgaenge('zwe2_sst')
                    
                    
                    Bei Aufruf ohne Argument wird eine Liste mit den u.g. Ausgaengen in der aufgefuehrten Reihenfolge zurueckgegeben. Mit Argument wird der Wert des angefragten Ausgangs als Skalar zurueckgegeben. Vor Aufruf diese Methode muss mindestens einmal $luxtronik->update_infos aufgerufen worden sein.
                    
                    Methodenart: I<passiv>
                    
                       Ausgaenge
                       ---------
                       Abtauventil
                       Brauchwasserumwaelzpumpe
                       Fussbodenheizungsumwaelzpumpe
                       Heizungsumwaelzpumpe
                       Ausgang Mischer 1 Auf
                       Ausgang Mischer 1 Zu
                       Ventilation
                       Ventil BOSUP
                       Verdichter 1
                       Verdichter 2
                       ZUP-ZIP
                       ZWE1
                       ZWE2 SST
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->ablaufzeiten
                    
                    =item $luxtronik->ablaufzeiten('wp_seit')
                    
                    =item $luxtronik->ablaufzeiten('zwe1_sei')
                    
                    =item $luxtronik->ablaufzeiten('zwe2_seit')
                    
                    =item $luxtronik->ablaufzeiten('netzeinv')
                    
                    =item $luxtronik->ablaufzeiten('ssp_zeit_standzeit')
                    
                    =item $luxtronik->ablaufzeiten('ssp_zeit_einschverz')
                    
                    =item $luxtronik->ablaufzeiten('vd_stand')
                    
                    =item $luxtronik->ablaufzeiten('hrm_zeit')
                    
                    =item $luxtronik->ablaufzeiten('hrw_zeit')
                    
                    =item $luxtronik->ablaufzeiten('tdi_seit')
                    
                    =item $luxtronik->ablaufzeiten('sperre_bw')
                    
                    Bei Aufruf ohne Argument wird eine Liste mit den u.g. Ablaufzeitn in der aufgefuehrten Reihenfolge zurueckgegeben. Mit Argument wird der Wert der angefragten Ablaufzeit als Skalar zurueckgegeben. Vor Aufruf diese Methode muss mindestens einmal $luxtronik->update_infos aufgerufen worden sein.
                    
                    Methodenart: I<passiv>
                    
                       Ablaufzeiten
                       ------------
                       WP seit
                       ZWE 1 seit
                       ZWE 2 seit
                       Netzeinschaltverz
                       Schaltspielsperre (SSP) Standzeit
                       Schaltspielsperre (SSP) Einschverz
                       VD Stand
                       HRM Zeit
                       HRW Zeit
                       TDI seit
                       Sperre BW
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->betriebsstunden
                    
                    =item $luxtronik->betriebsstunden('vd1')
                    
                    =item $luxtronik->betriebsstunden('vd1imp')
                    
                    =item $luxtronik->betriebsstunden('vd1dez')
                    
                    =item $luxtronik->betriebsstunden('vd2')
                    
                    =item $luxtronik->betriebsstunden('vd2imp')
                    
                    =item $luxtronik->betriebsstunden('vd2dez')
                    
                    =item $luxtronik->betriebsstunden('zwe1')
                    
                    =item $luxtronik->betriebsstunden('zwe2')
                    
                    =item $luxtronik->betriebsstunden('wp')
                    
                    Bei Aufruf ohne Argument wird eine Liste mit den u.g. Betriebsstunden in der aufgefuehrten Reihenfolge zurueckgegeben. Mit Argument wird der Wert der angefragten Betriebsstunden als Skalar zurueckgegeben. Vor Aufruf diese Methode muss mindestens einmal $luxtronik->update_infos aufgerufen worden sein.
                    
                    Methodenart: I<passiv>
                    
                       Betriebsstunden
                       ---------------
                    
                       VD1
                       VD1 Impulse
                       VD1 deZ
                       VD2
                       VD2 Impulse
                       VD2 deZ
                       ZWE1
                       ZWE2
                       WP
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->anlagenstatus
                    
                    =item $luxtronik->anlagenstatus('wp-typ')
                    
                    =item $luxtronik->anlagenstatus('sw-stand')
                    
                    =item $luxtronik->anlagenstatus('biv-stufe')
                    
                    =item $luxtronik->anlagenstatus('betriebszustand')
                    
                    =item $luxtronik->anlagenstatus('compact')
                    
                    =item $luxtronik->anlagenstatus('comfort')
                    
                    =item $luxtronik->anlagenstatus('einschaltzeitpunkt'
                    
                    Bei Aufruf ohne Argument wird eine Liste mit den u.g. Anlagenstatus in der aufgefuehrten Reihenfolge zurueckgegeben. Mit Argument wird der Wert des angefragten Anlagenstatus als Skalar zurueckgegeben. Vor Aufruf diese Methode muss mindestens einmal $luxtronik->update_infos aufgerufen worden sein.
                    
                    Methodenart: I<passiv>
                    
                       Anlagenstatus
                       -------------
                       WP-Typ
                       SW-Stand
                       Biv-Stufe
                       Betriebszustand
                       Compact
                       Comfort
                       Einschaltzeitpunkt
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->fehlerspeicher
                    
                    =item $luxtronik->fehlerspeicher(0)
                    
                    =item $luxtronik->fehlerspeicher(1)
                    
                    =item $luxtronik->fehlerspeicher(2)
                    
                    =item $luxtronik->fehlerspeicher(3)
                    
                    =item $luxtronik->fehlerspeicher(4)
                    
                    Bei Aufruf ohne Argument wird eine Liste mit den u.g. Fehlerspeichern in der aufgefuehrten Reihenfolge zurueckgegeben. Mit Argument wird der Wert des angefragten Fehlerspeichers als Skalar zurueckgegeben. Vor Aufruf diese Methode muss mindestens einmal $luxtronik->update_infos aufgerufen worden sein.
                    
                    Methodenart: I<passiv>
                    
                       Fehlerspeicher
                       --------------
                       0
                       1
                       2
                       3
                       4
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->abschaltungen
                    
                    =item $luxtronik->abschaltungen(0)
                    
                    =item $luxtronik->abschaltungen(1)
                    
                    =item $luxtronik->abschaltungen(2)
                    
                    =item $luxtronik->abschaltungen(3)
                    
                    =item $luxtronik->abschaltungen(4)
                    
                    Bei Aufruf ohne Argument wird eine Liste mit den u.g. Abschaltungen in der aufgefuehrten Reihenfolge zurueckgegeben. Mit Argument wird der Wert der angefragten Abschaltung als Skalar zurueckgegeben. Vor Aufruf diese Methode muss mindestens einmal $luxtronik->update_infos aufgerufen worden sein.
                    
                    Methodenart: I<passiv>
                    
                       Abschaltung
                       -----------
                       0
                       1
                       2
                       3
                       4
                    
                    =back
                    
                    =over
                    
                    =item $luxtronik->informationen
                    
                    =item $luxtronik->informationen('csv')
                    
                    Bei Aufruf ohne Argument wird eine Liste mit den u.g. Informationen in der aufgefuehrten Reihenfolge zurueckgegeben. Mit dem Argument 'csv' erfolgt die Ausgabe im CSV-Format (Trennung durch Semikolon). Vor Aufruf diese Methode muss mindestens einmal $luxtronik->update_infos aufgerufen worden sein.
                    
                    Methodenart: I<passiv>
                    
                       Informationen
                       -------------
                       Info Zeit (Zeitpunkt des letzten Aufrufs von $luxtronik->update_infos)
                       Liste aller Temperaturen
                       Liste aller Eingaenge
                       Liste aller Ausgaenge
                       Liste aller Ablaufzeiten
                       Liste aller Betriebsstunden
                       Liste aller Fehlerspeicher
                       Liste aller Abschaltungen
                       Liste aller Anlagenstatus
                    
                    =back
                    
                    =head2 AUTHOR
                    
                    Thomas Hoerndlein
                    
                    =head2 COPYRIGHT
                    
                    Copyright (c) 2012-2013, Thomas Hoerndlein. All rights reserved, some wrongs reversed.

                    Kommentar


                      #11
                      Hi,

                      wo hast du die eigentlich die Skripte her?
                      Zumindest in Line 331 von Luxtronik.pm ist ein Syntax-Error:
                      Code:
                      No such class mode at Luxtronik.pm line 331, near "my mode"
                      syntax error at Luxtronik.pm line 331, near "my mode  ="

                      Du kannst dir die Originale hier herunterladen:

                      http://www.hoerndlein.de/cms/index.php/luxtronik-1


                      Dein konfigurierter Serial-Port kommt mir auch seltsam vor : /dev/cu.usbserial
                      In deinem Screenshot weiter oben heisst das nur "usbserial". Insofern würde ich vermuten, dass das device so lauten müsste: /dev/usbserial


                      EDIT: So und gerade habe ich noch das hier gefunden:

                      You might notice that each serial device shows up twice in /dev, once as a tty.* and once as a cu.*. So, what's the difference? Well, TTY devices are for calling into UNIX systems, whereas CU (Call-Up) devices are for calling out from them (eg, modems). We want to call-out from our Mac, so /dev/cu.* is the correct device to use.
                      The technical difference is that /dev/tty.* devices will wait (or listen) for DCD (data-carrier-detect), eg, someone calling in, before responding. /dev/cu.* devices do not assert DCD, so they will always connect (respond or succeed) immediately.

                      => Ich würde es trotzdem mal mit dem zugehörigen tty-Device probieren. Offensichtlich verhalten sich Macs da etwas anders als normale Linux-Systeme.


                      Gruß,
                      thoern
                      Zuletzt geändert von thoern; 04.01.2016, 10:39.

                      Kommentar


                        #12
                        Hallo thoern,

                        sorry für die späte Antwort. Die Skripte habe ich hier runtergeladen: http://www.hoerndlein.de/cms/index.php/luxtronik-1
                        Ich habe keinen Syntaxerror im Skript und es macht auch keinen Unterschied ob ich die tty oder cu Devices benutze. Wie gesagt mit Python funktioniert es einwandfrei.

                        Mittlerweile habe ich mir die ganze Steuerung in Python programmiert und dein Skript diente mir als Vorlage, um die richtigen Codes zu identifizieren. Danke dafür!
                        Die Integration in openHAB habe ich auch schon abgeschlossen und soweit sieht es gut aus.

                        Screen Shot 2016-01-11 at 08.45.13.pngScreen Shot 2016-01-11 at 08.23.01.png

                        Funktioniert alles prima. Muss ich eventuell noch ein wenig debuggen, aber ich bin zufrieden. Wenn jemand Interesse an dem Python-Skript hat, dann bitte melden.
                        Angehängte Dateien

                        Kommentar


                          #13
                          Na super. Freut mich, dass es geklappt hat. Wenngleich der Weg zum Ziel etwas aufwändiger war.

                          Kommentar


                            #14
                            Aloha,

                            ich wurde von Ludger gefragt mein Python Skript zu posten. Hier ist es. Das ganz läuft bei mir unter macOS. Die Strecke von der Wärmepumpe habe ich mit Patchkabel, Adapter von RJ45 auf RS232 und dann auf USB angeschlossen.
                            Bei Fragen....bitte melden.
                            Beste Grüße, Manuel

                            Code:
                            #!/usr/bin/python
                            # -*- coding: utf-8 -*-
                            
                            from ctypes import *
                            import httplib
                            import os.path
                            import sys
                            import serial
                            import socket
                            import time
                            
                            csvFile=os.path.join('/Users/macadmin/Desktop/','vzlogger.csv')
                            selMode='NORMAL'
                            selCount='ST'
                            serialErr=''
                            
                            #print 'Param length: '+str(len(sys.argv))
                            param_count=len(sys.argv)
                            if param_count == 2:
                                selCount=sys.argv[1].upper()
                                print '======'+time.strftime("%d-%m-%y %H:%M:%S")+'======> COUNTER '+selCount
                            elif param_count == 3 and (sys.argv[1].upper() == 'ST' or sys.argv[1].upper() == 'WP'):
                                selMode=sys.argv[2].upper()
                                print selMode+' MODE!'
                            
                            def getHeatPump():
                                return getDevice(1)
                            
                            def getWaterPump():
                                return getDevice(2)
                            
                            def getDevice(num):
                                myPath = "/dev/"
                                pattern = "cu.SLAB"
                                myDev = []
                                num = num - 1
                                for r, d, f in os.walk(myPath):
                                    for myFile in f:
                                        if myFile.startswith(pattern):
                                            myDev.append(myFile)
                                return myDev[num]
                            
                            if selCount == 'ST':
                                cPort='/dev/'+getHeatPump()
                            #    cPort='/dev/tty.SLAB_USBtoUART33'
                            #    cPort='/dev/cu.SLAB_USBtoUART24'
                            #    cPort='/dev/cu.STROM'
                                cLabel='Stromzähler'
                            else:
                                cPort='/dev/'+getWaterPump()
                            #    cPort='/dev/tty.SLAB_USBtoUART'
                            #    cPort='/dev/cu.SLAB_USBtoUART'
                            #    cPort='/dev/cu.HEIZUNG'
                                cLabel='Wärmepumpe'
                            
                            
                            
                            def str2float(z):
                                try:
                                    z = float(z)
                                except ValueError:
                                    serialErr='(UNINITIALIZED)'
                                    z = float(0)
                                return "{:09.3f}".format(z)
                            
                            def readVal(type,value):
                                if type == 'nummer':
                                    Wert="1-0:0.0.0" # Zaehlernummer
                                else:
                                    Wert="1-0:1.8.1" # Zaehlerstand
                                index=value.find(Wert)
                                start=value.find('(', index)
                                ende=value.find(')', index)
                                result = value[start+1:ende]
                                if type == 'zaehler':
                                    return str2float(result)
                                return result
                            
                            #
                            # OLD SETTINGS: 9600-7E1
                            # ORG SETTINGS: 9600-8N1
                            cSer = serial.Serial(
                                port=cPort,\
                                baudrate=9600,\
                                bytesize=serial.SEVENBITS,\
                                parity=serial.PARITY_EVEN,\
                                stopbits=serial.STOPBITS_ONE,\
                                    timeout=2)
                            
                            while True:
                                cOut = cSer.read(135)
                                break
                            if selMode == 'DEBUG':
                                print cLabel+'('+str(len(cOut))+'):'
                                print cOut
                                print '------'
                            
                            ### GET CURRENT VALUES ZAEHLERNUMMER & ZAEHLERSTAND FROM COUNTER
                            ### Stromzaehlernummer ST=Strom WP=Heizung
                            cNummer = readVal('nummer',cOut)
                            cZaehler = readVal('zaehler',cOut)
                            
                            if selCount == 'ST':
                                print cLabel+'  : ' + str(cNummer) + " -> " + str(cZaehler) + serialErr
                            else:
                                print cLabel+'     : ' + str(cNummer) + " -> " + str(cZaehler) + serialErr
                            print '---'
                            
                            ### SEND NEW VALUES
                            # Actual count via rest API
                            try:
                                if float(cZaehler) > 0:
                                    cConnection = httplib.HTTPConnection('10.0.55.5', 9080)
                                    if selCount == 'ST':
                                        cConnection.request('PUT', '/rest/items/Zaehler_Strom/state', str(cZaehler))
                                    else:
                                        cConnection.request('PUT', '/rest/items/Zaehler_WP/state', str(cZaehler))
                                    cResult = cConnection.getresponse()
                            except socket.error as sockerr:
                                print 'openHAB not available! Error code: '+str(sockerr)
                            
                            # Write CSV file
                            today = (time.strftime("%Y-%m-%d ")) + (time.strftime("%H:%M:%S"))
                            #if os.path.isfile(csvFile):
                            #  print 'CSV file exists. Appending data....'
                            #  fileObj = open(csvFile, 'a')
                            #else:
                            #  print 'CSV file does not exist. Creating new one...'
                            #  fileObj = open(csvFile, 'w')
                            #  fileObj.write('Date & Time;Zaehler Strom;Zaehler Heizung')
                            #  fileObj.write('\n')
                            #print 'Path: ' + os.path.abspath(fileObj.name)
                            #print '==========================================================='
                            #fileObj.write(today+';'+str(ZaehlerST)+';'+str(ZaehlerWP))
                            #fileObj.write('\n')
                            #fileObj.close()
                            cSer.close()
                            pass

                            Kommentar

                            Lädt...
                            X