Ankündigung

Einklappen
Keine Ankündigung bisher.

Luxtronik 2.0 anbinden/auslesen

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

    [wiregate] Luxtronik 2.0 anbinden/auslesen

    Hallo zusammen,
    habe seit gestern meine Alpha Innotec Wärmepumpe und KWL am Netz. Jetzt würde ich gerne über ein Plugin die Daten auslesen bzw. z.B. die Lüftungsstufe setzen.

    Hat dies schon mal jemand angedacht/versucht?
    Habe die Luxtronik 2.0 drauf, Webserver läuft.
    Per Browser komme ich auch drauf, es wird ein Java-Applet gestartet, das nach einem (mir bekannten) Kennwort frägt. So kann ich die Parameter auslesen und definieren.

    Aber wie mache ich das per Perl-Script? Habe es schon mal so versucht:

    Code:
    my $sendIP = "192.168.2.20";
    my $sendPort = "8888";
    [SIZE=2] 
    [LEFT]use IO::Socket;
    my $[U]cmd[/U] = '00';
    my $sock = new IO::Socket::INET (
    PeerAddr => $sendIP,
    PeerPort => $sendPort,
    [U]Proto[/U] => '[U]tcp[/U]',
    );
    die "Error: $!\n" unless $sock;
    print $sock ("@".$[U]cmd[/U]."\r"."\n") ;
    close($sock);[/LEFT]
    [/SIZE]
    Die WP hat die IP 192.168.2.20, per Wireshark sehe ich eine Verbindung auf Port 8888 und im Datafeld die 00.
    Wenn ich das so starte, lehnt die WP die Verbindung ab.

    Jemand Ideen?
    Danke!
    ...good byte...

    #2
    Ich habe ein Plugin für sh.py geschrieben. Da kannst du evtl. Sachen übernehmen. Einfach mal in Github oder im Supportforum für sh.py schauen.
    Mit freundlichen Grüßen
    Niko Will

    Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
    - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

    Kommentar


      #3
      ... genau das was mich grad beschäftigt

      Hallo,

      das ist auch grad mein Thema und veranlasst mich zu meinem ersten Post...
      Ich hatte das Plugin schon ein paar Wochen erfolgreich am Laufen - bis ich letztes Wochenende das Wiregate aktualisiert hab. Jetzt bekomme ich nur noch sporadisch Antworten von der Luxtronik.
      Mein Socket know-how reicht für weiteres debuggen leider nicht aus.
      Vielleicht kann das einer von euch mal testen.

      Kurze Beschreibung: Es wird die Initial-Sequenz geschickt und wenn die Luxtronik richtig Antwortet (3004) werden die RRD Daten für die Temperaturen geschrieben.

      Code:
      # This plugin reads the AlphaInnotec/Novelan heatpump controller Luxtronik 2.0
      # via Socket to get the real-time data
      #
      # based on http://sourceforge.net/projects/opendta/
      #
      # Status: proof of concept
      
      
      # Eigenen Aufruf-Zyklus auf 5min setzen
      $plugin_info{$plugname.'_cycle'} = 300;
      
      # GA für die Aussentemperatur
      my $ga_lwp_ta = "x/x/x";
      
      my $socknum = 50123; # Eindeutige Nummer des Sockets +1
      my $PeerAddr = "192.168.x.x";
      my $PeerPort = "8888";
      my $msg;
      my $tmp;
      my $anz;
      my @daten_raw;
      my @buff;
      my @java_dataset = qw(1 2 3 4 5 6 7 8 9 10 
      Temperatur_TVL 
      Temperatur_TRL 
      Sollwert_TRL_HZ 
      Temperatur_TRL_ext 
      Temperatur_THG 
      Temperatur_TA 
      Mitteltemperatur 
      Temperatur_TBW 
      Einst_BWS_akt 
      Temperatur_TWE 
      Temperatur_TWA 
      Temperatur_TFB1 
      Sollwert_TVL_MK 
      Temperatur_RFV 
      Temperatur_TFB2 
      Sollwert_TVL_MK2 
      Temperatur_TSK 
      Temperatur_TSS 
      Temperatur_TEE 
      ASDin 
      BWTin 
      EVUin 
      HDin 
      MOTin 
      NDin 
      PEXin 
      SWTin 
      AVout 
      BUPout 
      HUPout 
      MA1out 
      MZ1out 
      VENout 
      VBOout 
      VD1out 
      VD2out 
      ZIPout 
      ZUPout 
      ZW1out 
      ZW2SSTout 
      ZW3SSTout 
      FP2out 
      SLPout 
      SUPout 
      MZ2out 
      MA2out 
      Zaehler_BetrZeitVD1 
      Zaehler_BetrZeitImpVD1 
      Zaehler_BetrZeitVD2 
      Zaehler_BetrZeitImpVD2 
      Zaehler_BetrZeitZWE1 
      Zaehler_BetrZeitZWE2 
      Zaehler_BetrZeitZWE3 
      Zaehler_BetrZeitWP 
      Zaehler_BetrZeitHz 
      Zaehler_BetrZeitBW 
      Zaehler_BetrZeitKue 
      Time_WPein_akt 
      Time_ZWE1_akt 
      Time_ZWE2_akt 
      Timer_EinschVerz 
      Time_SSPAUS_akt 
      Time_SSPEIN_akt 
      Time_VDStd_akt 
      Time_HRM_akt 
      Time_HRW_akt 
      Time_LGS_akt 
      Time_SBW_akt 
      Code_WP_akt 
      BIV_Stufe_akt 
      WP_BZ_akt 
      SoftStand1 
      SoftStand2 
      SoftStand3 
      SoftStand4 
      SoftStand5 
      SoftStand6 
      SoftStand7 
      SoftStand8 
      SoftStand9 
      SoftStand10 
      AdresseIP_akt 
      SubNetMask_akt 
      Add_Broadcast 
      Add_StdGateway 
      ERROR_Time0 
      ERROR_Time1 
      ERROR_Time2 
      ERROR_Time3 
      ERROR_Time4 
      ERROR_Nr0 
      ERROR_Nr1 
      ERROR_Nr2 
      ERROR_Nr3 
      ERROR_Nr4 
      AnzahlFehlerInSpeicher 
      Switchoff_file_Nr0 
      Switchoff_file_Nr1 
      Switchoff_file_Nr2 
      Switchoff_file_Nr3 
      Switchoff_file_Nr4 
      Switchoff_file_Time0 
      Switchoff_file_Time1 
      Switchoff_file_Time2 
      Switchoff_file_Time3 
      Switchoff_file_Time4 
      Comfort_exists 
      HauptMenuStatus_Zeile1 
      HauptMenuStatus_Zeile2 
      HauptMenuStatus_Zeile3 
      HauptMenuStatus_Zeit 
      HauptMenuAHP_Stufe 
      HauptMenuAHP_Temp 
      HauptMenuAHP_Zeit 
      SH_BWW 
      SH_HZ 
      SH_MK1 
      SH_MK2 
      Einst_Kurzprogramm 
      StatusSlave_1 
      StatusSlave_2 
      StatusSlave_3 
      StatusSlave_4 
      StatusSlave_5 
      AktuelleTimeStamp 
      SH_MK3 
      Sollwert_TVL_MK3 
      Temperatur_TFB3 
      MZ3out 
      MA3out 
      FP3out 
      Time_AbtIn 
      Temperatur_RFV2 
      Temperatur_RFV3 
      SH_SW 
      Zaehler_BetrZeitSW 
      FreigabKuehl 
      AnalogIn 
      SonderZeichen 
      SH_ZIP 
      WebsrvProgrammWerteBeobarten 
      WMZ_Heizung 
      WMZ_Brauchwasser 
      WMZ_Schwimmbad 
      WMZ_Seit 
      WMZ_Durchfluss 
      AnalogOut1 
      AnalogOut2 
      Time_Heissgas);
      
      
      if ($fh) {
      # Wenn WPR-NET ein Antworttelegramm sendet, 
      # wird ab hier der entsprechende Status ausgelesen.
          
          # Quittung. Es sollte 3004 zurückkommen
          $fh->read($tmp,4);
          plugin_log($plugname,'FH received: ' . $tmp . ' Socket: ' . $socknum);
          $tmp = unpack("N*",$tmp);
          
          if($tmp == "3004"){    
            plugin_log($plugname,'check received: ' . $tmp . ' Socket: ' . $socknum); 
          
            # Status
            $fh->read($tmp,4);
            $tmp = unpack("N*",$tmp);    
            plugin_log($plugname,'status received: ' . $tmp . ' Socket: ' . $socknum);
          
            # Länge der nachfolgenden Werte
            $fh->read($anz,4);
            $anz = unpack("N*",$anz);    
            plugin_log($plugname,'length received: ' . $anz . ' Socket: ' . $socknum);
          
            # Alle Daten lesen
            for (my $i = 0; $i < $anz; $i++){
              $fh->read(@buff[$i],4);
              @daten_raw[$i] = unpack 'l>*', @buff[$i]; 
            }
          
            # Fertig mit lesen => Socket schliessen
            socketclose();
          
            # Los geht's mit der Verarbeitung
          
            # Gut zur Kontrolle... 
            for (my $i = 0; $i < $anz; $i++){
              plugin_log($plugname,@java_dataset[$i] . '[' . '$i' . ']: ' . @daten_raw[$i])
            }
          
            # Die Werte für die Diagramme
            #12 Sollwert_TRL_HZ
            update_rrd(@java_dataset[12],"",@daten_raw[12]*0.1);
            #plugin_log($plugname,@java_dataset[12] . '[' . '12' . ']: ' . (@daten_raw[12]*0.1));
          
            #13 Temperatur_TRL_ext
            update_rrd(@java_dataset[13],"",@daten_raw[13]*0.1);
            #plugin_log($plugname,@java_dataset[13] . '[' . '13' . ']: ' . (@daten_raw[13]*0.1));
          
            #15 Temperatur_TA
            update_rrd(@java_dataset[15],"",@daten_raw[15]*0.1);
            knx_write($ga_lwp_ta,@daten_raw[15]*0.1,9.001);
            #plugin_log($plugname,@java_dataset[15] . '[' . '15' . ']: ' . (@daten_raw[15]*0.1));
          
            #17 Temperatur_TBW
            update_rrd(@java_dataset[17],"",@daten_raw[17]*0.1);
          
            #19 Temperatur_TWE
            update_rrd(@java_dataset[19],"",@daten_raw[19]*0.1);
          
            #44 VD1out
            update_rrd(@java_dataset[44],"",@daten_raw[44]);
          
            plugin_log($plugname,'rrd data written & done!');
          
            return;
          } else {
              socketclose();
              return;
          }    
      } else {
          # normaler Aufruf des Plugins
          plugin_log($plugname,'started');
          # Socket öffnen und Sequenz zum Abruf der Daten schreiben
          
          # erstmal ggf. offenen Socket schliessen
          socketclose();
          
          # Socket öffnen
          $socket[$socknum] = IO::Socket::INET->new(
                      PeerAddr => $PeerAddr, 
                    PeerPort => $PeerPort, 
                    Proto => 'tcp', 
                    Timeout => 5, 
                    Blocking => 0)
          or return ("open of $PeerAddr : $PeerPort failed: $!");
          # add socket to select
          $socksel->add($socket[$socknum]); 
          # subscribe plugin
          $plugin_socket_subscribe{$socket[$socknum]} = $plugname; 
          plugin_log($plugname,"opened socket " . $socknum);
          
          # Sequenz zum Abruf der Daten schreiben
          # 3004 senden
          $msg = pack('N*',3004);
          syswrite($socket[$socknum], $msg);       
          plugin_log($plugname,'3004 gesendet. Socket: ' . $socknum);
          
          #0 senden
          $msg = pack('N*',0);
          syswrite($socket[$socknum], $msg);        
          plugin_log($plugname,'0 gesendet. Socket: ' . $socknum);
          
          plugin_log($plugname,'ini send');
          
          return;
      }
      
      sub socketclose() {
        if (defined $socket[$socknum]){
            if ($socket[$socknum]->opened){
                $socket[$socknum]->close();
            }
            $socksel->remove($socket[$socknum]);
            undef $socket[$socknum];
            plugin_log($plugname,"closed socket " . $socknum);
        }
      }
      Vg Tobi

      Kommentar


        #4
        Sorry, da muss ich leider passen... Dank sh.py muss ich mich zum Glück nicht mit Sockets rumschlagen
        Mit freundlichen Grüßen
        Niko Will

        Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
        - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

        Kommentar


          #5
          angepasst

          Nachdem ich im TCP-Dump gesehen hab, dass nach der Ini-Sequenz immer eine Antwort der Luxtronik kommt, hab ich im Skript mal verschiedene Funktionen zum Auslesen des Sockets getestet. Hier ist das Plugin, was jetzt bei mir wieder ganz gut läuft.

          Code:
          # This plugin reads the AlphaInnotec/Novelan heatpump controller Luxtronik
          # via Socket to get the real-time data
          #
          # based on http://sourceforge.net/projects/opendta/
          #
          # Author: asto (https://knx-user-forum.de/members/asto.html)
          # Version 0.1 alpha 25.07.2013
          # License: GPL (v2)
          
          # Eigenen Aufruf-Zyklus auf 5min setzen
          $plugin_info{$plugname.'_cycle'} = 300;
          
          # Socketeinstellungen
          my $socknum = 50123; # Eindeutige Nummer des Sockets
          my $PeerAddr = "192.168.x.x"; # IP Adresse WPR-NET
          my $PeerPort = "8888"; # Port WPR-NET
          
          my $ga_lwp_ta = "x/x/x"; # Gruppenadresse fuer Aussentemperatur DPT:9.001
          
          #######################################################
          # do not change anything below, all config stays above#
          #######################################################
          
          my $msg;
          my $tmp;
          my $anz;
          my @daten_raw;
          my @buff;
          my @java_dataset = qw(1 2 3 4 5 6 7 8 9 10 
          Temperatur_TVL 
          Temperatur_TRL 
          Sollwert_TRL_HZ 
          Temperatur_TRL_ext 
          Temperatur_THG 
          Temperatur_TA 
          Mitteltemperatur 
          Temperatur_TBW 
          Einst_BWS_akt 
          Temperatur_TWE 
          Temperatur_TWA 
          Temperatur_TFB1 
          Sollwert_TVL_MK 
          Temperatur_RFV 
          Temperatur_TFB2 
          Sollwert_TVL_MK2 
          Temperatur_TSK 
          Temperatur_TSS 
          Temperatur_TEE 
          ASDin 
          BWTin 
          EVUin 
          HDin 
          MOTin 
          NDin 
          PEXin 
          SWTin 
          AVout 
          BUPout 
          HUPout 
          MA1out 
          MZ1out 
          VENout 
          VBOout 
          VD1out 
          VD2out 
          ZIPout 
          ZUPout 
          ZW1out 
          ZW2SSTout 
          ZW3SSTout 
          FP2out 
          SLPout 
          SUPout 
          MZ2out 
          MA2out 
          Zaehler_BetrZeitVD1 
          Zaehler_BetrZeitImpVD1 
          Zaehler_BetrZeitVD2 
          Zaehler_BetrZeitImpVD2 
          Zaehler_BetrZeitZWE1 
          Zaehler_BetrZeitZWE2 
          Zaehler_BetrZeitZWE3 
          Zaehler_BetrZeitWP 
          Zaehler_BetrZeitHz 
          Zaehler_BetrZeitBW 
          Zaehler_BetrZeitKue 
          Time_WPein_akt 
          Time_ZWE1_akt 
          Time_ZWE2_akt 
          Timer_EinschVerz 
          Time_SSPAUS_akt 
          Time_SSPEIN_akt 
          Time_VDStd_akt 
          Time_HRM_akt 
          Time_HRW_akt 
          Time_LGS_akt 
          Time_SBW_akt 
          Code_WP_akt 
          BIV_Stufe_akt 
          WP_BZ_akt 
          SoftStand1 
          SoftStand2 
          SoftStand3 
          SoftStand4 
          SoftStand5 
          SoftStand6 
          SoftStand7 
          SoftStand8 
          SoftStand9 
          SoftStand10 
          AdresseIP_akt 
          SubNetMask_akt 
          Add_Broadcast 
          Add_StdGateway 
          ERROR_Time0 
          ERROR_Time1 
          ERROR_Time2 
          ERROR_Time3 
          ERROR_Time4 
          ERROR_Nr0 
          ERROR_Nr1 
          ERROR_Nr2 
          ERROR_Nr3 
          ERROR_Nr4 
          AnzahlFehlerInSpeicher 
          Switchoff_file_Nr0 
          Switchoff_file_Nr1 
          Switchoff_file_Nr2 
          Switchoff_file_Nr3 
          Switchoff_file_Nr4 
          Switchoff_file_Time0 
          Switchoff_file_Time1 
          Switchoff_file_Time2 
          Switchoff_file_Time3 
          Switchoff_file_Time4 
          Comfort_exists 
          HauptMenuStatus_Zeile1 
          HauptMenuStatus_Zeile2 
          HauptMenuStatus_Zeile3 
          HauptMenuStatus_Zeit 
          HauptMenuAHP_Stufe 
          HauptMenuAHP_Temp 
          HauptMenuAHP_Zeit 
          SH_BWW 
          SH_HZ 
          SH_MK1 
          SH_MK2 
          Einst_Kurzprogramm 
          StatusSlave_1 
          StatusSlave_2 
          StatusSlave_3 
          StatusSlave_4 
          StatusSlave_5 
          AktuelleTimeStamp 
          SH_MK3 
          Sollwert_TVL_MK3 
          Temperatur_TFB3 
          MZ3out 
          MA3out 
          FP3out 
          Time_AbtIn 
          Temperatur_RFV2 
          Temperatur_RFV3 
          SH_SW 
          Zaehler_BetrZeitSW 
          FreigabKuehl 
          AnalogIn 
          SonderZeichen 
          SH_ZIP 
          WebsrvProgrammWerteBeobarten 
          WMZ_Heizung 
          WMZ_Brauchwasser 
          WMZ_Schwimmbad 
          WMZ_Seit 
          WMZ_Durchfluss 
          AnalogOut1 
          AnalogOut2 
          Time_Heissgas);
          
          if ($fh) {
          # Wenn WPR-NET eine Antwort sendet...
              
              # sollte erstmal 3004 zurueckkommen
              sysread($socket[$socknum], $tmp,4);
              $tmp = unpack("N*",$tmp);
              if($tmp == "3004"){
                plugin_log($plugname,'check received: ' . $tmp . ' Socket: ' . $socknum);
              
                # Status
                sysread($socket[$socknum], $tmp,4);
                $tmp = unpack("N*",$tmp);    
                plugin_log($plugname,'status received: ' . $tmp . ' Socket: ' . $socknum);
              
                # Laenge der nachfolgenden Werte
                sysread($socket[$socknum], $anz,4);
                $anz = unpack("N*",$anz);    
                plugin_log($plugname,'length received: ' . $anz . ' Socket: ' . $socknum);
              
                # Alle Daten lesen uns Socket schliessen
                for (my $i = 0; $i < $anz; $i++){
                  sysread($socket[$socknum], @buff[$i],4);
                  @daten_raw[$i] = unpack 'l>*', @buff[$i]; 
                }  
                socketclose();
                
                # Gut zur Kontrolle... (alle Daten ausgeben)
                #for (my $i = 0; $i < $anz; $i++){
                #  plugin_log($plugname,@java_dataset[$i] . '[' . '$i' . ']: ' . @daten_raw[$i])
                #}
          
                # Los geht's mit der Verarbeitung
              
                # Die Werte fuer die Diagramme
                #12 Sollwert_TRL_HZ
                update_rrd(@java_dataset[12],"",@daten_raw[12]*0.1);
                #plugin_log($plugname,@java_dataset[12] . '[' . '12' . ']: ' . (@daten_raw[12]*0.1));
              
                #13 Temperatur_TRL_ext
                update_rrd(@java_dataset[13],"",@daten_raw[13]*0.1);
                #plugin_log($plugname,@java_dataset[13] . '[' . '13' . ']: ' . (@daten_raw[13]*0.1));
              
                #15 Temperatur_TA
                update_rrd(@java_dataset[15],"",@daten_raw[15]*0.1);
                knx_write($ga_lwp_ta,@daten_raw[15]*0.1,9.001);
                #plugin_log($plugname,@java_dataset[15] . '[' . '15' . ']: ' . (@daten_raw[15]*0.1));
              
                #17 Temperatur_TBW
                update_rrd(@java_dataset[17],"",@daten_raw[17]*0.1);
              
                #19 Temperatur_TWE
                update_rrd(@java_dataset[19],"",@daten_raw[19]*0.1);
              
                #44 VD1out
                update_rrd(@java_dataset[44],"",@daten_raw[44]);
              
                plugin_log($plugname,'rrd data written & done!');
              
                return;
              } else {
                  socketclose();
                  return;
              }    
          } else {
              # normaler zykl. Aufruf des Plugins
              # Socket oeffnen und Sequenz zum Abruf der Daten schreiben
              plugin_log($plugname,'started');
                  
              # erstmal ggf. offenen Socket schliessen
              socketclose();
              
              # Socket oeffnen
              $socket[$socknum] = IO::Socket::INET->new(
                          PeerAddr => $PeerAddr, 
                        PeerPort => $PeerPort, 
                        Proto => 'tcp', 
                        Timeout => 5, 
                        Blocking => 0)
              or return ("open of $PeerAddr : $PeerPort failed: $!");
              # add socket to select
              $socksel->add($socket[$socknum]); 
              # subscribe plugin
              $plugin_socket_subscribe{$socket[$socknum]} = $plugname; 
              plugin_log($plugname,"opened socket " . $socknum);
              
              # Sequenz zum Abruf der Daten schreiben
              # 3004 senden
              $msg = pack('N*',3004);
              syswrite($socket[$socknum], $msg);       
              plugin_log($plugname,'3004 gesendet. Socket: ' . $socknum);
              
              #0 senden
              $msg = pack('N*',0);
              syswrite($socket[$socknum], $msg);        
              plugin_log($plugname,'0 gesendet. Socket: ' . $socknum);
              
              plugin_log($plugname,'ini send');
              return;
          }
          
          sub socketclose() {
            if (defined $socket[$socknum]){
                if ($socket[$socknum]->opened){
                    $socket[$socknum]->close();
                }
                $socksel->remove($socket[$socknum]);
                plugin_log($plugname,"closed socket " . $socknum);
            }
          }
          Ich hab übrigens nur die Wärmepumpe.

          Gruß Tobi

          Kommentar

          Lädt...
          X