Antworten
Sep 25, 2017 - 13:56
Die Steuerung funktioniert über Scripte, die sowohl das Login durchführen als auch den Status der Steckdosen ermitteln. Für den Status wird der Web-Output geparsed, es könnte also sein, das bei einer Änderung der Web-Oberfläche das nicht funktioniert oder bei anderen Type des gleichen Herstellers.
1. das Schalten
Generell habe ich das so gelöst, das jede Schaltfläche einen Task im AM auslöst (also 4 Steckdosen x 2 Aktionen)
Dabei übergebe ich als Option 'cte' die Nummer der Steckdose und als 'cmd' das Kommando (0=aus, 1=ein).
Im Task wird das eigentliche Script zum Schalten aufgerufen. Leider kann man aus einem Task meines Wissens nach keine Aufruf-Parameter an ein Script übergeben und speichere das Kommando in einer Systemvariable vom Typ "STRING" zwischen.
Diese Variable wird im Script ausgewertet.
Der aktuelle Zustand des Schalters wird in einer Variable pro Steckdose von Typ "BOOL" gespeichert.
2. die Statusabfrage
die Status-Abfrage ist nicht erforderlich, wenn man nur mit Mediola schaltet, benutzt man aber auch die App oder das Web-GUI muss man den Status zyklisch abfragen. Der Status wird in den in (1) genannten BOOL gespeichert.
3. GUI
In der GUI habe ich dann 4 x 2 Schaltflächen realisiert, dabei ist die ktive Fläche grün (wenn EIN) oder rot (wenn AUS).
Die Schaltflächen lösen einen HTTP-Request in dem Format http://xxx.xxx.xxx.xxx:80/tm/http?cte=1&cmd=1&auth=XXXX aus
Über Statusregeln wird die Einfärnbung realisiert
1. das Schalten
Generell habe ich das so gelöst, das jede Schaltfläche einen Task im AM auslöst (also 4 Steckdosen x 2 Aktionen)
Dabei übergebe ich als Option 'cte' die Nummer der Steckdose und als 'cmd' das Kommando (0=aus, 1=ein).
Im Task wird das eigentliche Script zum Schalten aufgerufen. Leider kann man aus einem Task meines Wissens nach keine Aufruf-Parameter an ein Script übergeben und speichere das Kommando in einer Systemvariable vom Typ "STRING" zwischen.
Diese Variable wird im Script ausgewertet.
// Schalten einer Steckdose der enerGenie Steckdosenleiste (EG-PM2-LAN)
// in der Systemvariable "socket_cmd" ist der Steuerbefehl abgelegt, der von den Ein-/Aus-Tasks gesetzt wird.
// Format: 'cte=': ist die Nummer der Dose (1..4), ist 0 oder 1
// Zugangsdaten
var pm_password = 'pw=xxxx';
var pm_hostname = 'xxx.xxx.xxx.xxx';
var http = require('http');
const doSwitch = function(pm_cmd) {
var login_opt = {
host: pm_hostname,
port: 80,
path: '/login.html',
method: 'POST',
headers: {
'Content-Length': Buffer.byteLength(pm_password)
}
};
callback = function(res) {
var str = '';
res.on('data', function (chunk) {
str += chunk;
});
res.on('end', function () {
var regex = "/.*var sockstates = \\[([01]),([01]),([01]),([01])\\].*/";
var result = str.match(regex);
if (result.length == 5) {
for (var i = 1; i <= 4; i++) {
var v = "socket_status_" + i.toString();
var b = result[i] == 1 ? "on" : "off";
executeDeviceCommand(
"Gateway",
v,
{"value":b}
);
}
}
console.log("status: 1=" + result[1] + " 2=" + result[2] + " 3=" + result[3] + " 4=" + result[4]);
});
}
var req = http.request(login_opt, callback);
req.on('error', function(e) {
console.log('problem with request: ' + e);
});
req.write(pm_password);
req.end();
var cmd_opt = {
host: pm_hostname,
port: 80,
path: '/',
method: 'POST',
headers: {
'Content-Length': Buffer.byteLength(pm_cmd)
}
};
req = http.request(cmd_opt, callback);
req.on('error', function(e) {
console.log('problem with request: ' + e);
});
req.write(pm_cmd);
req.end();
}
getDeviceStatus(
"Gateway",
"socket_cmd",
{"value":"state","options":["off","on"]},
function(err, status) {
err && console.error(err.message);
console.log("socket_cmd=" + status);
if (status.search(/^cte[0-4]=[01]$/) != -1) {
doSwitch(status);
}
}
);
Der aktuelle Zustand des Schalters wird in einer Variable pro Steckdose von Typ "BOOL" gespeichert.
2. die Statusabfrage
die Status-Abfrage ist nicht erforderlich, wenn man nur mit Mediola schaltet, benutzt man aber auch die App oder das Web-GUI muss man den Status zyklisch abfragen. Der Status wird in den in (1) genannten BOOL gespeichert.
// Status der enerGenie Steckdosenleiste (EG-PM2-LAN)
// der Status wird in den 4 Variablen "socket_status_" (
// Zugangsdaten
var pm_password = 'pw=xxx';
var pm_hostname = 'xxx.xxx.xxx.xxx';
var http = require('http');
var login_opt = {
host: pm_hostname,
port: 80,
path: '/login.html',
method: 'POST',
headers: {
'Content-Length': Buffer.byteLength(pm_password)
}
};
callback = function(res) {
var str = '';
res.on('data', function (chunk) {
str += chunk;
});
res.on('end', function () {
var regex = "/.*var sockstates = \\[([01]),([01]),([01]),([01])\\].*/";
var result = str.match(regex);
if (result.length == 5) {
for (var i = 1; i <= 4; i++) {
var v = "socket_status_" + i.toString();
var b = result[i] == 1 ? "on" : "off";
executeDeviceCommand(
"Gateway",
v,
{"value":b}
);
}
}
console.log("status: 1=" + result[1] + " 2=" + result[2] + " 3=" + result[3] + " 4=" + result[4]);
});
}
var req = http.request(login_opt, callback);
req.on('error', function(e) {
console.log('problem with request: ' + e);
});
req.write(pm_password);
req.end();
3. GUI
In der GUI habe ich dann 4 x 2 Schaltflächen realisiert, dabei ist die ktive Fläche grün (wenn EIN) oder rot (wenn AUS).
Die Schaltflächen lösen einen HTTP-Request in dem Format http://xxx.xxx.xxx.xxx:80/tm/http?cte=1&cmd=1&auth=XXXX aus
Über Statusregeln wird die Einfärnbung realisiert
Sep 26, 2017 - 04:04
Wenn man sowieso schon das NEO-Plugin IP-Symcon besitzten sollte, kann man Alternativ auch SymconEGPMSLAN installieren und anschließend neu die Datenpunkte im Gerätemanager in NEO importieren, dann kann man das auch schalten bzw. den Status in NEO visualisieren.
Von
Danke demel für das Teilen. Gute Arbeit. :)
Neuen Kommentar hinzufügen