Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS bleibt hängen

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

    LBS bleibt hängen

    Hallo zusammen,

    basierend auf dem LBS 19000589_Easymeter Q3D habe ich einen LBS für einen Q3S in Benutzung.
    PHP-Code:
    ###[DEF]###
    [name = Easymeter Q3S v0.1 ]

    [e#1 = Autostart #init=1]
    [e#2 = Loglevel #init=8 ]
    [e#3 = Interface #init=/dev/lesekopf1 ]

    [a#1 = Zählerstand Summe kWh]
    [a#2 = Zählerstand Summe kWh genau ]
    [a#3 = Zählerstand Tarif1 kWh]
    [a#4 = Zählerstand Tarif1 kWh genau ]
    [a#5 = Zählerstand Tarif2 kWh]
    [a#6 = Zählerstand Tarif2 kWh genau ]
    [a#7 = L1+L2+L3 W ]
    [a#8 = L1+L2+L3 W genau ]
    [a#9 = Status ]

    [v#1 = 0]

    [v#100 = 0.1 ]
    [v#101 = 19900003 ]
    [v#102 = Easymeter Q3S ]
    [v#103 = 0 ]

    ###[/DEF]###


    ###[HELP]###
    Dieser LBS liest die Daten eines Easymeter Q3S über einen an USB angeschlossenen Lesekopf von Volkszähler.org aus und gibt die Werte zurück.

    E1: Autostart (1=Autostart mit EDOMI, 0=Kein Autostart, benötigt ein Trigger-KO)
    E2: Logging (0-none|1-emerg|2-alert|3-crit|4-err|5-warning|6-notice|7-info|8-debug)
    E3: Interface über das der Zähler angesprochen wird (z.B. /dev/ttyUSB0)

    A1: Zählerstand Summe ganzzahlig
    A2: Zählerstand Summe mit Nachkommastellen
    A3: Zählerstand Tarif1 ganzzahlig
    A4: Zählerstand Tarif1 mit Nachkommastellen
    A5: Zählerstand Tarif2 ganzzahlig
    A6: Zählerstand Tarif2 mit Nachkommastellen
    A7: Nennleistung Summe L1-L3 ganzzahlig
    A8: Nennleistung Summe L1-L3 mit Nachkommastellen
    A9: Status des Zählers

    V1: stellt sicher, dass der LBS Daemon nur einmal gestartet wird

    V100: Version
    V101: LBS Number
    V102: Log file name
    V103: Log level

    Changelog:
    ==========
    v0.1: Erste Version

    ###[/HELP]###


    ###[LBS]###
    <?
    function LB_LBSID($id) {
    $E=getLogicEingangDataAll($id);
    if ($E)
    {
    setLogicElementVar($id,103,$E[2]['value']); //set loglevel to #VAR 103
    if ($E[1]['refresh']==1 && $E[1]['value']==1)
    {
    if (getLogicElementVar($id,1)!=1) // if not started already
    {
    // start daemon
    setLogicElementVar($id,1,1);
    callLogicFunctionExec(LBSID,$id);
    }
    }
    }
    }


    ?>
    ###[/LBS]###


    ###[EXEC]###
    <?php
    require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");

    set_time_limit(0);

    sql_connect();

    function 
    logging($id,$msg$var=NULL$priority=8)
    {
    $E=getLogicEingangDataAll($id);
    $logLevel getLogicElementVar($id,103);
    if (
    is_int($priority) && $priority<=$logLevel && $priority>0)
    {
    $logLevelNames = array('none','emerg','alert','crit','err','warning ','notice','info','debug');
    $version getLogicElementVar($id,100);
    $lbsNo getLogicElementVar($id,101);
    $logName getLogicElementVar($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 (
    is_object($var)) $var get_object_vars($var); // transfer object into array
    if (is_array($var)) // print out array
    {
    writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t================ ARRAY/OBJECT START ================");
    foreach (
    $var as $index => $line)
    writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t".$index." => ".$line);
    writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t================ ARRAY/OBJECT END ================");
    }
    }
    }

    $E=getLogicEingangDataAll($id);
    if (
    $E)
    {
    $interface $E[3]['value'];
    logging($id,'Stromzähler Easymeter Q3S daemon started');

    $fp = @fopen($interface"r");
    if (
    $fp) {
    while (
    getSysInfo(1)>=1)
    {
    $buffer fgets($fp4096);
    if (
    $buffer !== false) {
    logging($id,'Data read: '.$buffer);
    if (
    preg_match('/1\-0\:1\.8\.0\*255/',$buffer)) // Wenn Zeile mit Zählerstand
    {
    if (
    preg_match('/([0-9]*\.[0-9]*)\*kWh/'$buffer$matches))
    {
    $zaehlerstand doubleval($matches[1]);
    logic_setOutput($id,1,intval($zaehlerstand));
    logic_setOutput($id,2,$zaehlerstand);
    }
    }
    elseif (
    preg_match('/1\-0\:1\.8\.1\*255/',$buffer)) // Wenn Zeile mit Zählerstand Tarif1
    {
    if (
    preg_match('/([0-9]*\.[0-9]*)\*kWh/'$buffer$matches))
    {
    $zaehlerstand doubleval($matches[1]);
    logic_setOutput($id,3,intval($zaehlerstand));
    logic_setOutput($id,4,$zaehlerstand);
    }
    }
    elseif (
    preg_match('/1\-0\:1\.8\.2\*255/',$buffer)) // Wenn Zeile mit Zählerstand Tarif2
    {
    if (
    preg_match('/([0-9]*\.[0-9]*)\*kWh/'$buffer$matches))
    {
    $zaehlerstand doubleval($matches[1]);
    logic_setOutput($id,5,intval($zaehlerstand));
    logic_setOutput($id,6,$zaehlerstand);
    }
    }
    elseif (
    preg_match('/1\-0\:1\.7\.0\*255/',$buffer)) // Wenn Zeile mit L1+L2+L3
    {
    if (
    preg_match('/([0-9]*\.[0-9]*)\*W/'$buffer$matches))
    {
    $zaehlerstand doubleval($matches[1]);
    logic_setOutput($id,7,intval($zaehlerstand));
    logic_setOutput($id,8,$zaehlerstand);
    }
    }
    elseif (
    preg_match('/1\-0\:96\.5\.5\*255/',$buffer)) // Wenn Zeile mit Status
    {
    if (
    preg_match('/\(([0-9]*)\)/'$buffer$matches))
    {
    $zaehlerstand doubleval($matches[1]);
    logic_setOutput($id,9,intval($zaehlerstand));
    }
    }
    }
    usleep(100000);
    }
    fclose($fp);
    }
    }

    sql_disconnect();

    ?>
    ###[/EXEC]###
    Leider liefert dieser Baustein nach Edomi-Neustart nur für wenige Tage Werte, dann quittiert er ohne ersichtlichen Grund den Dienst.
    im Log stehen dann nur noch die zuletzt gelesenen Daten, der Status des LBS steht auf 60760775.

    Ich stehe völlig auf dem Schlauch...
    Hat jemand 'ne Idee?

    #2
    BtW., wie kann ich einen LBS (auch von der Konsole) neu starten ohne Edomi neu zu starten?
    Geht das überhaupt?

    Kommentar


      #3
      Da der LBS gerade wieder hängen geblieben ist möchte ich das Thema nochmal hoch holen.
      Der LBS läuft immer nur ein paar Tage (mal 4 Tage, mal 2 Wochen)und quittiert dann ohne ersichtlichen Grund den Dienst. Der Lesekopf liefert immer noch Werte (auf der Konsole überprüft). Es hilft nur ein killen des php-Prozesses und dessen Neustart. Im Log (Level 8) stehen die vom LBS zuletzt empfangenen Werte:
      Code:
      <tr><td>2021-12-18 06:35:40</td><td>534405</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:40</td><td>644794</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:0.0.0*255(0278060760775)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:40</td><td>758058</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:40</td><td>868906</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:0.2.0*255(7.03)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:40</td><td>981853</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:41</td><td>095176</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:1.8.0*255(011939.6229628*kWh)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:41</td><td>221266</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:41</td><td>334945</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:2.8.0*255(000000.7400000*kWh)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:41</td><td>443939</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:41</td><td>550508</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:1.8.1*255(003795.1532006*kWh)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:41</td><td>659955</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:41</td><td>771362</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:1.8.2*255(008144.4697622*kWh)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:41</td><td>887882</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:41</td><td>996614</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:2.8.1*255(000000.2100000*kWh)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:42</td><td>099709</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:42</td><td>203531</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:2.8.2*255(000000.5300095.1532006*kWh)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:42</td><td>307972</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:42</td><td>414278</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:1.8.2*255(008144.4697816*kWh)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:42</td><td>525576</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:42</td><td>633846</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:2.8.1*255(000000.2100000*kWh)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:42</td><td>742482</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:42</td><td>854269</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:2.8.2*255(000000.5300000*kWh)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:42</td><td>968349</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:43</td><td>082034</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:1.7.0*255(000035.05*W)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:43</td><td>203907</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:43</td><td>310185</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:21.7.0*255(000033.32*W)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:43</td><td>415282</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:43</td><td>520844</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:41.7.0*255(000001.73*W)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:43</td><td>636332</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      <tr><td>2021-12-18 06:35:43</td><td>752084</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: 1-0:61.7.0*255(000000.00*W)[LF]</td></tr>
      <tr><td>2021-12-18 06:35:43</td><td>867194</td><td>25794</td><td>debug </td><td>EXE19900003 [v0.2]: Data read: [LF]</td></tr>
      Hat irgendjemand einen Tipp, wie ich dem Problem Herr werden könnte?

      Danke und Gruß,
      Norbert

      Kommentar


        #4
        Zitat von NorbertB Beitrag anzeigen
        Hat irgendjemand einen Tipp, wie ich dem Problem Herr werden könnte?
        Der LBS hat kein Error-Handling.

        Die Verbindung wird vor der Endlosschleife aufgebaut. Wenn sie dann irgendwann mal nen kurzen Aussetzer hat, wird sie nicht wieder neu aufgebaut und der LBS macht nichts mehr.

        Lösung:
        1. Entweder Error-Handling innerhalb der Schleife einbauen, d.h. prüfen ob die Verbindung noch existiert und neu aufbauen falls nicht.
        2. Oder aber den Verbindungsaufbau und -abbau innerhalb der Schleife bei jedem Durchlauf machen. Dann sollte aber die Frequenz der Schleife (akt. 0,1 Sekunden) deutlich verringert werden, d.h. vielleicht auf 3 Sekunden.
        3. Oder eine Restart Funktion einbauen, um durch einen zusätzlichen Eingang den LBS neu starten zu können (dadurch neuer Verbindungsaufbau). Das dann entweder regelmäßig triggern oder aber durch eine Logik (z.B. wenn der LBS 1 Minuten lang keine Daten mehr geliefert hat, falls man das daran feststellen kann.
        Zitat von NorbertB Beitrag anzeigen
        BtW., wie kann ich einen LBS (auch von der Konsole) neu starten ohne Edomi neu zu starten?
        Geht das überhaupt?
        Das geht nur, wenn man eine entsprechende Restart-Funktionalität im LBS implementiert hat (siehe 3.). Ansonsten nur per EDOMI-Restart.

        Kommentar


          #5
          Hallo Andre, vielen Dank für Deine Aufklärung.
          Das leuchtet mir auch soweit ein, übertrifft aber bei weitem meine Möglichkeiten.
          Am sinnvollsten erscheint mir die Integration des Error-Handling (Punkt 1) allerdings würde ich hier Unterstützung benötigen.

          Kommentar


            #6
            Einfacher wäre aber die Variante 2:

            Dazu einfach dass $fp = @fopen($interface, "r"); als ersten Befehl innerhalb der while-Schleife hinter {.
            Und direkt vor den usleep() Befehl das fclose($fp);
            Das usleep dann durch ein sleep(3); ersetzen. Dann würde alle 3 Sekunden ausgelesen. Kannst es natürlich auch mit kleineren Werten testen, evtl. geht das auch.

            Kommentar


              #7
              Hallo Andre,

              danke für die Hilfe!
              Nach den Änderungen bekomme ich folgenden Fehler:
              Code:
              Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19900003.php | Fehlercode: 8 | Zeile: 37 | Undefined variable: fp
              Kannst Du mir nochmal einen Tipp geben?

              Hier nochmal der komplette LBS:
              Code:
              ###[DEF]###
              [name = Easymeter Q3S v0.3 ]
              
              [e#1 = Autostart #init=1]
              [e#2 = Loglevel #init=8 ]
              [e#3 = Interface #init=/dev/lesekopf1 ]
              
              [a#1 = Zählerstand Summe kWh]
              [a#2 = Zählerstand Summe kWh genau ]
              [a#3 = Zählerstand Tarif1 kWh]
              [a#4 = Zählerstand Tarif1 kWh genau ]
              [a#5 = Zählerstand Tarif2 kWh]
              [a#6 = Zählerstand Tarif2 kWh genau ]
              [a#7 = L1+L2+L3 W ]
              [a#8 = L1+L2+L3 W genau ]
              [a#9 = Status ]
              
              [v#1 = 0]
              
              [v#100 = 0.3 ]
              [v#101 = 19900003 ]
              [v#102 = Easymeter Q3S ]
              [v#103 = 0 ]
              
              ###[/DEF]###
              
              
              ###[HELP]###
              Dieser LBS liest die Daten eines Easymeter Q3S über einen an USB angeschlossenen Lesekopf von Volkszähler.org aus und gibt die Werte zurück.
              
              E1: Autostart (1=Autostart mit EDOMI, 0=Kein Autostart, benötigt ein Trigger-KO)
              E2: Logging (0-none|1-emerg|2-alert|3-crit|4-err|5-warning|6-notice|7-info|8-debug)
              E3: Interface über das der Zähler angesprochen wird (z.B. /dev/ttyUSB0)
              
              A1: Zählerstand Summe ganzzahlig
              A2: Zählerstand Summe mit Nachkommastellen
              A3: Zählerstand Tarif1 ganzzahlig
              A4: Zählerstand Tarif1 mit Nachkommastellen
              A5: Zählerstand Tarif2 ganzzahlig
              A6: Zählerstand Tarif2 mit Nachkommastellen
              A7: Nennleistung Summe L1-L3 ganzzahlig
              A8: Nennleistung Summe L1-L3 mit Nachkommastellen
              A9: Status des Zählers
              
              V1: stellt sicher, dass der LBS Daemon nur einmal gestartet wird
              
              V100: Version
              V101: LBS Number
              V102: Log file name
              V103: Log level
              
              Changelog:
              ==========
              v0.1: Erste Version
              v0.2: 1. Versuch der Fehlerbereinigung
              v0.3: 2. Versuch der Fehlerbereinigung
              
              ###[/HELP]###
              
              
              ###[LBS]###
              <?
              function LB_LBSID($id) {
              $E=getLogicEingangDataAll($id);
              if ($E)
              {
              setLogicElementVar($id,103,$E[2]['value']); //set loglevel to #VAR 103
              if ($E[1]['refresh']==1 && $E[1]['value']==1)
              {
              if (getLogicElementVar($id,1)!=1) // if not started already
              {
              // start daemon
              setLogicElementVar($id,1,1);
              callLogicFunctionExec(LBSID,$id);
              }
              }
              }
              }
              
              
              ?>
              ###[/LBS]###
              
              
              ###[EXEC]###
              <?php
              require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
              
              set_time_limit(0);
              
              sql_connect();
              
              function logging($id,$msg, $var=NULL, $priority=8)
              {
              $E=getLogicEingangDataAll($id);
              $logLevel = getLogicElementVar($id,103);
              if (is_int($priority) && $priority<=$logLevel && $priority>0)
              {
              $logLevelNames = array('none','emerg','alert','crit','err','warning ','notice','info','debug');
              $version = getLogicElementVar($id,100);
              $lbsNo = getLogicElementVar($id,101);
              $logName = getLogicElementVar($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 (is_object($var)) $var = get_object_vars($var); // transfer object into array
              if (is_array($var)) // print out array
              {
              writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t================ ARRAY/OBJECT START ================");
              foreach ($var as $index => $line)
              writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t".$index." => ".$line);
              writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t================ ARRAY/OBJECT END ================");
              }
              }
              }
              
              $E=getLogicEingangDataAll($id);
              if ($E)
              {
              $interface = $E[3]['value'];
              logging($id,'Stromzähler Easymeter Q3S daemon started');
              
              if ($fp) {
              while (getSysInfo(1)>=1)
              {
              $fp = @fopen($interface, "r");
              $buffer = fgets($fp, 4096);
              if ($buffer !== false) {
              logging($id,'Data read: '.$buffer);
              if (preg_match('/1\-0\:1\.8\.0\*255/',$buffer)) // Wenn Zeile mit Zählerstand
              {
              if (preg_match('/([0-9]*\.[0-9]*)\*kWh/', $buffer, $matches))
              {
              $zaehlerstand = doubleval($matches[1]);
              logic_setOutput($id,1,intval($zaehlerstand));
              logic_setOutput($id,2,$zaehlerstand);
              }
              }
              elseif (preg_match('/1\-0\:1\.8\.1\*255/',$buffer)) // Wenn Zeile mit Zählerstand Tarif1
              {
              if (preg_match('/([0-9]*\.[0-9]*)\*kWh/', $buffer, $matches))
              {
              $zaehlerstand = doubleval($matches[1]);
              logic_setOutput($id,3,intval($zaehlerstand));
              logic_setOutput($id,4,$zaehlerstand);
              }
              }
              elseif (preg_match('/1\-0\:1\.8\.2\*255/',$buffer)) // Wenn Zeile mit Zählerstand Tarif2
              {
              if (preg_match('/([0-9]*\.[0-9]*)\*kWh/', $buffer, $matches))
              {
              $zaehlerstand = doubleval($matches[1]);
              logic_setOutput($id,5,intval($zaehlerstand));
              logic_setOutput($id,6,$zaehlerstand);
              }
              }
              elseif (preg_match('/1\-0\:1\.7\.0\*255/',$buffer)) // Wenn Zeile mit L1+L2+L3
              {
              if (preg_match('/([0-9]*\.[0-9]*)\*W/', $buffer, $matches))
              {
              $zaehlerstand = doubleval($matches[1]);
              logic_setOutput($id,7,intval($zaehlerstand));
              logic_setOutput($id,8,$zaehlerstand);
              }
              }
              elseif (preg_match('/1\-0\:96\.5\.5\*255/',$buffer)) // Wenn Zeile mit Status
              {
              if (preg_match('/\(([0-9]*)\)/', $buffer, $matches))
              {
              $zaehlerstand = doubleval($matches[1]);
              logic_setOutput($id,9,intval($zaehlerstand));
              }
              }
              }
              fclose($fp);
              sleep(3);
              }
              
              }
              }
              
              sql_disconnect();
              
              ?>
              ###[/EXEC]###

              Kommentar


                #8
                Ist ja logisch
                PHP-Code:
                if ($fp) { while (getSysInfo(1)>=1) { $fp = @fopen($interface"r"); 
                Erst kommt if $fp, und erst danach wird $fp in der whileschleife deklariert

                Kommentar


                  #9
                  Das

                  PHP-Code:
                  if ($fp) { 
                  muss noch mit in die Schleife, d.h. direkt in die Zeile nach dem fopen:

                  PHP-Code:

                  while (getSysInfo(1)>=1) {
                     
                  $fp = @fopen($interface"r");
                     if (
                  $fp) { 
                        
                  $buffer fgets($fp4096); 

                  Und dann eine von den drei }, die hinter dem sleep(3) stehen zwischen fclose() und sleep(3) ziehen:

                  PHP-Code:

                  fclose
                  ($fp);
                  }
                  sleep(3);
                  }

                  Kommentar


                    #10
                    Jetzt kommt zwar keine Fehlermeldung mehr, Daten kommen aber auch nicht...

                    BTW. ein
                    Code:
                    cat /dev/lesekopf1
                    bringt alle 2 Sekunden einen neuen Datensatz.

                    Kommentar


                      #11
                      Am besten nochmal den gesamten PHP Code posten.
                      Und mal das Sleep auf 1 Sekunde reduzieren.

                      Kommentar


                        #12
                        PHP-Code:
                        ###[DEF]###
                        [name = Easymeter Q3S v0.3 ]

                        [e#1 = Autostart #init=1]
                        [e#2 = Loglevel #init=8 ]
                        [e#3 = Interface #init=/dev/lesekopf1 ]

                        [a#1 = Zählerstand Summe kWh]
                        [a#2 = Zählerstand Summe kWh genau ]
                        [a#3 = Zählerstand Tarif1 kWh]
                        [a#4 = Zählerstand Tarif1 kWh genau ]
                        [a#5 = Zählerstand Tarif2 kWh]
                        [a#6 = Zählerstand Tarif2 kWh genau ]
                        [a#7 = L1+L2+L3 W ]
                        [a#8 = L1+L2+L3 W genau ]
                        [a#9 = Status ]

                        [v#1 = 0]

                        [v#100 = 0.3 ]
                        [v#101 = 19900003 ]
                        [v#102 = Easymeter Q3S ]
                        [v#103 = 0 ]

                        ###[/DEF]###


                        ###[HELP]###
                        Dieser LBS liest die Daten eines Easymeter Q3S über einen an USB angeschlossenen Lesekopf von Volkszähler.org aus und gibt die Werte zurück.

                        E1: Autostart (1=Autostart mit EDOMI, 0=Kein Autostart, benötigt ein Trigger-KO)
                        E2: Logging (0-none|1-emerg|2-alert|3-crit|4-err|5-warning|6-notice|7-info|8-debug)
                        E3: Interface über das der Zähler angesprochen wird (z.B. /dev/ttyUSB0)

                        A1: Zählerstand Summe ganzzahlig
                        A2: Zählerstand Summe mit Nachkommastellen
                        A3: Zählerstand Tarif1 ganzzahlig
                        A4: Zählerstand Tarif1 mit Nachkommastellen
                        A5: Zählerstand Tarif2 ganzzahlig
                        A6: Zählerstand Tarif2 mit Nachkommastellen
                        A7: Nennleistung Summe L1-L3 ganzzahlig
                        A8: Nennleistung Summe L1-L3 mit Nachkommastellen
                        A9: Status des Zählers

                        V1: stellt sicher, dass der LBS Daemon nur einmal gestartet wird

                        V100: Version
                        V101: LBS Number
                        V102: Log file name
                        V103: Log level

                        Changelog:
                        ==========
                        v0.1: Erste Version
                        v0.2: 1. Versuch der Fehlerbereinigung
                        v0.3: Datenverbindung wird innerhalb der Schleife auf- und abgebaut.

                        ###[/HELP]###


                        ###[LBS]###
                        <?
                        function LB_LBSID($id) {
                        $E=getLogicEingangDataAll($id);
                        if ($E)
                        {
                        setLogicElementVar($id,103,$E[2]['value']); //set loglevel to #VAR 103
                        if ($E[1]['refresh']==1 && $E[1]['value']==1)
                        {
                        if (getLogicElementVar($id,1)!=1) // if not started already
                        {
                        // start daemon
                        setLogicElementVar($id,1,1);
                        callLogicFunctionExec(LBSID,$id);
                        }
                        }
                        }
                        }


                        ?>
                        ###[/LBS]###


                        ###[EXEC]###
                        <?php
                        require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");

                        set_time_limit(0);

                        sql_connect();

                        function 
                        logging($id,$msg$var=NULL$priority=8)
                        {
                        $E=getLogicEingangDataAll($id);
                        $logLevel getLogicElementVar($id,103);
                        if (
                        is_int($priority) && $priority<=$logLevel && $priority>0)
                        {
                        $logLevelNames = array('none','emerg','alert','crit','err','warning ','notice','info','debug');
                        $version getLogicElementVar($id,100);
                        $lbsNo getLogicElementVar($id,101);
                        $logName getLogicElementVar($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 (
                        is_object($var)) $var get_object_vars($var); // transfer object into array
                        if (is_array($var)) // print out array
                        {
                        writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t================ ARRAY/OBJECT START ================");
                        foreach (
                        $var as $index => $line)
                        writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t".$index." => ".$line);
                        writeToCustomLog($logName,str_pad($logLevelNames[$logLevel],7), $scriptname." [v$version]:\t================ ARRAY/OBJECT END ================");
                        }
                        }
                        }

                        $E=getLogicEingangDataAll($id);
                        if (
                        $E)
                        {
                        $interface $E[3]['value'];
                        logging($id,'Stromzähler Easymeter Q3S daemon started');

                        while (
                        getSysInfo(1)>=1) {
                        $fp = @fopen($interface"r");
                        if (
                        $fp) {
                        $buffer fgets($fp4096);
                        if (
                        $buffer !== false) {
                        logging($id,'Data read: '.$buffer);
                        if (
                        preg_match('/1\-0\:1\.8\.0\*255/',$buffer)) // Wenn Zeile mit Zählerstand
                        {
                        if (
                        preg_match('/([0-9]*\.[0-9]*)\*kWh/'$buffer$matches))
                        {
                        $zaehlerstand doubleval($matches[1]);
                        logic_setOutput($id,1,intval($zaehlerstand));
                        logic_setOutput($id,2,$zaehlerstand);
                        }
                        }
                        elseif (
                        preg_match('/1\-0\:1\.8\.1\*255/',$buffer)) // Wenn Zeile mit Zählerstand Tarif1
                        {
                        if (
                        preg_match('/([0-9]*\.[0-9]*)\*kWh/'$buffer$matches))
                        {
                        $zaehlerstand doubleval($matches[1]);
                        logic_setOutput($id,3,intval($zaehlerstand));
                        logic_setOutput($id,4,$zaehlerstand);
                        }
                        }
                        elseif (
                        preg_match('/1\-0\:1\.8\.2\*255/',$buffer)) // Wenn Zeile mit Zählerstand Tarif2
                        {
                        if (
                        preg_match('/([0-9]*\.[0-9]*)\*kWh/'$buffer$matches))
                        {
                        $zaehlerstand doubleval($matches[1]);
                        logic_setOutput($id,5,intval($zaehlerstand));
                        logic_setOutput($id,6,$zaehlerstand);
                        }
                        }
                        elseif (
                        preg_match('/1\-0\:1\.7\.0\*255/',$buffer)) // Wenn Zeile mit L1+L2+L3
                        {
                        if (
                        preg_match('/([0-9]*\.[0-9]*)\*W/'$buffer$matches))
                        {
                        $zaehlerstand doubleval($matches[1]);
                        logic_setOutput($id,7,intval($zaehlerstand));
                        logic_setOutput($id,8,$zaehlerstand);
                        }
                        }
                        elseif (
                        preg_match('/1\-0\:96\.5\.5\*255/',$buffer)) // Wenn Zeile mit Status
                        {
                        if (
                        preg_match('/\(([0-9]*)\)/'$buffer$matches))
                        {
                        $zaehlerstand doubleval($matches[1]);
                        logic_setOutput($id,9,intval($zaehlerstand));
                        }
                        }
                        }
                        fclose($fp);
                        }
                        sleep(1);
                        }
                        }

                        sql_disconnect();

                        ?>
                        ###[/EXEC]###
                        Der Effekt ist noch der selbe, keine Fehlermeldung, keine Daten.

                        Kommentar


                          #13
                          Dann wird es vermutlich schwierig, wenn man die Verbindung bei jedem Durchlauf neu aufbaut. Könnte dann ein Timingproblem sein, dass nach dem Öffnen der Verbindung noch keine Daten vorliegen. Du könntest nach dem #

                          PHP-Code:
                          if ($fp) { 
                          nochmal ein sleep(2); einfügen und dafür das sleep(1); unten wieder raus. Dann baut er erst die Verbindung auf, wartet dann 2 Sekunden und versucht dann Daten zu lesen. Wenn die Gegenstelle alle 2 Sekunden sendet, dann sollten eigentlich Daten vorhanden sein.

                          Das wäre aber dann auch das letzte was mir einfällt. Ansonsten gehts vermutlich auf diese Weise einfach nicht.

                          Kommentar


                            #14
                            jonofe , vielen Dank nochmal für Deine Unterstützung. Die letzte Änderung hat leider auch nichts gebracht.

                            Aber:
                            Zitat von jonofe Beitrag anzeigen
                            [*]Oder eine Restart Funktion einbauen, um durch einen zusätzlichen Eingang den LBS neu starten zu können (dadurch neuer Verbindungsaufbau). Das dann entweder regelmäßig triggern oder aber durch eine Logik (z.B. wenn der LBS 1 Minuten lang keine Daten mehr geliefert hat, falls man das daran feststellen kann.[/LIST]

                            Das geht nur, wenn man eine entsprechende Restart-Funktionalität im LBS implementiert hat (siehe 3.). Ansonsten nur per EDOMI-Restart.
                            Zu diesem Problem habe ich eine Lösung gefunden. Ich lasse dieses Script per Cron jede Nacht um 23:59 laufen uns starte damit den EXE-Prozess neu:
                            Code:
                            #!/bin/sh -x
                            
                            pkill -f EXE19900003.php
                            sleep 1
                            php /usr/local/edomi/www/data/liveproject/lbs/EXE19900003.php 1384 &
                            
                            echo `date +%F`" "`date +%H:%M:%S`" - Zähler2 neu gestartet."
                            Crontab:
                            Code:
                            59 23 * * *     sh /home/restart-Zaehler2.sh >> /var/log/Zaehler2.log 2>&1
                            ​​​​​​​Funktioniert für mich als Workaround.

                            Kommentar

                            Lädt...
                            X