Difference between revisions of "Onewire (Deutsch)"

From Ethersex_Wiki
Jump to: navigation, search
(Onewire Befehle)
(moved to ethersex-tools)
 
(11 intermediate revisions by 5 users not shown)
Line 48: Line 48:
  
 
= Polling Modus =
 
= Polling Modus =
 +
 +
  │ │            [*] Onewire Polling                                        │ │ 
 +
  │ │            (375) Time between discoveries in 1s steps                │ │ 
 +
  │ │            (12) Time between polling in 1s steps                      │ │ 
 +
  │ │            [*] ECMD 1w list with values                              │ │ 
 +
  │ │            (10) Maximum sensor count                                  │ │ 
 +
 +
Im Polling-Modus werden die Sensoren im Hintergrund abgefragt, so dass die Werte
 +
bei Bedarf direkt zur Verfügung stehen und nicht erst gewandelt bzw.
 +
eingelesen werden müssen. Der Intervall zwischen den Discoveries und zwischen
 +
den Abfragen der Werte kann getrennt eingestellt werden. Die Option
 +
'''ECMD 1w list with values''' bietet die Möglichkeit, die aktuellen Werte
 +
bei Aufruf von '''1w list''' mit ausgeben zu lassen. So können darauf folgende
 +
'''1w get''' Kommandos entfallen.
 +
 +
Da zur Pufferung der Werte, ROM-Codes, etc. RAM-Speicher benötigt wird, muss
 +
per '''Maximum sensor count''' angegeben werden, für wie viele Sensoren Speicher
 +
reserviert wird.
  
 
= Benennung von Sensoren =
 
= Benennung von Sensoren =
 +
 +
  │ │            [*] Onewire naming support                                │ │ 
 +
  │ │            (10) Maximum sensor count                                  │ │ 
 +
 +
Um den Sensoren sinnvolle Namen zu geben besteht die Möglichkeit im EEPROM
 +
eine entsprechende Zuweisungstabelle anzulegen (ROM-Code -> Name). Die Namen werden
 +
bei bei Aufruf von '''1w list''' mit ausgegeben. Dazu gibt es
 +
folgende ECMD Kommandos:
 +
 +
    1w name list
 +
 +
Auflistung der aktuellen Zuweisungen (Spalten: ID, ROM-Code, Name). Die ID bezeichnet
 +
die Position in der Zuweisungstabelle und kann u.a. dazu benutzt werden, Sensoren
 +
bei SNMP-Abfragen eindeutig zu referenzieren.
 +
 +
    1w name set <ID> <ROM-Code> <Name>
 +
 +
Erstellt einen entsprechenden Tabelleneintrag.
 +
 +
    1w name clear <ID>
 +
 +
Löscht die Felder eines Tabelleneintrags.
 +
 +
    1w name save
 +
 +
Speichert die aktuelle Tabelle im EEPROM
  
 
= Unterstützte Hardware =
 
= Unterstützte Hardware =
Line 58: Line 102:
 
* DS1822 (Temperatursensor)
 
* DS1822 (Temperatursensor)
 
* DS2502 (EEPROM)
 
* DS2502 (EEPROM)
* DS2450 (4 Kanal ADC)
+
* [[Onewire/DS2450 (Deutsch) | DS2450 (4 Kanal ADC)]]
  
 
=  Onewire Befehle =
 
=  Onewire Befehle =
Line 138: Line 182:
 
= Einbindung in [[Control6]] =
 
= Einbindung in [[Control6]] =
  
Die Sensoren können mit '''ONEWIRE_GET''' einfach abgefragt werden.  Die Funktion führt automatisch ein
+
Die Sensoren können mit '''ONEWIRE_GET(sensor-id)''' oder '''ONEWIRE_GET_BY_NAME(sensor-name)''' einfach
''convert'' aus, es sind also keine zwei Schritte erforderlich wie bei dem Zugriff über [[ECMD]].
+
abgefragt werden.  Die Funktion führt automatisch ein ''convert'' aus, es sind also keine zwei Schritte
Die Rückgabe erfolgt (analog der Funktion '''KTY_GET''') in Centigrad, also Temperatur * 10.
+
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
 
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.
 
um mehr als ein Grad zur letzten Messung verändert hat.
  
 
<pre>
 
<pre>
 +
#include <stdlib.h>
 +
 
int16_t Temperatur;
 
int16_t Temperatur;
 
int16_t Temperatur_alt;
 
int16_t Temperatur_alt;
Line 153: Line 201:
 
   Temperatur = ONEWIRE_GET(10d85594010800eb);
 
   Temperatur = ONEWIRE_GET(10d85594010800eb);
 
   ON abs(Temperatur-Temperatur_alt)>10 DO
 
   ON abs(Temperatur-Temperatur_alt)>10 DO
     div_t res = div(Temperatur,10);
+
    uint8_t sign = Temperatur<0;
     SYSLOG("temperature changed %d.%d",res.quot,res.rem)
+
     div_t res = div(abs(Temperatur),10);
 +
     SYSLOG("temperature changed %S%d.%d",sign?PSTR("-"):PSTR(""),res.quot,res.rem)
 
     Temperatur_alt = Temperatur;
 
     Temperatur_alt = Temperatur;
 
   END
 
   END
Line 177: Line 226:
 
Es gibt folgende OIDs:
 
Es gibt folgende OIDs:
  
* .1.3.6.1.4.1.2021.13.23.3.1.<idx> : ROM-Code des Sensors
+
* .1.3.6.1.4.1.39967.3.1.<idx> : ROM-Code des Sensors
* .1.3.6.1.4.1.2021.13.23.3.2.<idx> : Sensor-Name (nur mit Naming-Support)
+
* .1.3.6.1.4.1.39967.3.2.<idx> : Sensor-Name (nur mit Naming-Support)
* .1.3.6.1.4.1.2021.13.23.3.3.<idx> : Temperaturwert in Centigrad
+
* .1.3.6.1.4.1.39967.3.3.<idx> : Temperaturwert in Centigrad
* .1.3.6.1.4.1.2021.13.23.3.4.<idx> : 0 = Sensor nicht vorhanden, 1 = Sensor vorhanden
+
* .1.3.6.1.4.1.39967.3.4.<idx> : 0 = Sensor nicht vorhanden, 1 = Sensor vorhanden
  
 
Hier ein Beispiel:
 
Hier ein Beispiel:
  
 
<pre>
 
<pre>
# snmpwalk -Osn -c public -v 1 192.168.255.90 1.3.6.1.4.1.2021.13.23.3
+
# snmpwalk -Osn -c public -v 1 192.168.255.90 1.3.6.1.4.1.39967.3
.1.3.6.1.4.1.2021.13.23.3.1.0 = STRING: "1080cff6010800f9"
+
.1.3.6.1.4.1.39967.3.1.0 = STRING: "1080cff6010800f9"
.1.3.6.1.4.1.2021.13.23.3.1.1 = STRING: "10c8cff60108002d"
+
.1.3.6.1.4.1.39967.3.1.1 = STRING: "10c8cff60108002d"
.1.3.6.1.4.1.2021.13.23.3.1.2 = STRING: "1029f6dc0108002f"
+
.1.3.6.1.4.1.39967.3.1.2 = STRING: "1029f6dc0108002f"
.1.3.6.1.4.1.2021.13.23.3.1.3 = STRING: "10f2d0f60108001c"
+
.1.3.6.1.4.1.39967.3.1.3 = STRING: "10f2d0f60108001c"
.1.3.6.1.4.1.2021.13.23.3.1.4 = STRING: "105a17f70108001d"
+
.1.3.6.1.4.1.39967.3.1.4 = STRING: "105a17f70108001d"
.1.3.6.1.4.1.2021.13.23.3.1.5 = STRING: "10b8d8f601080098"
+
.1.3.6.1.4.1.39967.3.1.5 = STRING: "10b8d8f601080098"
.1.3.6.1.4.1.2021.13.23.3.1.6 = STRING: "104dedf601080057"
+
.1.3.6.1.4.1.39967.3.1.6 = STRING: "104dedf601080057"
.1.3.6.1.4.1.2021.13.23.3.1.7 = STRING: "10011af701080027"
+
.1.3.6.1.4.1.39967.3.1.7 = STRING: "10011af701080027"
.1.3.6.1.4.1.2021.13.23.3.1.8 = STRING: "0000000000000000"
+
.1.3.6.1.4.1.39967.3.1.8 = STRING: "0000000000000000"
.1.3.6.1.4.1.2021.13.23.3.1.9 = STRING: "0000000000000000"
+
.1.3.6.1.4.1.39967.3.1.9 = STRING: "0000000000000000"
.1.3.6.1.4.1.2021.13.23.3.2.0 = STRING: "kessel"
+
.1.3.6.1.4.1.39967.3.2.0 = STRING: "kessel"
.1.3.6.1.4.1.2021.13.23.3.2.1 = STRING: "warmwasser"
+
.1.3.6.1.4.1.39967.3.2.1 = STRING: "warmwasser"
.1.3.6.1.4.1.2021.13.23.3.2.2 = STRING: "aussen"
+
.1.3.6.1.4.1.39967.3.2.2 = STRING: "aussen"
.1.3.6.1.4.1.2021.13.23.3.2.3 = STRING: "speicher"
+
.1.3.6.1.4.1.39967.3.2.3 = STRING: "speicher"
.1.3.6.1.4.1.2021.13.23.3.2.4 = STRING: "heizung vl"
+
.1.3.6.1.4.1.39967.3.2.4 = STRING: "heizung vl"
.1.3.6.1.4.1.2021.13.23.3.2.5 = STRING: "heizung rl"
+
.1.3.6.1.4.1.39967.3.2.5 = STRING: "heizung rl"
.1.3.6.1.4.1.2021.13.23.3.2.6 = STRING: "boiler vl"
+
.1.3.6.1.4.1.39967.3.2.6 = STRING: "boiler vl"
.1.3.6.1.4.1.2021.13.23.3.2.7 = STRING: "boiler rl"
+
.1.3.6.1.4.1.39967.3.2.7 = STRING: "boiler rl"
.1.3.6.1.4.1.2021.13.23.3.2.8 = ""
+
.1.3.6.1.4.1.39967.3.2.8 = ""
.1.3.6.1.4.1.2021.13.23.3.2.9 = ""
+
.1.3.6.1.4.1.39967.3.2.9 = ""
.1.3.6.1.4.1.2021.13.23.3.3.0 = INTEGER: 334
+
.1.3.6.1.4.1.39967.3.3.0 = INTEGER: 334
.1.3.6.1.4.1.2021.13.23.3.3.1 = INTEGER: 467
+
.1.3.6.1.4.1.39967.3.3.1 = INTEGER: 467
.1.3.6.1.4.1.2021.13.23.3.3.2 = INTEGER: 127
+
.1.3.6.1.4.1.39967.3.3.2 = INTEGER: 127
.1.3.6.1.4.1.2021.13.23.3.3.3 = INTEGER: 185
+
.1.3.6.1.4.1.39967.3.3.3 = INTEGER: 185
.1.3.6.1.4.1.2021.13.23.3.3.4 = INTEGER: 318
+
.1.3.6.1.4.1.39967.3.3.4 = INTEGER: 318
.1.3.6.1.4.1.2021.13.23.3.3.5 = INTEGER: 269
+
.1.3.6.1.4.1.39967.3.3.5 = INTEGER: 269
.1.3.6.1.4.1.2021.13.23.3.3.6 = INTEGER: 366
+
.1.3.6.1.4.1.39967.3.3.6 = INTEGER: 366
.1.3.6.1.4.1.2021.13.23.3.3.7 = INTEGER: 291
+
.1.3.6.1.4.1.39967.3.3.7 = INTEGER: 291
.1.3.6.1.4.1.2021.13.23.3.3.8 = INTEGER: 0
+
.1.3.6.1.4.1.39967.3.3.8 = INTEGER: 0
.1.3.6.1.4.1.2021.13.23.3.3.9 = INTEGER: 0
+
.1.3.6.1.4.1.39967.3.3.9 = INTEGER: 0
.1.3.6.1.4.1.2021.13.23.3.4.0 = INTEGER: 1
+
.1.3.6.1.4.1.39967.3.4.0 = INTEGER: 1
.1.3.6.1.4.1.2021.13.23.3.4.1 = INTEGER: 1
+
.1.3.6.1.4.1.39967.3.4.1 = INTEGER: 1
.1.3.6.1.4.1.2021.13.23.3.4.2 = INTEGER: 1
+
.1.3.6.1.4.1.39967.3.4.2 = INTEGER: 1
.1.3.6.1.4.1.2021.13.23.3.4.3 = INTEGER: 1
+
.1.3.6.1.4.1.39967.3.4.3 = INTEGER: 1
.1.3.6.1.4.1.2021.13.23.3.4.4 = INTEGER: 1
+
.1.3.6.1.4.1.39967.3.4.4 = INTEGER: 1
.1.3.6.1.4.1.2021.13.23.3.4.5 = INTEGER: 1
+
.1.3.6.1.4.1.39967.3.4.5 = INTEGER: 1
.1.3.6.1.4.1.2021.13.23.3.4.6 = INTEGER: 1
+
.1.3.6.1.4.1.39967.3.4.6 = INTEGER: 1
.1.3.6.1.4.1.2021.13.23.3.4.7 = INTEGER: 1
+
.1.3.6.1.4.1.39967.3.4.7 = INTEGER: 1
.1.3.6.1.4.1.2021.13.23.3.4.8 = INTEGER: 0
+
.1.3.6.1.4.1.39967.3.4.8 = INTEGER: 0
.1.3.6.1.4.1.2021.13.23.3.4.9 = INTEGER: 0
+
.1.3.6.1.4.1.39967.3.4.9 = INTEGER: 0
 
</pre>
 
</pre>
  
= Beispiele =
+
= Codebeispiele =
 
 
== 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 `
+
* [https://github.com/ethersex/ethersex-tools/blob/master/hardware/onewire/onewire_request.php PHP]
N_GET_ID=`echo 1w list | nc -u $NETIOIP $NETIOPORT -q 1 | grep -qe OK || exit 1`
+
* [https://github.com/ethersex/ethersex-tools/blob/master/hardware/onewire/onewire_request.pl Perl]
 
+
* [https://github.com/ethersex/ethersex-tools/blob/master/hardware/onewire/onewire_request.py Python]
echo "Date:     $N_DATE"
+
* [https://github.com/ethersex/ethersex-tools/blob/master/hardware/onewire/onewire_request.sh sh/bash]
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]]
Line 435: Line 289:
  
 
= Bezugsquellen =
 
= Bezugsquellen =
* Laut Michael Schultz (k1w1) hat er immer DS1820 auf Lager und kann sie sehr günstig weiterverkaufen. Auch Mindermengen. Mail: ethersex [AT] keyb [DOT] de
+
 
 +
Laut Michael Schultz (k1w1) hat er immer DS1820 auf Lager und kann sie sehr günstig weiterverkaufen. Auch Mindermengen. Mail: ethersex [AT] keyb [DOT] de und natürlich bei den üblichen Verdächtigen: Reichelt, Segor, Conrad.

Latest revision as of 16:08, 9 July 2013

Onewire
Status
Stable
menuconfig I/O->Onewire support
Pinning yes
Ecmd yes
Control6 yes
Depends on ECMD HTTPD (optional) SNMP (optional)
Requires -
Code https://github.com/ethersex/ethersex/tree/master/hardware/onewire

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.

Pinning

In der Standardkonfiguration liegt der Datapin des Buses auf PD6 (kann z.B. in der pinning/hardware/netio.m4 oder pinning/hardware/etherrape.m4 geändert werden). Die Definition der Pins erfolgt mit:

  ONEWIRE_PORT_RANGE(PXn, PXm)

wobei PXn und PNm Pins auf PORTX sind.

Jeder Pin zwischen und einschließlich PXn und PXm bildet einen eingenständigen Onewire Bus. Du kannst bis zu acht Busse auf einem PORT definieren (alle Busse müssen auf dem selben PORT liegen!)

Beispiele

Wenn Du nur einen einzigen Bus benötigst, definiere den Bereich wie folgt:

PORTD: PIN2

  ONEWIRE_PORT_RANGE(PD2, PD2)

Für drei Busse würde das ganze etwa so aussehen:

PORTD: PIN2, PIN3, PIN4

  ONEWIRE_PORT_RANGE(PD2, PD4)

Polling Modus

 │ │            [*] Onewire Polling                                        │ │  
 │ │            (375) Time between discoveries in 1s steps                 │ │  
 │ │            (12) Time between polling in 1s steps                      │ │  
 │ │            [*] ECMD 1w list with values                               │ │  
 │ │            (10) Maximum sensor count                                  │ │  

Im Polling-Modus werden die Sensoren im Hintergrund abgefragt, so dass die Werte bei Bedarf direkt zur Verfügung stehen und nicht erst gewandelt bzw. eingelesen werden müssen. Der Intervall zwischen den Discoveries und zwischen den Abfragen der Werte kann getrennt eingestellt werden. Die Option ECMD 1w list with values bietet die Möglichkeit, die aktuellen Werte bei Aufruf von 1w list mit ausgeben zu lassen. So können darauf folgende 1w get Kommandos entfallen.

Da zur Pufferung der Werte, ROM-Codes, etc. RAM-Speicher benötigt wird, muss per Maximum sensor count angegeben werden, für wie viele Sensoren Speicher reserviert wird.

Benennung von Sensoren

 │ │            [*] Onewire naming support                                 │ │  
 │ │            (10) Maximum sensor count                                  │ │  

Um den Sensoren sinnvolle Namen zu geben besteht die Möglichkeit im EEPROM eine entsprechende Zuweisungstabelle anzulegen (ROM-Code -> Name). Die Namen werden bei bei Aufruf von 1w list mit ausgegeben. Dazu gibt es folgende ECMD Kommandos:

   1w name list

Auflistung der aktuellen Zuweisungen (Spalten: ID, ROM-Code, Name). Die ID bezeichnet die Position in der Zuweisungstabelle und kann u.a. dazu benutzt werden, Sensoren bei SNMP-Abfragen eindeutig zu referenzieren.

   1w name set <ID> <ROM-Code> <Name>

Erstellt einen entsprechenden Tabelleneintrag.

   1w name clear <ID>

Löscht die Felder eines Tabelleneintrags.

   1w name save

Speichert die aktuelle Tabelle im EEPROM

Unterstützte 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. Bei aktiviertem Naming-Support wird (per TAB getrennt) zusätzlich der Name ausgegeben. Außerdem kann mit ECMD 1w list with values (ONEWIRE_ECMD_LIST_VALUE_SUPPORT) der aktuelle Temperaturwert mit ausgegeben werden. Dies erspart zusätzliche 1w get Aufrufe, setzt allerding Polling-Support vorraus.

   1w convert <hexcode>

Veranlasst eine Temperaturmessung des addressierten Sensors, oder, wenn das Argument <hexcode> weggelassen wird, aller angeschlossener Sensoren. Im Polling-Modus wird dieses Kommando ignoriert.

   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. Das Beispiel zeigt die SVG-Version mit Naming-Support:

Onewire-svg.png

Anschluss AVR-NET-IO

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

normal Betrieb

Netio-1wire normal.png

parasitären Modus

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:

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(sensor-id) oder ONEWIRE_GET_BY_NAME(sensor-name) 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.

#include <stdlib.h>

int16_t Temperatur;
int16_t Temperatur_alt;

CONTROL_START

THREAD(read_temp)
  Temperatur = ONEWIRE_GET(10d85594010800eb);
  ON abs(Temperatur-Temperatur_alt)>10 DO
    uint8_t sign = Temperatur<0;
    div_t res = div(abs(Temperatur),10);
    SYSLOG("temperature changed %S%d.%d",sign?PSTR("-"):PSTR(""),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

Abfrage per SNMP

Falls Polling-Support aktiviert wurde können die Sensorwerte per SNMP abgefragt werden. Mit Naming-Support stehen auch die Namen per SNMP zur Verfügung und die Index-Nummern sind fix auf die Position in der Namenstabelle festgelegt. Dies ist sehr hilfreich, um bestimmte Sensoren über den SNMP-Index anzusprechen.

Es gibt folgende OIDs:

  • .1.3.6.1.4.1.39967.3.1.<idx> : ROM-Code des Sensors
  • .1.3.6.1.4.1.39967.3.2.<idx> : Sensor-Name (nur mit Naming-Support)
  • .1.3.6.1.4.1.39967.3.3.<idx> : Temperaturwert in Centigrad
  • .1.3.6.1.4.1.39967.3.4.<idx> : 0 = Sensor nicht vorhanden, 1 = Sensor vorhanden

Hier ein Beispiel:

# snmpwalk -Osn -c public -v 1 192.168.255.90 1.3.6.1.4.1.39967.3
.1.3.6.1.4.1.39967.3.1.0 = STRING: "1080cff6010800f9"
.1.3.6.1.4.1.39967.3.1.1 = STRING: "10c8cff60108002d"
.1.3.6.1.4.1.39967.3.1.2 = STRING: "1029f6dc0108002f"
.1.3.6.1.4.1.39967.3.1.3 = STRING: "10f2d0f60108001c"
.1.3.6.1.4.1.39967.3.1.4 = STRING: "105a17f70108001d"
.1.3.6.1.4.1.39967.3.1.5 = STRING: "10b8d8f601080098"
.1.3.6.1.4.1.39967.3.1.6 = STRING: "104dedf601080057"
.1.3.6.1.4.1.39967.3.1.7 = STRING: "10011af701080027"
.1.3.6.1.4.1.39967.3.1.8 = STRING: "0000000000000000"
.1.3.6.1.4.1.39967.3.1.9 = STRING: "0000000000000000"
.1.3.6.1.4.1.39967.3.2.0 = STRING: "kessel"
.1.3.6.1.4.1.39967.3.2.1 = STRING: "warmwasser"
.1.3.6.1.4.1.39967.3.2.2 = STRING: "aussen"
.1.3.6.1.4.1.39967.3.2.3 = STRING: "speicher"
.1.3.6.1.4.1.39967.3.2.4 = STRING: "heizung vl"
.1.3.6.1.4.1.39967.3.2.5 = STRING: "heizung rl"
.1.3.6.1.4.1.39967.3.2.6 = STRING: "boiler vl"
.1.3.6.1.4.1.39967.3.2.7 = STRING: "boiler rl"
.1.3.6.1.4.1.39967.3.2.8 = ""
.1.3.6.1.4.1.39967.3.2.9 = ""
.1.3.6.1.4.1.39967.3.3.0 = INTEGER: 334
.1.3.6.1.4.1.39967.3.3.1 = INTEGER: 467
.1.3.6.1.4.1.39967.3.3.2 = INTEGER: 127
.1.3.6.1.4.1.39967.3.3.3 = INTEGER: 185
.1.3.6.1.4.1.39967.3.3.4 = INTEGER: 318
.1.3.6.1.4.1.39967.3.3.5 = INTEGER: 269
.1.3.6.1.4.1.39967.3.3.6 = INTEGER: 366
.1.3.6.1.4.1.39967.3.3.7 = INTEGER: 291
.1.3.6.1.4.1.39967.3.3.8 = INTEGER: 0
.1.3.6.1.4.1.39967.3.3.9 = INTEGER: 0
.1.3.6.1.4.1.39967.3.4.0 = INTEGER: 1
.1.3.6.1.4.1.39967.3.4.1 = INTEGER: 1
.1.3.6.1.4.1.39967.3.4.2 = INTEGER: 1
.1.3.6.1.4.1.39967.3.4.3 = INTEGER: 1
.1.3.6.1.4.1.39967.3.4.4 = INTEGER: 1
.1.3.6.1.4.1.39967.3.4.5 = INTEGER: 1
.1.3.6.1.4.1.39967.3.4.6 = INTEGER: 1
.1.3.6.1.4.1.39967.3.4.7 = INTEGER: 1
.1.3.6.1.4.1.39967.3.4.8 = INTEGER: 0
.1.3.6.1.4.1.39967.3.4.9 = INTEGER: 0

Codebeispiele

Bezugsquellen

Laut Michael Schultz (k1w1) hat er immer DS1820 auf Lager und kann sie sehr günstig weiterverkaufen. Auch Mindermengen. Mail: ethersex [AT] keyb [DOT] de und natürlich bei den üblichen Verdächtigen: Reichelt, Segor, Conrad.