- Home
- Deutsch
- Visualisierung
- Daten von Elgris Smart Meter Website nach VIS übernehmen
Daten von Elgris Smart Meter Website nach VIS übernehmen
-
Hallöchen zusammen,
mein erster Post hier, seid bitte gnädig. Bin mit Begeisterung neues Mitglied der ioBroker Community. Hab einen Raspi 3 samt Elgris Zero Export Smart Meter, der prinzipiell TCP Modbus kann. Ich bekomme darüber auch alle Modbus Parameter soweit übergeben. Jetzt der Knackpunkt:
Der Elgris ist per RS485 mit zwei Wechselrichtern verbunden. Die Werte dieser Wechselrichter zeig er auch brav auf dem internen WebGUI an. Da alles üer RS485 läuft, kann ich Daten nicht ohne Weiteres abzapfen. Bräuchte einen passenden RS485-TCP Hardware Adapter. Diese Werte der Wechselrichter scheinen auch nicht Teil dieser Sunspec 302-Spezifikation, die das Smart Meter können soll. Also muss das anders laufen. Jetzt kommen die Könner dieses Forums zur Geltung
Ich wüsste gerne, wie ich die Werte in den Spalten "Output" und "Energy" abgreifen und in VIS im Widget o.ä. darstellen kann. Ich hoffe, die Codes sind ausreichend.
Hier der HTML Code
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width,initial-scale=1.0" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>ZERO controller | www.elgrispower.com</title> <link href="/css/jquery.dataTables.min.css" type="text/css" rel="stylesheet" /> <link href="/css/style.css" type="text/css" rel="stylesheet" /> </head> <body> <div class="wrapper"> <header> <div class="header"> <div class="container"> <div class="logo"> <a href="/index.shtm"><img src="/images/logo.jpg" alt="Logo" /></img></a> </div> <div class="right-header"> <h2>elgris ZERO</h2> <p id = "firmware_version"></p> <div id = "notification_bar" style="float:right"> <div class="notification"> <img src = '/images/error_small.png' alt="E" title="Errors" ></img> <div id = "errors" class = "errors">: 0</div> </div> <div class = "notification"> <img src = '/images/warning_small.jpg' alt="W" title="Warnings" ></img> <div id = "warnings" class = "errors">: 0</div> </div> <div class = "notification"> <img src = '/images/info_small.png' alt="I" title="Information" ></img> <div id = "info" class = "errors">: 0</div> </div> </div> </div> <div class="clr"></div> </div> </div> </header> <div class="header-menu"> <div class="container"> <div id="nav-trigger"> <span>Menu <img src="images/menu_list.png" class="menu_list" /></img></span> </div> <nav id="nav-main"> <ul> <li><a href="/index.shtm">Home </a></li> <li> <div class="sub-menu"> <span class="sub-menu-span">Settings</span> <div class="sub-menu-content"> <a href="/setting.shtm">General </a> <a href="/inverter.shtm">Inverter </a> <a href="/ecloud.shtm">elgris cloud</a> <a href="/mqtt.shtm">MQTT</a> <a href="/ftp_client.htm">FTP Push</a> </div> </div> </li> <li> <div class="sub-menu"> <span class="sub-menu-span">Monitoring</span> <div class="sub-menu-content"> <a href="/chart.shtm">Datalogger</a> <a href="/live_chart.shtm">Live Chart</a> <a href="/performance.html">Performance</a> </div> </div> </li> </ul> </nav> <nav id="nav-mobile"></nav> </div> </div> <div class="setting"> <div class="container"> <div class="power"> <h1 class="text-center">Inverter Settings</h1> <div class="col-100"> <div class="colum"> <div class="form-group"> <div class="col-30"> <div class="form-box"> </div> </div> <div class="col-30"> <div class="form-box"> <input name="" type="button" class="btn_sub top-25" value="Add Inverter" onclick = "addRow()"/> </div> </div> <div class="col-30"> <input name="" type="submit" class="btn_sub top-25" id="save_settings" value="Save Settings" /> </div> </div> <div class="form-group"> <div id="inverterTableContainer"> <table id = "inverterTable"> <tr> <th>#</th> <th>Brand</th> <th>Type</th> <th>IP address</th> <th>Port/ID</th> <th>Serial number</th> <th>Rated</th> <th>Output</th> <th>Energy</th> <th>Delete</th> <th>Status</th> </tr> </table> </div> </div> </div> </div> </div> </div> </div> <table width="100%" class="display" id="table"></table> <footer> <div class='footer'> <p class='copyright'>copyright © 2004-2019 <a href='http://www.elgrispower.com'>elgris GmbH</a> Germany. All rights reserved.</p> </div> </footer> </div> <script type="text/javascript" src="/js/jquery.min.js"></script> <script type="text/javascript" src="/js/jquery.dataTables.js"></script> <script type="text/javascript" src="/js/settings.js"></script> <script type="text/javascript" src="/js/inverter.js"></script> <script type="text/javascript" src="/js/jquery.jeditable.js"></script> <script type="text/javascript" src="/js/jquery.jeditable.masked.js"></script> <script type="text/javascript" src="/js/jquery.jeditable.charcounter.js"></script> <script type="text/javascript" src="/js/jquery.maskedinput.js"></script> <script type="text/javascript" src="/js/jquery.charcounter.js"></script> </body> </html>
Hier der Javascript-Aufruf der hoffentlich richtigen Sektion
var maxInverters = 5; var UPDATE_FREQUENCY = 1000; // in milliseconds. var noRows = 0; var Brand = "ABB"; var IP_Address = "192.168.1.100"; var Port = 502; var Type = "TCP"; var deleteClicked = false; function get_status(){ $.ajax({ type: 'GET', url: "/get_status", success: function(result) { var i ; var table = document.getElementById('inverterTable'); var jsoobj = JSON.parse(result); var json_noRows = jsoobj['noROWS']; var inverter_array = jsoobj['status']; for ( i = 0 ; i < json_noRows; i++) { if(inverter_array[i] == "ON"){ var Tick_Img = document.createElement("img"); Tick_Img.src = "/images/green.png"; table.rows[i + 1].cells[10].appendChild(Tick_Img); }else if (inverter_array[i] == "OFF"){ var Cross_Img = document.createElement("img"); Cross_Img.src = "/images/error.png"; table.rows[i + 1].cells[10].appendChild(Cross_Img); } else if (inverter_array[i] == "WAR"){ var Cross_Img = document.createElement("img"); Cross_Img.src = "/images/warning.png"; table.rows[i + 1].cells[10].appendChild(Cross_Img); } else if (inverter_array[i] == "LIM"){ var Cross_Img = document.createElement("img"); Cross_Img.src = "/images/limiting.png"; table.rows[i + 1].cells[10].appendChild(Cross_Img); } } }, error: function() { console.log("error"); return; } }); } function get_settings(){ $.ajax({ type: 'GET', url: "/processjson", success: function(result) { var i ; var jsoobj = JSON.parse(result); var json_noRows = jsoobj['noRows']; var data_array = jsoobj['Data']; if(noRows == 0){ for ( i = 0; i< (json_noRows) ;i++ ) { addRow_fromjson(jsoobj['rows'][i]); } for ( i = 0; i< (json_noRows) ;i++ ) { addDataRow_fromjson(data_array[i],i); } }else if(deleteClicked == false){ for ( i = 0; i< (json_noRows) ;i++ ) { addDataRow_fromjson(data_array[i],i); } } //get_status(); if(deleteClicked == false){ setTimeout(function(){ get_settings(); } , UPDATE_FREQUENCY); } }, error: function() { console.log("error"); if(deleteClicked == false){ setTimeout(function(){ get_settings(); } , UPDATE_FREQUENCY); } return; } }); } function get_inverter_settings() { $.ajax({ type: 'GET', url: "/max_inverter", success: function(xml) { var parser = new DOMParser(); var xml_data = parser.parseFromString(xml,"text/xml"); var result = xml_data.getElementsByTagName("p")[0].childNodes[0].nodeValue; maxInverters = Number(result); if(maxInverters) get_settings(); }, // error: if no reply or network error what to display . error: function() { window.alert("Unable to get max number of inverters so used to 5 inverters as default"); maxInverters = 5 ; } }); } function addDataRow_fromjson(jsondatarow,i){ var table = document.getElementById('inverterTable'); table.rows[i + 1].cells[5].innerHTML = jsondatarow['SN']; table.rows[i + 1].cells[6].innerHTML = jsondatarow['MP']; table.rows[i + 1].cells[7].innerHTML = jsondatarow['PO']; table.rows[i + 1].cells[8].innerHTML = jsondatarow['ED']; var status = jsondatarow['STATUS']; while (table.rows[i + 1].cells[10].firstChild) { table.rows[i + 1].cells[10].removeChild(table.rows[i + 1].cells[10].firstChild); } if(status == 1){ var Tick_Img; Tick_Img = document.createElement("img"); Tick_Img.src = "/images/green.png" ; table.rows[i + 1].cells[10].appendChild(Tick_Img); } else if (status == 0 ) { var Cross_Img = document.createElement("img"); Cross_Img.src = "/images/error.png"; table.rows[i + 1].cells[10].appendChild(Cross_Img); } else if (status == 2 ) { var Warn_Img = document.createElement("img"); Warn_Img.src = "/images/warning.png"; table.rows[i + 1].cells[10].appendChild(Warn_Img); } else if (status == 3 ) { var Lim_Img = document.createElement("img"); Lim_Img.src = "/images/limiting.png"; table.rows[i + 1].cells[10].appendChild(Lim_Img); } } $(document).ready(function(){ get_inverter_settings(); }); $("#save_settings").click(function(){ if((noRows <= maxInverters) /*&& noRows*/ ) { var i; var tableRows = []; var tableObject = {"noRows":0,"rows":null}; tableObject.noRows = noRows; if( noRows ){ for ( i = 1 ; i< (noRows + 1) ;i++ ) { tableRows.push({ "Brand":document.getElementById("inverterTable").rows[i].cells[1].innerHTML, "IP":document.getElementById("inverterTable").rows[i].cells[3].innerHTML ? document.getElementById("inverterTable").rows[i].cells[3].innerHTML:"0.0.0.0", "Port":document.getElementById("inverterTable").rows[i].cells[4].innerHTML, }); } } tableObject["rows"] = tableRows; var myJSON = JSON.stringify(tableObject); $.ajax({ type: 'POST', url: "/processjson?", data:myJSON, success: function() { alert("New settings send!"); }, error: function() { alert("Failed!"); return; } }); } }); function addstatus_fromarray(array) { return; } function addRow_fromjson(jsonrow) { var deleteButton = document.createElement("INPUT"); noRows++; deleteButton.setAttribute("type", "image"); deleteButton.setAttribute("src", "/images/delete.png"); deleteButton.setAttribute("class", "delete"); var table = document.getElementById('inverterTable'); var row = table.insertRow(noRows); var cell_0 = row.insertCell(0); var cell_1 = row.insertCell(1); var cell_8 = row.insertCell(2); Â Â var cell_2 = row.insertCell(3); var cell_3 = row.insertCell(4); Â Â var cell_4 = row.insertCell(5); var cell_5 = row.insertCell(6); Â Â var cell_6 = row.insertCell(7); var cell_7 = row.insertCell(8); var cell_9 = row.insertCell(9); var cell_10 = row.insertCell(10); deleteButton.setAttribute("onclick", 'deleteThisRow()'); cell_0.innerHTML = noRows; cell_1.innerHTML = jsonrow['Brand']; cell_1.className = "select"; if(jsonrow['IP'] == '0.0.0.0'){ cell_2.innerHTML = "" ; cell_2.className = "notmasked"; cell_8.innerHTML = "RS485"; }else { cell_2.innerHTML = jsonrow['IP'] ; cell_2.className = "masked"; cell_8.innerHTML = "TCP"; } cell_3.innerHTML = jsonrow['Port']; cell_3.className = "maskedport"; cell_9.appendChild(deleteButton); cell_8.className = "selecttype"; $(".select").editable(null, { type : "select", data : "{'ABB':'ABB','AEconversion':'AEconversion','blueLog':'blueLog','SMADM':'Data Manager','CHINT':'CHINT','DELTA':'DELTA','FRONIUS':'FRONIUS','FIMER':'FIMER','GOODWE':'GOODWE','GROWATT':'GROWATT','HUAWEI':'HUAWEI','KACO':'KACO','KOSTAL':'KOSTAL','REFU':'REFUsol','SMA':'SMA','SCHNEIDER':'SCHNEIDER','SOFAR':'SOFAR','SolarEdge':'SolarEdge','Solis':'Solis','SL1000':'SL1000','SUNGROW':'SUNGROW','SUN2000':'SUN2000','TABUCHI':'TABUCHI','VSN300':'VSN300','VSN700':'VSN700','ZEVER':'ZEVER'}", tooltip : "Brand of inverter", event : "click", onblur : "cancel" }); $(".selecttype").editable(null, { type : "select", data : "{'TCP':'TCP<script>toggleIP("+ noRows +")</script>', 'RS485':'RS485'}", tooltip : "Interface type", event : "click", onblur : "cancel" }); $(".masked").editable(null, { type : "text", tooltip : "Slave ID", event : "click", onblur : "cancel", placeholder : "", }); $(".maskedport").editable(null, { type : "text", tooltip : "Node address", onblur : "cancel", event : "click", placeholder : "" }); $('.delete').click(function () { deleteClicked = true; var parent = $( this ).parent().parent(); var table = document.getElementById('inverterTable'); var row = parent.get( 0 ).rowIndex; if (row > 0) { table.deleteRow(row); noRows--; rearrange_index(); } }); // } } function rearrange_index() { var table = document.getElementById('inverterTable'); for(var i =0 ; i < noRows ; i++) table.rows[i + 1].cells[0].innerHTML = i + 1; } function toggleIP(rowIndex){ var table = document.getElementById('inverterTable'); table.rows[rowIndex].cells[2].onchange = function(){ if(this.childNodes[0].childNodes[0].value == "RS485"){ this.parentNode.cells[3].classList.remove('masked'); this.parentNode.cells[4].innerHTML = 1; this.parentNode.deleteCell(3); this.parentNode.insertCell(3); this.parentNode.cells[3].innerHTML = ""; this.parentNode.cells[3].className = "notmasked"; }else { this.parentNode.cells[3].classList.remove('notmasked'); this.parentNode.deleteCell(3); this.parentNode.insertCell(3); this.parentNode.cells[3].innerHTML = IP_Address; this.parentNode.cells[3].className = "masked"; this.parentNode.cells[4].innerHTML = 502; $(".masked").editable(null, { type : "text", tooltip : "Ethernet address", event : "click", onblur : "cancel" }); } }; } function addRow() { if(noRows < maxInverters) { var deleteButton = document.createElement("INPUT"); noRows++; deleteButton.setAttribute("type", "image"); deleteButton.setAttribute("src", "/images/delete.png"); deleteButton.setAttribute("class", "delete"); var table = document.getElementById('inverterTable'); var row = table.insertRow(noRows); var cell_0 = row.insertCell(0); var cell_1 = row.insertCell(1); var cell_8 = row.insertCell(2); Â Â var cell_2 = row.insertCell(3); var cell_3 = row.insertCell(4); Â Â var cell_4 = row.insertCell(5); var cell_5 = row.insertCell(6); Â Â var cell_6 = row.insertCell(7); var cell_7 = row.insertCell(8); var cell_9 = row.insertCell(9); var cell_10 = row.insertCell(10); cell_0.innerHTML = noRows; cell_1.innerHTML = Brand; cell_1.className = "select"; cell_2.innerHTML = IP_Address; cell_2.className = "masked"; cell_3.innerHTML = Port; cell_3.className = "maskedport"; cell_9.appendChild(deleteButton); cell_8.className = "selecttype"; cell_8.innerHTML = Type; $(".select").editable(null, { type : "select", data : "{'ABB':'ABB','AEconversion':'AEconversion','blueLog':'blueLog','SMADM':'Data Manager','CHINT':'CHINT','DELTA':'DELTA','FRONIUS':'FRONIUS','FIMER':'FIMER','GOODWE':'GOODWE','GROWATT':'GROWATT','HUAWEI':'HUAWEI','KACO':'KACO','KOSTAL':'KOSTAL','REFU':'REFUsol','SMA':'SMA','SCHNEIDER':'SCHNEIDER','SOFAR':'SOFAR','SolarEdge':'SolarEdge','Solis':'Solis','SL1000':'SL1000','SUNGROW':'SUNGROW','SUN2000':'SUN2000','TABUCHI':'TABUCHI','VSN300':'VSN300','VSN700':'VSN700','ZEVER':'ZEVER'}", tooltip : "Brand of inverter", event : "click", onblur : "cancel" }); $(".selecttype").editable(null, { type : "select", data : "{'TCP':'TCP<script>toggleIP("+ noRows +")</script>', 'RS485':'RS485'}", tooltip : "Interface type", event : "click", onblur : "cancel" }); $(".masked").editable(null, { type : "text", tooltip : "Ethernet address", event : "click", onblur : "cancel", placeholder : "", }); $(".maskedport").editable(null, { type : "text", tooltip : "Node address", onblur : "cancel", event : "click", placeholder : "", }); $('.delete').click(function () { deleteClicked = true; var parent = $( this ).parent().parent(); var table = document.getElementById('inverterTable'); var row = parent.get( 0 ).rowIndex; if (row > 0) { table.deleteRow(row); noRows--; rearrange_index(); } }); } }
Habt schon mal vielen Dank - das ist mir echt viel wert!
Liebe Grüße,
Patrick -
@wannseesprinter Ich persönlich würde ja die Modbus Variante wählen aber vielleicht hilft dir das
https://forum.iobroker.net/topic/51859/parsen-einer-seite/17?_=1647372193943