Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Visualisierung
  4. Daten von Elgris Smart Meter Website nach VIS übernehmen

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.9k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    899

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Daten von Elgris Smart Meter Website nach VIS übernehmen

Geplant Angeheftet Gesperrt Verschoben Visualisierung
2 Beiträge 2 Kommentatoren 781 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • WannseesprinterW Offline
    WannseesprinterW Offline
    Wannseesprinter
    schrieb am zuletzt editiert von Wannseesprinter
    #1

    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.

    elgris_zero_export_inverter_page.jpg

    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

    wendy2702W 1 Antwort Letzte Antwort
    0
    • WannseesprinterW Wannseesprinter

      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.

      elgris_zero_export_inverter_page.jpg

      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

      wendy2702W Offline
      wendy2702W Offline
      wendy2702
      schrieb am zuletzt editiert von
      #2

      @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

      Bitte keine Fragen per PN, die gehören ins Forum!

      Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

      1 Antwort Letzte Antwort
      0
      Antworten
      • In einem neuen Thema antworten
      Anmelden zum Antworten
      • Älteste zuerst
      • Neuste zuerst
      • Meiste Stimmen


      Support us

      ioBroker
      Community Adapters
      Donate

      768

      Online

      32.6k

      Benutzer

      82.2k

      Themen

      1.3m

      Beiträge
      Community
      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
      ioBroker Community 2014-2025
      logo
      • Anmelden

      • Du hast noch kein Konto? Registrieren

      • Anmelden oder registrieren, um zu suchen
      • Erster Beitrag
        Letzter Beitrag
      0
      • Home
      • Aktuell
      • Tags
      • Ungelesen 0
      • Kategorien
      • Unreplied
      • Beliebt
      • GitHub
      • Docu
      • Hilfe