Erstmal ein gutes neues Jahr! 
Nachdem ich nun seit mehreren Wochen erfolglos versuche meinen Baustein LBS19001340 robuster gegen "Stream-Fehler" zu machen, muss ich mich doch wieder an euch, also kompetentere Programmierer wenden...
In unregelmäßigen Abständen tritt immer wieder folgender Fehler auf:
Nun habe ich meinen Baustein schon mal ein CustomerLog und eine Abfrage (Zeile 120-121) integriert:
Durch den CustomerLog und die Abfrage kann ich jetzt sehen, dass die IP nicht erreichbar ist, soweit so gut.
Nun meine Probleme, die ich nicht gelöst bekomme:
EDIT:
Wer vielleicht noch mehr Infos benötigt, hier der Thread zur Entstehung des Bausteins.

Nachdem ich nun seit mehreren Wochen erfolglos versuche meinen Baustein LBS19001340 robuster gegen "Stream-Fehler" zu machen, muss ich mich doch wieder an euch, also kompetentere Programmierer wenden...
In unregelmäßigen Abständen tritt immer wieder folgender Fehler auf:
Code:
2018-01-01 01:30:28571496?22788Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19001340.php | Fehlercode: 2 | Zeile: 15 | file_get_contents(http://192.168.10.26:3480/data_request?id=sdata): failed to open stream: Connection timed outERROR 2018-01-01 01:30:28572670?22788Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19001340.php | Fehlercode: 8 | Zeile: 20 | Undefined offset: 1ERROR 2018-01-01 01:30:28574197?22788Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19001340.php | Fehlercode: 8 | Zeile: 25 | Undefined offset: 2ERROR 2018-01-01 01:30:28576109?22788Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19001340.php | Fehlercode: 8 | Zeile: 30 | Undefined offset: 1ERROR 2018-01-01 01:30:28577792?22788Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19001340.php | Fehlercode: 8 | Zeile: 35 | Undefined offset: 1ERROR 2018-01-01 01:30:28579478?22788Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19001340.php | Fehlercode: 8 | Zeile: 40 | Undefined offset: 1ERROR 2018-01-01 01:30:28581198?22788Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19001340.php | Fehlercode: 8 | Zeile: 45 | Undefined offset: 1ERROR
Nun habe ich meinen Baustein schon mal ein CustomerLog und eine Abfrage (Zeile 120-121) integriert:
PHP-Code:
###[DEF]###
[name = SonnenBatterie]
[e#1 = Trigger #init=0]
[e#2 IMPORTANT = IP]
[e#3 OPTION = LogLevel #init=0]
[a#1 = SNr. der Batterie]
[a#2 = PV-Leistung]
[a#3 = Verbrauch]
[a#4 = Ladestrom]
[a#5 = Entladestrom]
[a#6 = Ladezustand]
[v#100 = 1.1 ] // Version
[v#101 = 19001340 ] // LBS ID
[v#102 = SonnenBatterie ] // LBS Name
[v#103 = 0 ] // Log Level
###[/DEF]###
###[HELP]###
SonnenBatterie
Dieser Baustein dient zur Abfrage einer SonnenBatterie der Firma https://www.sonnenbatterie.de/. Abgefragt werden die auslesbaren Daten aus der Batterie selber, nicht über deren Homepage bzw. Server.
Ausgelegt ist der Baustein für das Modell SonnenBatterie eco, ob es auch für die "neueren" Modelle funktioniert müsste gestestet werden. Auch könnte man noch mehr Werte auslesen, aber in der ersten Version stelle ich nur die mir geläufigen und vielleicht auch sinnvollen dar.
Wenn aber mehr benöigt werden sollten, kann ich gerne den Baustein updaten.
E1: Trigger
E2: IP Adresse der SonnenBatterie
E3: Log Level (0=none, 1=emergency, 2=alert, 3=critical, 4=error, 5=warning, 6=notice, 7=info, 8=debug)
A1: Seriennummer der Batterie
A2: PV-Leistung
A3: Verbrauch
A4: Ladestrom
A5: Entladestrom
A6: Ladezustand
CHANGELOG:
v1.0: Initial Version
v1.1: CustomLog integriert
###[/HELP]###
###[LBS]###
<?
function LB_LBSID($id) {
if ($E=logic_getInputs($id)) {
if (logic_getState($id)==0) {
if ($E[1]['value']!=0 && $E[1]['refresh']==1) {
logic_setOutput($id,1,0);
logic_setState($id,1);
logic_callExec(LBSID,$id);
}
}
}
}
?>
###[/LBS]###
###[EXEC]###
<?
require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
set_time_limit(15);
sql_connect();
// -------------------------------------------------------------------------------------------------------
function _log($msg, $priority=8)
{
global $id;
global $url;
$E=logic_getInputs($id);
$logLevel = logic_getVar($id,103);
if (is_int($priority) && $priority<=$logLevel && $priority>0){
$logLevelNames = array(
'none',
'emerg',
'alert',
'crit',
'err',
'warning',
'notice',
'info',
'debug'
);
$version = logic_getVar($id,100);
$lbsNo = logic_getVar($id,101);
$logName = logic_getVar($id,102) . ' - LBS'.$lbsNo;
strpos($_SERVER['SCRIPT_NAME'],$lbsNo) ? $scriptname='EXE'.$lbsNo : $scriptname = 'LBS'.$lbsNo;
writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t".$msg);
}
}
// -------------------------------------------------------------------------------------------------------
if ($E=logic_getInputs($id)){
$ip = $E[2]['value'];
logic_setVar($id,103,$E[3]['value']);
}
_log('EXEC started', 7);
$url = "http://".$ip.":3480/data_request?id=sdata";
if (! file_get_contents($url)) {
_log('FATAL: '.$ip.' ist nicht erreichbar',4);
}
$ausgabe = file_get_contents("$url");
// SERIENNUMMER SonnenBatterie
$reg='/serialnumber.*?([0-9\?]+)/';
preg_match($reg,$ausgabe,$data);
logic_setOutput($id,1,$data[1]);
_log('Seriennummer -> '.$data[1], 8);
// PV-Leistung
$reg='/"watts".*?([0-9\-,?\???.]+)/';
preg_match_all($reg,$ausgabe,$data);
logic_setOutput($id,2,$data[1][2]);
_log('PV-Leistung -> '.$data[1][2], 8);
//Verbrauch
$reg='/"watts".*?([0-9\-,?\???.]+)/';
preg_match_all($reg,$ausgabe,$data);
logic_setOutput($id,3,$data[1][1]);
_log('Verbrauch -> '.$data[1][1], 8);
// Ladestrom
$reg='/wattscharge.*?([0-9\-,?\???.]+)/';
preg_match($reg,$ausgabe,$data);
logic_setOutput($id,4,$data[1]);
_log('Ladestrom -> '.$data[1], 8);
// Entladestrom
$reg='/wattsdischarge.*?([0-9\-,?\???.]+)/';
preg_match($reg,$ausgabe,$data);
logic_setOutput($id,5,$data[1]);
_log('Entladestrom -> '.$data[1], 8);
// Ladezustand
$reg='/"soc".*?([0-9\-,?\???.]+)/';
preg_match($reg,$ausgabe,$data);
logic_setOutput($id,6,$data[1]);
_log('Ladezustand -> '.$data[1], 8);
logic_setState($id,0);
_log('EXEC ended', 7);
// -------------------------------------------------------------------------------------------------------
sql_disconnect();
?>
###[/EXEC]###
Durch den CustomerLog und die Abfrage kann ich jetzt sehen, dass die IP nicht erreichbar ist, soweit so gut.
Nun meine Probleme, die ich nicht gelöst bekomme:
- Wenn die IP nicht erreichbar ist, bekomme ich die oben genannten sieben Fehlermeldungen im Fehler-Log, sprich ich würde hier gerne einen "Stopp" in das Skript einbauen, nachdem die Nichterreichbarkeit der IP abgefragt wurde.
- Kann man es irgendwie so programmieren, dass nach z.B. drei erfolglosen Abfragen, erst ein Eintrag in den Fehler-Log stattfindet? Ich möchte möglichst den Fehler-Log nur mit "wirklichen" Problemen belasten...
EDIT:
Wer vielleicht noch mehr Infos benötigt, hier der Thread zur Entstehung des Bausteins.
Kommentar