Skip to content

Instantly share code, notes, and snippets.

@power-guard
Last active June 8, 2020 04:36
Show Gist options
  • Select an option

  • Save power-guard/eb9ec300ce33b7ef18ec317ced081c59 to your computer and use it in GitHub Desktop.

Select an option

Save power-guard/eb9ec300ce33b7ef18ec317ced081c59 to your computer and use it in GitHub Desktop.
Sample implementation of NetEco OpenAPI
/**
* This example demonstrates how to retrieve a list of plants
* from an iManager NetEco server. The username and password
* should be generated by the server administrator in the
* User Management menu.
*
* @author Dan Liberatori <dan.liberatori@power-guard.jp>
*/
const https = require('https');
const axios = require('axios');
// as per NetEco OpenAPI documentation
const httpsAgent = new https.Agent({rejectUnauthorized: false});
const HOST = '127.0.0.1';
const PORT = 27200;
const user = 'username';
const pw = 'password';
const BASEURL = `https://${HOST}:${PORT}/openApi`;
let openApiroarand = null; // authentication token
let sessionCookie = null;
console.log('Starting test...');
login()
.then(handleLogin)
.then(getPlantList)
.then(handlePlantList)
.then(logout)
.then(handleLogout)
.catch((err) => console.error(err));
function login() {
return axios.request({
url: `${BASEURL}/login?userName=${user}&password=${pw}`,
method: 'post',
httpsAgent,
});
}
function handleLogin(res) {
return new Promise((resolve, reject) => {
console.log('Got response from server.');
// get the auth token
const {data} = res;
if (Number(data.errorMsg) !== 0) {
console.error(`The server returned an error code. errorMsg=${data.errorMsg}`);
console.log(res);
reject('Login error.');
return;
}
openApiroarand = data.openApiroarand;
// we also need the JSESSIONID cookie value
const cookies = res.headers['set-cookie'];
for (let cookieString of cookies) {
const cookieArr = cookieString.split(';');
const filtered = cookieArr.filter(x => /^JSESSIONID=/.test(x));
if (filtered.length > 0) {
sessionCookie = filtered[0];
}
}
if (sessionCookie === null) {
console.error('Could not find JSESSIONID cookie.');
console.log(res);
reject('Login error');
return;
}
console.log(`Logged in with auth token '${openApiroarand}' and session cookie '${sessionCookie}'`);
resolve('Logged in.');
});
}
function getPlantList() {
return axios.request({
url: `${BASEURL}/queryPlantList?openApiroarand=${openApiroarand}`,
method: 'post',
httpsAgent,
headers: { Cookie: sessionCookie },
});
}
function handlePlantList(res) {
return new Promise((resolve, reject) => {
console.log('Received plant list response.');
const {data} = res;
const {errorMsg, resultData} = data;
if (errorMsg !== undefined && Number(errorMsg) !== 0) {
console.error('Plant list response contains error.');
console.log(res);
reject('Plant list response contains error.');
return;
}
if (resultData.length > 0) {
const plantList = JSON.parse(resultData);
console.log('Got plant list.');
for (let plant of plantList) {
// totalStringPower
// income
// totalRate
// currentPower
// specificEnergy
// totalEnergy
// plantid
// inverterNum
// co2reduce
// plantName
// dayEnergy
console.log(`${plant.plantid}, ${plant.currentPower}, ${plant.income}`);
}
} else {
console.log('Received empty plant list.');
}
resolve('handlePlantList OK');
});
}
function logout() {
return axios.request({
url: `${BASEURL}/logout?openApiroarand=${openApiroarand}`,
method: 'post',
httpsAgent,
headers: { Cookie: sessionCookie },
});
}
function handleLogout(res) {
return new Promise((resolve, reject) => {
const {data} = res;
const {errorMsg} = data;
if (Number(errorMsg) !== 0) {
console.error('Unable to log out.');
console.log(res);
reject('Unable to log out.');
return;
}
console.log('Logged out successfuly.');
resolve('Logged out OK.');
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment