weiss jetzt gar nicht ob anhänge funktionieren

socket_vaillant

#!/usr/bin/perl

use IO::Socket;
#use strict;
use LWP::UserAgent;

#######################################################################
#useragent anlegen
my $ua = LWP::UserAgent->new;
$ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8)
Gecko/20051111 Firefox/1.5");
my $url = 
'http://mini.familie-berner.de:8083/fhem?cmd=set%20vaillant_therme%20';

#######################################################################
#socket anlegen
my $SOCK = new IO::Socket::INET (PeerAddr => '172.16.1.201', PeerPort
=> '7970', Proto => 'tcp');
die "Could not create socket: $!\n" unless $SOCK;

#######################################################################
#variablen deklarieren und parameter übernehmen
$| = 1;

my $checksum = 0;
my $sensorstat = 0;
my @send;
my $start="";
my $byte2="";
my $cmd="";
my $bytes="";
my $teiler=1;
my $ret=0;
my $count=0;
my $asend;

my $instrg = $ARGV[0];            #startsequenz
my $iinstrg = $ARGV[1];            #byte2
my $iiinstrg = $ARGV[2];        #befehl
my $iiiinstrg = $ARGV[3];        #erwartete antwort bytes
my $iiiiinstrg = $ARGV[4];        #teiler zum umrechnen des Ergebnisses
my $iiiiiinstrg = $ARGV[5];        #Bezeichnung

if (&is_integer($iiiiinstrg)) {
    $teiler = $iiiiinstrg;
 }

######################################################################
my $num_secs_to_timeout=5;       #timeout zum abbrechen wenn es hängt
my $PID = fork;
if ($PID > 0){
    eval{
        local $SIG{ALRM} = sub {kill 9, -$PID; die "TIMEOUT!"};
        alarm $num_secs_to_timeout;
        waitpid($PID, 0);
        alarm 0;
    };
}
elsif ($PID == 0){
    setpgrp(0,0);
    exec(&main);                #starte main programm
    exit(0);
}

#######################################################################
sub main         {

    if (($instrg) and ($iinstrg) and ($iiinstrg) and ($iiiinstrg)) {
         $start = hex($instrg);
         $byte2 = hex($iinstrg);
         $cmd = hex($iiinstrg);
         $bytes = hex($iiiinstrg);
     }
    if ((!($instrg)) and ($cmd eq"")) {
       exit 2;
     }

    my $crc = sprintf("%x", &checksum(pack('C*', $start, $byte2, 0x00,
0x00, $cmd, $bytes)));
    #print "$cmd $bytes $crc\n";   #befehl, bytes, crc ausgeben

    while (1) {
    ##############################################################
    my $antwort = "";
    my $antwort1 = "";
    my $antwort2 = "";
    my $char="";
    my $icount=0;

    my $senda = pack ("C*", $start);
    my $sendb = pack ("C*", $byte2);
    my $sendc = pack ("C*", "0");
    my $sendd = pack ("C*", "0");
    my $sende = pack ("C*", $cmd);
    my $sendf = pack ("C*", $bytes);
    my $sendg = pack ("C*", hex($crc));

    $asend = "$senda$sendb$sendc$sendd$sende$sendf$sendg";

    print $SOCK "$asend";                    #sende String

    my $gesendet =unpack('H*',$asend);         #mach mal den Befehl lesbar_
    #print "TX: $gesendet\n";                   #und gib den Befehl aus

    if ($cmd==0){                            #beenden wenn Eingabe fehlerhaft
        #sleep(1);
        last;
        };
    
###############################################################################
    $SOCK->recv($char,48);                #hole Daten
    my $empfangen = unpack('H*',$char);        #mach mal die rohdaten lesbar_
    #print "RX: $empfangen\n";                  #und gib die Antwort aus
    
###############################################################################
    if (length($char)==($bytes+3)) {        #nachrichten auswerten
         if ($bytes==1) {
            $antwort = unpack('H*',substr($char,2,$bytes));
            if (($antwort eq "f0") || ($antwort eq "00")) {
               $antwort = "off";
               }
            elsif (($antwort eq "0f") || ($antwort eq "01")) {
               $antwort = "on";
               }
            else {
               $antwort = (hex($antwort)/$teiler);
               }
             };
        if ($bytes==2) {
             $antwort = unpack('H*',substr($char,2,$bytes));
             if (unpack('H*',substr($char,2,1)) eq "ff") {
               $antwort = hex(unpack('H*',substr($char,3,1)))/-$teiler;
               }
             else {
               $antwort = hex(unpack('H*',substr($char,2,2)))/$teiler;
               }
             };
        if ($bytes==3) {
           if (&sensorstat($char,$bytes) eq "00") {    #prüfe sensortstaus
             if (unpack('H*',substr($char,2,1)) eq "ff") {
               $antwort = hex(unpack('H*',substr($char,3,1)))/-$teiler;
               }
             else {
               $antwort = hex(unpack('H*',substr($char,2,2)))/$teiler;
               }
            }
            elsif (&sensorstat($char,$bytes) eq "aa") {
                $antwort = "Leiterbruch"
            }
            elsif (&sensorstat($char,$bytes) eq "55") {
                $antwort = "Kurzschluss"
            }
            else {
                $antwort = "sonstiger Fehler"
            }
           }
        if ($bytes==4) {
             $antwort = unpack('H*',substr($char,2,$bytes));
             if (unpack('H*',substr($char,2,1)) eq "ff") {
               $antwort = hex(unpack('H*',substr($char,3,1)))/-$teiler;
               }
             else {
               $antwort = hex(unpack('H*',substr($char,2,2)))/$teiler;
               }
             };
        if ($bytes==5) {
           if (&sensorstat($char,$bytes) eq "00") {    #prüfe sensortstaus
             if (unpack('H*',substr($char,2,1)) eq "ff") {
 #erster analogwert
               $antwort1 = hex(unpack('H*',substr($char,3,1)))/-$teiler;
               }
             else {
               $antwort1 = hex(unpack('H*',substr($char,2,2)))/$teiler;
               }
             if (unpack('H*',substr($char,4,1)) eq "ff") {
 #zweiter analogwert
               $antwort2 = hex(unpack('H*',substr($char,5,1)))/-$teiler;
               }
             else {
               $antwort2 = hex(unpack('H*',substr($char,4,2)))/$teiler;
               }
             $antwort = $antwort1." ".$antwort2
            }
            elsif (&sensorstat($char,$bytes) eq "aa") {
                $antwort = "Leiterbruch"
            }
            elsif (&sensorstat($char,$bytes) eq "55") {
                $antwort = "Kurzschluss"
            }
            else {
                $antwort = "sonstiger Fehler"
            }
          }
        }
    
###############################################################################
    if (length($char)==3) {                    #fehlermeldungen lesen
            if ($empfangen eq "030305") {
                $antwort = "Nicht unterstuetzt, nicht vorhanden?";
                }
            elsif ($empfangen eq "030107"){
                $antwort = "Checksummenfehler?";
                }
            elsif ($empfangen eq "030006"){
                $antwort = "Bestaetigung Parameteraenderung";
                }
            else {
                $antwort = "andere Antwort";
            }
        }
    
###############################################################################
    if ($antwort) {                            #ergebnis ausgeben
         #print "TX: $gesendet\n";              #und gib den Befehl aus
         #print "RX: $empfangen\n";             #und gib die Antwort aus
            #if ((($ret) eq ($antwort)) or (($count)>10)) {
            if ($iiiiiinstrg){
                print "$iiiiiinstrg: $antwort\n";          #das
übersetzte Ergebnis ausgeben
            }
            else {
                print "$iiinstrg / $iiiinstrg: $antwort\n"
            }
         my $req = HTTP::Request->new(GET => "$url"."$iiiiiinstrg:%20$antwort");
            $req->header('Accept' => 'text/html');
         my $res = $ua->request($req);
         last;
        }
    $count++;
    }
    close($SOCK);
    select(undef,undef,undef, .5); #100 millisecond delay
    
###############################################################################

}
###################################################################################
sub is_integer     {                                #prüfe auf integer eingabe

   defined $_[0] && $_[0] =~ /^[+-]?\d+$/;
}
###################################################################################
sub sensorstat    {

    my $schar = $_[0];
    my $sbytes = $_[1];

    $sensorstat = unpack('H*',substr($schar,1+$sbytes,1));
    return $sensorstat;
    }
###############################################################
sub checksum    {

  my $string = $_[0];

  for (my $i = 0; $i < length($string); $i++)
   {
    if ($checksum & 0x80) {
       $checksum = ($checksum << 1 | 1) & 0xFF;
       $checksum = $checksum ^ 0x18;
       }
    else
       {
       $checksum = $checksum << 1;
       };
    $checksum = $checksum ^ ord(substr($string, $i, 1));
    }
  return $checksum;
  }
################################################################



und dazu ein Shell script

#!/bin/bash

#alten mist abwürgen wenn nötig
#kill `ps -ax | grep socket_vaillant | grep -v grep | awk '{print $1;}'`;

#Aufbau der Abfragen
#pfad    start    byte2    befehl    bytes    teiler    Bezeichner
#initialisieren
#/usr/local/bin/socket_vaillant    07    0A    00    04    1

#Mitschnitt
/usr/local/bin/socket_vaillant    07    00    44    01    1
interne_Heizungspumpe
/usr/local/bin/socket_vaillant    07    00    05    01    1    Flammensignal
/usr/local/bin/socket_vaillant    07    00    39    02    16    Vorlaufsollwert
/usr/local/bin/socket_vaillant    07    00    18    03    16
Vorlauftemperatur
/usr/local/bin/socket_vaillant    07    00    04    02    16    Speichersollwert
/usr/local/bin/socket_vaillant    07    00    17    03    16
Speichertemperatur

#Einstelldaten
#/usr/local/bin/socket_vaillant    07    00    64    01    1
Wasserpumpennachlaufzeit_bei_Heizbetrieb
#/usr/local/bin/socket_vaillant    07    00    E1    01    1
max._Speichersolleinstellung
#/usr/local/bin/socket_vaillant    07    00    65    01    1
Korrekturwert_Aussentemperatur
#/usr/local/bin/socket_vaillant    07    00    66    01    1
max._Speicherladezeit
#/usr/local/bin/socket_vaillant    07    00    A6    01    1
max._Vorlauftemperatur_Speicherladebetrieb
#/usr/local/bin/socket_vaillant    07    00    AC    02    1
Sunden_bis_Wartung
#/usr/local/bin/socket_vaillant    07    00    C2    01    16
min._Vorlaufsollwert
#/usr/local/bin/socket_vaillant    07    00    C3    01    16
Einschalthysterese
#/usr/local/bin/socket_vaillant    07    00    C4    01    16
Ausschalthysterese

/usr/local/bin/socket_vaillant    07    00    6A    03    16    Aussentemperatur

#Reglerdaten Einstellungen
#/usr/local/bin/socket_vaillant    07    08    12    04    100    Heizkurve
#/usr/local/bin/socket_vaillant    07    0A    6B    04    16
Raumsolltemperatur
#/usr/local/bin/socket_vaillant    07    08    1D    04    16
Absenktemperatur

exit


Am 29. Januar 2013 10:00 schrieb Matthias Berner
<matthiasber...@familie-berner.de>:
> Hallo
>
> anbei meine scripte zum Zugriff auf die X6 Schnittstelle meiner
> Vaillant Atmovit, vielleicht kommt mal jemand in die Verlegenheit dass
> zu benötigen.
>
> die Sequenzen seiner Therme sollte jeder selber mal mit VRdiag und
> einem Serialmonitor mitschneiden, die angefordereten Werte lassen sich
> dabei wunderbar auf die Werte der jeweiligen vrdiag seite eingrenzen.
> hab dadurch auch andere Werte für meine Heizung gefunden, als bereits
> im netzt zu finden sind.
>
> fehlt nur noch daraus ein Modul für Fhem zu basteln
>
> Hoffe damit einen Beitrag geleistet und auch weitergeholfen zu haben.
>
> Matthias

_______________________________________________
Ethersex-devel mailing list
Ethersex-devel@list.zerties.org
https://list.zerties.org/cgi-bin/mailman/listinfo/ethersex-devel

Reply via email to