X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=serial.pl;h=12a2cbfa345e1481f2ad359bfa482c1b74416e29;hb=2db91eb214086fced01cfcf40c1563ac89101242;hp=6620593aaab4a8b55cb6d62f87ce7fba4c1ddef9;hpb=2476fe0adf62454dae2382444c2d8520326f8267;p=vaillant-thermostat diff --git a/serial.pl b/serial.pl index 6620593..12a2cbf 100755 --- a/serial.pl +++ b/serial.pl @@ -3,12 +3,19 @@ use warnings; use strict; use Device::SerialPort; use Data::Dump qw(dump); +use Time::HiRes qw(time); + +my $read_len = 255; + +my $path = shift @ARGV || '/dev/serial/by-path/platform-20980000.usb-usb-0:1.3.1:1.0-port0'; $|=1; -my $s = new Device::SerialPort( '/dev/ttyUSB0' ) || die $!; +connect_again: + +my $s = new Device::SerialPort( $path ) || die $!; $s->baudrate(2400); -$s->databits(8); +$s->databits(8); # 7 $s->parity('none'); $s->stopbits(1); $s->handshake('none'); @@ -17,13 +24,56 @@ $s->read_const_time(3); #$s->write('o'); +my $t = time(); + +my $sym; + +sub _mqtt_pub { + my ( $t, $m ) = @_; + my $cmd = "mosquitto_pub -h rpi2 -t '$t' -m '$m'"; + #warn "# _mqtt_pub [$t] = [$m]\n"; + #warn "## $cmd"; + system $cmd; +} + while (1) { - my ($len, $string) = $s->read(255); + my ($len, $string) = $s->read($read_len); + goto connect_again if ! defined $len; + my $ts = time(); if ( $len > 0 ) { my $hex = unpack('H*',$string); $hex =~ s/(..)/$1 /g; - printf "%s %2d %s\n", time(), $len, $hex; + + my $temp = `curl --silent localhost:3000/temp.txt`; + $temp =~ s/\s+/ /gs; + $temp =~ s/^\s+//; + + #printf "%s %2d %s\n", time(), $len, $hex; + printf "%8.4f %6.2f %2d %s | %s\n", $ts, $ts - $t, $len, $hex, $temp; + $t = time(); + + if ( $hex =~ m/^.+aa fc 39 aa (.+)/ ) { + my @l = split(/\s+/,$1); + my @d = ( + hex( $l[0] . $l[1] ), + hex( $l[3] . $l[4] ), + hex( $l[6] ), + hex( $l[12] ), + hex( $l[14] ), # * 300, + hex( $l[15] ), # * 400, + hex( $l[18] ), + ); + + _mqtt_pub "stat/boiler/" . chr(ord('a') + $_) => $d[$_] foreach 0 .. $#d; + } + + my @v = split(/\s+/, $temp, 3); + my @n = qw( DS18B20/temperature DHT22/temperature DHT22/humidity ); + foreach (@v) { + _mqtt_pub "stat/boiler/" . shift(@n) => $_; + } + } }