diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2017-10-22 11:53:32 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2017-10-22 11:53:32 +0200 |
commit | 11642271275c3998482e3dddf6de43a22eeb38ab (patch) | |
tree | c2cdda22be37c574e32e7afde123d000f9d1bf66 | |
parent | c7daaffc87fb71359cbb7d81cd09b2a7d1e3c8d5 (diff) | |
download | hue-11642271275c3998482e3dddf6de43a22eeb38ab.tar.gz |
elv: rename, mqtt
-rwxr-xr-x | elv-weather | 131 | ||||
-rwxr-xr-x | elv-wetter | 107 |
2 files changed, 131 insertions, 107 deletions
diff --git a/elv-weather b/elv-weather new file mode 100755 index 0000000..e710cb2 --- /dev/null +++ b/elv-weather @@ -0,0 +1,131 @@ +#!/usr/bin/perl +use warnings; +use strict; +use Device::SerialPort; +use Net::MQTT::Simple; +use POSIX; + +# config +my $delay = 1; +my $verbose = 1; +my @paths = ( + "unused", + "unused", + "unused", + + "temperature/elv/1", + "temperature/elv/2", + "temperature/elv/3", + "temperature/elv/4", + "temperature/elv/5", + "temperature/elv/6", + "temperature/elv/7", + "temperature/elv/8", + + "humidity/elv/1", + "humidity/elv/2", + "humidity/elv/3", + "humidity/elv/4", + "humidity/elv/5", + "humidity/elv/6", + "humidity/elv/7", + "humidity/elv/8", + + "temperature/elv/0", + "humidity/elv/0", + "wind/elv/0", + "rain/elv/0", + "is-raining/elv/0", + + "unused" + ); + +###################################################################### + +# vars +my $host = shift; +my $base = shift; +my $port = shift; +my ($elv,$mqtt,$line,@data,@prev,$updates); + +# handle args +my @devs = glob("/dev/serial/by-id/usb-*ELV_USB-WDE1*"); +$base = "sensors" unless defined($base); +$port = shift @devs unless defined($port); +if (!defined($host)) { + print "usage: $0 <mqtt-server> [ <topic-prefix> [ <serial-port> ] ]\n"; + print "default for topic-prefix: $base\n"; + print "default for serial-port : $port\n"; + exit 1; +} + +# init serial port +$elv = new Device::SerialPort($port, 1) or die "open serial port ($port): $!"; +$elv->baudrate(9600); +$elv->parity('none'); +$elv->databits(8); +$elv->stopbits(1); +$elv->write_settings(); + +# init mqtt +$mqtt = Net::MQTT::Simple->new($host) or die "mqtt init (server $host)"; + +# detect and init elv reader +$elv->write("?"); +sleep $delay; +$line = $elv->input; +die "ELV USB-WDE1 not detected on $port" unless $line =~ m/ELV USB-WDE1/; + +$elv->write("M2"); +sleep $delay; +$line = $elv->input; +die "switch to logview mode failed" unless $line =~ m/LogView/; + +$elv->write("RESET"); +sleep $delay; +$line = $elv->input; +die "reset failed (#1)" unless $line =~ m/OK/; + +$elv->write("?"); +sleep $delay; +$line = $elv->input; +die "reset failed (#2)" unless $line =~ m/ELV USB-WDE1/; + +print "init ok, waiting for data ...\n" if $verbose; + +# polling loop +while (1) { + + # read data + sleep $delay; + $line = $elv->input; + next if $line eq ""; + @data = split /;/, $line; + if (scalar(@data) != scalar(@paths)) { + sleep $delay; + $line .= $elv->input; + @data = split /;/, $line; + } + if (scalar(@data) != scalar(@paths)) { + printf "data error (%d != %d), fixup failed\n", scalar(@data), scalar(@paths); + next; + } + + # update mqtt + $updates = 0; + for my $i (0 .. (scalar(@paths) - 1)) { + next if $paths[$i] eq "unused"; + if (!defined($prev[$i]) || $data[$i] ne $prev[$i]) { + $updates++; + $mqtt->retain( "$base/$paths[$i]" => "$data[$i]"); + if ($verbose) { + if ($updates == 1) { + print strftime("\n[%H:%M:%S]\n", + localtime()); + } + printf " %s: %s\n", $paths[$i], $data[$i]; + } + } + } + @prev = @data; +} diff --git a/elv-wetter b/elv-wetter deleted file mode 100755 index ff07cde..0000000 --- a/elv-wetter +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/perl -use warnings; -use strict; -use Device::SerialPort; - -my @names = ( - "unused", - "unused", - "unused", - - "temp-1", - "temp-2", - "temp-3", - "temp-4", - "temp-5", - "temp-6", - "temp-7", - "temp-8", - - "hum-1", - "hum-2", - "hum-3", - "hum-4", - "hum-5", - "hum-6", - "hum-7", - "hum-8", - - "temp", - "hy", - "wind", - "rain", - "raining", - - "unused" - ); - -###################################################################### - -my $port = shift; -my $dest = shift; -my ($elv,$line,@data,$file); - -my $delay = 1; - -if (!defined($port)) { - print "usage: $0 <serial-port> [ <dest-dir> ]\n"; - exit 1; -} - -$elv = new Device::SerialPort($port, 1) or die; -$elv->baudrate(9600); -$elv->parity('none'); -$elv->databits(8); -$elv->stopbits(1); -$elv->write_settings(); - -$elv->write("?"); -sleep $delay; -$line = $elv->input; -die "ELV USB-WDE1 not detected on $port" unless $line =~ m/ELV USB-WDE1/; - -$elv->write("M2"); -sleep $delay; -$line = $elv->input; -die "switch to logview mode failed" unless $line =~ m/LogView/; - -$elv->write("RESET"); -sleep $delay; -$line = $elv->input; -die "reset failed (#1)" unless $line =~ m/OK/; - -$elv->write("?"); -sleep $delay; -$line = $elv->input; -die "reset failed (#2)" unless $line =~ m/ELV USB-WDE1/; - -print "init ok, waiting for data ...\n"; - -while (1) { - sleep $delay; - $line = $elv->input; - next if $line eq ""; - @data = split /;/, $line; - if (scalar(@data) != scalar(@names)) { - sleep $delay; - $line .= $elv->input; - @data = split /;/, $line; - } - if (scalar(@data) != scalar(@names)) { - printf "data error (%d != %d), fixup failed\n", scalar(@data), scalar(@names); - next; - } - print "--\n" unless defined ($dest); - for my $i (0 .. (scalar(@names) - 1)) { - next if $names[$i] eq "unused"; - next if $data[$i] eq ""; - if (defined($dest)) { - $file = $dest . "/" . $names[$i]; - open OUT, ">", "$file" or die "open $file: $!"; - print OUT $data[$i]; - close OUT; - } else { - printf "%s: %s\n", $names[$i], $data[$i]; - } - } -} |