D-link smart plug DSP-W215 with Openhab
Tutorial on how to make the smart plug from d-link dsp-w215 controllable from other than the official dlink application. In this case Openhab but should be possible to integrate it in any other application. Following tutorial is for linux. But with slight modification should be possible to use on windows as well (NODEJS is multiplatform).
Big thanks to bikerp – github
What i did:
- Download the code from bikerp github page.
- Edit the code of app.js as follows to be able to use it with exec binding in openhab. (For Openhab2 allow installation of EXEC for version 1. I have no idea how to work with the EXEC 2 yet. ) You have to put your PIN_CODE and IP of the DSP plug.
var soapclient = require('./js/soapclient'); var fs = require('fs'); var OUTPUT_FILE = "result.txt"; var LOGIN_USER = "admin"; var LOGIN_PWD = "PIN_CODE"; var HNAP_URL = "http://IP_OF_DSP/HNAP1"; var POLLING_INTERVAL = 60000; var args = process.argv.slice(2); soapclient.login(LOGIN_USER, LOGIN_PWD, HNAP_URL).done(function (status) { if (!status) { throw "Login failed!"; } if (status != "success") { throw "Login failed!"; } if (args == "on") { soapclient.on(); } if (args == "off"){ soapclient.off(); } if (args == "power"){ soapclient.consumption().done(function (power) {console.log(power);}); } if (args == "total"){ soapclient.totalConsumption().done(function (power) {console.log(power);}); } if (args == "temp"){ soapclient.temperature().done(function (temperature) {console.log(temperature);}); } if (args == "state"){ soapclient.state().done(function (state) { if(state == "true"){ console.log("ON"); } else { console.log("OFF"); } });; } });
- You will also need to have installed NODEJS to be able to run javascript from terminal.
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install -y nodejs
- Run “npm install” inside directory with package.json and app.js . This will install locally all needed modules.
- Set the items in openhab. In here you can see settings for switch has 1 input value and two outputs. Two outputs from openhab are simply ON and OFF. Input check every 10 seconds the actual state of the switch in case power plug was turned off by button.
- In the following items file /usr/share/openhab/dlink_dsp/ is the path where i unzipped content from bikerp github.
Group DSPW215_group "Dlink Plug" <poweroutlet> Group DSPW215_stats Switch DSPW215 "Plug switch" <poweroutlet> (DSPW215_group) { exec="<[/bin/sh@@-c@@cd /etc/openhab2/dlink_dsp/;node app.js state:30000:REGEX((.*?))] >[ON:/bin/sh@@-c@@cd /etc/openhab2/dlink_dsp/;node app.js on] >[OFF:/bin/sh@@-c@@cd /etc/openhab2/dlink_dsp/;node app.js off]" } Number DSPW215_power "Plug current [%.2f W]" <chart> (DSPW215_group,DSPW215_stats) { exec="<[/bin/sh@@-c@@cd /etc/openhab2/dlink_dsp/;node app.js power:90000:REGEX((.*?))]" } Number DSPW215_total "Plug total [%.2f KWh]" <chart> (DSPW215_group,DSPW215_stats) { exec="<[/bin/sh@@-c@@cd /etc/openhab2/dlink_dsp/;node app.js total:90000:REGEX((.*?))]" } Number DSPW215_temperature "Plug Temperature: [%.2f C]" <temperature> (DSPW215_group) { exec="<[/bin/sh@@-c@@cd /etc/openhab2/dlink_dsp/;node app.js temp:60000:REGEX((.*?))]" }
- And the sitemap file
sitemap default label="My Home" { Frame label="Living room" { Group item=DSPW215_group } }
- Result on the Web page (additionally you can use charts and rules to make timer control)
Here is timer.rules if you wish to use the timer function.
It might need some improvement. Let me know if you think of something.
import org.joda.time.* import org.openhab.model.script.actions.Timer import org.openhab.core.library.types.* var Timer masterAlarmTime = null var Timer masterAlarmTimeOFF = null rule "Initialize DSPW215 items" when System started then Alarm_DSPW215TimeMins.state end rule "DSPW215 alarm time" when Item Alarm_DSPW215TimeMins received update or Item Alarm_DSPW215TimeMinsOFF received update then var int minutes = (Alarm_DSPW215TimeMins.state as DecimalType).intValue() var int minutesOFF = (Alarm_DSPW215TimeMinsOFF.state as DecimalType).intValue() if (masterAlarmTime != null) masterAlarmTime.cancel() if (masterAlarmTimeOFF != null) masterAlarmTimeOFF.cancel() // work out when the alarm is to fire - start from midnight var DateTime alarmTime = new DateTime() // add the number of minutes selected alarmTime = alarmTime.plusMinutes(minutes) // create a timer to execute the alarm at the specified time masterAlarmTime = createTimer(alarmTime) [| if (Alarm_DSPW215.state == ON) Alarm_DSPW215Event.sendCommand(ON) ] Alarm_DSPW215Time.sendCommand(String::format("%02d:%02d", alarmTime.getHourOfDay(), alarmTime.getMinuteOfHour())) //To turn off var DateTime alarmTimeOFF = alarmTime.plusMinutes(minutesOFF+5) masterAlarmTimeOFF = createTimer(alarmTimeOFF) [| if (Alarm_DSPW215.state == ON) Alarm_DSPW215Event.sendCommand(OFF) ] // update the alarm display time Alarm_DSPW215TimeOFF.sendCommand(String::format("%02d:%02d", alarmTimeOFF.getHourOfDay(), alarmTimeOFF.getMinuteOfHour())) end rule "DSPW215 alarm" when Item Alarm_DSPW215Event received command ON then DSPW215.sendCommand(ON) end rule "DSPW215 alarm OFF" when Item Alarm_DSPW215Event received command OFF then DSPW215.sendCommand(OFF) Alarm_DSPW215.sendCommand(OFF) end