RMSv1 Relay Control Perl Script



#!/usr/bin/perl
##############################################################################################################
#                                                                                                            #
# Remote Monitoring System - (C)2001 - 2008 RemoteMonitoringSystems                                          #
# Relay Control Perl Script version 1.0                                                                      #
#                                                                                #
#                                                                                                            #
# Copy this text and save it to a file called rmsrelay.pl                                                    #
#                                                                                                            #
# Make sure this file is executable! (chmod 755 rmsrelay.pl)                                                 #
#                                                                                                            #
# Usage: rmsrelay.pl [ip] [password] [relay number] [action] [delay]                                         #
#                                                                                                            #
# [ip] RMSv1 IP Address                                                                                      #
# [password] Password is limited to 10 characters                                                            #
# [relay number] 1, 2, or 3                                                                                  #
# [action] ON or OFF; also determines toggle direction if [delay] is greater than 0                          #
# [delay] 0 = No Toggle. Greater than 0 = toggle [delay] amount of seconds                                   #
#                                                                                                            #
##############################################################################################################

use IO::Socket;
use IO::Select;
use constant MAX_MSG_LEN  => 505;

#########################################################
###              EDIT AT YOUR OWN RISK !!!              #
#########################################################

$ip = shift;
$mypasswd = shift;
$relay_number = shift;
$relay_action = shift;
$relay_delay = shift;

if ($ip eq "") {print "\n\n\nPlease specify the ip address\n\n";&useage;exit;}
$iplen = length($ip);
if ($iplen > 15){print "\n\n\n\nIP address too long !\n\n";&useage;exit;}
if ($mypasswd eq "") {print "\n\n\nPlease specify the password\n\n";&useage;exit;}
$pass = length($mypasswd);
if ($pass > 10){print "\n\n\n\nPassword too long !\n\n";&useage;exit;}
if ($relay_number eq "") {print "\n\n\n\nPlease specify the relay number '1', '2' or '3'\n\n";&useage;exit;}
$rn=sprintf("%d",$relay_number);
if ($rn > 3){print "n\n\nPlease specify a proper relay number '1', '2' or '3'\n\n";&useage;exit;}
if ($relay_action eq "") {print "\n\n\nPlease specify the Relay action: 'ON' or 'OFF'\n\n";&useage;exit;}
$relay_action = uc($relay_action);
if ($relay_delay eq "") {print "\n\n\nPlease specify the Toggle Delay time in seconds\n\n";&useage;exit;}
$rd=sprintf("%d",$relay_delay);

# Relay ON or OFF

if (($relay_number eq "1") && ($relay_action eq "ON") && ($rd ==0))
	{
		$bcommand = "&^BND20012$mypasswd*****************************************************";
		&do_Relay;
		exit;
	}

if (($relay_number eq "1") && ($relay_action eq "OFF") && ($rd ==0))
	{
		$bcommand = "&^BND20013$mypasswd*****************************************************";
		&do_Relay;
		exit;
	}

if (($relay_number eq "2") && ($relay_action eq "ON") && ($rd ==0))
	{
		$bcommand = "&^BND20015$mypasswd*****************************************************";
		&do_Relay;
		exit;
	}

if (($relay_number eq "2") && ($relay_action eq "OFF") && ($rd ==0))
	{
		$bcommand = "&^BND20016$mypasswd*****************************************************";
		&do_Relay;
		exit;
	}

if (($relay_number eq "3") && ($relay_action eq "ON") && ($rd ==0))
	{
		$bcommand = "&^BND20018$mypasswd*****************************************************";
		&do_Relay;
		exit;
	}

if (($relay_number eq "3") && ($relay_action eq "OFF") && ($rd ==0))
	{
		$bcommand = "&^BND20019$mypasswd*****************************************************";
		&do_Relay;
		exit;
	}

# Relay Toggle OFF then ON with delay

if (($relay_number eq "1") && ($relay_action eq "OFF") && ($rd != 0))
	{
		$bcommand = "&^BND20013$mypasswd*****************************************************";
		&do_Relay;
		sleep $rd;
		$bcommand = "&^BND20012$mypasswd*****************************************************";
		&do_Relay;
		exit;
	}

if (($relay_number eq "2") && ($relay_action eq "OFF") && ($rd != 0))
	{
		$bcommand = "&^BND20016$mypasswd*****************************************************";
		&do_Relay;
		sleep $rd;
		$bcommand = "&^BND20015$mypasswd*****************************************************";
		&do_Relay;
		exit;
	}
	
if (($relay_number eq "3") && ($relay_action eq "OFF") && ($rd != 0))
	{
		$bcommand = "&^BND20019$mypasswd*****************************************************";
		&do_Relay;
		sleep $rd;
		$bcommand = "&^BND20018$mypasswd*****************************************************";
		&do_Relay;
		exit;
	}	
	
# Relay Toggle ON then OFF with delay

if (($relay_number eq "1") && ($relay_action eq "ON") && ($rd != 0))
	{
		$bcommand = "&^BND20012$mypasswd*****************************************************";
		&do_Relay;
		sleep $rd;
		$bcommand = "&^BND20013$mypasswd*****************************************************";
		&do_Relay;
		exit;
	}

if (($relay_number eq "2") && ($relay_action eq "ON") && ($rd != 0))
	{
		$bcommand = "&^BND20015$mypasswd*****************************************************";
		&do_Relay;
		sleep $rd;
		$bcommand = "&^BND20016$mypasswd*****************************************************";
		&do_Relay;
		exit;
	}
	
if (($relay_number eq "3") && ($relay_action eq "ON") && ($rd != 0))
	{
		$bcommand = "&^BND20018$mypasswd*****************************************************";
		&do_Relay;
		sleep $rd;
		$bcommand = "&^BND20019$mypasswd*****************************************************";
		&do_Relay;
		exit;
	}	

############################################################################
## Subroutines #############################################################
############################################################################

sub useage
	{
		print"********************************************************************\n";
		print"*                        Usage                                     *\n";
		print"*                                                                  *\n";
		print"* rmsrelay.pl [IP] [PASSWORD] [RELAYNUMBER] [ACTION] [TOGGLEDELAY] *\n";
		print"*                                                                  *\n";
		print"* [IP] RMSv1 ip address                                            *\n";
		print"*                                                                  *\n";
		print"* [PASSWORD] up to 10 characters only                              *\n";
		print"*                                                                  *\n";
		print"* [RELAYNUMBER] can be 1, 2, or 3                                  *\n";
		print"*                                                                  *\n";
		print"* [ACTION] can be either ON or OFF                                 *\n";
		print"*                                                                  *\n";
		print"* If [TOGGLEDELAY] > 0 then Relay toggles with delay.              *\n"; 	
		print"*                                                                  *\n";
		print"********************************************************************\n";	
	}

############################################################################

sub do_Relay
	{
		&send_udp_packet;
		##### Try up to 5 more times to get the info if no response.
		if (length($msg_in) < 5) { &send_udp_packet; }
		if (length($msg_in) < 5) { &send_udp_packet; }
		if (length($msg_in) < 5) { &send_udp_packet; }
		if (length($msg_in) < 5) { &send_udp_packet; }
		if (length($msg_in) < 5) { &send_udp_packet; }
		if (length($msg_in) < 5) { die "Could not retrieve info!!"; }
	}

############################################################################

sub send_udp_packet 
	{
		$sock = IO::Socket::INET->new(Proto=>'udp',PeerAddr=>"$ip:7",Timeout => "3")  or die $@;
		$sel = IO::Select->new;
		$sel->add($sock);
		$sock->send($bcommand) or die "send() failed: $!";
		sleep 1;
		while ($sel->can_read(0)) { $sock->recv($msg_in,MAX_MSG_LEN) or die "recv() failed: $!"; }

		$CorrectPassword = ord(substr($msg_in,10,1));
		if ($CorrectPassword ne "0")
			{
				print "Bad Password\n";
				exit;	
			}	
		$sock->close;
	}