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

    #31
    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]"
    Zuletzt geändert von checkerex; 24.01.2016, 09:27.

    Kommentar


      #32
      Ich habe mich jetzt auch mal Code probiert
      Eine kleine Webabfrage welche mir einfach das Vorhandensein von Bildern auf einer Webseite zeigt.
      Der Code funktioniert wenn ich ihn auf dem Server selber ausführe (habe lediglich die Variablen gegen setLogicLinkAusgang ausgetauscht.
      Jedoch in EDOMI wird es rot dargestellt. Evtl. kann jemand helfen.

      Code:
      ###[DEF]###
      
      [name=Abfrage Nibe Wärmepupe]
      
      [e#1=Trigger]
      
      [a#1=Pumpe]
      [a#2=Compressor]
      [a#3=Heizung]
      [a#4=Solepumpe]
      
      ###[/DEF]###
      
      ###[HELP]###
      ###[/HELP]###
      
      ###[LBS]###
      
      <?
      function    LB_LBSID($id)    {
      
           if    ($E=getLogicEingangDataAll($id))    {
       if    (getLogicElementStatus($id)==0)    {
      
                     if    ($E[1]['value']!=0    &&    $E[1]['refresh']==1)    {
                          setLogicElementStatus($id,1);                         //LBS    "starten"
                          callLogicFunctionExec(LBSID,$id);                    //EXEC-Script    starten
                  }
              }
           }
      }
      ?>
      
      ###[/LBS]###
      
      ###[EXEC]###
      
      <?
      
      require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
      
      sql_connect();
      
      //-------------------------------------------------------------------------------------
      
      $homepage = file_get_contents('http://192.168.3.70/nibe_overview.htm');
      
      $pumpe ='Supply_Tiny.png';
      $suche_pumpe = strpos($homepage, $pumpe);
      if ($suche_pumpe === false) { setLogicLinkAusgang($id,1,0); } else  { setLogicLinkAusgang($id,1,1); }
      
      $compressor ='Compressor_Tiny.png';
      $suche_compressor = strpos($homepage, $compressor);
      if ($suche_compressor === false) { setLogicLinkAusgang($id,2,0); } else  { setLogicLinkAusgang($id,2,1); }
      
      $heizung ='Heating_Tiny.png';
      $suche_heizung = strpos($homepage, $heizung);
      if ($suche_heizung === false) { setLogicLinkAusgang($id,3,0); } else  { setLogicLinkAusgang($id,3,1); }
      
      $sole ='Brine_Tiny.png';
      $suche_sole = strpos($homepage, $sole);
      if ($suche_sole === false) { setLogicLinkAusgang($id,4,0); } else  { setLogicLinkAusgang($id,4,1); }
      
      //-------------------------------------------------------------------------------------
      
      sql_disconnect();
      
      ?>
      
      ###[/EXEC]###

      Kommentar


        #33
        Ganz einfach: Du hast Dich nicht an die Doku gehalten

        Im Ernst: Die Funktion

        Code:
         function    LB_LBSID($id)    {
        muss exakt(!) wie in der Doku aussehen - also ohne zusätzlichen Whitespace:
        Code:
         function LB_LBSID($id) {
        Der LBS-Parser muss diese Funktion in genau dieser Form vorfinden - sonst gibt's rot...
        EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

        Kommentar


          #34
          Ganz im Gegenteil, der Teil stammte aus der Doku und wurde von mir nicht angepaßt
          Habe dann alles nochmal neu aufgebaut mit dem Code aus einem bestehenden Baustein -> Damit geht es !
          DANKE

          Kommentar


            #35
            Copy und Paste aus der PDF ist vermutlich keine gute Idee - da werden offenbar Tabs eingefügt etc.

            Tipp: Du kannst in der Konfiguration einfach einen neuen LBS anlegen - dann wird automatisch ein Grundgerüst erzeugt.

            Tipp2: In deinem LBS fehlt das "stoppen" des Bausteins! Am Ende des EXEC muss du dies ergänzen, sonst kann der Baustein nur einmal getriggert werden und dann nie wieder... Und Fehlerbehandling nicht vergessen, etc.
            EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

            Kommentar


              #36
              ich muss zugeben das ich programmiertechnisch, eigentlich null Ahnung habe.

              Ich habe dank google, ein komplettes PHP gefunden, mit welchem ich meinen
              Panasonic steuern könnte.

              Wie ich im LBS Eingänge anlege ist mir klar,
              ich müsste ja für jede Aktion (AN/AUS, Lauter, Leiser etc) einen Eingang anlegen,
              desweiteren müsste ich den Host(den TV) über einen Eingang anlegen.

              Per Copy/Paste müsste der PHP Code ja Theoretisch hinter EXEC.
              Aber wie bekomme ich es nun hin das der LBS auf dem Ausgang einen String sendet????

              Ich habe mal den Code angehängt, vielleicht hat ja jemand Zeit mir zu helfen.

              Code:
                 ###[DEF]###
              [name=Panasonic]
                 
                [e#1=An_AUS]
              [e#2=VolumeUP]
              [e#3=VolumeDown]
              [e#4=ChannelUP]
              [e#5=ChannelDown]
                 
                [a#1=AusgangHTTP]
              ###[/DEF]###
                 
                
              ###[HELP]###
              ###[/HELP]###
                 
                
              ###[LBS]###
              <?
              function LB_LBSID($id) {
               if ($E=getLogicEingangDataAll($id)) {
                //...
               }
              }
              ?>
              ###[/LBS]###
                 
                
              ###[EXEC]###
              <?
              require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
              sql_connect();
                 
                class vieraControl
              {
               public $host;
               
               function __construct($hostname = false)
               {
                if ($hostname)
                 $this->host = $hostname;
               }
               
               function createRequest($url, $urn, $action, $option = array())
               {
                 
                $input = '<?xml version="1.0" encoding="utf-8"?>
              <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
               <s:Body>
                <u:'.$action.' xmlns:u="urn:'.$urn.'">
                '.$option['args'].'
                </u:'.$action.'>
               </s:Body>
              </s:Envelope>';
                $curl = curl_init();
                curl_setopt($curl, CURLOPT_URL, 'http://'.$this->host.':55000/'.$url);
                curl_setopt($curl, CURLOPT_POST, 1);
                curl_setopt($curl, CURLOPT_HTTPHEADER, array('SOAPACTION: "urn:'.$urn.'#'.$action.'"'));  
                curl_setopt($curl, CURLOPT_POSTFIELDS, $input);
                //curl_setopt($curl, CURLOPT_HEADER, true);
                curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
                $data = curl_exec($curl);
                
                if ($option['returnXml'])
                 return $data;
                else
                 return $this->getResponse($data);
               }
               
               function getResponse($data)
               {
                $xml = simplexml_load_string($data);
                if ($xml === false)
                 return false;
                $ns = $xml->getNamespaces(true);
                $soap = $xml->children($ns['s']);
                $res = $soap->children($ns['u'])->children();
                return $res[0];
               }
               
               function getVolume()
               {
                return $this->createRequest(
                 'dmr/control_0',
                 'schemas-upnp-org:service:RenderingControl:1',
                 'GetVolume',
                 array('args' => '<InstanceID>0</InstanceID><Channel>Master</Channel>')
                );
               }
               
               function sendKey($keyCode)
               {
                return $this->createRequest(
                 'nrc/control_0',
                 'panasonic-com:service:p00NetworkControl:1',
                 'X_SendKey',
                 array(
                  'args' => '<X_KeyEvent>' . $keyCode . '</X_KeyEvent>',
                  'returnXml' => true
                 )
                );
               }
               
               function getMute()
               {
                return $this->createRequest(
                 'dmr/control_0',
                 'schemas-upnp-org:service:RenderingControl:1',
                 'GetMute',
                 array('args' => '<InstanceID>0</InstanceID><Channel>Master</Channel>')
                );
               }
               
               function setMute($enable = false)
               {
                $data = ($enable) ? '1' : '0';
                return $this->createRequest(
                 'dmr/control_0',
                 'schemas-upnp-org:service:RenderingControl:1',
                 'SetMute',
                 array('args' => '<InstanceID>0</InstanceID><Channel>Master</Channel><DesiredMute>'.$data.'</DesiredMute>')
                );
               }
                 
                 function setVolume($volume = '0')
               {
                $volume = intval($volume);
                if ($volume > 100 || $volume < 0)
                 throw new Exception('Bad request to volume control. Must be between 0 and 100');
                 
                return $this->createRequest(
                 'dmr/control_0',
                 'schemas-upnp-org:service:RenderingControl:1',
                 'SetVolume',
                 array('args' => '<InstanceID>0</InstanceID><Channel>Master</Channel><DesiredVolume>'.$volume.'</DesiredVolume>', 'returnXml' => true)
                );
               }
               
               function sendString($string)
               {
                return $this->createRequest(
                 'nrc/control_0',
                 'panasonic-com:service:p00NetworkControl:1',
                 'X_SendString',
                 array(
                  'args' => '<X_String>' . $string . '</X_String>',
                  'returnXml' => true
                 )
                );  
               }
              }
                 
                $keys = array(
               "NRC_CH_DOWN-ONOFF", // channel down
               "NRC_CH_UP-ONOFF", // channel up
               "NRC_VOLUP-ONOFF", // volume up
               "NRC_VOLDOWN-ONOFF", // volume down
               "NRC_MUTE-ONOFF", // mute
               "NRC_TV-ONOFF", // TV
               "NRC_CHG_INPUT-ONOFF", // AV,
               "NRC_RED-ONOFF", // red
               "NRC_GREEN-ONOFF", // green
               "NRC_YELLOW-ONOFF", // yellow
               "NRC_BLUE-ONOFF", // blue
               "NRC_VTOOLS-ONOFF", // VIERA tools
               "NRC_CANCEL-ONOFF", // Cancel / Exit
               "NRC_SUBMENU-ONOFF", // Option
               "NRC_RETURN-ONOFF", // Return
               "NRC_ENTER-ONOFF", // Control Center click / enter
               "NRC_RIGHT-ONOFF", // Control RIGHT
               "NRC_LEFT-ONOFF", // Control LEFT
               "NRC_UP-ONOFF", // Control UP
               "NRC_DOWN-ONOFF", // Control DOWN
               "NRC_3D-ONOFF", // 3D button
               "NRC_SD_CARD-ONOFF", // SD-card
               "NRC_DISP_MODE-ONOFF", // Display mode / Aspect ratio
               "NRC_MENU-ONOFF", // Menu
               "NRC_INTERNET-ONOFF", // VIERA connect
               "NRC_VIERA_LINK-ONOFF", // VIERA link
               "NRC_EPG-ONOFF", // Guide / EPG
               "NRC_TEXT-ONOFF", // Text / TTV
               "NRC_STTL-ONOFF", // STTL / Subtitles
               "NRC_INFO-ONOFF", // info
               "NRC_INDEX-ONOFF", // TTV index
               "NRC_HOLD-ONOFF", // TTV hold / image freeze
               "NRC_R_TUNE-ONOFF", // Last view
               "NRC_POWER-ONOFF", // Power off
               
               "NRC_REW-ONOFF", // rewind
               "NRC_PLAY-ONOFF", // play
               "NRC_FF-ONOFF", // fast forward
               "NRC_SKIP_PREV-ONOFF", // skip previous
               "NRC_PAUSE-ONOFF", // pause
               "NRC_SKIP_NEXT-ONOFF", // skip next
               "NRC_STOP-ONOFF", // stop
               "NRC_REC-ONOFF", // record
               
               // numeric buttons
               "NRC_D1-ONOFF", "NRC_D2-ONOFF", "NRC_D3-ONOFF", "NRC_D4-ONOFF", "NRC_D5-ONOFF",
               "NRC_D6-ONOFF", "NRC_D7-ONOFF", "NRC_D8-ONOFF", "NRC_D9-ONOFF", "NRC_D0-ONOFF",
               
               // The below commands were not avaliable in the iPhone app when using my
               // VIERA G30 - they were pulled out from a disassembly instead
               // only these top three did anything on my TV
               
               "NRC_P_NR-ONOFF", // P-NR (Noise reduction)
               "NRC_OFFTIMER-ONOFF", // off timer
               "NRC_R_TUNE-ONOFF", // Seems to do the same as INFO
               
               "NRC_CHG_NETWORK-ONOFF",
               "NRC_CC-ONOFF",
               "NRC_SAP-ONOFF",
               "NRC_RECLIST-ONOFF",
               "NRC_DRIVE-ONOFF",
               "NRC_DATA-ONOFF",
               "NRC_BD-ONOFF",
               "NRC_FAVORITE-ONOFF",
               "NRC_DIGA_CTL-ONOFF",
               "NRC_VOD-ONOFF",
               "NRC_ECO-ONOFF",
               "NRC_GAME-ONOFF",
               "NRC_EZ_SYNC-ONOFF",
               "NRC_PICTAI-ONOFF",
               "NRC_MPX-ONOFF",
               "NRC_SPLIT-ONOFF",
               "NRC_SWAP-ONOFF",
               "NRC_R_SCREEN-ONOFF",
               "NRC_30S_SKIP-ONOFF",
               "NRC_PROG-ONOFF",
               "NRC_TV_MUTE_ON-ONOFF",
               "NRC_TV_MUTE_OFF-ONOFF",
               "NRC_DMS_CH_UP-ONOFF",
               "NRC_DMS_CH_DOWN-ONOFF"
                 
                );
                 
                
              sql_disconnect();
              ?>
              ###[/EXEC]###

              Kommentar


                #37
                Einfach oben deine Ausgänge definieren und dann mit setLogicAusgang($id,<Ausgang>,<Wert bzw.Variable ($xyz)>)

                Kommentar


                  #38
                  SeatSLF
                  Dir gehts wie mir - habe Stunden - gebraucht. Dir fehlt ein
                  callLogicFunctionExec(LBSID,$id); damit er dein EXEC überhaupt aufruft. Und erst dann kannst Du an deinem String basteln.
                  >>Smelly One<<
                  >> BURLI <<
                  Grüße Armin

                  Kommentar


                    #39
                    Werden/können die von Usern erstellten LBS ins Edomi übernommen werden (Release/Import) ?
                    Danke und LG, Dariusz
                    GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                    Kommentar


                      #40
                      Es hat ja theoretisch nur einen Ausgang, es müsste theoretisch je nachdem welcher Eingang gerade getriggert, müsste ja ein passender http Befehl rauskommen.


                      Das ganze läuft wohl mit Soap, da müsste so meine ich ein http rauskommen.

                      Irgendwie muss die PHP wohl laufen und darauf hin wird dann der String gemacht.

                      Ich habe halt null Ahnung von Programmierung



                      Kommentar


                        #41
                        Jetzt mal noch eine Frage zu den Eingängen, bekomme die nicht in das Script, wie ist da die Syntax?
                        Möchte folgende URL aufrufen

                        Variablen gehen nicht
                        Code:
                          $url = "http://($E[3]):($E[4])@($E[2])";
                        direkt im Code geht
                        Code:
                           $url = "http://user:pw@ip";
                        Habe dafür 3 Eingänge angelegt.

                        Kommentar


                          #42
                          Bitte erstmal die Doku lesen... $E ist 2-dimensional und muss natürlich zunächst definiert werden.
                          EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                          Kommentar


                            #43
                            Zitat von coliflower Beitrag anzeigen
                            Werden/können die von Usern erstellten LBS ins Edomi übernommen werden (Release/Import) ?
                            Bislang ist dies noch nicht vorgesehen (also eine Import-Funktion, bzw. ID-Verwaltung).

                            Aber die LBS können natürlich problemlos ausgetauscht werden:
                            • Datei (VVxxxxxx_lbs.php) in den Order /usr/local/edomi/www/admin/lbs kopieren
                              • VVxxxxxx darf dabei auch beliebig abgeändert werden, z.B. wenn schon ein LBS mit dieser ID existiert
                              • dabei aber die Doku beachten, insb. das VV darf nur bestimmte Werte annehmen
                            • dann in der Verwaltung die "Logikbausteine importieren"
                            • fertig
                            EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                            Kommentar


                              #44
                              Zitat von basaltnischl Beitrag anzeigen
                              Jetzt mal noch eine Frage zu den Eingängen, bekomme die nicht in das Script, wie ist da die Syntax?
                              Genau da hänge ich auch..
                              Ein if ($E=getLogicEingangDataAll($id)) im EXEC-Teil funktioniert zwar, aber nach einiger Zeit läuft due CPU-Last auf 100% hoch.
                              Ich komm einfach nicht drauf.
                              >>Smelly One<<
                              >> BURLI <<
                              Grüße Armin

                              Kommentar


                                #45
                                So ein EXEC-Script ist letztlich nichts weiter als ein ganz normales PHP-Script, das in einer eigenen PHP-CLI-Instanz ausgeführt wird. Wenn also die CPU-Last auf 100% klettert, dann ist das Script nicht korrekt programmiert - ganz unabhängig von EDOMI oder dem LBS, der das Script aufruft.

                                Häufig gemachte Fehler sind z.B. Schleifen, die dem OS (fast) keine Möglichkeit lassen die CPU-Ressourcen anderweitig zu vergeben:

                                PHP-Code:
                                while (...) {
                                //Zeitintensive Berechnungen, Schleife läuft z.B. einige Sekunden

                                In diesem Fall sollte man eine kurze "Wartezeit" einbauen, damit das OS eine Chance hat einzugreifen:

                                PHP-Code:
                                while (...) {
                                //Zeitintensive Berechnungen, Schleife läuft z.B. einige Sekunden
                                usleep(10*1000);

                                usleep() wartet für die angegebene Dauer in Mikrosekunden(!) (also 1/1.000.000 s) - in dem Beispiel also 10 Millisekunden. Das genügt vollkommen - plötzlich ist die CPU-Last bei nahe 0%


                                Ausserdem ist natürlich darauf zu achten, dass das EXEC-Script nicht mehrfach aufgerufen wird (so dies nicht explizit gewünscht ist). Passiert nämlich schnell, wenn man nicht korrekt implementiert. In dem "Komplexen Beispiel" ist eine mögliche Lösung beschrieben: Der "normale" LBS bekommt den Status 1, sobald er getriggert wird und startet das EXEC-Script. Wird der LBS nun nochmal getriggert, passiert nichts (EXEC), da der Status != 0 ist. Das Ganze würde natürlich mit einer beliebigen LBS-Variable (v#1..oo) funktionieren.
                                Zuletzt geändert von gaert; 24.01.2016, 21:13.
                                EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                                Kommentar

                                Lädt...
                                X