Ankündigung

Einklappen
Keine Ankündigung bisher.

Hilfe zu Stream-Abfrage

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Hilfe zu Stream-Abfrage

    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:
    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:
    1. 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.
    2. 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...
    Wäre hierbei für jede Hilfe dankbar!

    EDIT:
    Wer vielleicht noch mehr Infos benötigt, hier der Thread zur Entstehung des Bausteins.
    Zuletzt geändert von JonDonSponky; 01.01.2018, 18:09.
    Grüße Tobi


    #2
    Irgendwas in der Richtung vielleicht?

    if (! file_get_contents($url)) {
    $i++;
    if($i >=3){
    _log('FATAL: '.$ip.' ist nicht erreichbar',4);
    $i=0;
    }
    exit();
    }
    $i = 0;

    Kommentar


      #3
      Die undefined offset Fehler bekommst du doch ganz einfach raus, denn wenn das file_get_contents() fehlschlägt, dann darfst du den nachfolgenden Code einfach nicht ausführen. Damit bleibt dann nur noch der Stream Fehler, den du vermutlich nicht verhindern kannst, denn erst wenn er auftritt, weisst du, dass er aufgetreten ist. Ist aber auch nicht wirklich schlimm, denn es ist ja auch ein Fehler.

      Ich leite solche unkritischen Fehler daher in mein Customlog um, d.h. der Fehler geht nicht verloren, aber bewirkt auch nicht, dass der EDOMI Fehlerzähler hochzählt.

      Hier der Code dafür:

      PHP-Code:

      //
      // error_off() : switch off error reporting
      // error_on() : switch on error reporting
      //
      function myErrorHandler($errno$errstr$errfile$errline)
      {
          global 
      $id;
          
      logging($id"File: $errfile | Error: $errno | Line: $errline | $errstr ");
      }

      function 
      error_off()
      {
          
      $error_handler set_error_handler("myErrorHandler");
          
      error_reporting(0);
      }

      function 
      error_on()
      {
          
      restore_error_handler();
          
      error_reporting(E_ALL);

      Vor dem file_get_contents() machst du ein error_off(); und danach ein error_on();
      Im myErrorHandler() musst du den logging Aufruf ggf. anpassen, da dort meine eigene Logging Funktion aufgerufen wird. Hier könntest du auch direkt ein writeToCustomLog() ausführen.

      Kommentar


        #4
        Danke für die Hilfe bzw. Inputs. Werde ich morgen gleich mal ausprobieren!
        Grüße Tobi

        Kommentar

        Lädt...
        X