From 9d87c925a9eaa4fc256be3173c14a20d1469472d Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Wed, 9 Sep 2020 11:53:37 +0100 Subject: everything, mostly, working --- radiator-plc/mt300n-v2/.gitignore | 1 + radiator-plc/mt300n-v2/Makefile | 6 +++ radiator-plc/mt300n-v2/usr/bin/mqtt_if.pl | 76 ++++++++++++++++++++++++++++++ radiator-plc/mt300n-v2/usr/bin/run_mqtt_if | 6 +++ 4 files changed, 89 insertions(+) create mode 100644 radiator-plc/mt300n-v2/.gitignore create mode 100644 radiator-plc/mt300n-v2/Makefile create mode 100755 radiator-plc/mt300n-v2/usr/bin/mqtt_if.pl create mode 100755 radiator-plc/mt300n-v2/usr/bin/run_mqtt_if (limited to 'radiator-plc/mt300n-v2') diff --git a/radiator-plc/mt300n-v2/.gitignore b/radiator-plc/mt300n-v2/.gitignore new file mode 100644 index 0000000..859afb1 --- /dev/null +++ b/radiator-plc/mt300n-v2/.gitignore @@ -0,0 +1 @@ +stamp diff --git a/radiator-plc/mt300n-v2/Makefile b/radiator-plc/mt300n-v2/Makefile new file mode 100644 index 0000000..cdf9d24 --- /dev/null +++ b/radiator-plc/mt300n-v2/Makefile @@ -0,0 +1,6 @@ +STUFF=$(shell find usr \! -type d -print) + +stamp: ${STUFF} + tar cf - ${STUFF} | ssh radiator-plc0 "cd / && tar xvpf -" + #tar cf - ${STUFF} | ssh radiator-plc1 "cd / && tar xvpf -" + touch $@ diff --git a/radiator-plc/mt300n-v2/usr/bin/mqtt_if.pl b/radiator-plc/mt300n-v2/usr/bin/mqtt_if.pl new file mode 100755 index 0000000..f81b6e0 --- /dev/null +++ b/radiator-plc/mt300n-v2/usr/bin/mqtt_if.pl @@ -0,0 +1,76 @@ +#!/usr/bin/env perl + +use strict; + +use Device::SerialPort; +use Net::MQTT::Simple; + +sub chomp_harder($) { + my $ret = shift; + my $irs = $/; + $/ = "\n"; + chomp $ret; + $/ = "\r"; + chomp $ret; + $/ = $irs; + return $ret; +} + +sub get_line($$) { + my ( $port, $mqtt ) = @_; + + my $ret = ""; + + while (1) { + my ( $count, $byte ) = $port->read(1); + $mqtt->tick(); + + if ( $count > 0 ) { + $ret .= $byte; + return chomp_harder($ret) if $byte eq "\n"; + } + else { + $ret = chomp_harder($ret); + return $ret; + } + } +} + +my $plc_port = "/dev/ttyS1"; +my $plc = new Device::SerialPort($plc_port) || die "can't open $plc_port\n"; + +$plc->baudrate(38400); +$plc->parity("none"); +$plc->databits(8); +$plc->stopbits(1); +$plc->stty_icanon(0); + +$plc->read_char_time(0); +$plc->read_const_time(1000); + +my $mqtt = Net::MQTT::Simple->new("10.32.139.1"); + +sub mqtt_msg($$) { + my ( $topic, $message ) = @_; + + $plc->write("MQTT $topic $message\r\n"); +} + +$mqtt->subscribe( 'cmnd/+/var1', \&mqtt_msg ); +$mqtt->subscribe( 'cmnd/+/var2', \&mqtt_msg ); +$mqtt->subscribe( 'cmnd/+/var3', \&mqtt_msg ); + +while (1) { + my $line = get_line( $plc, $mqtt ); + next unless length($line) > 0; + + if ( $line =~ /MQTT\s+([^\s]+)\s+(.+)/ ) { + $mqtt->publish( $1, $2 ); + } + + if ( $line =~ /MQTTR\s+([^\s]+)\s+(.+)/ ) { + $mqtt->retain( $1, $2 ); + } + +} + diff --git a/radiator-plc/mt300n-v2/usr/bin/run_mqtt_if b/radiator-plc/mt300n-v2/usr/bin/run_mqtt_if new file mode 100755 index 0000000..2c06f6b --- /dev/null +++ b/radiator-plc/mt300n-v2/usr/bin/run_mqtt_if @@ -0,0 +1,6 @@ +#!/bin/sh + +while true; do + /usr/local/bin/mqtt_if.pl + sleep 1 +done -- cgit v1.2.3