Hacking a BESTOPE / KanKun / Konke Smart Plug: HowTo Automate Powercycle Network

I have a problem with the network in my home in that, at times, I need to reset my wireless router and other network components. This doesn’t happen too often, but when it does, I need to go all the way to the basement where the network components are kept, and unplug each one, wait 15 seconds, and plug them back in. In my case, I have found that I don’t necessarily need to bring them up in order, but simply need to power cycle the whole lot of them to reset my network. But…it’s a pain.

Note: This tutorial assumes a basic working knowledge of Linux. For more information concerning Linux in general, consider taking a look at the Linux resources at: http://www.barryhubbard.com/category/linux/.

What I want to do?

I would like to have a smart plug that I can trigger through a web interface to power cycle my network components. I would like to click on a link in my browser and have the smart plug automatically power off the components, wait 15 seconds, and power them back on.

The Problem

Of course, once I power off the network, I will lose any connection to the smart plug (which connects only through WiFi). My WiFi router is one of the devices that I want to be able to reset. So, the smart plug has to automatically power back on the plug, once I initiate the “restart” sequence.

What do I have?

Last year, I received one of these little smart plugs made by a company called KanKun.

smart_plug

Actually, finding out who made them was half the battle. My packaging didn’t mention Kankun at all, but called it BESTOPE smart plug. Other information on the plug indicates that it is made by Konke. They appear to be one in the same, though.

The software for this smart plug wasn’t overly useful. Although there is an app designed to be able to turn the plug on or off from anywhere in the world, I found it somewhat unreliable. Also, due to the device needing to have an active WiFi connection to be controlled, the app wasn’t going to help with my whole reset problem.

Basics

Thanks to some information I found over at Anites Website I found that the smart plug is simply running BusyBox, a stripped down embedded Linux system. The nice thing is that this is Linux, which means that we can play.

There are some basic tools available to us, including an already installed Web server, able to execute CGI scripts.

Initial Log In

The first thing you must do is log in to the smart plug. You do this through ssh. You will need a computer with both a WiFi adapter and an SSH client.

Reset the Smart Plug

To reset the Smart Plug back to factory settings, press and hold the front button for 5 seconds.

smart_plug_button

Once you release the button, the blue light on the front of the unit should stay on solid for approximately 30 seconds. This indicates that the unit is booting. Once booting is complete, you should be able to open the WiFi settings on your computer and see a new wireless network with an SSID of OK_SP3. You will need to connect to this network.

Once connected to the network, you can run ifconfig (Linux) or ipconfig (Windows) to determine your network settings. You should have been assigned an IP address by the KanKun smart plug. You should also note the default gateway, as this is the IP address of the smart plug.

The smart plug should have an IP address of 192.168.10.253.

From here, ssh into the smart plug using the following credentials:

Username: root Password: p9z34c

The anites site has additional default passwords that are sometimes used for the device, if you are having trouble logging on.

Some Initial Setup

Once logged on for the first time, there are a couple of things that are good to do:

  1. Set a new password
  2. Attach the smart plug to your own wireless network

Setting a new password

You are already logged in as the root user. So, all you need to do to set a new password for the root user is to execute the following command:

# passwd

Then enter the password that you would like to use. This will now become the password that you will use going forward.

Attach the smart plug to your wireless network

I highly recommend assigning your smart plug a static IP address. This will allow you to always know where your smart plug is located on the network in the future.

My basic network configuration is:

Network: 192.168.2.x Gateway: 192.168.2.1 Netmask: 255.255.255.0 WiFi SSID: MyNetwork WiFi Password: my_password

I would like to assign 192.168.2.12 as the address for my smart plug.

So, first, you will need to edit the /etc/config/wireless file using vi. For information on using vi, look at: http://www.barryhubbard.com/linux/useful-linux-commands-working-with-text/. To edit the file, simply type the following at the command prompt:

# vi /etc/config/wireless

Modify your /etc/config/wireless to match your settings. Based on the above configuration, my wireless file would look like this:

config wifi-device  radio0
        option type     mac80211
        option channel  11
        option hwmode   11ng
        option path     'platform/ar933x_wmac'
        option htmode   HT20
        list ht_capab   SHORT-GI-20
        list ht_capab   SHORT-GI-40
        list ht_capab   RX-STBC1
        list ht_capab   DSSS_CCK-40
        # REMOVE THIS LINE TO ENABLE WIFI:
        option disabled 0

config wifi-iface
        option device   radio0
        option network  wwan
        option mode     sta
        option ssid     'MyNetwork'
        option key      'my_password'
        option encryption psk

Next, you will need to modify the /etc/config/network. The contents should be:

config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'
        option ula_prefix 'fdab:ee91:1053::/48'

config interface 'lan'
        option ifname 'eth0'
        option type 'bridge'
        option proto 'static'
        option ipaddr '192.168.10.253'
        option netmask '255.255.255.0'
        option ip6assign '60'

config interface 'wwan'
        option proto 'static'
        option ipaddr '192.168.2.12'
        option netmask '255.255.255.0'
        option gateway '192.168.2.1'

Notice the addition of the “wwan” section, appended to the file. This should include the information for your network, including the static ip address you would like assigned to your smart plug. Also, the gateway and netmask should match your network setup.

Once complete, you will need to restart the switch for the settings to take effect. You can restart the smart plug by executing the following command:

# reboot

How to turn the smart plug on and off

Turning the smart plug on and off is simple and can be done from the command prompt:

Turning the smart plug off

# echo 0 > /sys/class/leds/tp-link:blue:relay/brightness

Turning the smart plug on

# echo 1 > /sys/class/leds/tp-link:blue:relay/brightness

Script to automatically restart

The next step is to put the above commands into a script to do the following:

  1. Turn the smart plug off
  2. Wait 15 seconds
  3. Turn the smart plug on

Ultimately this will run from a web page, so I created a new directory under the /www directory called cgi-bin, by executing the following command:

# mkdir /www/cgi-bin

Next, create a script, in my case, I called it restart.cgi by doing the following:

# vi /www/cgi-bin/restart.cgi

Now, edit restart.cgi to contain the following:

#!/bin/sh
echo "Content-Type: text/html"
echo ""

RELAY_CTRL=/sys/class/leds/tp-link:blue:relay/brightness

echo 0 > $RELAY_CTRL
sleep 15
echo 1 > $RELAY_CTRL

echo '<br><br>'
echo '<HTML><body><h1><center>MyNetwork has been Reset</center></h1></HTML>'

Finally, you should make this executable. In my case, I trust this network and am not overly worried about security, so I will make this executable by everyone (assuming that if they are logged into the Smart Plug, I’m already in trouble). Make restart.cgi executable by doing the following:

# chmod a+x /www/cgi-bin/restart.cgi

You can test whether the script works or not by executing the following from the shell:

# /www/cgi-bin/restart.cgi

If the script is working correctly, you should see the red light turn off, wait 15 seconds, and see the red light turn on.

Create web page front in for restart

The smart plug already has a web server running. All we need to do is create an index.html file which can call our script. This can be done with the following:

# vi /www/index.html

Make the contents of the following match:

<HTML>
<HEAD><TITLE>MyNetwork Restart</TITLE></HEAD>
<BODY><center>
<br><br><h1>
To Restart the Newtork, click <a href=cgi-bin/restart.cgi>here</a></h1>
</center></BODY>
</HTML>

Now, to test the script, simply log on to your web browser and navigate to http://192.168.2.12 (or the static IP address you specified up above). You should see something like the following:

web_interface

If you click the “here” link, you should see your plug reset (after a 15 second power off)

Restart Network Services

If you are using the smart plug to restart your network, you have a little bit of a problem. Once the network restarts, your smart plug will lose its connection to the network. To fix that, you will need to create a script to perform a delayed network restart.

You can create the script using the following command:

# vi /root/scripts/delayed_network_restart

And make the contents of your script:

#!/bin/sh

sleep 120
/sbin/ifdown wwan
sleep 15
/sbin/ifup wwan

This will wait 2 minutes and restart the network services, this should give enough time for the network to power up and settle. You can extend this time as necessary.

Finally, make the script executable:

# chmod a+x /root/scripts/delayed_network_restart

Now we need to add a call to our network_restart script to our restart.cgi file. Modify the cgi script to add the call to our restart script immediately after turning on the power to the plug. The modified script should look as follows:

#!/bin/sh
echo "Content-Type: text/html"
echo ""

RELAY_CTRL=/sys/class/leds/tp-link:blue:relay/brightness

echo 0 > $RELAY_CTRL
sleep 15
echo 1 > $RELAY_CTRL
/root/scripts/delayed_network_restart

echo '<br><br>'
echo '<HTML><body><h1><center>MyNetwork has been Reset</center></h1></HTML>'

Force the smart plug on at startup

As a final note, I wanted to make sure that if the power ever went out, the smart plug would be forced on at startup. Typically, the smart plug should resume whichever state it was in prior to the power loss, but I wanted to force this. Additionally, I need the networking components to restart after the initial power up (once the network is established)

In testing, I found that the restoring of the power state was the last thing done in startup, even after the rc.local was allowed to complete, so the work-around was a two step process:

  1. Create an executable script to run 30 seconds after launch
  2. Run the script at startup

The Script

First, create a scripts directory under the root user

# mkdir /root/scripts

Next, create the following file:

# vi /root/scripts/power_on

With the contents:

#!/bin/sh

sleep 30

echo 1 > /sys/class/leds/tp-link:blue:relay/brightness
/root/scripts/delayed_network_restart

By forcing the script to sleep 30 seconds before starting, you will ensure that the smart plug has time to complete its initialization procedure and place the plug in whichever state it thinks in should be in. Also, we call the delayed_network_restart script that we created earlier, to run after the initial boot.

Make it executable

# chmod a+x /root/scripts/power_on

Run the Script at startup

Edit rc.local

# vi /etc/rc.local

Add the following line before the exit 0

/root/scripts/power_on &

How to Automatically restart network when connection lost

So, what if you want the network to automatically restart if you sense a loss in connection. Let’s make some modifications to the file above.

Doing so will involve a few steps:

  1. Write a script to detect if we have an internet connection
  2. If no connection is present, restart the network
  3. Add the script to the crontab scheduler to run on a schedule (for example, every 5 minutes)

Write a script to detect an internet connection

First, we need to choose a good reliable server to “ping” to test whether or not we have a connection. For this, I will use the google dns server located at 8.8.8.8, although you can choose any other known good server. Once concern is that as setup above, the smart plug does not have dns enabled, so we should ping by ip address, instead of host name.

General Connection Detection

A simple bash script for detecting whether or not we have a network connection looks like:

#!/bin/bash
SERVER=8.8.8.8

ping -c 3 $SERVER > /dev/null 2>&1
if [ $? -ne 0 ]
then
  echo "No connection found"
else
  echo "Connection found"
fi

The IP address of the server we will check a connection to is specified at the top. In this case, it is one of dns servers for google. I am assuming that if I cannot reach google’s dns server, it is a problem with my connection, not theirs. (I pay far less for my internet connection!)

Basically, this script will execute a ping command, and returns a value of 0 when a ping is successful (as the return status of the command). The output of the ping command is discarded to /dev/null. The -c option specifies that 3 pings should be sent (in case there is a problem and one is lost).

Modify the script to restart the network if no connection is present

Now, using a combination of the scripts from before, we can create a new script that will run a test (once) and restart the network if no connection is found. In my case, it is stored in the /root/scripts folder. Create the file with the following command

# vi /root/scripts/connection_check.sh

Make the contents of the file:

#!/bin/bash
SERVER=8.8.8.8
RELAY_CTRL=/sys/class/leds/tp-link:blue:relay/brightness

ping -c 3 $SERVER > /dev/null 2>&1
if [ $? -ne 0 ]
then
  echo 0 > $RELAY_CTRL
  sleep 15
  echo 1 > $RELAY_CTRL
  /root/scripts/delayed_network_restart.sh
fi

And finally, make it executable with the command:

# chmod a+x /root/scripts/connection_check.sh

Add the script to crontab

The final step is to have the script automatically run at set intervals. In my case, I have decided to check for an internet connection every 5 minutes. If the connection has gone away, it will reset the network.

The following line needs added to root’s crontab:

*/5 * * * * sh /root/scripts/connection_check.sh

This will run /root/scripts/connection_check.sh every 5 minutes. You can edit the crontab with the following command:

# crontab -e

And add the above line, as you normally would using vi

Ensure that cron is running on startup

During testing, I noticed that cron does not appear to start correctly at startup. The easiest fix for this was to simply add the cron initialization to the rc.local file. If it is already running, this should not be a problem.

Simply, modify the rc.local file using the following command:

# vi /etc/rc.local

And add the following line prior to the exit 0 command:

/etc/init.d/cron restart

This will restart the cron process once the system is up and running.

The entire rc.local file will look like this:

# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
sleep 5
/sbin/kkeps_on &
/sbin/kkeps_off &
/sbin/kkeps_seekwifi &
/sbin/kkeps_reconect &

/root/scripts/power_on &

/etc/init.d/cron restart

exit 0

That’s it. Once you have completed and tested these steps, you can plug your network components into this plug (likely using a power strip) Just make sure that the total amount of items plugged in to the smart plug do not exceed the 10A rating of the plug singulair pill. Most networking components should be well within this range. And that is how you make a KanKun smart plug power cycle your network components.

With the two scripts shown above, you should be able to either restart the smart plug on command, or have it automatically restart when it detects that the internet connection has been lost.

4 thoughts on “Hacking a BESTOPE / KanKun / Konke Smart Plug: HowTo Automate Powercycle Network

  • January 5, 2016 at 1:44 am
    Permalink

    Hi Barry, your project is really great. I am actually searching for this kind of programming with Kankun Smart Plug. Specifically, I was searching for a hack that could monitor your WiFi router and resets power if the WiFi fails. Since this smart plug will try to connect to our WiFi router, if it did not get internet connection, it should reset the power. I hope you could do that. Thanks.

    Reply
  • January 5, 2016 at 11:00 am
    Permalink

    That’s a pretty good idea, let me take a look. – Barry

    Reply
  • January 6, 2016 at 1:12 pm
    Permalink

    I have made the changes to the tutorial, so that it will now reset the network automatically if the network goes down (or within 5 minutes or so). Some slight changed needed to be made to the network config file as well, so that a gateway was defined and the plug could ping the outside world. Hope this helps – Barry

    Reply
  • May 22, 2016 at 10:12 pm
    Permalink

    Thanks a lot for this very helpful tutorial, I was out of the country last week and my network went down at home, I lost my vpn and access to my servers, had to find someone to physically go into my house and pull the plug, very inconvenient, this is a great cheap and easy fix, appreciate taking the time to share with everyone.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *