Ankündigung

Einklappen
Keine Ankündigung bisher.

Telenot LBS--jemand Lust

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

    #46
    Richtig - wenn kein Client das Script aufruft gibt's auch keine (Client)-IP Die Server IP (lokal) ist übrigens in der EDOMI-Konstante global_serverIP verfügbar.
    EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

    Kommentar


      #47
      Ok, Danke hab ich verstanden.

      @gaert
      Bei mir ist das System-KO "Server-IP" leer. Kannst du mir sagen woran das liegen könnte??

      Kommentar


        #48
        Du musst/kannst in der edomi.ini festlegen, wie die WAN-IP Deines Servers ermittelt werden soll (per Fritzbox, Webdienst oder EDOMI-Server). Solange dies nicht konfiguriert ist, bleibt das SysKO leer...

        Die o.g. Konstante hat mit dem SysKO nix zu tun - dies nur als Hinweis
        EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

        Kommentar


          #49
          Die WAN-IP ist aber nicht das was unter normalen Umstaenden die IP des Servers ist (und/oder in $_SERVER stehen taete)...

          Kommentar


            #50
            Korrekt

            Also - jetzt nochmal zum mitschreiben:
            • global_serverIP: die lokale IP des Servers (wie bei der Installation angegeben)
            • System-KO "Server-IP": enthält ggf. die öffentliche IP des Servers (also die IP, unter der der Server theoretisch im Internet erreichbar ist - bzw. der DSL-Router)
            • $_SERVER['REMOTE_ADDR']: die IP des Clients(!), der eine PHP-Seite auf dem Server abruft (funktioniert natürlich nur per Browser)
            Die Erläuterungen sind natürlich nicht vollständig, sondern dienen nur zum Verständnis in diesem Kontext...
            EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

            Kommentar


              #51
              Danke

              hab ich gefunden und verstanden. Habe auch global_serverIP in der edomi.ini entdeckt, diese ist ja bereits durch Installation angegeben.

              Kommentar


                #52
                Kann mir noch jemand auf die Sprünge helfen mit variable außerhalb einer while schleife nutzen?? Hab viel getestet aber will nicht so recht. Danke

                Gruß

                Kommentar


                  #53
                  Wieso willst du denn die Variable $buf außerhalb der while-Schleife verwenden?
                  Wenn du die while-Schleife verlässt, beendet sich den EXEC Skript.
                  Aber auch außerhalb ist die Variable $buf verfügbar. Solange du sie nicht in einer anderen Funktion verwendest ist alles gut..

                  Kommentar


                    #54
                    wenn ich eine if mit der variable $buf machen möchte, funktioniert die derzeit nur in der schleife. Sobald Sie außerhalb der schleife ist, funktioniert es nicht mehr (siehe Code)
                    Problem ist: $buf bekommt alle 3s von der EMA Daten, allerdings wird der Logikausgang 2 durch die Schleife in viel öfter in den MonitorLog geschrieben. Ich wollte damit erzielen, dass Ausgang 2 nur alle 3s gesetzt wird wenn $buff Daten vom sick erhält. Oder soll ich eine while schleife in der Schleife bauen ???



                    Code:
                    
                    // connection
                    $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
                    $bind = socket_bind($sock,$myip );
                    socket_connect($sock, $ip, $port);
                    socket_set_nonblock($sock);
                    socket_set_option($sock,SOL_SOCKET,SO_KEEPALIVE,1);
                    
                    // read loop
                    while (1) 
                    {
                        
                        $buf = socket_read($sock,2048);   // read data from socket
                        if ($buf!='')       
                        {
                         setLogicLinkAusgang($id,1,ascii2hex($buf));
                        }
                        
                        usleep(100000);
                    }
                        
                        if ($buf!='hh@B')
                        {
                         setLogicLinkAusgang($id,2,1);     
                        }

                    Kommentar


                      #55
                      Ich glaube du solltest mal grundsätzlich erklären was du machen willst.
                      Also zum Beispiel:

                      1. Dauerhaft Lesen was die EMA sendet
                      2. Auf bestimmte Daten der EMA reagieren (z.B. hh@B empfangen => hh senden => xyz in EDOMI machen)

                      Sonst kannst du dein Skript noch 10 mal neu designen.

                      Dein Ausgang 2 wird im o.g. gar nicht gesetzt, da er außerhalb der while Schleife liegt und nie erreicht wird.
                      Dass Ausgang 1 öfter gesetzt wird ist klar, da socket_read() false zurückgibt, wenn nichts gelesen wird, daher ist false!=''. Glaube ich zumindest.

                      Aber am wichtigsten ist der o.g. Hinweis:
                      Schreib möglichst genau auf was das Skript können muss, dann kann dir auch geholfen werden.

                      Kommentar


                        #56
                        Zitat von jonofe Beitrag anzeigen

                        Sonst kannst du dein Skript noch 10 mal neu designen.
                        Bin ich schon weit drüber

                        Zitat von jonofe Beitrag anzeigen
                        Dein Ausgang 2 wird im o.g. gar nicht gesetzt, da er außerhalb der while Schleife liegt und nie erreicht wird.
                        Dass Ausgang 1 öfter gesetzt wird ist klar, da socket_read() false zurückgibt, wenn nichts gelesen wird, daher ist false!=''. Glaube ich zumindest.
                        Ausgang 1 gibt kein false...gibt die Daten so raus wie sie kommen alle 3s....passt also. Ausgang 2 wird von der while Schleife aber öfter gesetzt mit 1 da ja immer "true" in denen 3s Pause.



                        Vom Prinzip her ist es eigentlich ganz simpel was ich möchte


                        EMA sendet --> SEND NORM
                        LBS soll zurück senden --->CONF_ACK
                        EMA sendet --> NDAT
                        LBS soll zurück senden --->CONF_ACK
                        EMA sendet --->NDAT2
                        LBS soll zurück senden ---->CONF_ACK
                        EMA sendet --->NDAT3
                        LBS soll zurück senden ---->CONF_ACK
                        EMA sendet --->NDAT4
                        LBS soll zurück senden ---->CONF_ACK

                        spiel beginnt von vorne.....


                        Jetzt war ich mir unschlüssig dies alles in einem LBS zu bauen. Mit Ausgang 2 wollte ich einen weiteren LBS triggern der CONF_ACK übernimmt. Wobei das ja eigentlich auch in einem LBS funktionieren sollte.

                        immer wenn die EMA sendet muss halt mit CONF_ACK geantwortet werden. Ich hab mir halt gedacht den hex (NDAT, NDAT2 usw) in eine variable zu schreiben und dann halt oder Funktion bauen um CONF_ACK zu schicken. Dies wollte ich halt mal mit SEND_NORM teste. in Hterm funktioniert die ganze Sache auch soweit....ist halt schwierig in php umzusetzen...


                        quasi

                        if $buf = ($a or $b or $c usw.)
                        {
                        $sockwrite($sock, 'CONF_ACK)
                        }


                        oder hab ich da etwas falsch verstanden???


                        Zudem müssten die Daten von $buf noch auf Ausgang gelegt werden da ich die Daten ja auswerten muss, aber das wäre ja dann
                        if $buf = ($a)
                        setLogikAusgang(id,3, $buff) usw. Daten würde ich remanent in KO speichern, wobei Sie ja auch alle 3s neu kommen.



                        Zudem muss ich halt einen Ausgang setzen auf ca. 2,7 welcher mir angibt, dass senden erlaubt ist(Quasi merker). Ich kann nur zur EMA senden wenn diese gerade nicht sendet. (tpoll 3s) Wäre aber erstmal nicht so von Bedeutung da ich ja immer nur mit CONF_ACK antworte und eigentlich gar nicht über EDOMI unscharf etc schalten möchte. Dies passiert weiterhin nur über EMA selbst......dient lediglich der Statusanzeige Fenster usw.


                        Ich hoffe ich konnte es einigermaßen gut erklären

                        Kommentar


                          #57
                          und was bedeutet NDAT, NDAT2, NDAT3, NDAT4??? Sind das hier Platzhalter oder sind das genau die Strings, die da kommen?
                          Und warum muss da HEX drauf gemacht werden?

                          Kommentar


                            #58
                            Ich denke mal das das die Nutzdaten1 - 4 sind

                            Kommentar


                              #59
                              Ja sind Platzhalter, also die Nutzdaten. SEND_NORM und CONF_ACK sind ebenfalls Platzhalter. Diese werden dann mit den HEX werten aus der Schnittstellenbeschreibung von Telenot gefüllt.

                              Kommentar


                                #60
                                Von der Struktur würde ich es so aufbauen:

                                PHP-Code:

                                <?php
                                // configuration
                                $myip '192.168.0.10';  // IP wo dieses Skript gestartet wird
                                $ip '192.168.0.47';    // IP wo ser2net läuft
                                $port 5332;            // Port auf dem ser2net lauscht

                                // connection
                                $sock socket_create(AF_INETSOCK_STREAMSOL_TCP);
                                $bind socket_bind($sock,$myip );
                                socket_connect($sock$ip$port);
                                socket_set_nonblock($sock);
                                socket_set_option($sock,SOL_SOCKET,SO_KEEPALIVE,1);


                                function 
                                send($sock$cmd)
                                {
                                    
                                $result socket_write($sock,$cmd);
                                    return 
                                $result;
                                }


                                // read loop
                                while (1
                                {
                                    
                                $buf socket_read($sock,2048);     // read data from socket
                                    
                                if ($buf)
                                    {
                                        switch (
                                $buf){
                                            case 
                                'SEND_NORM':
                                                
                                send($sock'CONF_ACK');
                                                
                                // weiterer Code was nach einem SEND_NORM noch gemacht werden soll

                                                
                                break;
                                            case 
                                'NDAT':
                                                
                                send($sock'CONF_ACK');
                                                
                                // weiterer Code was nach einem NDAT noch gemacht werden soll
                                                
                                                
                                break;
                                            case 
                                'NDAT2':
                                                
                                send($sock'CONF_ACK');
                                                
                                // weiterer Code was nach einem NDAT2 noch gemacht werden soll
                                                
                                                
                                beak;
                                            case 
                                'NDAT3':
                                                
                                send($sock'CONF_ACK');
                                                
                                // weiterer Code was nach einem NDAT3 noch gemacht werden soll
                                                
                                                
                                break;
                                            case 
                                'NDAT4':
                                                
                                send($sock'CONF_ACK');
                                                
                                // weiterer Code was nach einem NDAT4 noch gemacht werden soll
                                                
                                                
                                break;
                                            default:
                                                break;
                                        }
                                    }
                                    
                                usleep(100000);
                                }

                                ?>

                                Kommentar

                                Lädt...
                                X