Ankündigung

Einklappen
Keine Ankündigung bisher.

Fragen zur LBS Erstellung

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

    #61
    Ein Beispiel steht oben in #52.

    Ansonsten könnte man z.B. JSON Format verwenden:

    PHP-Code:
    $file '/tmp/test.json';

    $write_data 'test data';
    var_dump($write_data);

    // write
    file_put_contents($filejson_encode($write_data));

    // read
    $read_data json_decode(file_get_contents($file), true);

    var_dump($read_data); 

    Kommentar


      #62
      Ok werde mich mal durchlesen. Danke schon mal.

      Kommentar


        #63
        Hat prima funktioniert, danke gulp2k und jonofe!

        Kommentar


          #64
          Hallo jonofe,

          da mein Debuging in meinem LBS für mich noch nicht zufriedenstellend ist habe ich mir deine Dubuging-Funktion mal angeschaut, die ja mittlerweile in vielen LBS zu finden ist:

          PHP-Code:
          function LB_LBSID_logging($id$msg$var NULL$priority 8)
          {
              
          $E getLogicEingangDataAll($id);
              
          $logLevel getLogicElementVar($id103);
              if (
          is_int($priority) && $priority <= $logLevel && $priority 0) {
                  
          $logLevelNames = array(
                      
          'none',
                      
          'emerg',
                      
          'alert',
                      
          'crit',
                      
          'err',
                      
          'warning',
                      
          'notice',
                      
          'info',
                      
          'debug'
                  
          );
                  
          $version getLogicElementVar($id100);
                  
          $lbsNo getLogicElementVar($id101);
                  
          $logName getLogicElementVar($id102) . "-LBS$lbsNo";
                  
          $logName preg_replace('/ /''_'$logName);
                  if (
          logic_getVar($id104))
                      
          $logName .= "-$id";
                  if (
          logic_getVar($id105) == 1)
                      
          $msg .= " ($id)";
                  
          strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname 'EXE' $lbsNo $scriptname 'LBS' $lbsNo;
                  
          writeToCustomLog($logNamestr_pad($logLevelNames[$logLevel], 7), $scriptname " [v$version]:\t" $msg);
                  if (isset(
          $var)) {
                      
          writeToCustomLog($logNamestr_pad($logLevelNames[$logLevel], 7), $scriptname " [v$version]:\t================ ARRAY/OBJECT START ================");
                      
          writeToCustomLog($logNamestr_pad($logLevelNames[$logLevel], 7), $scriptname " [v$version]:\t" json_encode($var));
                      
          writeToCustomLog($logNamestr_pad($logLevelNames[$logLevel], 7), $scriptname " [v$version]:\t================ ARRAY/OBJECT  END  ================");
                  }
              }

          Was ich noch nicht ganz verstanden habe ist:
          - Wie beeinflusse ich das Loglevel?
          - Wie erkannt die Funktion Arrays?
          In deinem LBS habe ich gesehen das du diese zum Loggen in die Variable $msg schreibst, wo $var geändert wird (?) habe ich nicht gefunden.

          Kommentar


            #65
            $var ist optional und kann ein Array oder ein Object enthalten. Wenn dieses vorhanden ist, dann wird es als JSON String ausgegeben (vorletzte Zeile).
            Der Loglevel wird als 4. Übergabe Parameter erwartet und ist per default 8. Du kannst in jedem logging Statement durch Angabe des 4. Parameters den Loglevel für diese Nachricht angeben. Über einen Eingang am LBS definierst du dann den Loglevel. Diese muss dann am Anfang des LBS Teils in die Variable 103 geschrieben werden. Dort erwartet die Logging Funktion des aktuellen Loglevel. Wird nun ein Log Befehl aufgerufen, dann vergleich die Logging Funktion den Wert in Variable 103 mit dem übergebenen Loglevel der aktuellen Nachricht. ist der Loglevel in Var 103 >= Loglevel der Nachricht, dann wird diese geloggt.

            Kommentar


              #66
              Danke jonofe . Jetzt hab ich es verstanden. Bin bei deinen 4 MQTT LBS en bisl durcheinander gekommen .

              By the way, ist das gewollt (Puplish Server):
              PHP-Code:
                              $mysqli = new mysqli('localhost''root''''edomiLive');
                              if (! 
              $mysqli->connect_error) {
                                  
              $mysqli = new mysqli('localhost''root''''edomiLive');
                                  if (! 
              $mysqli->connect_error) {

              .......

                                   } else
                                      
              LB_LBSID_logging($id"ERROR: Unable to create MQTT trigger and stored procedure");
                              } else
                                  
              LB_LBSID_logging($id"ERROR: Unable to connect to mysql database"); 

              Kommentar


                #67
                Ich hätte mal eine Frage zur Abfrage der EdomiLive.db:
                Ich mache mit einem LBS Abfragen wie:
                PHP-Code:
                $sql=sql_call("SELECT SUM(gavalue) as Summe FROM edomiLive.archivKoData WHERE targetid = ".$archivid." AND datetime between '$start' and '$now'"); 
                Meine Test VM lässt sich davon nicht wirklich beeindrucken aber mein Produktiv-System (Atom Z8300-1,84 GHz, 2GB-Ram), geht pro Abfrage ca. 1-3 Sekunden lang von ca. 5% auf 28% CPU-Last, die Logicengine macht in dieser Zeit gar nichts mehr.

                Ist das normal?
                Sollten solche DB-Abfragen evtl. besser in den EXEC-Teil?
                Oder kann man das irgendwie anders optimieren?

                Danke schon mal

                Kommentar


                  #68
                  Ja, du solltest das in den EXEC Bereich verschieben, denn sonst blockiert es die Logik Engine bis das Ergebnis vorliegt. 28% ist ja grundsätzlich nicht kritisch wenn es parallel zur Logikengine läuft. Es liegt halt an der Größe deines Archivs.

                  Kommentar


                    #69
                    Okay aber angenommen ich hätte jetzt mehrer LBS die dann evtl. gleichzeitig abfragen. Dann könnte Edomi ja trozdem ins stocken kommen oder?

                    Kann ich das irgendwie eindämmen in dem vielleicht alle LBS auf einen PHP-Prozess zugreifen (einreihen) oder die Anfrage erst bei einer bestimmten CPU Auslastung durchführen?

                    Kommentar


                      #70
                      Klar, du könntest einen LBS schreiben der SQL Statements ausführt und das Ergebnis zurückgibt. Ich glaube allerdings nicht, dass es wirklich ein Problem wird. Wie viele Abfragen sollen denn gleichzeitig laufen? Ich würde zunächst das SQL ins EXEC verschieben und schauen wie die Performance aussieht.

                      Kommentar


                        #71
                        So habe das jetzt in den EXEC geschoben. Ich habe gerade zwei LBS am laufen die jeweils 10 Abfragen machen. Die CPU-Last ist jetzt auf 55% gestiegen. Da es durchaus ein Dutzend werden könnten die gleichzeitig laufen, müsste ich sicherstellen das die Abfragen nur nacheinander gemacht werden.

                        Wie geht den das mit den Statements?

                        Kommentar


                          #72
                          Bin mit meiner Software ein gutes Stück weiter dank euch.

                          So nun will ich auch so ein schönes logging wie von jonofe einbauen.

                          Bei einem LBS hab ich das auch geschafft, was ich gerne machen würde, wo ich aber scheitere:
                          HM Master LBS (Meldet sich an einem XML-RPC Server an und überwacht die Verbindung) auf diesem läuft das logging.
                          Ich möchte nun in einem anderen script das selbe logging verwenden was benötige ich. (das log sollte auf den LBS geschrieben werden).

                          In das Script übergebe ich die LBS $id, mit der ich die logging-funktion benutze. Die Variablen v#100 bis v#105 werden auch korrekt übergeben.

                          Leider landet nichts im log.

                          Script wird in /edomi/www/shared/php ausgeführt. Kann es daran liegen?

                          Wie könnte das Script ins logging vom LBS einbinden?

                          Kommentar


                            #73
                            Hab zu kompliziert gedacht. Habe mir selbst eine kleine Logging Funktion in das Serverscript eingebaut.
                            Wenn im LBS der Loglevel 8 eingeschalten ist lege ich eine Datei (debug.on) an und sonst wird die Datei gelöscht.
                            Im Serverscript prüfe ich ob die Datei vorhanden ist und je nach dem schalte ich den debug ein oder aus.

                            Das Logging wäre somit abgehakt.

                            Eine neue Frage ist aufgetaucht:

                            Kann mir jemand sagen wie ich im LBS die Edomi IP in eine Variable bekomme?
                            Mit $_Server[] habe ich leider nichts erreicht.


                            Möchte mir noch einen Eingang sparen.

                            Kommentar


                              #74
                              Die edomi IP steht in der Konstanten global_serverIP. Wichtig: ohne $ davor, da es eine Konstante und keine Variable ist.

                              Kommentar


                                #75
                                Ich habe jetzt mein Problem mit den gleichzeitigen DB-Abfragen versucht zu lösen indem ich den Zustand in einem gemeinsamen Array speicher.

                                Wenn ich im Exec das gleiche File aufrufe wie im LBS:
                                $lbsNo='19001125';
                                $file='/var/tmp/EDOMI_LBSID_'.$lbsNo.'.json';
                                $cache=json_decode(file_get_contents($file),true);
                                Habe ich diesen Fehler im Log:
                                Code:
                                Datei: /var/edomi-backups/_public/www/shared/php/base.php | Fehlercode: 2 | Zeile: 284 | utf8_decode() expects parameter 1 to be string, array given
                                Den gleichen Aufruf habe ich im LBS-Teil auch und da funktioniert das Problemlos.
                                Muss ich hier zusätzlich noch mit "serialize" arbeiten?
                                Oder habe ich da was Anderes übersehen?

                                Kommentar

                                Lädt...
                                X