diff --git a/AUTARCO1.plugin.txt b/AUTARCO1.plugin.txt new file mode 100644 index 0000000..e964e02 --- /dev/null +++ b/AUTARCO1.plugin.txt @@ -0,0 +1,114 @@ +///////// 1.0.0 +///////// AUTARCO1 ///////////// +///////// Plugin to extract Autarco Solar data for Toon ///////////// +///////// By frankjansenrsn-bit ///////////// +// +// Settings mapping: +// userName = Autarco e-mailadres +// passWord = Autarco wachtwoord +// siteid = Site ID (te vinden in de URL: my.autarco.com/site/) +// apiKey = Inverter ID (serienummer omvormer) + +var _autarcoSessionValid = false; +var _autarcoLastLogin = 0; +var LOGIN_INTERVAL_MS = 3600000; // herlogin elke 60 minuten + +function getSolarData(passWord, userName, apiKey, siteid, urlString, totalValue) { + var now = new Date().getTime(); + if (_autarcoSessionValid && (now - _autarcoLastLogin) < LOGIN_INTERVAL_MS) { + _fetchPower(passWord, userName, apiKey, siteid, totalValue, false); + } else { + _getLoginToken(passWord, userName, apiKey, siteid, totalValue); + } +} + +function _getLoginToken(passWord, userName, apiKey, siteid, totalValue) { + var http = new XMLHttpRequest(); + http.open("GET", "https://my.autarco.com/auth/login", true); + http.onreadystatechange = function() { + if (http.readyState !== 4) return; + if (http.status === 200) { + var match = http.responseText.match(/name="_token"\s+value="([^"]+)"/); + if (match) { + _doLogin(match[1], passWord, userName, apiKey, siteid, totalValue); + } else { + if (debugOutput) console.log("AUTARCO1: CSRF token niet gevonden"); + parseReturnData(0, totalValue, 0, 0, 0, 0, 0, 0, "error"); + } + } else { + if (debugOutput) console.log("AUTARCO1: login pagina fout " + http.status); + parseReturnData(0, totalValue, 0, 0, 0, 0, 0, http.status, "error"); + } + }; + http.send(); +} + +function _doLogin(csrfToken, passWord, userName, apiKey, siteid, totalValue) { + var http = new XMLHttpRequest(); + http.open("POST", "https://my.autarco.com/auth/login", true); + http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + http.setRequestHeader("Referer", "https://my.autarco.com/auth/login"); + http.onreadystatechange = function() { + if (http.readyState !== 4) return; + if (http.status === 200 || http.status === 302 || http.status === 301) { + _autarcoSessionValid = true; + _autarcoLastLogin = new Date().getTime(); + if (debugOutput) console.log("AUTARCO1: ingelogd"); + _fetchPower(passWord, userName, apiKey, siteid, totalValue, false); + } else { + _autarcoSessionValid = false; + if (debugOutput) console.log("AUTARCO1: inloggen mislukt " + http.status); + parseReturnData(0, totalValue, 0, 0, 0, 0, 0, http.status, "error"); + } + }; + var body = "_token=" + encodeURIComponent(csrfToken) + + "&username=" + encodeURIComponent(userName) + + "&password=" + encodeURIComponent(passWord) + + "&remember=on"; + http.send(body); +} + +function _fetchPower(passWord, userName, apiKey, siteid, totalValue, retried) { + var url = "https://my.autarco.com/api/site/" + siteid + "/inverter/" + apiKey + "/power"; + var http = new XMLHttpRequest(); + http.open("GET", url, true); + http.onreadystatechange = function() { + if (http.readyState !== 4) return; + if (http.status === 200) { + var data = JSON.parse(http.responseText); + var currentPower = data.pv_now || 0; + _fetchEnergy(passWord, userName, apiKey, siteid, currentPower, totalValue, retried); + } else if ((http.status === 401 || http.status === 403) && !retried) { + // Sessie verlopen — opnieuw inloggen + _autarcoSessionValid = false; + _getLoginToken(passWord, userName, apiKey, siteid, totalValue); + } else { + if (debugOutput) console.log("AUTARCO1: power fout " + http.status); + parseReturnData(0, totalValue, 0, 0, 0, 0, 0, http.status, "error"); + } + }; + http.send(); +} + +function _fetchEnergy(passWord, userName, apiKey, siteid, currentPower, totalValue, retried) { + var url = "https://my.autarco.com/api/site/" + siteid + "/inverter/" + apiKey + "/energy"; + var http = new XMLHttpRequest(); + http.open("GET", url, true); + http.onreadystatechange = function() { + if (http.readyState !== 4) return; + if (http.status === 200) { + var data = JSON.parse(http.responseText); + var todayWh = Math.round((data.pv_today || 0) * 1000); + var totalWh = Math.round((data.pv_to_date || 0) * 1000); + if (debugOutput) console.log("AUTARCO1: " + currentPower + "W, vandaag=" + todayWh + "Wh, totaal=" + totalWh + "Wh"); + parseReturnData(currentPower, totalWh, todayWh, 0, 0, 0, 0, http.status, "succes"); + } else if ((http.status === 401 || http.status === 403) && !retried) { + _autarcoSessionValid = false; + _getLoginToken(passWord, userName, apiKey, siteid, totalValue); + } else { + if (debugOutput) console.log("AUTARCO1: energy fout " + http.status); + parseReturnData(currentPower, totalValue, 0, 0, 0, 0, 0, http.status, "error"); + } + }; + http.send(); +}