<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.ethersex.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Atos</id>
		<title>Ethersex_Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://www.ethersex.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Atos"/>
		<link rel="alternate" type="text/html" href="http://www.ethersex.de/index.php/Special:Contributions/Atos"/>
		<updated>2026-04-05T05:39:48Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.ethersex.de/index.php?title=Protokolle_duplizieren_(Deutsch)&amp;diff=791</id>
		<title>Protokolle duplizieren (Deutsch)</title>
		<link rel="alternate" type="text/html" href="http://www.ethersex.de/index.php?title=Protokolle_duplizieren_(Deutsch)&amp;diff=791"/>
				<updated>2012-07-26T04:46:07Z</updated>
		
		<summary type="html">&lt;p&gt;Atos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{i18n|Protokolle duplizieren}}&lt;br /&gt;
= Protokolle duplizieren =&lt;br /&gt;
Es kommt immer mal wider vor, das man das gleiche Protokoll zweimal benötigt.&lt;br /&gt;
&lt;br /&gt;
== Lösung 1 ==&lt;br /&gt;
Bei mir war der Fall, das ich ein Net-IO mit einem ATMega 644p ausgestattet habe, der zwei UART besitz.&lt;br /&gt;
Diese zwei Schnittstellen wollte ich zum auslesen meiner Wechselrichter nutzen.&lt;br /&gt;
&lt;br /&gt;
Das Protokoll der Wahl war bei mir sll (serial_line_log)&lt;br /&gt;
&lt;br /&gt;
Leider muste ich feststellen, das ich immer nur ein Protokoll auf ein UART binden kann.&lt;br /&gt;
Da es bist jetzt noch keine gute Idee gibt, wie man so etwas besser lösen kann, hier ein kleiner Trick.&lt;br /&gt;
Das Protokoll serial_line_log wird einfach dupliziert. Ich habe jedes &amp;quot;seria_&amp;quot; in ein  &amp;quot;serialzwei_&amp;quot; gewandelt.&lt;br /&gt;
&lt;br /&gt;
* Kopieren des Ordners (cp -a ethersex/protocols/serial_line_log ethersex/protocols/serialzwei_line_log)&lt;br /&gt;
* alle Dateien im Ordner umbenannt (auser Makefile und config.in) (cd ethersex/protocols/serialzwei_line_log; mv serial_&amp;lt;...&amp;gt;.c serialzwei_&amp;lt;...&amp;gt;.c&lt;br /&gt;
* mit einem Editor Alle Variabeln und Symbolenamen geändert &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
vim serialzwei_line_log.c&lt;br /&gt;
:%s/SERIAL_/SERIALZWEI_/g&lt;br /&gt;
:%s/serial_/serialzwei_/g&lt;br /&gt;
:%s/sll_/sllzwei_/g&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* in der serialzwei_line_log_ecmd.c muss noch der ecmd Befehl angepasst werden (ganz am Schluss der META abschnitt)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
vim serialzwei_line_log_ecmd.c&lt;br /&gt;
:%s/sll get/sll2 get&lt;br /&gt;
:%s/sll_/sllzwei_/g&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* in der protocols/serialzwei_line_log/config.in die Namen anpassen&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
vim config.in&lt;br /&gt;
:%s/LINE_/LINE2_/g&lt;br /&gt;
:%s/Line/Line2/g&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* die ethersex/config.in und das MAKEFILE an die neuen Namen anpassen&lt;br /&gt;
&lt;br /&gt;
Zum Schluss müssen noch zwei zentrale Dateien angepasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
cd ethersex/&lt;br /&gt;
vim Makefile&lt;br /&gt;
SUBDIRS += protocols/serialzwei_line_log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
vim config.in  &lt;br /&gt;
source protocols/serialzwei_line_log/config.in&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach sollte &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt sollte unter Protokolle das Serial Line Log zweimal vorhanden sein.&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Das gleiche Verfahren funktioniert auch mit dem yport-Protokoll. Wenn man z.B. einen ATMega644p besitzt und beide UARTs &amp;quot;gleichzeitig&amp;quot; benutzen will, kann man das yport-Protokoll mit dem hier vorgestellten Verfahren duplizieren. nc &amp;lt;ip&amp;gt; 7970 bzw nc &amp;lt;ip&amp;gt; 7971 liefert dann die Ausgabe der beiden Ports.&lt;br /&gt;
&lt;br /&gt;
== Lösung 2 ==&lt;br /&gt;
Speziell für den U(S)ART gibt es eine elegantere Möglichkeit:&lt;br /&gt;
&lt;br /&gt;
Die AVR-LIBC unterstützt inzwischen bis zu zwei U(S)ARTs durch verschiedene Makros. In den Dateien core/usart.h und scripts/usart-config.sh finden sich weitere hilfreiche Makros. Man geht wie folgt vor:&lt;br /&gt;
&lt;br /&gt;
In config.in läßt man via menuconfig einen U(S)ART auswählen, indem man das Makro usart_choice() benutzt. Außerdem im Spiel sind die Makros get_usart_count und usart_count_used. Als Ergebnis sollten zwei Variable definiert sein: &amp;lt;mymodulename&amp;gt;_USE_USART und &amp;lt;mymodulename&amp;gt;_BAUDRATE, welche für die U(S)ART-Nummer bzw. die Baudrate stehen. Als Beispiel siehe YPort.&lt;br /&gt;
&lt;br /&gt;
Im C-Quelltext benötigt man folgende Anweisungen:&lt;br /&gt;
* #define USE_USART &amp;lt;mymodulename&amp;gt;_USE_USART&lt;br /&gt;
  Die Variable &amp;lt;mymodulename&amp;gt;_USE_USART muß in config.in auf eine Zahl 0 oder 1 für den ausgewählten U(S)ART gesetzt worden sein. Mit der Zuweisung an USE_USART versorgt man die folgenden universellen Makroaufrufe mit der richtigen U(S)ART-Nummer.&lt;br /&gt;
* #define BAUD &amp;lt;mymodulensme&amp;gt;_BAUDRATE&lt;br /&gt;
  Gleiches Spiel für die Baudrate&lt;br /&gt;
* #include &amp;quot;core/usart.h&amp;quot;&lt;br /&gt;
  Hier stehen Makros&lt;br /&gt;
* generate_usart_init()&lt;br /&gt;
  Dieser Makroaufruf irgendwo im folgenden C-Quelltext generiert eine Routine usart_init() für den ausgewählten U(S)ART, setzt das Datenformat auf 8N1 und die Baudratenvorteiler auf den korrekten Wert. Außerdem werden die RXC und TX Interrupts freigegeben. Andere Datenformate als 8N1 sind (noch) nicht als Makro definiert, und wenn das Freigeben der Interrupts stört, dann sollte man anstelle des generate_usart_init() Makros die Intialisierung aller Register mit Hilfe der unten beschriebenen Makros selbst durchführen.&lt;br /&gt;
* ISR(usart(USART,_RX_vect)) bzw. ISR(usart(USART,_TX_vect)) etc.&lt;br /&gt;
  So werden die Interrupthandler universell definiert, sie verwenden dann automatisch die richtige U(S)ART-Nummer.&lt;br /&gt;
* Die U(S)ART-Register sowie die Bit-Definitionen der Register werden ersetzt durch Makroaufrufe usart(&amp;lt;vordererTeil&amp;gt;[,&amp;lt;hintererTeil&amp;gt;]). Das Makro fügt die U(S)ART-Nummer ein.&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Atos</name></author>	</entry>

	<entry>
		<id>http://www.ethersex.de/index.php?title=Development/ECMD&amp;diff=790</id>
		<title>Development/ECMD</title>
		<link rel="alternate" type="text/html" href="http://www.ethersex.de/index.php?title=Development/ECMD&amp;diff=790"/>
				<updated>2012-07-26T03:33:26Z</updated>
		
		<summary type="html">&lt;p&gt;Atos: /* Parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{i18n|Development/ECMD}}&lt;br /&gt;
For general information on ECMD, see [[ECMD]].&lt;br /&gt;
&lt;br /&gt;
The following variables will be used on this page. Replace them for your module.&lt;br /&gt;
&lt;br /&gt;
* '''COMMAND''' - how the command will be invoked&lt;br /&gt;
* '''ARGUMENT1'''...'''ARGUMENTN''' - the arguments that will be passed together with '''COMMAND'''&lt;br /&gt;
* '''FUNCTIONNAME''' - the name of the function which will handle the command&lt;br /&gt;
* '''MODULENAME''' - the name of the module&lt;br /&gt;
&lt;br /&gt;
= Preparations =&lt;br /&gt;
&lt;br /&gt;
* Create a new file inside the folder of the module '''MODULENAME_ecmd.c'''&lt;br /&gt;
* Add this file to the [[Development/Makefile | Makefile]] of the module.&lt;br /&gt;
* Open the file and &amp;quot;#include &amp;quot;protocols/ecmd/ecmd-base.h&amp;quot; and other necessary headers.&lt;br /&gt;
* Add the header of the module, &amp;lt;string.h&amp;gt; etc.&lt;br /&gt;
&lt;br /&gt;
= Create a new command =&lt;br /&gt;
&lt;br /&gt;
Start with the following template:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int16_t parse_cmd_FUNCTIONNAME (char *cmd, char *output, uint16_t len)&lt;br /&gt;
{&lt;br /&gt;
        /* Your Code here */&lt;br /&gt;
	return ECMD_FINAL_OK;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Whenever '''COMMAND''' is invoked, this function will be called to handle it.&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
&lt;br /&gt;
* *cmd holds '''ARGUMENT1'''...'''ARGUMENTN'''  which have been passed along with the command. The command text you specified with ecmd_feature macro has already been stripped off, *cmd points to the arguments only. The length of the commandbuffer varies, and may not be zero-terminated properly.&lt;br /&gt;
* &amp;lt;strike&amp;gt;len is the length of the command (*cmd). Use this for securely parsing *cmd.&amp;lt;/strike&amp;gt; len is the length of the output buffer. Do NOT write beyond this limit. Always check the remaining buffersize, or use snprintf_P with proper len param2. The output buffersize depends on the module that called the parser routine: UDP uses the remainder of the UIP buffer (first part of uip_buf holds the command), which is quite large. I2C uses ECMD_I2C_BUFFER_LEN, U(S)ART uses ECMD_SERIAL_USART_BUFFER_LEN and TCP uses ECMD_INPUTBUF_LENGTH (which is wrong, should be ECMD_OUTPUTBUF_LENGTH but both are equal and only 50 chars by default). If you have more text, use the ECMD_AGAIN return value: your routine will get called again in the next cycle. If your text should be continued on the same line, TCP has an ECMD_NO_NEWLINE mechanism at least for the first call, but other channels have not. &lt;br /&gt;
* *output is the output buffer &amp;lt;strike&amp;gt;which can hold 50 bytes/characters&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Return values ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
| ECMD_FINAL_OK&lt;br /&gt;
| the command has been executed without any errors. &amp;quot;OK&amp;quot; will be written to the caller's output.&lt;br /&gt;
|-&lt;br /&gt;
| ECMD_FINAL('''len''') &lt;br /&gt;
| the command has been executed. '''len''' bytes of *output will be written to the caller's output&lt;br /&gt;
|-&lt;br /&gt;
| ECMD_AGAIN('''len''') &lt;br /&gt;
| the command has been executed but needs to be called again. '''len''' bytes of *output will be written to the caller's output&lt;br /&gt;
|-&lt;br /&gt;
| ECMD_ERR_PARSE_ERROR &lt;br /&gt;
| the command couldn't be executed (missing/wrong arguments etc.)&lt;br /&gt;
|-&lt;br /&gt;
| ECMD_ERR_READ_ERROR &lt;br /&gt;
| the command couldn't be executed (not able to read from device/hardware)&lt;br /&gt;
|-&lt;br /&gt;
| ECMD_ERR_WRITE_ERROR &lt;br /&gt;
| the command couldn't be executed (not able to write to device/hardware)&lt;br /&gt;
|}&lt;br /&gt;
== Announce the command ==&lt;br /&gt;
&lt;br /&gt;
Append this to the bottom of '''MODULENAME_ecmd.c''' to let the ECMD parser know&lt;br /&gt;
about the new command.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
-- Ethersex META --&lt;br /&gt;
block(MODULENAME)&lt;br /&gt;
ecmd_feature(FUNCTIONNAME, &amp;quot;COMMAND&amp;quot;, ARGUMENT1...ARGUMENTN , DESCRIPTION)&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The '''COMMAND''' along with the arguments and the description will show up [[ECMD_Reference | here]]&lt;br /&gt;
&lt;br /&gt;
= Tips and best practice =&lt;br /&gt;
&lt;br /&gt;
== Recursive calling a command handler function ==&lt;br /&gt;
&lt;br /&gt;
If you need to output a lot of data (&amp;gt;50 bytes) , you need to recursivly call the command handler function&lt;br /&gt;
using '''ECMD_AGAIN()'''.&lt;br /&gt;
&lt;br /&gt;
Instead of using unsafe ''static'' variables to keep track of the current progress you can use the following code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 /* trick: use bytes on cmd as &amp;quot;connection specific static variables&amp;quot; */&lt;br /&gt;
    if (cmd[0] != 23) {		/* indicator flag: real invocation:  0 */&lt;br /&gt;
	cmd[0] = 23;		/*                 continuing call: 23 */&lt;br /&gt;
	cmd[1] = 0;		/* local variable 1 */&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[https://github.com/ethersex/ethersex/blob/master/protocols/ecmd/parser.c#L193 source]&lt;br /&gt;
[https://github.com/ethersex/ethersex/blob/master/services/dmx-storage/dmx_storage_ecmd.c#L105 example]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Atos</name></author>	</entry>

	<entry>
		<id>http://www.ethersex.de/index.php?title=Onewire_(Deutsch)&amp;diff=789</id>
		<title>Onewire (Deutsch)</title>
		<link rel="alternate" type="text/html" href="http://www.ethersex.de/index.php?title=Onewire_(Deutsch)&amp;diff=789"/>
				<updated>2012-07-26T02:37:34Z</updated>
		
		<summary type="html">&lt;p&gt;Atos: /* Bezugsquellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{i18n|Onewire}}&lt;br /&gt;
&lt;br /&gt;
{{Module&lt;br /&gt;
|NAME=Onewire&lt;br /&gt;
|MENUCONFIG={{I/O}}-&amp;gt;Onewire support&lt;br /&gt;
|STATUS={{stable}}&lt;br /&gt;
|PINNING=yes&lt;br /&gt;
|ECMD={{has_ecmd}}&lt;br /&gt;
|CONTROL6={{has_control6}}&lt;br /&gt;
|DEPENDS=[[ECMD]] [[HTTPD]] (optional) [[SNMP]] (optional)&lt;br /&gt;
|REQUIRES= -&lt;br /&gt;
|CODE=[https://github.com/ethersex/ethersex/tree/master/hardware/onewire https://github.com/ethersex/ethersex/tree/master/hardware/onewire]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Ethersex kann 1-wire Temperatursensoren mit [[ECMD]] auflisten und abfragen. Es wird eine reine&lt;br /&gt;
Softwareimplementierung des Protokolls benutzt, was keine weiteren Hardware erfordert, als die&lt;br /&gt;
Temperatursensoren selbst.&lt;br /&gt;
&lt;br /&gt;
= Pinning =&lt;br /&gt;
&lt;br /&gt;
In der Standardkonfiguration liegt der Datapin des Buses auf PD6 (kann z.B. in der pinning/hardware/netio.m4&lt;br /&gt;
oder pinning/hardware/etherrape.m4 geändert werden). Die Definition der Pins erfolgt mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  ONEWIRE_PORT_RANGE(PXn, PXm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei PXn und PNm Pins auf PORTX sind.&lt;br /&gt;
&lt;br /&gt;
Jeder Pin zwischen und einschließlich PXn und PXm bildet einen eingenständigen Onewire Bus.&lt;br /&gt;
Du kannst bis zu acht Busse auf einem PORT definieren (alle Busse müssen auf dem selben PORT liegen!)&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Wenn Du nur einen einzigen Bus benötigst, definiere den Bereich wie folgt:&lt;br /&gt;
&lt;br /&gt;
'''PORTD: PIN2'''&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  ONEWIRE_PORT_RANGE(PD2, PD2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für drei Busse würde das ganze etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
'''PORTD: PIN2, PIN3, PIN4'''&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  ONEWIRE_PORT_RANGE(PD2, PD4)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Polling Modus =&lt;br /&gt;
&lt;br /&gt;
  │ │            [*] Onewire Polling                                        │ │  &lt;br /&gt;
  │ │            (375) Time between discoveries in 0.8s steps               │ │  &lt;br /&gt;
  │ │            (12) Time between polling in 0.8s steps                    │ │  &lt;br /&gt;
  │ │            [*] ECMD 1w list with values                               │ │  &lt;br /&gt;
  │ │            (10) Maximum sensor count                                  │ │  &lt;br /&gt;
&lt;br /&gt;
Im Polling-Modus werden die Sensoren im Hintergrund abgefragt, so dass die Werte&lt;br /&gt;
bei Bedarf direkt zur Verfügung stehen und nicht erst gewandelt bzw.&lt;br /&gt;
eingelesen werden müssen. Der Intervall zwischen den Discoveries und zwischen&lt;br /&gt;
den Abfragen der Werte kann getrennt eingestellt werden. Die Option&lt;br /&gt;
'''ECMD 1w list with values''' bietet die Möglichkeit, die aktuellen Werte&lt;br /&gt;
bei Aufruf von '''1w list''' mit ausgeben zu lassen. So können darauf folgende&lt;br /&gt;
'''1w get''' Kommandos entfallen.&lt;br /&gt;
&lt;br /&gt;
Da zur Pufferung der Werte, ROM-Codes, etc. RAM-Speicher benötigt wird, muss&lt;br /&gt;
per '''Maximum sensor count''' angegeben werden, für wie viele Sensoren Speicher&lt;br /&gt;
reserviert wird.&lt;br /&gt;
&lt;br /&gt;
= Benennung von Sensoren =&lt;br /&gt;
&lt;br /&gt;
  │ │            [*] Onewire naming support                                 │ │  &lt;br /&gt;
  │ │            (10) Maximum sensor count                                  │ │  &lt;br /&gt;
&lt;br /&gt;
Um den Sensoren sinnvolle Namen zu geben besteht die Möglichkeit im EEPROM&lt;br /&gt;
eine entsprechende Zuweisungstabelle anzulegen (ROM-Code -&amp;gt; Name). Die Namen werden&lt;br /&gt;
bei bei Aufruf von '''1w list''' mit ausgegeben. Dazu gibt es&lt;br /&gt;
folgende ECMD Kommandos:&lt;br /&gt;
&lt;br /&gt;
    1w name list&lt;br /&gt;
&lt;br /&gt;
Auflistung der aktuellen Zuweisungen (Spalten: ID, ROM-Code, Name). Die ID bezeichnet&lt;br /&gt;
die Position in der Zuweisungstabelle und kann u.a. dazu benutzt werden, Sensoren&lt;br /&gt;
bei SNMP-Abfragen eindeutig zu referenzieren.&lt;br /&gt;
&lt;br /&gt;
    1w name set &amp;lt;ID&amp;gt; &amp;lt;ROM-Code&amp;gt; &amp;lt;Name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erstellt einen entsprechenden Tabelleneintrag.&lt;br /&gt;
&lt;br /&gt;
    1w name clear &amp;lt;ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löscht die Felder eines Tabelleneintrags.&lt;br /&gt;
&lt;br /&gt;
    1w name save&lt;br /&gt;
&lt;br /&gt;
Speichert die aktuelle Tabelle im EEPROM&lt;br /&gt;
&lt;br /&gt;
= Unterstützte Hardware =&lt;br /&gt;
&lt;br /&gt;
Folgende 1-wire Hardware wird momentan durch Ethersex unterstützt:&lt;br /&gt;
* DS1820 (Temperatursensor)&lt;br /&gt;
* DS18B20 (Temperatursensor)&lt;br /&gt;
* DS1822 (Temperatursensor)&lt;br /&gt;
* DS2502 (EEPROM)&lt;br /&gt;
* DS2450 (4 Kanal ADC)&lt;br /&gt;
&lt;br /&gt;
=  Onewire Befehle =&lt;br /&gt;
&lt;br /&gt;
unter Linux als erstes netcat starten (hierbei natürlich die IP ggf modifizieren): &lt;br /&gt;
&lt;br /&gt;
    netcat 192.168.0.15 2701&lt;br /&gt;
&lt;br /&gt;
danach am prompt:&lt;br /&gt;
&lt;br /&gt;
    1w list&lt;br /&gt;
&lt;br /&gt;
Gibt eine Liste mit Hexcodes  aller angeschlossenen und erkannten Onewire(tm) Sensoren aus.&lt;br /&gt;
Bei aktiviertem Naming-Support wird (per TAB getrennt) zusätzlich der Name ausgegeben. Außerdem&lt;br /&gt;
kann mit '''ECMD 1w list with values (ONEWIRE_ECMD_LIST_VALUE_SUPPORT)''' der aktuelle Temperaturwert&lt;br /&gt;
mit ausgegeben werden. Dies erspart zusätzliche '''1w get''' Aufrufe, setzt allerding Polling-Support&lt;br /&gt;
vorraus.&lt;br /&gt;
&lt;br /&gt;
    1w convert &amp;lt;hexcode&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Veranlasst eine Temperaturmessung des addressierten Sensors, oder, wenn das Argument &amp;lt;hexcode&amp;gt;&lt;br /&gt;
weggelassen wird, aller angeschlossener Sensoren. Im Polling-Modus wird dieses Kommando ignoriert.&lt;br /&gt;
&lt;br /&gt;
    1w get &amp;lt;hexcode&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gibt die gemessene Temperatur eines Sensors aus.&lt;br /&gt;
&lt;br /&gt;
=  Einbindung in die [[HTTPD]]-Weboberfläche =&lt;br /&gt;
&lt;br /&gt;
Unter httpd/embed/ow.ht.m4, bzw httpd/embed/Xow.ht.m4 liegt eine Weboberflaeche, die alle Sensoren erkennt&lt;br /&gt;
und ihre aktuelle Temperatur regelmässig per Ajax abfragt und anzeigt. Im Falle von Xow.ht.m4 wird sogar&lt;br /&gt;
Graph der Temperatur mittels SVG gemalt. Um die Dateien einzubinden, muss man einfach bei aktiviertem&lt;br /&gt;
Onewiresupport den Webserver und das Datei Inlining aktivieren.&lt;br /&gt;
&lt;br /&gt;
Die Dateien können dann unter ow.ht bzw. unter Xow.ht angezeigt werden. Das Beispiel zeigt die SVG-Version&lt;br /&gt;
mit Naming-Support:&lt;br /&gt;
&lt;br /&gt;
[[File:onewire-svg.png]]&lt;br /&gt;
&lt;br /&gt;
= Anschluss AVR-NET-IO =&lt;br /&gt;
Für das Pollin AVR-NET-IO Board können die Sensoren DS18S20+ ,  &lt;br /&gt;
&lt;br /&gt;
normal Betrieb&lt;br /&gt;
&lt;br /&gt;
[[File:netio-1wire_normal.png]]&lt;br /&gt;
&lt;br /&gt;
parasitären Modus&lt;br /&gt;
&lt;br /&gt;
[[File:netio-1wire.png]]&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Wenn man beim Net-IO nicht alle Analogeingänge benötigt, lässt sich der 1-Wire-Bus auch an der&lt;br /&gt;
Schraubklemme ADC1 ganz gut aufschalten. Vorteil ist, dass man gleich alle passenden Spannungen (GND, +5V)&lt;br /&gt;
an den beiden nebenliegenden Schraubklemmen hat. Das Pinning muss dann entspechend in der kann in der Datei&lt;br /&gt;
pinning/hardware/netio.m4 von PD6 auf PA4 geändert werden. Vorteil dieser Konfiguration ist, dass man den&lt;br /&gt;
DB-25-Verbinder zum Anschluss der Relaisplatine K8IO von Pollin frei hat und den EXT Steckverbinder zum&lt;br /&gt;
Anschluss eines LCD über ein 4bit-Interface nutzen kann, ohne die Erweiterungsplatine von Pollin zu benötigen.&lt;br /&gt;
&lt;br /&gt;
Pinbelegung:&lt;br /&gt;
&lt;br /&gt;
[[File:ds18s20-par-pinout.jpg]]&lt;br /&gt;
&lt;br /&gt;
= Anschluss Etherrape =&lt;br /&gt;
&lt;br /&gt;
Die Schaltung je nach parasitärem oder normalem Betriebsmodus kann aus der NetIO Skizze übernommen werden.&lt;br /&gt;
Data liegt auf PORTD an Pin 7:&lt;br /&gt;
&lt;br /&gt;
 PORTD&lt;br /&gt;
 +---+&lt;br /&gt;
 |x x|&lt;br /&gt;
 |x X| &amp;lt;- Pin 7&lt;br /&gt;
 |x x&lt;br /&gt;
 |x x|&lt;br /&gt;
 |x x|&lt;br /&gt;
 +---+&lt;br /&gt;
&lt;br /&gt;
Direkt neben PORTD befinden sich 2 Pins mit GND und 5V als Beschriftung. &lt;br /&gt;
GND kann als GND und 5V als Vcc genutzt werden.&lt;br /&gt;
&lt;br /&gt;
= Einbindung in [[Control6]] =&lt;br /&gt;
&lt;br /&gt;
Die Sensoren können mit '''ONEWIRE_GET''' einfach abgefragt werden.  Die Funktion führt automatisch ein&lt;br /&gt;
''convert'' aus, es sind also keine zwei Schritte erforderlich wie bei dem Zugriff über [[ECMD]].&lt;br /&gt;
Die Rückgabe erfolgt (analog der Funktion '''KTY_GET''') in Centigrad, also Temperatur * 10.&lt;br /&gt;
Hier vielleicht ein kleines Beispiel, das die Daten per [[SYSLOG]] ausgibt sobald sich die Temperatur&lt;br /&gt;
um mehr als ein Grad zur letzten Messung verändert hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int16_t Temperatur;&lt;br /&gt;
int16_t Temperatur_alt;&lt;br /&gt;
&lt;br /&gt;
CONTROL_START&lt;br /&gt;
&lt;br /&gt;
THREAD(read_temp)&lt;br /&gt;
  Temperatur = ONEWIRE_GET(10d85594010800eb);&lt;br /&gt;
  ON abs(Temperatur-Temperatur_alt)&amp;gt;10 DO&lt;br /&gt;
    div_t res = div(Temperatur,10);&lt;br /&gt;
    SYSLOG(&amp;quot;temperature changed %d.%d&amp;quot;,res.quot,res.rem)&lt;br /&gt;
    Temperatur_alt = Temperatur;&lt;br /&gt;
  END&lt;br /&gt;
  WAIT(15);&lt;br /&gt;
THREAD_END(read_temp)&lt;br /&gt;
&lt;br /&gt;
ON STARTUP DO&lt;br /&gt;
  Temperatur = Temperatur_alt = 0;&lt;br /&gt;
  THREAD_START(read_temp);&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
CONTROL_END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Abfrage per [[SNMP]] =&lt;br /&gt;
&lt;br /&gt;
Falls Polling-Support aktiviert wurde können die Sensorwerte per SNMP abgefragt werden.&lt;br /&gt;
Mit Naming-Support stehen auch die Namen per SNMP zur Verfügung und die Index-Nummern sind&lt;br /&gt;
fix auf die Position in der Namenstabelle festgelegt. Dies ist sehr hilfreich, um bestimmte&lt;br /&gt;
Sensoren über den SNMP-Index anzusprechen.&lt;br /&gt;
&lt;br /&gt;
Es gibt folgende OIDs:&lt;br /&gt;
&lt;br /&gt;
* .1.3.6.1.4.1.39967.3.1.&amp;lt;idx&amp;gt; : ROM-Code des Sensors&lt;br /&gt;
* .1.3.6.1.4.1.39967.3.2.&amp;lt;idx&amp;gt; : Sensor-Name (nur mit Naming-Support)&lt;br /&gt;
* .1.3.6.1.4.1.39967.3.3.&amp;lt;idx&amp;gt; : Temperaturwert in Centigrad&lt;br /&gt;
* .1.3.6.1.4.1.39967.3.4.&amp;lt;idx&amp;gt; : 0 = Sensor nicht vorhanden, 1 = Sensor vorhanden&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# snmpwalk -Osn -c public -v 1 192.168.255.90 1.3.6.1.4.1.39967.3&lt;br /&gt;
.1.3.6.1.4.1.39967.3.1.0 = STRING: &amp;quot;1080cff6010800f9&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.1.1 = STRING: &amp;quot;10c8cff60108002d&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.1.2 = STRING: &amp;quot;1029f6dc0108002f&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.1.3 = STRING: &amp;quot;10f2d0f60108001c&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.1.4 = STRING: &amp;quot;105a17f70108001d&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.1.5 = STRING: &amp;quot;10b8d8f601080098&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.1.6 = STRING: &amp;quot;104dedf601080057&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.1.7 = STRING: &amp;quot;10011af701080027&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.1.8 = STRING: &amp;quot;0000000000000000&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.1.9 = STRING: &amp;quot;0000000000000000&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.2.0 = STRING: &amp;quot;kessel&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.2.1 = STRING: &amp;quot;warmwasser&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.2.2 = STRING: &amp;quot;aussen&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.2.3 = STRING: &amp;quot;speicher&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.2.4 = STRING: &amp;quot;heizung vl&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.2.5 = STRING: &amp;quot;heizung rl&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.2.6 = STRING: &amp;quot;boiler vl&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.2.7 = STRING: &amp;quot;boiler rl&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.2.8 = &amp;quot;&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.2.9 = &amp;quot;&amp;quot;&lt;br /&gt;
.1.3.6.1.4.1.39967.3.3.0 = INTEGER: 334&lt;br /&gt;
.1.3.6.1.4.1.39967.3.3.1 = INTEGER: 467&lt;br /&gt;
.1.3.6.1.4.1.39967.3.3.2 = INTEGER: 127&lt;br /&gt;
.1.3.6.1.4.1.39967.3.3.3 = INTEGER: 185&lt;br /&gt;
.1.3.6.1.4.1.39967.3.3.4 = INTEGER: 318&lt;br /&gt;
.1.3.6.1.4.1.39967.3.3.5 = INTEGER: 269&lt;br /&gt;
.1.3.6.1.4.1.39967.3.3.6 = INTEGER: 366&lt;br /&gt;
.1.3.6.1.4.1.39967.3.3.7 = INTEGER: 291&lt;br /&gt;
.1.3.6.1.4.1.39967.3.3.8 = INTEGER: 0&lt;br /&gt;
.1.3.6.1.4.1.39967.3.3.9 = INTEGER: 0&lt;br /&gt;
.1.3.6.1.4.1.39967.3.4.0 = INTEGER: 1&lt;br /&gt;
.1.3.6.1.4.1.39967.3.4.1 = INTEGER: 1&lt;br /&gt;
.1.3.6.1.4.1.39967.3.4.2 = INTEGER: 1&lt;br /&gt;
.1.3.6.1.4.1.39967.3.4.3 = INTEGER: 1&lt;br /&gt;
.1.3.6.1.4.1.39967.3.4.4 = INTEGER: 1&lt;br /&gt;
.1.3.6.1.4.1.39967.3.4.5 = INTEGER: 1&lt;br /&gt;
.1.3.6.1.4.1.39967.3.4.6 = INTEGER: 1&lt;br /&gt;
.1.3.6.1.4.1.39967.3.4.7 = INTEGER: 1&lt;br /&gt;
.1.3.6.1.4.1.39967.3.4.8 = INTEGER: 0&lt;br /&gt;
.1.3.6.1.4.1.39967.3.4.9 = INTEGER: 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Codebeispiele =&lt;br /&gt;
&lt;br /&gt;
* [[Onewire/Example/PHP (Deutsch) | PHP]]&lt;br /&gt;
* [[Onewire/Example/Perl (Deutsch) | Perl]]&lt;br /&gt;
* [[Onewire/Example/Python | Python]]&lt;br /&gt;
* [[Onewire/Example/Shell | sh/bash]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Ethersex]]&lt;br /&gt;
[[Category:StepByStep]]&lt;br /&gt;
[[Category:Onewire]]&lt;br /&gt;
&lt;br /&gt;
= Bezugsquellen =&lt;br /&gt;
* 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&lt;br /&gt;
* und natürlich bei den üblichen Verdächtigen: Reichelt, Segor, Conrad&lt;/div&gt;</summary>
		<author><name>Atos</name></author>	</entry>

	</feed>