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