четверг, 1 ноября 2018 г.

Domoticz. Мониторинг сетевых устройств при помощи perl скрипта

Добавим в систему запуск perl-скрипта, который будет запускаться 3 раза в минуту по crontab и проверять online\offline состояние устройства.

Для, для корректной работы, требуются статичные IP-адреса для опрашиваемых устройств. Ну, или прописанные в роутере имена для них.

Переходим в Настройка>Оборудование и добавляем новое устройство Dummy
Затем создаём виртуальный датчик с типом Переключатель
Переходим во вкладку Настройка>Устройства и запоминаем idx нового переключателя (30)

Теперь подготовим сервер для работы с perl-скриптами
sudo apt-get install libjson-perl libdatetime-perl libwww-perl
Создаём скрипт в ping-phones.pl в /home/pi/domoticz/scripts/
nano /home/pi/domoticz/scripts/ping-phones.pl
И добавляем туда следующее содержимое
#!/usr/bin/perl
    use v5.14;
    use LWP::Simple;                # From CPAN
    use JSON qw( decode_json );     # From CPAN
    use Data::Dumper;               # Perl core module
    use strict;                     # Good practice
    use warnings;                   # Good practice
    use utf8;
    use feature     qw< unicode_strings >;
    # Configuration section, please update to your values
    my $domoticz = "127.0.0.1:8080";  # ip and port of your Domoticz server 
    my $domo_cmd = "http://$domoticz/json.htm?type=devices&filter=all&used=true&order=Name";
 
            # Array of (device idx, IP)
                      my %IP=(30=>'10.0.0.40', # redmi3s
                              31=>'10.0.0.41', # redmi4a
                              32=>'10.0.0.42'); # asusz00sd
    my $debug=0;
    # Get the JSON url
    my $json = get( $domo_cmd );
    die "Could not get $domo_cmd!" unless defined $json;
    # Decode the entire JSON
    my $decoded = JSON->new->utf8(0)->decode( $json );
    my @results = @{ $decoded->{'result'} };
    #Put JSON switch and status in a Table
    my @tab;
    foreach my $f ( @results ) {
      if ($f->{"SwitchType"}) {
            $tab[$f->{"idx"}]=$f->{"Status"};
      }
    }
    # Now we go all over the IP to check if they are alive
    foreach my $k (keys %IP) {
            my $ip=$IP{$k};
            my $res=system("sudo ping $ip -w 3 2>&1 > /dev/null");
    #print $k." ".$res."\n";
            if (($res==0)&&($tab[$k] eq 'Off')) {
                    #If device answered to ping and device status is Off, turn it On in Domoticz
                    if ($debug) {print "$k is On\n"};
                   `curl -s "http://$domoticz/json.htm?type=command&param=switchlight&idx=$k&switchcmd=On"`;
            } elsif (($res!=0)&&($tab[$k] eq 'On')) {
                    #If device did NOT answer to ping and device status is On, turn it Off in Domoticz
                    if ($debug) {print "$k is Off\n"};
                   `curl -s "http://$domoticz/json.htm?type=command&param=switchlight&idx=$k&switchcmd=Off"`;
            } else {
                    if ($debug) {print "do nothing: $k is ".$tab[$k]."\n";}
            }
    }
Заполняем Configuration section, а именно настройки подключения к серверу и idx и IP-адреса устройств.

Не забываем сделать скрипт исполняемым
sudo chmod +x /home/pi/domoticz/scripts/ping-phones.pl
Осталось добавить в crontab задание на запуск скрипта каждую минуту
crontab -e 
*/1 * * * * /home/pi/domoticz/scripts/ping-phones.pl 2>&1 >> /dev/null
Выполнение скрипта, для проверки 3 устройств занимает 5-7 секунд. Поэтому для каждого типа устройств (камеры, мобильные телефоны, рабочие станции) я создал по отдельному скрипту, и прописал запуск в crontab с различными интервалами.

Пример использования отслеживания сетевых устройств для управления фасадным освещением.

ВНИМАНИЕ!!! В скрипте не прописаны логин\пароль для авторизации на сервере Domoticz. Поэтому, в случае, если вы обезопасились, и настроили авторизацию в вебморду через логин и пароль, скрипт может благополучно не работать!
Прописываем в настройках Domoticz "Локальные сети (без имени\пароля) и радуемся. Ну или курим API. Кто выкурит, напишите в комментах, добавлю в скрипт.

10 комментариев :

  1. Добрый вечер. все сделал по инструкции. после последнего действия "crontab -e
    */1 * * * * /home/pi/domoticz/scripts/ping-phones.pl 2>&1 >> /dev/null" вывалилась ошибка

    ОтветитьУдалить
  2. pi@raspberrypi:~ $ crontab -e
    no crontab for pi - using an empty one
    GNU nano 3.2 /tmp/crontab.pbCBqv/crontab

    # Edit this file to introduce tasks to be run by cron.
    #
    # Each task to run has to be defined through a single line
    # indicating with different fields when the task will be run
    # and what command to run for the task
    #
    # To define the time you can provide concrete values for
    # minute (m), hour (h), day of month (dom), month (mon),
    # and day of week (dow) or use '*' in these fields (for 'any').
    #
    # Notice that tasks will be started based on the cron's system
    # daemon's notion of time and timezones.
    #
    # Output of the crontab jobs (including errors) is sent through
    # email to the user the crontab file belongs to (unless redirected).
    #
    # For example, you can run a backup of all your user accounts
    # at 5 a.m every week with:
    # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
    #
    # For more information see the manual pages of crontab(5) and cron(8)
    #
    # m h dom mon dow command

    ОтветитьУдалить
    Ответы
    1. Добавьте строчку с запуском скрипта в конец. Затем ctrl+x и Y для сохранения

      Удалить
  3. Ответы
    1. # at 5 a.m every week with:
      # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
      #
      # For more information see the manual pages of crontab(5) and cron(8)
      #
      # m h dom mon dow command
      */1 * * * * /home/pi/domoticz/scripts/ping-phones.pl 2>&1 >> /dev/null

      Удалить
  4. все равно не получается... вписываю свои idx и ip адреса 3-ех устройств
    набираю "crontab -e"
    выскакивает уже сохраненная строка "*/1 * * * * /home/pi/domoticz/scripts/ping-phones.pl 2>&1 >> /dev/null"
    нажимаю CTRL+X, далее сохранить Y и выхожу

    ОтветитьУдалить
  5. Максим, буду благодарен, если ответите...

    ОтветитьУдалить
  6. все сделал по инструкции, с андроидами все работает, а вот айфоны причем 3 штуки в заблокированном режиме уходят в оффлайн и их не видно, но стоит разблокировать устройство их видно, не пойму как исправить

    ОтветитьУдалить