Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Script für 1-Wire

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

    PHP Script für 1-Wire

    Ich habe einen PHP Script zum Auslesen der 1 - Wire Sensoren geschrieben. Dieser gibt den angefragten Wert zurück.

    Dies möchte ich dann mit einem Logik Baustein auslesen.
    Der Script wird mit den benötigten Parametern aufgerufen und list den Wert von einem anderen Rechner (Rapberry pi) . Es wird vom Rechner ..240 Port 4303 gelesen
    Beispiel:
    ./read_ow.php 192.168.0.240 4304 28.381F85050000 temperature
    Dieser Script funktioniert auf mehreren Debian Rechnern aber nicht auf dem Cent OS. Den Firewall des CentOs habe ich mal abgeschaltet aber das zeigt auch kein Ergebnis. Der Script lässt sich aufrufen, bei Fehler kommt auch eine Meldung vom Script aber ich bekomme keinen Wert.

    #2
    ich denke ich spreche hier im Namen der PHP-Profis wenn ich sage: poste doch bitte das Script oder zumindest die Fehlermeldung, denn so dürfte das ganze etwas schwierig nachzuvollziehen sein.

    Kommentar


      #3
      Es gibt keine Fehlermeldung, das Script wird ohne Rückmeldung sofort beendet. Wenn ein Wert übertragen wird (auf einem anderen Rechne) dann dauert es ca. 1/2 sek bis der Wert kommt.
      Ich kann es leider nicht beim CentOS debuggen, auf meinem anderen Rechner schon, aber da funktioniert es ja . Es fehlen noch 2 weitere php Programme die sind vom ownet.php examples (owsock.php und ownet.php)

      PHP-Code:
       #!/usr/bin/php
        <?php
        
      require 'owsock.php';
        
      #
        //var_dump($argv) ;
        
        
      $ip_oneWire $argv[1] ;
        
      $port_oneWire $argv[2]  ;
        
      $oneWireAdr $argv[3] ;
        
      $oneWireType $argv[4] ;
        
        
      $ow = new OWNet($ip_oneWire ":" .  $port_oneWire ) ;
        
      $erg $ow->read('/'.$oneWireAdr '/' $oneWireType) ;
        
      #$erg =  $ow->read('/28.381F85050000/temperature') ;
        
      unset($ow) ;
        if (
      $erg == "")
        {
            
      $Fehler "Aufruf: read_ow ip port 1wireAdresse angefragterWert" " z.B:  read_ow 192.168.0.240 4304 28.381F85050000 temperature" ;
            echo 
      $Fehler "\n" ;
            
      var_dump($argv) ;
        }
        echo 
      $erg "\n" ;
        
        
      ?>

      Kommentar


        #4
        require 'owsock.php'
        Bist Du dir sicher, dass er diese Datei findet ?
        probiers mal so, natürlich auf den Fundort angepasst.
        require_once(dirname(__FILE__)."/../../../../main/include/php/owsock.php");
        >>Smelly One<<
        >> BURLI <<
        Grüße Armin

        Kommentar


          #5
          Das EDOMI-CentOS ist so konfiguriert, dass keine PHP-Fehler angezeigt werden (Fehler haben einen eigenen Errorhandler in EDOMI).

          Zum Debuggen wäre es daher sinnvoll, in der /etc/php.ini die Konstante display_errors=On zu setzen (oder so ähnlich...). Und danach dann ein

          service httpd restart

          Zudem erwartet dieses Script Parameter, die per Kommandozeile übergeben werden. Das wird in einem LBS nicht funktionieren...
          EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

          Kommentar


            #6
            Danke, das werde ich mal testen. Wie könnte man denn sonst die Parameter, bzw den Parameter übergeben. Es könnte ja nur die Onwire Adresse sein.

            Kommentar


              #7
              Nunja... Bei einem LBS wären seine Eingänge wohl eine Option...
              EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

              Kommentar


                #8
                So mit den display_error = On habe ich es gleich gesehen. Call to undefined function bcadd(). Nachdem ich mit yum install php-bcmath diese installiert habe läuft das Programm und bringt mir die Werte zurück.

                Danke für die Hilfe.

                Nun kann ich über ein LBS nachdenken.

                Kommentar


                  #9
                  Ich bin etwas weitergekommen, LBS zum Testen erstellt. Aber ich bekomme eine Fehlermeldung, Der Rest funktioniert, der Rückgabewert ist zum Testen fest.
                  ...
                  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);

                  $ip_oneWire = "192.168.0.240" ;
                  $port_oneWire = "4304" ;

                  $ow = new OWNet($ip_oneWire . ":" .  $port_oneWire ) ;
                  //$erg = $ow->read('/'.$v1 . '/' . $v2) ;
                  unset($ow) ;

                  //try {
                  //    $erg = $ow->read('/'.$v1 . '/' . $v2) ;
                  //    unset($ow) ;
                  //}
                  //catch (Exception $e) {
                  //     unset($ow) ;
                  //     exit;
                  //}
                  $erg = 23.4567 ;
                  setLogicLinkAusgang($id,1,$erg);

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

                  Wenn ich die Funktion /$ow = new OWNet($ip_oneWire . ":" . $port_oneWire von einem normalen Script aufrufe funktionier es.

                  Only variables should be passed by reference von der Function owsock.php
                  <tr class="sErr"><td>2016-01-26 12:18:22</td><td>369972</td><td>?</td><td>5272</td><td>/usr/local/edomi/main/include/php/owsock.php: Code 2 / Zeile 182 / socket_set_block() expects parameter 1 to be resource, integer given</td><td>ERROR</td></tr>
                  <tr class="sErr"><td>2016-01-26 12:18:22</td><td>372512</td><td>?</td><td>5272</td><td>/usr/local/edomi/main/include/php/owsock.php: Code 2 / Zeile 184 / socket_shutdown() expects parameter 1 to be resource, integer given</td><td>ERROR</td></tr>
                  <tr class="sErr"><td>2016-01-26 12:18:22</td><td>372606</td><td>?</td><td>5272</td><td>/usr/local/edomi/main/include/php/owsock.php: Code 2 / Zeile 185 / socket_close() expects parameter 1 to be resource, integer given</td><td>ERROR</td></tr>
                  <tr class="sErr"><td>2016-01-26 12:18:22</td><td>374119</td><td>?</td><td>5272</td><td>/usr/local/edomi/main/include/php/owsock.php: Code 2048 / Zeile 315 / Only variables should be passed by reference</td><td>ERROR</td></tr>
                  <tr class="sErr"><td>2016-01-26 12:18:22</td><td>374202</td><td>?</td><td>5272</td><td>/usr/local/edomi/main/include/php/owsock.php: Code 2048 / Zeile 315 / Only variables should be passed by reference</td><td>ERROR</td></tr>
                  <tr class="sErr"><td>2016-01-26 12:18:22</td><td>374399</td><td>?</td><td>5272</td><td>/usr/local/edomi/main/include/php/owsock.php: Code 2048 / Zeile 315 / Only variables should be passed by reference</td><td>ERROR</td></tr>
                  <tr class="sErr"><td>2016-01-26 12:18:22</td><td>374454</td><td>?</td><td>5272</td><td>/usr/local/edomi/main/include/php/owsock.php: Code 2048 / Zeile 315 / Only variables should be passed by reference</td><td>ERROR</td></tr>
                  <tr class="sErr"><td>2016-01-26 12:18:22</td><td>374520</td><td>?</td><td>5272</td><td>/usr/local/edomi/main/include/php/owsock.php: Code 2048 / Zeile 273 / Only variables should be passed by reference</td><td>ERROR</td></tr>
                  <tr class="sErr"><td>2016-01-26 12:18:22</td><td>374567</td><td>?</td><td>5272</td><td>/usr/local/edomi/main/include/php/owsock.php: Code 2048 / Zeile 273 / Only variables should be passed by reference</td><td>ERROR</td></tr>


                  Kommentar


                    #10
                    Freut mich zu sehen, dass mein LBS Dir einige Probleme erspart hat.
                    $port_oneWire = "4304"; erwartet der Socket einen String oder Integer ?
                    >>Smelly One<<
                    >> BURLI <<
                    Grüße Armin

                    Kommentar


                      #11
                      Ja, das hat mir einiges erspart
                      Es erwarte einen String "192.168.0.240:4304" se wird ja auch zusammengesetzt: $ow = new OWNet($ip_oneWire . ":" . $port_oneWire ) ;

                      Kommentar


                        #12
                        Ich habe es mal mit einem http Aufruf probiert. Da geht es, ist ja auch keine andere Lib beteiligt.
                        Aber da liefert mir die Function

                        $v2 = getLogicElementVar($id,2);

                        immer 0, obwohl ich temperature als initwert eingegeben habe. egal eb "temperature" oder 'temperature'

                        Ansonsten bekomme ich jetzt die Temperatur.

                        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]###
                        $v2 = getLogicElementVar($id,2);

                        ###[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 . "/"  . $oneWireAdr . "/" . $oneWireType ."/" ;

                        //$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]###
                        Zuletzt geändert von hartmut; 26.01.2016, 17:31.

                        Kommentar


                          #13
                          oneWire.png

                          11,75 Grad

                          Kommentar


                            #14
                            Ich hatte auch Fehlermeldungen mit Modbusphp. Nachdem ich die Modbusphp nachbearbeitet hatte, was mich ohne php Kenntnisse viel Energie und Zeit gekostet hat, waren die Fehlermeldungen weg. In deinem Fall steht eine Suche in der Routine socket_set_block() an, die meckert wegen dem ersten Parameter.

                            temperature: probier doch mal das init wegzulassen und einfach als Initialisierung Anführungszeichen. Im Logikeditor hast Du's bestimmt schon mit einfachen und doppeltem Anführungszeichen probiert ?
                            >>Smelly One<<
                            >> BURLI <<
                            Grüße Armin

                            Kommentar


                              #15
                              Da ich jetzt eine Lösung habe werde ich mir das ändern der 2 anderen php Module ersparen. Diese funktionieren auch in der ZentOS Umgebung wenn ich einen externen Script verwende.

                              temperature: Ja das habe ich probiert vielleicht werden die Eingangsvariablen nur als Zahl verwendet. Beim Eingang e1 funktioniert das ja. Das weis sicher nur gaert.

                              Kommentar

                              Lädt...
                              X