Dallas 1-wire Bus: Unterschied zwischen den Versionen

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche
K (Anschluss AVR Net-IO)
Zeile 126: Zeile 126:
 
   print "Temperatur vom ID ",$_,": ",$temp," C°","\n";
 
   print "Temperatur vom ID ",$_,": ",$temp," C°","\n";
 
   }
 
   }
 +
 +
==== Python ====
 +
 +
  #!/usr/bin/python
 +
 
 +
  from socket import *
 +
 
 +
  def connectEP():
 +
    s = socket(AF_INET, SOCK_STREAM)
 +
    s.settimeout(5)
 +
    s.connect(("192.168.5.3", 2701))
 +
    return s
 +
 
 +
  def getTemperature():
 +
    s.send("1w list\n")
 +
    sensors = []
 +
    sensors_result = {}
 +
   
 +
    # list aller Sensoren
 +
    while 1:
 +
      response = s.recv(1024).rstrip("\n")
 +
      if not response: break
 +
      if response != "OK":
 +
        sensors.append(response)
 +
      else:
 +
        break
 +
 
 +
    # wert konvertieren
 +
    for sensor in sensors:
 +
      s.send("1w convert " + sensor + "\n")
 +
      while 1:
 +
        response = s.recv(1024).rstrip("\n")
 +
        if response == "OK":
 +
          break 
 +
 
 +
      # wert auslesen
 +
      s.send("1w get " + sensor + "\n")
 +
      response = s.recv(1024).rstrip("\n").lstrip()
 +
      sensors_result[sensor] = response
 +
    return(sensors_result)
 +
 
 +
  s = connectEP()
 +
  for sensor, value in getTemperature().iteritems():
 +
    print sensor + " " + value

Version vom 28. August 2009, 13:04 Uhr

Onewire interface

Ethersex kann 1-wire Temperatursensoren mit ECMD auflisten und abfragen. Es wird eine reine Softwareimplementierung des Protokolls benutzt, was keine weiteren Hardware erfordert, als die Temperatursensoren selbst. Dabei muss beachtet werden, dass der Datapin des Buses in der Standardkonfiguration auf PD6 liegt (kann in der pinning/generic.m4 geändert werden)

Onewire Befehle

unter Linux als erstes netcat starten (hierbei natürlich die IP ggf modifizieren):

   netcat 192.168.0.15 2701

danach am prompt:

   1w list

Gibt eine Liste mit Hexcodes aller angeschlossenen und erkannten Onewire(tm) Sensoren aus.

   1w convert <hexcode>

Veranlasst eine Temperaturmessung des addressierten Sensors, oder wenn das Argument <hexcode> weggelassen wird aller angeschlossener Sensoren.

   1w get <hexcode>

Gibt die gemessene Temperatur eines Sensors aus.

Einbindung in die HTTPD-Weboberfläche

Unter httpd/embed/ow.ht.m4, bzw httpd/embed/Xow.ht.m4 liegt eine Weboberflaeche, die alle Sensoren erkennt und ihre aktuelle Temperatur regelmässig per Ajax abfragt und anzeigt. Im Falle von Xow.ht.m4 wird sogar Graph der Temperatur mittels SVG gemalt. Um die Dateien einzubinden, muss man einfach bei aktiviertem Onewiresupport den Webserver und das Datei Inlining aktivieren.

Die Dateien können dann unter ow.ht bzw. unter Xow.ht angezeigt werden.

Onewire-svg.png

Anschluss AVR Net-IO

Für das Pollin NET-IO Board können die Sensoren DS18S20+ ,

so im normal Modus angeschlossen werden:

Netio-1wire normal.png


so im parasitären Modus angeschlossen werden:

Netio-1wire.png

Einbindung in Control6

Die Sensoren können mit ONEWIRE_GET einfach abgefragt werden. Die Funktion führt automatisch ein convert aus, es sind also keine zwei Schritte erforderlich wie bei dem Zugriff über ECMD. Die Rückgabe erfogt (analog der Funktion KTY_GET) in Centigrad, also Temperatur * 10. Hier vielleicht ein kleines Beispiel, das die Daten in eine von außen abfragbare Variable übernimmt. Sicher kann man sinnvolleres damit anstellen :-)

CONTROL_START

ECMD_GLOBAL(Temperatur, 0);

THREAD(read_temp)
        Temperatur = ONEWIRE_GET(10d85594010800eb);
        WAIT(10);
THREAD_END(read_temp)

ON STARTUP DO
        THREAD_START(read_temp);
END

CONTROL_END

Beispiele

sh oder bash

Einfaches SH (Linux Shell) Script von stesie (irc) zum Auslesen von einem Wert

 #! /bin/sh
 SENSORID=10529f7001080016
 #ESEXIP=2001:6f8:1209:23:42::17 #IPv6 Adresse
 ESEXIP=192.168.255.90
  
 #IPv6
 #echo 1w convert $SENSORID | nc6 -u $ESEXIP 2701 -q 1 2>/dev/null | grep -qe OK || exit 1 
 #echo 1w get $SENSORID | nc6 -u $ESEXIP 2701 -q 1 2>/dev/null | sed -e 's/Temperatur: //' 
  
 #IPv4
 echo 1w convert $SENSORID | nc -u $ESEXIP 2701 -q 1 2>/dev/null | grep -qe OK || exit 1
 echo 1w get $SENSORID | nc -u $ESEXIP 2701 -q 1 2>/dev/null | sed -e 's/Temperatur: //'

Perl

Beispiel in Perl das alle Sensoren ermittelt und anschließend die Werte ausgibt. Benötigt wird das Modul NET das kein IPv6 kann

 #!/usr/bin/perl -w
 #Auslesen der 1 Wire Sensoren an einem NET-IO mit ethersex
  
 use strict;
 use Net::Telnet ();
  
 my $esexip="192.168.255.90";
 my $esexport="2701";
 my $esex;
 my @sensor;
 my $sensor;
 my $dummy;
 my $temp;
  
 $esex = Net::Telnet->new || die "kann Ethersex nicht finden";;
 $esex->open(Host  => $esexip,
           Port    => $esexport,
           Timeout => 2);
  
 #Alles Sensor-IDs auslesen und dem Array @sensor zuweisen
 $esex->print("1w list");
 ($sensor) = $esex->waitfor(Timeout => 2,
                            String  => "OK");
 @sensor=split(/\s+/, $sensor);
       print "@sensor","\n"; #Kontrollausgabe
  
 my $zahler=@sensor;
 print "Anzahl der Elemente :",$zahler,"\n\n";
  
 #Alles Sensore Temperatur einlesen
 $esex->print("1w convert");
 $esex->waitfor(Timeout => 2,
                String  => "OK");
  
 #Sensor ID inklusive Wert ausgeben
 foreach (@sensor) {
       $esex->print("1w get $_");
  
 ($dummy,$temp)=$esex->waitfor(Match   =>'/\d+\.\d+/',
                               Timeout => 2);
     
  print "Temperatur vom ID ",$_,": ",$temp," C°","\n";
 }

Python

 #!/usr/bin/python
 
 from socket import *
 
 def connectEP():
   s = socket(AF_INET, SOCK_STREAM)
   s.settimeout(5)
   s.connect(("192.168.5.3", 2701))
   return s
 
 def getTemperature():
   s.send("1w list\n")
   sensors = []
   sensors_result = {}
    
   # list aller Sensoren
   while 1:
     response = s.recv(1024).rstrip("\n")
     if not response: break
     if response != "OK":
       sensors.append(response)
     else:
       break
 
   # wert konvertieren
   for sensor in sensors:
     s.send("1w convert " + sensor + "\n")
     while 1:
       response = s.recv(1024).rstrip("\n")
       if response == "OK":
         break  
 
     # wert auslesen 
     s.send("1w get " + sensor + "\n")
     response = s.recv(1024).rstrip("\n").lstrip()
     sensors_result[sensor] = response
   return(sensors_result)
 
 s = connectEP()
 for sensor, value in getTemperature().iteritems():
   print sensor + " " + value