Ankündigung

Einklappen
Keine Ankündigung bisher.

EDOMI - LBS - Diskussion

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

  • benji
    antwortet
    Hi,

    ich hab mal eine kleine Frage bzgl. PHP. Eventuell (bestimmt) kann mir jemand von euch Pro's weiterhelfen.
    Ich bin derzeit ein wenig an einem LBS am basteln, welcher mir mein ISG ausliest. Hier mal ein Auszug aus dem LBS

    Code:
    ###[EXEC]###
    <?
    require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
    sql_connect();
    
    
    
    $data = file_get_contents('http://192.168.84.155/?s=1,1');
    
    $regex = '/<td class="value*(.*)<\/td>/';
    
    preg_match_all($regex,$data,$match);
    var_export($match[0]);
    
    
    //
    
    setLogicLinkAusgang($id,1,$match[0][1]);
    setLogicLinkAusgang($id,2,$match[0][2]);
    setLogicLinkAusgang($id,3,$match[0][3]);
    setLogicLinkAusgang($id,4,$match[0][4]);
    
    
    //
    sql_disconnect();
    ?>
    ###[/EXEC]###
    wenn ich das ganze als PHP aufrufe bekomme ich meine einzelnen "match" angezeigt, lade ich den LBS in Endomi bekomme ich td class=value 23,9 td als Ausgabe.
    Jetzt wollte ich einfach die Zahlen filtern indem ich alle Buchstaben Filter sprich
    Code:
    preg_match_all('/[^a-z]/',$regex,$data,$match);
    Allerdings bleibt meine Ausgabe dann leer.

    Kann mir eventuell jmd. weiterhelfen???

    Danke Gruß Benjamin

    Einen Kommentar schreiben:


  • rdeckard
    antwortet
    Ich komme auf mein gestriges LBS-Problem zurück. In der Tat war es als ANSI gespeichert. Da ich die ganze Zeit mit einem bestehenden utf8-Code gearbeitet habe (inkl. PHP-Tests, aber ausserhalb von Edomi) und erst am Schluss dann ein NEUES Textfile erzeugt habe, ist mir nicht aufgefallen, dass der Editor scheinbar ANSI als Default für neue Dateien verwendet.
    Zudem war ja noch in der Abfrage des Triggers ein Fehler, weil die Vorlage mit e1 als Trigger arbeitet und ich e2 verwendet habe.
    Habe beides korrigiert und dann lief der Test-LBS durch.

    Leider ist damit mein ursprüngliches Problem nicht gelöst worden. Denn, wenn ich jetzt meinen "richtigen" LBS starte, bringt mir Edomi 2 Fehlermeldungen ins Fehlerlog.
    Ich hab den Code etwas verkürzt (wiederkehrende IF-Abfragen entfernt):

    PHP-Code:
    ###[DEF]###
    [name        =TEST]

    [e#1     =trigger]
    [e#2     =url]
    [e#3     =vorwarnzeit #init=1]

    [a#1    =Status]
    [a#2    =Datum 1]
    [a#3    =Datum 2]

    ###[/DEF]###

    ###[HELP]###
    folgt noch...            
     
    ###[/HELP]###


    ###[LBS]###
    <?
    function LB_LBSID($id) {
      if ($E=getLogicEingangDataAll($id)) {
        if ($E[1]['refresh']==1) {
          callLogicFunctionExec(LBSID,$id);
        }
      }
    }
    ?>
    ###[/LBS]###


    ###[EXEC]###
    <?
    require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
    sql_connect();
    //-------------------------------------------------------------------------------------
    if ($E=getLogicEingangDataAll($id)) {
      $A = $E[2]['value'];
      $vorwarnzeit = $E[3]['value'];
    }

    setlocale (LC_TIME, 'de_DE');

    $url = file($A);
    $lines = file($url);
    $heute = date("d.m.Y"); //"24.02.2016";

    foreach($lines as $line) {
      $line = trim($line);
      $line = rtrim($line, ";");

      if(strpos($line,"=") !== FALSE) {
        if(substr($line, 0, strpos($line,"=")) == "Reihe1") {
          $teile = explode(";", substr($line, strpos($line,"=")+1, strlen($line)));
          find_closest($teile, $heute, $vorwarnzeit, "Status");
        }
      }
    }

    function find_closest($array, $date, $vorwarnzeit, $Termine) {
      foreach($array as $day) {
        $day=str_replace(".", "-", $day);
        $date=str_replace(".", "-", $date);
        $interval[] = intval(intval((strtotime($day) - strtotime($date))) / (3600*24)); // Differenz in Tage zwischen heute
      }
      asort($interval);

      foreach($interval as $key=>$value) {
        if($value == $vorwarnzeit) {
          setLogicLinkAusgang($id,1,1); //Status 1 = In Vorwarnzeit
          setLogicLinkAusgang($id,2,$array[$key]); //Datum 1
          setLogicLinkAusgang($id,3,$array[$key+1]); //Datum 2
          break;
        } else {
          if($value > $vorwarnzeit) {
            //echo $Termine."=> Nächster Termin: ".$array[$key]."<br>";
            setLogicLinkAusgang($id,1,0); //Status 0 = Nicht in Vorwarnzeit
            setLogicLinkAusgang($id,2,$array[$key]); //Datum 1
            setLogicLinkAusgang($id,3,$array[$key+1]); //Datum 2
            break;
          }
        }
      }
    }
    setLogicElementStatus($id,0);
     
    //-------------------------------------------------------------------------------------
    sql_disconnect();

    ?>
    ###[/EXEC]###
    Das steht im Edomi Fehler-Log:
    Code:
    2016-02-22 20:53:17406373?113981/usr/local/edomi/www/data/liveproject/lbs/EXE19000901.php: Code 2 / Zeile 1 / file() expects parameter 1 to be string, array given ERROR
    2016-02-22 20:53:17406919?113981/usr/local/edomi/www/data/liveproject/lbs/EXE19000901.php: Code 2 / Zeile 1 / Invalid argument supplied for foreach() ERROR
    Was ist eigentlich mit Code 2 und Zeile 1 gemeint?

    Und wie schon zu Beginn erwähnt. Der eigentliche EXEC-Code läuft unter PHP (ausserhalb Edomi) normal durch. (Natürlich muss ich dann die Eingangsvariablen manuell noch setzen.)

    Einen Kommentar schreiben:


  • starwarsfan
    antwortet
    Zitat von wintermute Beitrag anzeigen
    Bedenke: idiotensichere Systeme sind nur solange sicher, wie sie von Idioten bedient werden. Irgendwann wird schon jemand "rausfinden" wie er einen Wert eingibt der dann doch nicht von deinem LBS abgefangen wird und stattdessen im Edomi Log landet
    Da fällt mir ein, was ich letztens irgendwo in einer Signatur gelesen habe: "If you make something idiot proof, they start making better idiots"

    Just my two cents...

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Es ist ein Initialwert, kein KO … Ich sah derzeit keine Notwendigkeit es über ein KO einzugeben …
    Dann belasse ich es bei is_numeric() um Blabla abzufangen, der Rest ist mir somit Wurscht ...

    DANKE für deine Erläuterungen !!

    Einen Kommentar schreiben:


  • wintermute
    antwortet
    Zitat von coliflower Beitrag anzeigen
    Mit is_int() wird die IF-Bedingung nicht erfüllt (false) …
    Ich werde mich hueten hier nochmal Mutmassungen ueber die Funktionsweise von Edomi abzugeben
    Aber wenn ich das gebaut haette:
    -wenn Dein Eingang ein internes KO ist, dann waere es vom Typ variant, der bei mir nicht zwischen Zahlen und Strings unterscheiden wuerde
    -wenn Dein Eingang ein externes KO ist, dann koennte man natuerlich anhand des DPTs festlegen welchen Datentyp man an der Stelle uebergibt - PHP ist aber nur recht schwach bis garnicht typisiert, deswegen haette ich das nicht gemacht
    Bei mir waeren das also vermutlich immer Elemente der kleinsten gemeinsamen Obermenge - anders ausgedrueckt: Strings.

    Das ist auch gut so, denn damit kann man einfach so rumhantieren und muss sich keine Gedanken ueber Vorzeichen, Wertebereich, Farbe oder Geruch machen. Da kann man dann zB auch sowas wie "hallo+5" ausrechnen (wobei uebrigens 5 rauskommt). Im Gegenzug bedeutet das aber auch, dass es nicht so wirklich einfach ist festzustellen, ob ein Wert einem bestimmten Datentyp entspricht (oder entsprechen koennte). Und da faengt jetzt Dein Dilemma an

    Aber nochmal in Code:
    PHP-Code:
    if ($i == strval(floor($i+0))) { print "INTEGER"; } 
    obiges interpretiert aber zB auch "1.0" als integer, alternativ kann man auch einfach gucken, ob $i nur aus Zahlen besteht:
    PHP-Code:
    if (preg_match('/^\d+$/',$i)) { print "INTEGER"; } 
    Damit werden aber keine Angaben im Exponentialformat mehr akzeptiert
    Was auch gaenge, waere so:
    PHP-Code:
    $i=104;
    $check=$i+0;
    if (
    is_int($check)) { print "INTEGER"; } 
    Ich glaube, das ist relativ sicher - aber irgendwas wird da auch irgendwann nicht mehr passen.

    Wozu soll der ganze Aufwand nochmal dienen?
    Bedenke: idiotensichere Systeme sind nur solange sicher, wie sie von Idioten bedient werden. Irgendwann wird schon jemand "rausfinden" wie er einen Wert eingibt der dann doch nicht von deinem LBS abgefangen wird und stattdessen im Edomi Log landet

    gruesse :: Michael

    Einen Kommentar schreiben:


  • rdeckard
    antwortet
    Aus der Edomi-Anleitung (S.43):
    Variablen beziehen sich auf genau eine LBS-Instanz, d.h. mehrere LBS gleichen Typs beeinflussen sich nicht hinsichtlich deren Variablen. Die Variablen halten einen Wert solange, bis EDOMI beendet bzw. neu gestartet wird. Variablen und Initialwerte vom Typ String werden genau wie Zahlen ohne(!) Anführungszeichen deklariert (Zeichenketten und Zahlen werden intern nicht unterschieden).
    Ich les das so, als ob es einfach Strings sind, auch wenn man sie ohne Anführungszeichen deklariert.

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    gaert

    Hallo Christian, ist der „Inhalt“ des Eingangs am LBS - hier z.B. eine Ganzzahl 9999 „automatisch“ ein String ?
    Ich bilde mir ein, dass ich die 9999 schon mit is_int() getestet habe und FALSE als Antwort erhielt …

    EDIT: scheint tatsächlich so zu sein …
    Mit is_int() wird die IF-Bedingung nicht erfüllt (false) …
    Mit is_numeric() wird wohl auch 999.9 als gültig erkannt und der LBS wird damit ein Problem haben ...
    Zuletzt geändert von coliflower; 22.02.2016, 12:41.

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Danke, dann werde ich das www durchsuchen um das Thema „integer“ abzuschließen ...

    Einen Kommentar schreiben:


  • wintermute
    antwortet
    Zitat von coliflower Beitrag anzeigen
    Dann würde mir, um zu prüfen, ob die Eingabe für das Port eine ganze Zahl (kein Komma) ist, folgendes Abfrage ausreichen:
    Nicht ganz, is_numeric haelt sich ja auch fuer floats zustaendig, 1.234 waere also demnach auch ein gueltiger Port.
    Wenn Du das wirklich alles ueberpruefen willst, dann musste auch sicherstellen, dass es wirklich ein integer ist. Das geht zB mit is_int, abrufen mittels floor und dann "mit sich selbst" vergleichen oder sicher irgendwie mit ctype_digit.
    Mach doch einfach ein $port=floor($port+0), dann steht in $port zumindest schonmal ein integer, denn kannste dann mit dem alten $port vergleichen und wenn das nicht identische Strings sind, dann war $port am Anfang ungueltig.

    Zitat von coliflower Beitrag anzeigen
    Um zu prüfen ob diese Zahl auch innerhalb des Port-Bereichs liegt - folgende Abfrage (aus deinem LBS):
    if ($port<1 or $port>65535) {…}

    Richtig ?
    Radio Eriwan antwortet: im Prinzip ja, allerdings wird da geprueft ob sie ausserhalb des gueltigen Bereiches liegt.

    gruesse

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Das sieht aus, als wäre es von mir ...
    Fast ich habe es auf php.net und dann in deinem LBS gesehen

    DANE für die Erklärung !!

    Dann würde mir, um zu prüfen, ob die Eingabe für das Port eine ganze Zahl (kein Komma) ist, folgendes Abfrage ausreichen:

    if (is_numeric($E[32]['value']) !== false) {

    Um zu prüfen ob diese Zahl auch innerhalb des Port-Bereichs liegt - folgende Abfrage (aus deinem LBS):

    if ($port<1 or $port>65535) {…}

    Richtig ?

    Einen Kommentar schreiben:


  • rdeckard
    antwortet
    Hast recht, dieser Block stimmt nicht genau mit meinen Eingangsvariablen überrein. In meiner ursprünglichen Version war das nicht so drin. Um aber einen sauberen Stand zum Testen zu erhalten, habe ich das Gerüst vom gaert übernommen. Und da war dieser Block so drin. (Habs aber dann vergessen, auf meine Variablen anzupassen.)
    Aber es ging schon vorher ohne diesen Block nicht richtig.
    Und zum Testen habe ich im Logikeditor die Werte fix gesetzt. (Die Sache mit dem Zeichensatz muss ich noch prüfen. Irritiert mich etwas.)

    Einen Kommentar schreiben:


  • KNXFan1970
    antwortet
    @rdeckard
    Kann mich täuschen - sieht aber irgendwie merkwürdig aus. $E[3] hat einen #init-Wert, $E[2] Bezeichnung Trigger aber $E[1] prüfst du als Startbedingung für den EXEC-Teil.
    Leider sehe ich nicht (deine eingefügten Bilder sind bei mir nicht sichtbar), ob du tatsächlich einen Wert !=0 am $E[1] anliegen hast.
    Zuletzt geändert von KNXFan1970; 22.02.2016, 06:00.

    Einen Kommentar schreiben:


  • rdeckard
    antwortet
    Gute Frage. Ist mir auch erst jetzt aufgefallen. Editor habe ich Notepad2 unter Win7 verwendet und Code mit Copy Paste eingefügt. (Firefox).
    Im Editor siehts gut aus. Und zumindest meine heutige Hauptarbeit (Externes PHP) lief auf dem Edomi Rechner normal. (Nicht als Edomi LBS). Und hab den gleichen Editor verwendet.
    Bin jetzt leider nicht mehr an meinem Compi. Kanns erst morgen testen. Dachte aber, ich hätte mal utf8 in der Fusszeile gesehen.

    Einen Kommentar schreiben:


  • vento66
    antwortet
    Wieso werden bei Dir "&lt;" und "&gt;" anstatt "<" und ">" angezeigt? Steht dein Editor nicht auf utf8?

    Einen Kommentar schreiben:


  • wintermute
    antwortet
    Zitat von rdeckard Beitrag anzeigen
    Was mache ich falsch?
    Weiss ich grad auch noch nicht...
    kannst du mal vor dem "sql_connect();" ein "set_time_limit(0);" einfuegen

    Einen Kommentar schreiben:

Lädt...
X