Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Script für 1-Wire

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

    #16
    ###[HELP]###
    ###[/HELP]###
    $v2 = getLogicElementVar($id,2);

    ??? das $v2 gehört dort wohl kaum hin... Eher in die Funktion im Abschnitt [LBS].

    Wozu überhaupt v1/v2?! Im EXEC-Teil kannst Du doch genauso auf die Eingänge zugreifen...
    EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

    Kommentar


      #17
      Das ist jetzt nicht mehr vorhanden, klar an dieser Stelle wäre es ja falsch. Natürlich kann ich die Werte auch direkt aufrufen, ich habe diese aber anderen Variablen zugewiesen zum Test.

      Auch wenn ich es direkt verwende wird nur eine 0 eingetragen.

      $url = "http://" . $ip_oneWire . ":" . $port_oneWire . "/" . getLogicElementVar($id,1) . "/" . getLogicElementVar($id,2) ."/" ;


      <tr class="sErr"><td>2016-01-26 18:32:06</td><td>752840</td><td>?</td><td>27751</td><td>/usr/local/edomi/www/data/liveproject/lbs/EXE19000010.php: Code 2 / Zeile 1 / file_get_contents(http://192.168.0.240:2121/28.FF51AC511400/0/): failed to open stream: HTTP request failed! HTTP/1.0 404 Not Found
      </td><td>ERROR</td></tr>

      Kommentar


        #18
        Zitat von gaert Beitrag anzeigen
        Wozu überhaupt v1/v2?! Im EXEC-Teil kannst Du doch genauso auf die Eingänge zugreifen...
        Also bei meinem LBS ging das nicht ohne vorher oben (function) die Werte abzugreifen. In der EXEC kannte er E[1] und E[2] nicht nach Fehlerlog. Was auch logisch ist, nach MEINEM Verständnis wird im EXEC eine Routine in Linux auf die Reise geschickt und woher sollte er dann E[1] und E[2] kennen.
        2016-01-25 19:33:19 120188 ? 17559 /usr/local/edomi/www/data/liveproject/lbs/EXE18000100.php: Code 8 / Zeile 1 / Undefined variable: E ERROR
        2016-01-25 19:33:19 120395 ? 17559 /usr/local/edomi/www/data/liveproject/lbs/EXE18000100.php: Code 8 / Zeile 1 / Undefined variable: E ERROR
        Zuletzt geändert von WagoKlemme; 26.01.2016, 18:54.
        >>Smelly One<<
        >> BURLI <<
        Grüße Armin

        Kommentar


          #19
          So ist es! $E (oder wie auch immer man dieses Array nennen will) muss natürlich auch im EXEC-Teil vorher eingelesen werden - vgl. [LBS]-Abschnitt. Der EXEC-Teil ist vollkommen(!) unabhängig - siehe Doku (wird als vollkommen losgelöste eigene PHP-Instanz behandelt).
          EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

          Kommentar


            #20
            Warum wird aber die 2. Variable die "temperature" enthält mit 0 übergeben während die 1. Variable die 28.FF51AC511400 enthält?

            $url = "http://" . $ip_oneWire . ":" . $port_oneWire . "/" . getLogicElementVar($id,1) . "/" . getLogicElementVar($id,2) ."/" ;

            ergibt

            file_get_contents(http://192.168.0.240:2121/28.FF51AC511400/0/)



            PHP-Code:
            ###[DEF]###
            [name       =OnWire Lesen]
            [e#1        =OWAdresse #init='28.381F85050000']
            [e#2        =Type #init='temperature']
            [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/owsock.php");
            sql_connect();

            $v1 = getLogicElementVar($id,1);
            $v2 = getLogicElementVar($id,2);

            $oneWireAdr = $v1 ;
            $oneWireType = 'temperature' ;

            $ip_oneWire = '192.168.0.240' ;
            $port_oneWire = '2121' ;

            $url = "http://" . $ip_oneWire . ":" . $port_oneWire . "/"  . getLogicElementVar($id,1) . "/" . getLogicElementVar($id,2) ."/" ;

            //$url = "http://192.168.0.240:2121/28.381F85050001/temperature/";   // Hier die Webseite vom Websever eintragen

            $Ausgabe = file_get_contents("$url", "r");
            if ($Ausgabe == true)
            {
                $s = $oneWireType . "</B></TD><TD>" ;
                $pos1 = strpos($Ausgabe,$s);
                $pos2 = strpos($Ausgabe,"</TD>",$pos1);
                $data = substr($Ausgabe,($pos1+strlen($s)),$pos2-$pos1);
                $erg = (float) $data;
            }
            else
            {
                $erg = -99.99 ;
            }


            setLogicLinkAusgang($id,1,$erg);

            sql_disconnect();
            ?>
            ###[/EXEC]###

            Habe gerade mal eine Zahl anstelle "temperature" eingegeben, dann wird diese verwendet. Kann man keinen String an die Eingänge geben?
            Zuletzt geändert von hartmut; 26.01.2016, 22:13.

            Kommentar


              #21
              Doch, man kann String übergeben. Allerdings ist Deine Deklaration falsch

              '' sind nicht erlaubt - korrekt wäre es so:

              #init=temperature

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

              Kommentar


                #22
                Danke, ich werde es morgen früh mal testen

                Kommentar


                  #23
                  gaert So jetzt habe ich das mal getestet, es funktioniert leider nicht.

                  Der Eingang E2 wird jetzt zum Test direkt an den Ausgang übertragen.

                  Übergebe ich am Eingang 1 temperature so erscheint 0

                  Im Beispiel 1 wird ein String temperature übergeben -> an Ausgang erscheint 0.
                  b1.png

                  Ich habe über den Eingang E2 mal eine Zahl eingegeben dann wird diese durchgereicht.
                  B2.png

                  Kommentar


                    #24
                    Ist logisch... Du checkst ja als erstes ob E1 != 0 ist... Ein String aus Buchstaben ist in PHP aber ==0

                    guck dir mal is_null() an...
                    EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                    Kommentar


                      #25
                      Danke, kaum macht man es richtig, schon geht es!

                      Kommentar


                        #26
                        Vielen Dank für die Hilfe. Ich habe es noch etwas erweitert. So kann ich jetzt auch Feuchte vom 1-Wire Bus einlesen!

                        Jetzt wird openhab und die Cometvisu abgeschaltet!


                        Falls es jemand verwenden möchte.

                        f.png

                        PHP-Code:
                        ###[DEF]###
                        [name       =OnWire Lesen]
                        [e#1        =OWAdresse    #init=28.381F85050000]
                        [e#2        =Art          #init=temperature]
                        [e#3        =ipAddr       #init=192.168.0.240]
                        [e#4        =Port         #init=2121]
                        [e#5        =Abfragetimer #init=0]
                        [a#1        =Ausgabewert]
                        [v#1        =0]
                        [v#2        =0]
                        [v#3        =0]
                        [v#4        =0]
                        ###[/DEF]###

                        ###[HELP]###
                        Einlesen eines 1 Wire Wertes der auf einem anderen Rechner ermittelt Wird. Dort muss owfs installiert sein. http://owfs.org/ Zusätzlich muss noch owhttpd laufen. Z.B auf einem Raspberry Pi
                        Der in OWFS enthaltene Webserver owhttpd ermöglicht den Zugriff auf den 1-Wire Bus über einen Webbrowser.
                        Die Hauptansicht zeigt die gefundenen Geräte und man hat die Möglichkeit innerhalb des 1-Wire Busses zu navigieren, Werte anzusehen und zu verändern.
                        Siehe auch http://www.fischer-net.de/hausautomation/haustechnik/1-wire/40-1-wire-software-unter-linux-teil-2.html

                        E1  OW Adresse z.B.   28.381F85050000
                        E2  Was soll ausgelesen werden
                        E3  IP Adresse des Rechners der ausgelesen wird
                        E4  Port z.B. 2121
                        E5  Freigabe 0 = keine Abfrage 1 = Start einer Abfrage

                        ###[/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 ((! is_null($E[2]['value'])) && $E[2]['refresh']==1)  {
                                                $v2=$E[2]['value'];
                                                setLogicElementVar($id,2,$v2);
                                            }
                                            if ((! is_null($E[3]['value'])) && $E[3]['refresh']==1)  {
                                                $v3=$E[3]['value'];
                                                setLogicElementVar($id,3,$v3);
                                            }
                                            if ((! is_null($E[4]['value'])) && $E[4]['refresh']==1)  {
                                                $v4=$E[4]['value'];
                                                setLogicElementVar($id,4,$v4);
                                            }

                                    }
                                    if ($E[5]['value']=1 && $E[5]['refresh']==1)  {  
                                            callLogicFunctionExec(LBSID,$id);                    //EXEC-Script    starten
                                    }
                        }                
                        ?>
                        ###[/LBS]###

                        ###[EXEC]###
                        <?
                        require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
                        set_time_limit(3);

                        sql_connect();

                        $oneWireType = getLogicElementVar($id,2) ;

                        $url = "http://".  getLogicElementVar($id,3) . ":" . getLogicElementVar($id,4) . "/"  . getLogicElementVar($id,1) . "/" . $oneWireType ."/" ;

                        //$url = "http://" . $ip_oneWire . ":" . $port_oneWire . "/"  . getLogicElementVar($id,1) . "/" . $oneWireType ."/" ;
                        //$url = "http://192.168.0.240:2121/28.381F85050001/temperature/";   // Hier die Webseite vom Websever eintragen

                        $ctx=stream_context_create(array('http'=> array('timeout' => 3)));
                        $Ausgabe = file_get_contents("$url", "r",$ctx); 

                        if ($Ausgabe == true)
                        {
                            $s = $oneWireType . "</B></TD><TD>" ;
                            $pos1 = strpos($Ausgabe,$s);
                            $pos2 = strpos($Ausgabe,"</TD>",$pos1);
                            $data = substr($Ausgabe,($pos1+strlen($s)),$pos2-$pos1);
                            $erg = (float) $data;
                        }
                        else
                        {
                            $erg = -99.99 ;
                        }


                        setLogicLinkAusgang($id,1,$erg);

                        sql_disconnect();
                        ?>
                        ###[/EXEC]###
                        Jetzt sollte nur noch der Titel umbenannt werden in LBS Schript
                        Zuletzt geändert von hartmut; 27.01.2016, 22:29.

                        Kommentar


                          #27
                          Gut gut - aber das ist nur die halbe Miete Die zweite Hälfte sollte stets alle möglichen "Unzulänglichkeiten" abfangen - was ist z.B. wenn der Request scheitert bzw. Datenmüll liefert?
                          EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                          Kommentar


                            #28
                            Ich möchte sowas auch lernen ... :-(
                            Danke und LG, Dariusz
                            GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                            Kommentar


                              #29
                              Zitat von gaert Beitrag anzeigen
                              Gut gut - aber das ist nur die halbe Miete Die zweite Hälfte sollte stets alle möglichen "Unzulänglichkeiten" abfangen - was ist z.B. wenn der Request scheitert bzw. Datenmüll liefert?
                              Stimmt. aber dann kommt kein Datenmüll sondern einfach 0 für die Temperatur. Vielen Dank Christian für deine Hilfe, hat auch mir bei meinem nächsten LBS geholfen.
                              Ich würde noch ergänzen: set_time_limit(3); nach require, dann wird der Prozess nach 3s abgeschossen, und müllt dann auch nicht mehr.

                              hartmut
                              Ich danke Dir für deine Arbeit (ich weiß was da Zeit draufgeht), und dass Du auch deine Arbeit offenlegst. Ich habe auch 1-wire und bin sehr froh darüber.
                              Leider ist es hier nicht immer selbstverständlich seine Errungenschaften zu veröffentlichen, selbst nachdem man sie direkt darauf anspricht. Z.B. die Müllabfuhr von @Timberland.

                              coliflower
                              Wer hält Dich den auf ?
                              >>Smelly One<<
                              >> BURLI <<
                              Grüße Armin

                              Kommentar


                                #30
                                War eher allgemein gemeint: Bei der LBS-Erstellung ist es durchaus wichtig, dass möglichst sämtliche Exceptions/Fehler abgefangen werden - nicht, dass am Ende der ganze Server abschmiert... Und glaube mir: Das ist mit PHP durchaus machbar
                                EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                                Kommentar

                                Lädt...
                                X