mirror of
https://github.com/brmlab/brmdoor.git
synced 2025-06-09 12:14:02 +02:00
Track dooropen ajar/shut state using a magnetic sensor, log verbosely for now
This commit is contained in:
parent
8a9949e15f
commit
f5e762c8da
2 changed files with 43 additions and 5 deletions
42
brmd/brmd.pl
42
brmd/brmd.pl
|
@ -12,7 +12,8 @@ our $channel = "#brmlab";
|
||||||
our $streamurl = "http://brmlab.cz/stream";
|
our $streamurl = "http://brmlab.cz/stream";
|
||||||
our $devdoor = $ARGV[0]; $devdoor ||= "/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A700e1qB-if00-port0";
|
our $devdoor = $ARGV[0]; $devdoor ||= "/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A700e1qB-if00-port0";
|
||||||
our $devasign = $ARGV[1]; $devasign ||= "/dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0";
|
our $devasign = $ARGV[1]; $devasign ||= "/dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0";
|
||||||
our ($status, $streaming, $topic) = (0, 0, 'BRMLAB OPEN');
|
our ($status, $streaming, $dooropen, $topic) = (0, 0, 0, 'BRMLAB OPEN');
|
||||||
|
our $lastunlock = 0;
|
||||||
|
|
||||||
my $irc = brmd::IRC->new();
|
my $irc = brmd::IRC->new();
|
||||||
my $web = brmd::WWW->new();
|
my $web = brmd::WWW->new();
|
||||||
|
@ -25,7 +26,7 @@ my $alphasign = brmd::Alphasign->new();
|
||||||
POE::Session->create(
|
POE::Session->create(
|
||||||
package_states => [
|
package_states => [
|
||||||
main => [ qw(_default _start
|
main => [ qw(_default _start
|
||||||
status_update streaming_update
|
status_update streaming_update dooropen_update
|
||||||
notify_door_unlocked notify_door_unauth) ],
|
notify_door_unlocked notify_door_unauth) ],
|
||||||
],
|
],
|
||||||
heap => { irc => $irc, web => $web, door => $door, stream => $stream, log => $log, alphasign => $alphasign },
|
heap => { irc => $irc, web => $web, door => $door, stream => $stream, log => $log, alphasign => $alphasign },
|
||||||
|
@ -58,6 +59,10 @@ sub status_str {
|
||||||
$status ? 'OPEN' : 'CLOSED';
|
$status ? 'OPEN' : 'CLOSED';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub dooropen_str {
|
||||||
|
$dooropen ? 'AJAR' : 'SHUT';
|
||||||
|
}
|
||||||
|
|
||||||
sub streaming_str {
|
sub streaming_str {
|
||||||
$streaming ? 'ON AIR' : 'OFF AIR';
|
$streaming ? 'ON AIR' : 'OFF AIR';
|
||||||
}
|
}
|
||||||
|
@ -87,11 +92,20 @@ sub streaming_update {
|
||||||
$poe_kernel->post( $irc, 'notify_update', 'brmvideo', $st, $streaming ? $streamurl : undef );
|
$poe_kernel->post( $irc, 'notify_update', 'brmvideo', $st, $streaming ? $streamurl : undef );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub dooropen_update {
|
||||||
|
my ($self, $newdooropen) = @_[OBJECT, ARG0];
|
||||||
|
$dooropen = $newdooropen;
|
||||||
|
my $st = dooropen_str();
|
||||||
|
$poe_kernel->post( $irc, 'notify_door_open', $st );
|
||||||
|
}
|
||||||
|
|
||||||
sub notify_door_unlocked {
|
sub notify_door_unlocked {
|
||||||
my ($self, $nick) = @_[OBJECT, ARG0];
|
my ($self, $nick) = @_[OBJECT, ARG0];
|
||||||
|
|
||||||
$poe_kernel->post($irc, 'notify_door_unlocked');
|
$poe_kernel->post($irc, 'notify_door_unlocked');
|
||||||
$poe_kernel->post($log, 'notify_door_unlocked', $nick);
|
$poe_kernel->post($log, 'notify_door_unlocked', $nick);
|
||||||
|
|
||||||
|
$lastunlock = time;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub notify_door_unauth {
|
sub notify_door_unauth {
|
||||||
|
@ -180,8 +194,8 @@ sub serial_open {
|
||||||
sub serial_input {
|
sub serial_input {
|
||||||
my ($self, $input) = @_[OBJECT, ARG0];
|
my ($self, $input) = @_[OBJECT, ARG0];
|
||||||
print ((scalar localtime)." $input\n");
|
print ((scalar localtime)." $input\n");
|
||||||
$input =~ /^(\d) (\d) (.*)$/ or return;
|
$input =~ /^(\d) (\d) (\d) (.*)$/ or return;
|
||||||
my ($cur_status, $cur_streaming, $brm) = ($1, $2, $3);
|
my ($cur_status, $cur_streaming, $cur_dooropen, $brm) = ($1, $2, $3, $4);
|
||||||
if ($cur_status != $status) {
|
if ($cur_status != $status) {
|
||||||
foreach (@{$self->{observers}}) {
|
foreach (@{$self->{observers}}) {
|
||||||
$poe_kernel->post($_, 'status_update', $cur_status);
|
$poe_kernel->post($_, 'status_update', $cur_status);
|
||||||
|
@ -204,6 +218,11 @@ sub serial_input {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ($cur_dooropen != $dooropen) {
|
||||||
|
foreach (@{$self->{observers}}) {
|
||||||
|
$poe_kernel->post($_, 'dooropen_update', $cur_dooropen);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub serial_error {
|
sub serial_error {
|
||||||
|
@ -511,7 +530,7 @@ sub new {
|
||||||
$self => [ qw(_start _default
|
$self => [ qw(_start _default
|
||||||
irc_001 irc_public irc_332 irc_topic
|
irc_001 irc_public irc_332 irc_topic
|
||||||
notify_update
|
notify_update
|
||||||
notify_door_unauth notify_door_unlocked) ],
|
notify_door_unauth notify_door_unlocked notify_door_open) ],
|
||||||
],
|
],
|
||||||
heap => { irc => $irc, connector => $connector },
|
heap => { irc => $irc, connector => $connector },
|
||||||
);
|
);
|
||||||
|
@ -661,6 +680,19 @@ sub notify_door_unlocked {
|
||||||
$irc->yield (privmsg => $channel => $msg );
|
$irc->yield (privmsg => $channel => $msg );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub notify_door_open {
|
||||||
|
my ($sender, $newstate) = @_[SENDER, ARG0];
|
||||||
|
my $irc = $_[HEAP]->{irc};
|
||||||
|
my $msg;
|
||||||
|
my $unlock_timeout = 30;
|
||||||
|
if ($dooropen == 1 and $status == 0 and time - $lastunlock >= $unlock_timeout) {
|
||||||
|
$msg = "[door] $newstate \002(alert: closed brmlab, door opened, unlocked before more than $unlock_timeout seconds)";
|
||||||
|
} else {
|
||||||
|
$msg = "[door] $newstate";
|
||||||
|
}
|
||||||
|
$irc->yield (privmsg => $channel => $msg );
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "NewSoftSerial.h"
|
#include "NewSoftSerial.h"
|
||||||
|
|
||||||
// pins
|
// pins
|
||||||
|
const int magnetPin = 10;
|
||||||
const int soundPin = 9; /* piezo in series with 100R */
|
const int soundPin = 9; /* piezo in series with 100R */
|
||||||
const int statusLed = 8;
|
const int statusLed = 8;
|
||||||
const int statusBtn = 7;
|
const int statusBtn = 7;
|
||||||
|
@ -167,6 +168,8 @@ void readSerial()
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
|
pinMode(magnetPin, INPUT);
|
||||||
|
digitalWrite(magnetPin, HIGH);
|
||||||
pinMode(doorLock, OUTPUT);
|
pinMode(doorLock, OUTPUT);
|
||||||
pinMode(soundPin, OUTPUT);
|
pinMode(soundPin, OUTPUT);
|
||||||
pinMode(statusLed, OUTPUT);
|
pinMode(statusLed, OUTPUT);
|
||||||
|
@ -191,10 +194,13 @@ void loop()
|
||||||
if (!statusStateOverride) statusState = statusStateNew;
|
if (!statusStateOverride) statusState = statusStateNew;
|
||||||
if (!videoStateOverride) videoState = videoStateNew;
|
if (!videoStateOverride) videoState = videoStateNew;
|
||||||
|
|
||||||
|
int doorOpen = digitalRead(magnetPin);
|
||||||
|
|
||||||
digitalWrite(statusLed, !statusState); // will be turned back in readCard()
|
digitalWrite(statusLed, !statusState); // will be turned back in readCard()
|
||||||
digitalWrite(videoLed, videoState);
|
digitalWrite(videoLed, videoState);
|
||||||
comSerial.print(statusState, DEC); comSerial.write(" ");
|
comSerial.print(statusState, DEC); comSerial.write(" ");
|
||||||
comSerial.print(videoState, DEC); comSerial.write(" ");
|
comSerial.print(videoState, DEC); comSerial.write(" ");
|
||||||
|
comSerial.print(doorOpen, DEC); comSerial.write(" ");
|
||||||
readCard();
|
readCard();
|
||||||
readSerial();
|
readSerial();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue