make curl --silent
[vaillant-thermostat] / serial.pl
index e72c99a..12a2cbf 100755 (executable)
--- 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;
-               print time(), " $len $hex\n";
+
+               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) => $_;
+               }
+
        }
 }