Domoticz Pings any IP in LAN, and switching a device, using Perl
Switching a device by any local IP
Under constrution'
Domoticz can ping your IP devices using a perl script.
By creating a dummy switch, Domoticz monitor a lot of devices.
Domoticz can automatically switch (via this script) your IP devices on or off.
Telephones, ipcameras, sip, blueray, satbox, etc - if it has an ip address it is possible to ping it.
When such devices go off or on, you can e.g. send a message or perform any other Domoticz task.
Or, if your kids are sitting too long at the computer, you can transmit (through events) a message. Also my solar meters can now be quite simply monitored.
How To
Make sure that the IP addresses of your IP devices have been fixed.
Otherwise, make sure a static IP is always assigned to the same mac address(es)
Create a dummy hardware device, for example ip_ping.
Domoticz doesn't know that the hardware or its devices exists, so we need to add virtual devices in Domoticz that act as our ip_ping devices.
- Browse to your Domoticz installation and select Setup --> Hardware.
- Select Type: Dummy, enter a name for the dummy hardware and press Add.
- To add a new switch navigate to the Switches page and press Manual Light/Switch.
- Select the dummy hardware you created earlier and give your switch a name. Select Switch Type: On/Off. The Type, House Code and Unit Code shouldn't be of any importance. Finally press Add Device
- Go to Setup --> Devices and note down the Idx of your newly-created switch. You will need this later.
Create a dummy switch as mentioned above, and remember the IDX, e.g. 41
Or if you want multiple ip's pinged then create some more dummy switches, for example 44 and 681
Install as pi user:
sudo apt-get install libjson-perl libdatetime-perl libwww-perl
Place a crontab, as pi user on your RPi:
crontab -e
*/1 * * * * /home/pi/domoticz/scripts/ping_by_ip.pl 2>&1 >> /dev/null
Edit the 1 to the time [ minutes ] you like that Domoticz pings your Ip
Ctrl O and enter
to save
Ctrl X
to exit
Create a document in: /home/pi/domoticz/scripts/
And call it: ping_by_ip.pl
Or in one time:
sudo nano /home/pi/domoticz/scripts/ping_by_ip.pl
Place the code below in the document
#!/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 = "192.168.5.72: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=(41=>'192.168.5.19', # Ip 1
44=>'192.168.5.21', # Ip 2
681=>'192.168.5.24'); # Ip 3
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¶m=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¶m=switchlight&idx=$k&switchcmd=Off"`;
} else {
if ($debug) {print "do nothing: $k is ".$tab[$k]."\n";}
}
}
Check the document in your RPi /home/pi/domoticz/scripts
, with a program like Winscp
Make sure that the code #!
appears in the upper left corner of the document!
Customize this document so that all your ip's and your idx are correct.
Also check if your ip and port of your Domoticz RPi are correct.
Make sure you save everything!!
Make this script executable:
cd /home/pi/domoticz/scripts
sudo chmod +x ping_by_ip.pl
Test:
cd /home/pi/domoticz/scripts
./ping_by_ip.pl
If you made no errors, it should all work well.
If there are any errors, check all your settings.
YOU did something WRONG, not ME.... :-)
Link to topic
BIG Thanks to:
epierre and nickasimir