Ankündigung

Einklappen
Keine Ankündigung bisher.

Logikbausteine | EDOMI

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #46
    Mein LBS:
    Ich brauche eigentlich nur die Werte der Eingänge unten im EXEC-Teil. Der LBS mit direkter Vorgabe im php-Teil funktioniert perfekt. Die Vorgabe im Logikeditor eben nicht. Es geht um die Werte E1 und E2. Variablen A und B.


    Code:
    ###[DEF]###
    [name        =Modbus Float]
    [E#1        =A]
    [E#2        =B]
    [A#1        =Ausgabewert]
    ###[/DEF]###
    
    
    ###[HELP]###
    ###[/HELP]###
    
    
    ###[LBS]###
    <?
    function LB_LBSID($id)  {
        if ($E[1]['value']=0 && $E[2]['value']=0)  {
                if ($E=getLogicEingangDataAll($id))  {
                            if ($E[1]['value']!=0 && $E[2]['value']!=0)  {
                                $A=$E[1]['value'];
                                if (!is_numeric($A)) {$A=0;}
                                $B=$E[2]['value'];
                                if (!is_numeric($B)) {$B=0;}
                        }
                }
        }
                        setLogicElementVar($id,$E1,$A);
                        setLogicElementVar($id,$E2,$B);
                        setLogicElementStatus($id,1);                        //LBS    "starten"
                        callLogicFunctionExec(LBSID,$id);                    //EXEC-Script    starten
    }                
    ?>
    ###[/LBS]###
    
    ###[EXEC]###
    <?
    require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
    require(dirname(__FILE__)."/../../../../main/include/php/ModbusMaster.php");
    sql_connect();
    
    $A = getLogicElementVar($id,$E1);
    $B = getLogicElementVar($id,$E2);
    
    $modbus = new ModbusMaster("192.168.2.45", "TCP");
    try {
        // FC 3 2x16-bit float
        $recData = $modbus->readMultipleRegisters(0, $A, $B);
    }
    catch (Exception $e) {
         exit;
    }
    $raw = (($recData[0] & 0xFF)<<24) | (($recData[1] & 0xFF)<<16) | (($recData[2] & 0xFF)<<8) | (($recData[3] & 0xFF));
            $ulong = pack('L*', $raw);
            $float = unpack('f*', $ulong);
    
    setLogicLinkAusgang($id,1,$float[1]);
    
    setLogicElementStatus($id,0);
    sql_disconnect();
    ?>
    ###[/EXEC]###
    >>Smelly One<<
    >> BURLI <<
    Grüße Armin

    Kommentar


      #47
      Oha...

      So wird das nichts werden... Also:

      setLogicElementStatus($id,1); "startet" den Baustein, d.h. der Baustein wird ab jetzt tausende Male pro Sekunde aufgerufen! Und das EXEC-Script gleich mit:
      callLogicFunctionExec(LBSID,$id);

      Das ganze muss also eher so (auf die Schnelle - ohne jetzt den LBS verstanden zu haben):

      (klappt nicht hier im Editor)

      Also alles im LBS muss irgendwie an eine Bedingung geknüpft werden - die 4 Funktionsaufrufe außerhalb der IF-Statements gehören da nicht hin!
      Zuletzt geändert von gaert; 24.01.2016, 21:33.
      EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

      Kommentar


        #48
        Hallo Christian,

        kannst du bitte mal drüberschauen?

        Hi,

        kann mir jemand sagen, warum hier in die Variable "$sensor" kein Wert geschrieben wird?

        Code:

        $xml = simplexml_load_file(rawurlencode($xmlfile)); $sensor = $xml->sensor[$E[3]['value']];
        Wenn ich ein bestimmtes Array auslese funktioniert es.
        Code:

        $sensor = $xml->sensor[0];
        Die Eingänge habe ich eingelesen...
        Code:

        if ($E=getLogicEingangDataAll($id)) {...}
        Der Code ist unter "[EXEC]"
        Danke

        Kommentar


          #49
          Danke. Habe auch noch ein paar Fehler gefunden. CPU-Last ist jetzt gut.
          Leider werden die Variablen unten n1 und n2 nicht gefüllt.

          Code:
          ###[DEF]###
          [name        =Modbus Float]
          [E#1        =MW]
          [E#2        =Anz]
          [A#1        =Ausgabewert]
          ###[/DEF]###
          
          
          ###[HELP]###
          ###[/HELP]###
          
          
          ###[LBS]###
          <?
          function LB_LBSID($id)  {
                      if ($E=getLogicEingangDataAll($id))  {
                              if ($E[1]['value']!=0 && $E[1]['refresh']==1) {
                                  $A=$E[1]['value'];
                                  if (is_null($A) || !is_numeric($A)) {$A=0;}
                                  setLogicElementVar($id,1,$A);
                              }
                              if ($E[2]['value']!=0 && $E[2]['refresh']==1) {
                                  $B=$E[2]['value'];
                                  if (is_null($B) || !is_numeric($B)) {$B=0;}
                                  setLogicElementVar($id,2,$B);
                              }
                      }
                  if (getLogicElementStatus($id)==0)  {
                      setLogicElementStatus($id,1);                        //LBS    "starten"
                      callLogicFunctionExec(LBSID,$id);                    //EXEC-Script    starten
                  }
          }                
          ?>
          ###[/LBS]###
          
          ###[EXEC]###
          <?
          require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
          require_once (dirname(__FILE__)."/../../../../main/include/php/ModbusMaster.php");
          sql_connect();
          
          $n1 = getLogicElementVar($id,1);
          $n2 = getLogicElementVar($id,2);
          
          $modbus = new ModbusMaster("192.168.2.45", "TCP");
          try {
              // FC 3 2x16-bit float
              $recData = $modbus->readMultipleRegisters(0, $n1, $n2);
          }
          catch (Exception $e) {
               exit;
          }
          $raw = (($recData[0] & 0xFF)<<24) | (($recData[1] & 0xFF)<<16) | (($recData[2] & 0xFF)<<8) | (($recData[3] & 0xFF));
                  $ulong = pack('L*', $raw);
                  $float = unpack('f*', $ulong);
          
          setLogicLinkAusgang($id,1,$float[1]);
          
          setLogicElementStatus($id,0);
          sql_disconnect();
          ?>
          ###[/EXEC]###
          >>Smelly One<<
          >> BURLI <<
          Grüße Armin

          Kommentar


            #50
            Auf die Schnelle fällt mir folgendes auf:
            • die Variablen sind nicht deklariert: in [DEF] muss [v#1 = 0 (oder was auch immer)] stehen - selbiges für v#2
            • der LBS muss nicht unbedingt "laufen", da er ohnehin nichts macht während er "läuft" (ist ja kein Timer-Baustein oder ähnliches)
              • es würde also genügen, eine Variable (z.B. v#3) als Status-Variable zu nutzen (LBS setzt v3=1 und EXEC am Ende V3=0 oder so ähnlich)
              • Vorteil: Spart Ressourcen - sonst wird der LBS ständig "überwacht" bis er nicht mehr "läuft" (ist jetzt hier nicht soooo wichtig, aber bei hunderten Bausteinen dieser Art vielleicht schon)
            • Vorsicht beim "includen" von irgendwelchen PHP-Dateien (Klassen/Funktionen)! Wenn dort eine Funktion/Variable/etc. zufällig namentlich kollidiert mit den EDOMI-Funktionen, gibt's natürlich Probleme...
            • per Default ist ein PHP-Timelimit von 30s für die EXEC-Scripte definiert
              • soll's länger dauern: set_time_limit(<Sekunden>); am Anfang des EXEC-Scripts einfügen (NACH dem require)
              • oder gar set_time_limit(0); für "unendlich"
            @checkerex:
            Ich bitte um Verständnis, dass ich hier nur einige Grundlagen klären kann - die Doku werde ich natürlich noch vervollständigen (auch in Sachen LBS-Erstellung). Wenn ich hier auf jede Frage eingehe, komme ich bald zu gar nichts mehr
            Zuletzt geändert von gaert; 24.01.2016, 22:32.
            EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

            Kommentar


              #51
              Zitat von gaert Beitrag anzeigen
              Auf die Schnelle fällt mir folgendes auf:[LIST][*]die Variablen sind nicht deklariert: in [DEF] muss [v#1 = 0 (oder was auch immer)] stehen - selbiges für v#2[*]der LBS muss nicht unbedingt "laufen", da er ohnehin nichts macht während er "läuft" (ist ja kein Timer-Baustein oder ähnliches)
              DANKE, hat funktioniert und sieht nun so aus für alle Interessenten:
              Code:
              ###[DEF]###
              [name        =Modbus Float]
              [e#1        =MW]
              [e#2        =Anz]
              [e#3        =Abfragetimer #init=0]
              [a#1        =Ausgabewert]
              [v#1        =0]
              [v#2        =0]
              ###[/DEF]###
              
              
              ###[HELP]###
              ###[/HELP]###
              
              
              ###[LBS]###
              <?
              function LB_LBSID($id)  {
                          if ($E=getLogicEingangDataAll($id))  {
                                  if ($E[1]['value']!=0 && $E[1]['refresh']==1)  {
                                      $v1=$E[1]['value'];
                                      setLogicElementVar($id,1,$v1);
                                  }
                                  if ($E[2]['value']!=0 && $E[2]['refresh']==1)  {
                                      $v2=$E[2]['value'];
                                      setLogicElementVar($id,2,$v2);
                                  }
                          }
                          if ($E[3]['value']=1 && $E[3]['refresh']==1)  {  
                                  callLogicFunctionExec(LBSID,$id);                    //EXEC-Script    starten
                          }
              }                
              ?>
              ###[/LBS]###
              
              ###[EXEC]###
              <?
              require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
              require_once(dirname(__FILE__)."/../../../../main/include/php/ModbusMaster.php");
              sql_connect();
              
              $v1 = getLogicElementVar($id,1);
              $v2 = getLogicElementVar($id,2);
              
              $modbus = new ModbusMaster("192.168.2.45", "TCP");
              try {
                  // FC 3 2x16-bit float
                  $recData = $modbus->readMultipleRegisters(0, $v1, $v2);
              }
              catch (Exception $e) {
                   exit;
              }
              $raw = (($recData[0] & 0xFF)<<24) | (($recData[1] & 0xFF)<<16) | (($recData[2] & 0xFF)<<8) | (($recData[3] & 0xFF));
                      $ulong = pack('L*', $raw);
                      $float = unpack('f*', $ulong);
              
              setLogicLinkAusgang($id,1,$float[1]);
              
              sql_disconnect();
              ?>
              ###[/EXEC]###
              Edomi - 25_01.jpg


              Das Ganze funktioniert so für Float von der Wago per Modbus TCP:
              1. Merkerwort der Wago eintragen z.B. 12772
              2. Anzahl zu lesender Wörter z.B 2
              3. Oszillator frägt nun alle 60s für 10ms den Wert von der Wago usw.

              Funktioniert 1A.
              Zuletzt geändert von WagoKlemme; 25.01.2016, 21:20.
              >>Smelly One<<
              >> BURLI <<
              Grüße Armin

              Kommentar


                #52
                Ups..
                >>Smelly One<<
                >> BURLI <<
                Grüße Armin

                Kommentar


                  #53
                  Hallo Christian,

                  ist es möglich über ein internes KO bidirektional zu kommunizieren (d.h. read/write)?
                  Falls ja, darf man einen LBS "kurzschließen" (KO 1->Eingang->LBS->Ausgang->KO 1)? Oder wie wird es gemacht?
                  Falls nein, kann man read/write-Parameter eines externen Gerätes nur über zwei getrennte KOs abbilden (KO 1->Eingang->LBS->Ausgang->KO 2)?

                  Kommentar


                    #54
                    Sorry, aber Deine Frage verstehe ich irgendwie so garnicht?!
                    EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                    Kommentar


                      #55
                      Ich versuche es mal anders zu formulieren.

                      Wenn man mit einem externen Gerät per LBS kommunizieren möchte und dieses Gerät read/write-Parameter hat (z.B. Soll-Temperatur lesen/schreiben), geht es mit einem KO als LBS-Schnittstelle oder muss man dafür immer ein KO-Paar spendieren (KO1 = read, KO2 = write)?

                      Im ersten Fall würde das gleiche KO am sowohl am Eingang als auch am Ausgang eines LBS hängen, was einem "Kurzschluss" gleich wäre. Käme edomi damit zurecht?

                      Im zweiten Fall verdoppelt man die Anzahl der benötigten KOs. Mein Problem ist, dass ich über 100 read/write Parameter habe, die ich einbinden möchte. Das übersichtlich zu gestalten, erscheint mir ein bisschen schwierig.
                      Zuletzt geändert von toggle; 26.01.2016, 20:11.

                      Kommentar


                        #56
                        Ich würde Dir empfehlen, Dich zunächst einmal mit Logiken als solches zu beschäftigen (HomeServer). Und mit dem Grundprinzip von KNX. Nicht böse gemeint!

                        EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                        Kommentar


                          #57
                          Gibt es da gute Quellen (Tutorials, Beispiele, Grundlagen)? Ich kenne den Homeserver nur von Bildern und falls Edomi einen ähnlichen Logikeditor verwendet, könnte man sicher von bekannten Links profitieren. Schliesslich gibts den HS ja schon länger.

                          Kommentar


                            #58
                            Zugegeben, meine Frage hat wohl diese Antwort herausgefordert.

                            Dass KNX seine Konzepte und Einschränkungen hat, ist mir durchaus bewußt. Es bedeutet aber nicht zwingendermaßen, dass es bei Neuentwicklungen wie edomi keine neuen Konzepte/Erweiterungen geben kann. Z.B. in smarthome.py gibt es Items, die gelesen und/oder gesetzt werden können. Ob dahinter ein KO oder mehrere stecken, hängt davon ab, was ein Plugin daraus macht. Da edomi keine Plugins unterstützen wird, muss wohl alles über LBS umgesetzt werden.

                            Mein erster Ansatz war, alle Daten der WP auf den Bus zu legen, dann wäre alles auch ohne Plugins oder Logiken in edomi verfügbar. Aber ich möchte den Bus nicht unnötig belasten. Deswegen suche ich nach einer sinnvollen Alternative für die Umsetzung.

                            Da 20+ Ein- und Ausgänge an einem LBS kaum zielführend sind, werde ich wohl einen externen Server brauchen, auf den mehrere LBS mit unterschiedlichen Parametergruppen lesend bzw. schreibend zugreifen können. Oder gibt es bessere Alternativen, abgesehen von Vorschlägen, die Liste auf 3-5 Parameter zu reduzieren?

                            Kommentar


                              #59
                              Ich habe nun auch EDOMI in Betrieb und muss sagen das ist schon ein super Stück an Software geworden.

                              Ich habe auch gleich versucht einen eigenen kleinen LBS zu erstellen, meine Fenster haben oben und unten Reed-Kontakte und der LBS gibt einen Status aus (geschlossen, gekippt, drehgeöffnet). Nun möchte ich das EDOMI auch den Status nach einer Anfrage auf dem KNX-Bus sendet, ähnlich wie der Requestauslöser.

                              Meine Frage ist, wie setze ich das am einfachsten um? Kann ich eventuell in meinem LBS ermitteln, ob an einem Ausgang eine Leseanforderung gesendet wurde?

                              Kommentar


                                #60
                                Irgendwo hier habe ich ein Beispiel geposted zum LBS "Requestauslöser"...
                                EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                                Kommentar

                                Lädt...
                                X