|
|
Zeile 1: |
Zeile 1: |
− | == Onewire interface ==
| + | [http://ethersex.de/index.php/Onewire_%28Deutsch%29 Onewire im neuen Wiki] |
− | | |
− | 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/hardware/netio.m4 oder pinning/hardware/etherrape.m4 geändert werden)
| |
− | | |
− | === Onewire Hardware ===
| |
− | | |
− | Folgende 1-wire Hardware wird momentan durch Ethersex unterstützt:
| |
− | * DS1820 (Temperatursensor)
| |
− | * DS18B20 (Temperatursensor)
| |
− | * DS1822 (Temperatursensor)
| |
− | * DS2502 (EEPROM)
| |
− | * [[DS2450]] (4 Kanal ADC)
| |
− | | |
− | === 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.
| |
− | | |
− | 1w power <hexcode>
| |
− | Gibt die Art der Stromversorgung eines Temperatursensors aus. (In Vorbereitung, siehe [[Onewire-Temperatursensor zur Abfrage von Schaltzuständen]])
| |
− | | |
− | 1w status <hexcode>
| |
− | Gibt gemessene Temeratur und die Art der Stromversorgung eines Temperatursensors aus. (In Vorbereitung, siehe [[Onewire-Temperatursensor zur Abfrage von Schaltzuständen]])
| |
− | | |
− | === 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.
| |
− | | |
− | [[Bild:onewire-svg.png]]
| |
− | | |
− | === Anschluss AVR-NET-IO ===
| |
− | Für das Pollin [[AVR-NET-IO]] Board können die Sensoren DS18S20+ ,
| |
− | | |
− | normal Betrieb
| |
− | | |
− | [[Bild:netio-1wire_normal.png]]
| |
− | | |
− | | |
− | parasitären Modus
| |
− | | |
− | [[Bild:netio-1wire.png]]
| |
− | | |
− | Anmerkung: Wenn man beim Net-IO nicht alle Analogeingänge benötigt, lässt sich der 1-Wire-Bus auch an der Schraubklemme ADC1 ganz gut aufschalten. Vorteil ist, dass man gleich alle passenden Spannungen (GND, +5V) an den beiden nebenliegenden Schraubklemmen hat. Das Pinning muss dann entspechend in der kann in der Datei pinning/hardware/netio.m4 von PD6 auf PA4 geändert werden. Vorteil dieser Konfiguration ist, dass man den DB-25-Verbinder zum Anschluss der Relaisplatine K8IO von Pollin frei hat und den EXT Steckverbinder zum Anschluss eines LCD über ein 4bit-Interface nutzen kann, ohne die Erweiterungsplatine von Pollin zu benötigen.
| |
− | | |
− | | |
− | Pinbelegung:
| |
− | | |
− | [[Bild:ds18s20-par-pinout.jpg]]
| |
− | | |
− | === Anschluss Etherrape ===
| |
− | | |
− | Die Schaltung je nach parasitärem oder normalem Betriebsmodus kann aus der NetIO Skizze übernommen werden.
| |
− | Data liegt auf PORTD an Pin 7:
| |
− | | |
− | PORTD
| |
− | +---+
| |
− | |x x|
| |
− | |x X| <- Pin 7
| |
− | |x x
| |
− | |x x|
| |
− | |x x|
| |
− | +---+
| |
− | | |
− | Direkt neben PORTD befinden sich 2 Pins mit GND und 5V als Beschriftung.
| |
− | GND kann als GND und 5V als Vcc genutzt werden.
| |
− | === 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 erfolgt (analog der Funktion '''KTY_GET''') in Centigrad, also Temperatur * 10. Hier vielleicht ein kleines Beispiel, das die Daten per [[SYSLOG]] ausgibt sobald sich die Temperatur um mehr als ein Grad zur letzten Messung verändert hat.
| |
− | | |
− | <pre>
| |
− | int16_t Temperatur;
| |
− | int16_t Temperatur_alt;
| |
− | | |
− | CONTROL_START
| |
− | | |
− | THREAD(read_temp)
| |
− | Temperatur = ONEWIRE_GET(10d85594010800eb);
| |
− | ON abs(Temperatur-Temperatur_alt)>10 DO
| |
− | div_t res = div(Temperatur,10);
| |
− | SYSLOG("temperature changed %d.%d",res.quot,res.rem)
| |
− | Temperatur_alt = Temperatur;
| |
− | END
| |
− | WAIT(15);
| |
− | THREAD_END(read_temp)
| |
− | | |
− | ON STARTUP DO
| |
− | Temperatur = Temperatur_alt = 0;
| |
− | THREAD_START(read_temp);
| |
− | END
| |
− | | |
− | CONTROL_END
| |
− | </pre>
| |
− | | |
− | === Beispiele ===
| |
− | | |
− | ===== sh oder bash =====
| |
− | Einfaches SH (Linux Shell) Script von stesie (irc) zum Auslesen von einem Wert (udp support muss enabled sein oder option -u nicht verwenden!)
| |
− | | |
− | <source lang="bash">
| |
− | #! /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: //'
| |
− | </source>
| |
− | | |
− | bash Script von Tron12 zum Auslesen aller Werte
| |
− | (Achtung Port 2701 ist nicht standard!! Sowie udp support muss enabled sein oder option -u nicht verwenden!)
| |
− | | |
− | <source lang="bash">
| |
− | #! /bin/sh
| |
− | #
| |
− | # netcat-openbsd 1.89-3ubuntu2
| |
− | | |
− | NETIOIP="-4 192.168.178.249"
| |
− | | |
− | #für IPv6:
| |
− | #NETIOIP="-6 2001:6f8:1209:23:42::17"
| |
− | | |
− | NETIOPORT="2702"
| |
− | | |
− | N_DATE=`echo date | nc -u $NETIOIP $NETIOPORT -q 1 `
| |
− | N_GET_ID=`echo 1w list | nc -u $NETIOIP $NETIOPORT -q 1 | grep -qe OK || exit 1`
| |
− | | |
− | echo "Date: $N_DATE"
| |
− | echo "---------------------------------"
| |
− | | |
− | for i in $N_GET_ID
| |
− | do
| |
− | tmp=`echo 1w convert $i | nc -u $NETIOIP $NETIOPORT -q 1 2>/dev/null | grep -qe OK || exit 1`
| |
− | tmp=`echo 1w get $i | nc -u $NETIOIP $NETIOPORT -q 1 2>/dev/null `
| |
− | echo "Sensor: $i :: $tmp"
| |
− | done
| |
− | </source>
| |
− | | |
− | ==== Perl ====
| |
− | Beispiel in Perl das alle Sensoren ermittelt und anschließend die Werte ausgibt.
| |
− | Benötigt wird das Modul NET das kein IPv6 kann
| |
− | | |
− | <source lang="perl">
| |
− | #!/usr/bin/perl -w
| |
− | #Auslesen der 1 Wire Sensoren an einem AVR-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 => 5);
| |
− |
| |
− | print "Temperatur vom ID ",$_,": ",$temp," C°","\n";
| |
− | }
| |
− | </source>
| |
− | | |
− | ==== Python ====
| |
− | | |
− | <source lang="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
| |
− | </source>
| |
− | | |
− | ==== PHP ====
| |
− | | |
− | <source lang="php">
| |
− | | |
− | <html>
| |
− | | |
− | <head>
| |
− | <title>ethersex php example</title>
| |
− | </head>
| |
− | | |
− | <body>
| |
− | | |
− | <?php
| |
− | | |
− | define(IP, '192.168.10.9'); // deine ethersex ip adresse
| |
− | define(PORT, 2701); // standard port im image
| |
− | | |
− | request("1w convert");
| |
− | | |
− | $response = request("1w list");
| |
− | $explode = explode("\n", $response);
| |
− | | |
− | for ($i=0; $i < count($explode)-2; $i++) {
| |
− | echo "Sensor: " . trim($explode[$i]);
| |
− | echo " -- Wert: " . request("1w get " . $explode[$i]);
| |
− | echo "<br>\n";
| |
− | }
| |
− | | |
− | function request($request) {
| |
− | $rs = fsockopen(IP, PORT);
| |
− | | |
− | if (!$rs) {
| |
− | $response = "Kann Verbindung nicht aufbauen!";
| |
− | }
| |
− | else {
| |
− | $response ="";
| |
− | $request = "!" . $request . "\r\n";
| |
− | | |
− | fputs($rs, $request);
| |
− | | |
− | while (!feof($rs)) {
| |
− | $response .= fgets($rs, 128);
| |
− | }
| |
− | fclose($rs);
| |
− | }
| |
− | | |
− | return $response;
| |
− | }
| |
− | | |
− | ?>
| |
− | | |
− | </body>
| |
− | </source>
| |
− | | |
| [[Category:Ethersex]] | | [[Category:Ethersex]] |
| [[Category:StepByStep]] | | [[Category:StepByStep]] |
| [[Category:Onewire]] | | [[Category:Onewire]] |
− |
| |
− | === Günstiger Einkauf von Temperatursensoren bei k1w1 (Michael) ===
| |
− | Vom Michael Schultz (k1w1) hab ich die Info erhalten, das er immer DS1820 auf Lager hat und sie sehr günstig weiterverkaufen kann.
| |
− | Auch Mindermengen.
| |
− | Mail: ethersex [AT] keyb [DOT] de
| |