use
Device::SerialPort;
use
Tie::CharArray;
use
Net::Twitter;
use
Data::Dumper;
use
POSIX
qw(strftime)
;
my
$port
=Device::SerialPort->new(
"/dev/ttyS0"
);
my
$STALL_DEFAULT
=60;
my
$timeout
=
$STALL_DEFAULT
;
my
$consumer_key
=
"your consumer key"
;
my
$consumer_secret
=
"your consumer secret"
;
my
$token
=
"your token"
;
my
$token_secret
=
"your token secret"
;
my
$xbee_basement
=
"0013a200400a1896"
;
$port
->read_char_time(0);
$port
->read_const_time(500);
my
$last_water
= 1;
sub
ProcessIO {
my
@packet
= @{(
shift
)};
my
$xbeeid
=
sprintf
(
"%02x%02x%02x%02x%02x%02x%02x%02x"
,
@packet
[4],
@packet
[5],
@packet
[6],
@packet
[7],
@packet
[8],
@packet
[9],
@packet
[10],
@packet
[11]);
printf
(
"DeviceID: %s\n"
,
$xbeeid
);
printf
(
"Net MyID: %02x%02x\n"
,
@packet
[12],
@packet
[13]);
printf
(
"PackType: %02x\n"
,
@packet
[14]);
my
$dio4
= (
@packet
[20] & 0x10) != 0;
if
((
@packet
[16] & 0x04) != 0) {
printf
(
"DIO10: %d\n"
, (
@packet
[19] & 0x04) != 0); }
if
((
@packet
[16] & 0x08) != 0) {
printf
(
"DIO11: %d\n"
, (
@packet
[19] & 0x08) != 0); }
if
((
@packet
[16] & 0x10) != 0) {
printf
(
"DIO12: %d\n"
, (
@packet
[19] & 0x10) != 0); }
if
((
@packet
[17] & 0x01) != 0) {
printf
(
"DIO0: %d\n"
, (
@packet
[20] & 0x01) != 0); }
if
((
@packet
[17] & 0x02) != 0) {
printf
(
"DIO1: %d\n"
, (
@packet
[20] & 0x02) != 0); }
if
((
@packet
[17] & 0x04) != 0) {
printf
(
"DIO2: %d\n"
, (
@packet
[20] & 0x04) != 0); }
if
((
@packet
[17] & 0x08) != 0) {
printf
(
"DIO3: %d\n"
, (
@packet
[20] & 0x08) != 0); }
if
((
@packet
[17] & 0x10) != 0) {
printf
(
"DIO4: %d\n"
,
$dio4
); }
if
((
@packet
[17] & 0x20) != 0) {
printf
(
"DIO5: %d\n"
, (
@packet
[20] & 0x20) != 0); }
if
((
@packet
[17] & 0x40) != 0) {
printf
(
"DIO6: %d\n"
, (
@packet
[20] & 0x40) != 0); }
if
((
@packet
[17] & 0x80) != 0) {
printf
(
"DIO7: %d\n"
, (
@packet
[20] & 0x80) != 0); }
$as
= 21;
if
((
@packet
[18] & 0x01) != 0) {
my
$val
=
@packet
[
$as
++] * 0x100 +
@packet
[
$as
++];
printf
(
"AD0: %4x\n"
,
$val
); }
if
((
@packet
[18] & 0x02) != 0) {
my
$val
=
@packet
[
$as
++] * 0x100 +
@packet
[
$as
++];
my
$cval
=
$val
* 100.0 / 0x3ff;
printf
(
"AD1: %4x %4.1fC %4.1fF\n"
,
$val
,
$cval
,
$cval
* 9 / 5 + 32); }
if
((
@packet
[18] & 0x04) != 0) {
my
$val
=
@packet
[
$as
++] * 0x100 +
@packet
[
$as
++];
printf
(
"AD2: %4x\n"
,
$val
); }
if
((
@packet
[18] & 0x08) != 0) {
my
$val
=
@packet
[
$as
++] * 0x100 +
@packet
[
$as
++];
printf
(
"AD3: %4x\n"
,
$val
); }
if
((
@packet
[18] & 0x80) != 0) {
my
$val
=
@packet
[
$as
++] * 0x100 +
@packet
[
$as
++];
printf
(
"VSS: %4x\n"
,
$val
); }
if
(
$xbeeid
eq
$xbee_basement
)
{
if
((
$dio4
== 0) && (
$last_water
== 1))
{
printf
(
"DETECTED WATER!!\n"
);
my
$nt
= Net::Twitter->new(
traits
=> [
qw/OAuth API::REST WrapError/
],
consumer_key
=>
$consumer_key
,
consumer_secret
=>
$consumer_secret
,
access_token
=>
$token
,
access_token_secret
=>
$token_secret
,
);
$now_string
= strftime
"%H:%M"
,
localtime
;
$tweet
=
sprintf
(
"At %s Basement sensor 4 detected water"
,
$now_string
);
my
$result
=
$nt
->update(
$tweet
);
}
$last_water
=
$dio4
;
}
}
my
@buffer
;
while
(
$timeout
>0)
{
my
(
$count
,
$saw
)=
$port
->
read
(255);
tie
my
@chars
,
'Tie::CharArray::Ord'
,
$saw
;
for
(
$i
= 0;
$i
<
$count
;
$i
++) {
push
(
@buffer
,
@chars
[
$i
]);
printf
(
"0x%02x "
,
@buffer
[
$i
]); }
if
(
$count
> 0) {
printf
(
"\n"
); }
if
(
scalar
(
@buffer
) == 0) {
next
; }
if
(
@buffer
[0] != 0x7e) {
printf
(
"Bad Frame\n"
);
shift
(
@buffer
);
next
;
}
$size
=
@buffer
[2] +
@buffer
[1] * 0x100;
printf
(
"Size: %d\n"
,
$size
);
if
(
$size
>
scalar
(
@buffer
) - 4) {
next
; }
$sum
= 0;
for
(
$i
= 0;
$i
<
$size
;
$i
++) {
$sum
+=
@buffer
[
$i
+ 3];
}
$sum
= 0xff -
$sum
% 0x100;
if
(
$sum
!=
@buffer
[
$size
+ 3]) {
printf
(
"Checksum: FAIL %02x != %02x\n"
,
$sum
,
@buffer
[
$size
+ 3]);
next
;
}
else
{
printf
(
"Checksum: PASS %02x\n"
,
$sum
);
}
my
@packet
;
for
(
$i
= 0;
$i
<
$size
+ 4 ;
$i
++) {
push
(
@packet
,
@buffer
[
$i
]);
}
printf
(
"Command: %02x\n"
,
@buffer
[3]);
if
(
@buffer
[3] == 0x92) {
ProcessIO(\
@packet
);
}
for
(
$i
= 0;
$i
<
$size
+ 4;
$i
++) {
shift
(
@buffer
);}
$timeout
=
$STALL_DEFAULT
;
}
if
(
$timeout
==0) {
die
"Waited $STALL_DEFAULT seconds and never saw what I wanted\n"
;
}