Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added state "fritzbox.x.wlan.enabled" (read/write) #10

Merged
merged 1 commit into from
Jan 24, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ ioBroker fritzbox Adapter


## Changelog
### 0.3.0 (2015-06-26)
* (UncleSamSwiss) added support for wlan.enabled (using TR-064)

### 0.2.1 (2015-06-28)
* (ruhr) more configuration options

Expand Down Expand Up @@ -69,6 +72,9 @@ Unter **fritzbox.x.** legt der Adapter folgende Channel und Objekte an:
* system.deltaTime (Deltazeit zwischen System und Fritzbox in Sek.)
* system.deltaTimeOK (true/false Deltazeit zwischen System und Fritzbox in der Tolereanz)

* **wlan. (CHANNEL)**
* wlan.enabled (true/false, read & write, Zustand des WLANs, nur verfügbar wenn Passwort konfiguriert ist)


## Beispiel-Widgets

Expand Down
13 changes: 12 additions & 1 deletion admin/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,11 @@
"fritzbox adapter settings": {"en": "Fritzbox Configuration", "de": "Fritzbox Adapter-Einstellungen", "ru": "Fritzbox Configuration"},
"fritzbox ip address": {"en": "Fritzbox IP-Address", "de": "IP-Adresse der Fritzbox", "ru": "Fritzbox IP-Address"},
"numbers": {"en": "Numbers", "de": "Rufnummern", "ru": "Numbers"},
"IP-Adresse:": {"en": "IP-Adresse:", "de": "IP-Adresse:", "ru": "IP-Address:"},
"IP-Adresse:": {"en": "IP-Address:", "de": "IP-Adresse:", "ru": "IP-Address:"},
"password": {"en": "Password*:", "de": "Passwort*:", "ru": "Password*:"},
"password-disclaimer": {"en": "* The password is only required if you wish to get additional information (Wi-Fi). Please be aware that the password is stored in plain-text in ioBroker!",
"de": "* Das Passwort wird nur benötigt, wenn zusätzliche Informationen (WLAN) gewünscht sind. Bitte beachten: das Passwort wird in Klartext in ioBroker gespeichert!",
"ru": "* The password is only required if you wish to get additional information (Wi-Fi). Please be aware that the password is stored in plain-text in ioBroker!"},
"country code": {"en": "Country Code:", "de": "Landesvorwahl ohne Präfix (z.B.: 49):", "ru": "Country Code:"},
"area code": {"en": "Area Code:", "de": "Ortsvorwahl ohne Präfix (z.B.: 211):", "ru": "Area Code:"},
"unknown number": {"en": "Unknown number:", "de": "Unterdrückte/unbekannte Rufnummer:", "ru": "Unknown number:"},
Expand Down Expand Up @@ -241,6 +245,13 @@ <h4 class="translate">fritzbox ip address</h4>
<td class="translate">IP-Adresse:</td>
<td><input type="text" id="fritzboxAddress" class="value"/></td>
</tr>
<tr>
<td class="translate">password</td>
<td><input type="password" id="fritzboxPassword" class="value" /></td>
</tr>
<tr>
<td colspan="2" class="translate">password-disclaimer</td>
</tr>
</table>
<h4 class="translate">numbers</h4>
<table>
Expand Down
19 changes: 17 additions & 2 deletions io-package.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
{
"common": {
"name": "fritzbox",
"version": "0.2.1",
"version": "0.3.0",
"title": "fritzbox Adapter",
"desc": {
"en": "Adapter monitors the call information from Fritzbox via tcp, Port 1012 (Activate call monitor in the Fritzbox with #96*5*)",
"de": "Adapter verarbeitet die Anrufinformation der Fritzbox über tcp, Port 1012 (Callmonitor in der Fritzbox mit #96*5* aktivieren)",
"ru": "Драйвер для отображения звонков с Fritzbox через tcp, Port 1012 (Нужно активировать call monitor в Fritzbox с помощью #96*5*)"
},
"authors": [
"ruhr <ruhr@digheim.de>"
"ruhr <ruhr@digheim.de>",
"UncleSam <samuel.weibel@gmail.com>"
],
"license": "MIT",
"platform": "Javascript/Node.js",
Expand All @@ -29,6 +30,7 @@
},
"native": {
"fritzboxAddress": "192.168.1.1",
"fritzboxPassword": "",
"cc": "49",
"ac": "211",
"unknownNumber": "### ? ###",
Expand Down Expand Up @@ -559,6 +561,19 @@
"desc": "history of missed calls as JSON"
},
"native": {}
},
{
"_id": "wlan.enabled",
"type": "state",
"common": {
"name": "Wi-Fi enabled",
"type": "boolean",
"role": "switch",
"read": true,
"write": true,
"desc": "Wi-Fi (WLAN) enabled"
},
"native": {}
}

]
Expand Down
117 changes: 112 additions & 5 deletions main.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ var xml2js = require('xml2js'); // node-Modul um xml Strukturen in JSON umzuwand
var net = require('net'); // node-Modul für die tcp/ip Kommunikation
// ist schon in node.js enthalten
// Beschreibung: https://nodejs.org/api/net.html
var tr = require("tr-064"); // node-Modul für die Kommunikation via TR-064 mit der FritzBox
// Beschreibung zu TR-064: http://avm.de/service/schnittstellen/

var adapter = utils.adapter('fritzbox');

Expand Down Expand Up @@ -110,6 +112,9 @@ var listRing = [],
// für den 1-Sekundentimer für den Callmonitor
var intervalRunningCall = null;

// für die TR-064-Abfragen
var intervalTR046 = null;
var wlanState = null;



Expand All @@ -129,20 +134,40 @@ adapter.on('ready', function () {
adapter.on('unload', function () {
adapter.log.debug('adapter.on-unload: << UNLOAD >>');
clearRealtimeVars();

if (intervalRunningCall) {
clearInterval(intervalRunningCall);
intervalRunningCall = null;
}

if (intervalTR046) {
clearInterval(intervalTR046);
intervalTR046 = null;
}
});


// is called if a subscribed state changes
adapter.on('stateChange', function (id, state) {
// adapter.log.debug('adapter.on-stateChange: << stateChange >>');
if (state && (id === adapter.namespace + ".calls.missedCount")) {
if (!state) {
return;
}
if (id === adapter.namespace + ".calls.missedCount") {
// New value of
// adapter.log.debug("state.val: " + state.val);
if (state.val == 0 || state.val == "0 ") {
adapter.setState('calls.missedDateReset', dateNow(), true);
adapter.log.debug("missed calls: counter zurückgesetzt " + dateNow());
}
}
else if (id === adapter.namespace + ".wlan.enabled" && !state.ack) {
adapter.log.debug(id + "=" + state.val);
if (state.val != wlanState && intervalTR046) {
adapter.log.info("Changing WLAN to " + state.val);
setWlanEnabled(adapter.config.fritzboxAddress, adapter.config.fritzboxPassword, state.val);
}
}
});


Expand Down Expand Up @@ -501,7 +526,7 @@ function adapterSetOnChange (object, value) {
// ioBroker Objekte schreiben aber nur, wenn der Wert geändert wurde
adapter.getState(object, function (err, state) {
if (!err && state) {
if (state.val != value) {
if (state.val !== value || !state.ack) {
adapter.setState(object, value , true);
}
}
Expand Down Expand Up @@ -614,8 +639,8 @@ function initVars() {
adapter.setState('callmonitor.call', "", true);
adapter.setState('callmonitor.all', "", true);
}


adapter.setState('wlan.enabled', "", true);
}


Expand Down Expand Up @@ -1097,6 +1122,73 @@ function parseData(message) {



function handleWLANConfiguration(config) {
//console.log(config);
adapter.log.debug("WLAN: " + config['NewEnable']);
wlanState = config['NewEnable'] == 1;
adapterSetOnChange("wlan.enabled", wlanState);
}



function connectToTR064(host, password, callback) {
var tr064 = new tr.TR064();
tr064.initTR064Device(host, 49000, function (err, device) {
if (!err) {
device.startEncryptedCommunication(function (err, sslDev) {
if (!err) {
sslDev.login('dslf-config', password);
callback(sslDev);
}
else {
adapter.log.warn("TR-064 error: " + err);
}
});
}
else {
adapter.log.warn("TR-064 error: " + err);
}
});
}



function getWlanConfig(host, password, callback) {
connectToTR064(host, password, function (sslDev) {
var wlanConfig = sslDev.services["urn:dslforum-org:service:WLANConfiguration:1"];
adapter.log.debug("TR-064: calling GetInfo()");
wlanConfig.actions.GetInfo(function (err, result) {
if (!err) {
adapter.log.debug("TR-064: got result from GetInfo()");
callback(result);
}
else {
adapter.log.warn("TR-064 error: " + err);
}
});
});
}



function setWlanEnabled(host, password, enabled) {
connectToTR064(host, password, function (sslDev) {
var wlanConfig = sslDev.services["urn:dslforum-org:service:WLANConfiguration:1"];
adapter.log.debug("TR-064: calling SetEnable(" + enabled + ")");
wlanConfig.actions.SetEnable({ 'NewEnable': enabled ? 1 : 0 }, function (err, result) {
if (!err) {
adapter.log.debug("TR-064: got result from SetEnable()");
//console.log(result);
}
else {
adapter.log.warn("TR-064 error: " + err);
}
});
});
}



function connectToFritzbox(host) {
clearRealtimeVars(); // IP-Verbindung neu: Realtimedaten werden gelöscht, da ggf. nicht konsistent
var socketBox = net.connect({port: 1012, host: host}, function() {
Expand Down Expand Up @@ -1124,7 +1216,21 @@ function connectToFritzbox(host) {
socketBox.on('end', restartConnection);

socketBox.on('data', parseData); // Daten wurden aus der Fritzbox empfangen und dann in der Funktion parseData verarbeitet


if (adapter.config.fritzboxPassword && adapter.config.fritzboxPassword.length) {
adapter.log.info("try to connect to TR-064: " + host + ":49000");

// TR-064-Verbindung bereitstellen (und überprüfen)
getWlanConfig(host, adapter.config.fritzboxPassword, function (result) {
adapter.log.info("Successfully connected to TR-064");
handleWLANConfiguration(result);
intervalTR046 = setInterval(function () {
getWlanConfig(host, adapter.config.fritzboxPassword, function (result) {
handleWLANConfiguration(result);
});
}, 10000);
});
}
}


Expand All @@ -1137,6 +1243,7 @@ function main() {
// Zustandsänderungen innerhalb der ioBroker fritzbox-Adapterobjekte überwachen
// adapter.subscribeForeignStates("node-red.0.fritzbox.*); // Beispiel um Datenpunkte anderer Adapter zu überwachen
adapter.subscribeStates('calls.missedCount');
adapter.subscribeStates('wlan.enabled');

// TODO: IP-Prüfung bringt nichts, da auch Hostnamen / DNS erlaubt sind & eine Prüfung auf der Admin-Webseite ist sinnvoller
var validIP = /^((25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])$/;
Expand Down
12 changes: 8 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "iobroker.fritzbox",
"description": "Verarbeitet die Callmontiorinformationen der AVM Fritzbox.",
"version": "0.2.1",
"version": "0.3.0",
"author": {
"name": "ruhr",
"email": "ruhr@digheim.de"
Expand All @@ -10,6 +10,10 @@
{
"name": "ruhr",
"email": "ruhr@digheim.de"
},
{
"name": "UncleSam",
"email": "samuel.weibel@gmail.com"
}
],
"homepage": "https://github.com/ruhr70/ioBroker.fritzbox",
Expand All @@ -20,7 +24,8 @@
"url": "https://github.com/ruhr70/ioBroker.fritzbox"
},
"dependencies": {
"xml2js": "^0.4.9"
"xml2js": "^0.4.9",
"tr-064": "~0.2.0"
},
"devDependencies": {
"grunt": "~0.4.5",
Expand All @@ -36,6 +41,5 @@
"bugs": {
"url": "https://github.com/ruhr70/ioBroker.fritzbox/issues"
},
"main": "main.js",
"license": "MIT"
"main": "main.js"
}