Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use ElkM1::Control;
- use Switch;
- use strict;
- # to trap ctrl-c and exit gracefully closing the connection to elk
- $SIG{'INT'} = 'cleanup';
- $SIG{'TERM'} = 'cleanup';
- $SIG{'KILL'} = 'cleanup';
- my %elkcodes = (
- AS => { name => 'Arming Status Report Data' },
- AP => { name => 'ASCII String To IP Address' },
- AR => { name => 'Ethernet Central Station - Alarm Reporting' },
- AT => { name => 'Ethernet Central Station - Alarm Reporting Test' },
- XK => { name => 'Ethernet Central Station - Ethernet Module Test' },
- AZ => { name => 'Alarm By Zone Report Data' },
- CA => { name => 'Touchscreen Audio Data' },
- CC => { name => 'Output Change Update' },
- CD => { name => 'Outgoing Audio Command' },
- CS => { name => 'Control Output Status Report Data' },
- CR => { name => 'Custom Value Data' },
- CU => { name => 'Change User Code' },
- CV => { name => 'Counter Value Format Data' },
- DS => { name => 'Lighting Device Status Data' },
- EE => { name => 'Entry/Exit Data' },
- EM => { name => 'Email Trigger Data' },
- IC => { name => 'Valid or Invalid User Code Format' },
- IE => { name => 'Installer Mode Exited' },
- SD => { name => 'Insteon Lighting - ASCII String Text Descriptions' },
- IR => { name => 'Insteon Lighting - Read Insteon Lighting Device Data' },
- IP => { name => 'Insteon Lighting - Programming of Insteon Device Data' },
- KA => { name => 'Keypad Areas Data' },
- KF => { name => 'Keypad Function Key Press' },
- LW => { name => 'Zone/Keypad Temperature Data' },
- PC => { name => 'PLC - Power Line Carrier - Change Update Data' },
- PS => { name => 'PLC - Power Line Carrier - Status Data' },
- RE => { name => 'Reset Ethernet IP Address' },
- RP => { name => 'ElkRP Connected' },
- RR => { name => 'Real Time Clock Data' },
- SD => { name => 'ASCII String Text Descriptions Data' },
- SS => { name => 'System Trouble Status' },
- ST => { name => 'Requested Temperature Data' },
- TC => { name => 'Task Change Update' },
- TR => { name => 'Thermostat Control - Thermostat Data' },
- T2 => { name => 'M1 to PC with Omnistat 2 ASCII Hex Data' },
- VN => { name => 'M1 Version Number Data' },
- UA => { name => 'Valid User Code Areas Data' },
- ZC => { name => 'Zone Change Update' },
- ZB => { name => 'Zone Status - Bypassed Zone State' },
- ZP => { name => 'Zone Status - Zone Partition Report' },
- ZS => { name => 'Zone Status - Zone Status Report' },
- ZD => { name => 'Zone Definition Data' },
- ZV => { name => 'Zone Analog Voltage Data' },
- );
- my %zonelist = (
- 1 => { name => 'Den Back Door' },
- 2 => { name => 'Den Bath Window' },
- 3 => { name => 'Kitchen Door Win' },
- 4 => { name => 'DenGar Front Win' },
- 5 => { name => 'Kitchen Glass' },
- 6 => { name => 'Front Door' },
- 7 => { name => 'Garage Doors Win' },
- 8 => { name => 'Outside Wires' },
- 9 => { name => 'Zone 009' },
- 10 => { name => 'Crawl Space Temp' },
- 11 => { name => 'Den Glass' },
- 12 => { name => 'Living Rm Motion' },
- 13 => { name => 'Water Kitchen' },
- 14 => { name => 'Water Basement' },
- 15 => { name => 'Attic Temp' },
- 16 => { name => 'Fire Alarm' }
- );
- my %keypads = (
- 1 => { name => 'Upstairs Hall Keypad' },
- 2 => { name => 'Den Keypad' }
- );
- my %areas = (
- 1 => { name => 'Klemens Home' }
- );
- my $elk = ElkM1::Control->new(host => '192.168.1.22', port => 2101, 'debug' => 0);
- my $msg;
- while (1) { # Loop forever
- $msg = $elk->readMessage(); # Read the M1's messages
- if(!defined($msg)) {
- sleep 1;
- } else {
- my ($sec, $min, $hour, $mday, $mon, $year) = localtime;
- my $time = sprintf '%d-%02d-%02d %02d:%02d:%02d', 1900+$year, 1+$mon, $mday, $hour, $min, $sec;
- open (my $fh, '>>', '/tmp/elklog.log');
- switch(ref($msg)) {
- case 'ElkM1::Control::Message::EthernetModuleTest' {
- my $eth_hour = $msg->getHour;
- my $eth_min = $msg->getMinutes;
- my $eth_sec = $msg->getSeconds;
- print $fh "$time - ETHERNET TEST - $eth_hour:$eth_min:$eth_sec\n"; # Ethernet Test
- }
- case 'ElkM1::Control::Message::ZoneChangeUpdateReport' {
- my $zonenumber = $msg->getZone;
- my $zonename = $zonelist{$zonenumber}{'name'};
- my $zonestate = $msg->getState;
- my $zone_status = ($msg->isOpen) ? 'open' : 'closed';
- print $fh "$time - ZONE CHANGE - $zonename - ZONE $zonenumber IS NOW $zonestate\n"; # Print zone change
- }
- case 'ElkM1::Control::Message::TemperatureReply' {
- my $groupname = $msg->getGroupName;
- my $groupnumber = $msg->getGroup;
- my $groupdevice = $msg->getDevice;
- my $temperature = $msg->getTemperature;
- my $fixedgroupname = "";
- if ($groupname eq "keypad") {
- $fixedgroupname = $keypads{$groupdevice}{'name'};
- } else {
- $fixedgroupname = $zonelist{$groupdevice}{'name'};
- }
- print $fh "$time - TEMPERATURE DATA - $fixedgroupname : $temperature F\n"; # Print temp data
- }
- case 'ElkM1::Control::Message::ArmingStatusReport' {
- my $area_number = 1;
- my $area_name = $areas{$area_number}{'name'};
- my $area_status = $msg->getArmedStatusName($area_number);
- my $area_alarm = $msg->getAlarmStatusName($area_number);
- print $fh "$time - ARMING STATUS - AREA $area_name - $area_number IS $area_status - $area_alarm\n"; # Print everything else
- }
- case 'ElkM1::Control::Message::KeypadKeyChangeUpdate' {
- my $keypress = $msg->getKeyName;
- my $keypad = $keypads{$msg->getKeypadNumber}{'name'};
- print $fh "$time - KEYPAD PRESS - KEYPAD:$keypad - KEY:$keypress\n"; # Print keypand press
- }
- case 'ElkM1::Control::Message::ThermostatDataReply' {
- my $thermo = $msg->toString;
- print $fh "$time - THERMOSTAT DATA - $thermo\n"; # Print thermostat data
- }
- case 'ElkM1::Control::Message' {
- my $elkmessage = $msg->message;
- my $elkmsgcode = substr $elkmessage, 2, 2;
- my $elkmsgtype = $elkcodes{$elkmsgcode}{'name'};
- print $fh "$time - ELK MESSAGE - $elkmsgtype - $elkmessage\n"; # Print message
- }
- else {
- print $fh "$time - UNKNOWN DATA - $msg\n"; # Print everything else
- }
- }
- close $fh;
- }
- }
- $elk->disconnect;
- exit;
- sub cleanup {
- $elk->disconnect;
- die 'stopped';
- exit;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement