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

1 ноября 2018 г. · Domoticz, Полоумный Дом
Добавим в систему запуск 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)

Влад · 6 ноября 2019 г.
Добрый вечер. все сделал по инструкции. после последнего действия "crontab -e */1 * * * * /home/pi/domoticz/scripts/ping-phones.pl 2>&1 >> /dev/null" вывалилась ошибка
Agapov Max · 6 ноября 2019 г.
Какая ошибка? Проверьте путь к phones.pl
Влад · 6 ноября 2019 г.
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
Agapov Max · 6 ноября 2019 г.
Добавьте строчку с запуском скрипта в конец. Затем ctrl+x и Y для сохранения
Влад · 6 ноября 2019 г.
Извините, не понял как.
Agapov Max · 6 ноября 2019 г.
# 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
Влад · 6 ноября 2019 г.
все равно не получается... вписываю свои idx и ip адреса 3-ех устройств набираю "crontab -e" выскакивает уже сохраненная строка "*/1 * * * * /home/pi/domoticz/scripts/ping-phones.pl 2>&1 >> /dev/null" нажимаю CTRL+X, далее сохранить Y и выхожу
Влад · 7 ноября 2019 г.
Максим, буду благодарен, если ответите...
Agapov Max · 7 ноября 2019 г.
Напишите на kryonat@mail.ru
Аноним · 11 января 2020 г.
все сделал по инструкции, с андроидами все работает, а вот айфоны причем 3 штуки в заблокированном режиме уходят в оффлайн и их не видно, но стоит разблокировать устройство их видно, не пойму как исправить