Как вызвать Zoneminder на телефонную линию

  1. Вам необходимо подключить компьютер к стационарному телефону через "модем".

  2. Установите wvdial (и настройте его) (и проверьте, звонит ли он на ваш телефон).

  3. Затем измените скрипт, предоставленный zoneminder, для доступа к модему (найдите на этой странице, например, "trigger").

  4. Запустите этот скрипт, например, в вашем домашнем каталоге.

Также я обнаружил, что модемы, будучи довольно старомодными, не очень хорошо поддерживаются в Linux, например, "Winmodems" (дешевы), потому что они делают низкоуровневые вещи в программном обеспечении (Windows) для экономии на оборудовании, поэтому PCI-модем моего старого компьютера больше не поддерживается в текущем Linux, т. е. мне пришлось искать аппаратный модем, например, Trendnet TFM 561u. Это работало "из коробки" в моей системе Mint 14 (декабрь 2013 г.) и отображалось как /dev/ttyACM0.

#!/usr/bin/perl -w

use strict;

use lib ("/opt/zm/share/perl/5.14.2");

use ZoneMinder;

$| = 1;

# mDbgInit( "myscript", level=>0, to_log=>0, to_syslog=>0, to_term=>1 );

my $dbh = DBI->connect( "DBI:mysql:database=".ZM_DB_NAME.";host=".ZM_DB_HOST, ZM_DB_USER, ZM_DB_PASS );

my $sql = "select M.*, max(E.Id) as LastEventId from Monitors as M left join Events as E on M.Id = E.MonitorId where M.Function != 'None' group by (M.Id)";
my $sth = $dbh->prepare_cached( $sql ) or die( "Can't prepare '$sql': ".$dbh->errstr() );

my $res = $sth->execute() or die( "Can't execute '$sql': ".$sth->errstr() );
my @monitors;
while ( my $monitor = $sth->fetchrow_hashref() ) 
{
    push( @monitors, $monitor );
}

while( 1 ) {
    foreach my $monitor ( @monitors ) {
        next if ( !zmMemVerify( $monitor ) );

        my $lei = eval {               # avoid...
            $monitor->{LastEventId};   # ...aborting
        };                             # ...this script
        warn $@ if $@;                 # ...if there is no
        if( ! $lei ) {                 # ...LastEventId
        next;                          # ...e.g. for a clean start
        }                              # ...after clearing out database.

        my $last_event_id = zmHasAlarmed( $monitor, $lei );


        if ( $last_event_id ) {
            if ( $monitor->{Name} ne "monitor-1" && $monitor->{Name} ne "monitor-2" )  {
                my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
                if ( $hour > 23 || $hour < 7 ) {
                    $monitor->{LastEventId} = $last_event_id;
                    print( "Monitor ".$monitor->{Name}." has alarmed \n" );
                    my $cmd .= "echo ";
                    $cmd .= "\"";
                    $cmd .= "Garage Alarm: ".$monitor->{Name};
                    $cmd .= "\"";
                    $cmd .=  ' | mail -s `curl ifconfig.me` myemailaddress@gmail.com';
                    system ($cmd);
                    system('wvdial');
                }
            } 
        }
    }
    sleep( 1 );
}

Это моя первая попытка (модификации) Perl. Это будет грубо!

Первая система ($cmd) отправляет мне электронное письмо по адресу myemailaddress@gmail.com (вам нужно настроить его самостоятельно, чтобы почта работала) с текущим URL-адресом на случай, если он недавно изменился.

Вторая система ('wvdial') звонит на мой телефон.

Как видите, "monitor-1" и "monitor-2" игнорируются.

Как вы можете видеть, он включен между часами после 23:00 и до 7:00.

Мой файл /etc/wvdial.conf выглядит примерно так:

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Modem Type = USB Modem
Phone = 123456789
ISDN = 0
Password = <Your Password>
New PPPD = yes
Username = <Your Login Name>

Modem = /dev/ttyACM0
Baud = 460800
Dial Command = ATDT
Auto Reconnect = off
Dial Attempts = 1

0 ответов

Другие вопросы по тегам