aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2017-10-22 11:53:32 +0200
committerGerd Hoffmann <kraxel@redhat.com>2017-10-22 11:53:32 +0200
commit11642271275c3998482e3dddf6de43a22eeb38ab (patch)
treec2cdda22be37c574e32e7afde123d000f9d1bf66
parentc7daaffc87fb71359cbb7d81cd09b2a7d1e3c8d5 (diff)
downloadhue-11642271275c3998482e3dddf6de43a22eeb38ab.tar.gz
elv: rename, mqtt
-rwxr-xr-xelv-weather131
-rwxr-xr-xelv-wetter107
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];
- }
- }
-}