Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS beschleunigen

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

    LBS beschleunigen

    Stehe im Moment vor einem Problem, das ein eigener LBS wohl nicht schnell genug ist für einen paralellen Betrieb.

    Hintergrund: Ich schicke von meiner Haussteuerung Statusmeldungen per UDP an Edomi..
    Empfangen tut der LBS UDP Receiver.. dieses macht er lt. Trace auch ordentlich und empfängt auch alle Pakete..

    hinter dem UDP Receiver hängt ein LBS der mir den empfangen String zerlegt, vergleicht und einen Wert an einen KO übergibt.
    von diesem LBS hängen viele am UDP Receiver.
    lbs.png

    Das klappt an sich ganz gut, sprich die Logik funktioniert.
    Problem habe ich wenn zu viele Empfangen Daten gleichzeitig verglichen werden müssen.. dann werden mir immer wieder Werte verschluckt. (Bsp. alle Rollos fahren Zentral runter und melden ihren Status gleichzeitig).
    Im UDP Receiver kommen wie gesagt alle Statusmeldungen an... am KO fehlen einige

    Der LBS sieht wie folgt aus:

    Code:
    ###[DEF]###
    [name        = Wert aus String]
    
    [e#1        = Eingangstrigger    ]
    
    [e#2        = Vergleichsstring ]
    
    [e#3        = Seperator        ]
    
    [a#1        = Übermittelter Wert    ]
    
    
    ###[/DEF]###
    
    
    ###[HELP]###
    Vorlage: Standard-LBS
    ###[/HELP]###
    
    
    ###[LBS]###
    <?
    function LB_LBSID($id) {
        if ($E=getLogicEingangDataAll($id))
        {
    
            if ($E[1]['refresh']==1)
            {
    
                $meinstring = $E[1]['value'];
                $findstring = $E[2]['value'];
                $sep = $E[3]['value'];
    
                if (strpos($meinstring, $findstring) !== FALSE)
                {
                    $sepapos = strpos($meinstring, $sep);
    
    
                    while ($sepapos !== FALSE)
                    {
                        $sepapos = strpos($meinstring, $sep) + 1;
                        $meinstring = substr($meinstring, $sepapos);
                
                        $sepapos = strpos($meinstring, $sep);
        
                    }
    
                    $lenfind = strlen($findstring);
                    $lenmein = strlen($meinstring);
    
                    $len = $lenfind - $lenmein;
    
                    $wert = substr($meinstring, $len);
                    
                    setLogicLinkAusgang($id,1,$wert);
    
                    writeToCustomLog('Wert aus String',0,$meinstring);    
    
                }
            }        
        }
    }
    ?>
    ###[/LBS]###
    
    
    ###[EXEC]###
    <?
    ?>
    ###[/EXEC]###

    Wäre die Sache im EXEC Teil besser aufgehoben?
    Bin noch frisch in der php Ecke.. vielleicht kann jemand behilflich sein

    Im Log sieht man auch das bei hoher Frequenz der eingehenden Pakete die Logik nicht hinterherkommt
    Code:
     [TABLE="class: log, border: 0, cellpadding: 0, cellspacing: 0, width: 0, height: 12"]
     	 		[TR]
     			[TD]2016-09-18 23:53:37[/TD]
     			[TD]103056[/TD]
     			[TD]799[/TD]
     			[TD]0[/TD]
     			[TD]Rollo_Status_Wohnzimmer_1 15[/TD]
     		[/TR]
     		[TR]
     			[TD]2016-09-18 23:53:37[/TD]
     			[TD]281507[/TD]
     			[TD]799[/TD]
     			[TD]0[/TD]
     			[TD]Rollo_Status_Wohnzimmer_2 51[/TD]
     		[/TR]
     		[TR]
     			[TD]2016-09-18 23:53:37[/TD]
     			[TD]297275[/TD]
     			[TD]799[/TD]
     			[TD]0[/TD]
     			[TD]Rollo_Status_Wohnzimmer_1 16[/TD]
     		[/TR]
     		[TR]
     			[TD]2016-09-18 23:53:37[/TD]
     			[TD]315330[/TD]
     			[TD]799[/TD]
     			[TD]0[/TD]
     			[TD]Rollo_Status_Wohnzimmer_2 52[/TD]
     		[/TR]
     		[TR]
     			[TD]2016-09-18 23:53:37[/TD]
     			[TD]511512[/TD]
     			[TD]799[/TD]
     			[TD]0[/TD]
     			[TD]Rollo_Status_Wohnzimmer_2 53[/TD]
     		[/TR]
     		[TR]
     			[TD]2016-09-18 23:53:37[/TD]
     			[TD]618382[/TD]
     			[TD]799[/TD]
     			[TD]0[/TD]
     			[TD]Rollo_Status_Wohnzimmer_1 18[/TD]
     		[/TR]
     	 [/TABLE]

    #2
    Das Problem liegt aus meiner Sicht im UDP Listener. Dieser läuft ja vermutlich als EXEC Skript. Dadurch setzt er bei vielen ankommenden Daten seinen Ausgang schneller, als die Logik dahinter ihn abarbeiten kann. Dies liegt daran, dass ein EXEC Skript ein völlig eigenständiger PHP Prozess ist und daher asynchron zur Hauptlogikschleife (LBS-Teil) läuft.
    Eine Möglichkeit wäre im UDP Listener eine optionale Verzögerung nach der Ausgabe einer Nachricht auf A2 einzubauen. Die Zeit müsste dann so groß sein, dass mindestens ein Durchlauf der EDOMI Logikengine gewährleistet ist und somit das empfangene UDP Paket auch verarbeitet wurde.

    Kommentar


      #3
      Zitat von jonofe Beitrag anzeigen
      Das Problem liegt aus meiner Sicht im UDP Listener. Dieser läuft ja vermutlich als EXEC Skript. Dadurch setzt er bei vielen ankommenden Daten seinen Ausgang schneller, als die Logik dahinter ihn abarbeiten kann. Dies liegt daran, dass ein EXEC Skript ein völlig eigenständiger PHP Prozess ist und daher asynchron zur Hauptlogikschleife (LBS-Teil) läuft.
      Ja das könnte wirklich das Problem sein.

      Zitat von jonofe Beitrag anzeigen
      Eine Möglichkeit wäre im UDP Listener eine optionale Verzögerung nach der Ausgabe einer Nachricht auf A2 einzubauen. Die Zeit müsste dann so groß sein, dass mindestens ein Durchlauf der EDOMI Logikengine gewährleistet ist und somit das empfangene UDP Paket auch verarbeitet wurde.
      du meinst den UDP Listener verlangsamen... wäre ein Versuch Wert..

      Code:
      while(getSysInfo(1)>=1) {    //Hauptschleife (wird beim Beenden oder Neustart von EDOMI verlassen)
          debug('warten');
          socket_recvfrom($socket, $data, $v4, 0, $sendip, $sendport);
          sql_connect();  
          if (($v3 != '') && ($sendip != $v3)) {
              debug('Verworfen '.$sendip.' != '.$v3.'  '.$data);
              continue;
              };
          debug('gelesen: '.$data);
          setLogicLinkAusgang($id,2,$data);
          usleep(1000*10);        //CPU-Last verteilen (die Länge der Pause sollte je nach Bedarf angepasst werden - je länger, desto ressourcenschonender)
      }
      müsste doch reichen noch ein usleep vor das setLogicLinkAusgang zu setzen.. oder?


      Gruß
      Tobi

      Kommentar


        #4
        Zitat von blaky Beitrag anzeigen
        müsste doch reichen noch ein usleep vor das setLogicLinkAusgang zu setzen.. oder?
        Ich würde den Wert einfach erhöhen, oder willst du grundsätzlich eine Verzögerung haben? Es geht doch nur darum dass nicht zu schnell Telegramme aufeinanderfolgen.

        Kommentar


          #5
          logic_setOutputQueued($id,$ausgang,$value)?
          Oder hab ich die Anforderung flasch verstanden?

          Kommentar


            #6
            Zitat von wintermute Beitrag anzeigen
            logic_setOutputQueued($id,$ausgang,$value)?
            Oder hab ich die Anforderung flasch verstanden?
            Stimmt, seit v1.39 gibt's ja diese queue-Funktion. Das sollte eigentlich reichen. Einfach im UDP Listener das logic_setOutput durch logic_setOutputQueued ersetzen.

            Kommentar


              #7
              Ich hab das mal getestet mit logic_setOutputQueued..
              die gute Nachricht: mit der Queue werden keine Telegramme mehr verschluckt..

              die schlechte Nachricht: da lt. Doku die selbe Queue verwendet wird wie Bsp. die Visuelemente ist ein Bedienen der Visu nicht mehr vernüftig möglich da der VisuBefehl erst ausgeführt wird wenn die Queue wieder leer ist.
              Anwendungsbeispiel: ich betätige auf der Visu den Knopf ALLE Rollos runterfahren.. die Haussteuerung meldet mir die LivePositionen aller Rollos per UDP zurück.. diese Stati landen in der Queue.. drücke ich jetzt auf Rollos Stop .. wird das Kommando natürlich erst losgeschickt wenn die Queue leer ist.. somit fahren die Rollos noch munter mehrere Sekunden weiter runter statt sofort zu stoppen.
              Ideal wäre eine extra Queue dafür... *rüberschiil zu Gaert*

              Kommentar


                #8
                wie viele Status Infos bekommst du denn via UDP? Und wieso bekommst du sie während sie fahren? Eine Echtzeitintegration wird vermutlich nicht möglich sein.

                Kommentar


                  #9
                  ich bekomme eigentlich jede Prozentänderung des Rollos per UDP gemeldet.. das sieht auch alles hübsch aus wenn in der Visu dann der Rollo hoch/runter fährt.
                  bei Einem Rollo klappt das gut, bei 3 Rollos gleichzeitig ist die Queue leider schon ordentlich beschäftigt, sodas ein Visu Kommando schon deutlich verzögert. .. alle Rollos im Haus (16Stk.) schafft zwar der UDP Receiver aber die Logik hängt dann immens hinterher
                  Zuletzt geändert von blaky; 19.09.2016, 18:48.

                  Kommentar


                    #10
                    logic_setOutputQueued() darf nur im EXEC-Teil verwendet werden (siehe Hilfe) - dies nur als Hinweis
                    EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                    Kommentar


                      #11
                      Zitat von gaert Beitrag anzeigen
                      logic_setOutputQueued() darf nur im EXEC-Teil verwendet werden (siehe Hilfe) - dies nur als Hinweis
                      ist auch im exec Teil.. nur doof das die Visu Queue da involviert ist.. kannst du da eventuell ne eigene Queue dafür basteln? biddää

                      Kommentar


                        #12
                        Zitat von blaky Beitrag anzeigen

                        ist auch im exec Teil.. nur doof das die Visu Queue da involviert ist.. kannst du da eventuell ne eigene Queue dafür basteln? biddää
                        ich glaube du ballerst einfach damit die gesamte Edomi Logik zu. Wieviele Signale kommen denn da via UDP? Da wird auch keine separate Queue was bringen, schließlich müssen alle Signale von Edomi verarbeitet werden, egal aus welcher Queue.
                        Ich würde versuchen die UDP Telegramme deutlich zu verringern. Denn nicht nur die Yvisu, sondern vermutlich auch die Logik wird dann nicht mehr reagieren.

                        Kommentar


                          #13
                          Richtig, eine weitere Queue würde nichts bringen - schließlich muss das "Zeitgefüge" stimmig sein. Sprich: Alle Ereignisse müssen chronologisch korrekt erfasst und verarbeitet werden, sonst gibt's Chaos
                          EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                          Kommentar


                            #14
                            Zitat von gaert Beitrag anzeigen
                            Richtig, eine weitere Queue würde nichts bringen - schließlich muss das "Zeitgefüge" stimmig sein. Sprich: Alle Ereignisse müssen chronologisch korrekt erfasst und verarbeitet werden, sonst gibt's Chaos
                            Ich trau mich ja schon gar nicht mehr zu fragen.. eine Priorität innerhalb der Queue zu vergeben wäre das möglich?
                            meine Steuerung unterhält sich NUR auf UDP Basis mit Edomi.. dies wird halt nur bei Zentralen Ereignissen wie "alle Rollos fahren Gleichzeitig und melden den Status" eng. ansonsten klappt das super.

                            Kommentar


                              #15
                              Moinmoin

                              Zitat von blaky Beitrag anzeigen
                              eine Priorität innerhalb der Queue zu vergeben wäre das möglich?
                              meine Steuerung unterhält sich NUR auf UDP Basis mit Edomi.. dies wird halt nur bei Zentralen Ereignissen wie "alle Rollos fahren Gleichzeitig und melden den Status" eng. ansonsten klappt das super.
                              Du hast das Problem nicht verstanden. Was soll eine Prio bringen? Damit wird die Queue genauso (über-)voll, Du gewinnst überhaupt nichts. Dass das im Moment "super klappt" ist wohl viel mehr Zufall. So Sachen wie alle Rollos gleichzeitig zu verfahren bringt den Bus im Normalfall nicht aus dem Tritt bzw. müsstest Du da schon sehr viele Rollos haben. Ich vermute eher, dass im Moment die Last der UDP-Pakete gerade noch so verarbeitet werden kann. Je nachdem wie sich Deine Installation ändert, kann sich das dann auch schnell mal ändern.
                              Kind regards,
                              Yves

                              Kommentar

                              Lädt...
                              X