Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS Entwicklung / Debbuging

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

    LBS Entwicklung / Debbuging

    Wie schon an anderer Stelle angemerkt bin ich ein großer Fan von Debbugern in der IDE
    Für einen LBS der in Edomi läuft ist das ja eher schwierig, deshalb hatte ich mich vor ein paar Tagen hingesetzt und einen MiniWrapper gebastelt der es erlaubt einen LBS ohne Änderung am Sourcecode in einer IDE mit Debugger auszuführen.

    Das funktioniert für LBS ohne EXEC ziemlich gut aber mit EXEC tue ich mich noch etwas schwer...

    Ohne EXEC kann ich beim debugging $E beliebig ändern und so ankommende Telegramme simulieren.
    Mit habe ich das Problem das der EXEC Teil oft ewig rennt bevor man mal Gelegenheit hat im LBS Teil die Eingänge abzuarbeiten.

    Aktuell ist der EXEC Teil im gleichen Thread was zum Teil auch zu "abweichenden" Verhalten zu Edomi führt.

    Hat vielleicht jemand eine gute Idee wie man das Lösen könnte?

    Btw, falls es jemand ausprobieren möchte anbei der aktuelle Stand:
    Einzige Änderung die vorgenommen werden muss ist das "require" mit dem eigenen Pfad/LBSID anzupassen und falls es einen EXEC Teil gibt den seperat in 'LBSNAME_exec.php' zu schreiben.

    PHP-Code:
    <?php

    const LBSID="19001213";
    require(
    '../'.LBSID.'_lbs.php');


    $id=LBSID;
    $state=0;
    $duration=0;
    $E[1]['value']=0;
    $E[1]['refresh']=0;
    $E[2]['value']=1;
    $E[2]['refresh']=1;
    $E[3]['value']=5000;
    $E[3]['refresh']=0;
    $E[4]['value']=600;
    $E[4]['refresh']=0;
    $E[5]['value']='bright';
    $E[4]['refresh']=1;
    $E[10]['value']=1;
    $E[11]['value']=1;
    $var[1]=0;
    $var[2]=0;
    $var[3]=0;
    $var[4]=0;
    $var[100]=0;
    $var[101]=19001213;
    $var[102]='Yeelight Sunrise';
    $var[103]=8;
    $var[104]=0;
    $var[105]=0;

    /*[e#9 trigger=         Set Mode] 0/1 Off/on
    [e#10 trigger= Set ByPass] 0/1 Off/on
    [e#11 trigger= Set Fan Mode] 0=Auto, 1=Low, 2=Medium, 3=High
    [e#12 trigger= Set Date & Time]
    [e#13 trigger= Clear Fault]*/

    do {
        
    LB_LBSID($id);
        
    usleep($duration);
    } while (
    $state==1);


    function 
    setLogicElementVar($id$varnum$value){logic_setVar($id$varnum$value);};
    function 
    sql_connect(){};
    function 
    logic_getState($id){
        global 
    $state;
        return 
    $state;
    }
    function 
    logic_setState($id,$val,$duration=0){
        
    $GLOBALS["duration"]=$duration;
        
    $GLOBALS["state"]=$val;
        print(
    "Set_State : ".$val.",".$duration."\n");
    }
    function 
    logic_setVar($id$varnum$value){
        global 
    $var;
        
    $var[$varnum]=$value;
        print(
    "Set_var : ".$varnum." Value:".$value."\n");
    };

    function 
    getLogicElementVar($id$varnum){return logic_getVar($id$varnum);};
    function 
    logic_getVar($id$varnum){
        global 
    $var;
        return 
    $var[$varnum];
    };
    function 
    writeToCustomLog($logName$logLevel$msg){echo $msg."\n";};

    function 
    getLogicEingangDataAll($id){return logic_getInputs($id);};
    function 
    logic_getInputs($id){
        global 
    $E;
        return 
    $E;
    };
    function 
    logic_setOutput($id$A$val){
       print( 
    "A".$A."=".$val."\n");
    };
    function 
    sql_disconnect(){};

    function 
    logic_callExec($LBSID$id){
        include(
    '../'.LBSID.'_lbs_exec.php');
    };
    function 
    getSysInfo($nr){return true;};
    Gruß
    Michael

    #2
    Führt die while Schleife nicht dazu, dass der LBS immer wieder aufgerufen wird? Im Gegensatz dazu wird er in EDOMI ja Event gesteuert getriggert, d.h. nur wenn ein Eingang getriggert wird, außer man veranlasst ihn zeitgesteuert wieder aufgerufen zu werden. Bei LBS, die z.B. per Message Queue mit dem EXEC Daemon kommunizieren oder auch über Variablen wird der Ansatz vermutlich komplizierter, oder?

    Ich mache es derzeit so, dass ich bei komplexen LBS eher ein separates Skript oder eine separate php Klasse entwickle, so dass ich die Funktionalität außerhalb von EDOMI testen kann und dann später einfach in den LBS reinkopiere. Ist aber Geschmackssache. Außerdem nutze ich einen Gitlab-Server, der automatisch die eingecheckten Changes auf mein EDOMI-Development System provisioniert. Da läuft dann ein quasi leeres Projekt nur mit dem entwickelten LBS drauf. Nach einer Änderung ist dann nur ein Klick auf "Eigene LBS einlesen" (was ja nur einer ist) und eine Neuaktivierung des Projekts notwendig. Das geht dann in wenigen Sekunden.

    Kommentar


      #3
      Die Schleife dient dazu das SetState zu simulieren, ohne SetState gibt es auch nur einen durchlauf.

      Mein Ziel ist es den LBS ohne Änderung testen zu können, also alle logic_xxx aufrufe usw möglich zu machen.
      Im Prinzip geht es auch mit dem EXEC aber eventuell dauert es recht lange bevor eine Änderung an Exx beim LBS/EXEC ankommt.
      Eventuell bräuchte ich noch ein SetE($nr,$value) bei dem ich dann gleich noch LBSID() aufrufe.

      Mit einer kleinen Änderung habe ich auch den Yeelight RGB zum laufen gebracht nur eben ein Triggern auf E war etwas umständlich.
      Einer der nächsten LBS von mir auf der ToDo Liste hat wieder einen EXEC Teil, da werd ich mich mal weiter mit befassen
      Gruß
      Michael

      Kommentar

      Lädt...
      X