Hallo liebe Freunde von Homeassistant. Nach dem sehr spannenden Video über die Einbindung seines Bessenbach Wechselrichter habe ich mir vorgenommen eine ähnliche Integration vorzunehmen. Meine 2 BENNING Wechselrichter habe ich 2015 gekauft und diese versorgen mein Mehrfamilienhaus bereits seit 7 Jahren erfolgreich mit PV-Strom. Der Versorger hat einen Stromzähler angebracht, der leider nciht smart ist und das wird sich in den nächsten Jahren auch nicht ändern. Ich möchte aber den PV-Strom im Energie-Dashboard von HA als eigene Entity anzeigen lassen.
…Die Wechselrichter sind über ein lokale HTML erreichbar.
Ich habe es mit Simons Anleitung versucht und kann leider nur Teilerfolge verbuchen … Dabei scheitere ich vermutlich bei der Definition der CSS Selects…
Folgende Rahmenbedingungen liegen vor:
2 Benning Wechselrichter die über die lokale IP-Adresse: 192.168.1.21 und 192.198.1.2 erreichbar sind. Auch ohne Login kann man 1 Übersichtsseite und 2 Unterseiten mit AC und DC Daten anzeigen lassen.
Eventuell wären weitere Daten über das Portal von Benning über die Cloud erreichbar: https://www.portal.benning-solar.com/ …was ich aber nicht bevorzuge, da ich den Kontakt mit der Cloud nur wenn unbedingt notwendig verwenden möchte.
…das sieht dann so aus:
Ich habe folgende Methoden versucht:
- manuelle Konfiguration in der configuration.yaml
sowohl mit multiscrape: als auch mit der Standard Version von scrape: - Eingabe über die Standard Integration “Scrape” mittels GUI von “Web scrape”
Das Ergebnis bis dato:
Ich kann die 2. Tabelle auslesen und diesen Sensoren/ Attribute zuordnen … Allerdings nur die ersten 5 Werte, und der Parameter “Solar Portal letzte Übertragung” schaffe ich nicht auszulesen …
Aber viel Wichtiger sind die Werte der ersten Tabelle wie z.B.:
Zum bessere Nachvollziehen kann ich hier noch die HTML des Wechselrichters hochladen:
die Übersichtsseite:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<title>BENNING-01 TLS 13.3 - Inverter Info</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="BENNING-01%20TLS%2013.3%20-%20Inverter%20Info-Dateien/style.css">
<link rel="Stylesheet" type="text/css" href="BENNING-01%20TLS%2013.3%20-%20Inverter%20Info-Dateien/jquery-ui.custom.css">
<link rel="shortcut icon" href="http://192.168.1.21/favicon.ico" type="image/x-icon">
</head>
<body style="">
<!--[if lte IE 6]>
<div id="ie-message">
Ihr Browser is veraltet, bitte updaten Sie ihn. Wir empfehlen die Nutzung von <a href="http://www.getfirefox.com" target="_new">Mozilla Firefox</a>.
Einige Ansichten und Funktionen werden nicht funktionieren.
</div>
<![endif]-->
<script type="text/JavaScript" src="BENNING-01%20TLS%2013.3%20-%20Inverter%20Info-Dateien/jquery.js"></script>
<script type="text/JavaScript" src="BENNING-01%20TLS%2013.3%20-%20Inverter%20Info-Dateien/jqueryBlockUi.js"></script>
<script type="text/JavaScript" src="BENNING-01%20TLS%2013.3%20-%20Inverter%20Info-Dateien/jquery-ui.custom.js"></script>
<script type="text/JavaScript" src="BENNING-01%20TLS%2013.3%20-%20Inverter%20Info-Dateien/benning.js"></script>
<script language="javascript" type="text/javascript" src="BENNING-01%20TLS%2013.3%20-%20Inverter%20Info-Dateien/gauge.min.js"></script>
<script language="javascript" type="text/javascript" src="BENNING-01%20TLS%2013.3%20-%20Inverter%20Info-Dateien/jquery.gauge.min.js"></script>
<script language="javascript" type="text/JavaScript" src="BENNING-01%20TLS%2013.3%20-%20Inverter%20Info-Dateien/jquery.flot.min.js"></script>
<script language="javascript" type="text/javascript" src="BENNING-01%20TLS%2013.3%20-%20Inverter%20Info-Dateien/jquery.flot.resize.min.js"></script>
<script language="javascript" type="text/javascript" src="BENNING-01%20TLS%2013.3%20-%20Inverter%20Info-Dateien/jquery.flot.crosshair.min.js"></script>
<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="js/excanvas.min.js"></script><![endif]-->
<script type="text/JavaScript">
window.onerror = function() {
location.reload();
}
function initPageOnLoad()
{
initGauge();
initTableValues();
plotDayData();
$("#column1,#column2").sortable({
connectWith: "#column1,#column2",
handle: '.WidgetHeader',
opacity: 0.6
});
$("#column1,#column2").disableSelection();
// reload page every minute
setTimeout( "window.location.reload();", 60*1000 );
}
function initGauge()
{
var optionsAc = {
value: 0,
colorOfCenterCircleFill: "#5E7796",
colorOfCenterCircleStroke: "#5E7796",
colorOfPointerFill: "#7eb1cd",
colorOfPointerStroke: "#5E7796",
label: 'AC Leistung',
unitsLabel: 'W',
min: 0,
max: 13000
};
$("#gaugeAcPower").gauge( optionsAc );
var acPowerTotal = 0;
$("#gaugeAcPower").gauge('setValue', acPowerTotal );
$("#tableAcPowerTotal").text( acPowerTotal.toFixed() + ' W' );
var optionsTemp = {
value: 0,
colorOfCenterCircleFill: "#5E7796",
colorOfCenterCircleStroke: "#5E7796",
colorOfPointerFill: "#7eb1cd",
colorOfPointerStroke: "#5E7796",
label: 'Temperatur',
unitsLabel: '°C',
min: -20,
max: 100
};
$("#gaugeTemp").gauge( optionsTemp );
$("#gaugeTemp").gauge('setValue', 0.0 );
}
function OutputNumber_fixed_and_Unit(tag, val, unit)
{
var tofixedval = 0;
switch(unit)
{
case 'W':
tofixedval = 0;
break;
case 'kWh':
tofixedval = 2;
break;
case '%':
tofixedval = 0;
break;
default:
break;
}
$(tag).html( val.toFixed(tofixedval) + ' ' + unit );
}
function initTableValues()
{
var eTotal = 116476728;
var remunerationFactor = 0.1592;
var currency = "CHF";
var revenue = (eTotal * 0.001 * remunerationFactor).toFixed() + " " + currency;
$("#revenueVal").text( revenue );
var co2saving = (eTotal * 0.001 * 0.0007).toFixed(2) + " t";
$("#co2_savings").text( co2saving );
var timeNow = 1698364427;
var timeMidnight = new Date( timeNow * 1000 );
timeMidnight.setHours(0,0,0);
// portal submit time
var lastSubmitTime = new Date( 1698363600 * 1000 );
var lastSubmitMonth = lastSubmitTime.getMonth() + 1;
var lastSubmitDay = lastSubmitTime.getDate();
var lastSubmitYear = lastSubmitTime.getFullYear();
// slice to force two digits..
var lastSubmitMinutes = String( '00'+lastSubmitTime.getUTCMinutes() ).slice(-2);
var lastSubmitHours = String( '00'+lastSubmitTime.getUTCHours() ).slice(-2);
var lastSubmitSeconds = String( '00'+lastSubmitTime.getUTCSeconds() ).slice(-2);
if( lastSubmitYear > 1970)
{
$( "#lastTransmissionTime" ).html( lastSubmitDay + "." + lastSubmitMonth + "." + lastSubmitYear + " " + lastSubmitHours + ":" + lastSubmitMinutes + ":" + lastSubmitSeconds);
}
else
{
$( "#lastTransmissionTime" ).html( "niemals " );
}
OutputNumber_fixed_and_Unit("#e_today", 16.019, 'kWh');
OutputNumber_fixed_and_Unit("#tableAcPowerTotal", 0, 'W');
$("#feedInOperatingHours").text( (34248.480).toFixed() + ' ' + 'h' );
$("#e_totalval").text( (116476.734).toFixed() + ' ' + 'kWh' );
}
function plotDayData()
{
// get the data for this OID
//var endTime = new Date();
var endTime = 1698364427 * 1000; // now
// get metadata
var entryUiText = "AC Power";
var entryScalingFactor = 1.0;
var entryUnit = "W";
var dataArrayDay = [];
var jsonDataArray = getHistoryForOID( 11365,
// (endTime.getTime()/1000)-(24*3600), endTime.getTime()/1000 );
(endTime/1000)-(24*3600), endTime/1000 );
for( var i = 0; i < jsonDataArray.length ; i++ )
{
dataArrayDay.push( [ (jsonDataArray[i].time * 1000) , (jsonDataArray[i].value*entryScalingFactor) ] );
}
var seriesDay = {
label: entryUiText+ " ["+entryUnit +"]",
color: "#5E7796",
fill: true,
fillColor: "#C4CFDB",
data: dataArrayDay
};
var showBarNotLines = false;
if( dataArrayDay.length == 1 )
{
showBarNotLines = true;
}
else
{
showBarNotLines = false;
}
var optionsDay = {
series:
{
bars: { show: showBarNotLines, fill: true, fillColor: "#C4CFDB" },
lines: { show: !showBarNotLines, fill: true, fillColor: "#C4CFDB" },
points: { show: false, radius: 1 }
},
legend:
{
show: true, // show a legend,
labelFormatter: null, // no specific formatting of the label
labelBoxBorderColor: "#CCCCCC",
noColumns: 1, // one column
position: "nw",
margin: 2,
backgroundColor: null, // transparent
backgroundOpacity: 0.5, // 0.0 to 1.0
container: null// or jQuery object/DOM element/jQuery expression
},
xaxis:
{
mode: "time",
minTickSize: [1, "hour"],
timeformat: "%H:%M h<br>%0d.%0m"
},
grid:
{
hoverable: true,
autoHighlight: false
}
};
plotDay = $.plot($("#chart_plot_day"), [ seriesDay ], optionsDay );
legends = $("#chart_plot_day .legendLabel");
legends.each(function () {
// fix the widths so they don't jump around
$(this).css('width', $(this).width());
});
}
</script>
<div id="PageContainer" style="display: block;">
<!-- first line: header -->
<!-- open header -->
<div id="Header">
<h1>
BENNING-01 TLS 13.3
</h1>
<a href="http://www.portal.benning-solar.com/"> <img src="BENNING-01%20TLS%2013.3%20-%20Inverter%20Info-Dateien/logo.jpg" alt="logo"></a>
</div>
<!-- close header -->
<div id="MenuAndContent">
<!-- Navigation menu -->
<div id="Menu">
<ul id="NavMenu">
<!-- open menu -->
<li class="NavGroupName">Betriebsdaten</li>
<li>
<ul>
<a href="http://192.168.1.21/Dashboard.htm"><li>Übersicht</li></a>
<a href="http://192.168.1.21/MeasurementsInput.htm"><li>DC Eingang</li></a>
<a href="http://192.168.1.21/MeasurementsOutput.htm"><li>AC Ausgang</li></a>
<a href="http://192.168.1.21/Archive.htm"><li>Verlauf</li></a>
</ul>
</li>
<li class="NavGroupName">Sitzung</li>
<li>
<ul>
<a href="http://192.168.1.21/Login.htm"><li>Anmelden</li></a>
</ul>
</li>
</ul>
<!-- close menu -->
</div> <!-- id="Menu" -->
<div id="ContentAndBreadcrumb">
<div id="BreadcrumbNav">
Betriebsdaten > Übersicht
</div> <!-- id=BreadcrumbNav -->
<div id="Content">
<div id="column1" class="ui-sortable">
<div class="Widget">
<div class="WidgetHeader">Wechselrichter</div>
<div class="WidgetBody">
<table class="dashboardTable">
<tbody>
<tr><td>AC Leistung</td>
<td id="tableAcPowerTotal">0 W</td></tr>
<tr><td>E heute</td>
<td id="e_today">16.02 kWh</td></tr>
<tr><td>produzierte Gesamtenergie</td>
<td id="e_totalval">116477 kWh</td></tr>
<tr><td>CO2 Einsparung</td>
<td id="co2_savings">81.53 t</td></tr>
<tr><td>Ertrag</td>
<td><span id="revenueVal">18543 CHF</span></td></tr>
<tr><td>Einspeisestunden</td>
<td id="feedInOperatingHours">34248 h</td></tr>
</tbody>
</table>
</div><!-- widget body -->
</div><!-- Widget -->
<div class="Widget">
<div class="WidgetHeader">Letzte 24 Stunden</div>
<div class="WidgetBody">
<div id="chart_plot_day" style="height: 200px; width: 350px; padding: 0px; position: relative;"><canvas class="base" width="350" height="200"></canvas><canvas class="overlay" width="350" height="200" style="position: absolute; left: 0px; top: 0px;"></canvas><div class="tickLabels" style="font-size:smaller"><div class="xAxis x1Axis" style="color:#545454"><div class="tickLabel" style="position:absolute;text-align:center;left:9px;top:176px;width:43px">00:00 h<br>26.10</div><div class="tickLabel" style="position:absolute;text-align:center;left:62px;top:176px;width:43px">04:00 h<br>26.10</div><div class="tickLabel" style="position:absolute;text-align:center;left:115px;top:176px;width:43px">08:00 h<br>26.10</div><div class="tickLabel" style="position:absolute;text-align:center;left:168px;top:176px;width:43px">12:00 h<br>26.10</div><div class="tickLabel" style="position:absolute;text-align:center;left:222px;top:176px;width:43px">16:00 h<br>26.10</div><div class="tickLabel" style="position:absolute;text-align:center;left:275px;top:176px;width:43px">20:00 h<br>26.10</div></div><div class="yAxis y1Axis" style="color:#545454"><div class="tickLabel" style="position:absolute;text-align:right;top:163px;right:328px;width:22px">0</div><div class="tickLabel" style="position:absolute;text-align:right;top:121px;right:328px;width:22px">2000</div><div class="tickLabel" style="position:absolute;text-align:right;top:80px;right:328px;width:22px">4000</div><div class="tickLabel" style="position:absolute;text-align:right;top:38px;right:328px;width:22px">6000</div><div class="tickLabel" style="position:absolute;text-align:right;top:-4px;right:328px;width:22px">8000</div></div></div><div class="legend"><div style="position: absolute; width: 167px; height: 19px; top: 4px; left: 31px; background-color: rgb(255, 255, 255); opacity: 0.5;"> </div><table style="position:absolute;top:4px;left:31px;;font-size:smaller;color:#545454"><tbody><tr><td class="legendColorBox"><div style="border:1px solid #CCCCCC;padding:1px"><div style="width:4px;height:0;border:5px solid #5E7796;overflow:hidden"></div></div></td><td class="legendLabel" style="width: 140px;">AC Power [W]</td></tr></tbody></table></div></div>
</div><!-- widget body -->
</div> <!-- widget -->
</div><!-- column 1-->
<div id="column2" class="ui-sortable">
<div class="Widget">
<div class="WidgetHeader">Information</div>
<div class="WidgetBody">
<table class="dashboardTable">
<tbody>
<tr><td>Status</td>
<td id="sysStatusDisplay">Inaktiv</td></tr>
<tr><td>Name</td>
<td id="sysNameDisplay">BENNING-01 TLS 13.3</td></tr>
<tr><td>Standort</td>
<td id="sysLocationDisplay">Au (SG)</td></tr>
<tr><td>Beschreibung</td>
<td id="sysDescriptionDisplay">Quartier4u Au(SG)</td></tr>
<tr><td>Firmware Version</td>
<td>10069454.28 </td></tr>
<tr><td>Seriennummer</td>
<td>106007229839 </td></tr>
<tr><td>Solar Portal: Letzte erfolgreiche Übertragung</td>
<td id="lastTransmissionTime">27.10.2023 23:40:00</td></tr>
</tbody>
</table>
</div><!-- widget body -->
</div> <!-- widget -->
<div class="Widget">
<div class="WidgetHeader">Leistungsdaten</div>
<div class="WidgetBody" style="height: 140px;">
<canvas id="gaugeAcPower" width="130" height="130"></canvas>
<canvas id="gaugeTemp" width="130" height="130"></canvas>
</div>
</div> <!-- WidgetBody -->
</div> <!-- Widget -->
</div> <!-- column 2-->
</div><!-- id=Content -->
</div> <!-- id="ContentAndBreadcrumb" -->
</div> <!-- id="MenuAndContent" -->
<div id="Footer">
Copyright (C) Benning GmbH 2015. Alle Rechte vorbehalten.
</div> <!-- id=Footer -->
<!--[if IE]>
<script>
$('div#Content tr:nth-child(even)').addClass('evenDts');
$('div#Content input[type="file"]').addClass('firmware');
</script>
<![endif]-->
<!-- id=PageContainer -->
</body></html>
…hier die1. Unterseite mit DC Daten:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>BENNING-01 TLS 13.3 - aktuelle Messwerte</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
<link rel="Stylesheet" type="text/css" href="css/JQueryUI/jquery-ui.custom.css" />
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
</head>
<body>
<!--[if lte IE 6]>
<div id="ie-message">
Ihr Browser is veraltet, bitte updaten Sie ihn. Wir empfehlen die Nutzung von <a href="http://www.getfirefox.com" target="_new">Mozilla Firefox</a>.
Einige Ansichten und Funktionen werden nicht funktionieren.
</div>
<![endif]-->
<script type="text/JavaScript" src="js/jquery.js"></script>
<script type="text/JavaScript" src="js/jqueryBlockUi.js"></script>
<script type="text/JavaScript" src="js/jquery-ui.custom.js"></script>
<script type="text/JavaScript" src="js/benning.js"></script>
<script language="javascript" type="text/javascript" src="js/gauge.min.js"></script>
<script language="javascript" type="text/javascript" src="js/jquery.gauge.min.js"></script>
<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="js/excanvas.min.js"></script><![endif]-->
<script type="text/JavaScript">
var showMpp1 = false;
var showMpp2 = false;
var showMpp3 = false;
var channelToUpdate = 0;
function initPageOnLoad()
{
var wiringMode = 0;
switch( wiringMode )
{
default:
case 0:
showMpp1 = true;
showMpp2 = true;
showMpp3 = true;
$('table.contentTable tbody tr').filter(":visible").filter(":odd").css("background-color", "#C4CFDB");
$('table.contentTable tbody tr').filter(":visible").filter(":even").css("background-color","#FFFFFF");
break;
case 1:
showMpp1 = true;
showMpp2 = false;
showMpp3 = true;
$("#MPP2_ROW_U").hide();
$("#MPP2_ROW_I").hide();
$("#MPP2_ROW_P").hide();
$('table.contentTable tbody tr').filter(":visible").filter(":odd").css("background-color", "#C4CFDB");
$('table.contentTable tbody tr').filter(":visible").filter(":even").css("background-color","#FFFFFF");
break;
case 2:
showMpp1 = true;
showMpp2 = false;
showMpp3 = false;
$("#MPP2_ROW_U").hide();
$("#MPP2_ROW_I").hide();
$("#MPP2_ROW_P").hide();
$("#MPP3_ROW_U").hide();
$("#MPP3_ROW_I").hide();
$("#MPP3_ROW_P").hide();
$('table.contentTable tbody tr').filter(":visible").filter(":odd").css("background-color", "#C4CFDB");
$('table.contentTable tbody tr').filter(":visible").filter(":even").css("background-color","#FFFFFF");
break;
}
var numTrackers = 3;
switch( numTrackers )
{
case 1: // 1 Tracker
showMpp2 = false;
showMpp3 = false;
$("#MPP2_ROW_U").hide();
$("#MPP2_ROW_I").hide();
$("#MPP2_ROW_P").hide();
$("#MPP3_ROW_U").hide();
$("#MPP3_ROW_I").hide();
$("#MPP3_ROW_P").hide();
break;
case 2: // 2 Trackers
showMpp3 = false;
$("#MPP3_ROW_U").hide();
$("#MPP3_ROW_I").hide();
$("#MPP3_ROW_P").hide();
break;
case 3:
default:
// hide nothing
break;
}
$('table.contentTable tbody tr').filter(":visible").filter(":odd").css("background-color", "#C4CFDB");
$('table.contentTable tbody tr').filter(":visible").filter(":even").css("background-color","#FFFFFF");
initGauges();
reloadPage();
$("#MPP_TOT_P").html( (0).toFixed(0) + ' ' + 'W' );
$("#MPP1_P").html( (0).toFixed(0) + ' ' + 'W' );
$("#MPP2_P").html( (0).toFixed(0) + ' ' + 'W' );
$("#MPP3_P").html( (0).toFixed(0) + ' ' + 'W' );
$("#MPP1_U").html( (0.00).toFixed(1) + ' ' + 'V' );
$("#MPP2_U").html( (0.00).toFixed(1) + ' ' + 'V' );
$("#MPP3_U").html( (0.00).toFixed(1) + ' ' + 'V' );
$("#MPP1_I").html( (0.000).toFixed(1) + ' ' + 'A' );
$("#MPP2_I").html( (0.000).toFixed(1) + ' ' + 'A' );
$("#MPP3_I").html( (0.000).toFixed(1) + ' ' + 'A' );
// reload page every 10 minutes
setTimeout( "window.location.reload();", 600*1000 );
}
function initGauges()
{
var options1 = {
value: 0,
colorOfCenterCircleFill: "#5E7796",
colorOfCenterCircleStroke: "#5E7796",
colorOfPointerFill: "#ADBBCA",
colorOfPointerStroke: "#5E7796",
label: 'MPPT 1',
unitsLabel: 'W',
min: 0,
max: 5750.00 * 1.2
};
if( showMpp1 )
{
$("#gaugeMpp1Power").gauge( options1 );
$("#gaugeMpp1Power").gauge('setValue', 0 );
}
var options2 = {
value: 0,
colorOfCenterCircleFill: "#5E7796",
colorOfCenterCircleStroke: "#5E7796",
colorOfPointerFill: "#ADBBCA",
colorOfPointerStroke: "#5E7796",
label: 'MPPT 2',
unitsLabel: 'W',
min: 0,
max: 5750.00 * 1.2
};
if( showMpp2 )
{
$("#gaugeMpp2Power").gauge( options2 );
$("#gaugeMpp2Power").gauge('setValue', 0 );
}
var options3 = {
value: 0,
colorOfCenterCircleFill: "#5E7796",
colorOfCenterCircleStroke: "#5E7796",
colorOfPointerFill: "#ADBBCA",
colorOfPointerStroke: "#5E7796",
label: 'MPPT 3',
unitsLabel: 'W',
min: 0,
max: 3750.00 * 1.2
};
if( showMpp3 )
{
$("#gaugeMpp3Power").gauge( options3 );
$("#gaugeMpp3Power").gauge('setValue', 0 );
}
}
function reloadPage()
{
// silent ajax requests
$("#PageContainer").unbind( "ajaxSend" );
$("#PageContainer").unbind( "ajaxStop" );
$("#PageContainer").unbind( "ajaxError" );
switch( channelToUpdate )
{
case 0:
dbAccessGetAsync( 11400, ajaxResultCallback );
break;
case 1:
dbAccessGetAsync( 11410, ajaxResultCallback );
break;
case 2:
dbAccessGetAsync( 11420, ajaxResultCallback );
break;
case 3:
dbAccessGetAsync( 11395, ajaxResultCallback );
break;
case 4:
dbAccessGetAsync( 11570, ajaxResultCallback );
break;
case 5:
dbAccessGetAsync( 11580, ajaxResultCallback );
break;
case 6:
dbAccessGetAsync( 11590, ajaxResultCallback );
break;
case 7:
dbAccessGetAsync( 11340, ajaxResultCallback );
break;
case 8:
dbAccessGetAsync( 11350, ajaxResultCallback );
break;
case 9:
dbAccessGetAsync( 11360, ajaxResultCallback );
channelToUpdate = -1;
break;
default:
channelToUpdate = 0;
break;
}
setTimeout( "reloadPage();", 1000 );
}
function ajaxResultCallback( data )
{
switch( data.oid )
{
case 11400:
$("#gaugeMpp1Power").gauge('setValue', parseInt(data.val) );
$("#MPP1_P").html( (data.val*data.factor).toFixed(0) + ' ' + data.unit );
break;
case 11410:
$("#gaugeMpp2Power").gauge('setValue', parseInt(data.val) );
$("#MPP2_P").html( (data.val*data.factor).toFixed(0) + ' ' + data.unit );
break;
case 11420:
$("#gaugeMpp3Power").gauge('setValue', parseInt(data.val) );
$("#MPP3_P").html( (data.val*data.factor).toFixed(0) + ' ' + data.unit );
break;
case 11395:
$("#MPP_TOT_P").html( (data.val*data.factor).toFixed(0) + ' ' + data.unit );
break;
case 11570:
$("#MPP1_U").html( (data.val*data.factor).toFixed(1) + ' ' + data.unit );
break;
case 11580:
$("#MPP2_U").html( (data.val*data.factor).toFixed(1) + ' ' + data.unit );
break;
case 11590:
$("#MPP3_U").html( (data.val*data.factor).toFixed(1) + ' ' + data.unit );
break;
case 11340:
$("#MPP1_I").html( (data.val*data.factor).toFixed(1) + ' ' + data.unit );
break;
case 11350:
$("#MPP2_I").html( (data.val*data.factor).toFixed(1) + ' ' + data.unit );
break;
case 11360:
$("#MPP3_I").html( (data.val*data.factor).toFixed(1) + ' ' + data.unit );
break;
default:
channelToUpdate = 0;
break;
}
channelToUpdate++;
}
</script>
<div id="PageContainer">
<!-- first line: header -->
<!-- open header -->
<div id="Header">
<h1>
BENNING-01 TLS 13.3
</h1>
<a href="http://www.portal.benning-solar.com"> <img src="images/logo.jpg" alt="logo"></a>
</div>
<!-- close header -->
<div id="MenuAndContent">
<!-- Navigation menu -->
<div id="Menu">
<ul id="NavMenu" >
<!-- open menu -->
<li class="NavGroupName">Betriebsdaten</li>
<li>
<ul>
<a href="Dashboard.htm"><li>Übersicht</li></a>
<a href="MeasurementsInput.htm"><li>DC Eingang</li></a>
<a href="MeasurementsOutput.htm"><li>AC Ausgang</li></a>
<a href="Archive.htm"><li>Verlauf</li></a>
</ul>
</li>
<li class="NavGroupName">Sitzung</li>
<li>
<ul>
<a href="Login.htm"><li>Anmelden</li></a>
</ul>
</li>
</ul>
<!-- close menu -->
</div> <!-- id="Menu" -->
<div id="ContentAndBreadcrumb">
<div id="BreadcrumbNav">
Betriebsdaten > DC Eingang
</div> <!-- id=BreadcrumbNav -->
<div id="Content">
<div class="Widget3Gauge">
<div class="WidgetHeader">DC Eingang</div>
<div class="WidgetBody3Gauge" >
<div>
<canvas id="gaugeMpp1Power" width="125" height="125"></canvas>
<canvas id="gaugeMpp2Power" width="125" height="125"></canvas>
<canvas id="gaugeMpp3Power" width="125" height="125"></canvas>
</div>
</div> <!-- WidgetBody -->
</div> <!-- Widget -->
<table class="contentTable">
<thead>
<tr><th>Bezeichnung</th><th>Wert</th></tr>
</thead>
<tbody>
<tr id="MPP_TOT_ROW_P"><td>DC Leistung gesamt</td>
<td id="MPP_TOT_P"></td></tr>
<tr id="MPP1_ROW_P"><td>DC Leistung MPP Tracker 1</td>
<td id="MPP1_P"></td></tr>
<tr id="MPP2_ROW_P"><td>DC Leistung MPP Tracker 2</td>
<td id="MPP2_P"></td></tr>
<tr id="MPP3_ROW_P"><td>DC Leistung MPP Tracker 3</td>
<td id="MPP3_P"></td></tr>
<tr id="MPP1_ROW_U"><td>MPP Tracker 1 DC Spannung</td>
<td id="MPP1_U"></td></tr>
<tr id="MPP2_ROW_U"><td>MPP Tracker 2 DC Spannung</td>
<td id="MPP2_U"></td></tr>
<tr id="MPP3_ROW_U"><td>MPP Tracker 3 DC Spannung</td>
<td id="MPP3_U"></td></tr>
<tr id="MPP1_ROW_I"><td>DC Strom MPP Tracker 1</td>
<td id="MPP1_I"></td></tr>
<tr id="MPP2_ROW_I"><td>DC Strom MPP Tracker 2</td>
<td id="MPP2_I"></td></tr>
<tr id="MPP3_ROW_I"><td>DC Strom MPP Tracker 3</td>
<td id="MPP3_I"></td></tr>
</tbody>
</table>
</div><!-- id=Content -->
</div> <!-- id="ContentAndBreadcrumb" -->
</div> <!-- id="MenuAndContent" -->
<div id="Footer" >
Copyright (C) Benning GmbH 2015. Alle Rechte vorbehalten.
</div> <!-- id=Footer -->
<!--[if IE]>
<script>
$('div#Content tr:nth-child(even)').addClass('evenDts');
$('div#Content input[type="file"]').addClass('firmware');
</script>
<![endif]-->
</div> <!-- id=PageContainer -->
</body>
</html>
…und hier die 2. Unterseite mit AC Messdaten:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>BENNING-01 TLS 13.3 - aktuelle Messwerte</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
<link rel="Stylesheet" type="text/css" href="css/JQueryUI/jquery-ui.custom.css" />
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
</head>
<body>
<!--[if lte IE 6]>
<div id="ie-message">
Ihr Browser is veraltet, bitte updaten Sie ihn. Wir empfehlen die Nutzung von <a href="http://www.getfirefox.com" target="_new">Mozilla Firefox</a>.
Einige Ansichten und Funktionen werden nicht funktionieren.
</div>
<![endif]-->
<script type="text/JavaScript" src="js/jquery.js"></script>
<script type="text/JavaScript" src="js/jqueryBlockUi.js"></script>
<script type="text/JavaScript" src="js/jquery-ui.custom.js"></script>
<script type="text/JavaScript" src="js/benning.js"></script>
<script language="javascript" type="text/javascript" src="js/gauge.min.js"></script>
<script language="javascript" type="text/javascript" src="js/jquery.gauge.min.js"></script>
<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="js/excanvas.min.js"></script><![endif]-->
<script type="text/JavaScript">
// depending on the system type, show 1 or 3 phases
var showL1 = true;
var showL2 = true;
var showL3 = true;
var maxPowerPerPhase = 0;
var channelToUpdate = 0;
function initPageOnLoad()
{
if( 6 == 1 )
{
showL1 = true;
showL2 = false;
showL3 = false;
$("#AC_L2_ROW_P").hide();
$("#AC_L2_ROW_U").hide();
$("#AC_L3_ROW_P").hide();
$("#AC_L3_ROW_U").hide();
maxPowerPerPhase = 13000 ;
$('table.contentTable tbody tr').filter(":visible").filter(":odd").css("background-color","#C4CFDB");
$('table.contentTable tbody tr').filter(":visible").filter(":even").css("background-color","#FFFFFF");
}
else
{
showL1 = true;
showL2 = true;
showL3 = true;
maxPowerPerPhase = 13000 / 3;
}
initGauges();
reloadPage();
// Init table:
$("#AC_TOT_P").html( (0).toFixed(0) + ' ' + 'W' );
$("#AC_L1_P").html( (0).toFixed(0) + ' ' + 'W' );
$("#AC_L2_P").html( (0).toFixed(0) + ' ' + 'W' );
$("#AC_L3_P").html( (0).toFixed(0) + ' ' + 'W' );
$("#AC_L1_U").html( (0.00).toFixed(1) + ' ' + 'V' );
$("#AC_L2_U").html( (0.00).toFixed(1) + ' ' + 'V' );
$("#AC_L3_U").html( (0.00).toFixed(1) + ' ' + 'V' );
$("#AC_L1_I").html( (0.000).toFixed(1) + ' ' + 'A' );
$("#AC_L2_I").html( (0.000).toFixed(1) + ' ' + 'A' );
$("#AC_L3_I").html( (0.000).toFixed(1) + ' ' + 'A' );
// reload page every 10 minutes
setTimeout( "window.location.reload();", 600*1000 );
}
function initGauges()
{
var options1 = {
value: 0,
colorOfCenterCircleFill: "#5E7796",
colorOfCenterCircleStroke: "#5E7796",
colorOfPointerFill: "#ADBBCA",
colorOfPointerStroke: "#5E7796",
label: 'L1',
unitsLabel: 'W',
min: 0,
max: ( maxPowerPerPhase )
};
if( showL1 )
{
$("#gaugeL1Power").gauge( options1 );
$("#gaugeL1Power").gauge('setValue', 0 );
}
var options2 = {
value: 0,
colorOfCenterCircleFill: "#5E7796",
colorOfCenterCircleStroke: "#5E7796",
colorOfPointerFill: "#ADBBCA",
colorOfPointerStroke: "#5E7796",
label: 'L2',
unitsLabel: 'W',
min: 0,
max: maxPowerPerPhase
};
if( showL2 )
{
$("#gaugeL2Power").gauge( options2 );
$("#gaugeL2Power").gauge('setValue', 0 );
}
var options3 = {
value: 0,
colorOfCenterCircleFill: "#5E7796",
colorOfCenterCircleStroke: "#5E7796",
colorOfPointerFill: "#ADBBCA",
colorOfPointerStroke: "#5E7796",
label: 'L3',
unitsLabel: 'W',
min: 0,
max: maxPowerPerPhase
};
if( showL3 )
{
$("#gaugeL3Power").gauge( options3 );
$("#gaugeL3Power").gauge('setValue', 0 );
}
}
function reloadPage()
{
// silent ajax requests
$("#PageContainer").unbind( "ajaxSend" );
$("#PageContainer").unbind( "ajaxStop" );
$("#PageContainer").unbind( "ajaxError" );
switch( channelToUpdate )
{
case 0:
var entry = dbAccessGetAsync( 11365, resultCallback );
break;
case 1:
var entry = dbAccessGetAsync( 11370, resultCallback );
break;
case 2:
var entry = dbAccessGetAsync( 11380, resultCallback );
break;
case 3:
var entry = dbAccessGetAsync( 11390, resultCallback );
break;
case 4:
var entry = dbAccessGetAsync( 11480, resultCallback );
break;
case 5:
var entry = dbAccessGetAsync( 11490, resultCallback );
break;
case 6:
var entry = dbAccessGetAsync( 11500, resultCallback );
break;
case 7:
var entry = dbAccessGetAsync( 11310, resultCallback );
break;
case 8:
var entry = dbAccessGetAsync( 11315, resultCallback );
break;
case 9:
var entry = dbAccessGetAsync( 11320, resultCallback );
break;
default:
channelToUpdate = 0;
break;
}
setTimeout( "reloadPage();", 1000 );
}
function resultCallback( entry )
{
switch( entry.oid )
{
case 11365:
$("#AC_TOT_P").html( (entry.val*entry.factor).toFixed(0) + ' ' + entry.unit );
break;
case 11370:
$("#AC_L1_P").html( (entry.val*entry.factor).toFixed(0) + ' ' + entry.unit );
$("#gaugeL1Power").gauge('setValue', parseInt(entry.val*entry.factor) );
break;
case 11380:
$("#AC_L2_P").html( (entry.val*entry.factor).toFixed(0) + ' ' + entry.unit );
$("#gaugeL2Power").gauge('setValue', parseInt(entry.val*entry.factor) );
break;
case 11390:
$("#AC_L3_P").html( (entry.val*entry.factor).toFixed(0) + ' ' + entry.unit );
$("#gaugeL3Power").gauge('setValue', parseInt(entry.val*entry.factor) );
break;
case 11480:
$("#AC_L1_U").html( (entry.val*entry.factor).toFixed(1) + ' ' + entry.unit );
break;
case 11490:
$("#AC_L2_U").html( (entry.val*entry.factor).toFixed(1) + ' ' + entry.unit );
break;
case 11500:
$("#AC_L3_U").html( (entry.val*entry.factor).toFixed(1) + ' ' + entry.unit );
break;
case 11310:
$("#AC_L1_I").html( (entry.val*entry.factor).toFixed(1) + ' ' + entry.unit );
break;
case 11315:
$("#AC_L2_I").html( (entry.val*entry.factor).toFixed(1) + ' ' + entry.unit );
break;
case 11320:
$("#AC_L3_I").html( (entry.val*entry.factor).toFixed(1) + ' ' + entry.unit );
break;
default:
channelToUpdate = 0;
break;
}
channelToUpdate++;
}
</script>
<div id="PageContainer">
<!-- first line: header -->
<!-- open header -->
<div id="Header">
<h1>
BENNING-01 TLS 13.3
</h1>
<a href="http://www.portal.benning-solar.com"> <img src="images/logo.jpg" alt="logo"></a>
</div>
<!-- close header -->
<div id="MenuAndContent">
<!-- Navigation menu -->
<div id="Menu">
<ul id="NavMenu" >
<!-- open menu -->
<li class="NavGroupName">Betriebsdaten</li>
<li>
<ul>
<a href="Dashboard.htm"><li>Übersicht</li></a>
<a href="MeasurementsInput.htm"><li>DC Eingang</li></a>
<a href="MeasurementsOutput.htm"><li>AC Ausgang</li></a>
<a href="Archive.htm"><li>Verlauf</li></a>
</ul>
</li>
<li class="NavGroupName">Sitzung</li>
<li>
<ul>
<a href="Login.htm"><li>Anmelden</li></a>
</ul>
</li>
</ul>
<!-- close menu -->
</div> <!-- id="Menu" -->
<div id="ContentAndBreadcrumb">
<div id="BreadcrumbNav">
Betriebsdaten > AC Ausgang
</div> <!-- id=BreadcrumbNav -->
<div id="Content">
<div class="Widget3Gauge">
<div class="WidgetHeader">AC Ausgang</div>
<div class="WidgetBody3Gauge" >
<div>
<canvas id="gaugeL1Power" width="125" height="125"></canvas>
<canvas id="gaugeL2Power" width="125" height="125"></canvas>
<canvas id="gaugeL3Power" width="125" height="125"></canvas>
</div>
</div> <!-- WidgetBody -->
</div> <!-- Widget -->
<table class="contentTable">
<thead>
<tr><th>Bezeichnung</th><th>Wert</th></tr>
</thead>
<tbody>
<tr id="AC_TOT_ROW_P"><td>AC Leistung gesamt</td>
<td id="AC_TOT_P"></td></tr>
<tr id="AC_L1_ROW_P"><td>AC Leistung L1</td>
<td id="AC_L1_P"></td></tr>
<tr id="AC_L2_ROW_P"><td>AC Leistung L2</td>
<td id="AC_L2_P"></td></tr>
<tr id="AC_L3_ROW_P"><td>AC Leistung L3</td>
<td id="AC_L3_P"></td></tr>
<tr id="AC_L1_ROW_U"><td>AC Spannung L1</td>
<td id="AC_L1_U"></td></tr>
<tr id="AC_L2_ROW_U"><td>AC Spannung L2</td>
<td id="AC_L2_U"></td></tr>
<tr id="AC_L3_ROW_U"><td>AC Spannung L3</td>
<td id="AC_L3_U"></td></tr>
<tr id="AC_L1_ROW_I"><td>AC Strom L1</td>
<td id="AC_L1_I"></td></tr>
<tr id="AC_L2_ROW_I"><td>AC Strom L2</td>
<td id="AC_L2_I"></td></tr>
<tr id="AC_L3_ROW_I"><td>AC Strom L3</td>
<td id="AC_L3_I"></td></tr>
</tbody>
</table>
</div><!-- id=Content -->
</div> <!-- id="ContentAndBreadcrumb" -->
</div> <!-- id="MenuAndContent" -->
<div id="Footer" >
Copyright (C) Benning GmbH 2015. Alle Rechte vorbehalten.
</div> <!-- id=Footer -->
<!--[if IE]>
<script>
$('div#Content tr:nth-child(even)').addClass('evenDts');
$('div#Content input[type="file"]').addClass('firmware');
</script>
<![endif]-->
</div> <!-- id=PageContainer -->
</body>
</html>
Hier ein Auszug aus meiner Configuratio.yaml:
…das ist der Abschnitt der zum Teil funktioniert:
multiscrape:
######################################################
- name: WR1 Benning
resource: http://192.168.1.21/Dashboard.htm
scan_interval: 60 # jedee minute
log_response: true # nur für Testzwecke
sensor:
- name: "WR1 Wechselrichter"
# select: "sysStatusDisplay"
select: "#column2 > div:nth-child(1) > div:nth-child(2) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)"
# value_template: '{{ value }}'
# Inaktiv
attributes:
- name: "Name"
select: "#sysNameDisplay"
# BENNING-01 TLS 13.3
- name: "Standort"
#select: "#sysLocationDisplay"
select: "#column2 > div:nth-child(1) > div:nth-child(2) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(3) > td:nth-child(2)"
# Au (SG)
- name: "Beschreibung"
select: "#sysDescriptionDisplay"
# Quartier4u Au(SG)
- name: "Firmware Version"
select: "#column2 > div:nth-child(1) > div:nth-child(2) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(5) > td:nth-child(2)"
# 10069454.28
- name: "Seriennummer"
select: "#column2 > div:nth-child(1) > div:nth-child(2) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(6) > td:nth-child(2)"
# 10069454.28
- name: "Solar Portal Letzte Übertragung"
# select: "#lastTransmissionTime"
select: "#column2 > div:nth-child(1) > div:nth-child(2) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(7) > td:nth-child(2)"
# ?????
hier die Version mit Standard Scrape Integration die überhaupt nur teilweise funktioniert:
scrape:
- resource: https://www.home-assistant.io
sensor:
- name: "WEBSCRAPE Current version"
select: ".current-version h1"
- name: "Release Date"
select: ".release-date"
# WR1 Benning
- resource: http://192.168.1.21/Dashboard.htm
# authentication: basic
# username: admin
# password: admin
sensor:
- name: "WR1 AC Leistung"
select: "#tableAcPowerTotal"
- name: "WR1 E heute"
select: "#e_today"
- name: "WR1 produzierte Gesamtenergie"
select: "#e_totalval"
- name: "WR1 CO2 Einsparung"
select: "#co2_savings"
- name: "WR1 Ertrag"
select: "#revenueVal"
- name: "WR1 Einspeisestunden"
select: "#feedInOperatingHours"
- name: "WR1 Status"
select: "sysStatusDisplay"
# value_template: '{{ value }}'
- name: "WR1 Name"
select: "#sysNameDisplay"
- name: "WR1 Standort"
select: "html body div#PageContainer div#MenuAndContent div#ContentAndBreadcrumb div#Content div#column2.ui-sortable div.Widget div.WidgetBody table.dashboardTable tbody tr td#sysLocationDisplay"
- name: "WR1 Beschreibung"
select: "#sysDescriptionDisplay"
- name: "WR1 Firmware Version"
select: "#column2 > div:nth-child(1) > div:nth-child(2) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(5) > td:nth-child(2)"
- name: "WR1 Seriennummer"
select: "#column2 > div:nth-child(1) > div:nth-child(2) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(6) > td:nth-child(2)"
- name: "WR1 Solar Portal Letzte Übertragung"
select: "#lastTransmissionTime"
…ich verzweifle und verstehe vermutlich das Konzept noch nicht … Hilfe willkommen !!!