From 6bfffbb57b96556a94fa96b132222091cb1ba5df Mon Sep 17 00:00:00 2001
From: rudolfkoenig <>
Date: Sun, 4 Nov 2012 13:29:55 +0000
Subject: [PATCH] Preparing THE SPLIT

git-svn-id: https://svn.fhem.de/fhem/trunk@2075 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
 fhem/CHANGED                     |    1 +
 fhem/FHEM/10_ZWave.pm            |   10 -
 fhem/FHEM/70_SML.pm              |    2 +
 fhem/FHEM/70_STV.pm              |    1 +
 fhem/FHEM/76_MSGFile.pm          |  308 ++---
 fhem/FHEM/76_MSGMail.pm          |  292 ++---
 fhem/contrib/commandref_join.pl  |   74 ++
 fhem/contrib/commandref_split.pl |   63 +
 fhem/docs/commandref.html        | 1844 ++++++++++++++----------------
 fhem/docs/fhem.html              |    2 +-
 10 files changed, 1327 insertions(+), 1270 deletions(-)
 create mode 100644 fhem/contrib/commandref_join.pl
 create mode 100644 fhem/contrib/commandref_split.pl

diff --git a/fhem/CHANGED b/fhem/CHANGED
index 2390f0b70..c6e4693d9 100644
--- a/fhem/CHANGED
+++ b/fhem/CHANGED
@@ -7,6 +7,7 @@
   - feature: optional second parameter to fhem() to make it silent
   - feature: autoloading commands, XmlList/etc renamed from 99 to 98.
   - feature: FHEMWEB returns external files in chunks to save memory
+  - feature: commandref.html splitted: documentation is now appended to the modules.
 
 - 2012-10-28 (5.3)
   - feature: added functions trim, ltrim, rtrim, UntoggleDirect, UntoggleIndirect
diff --git a/fhem/FHEM/10_ZWave.pm b/fhem/FHEM/10_ZWave.pm
index 6a035e704..46bacc51c 100755
--- a/fhem/FHEM/10_ZWave.pm
+++ b/fhem/FHEM/10_ZWave.pm
@@ -475,13 +475,3 @@ ZWave_Undef($$)
 }
 
 1;
-
-=begin html
-
-<a name="CUL"></a>
-<h3>CUL</h3>
-<ul>
-text
-</ul>
-
-=end html
diff --git a/fhem/FHEM/70_SML.pm b/fhem/FHEM/70_SML.pm
index d890919ee..a0161c7e7 100644
--- a/fhem/FHEM/70_SML.pm
+++ b/fhem/FHEM/70_SML.pm
@@ -333,3 +333,5 @@ energy_Undef($$)
 
  return undef;
 }
+
+1;
diff --git a/fhem/FHEM/70_STV.pm b/fhem/FHEM/70_STV.pm
index 8d6c267b8..ea86fac1e 100644
--- a/fhem/FHEM/70_STV.pm
+++ b/fhem/FHEM/70_STV.pm
@@ -345,3 +345,4 @@ if ( $kind ne 0 ){
    }
 }
 
+1;
diff --git a/fhem/FHEM/76_MSGFile.pm b/fhem/FHEM/76_MSGFile.pm
index 22d02dfdc..1b3037e1c 100644
--- a/fhem/FHEM/76_MSGFile.pm
+++ b/fhem/FHEM/76_MSGFile.pm
@@ -1,154 +1,154 @@
-##############################################
-# $Id: 76_MSGFile.pm 2012-06-20 18:29:00 rbente
-##############################################
-package main;
-
-use strict;
-use warnings;
-use Switch;
-my %sets = (
-  "add" => "MSGFile",
-  "clear" => "MSGFile",
-  "list" => "MSGFile"
-);
-##############################################
-# Initialize Function
-#  Attributes are:
-#     filename    the name of the file
-#     filemode    new = file will be created from scratch
-#                 append = add the new lines to the end of the existing data
-#     CR          0 = no CR added to the end of the line
-#                 1 = CR added to the end of the line
-##############################################
-sub
-MSGFile_Initialize($)
-{
-  my ($hash) = @_;
-
-  $hash->{SetFn}     = "MSGFile_Set";
-  $hash->{DefFn}     = "MSGFile_Define";
-  $hash->{UndefFn}   = "MSGFile_Undef";
-  $hash->{AttrList}  = "loglevel:0,1,2,3,4,5,6 filename filemode:new,append CR:0,1";
-}
-
-##############################################
-# Set Function
-# all the data are stored in the global array  @data
-# as counter we use a READING named msgcount
-##############################################
-sub
-MSGFile_Set($@)
-{
-  my ($hash, @a) = @_;
-    return "Unknown argument $a[1], choose one of ->  " . join(" ", sort keys %sets)
-  	if(!defined($sets{$a[1]}));
-
-  
-  my $name = shift @a;
-
-	return "no set value specified" if(int(@a) < 1);
-	return "Unknown argument ?" if($a[0] eq "?");
-	my $v = join(" ", @a);
-
-##### we like to add another line of data	
-	if($a[0] eq "add")
-	{
-##### split the line in command and data	
-		my $mx = shift @a;
-		my $my = join(" ",@a);
-##### check if we like to have and CR at the end of the line		
-		if(AttrVal($name, "CR", "0") eq "1")
-		{
-			$my = $my . "\n";
-		}
-##### get the highest number of lines, store the line in  @data and increase 
-##### the counter, at the end set the status
-		my $count = $hash->{READINGS}{msgcount}{VAL};
-		$data{$name}{$count} = $my;
-		$hash->{READINGS}{msgcount}{TIME} = TimeNow();
-		$hash->{READINGS}{msgcount}{VAL}  = $count + 1;
-		$hash->{STATE} = "addmsg";
-
-	}
-	
-##### we like to clear our buffer, first clear all lines of @data
-##### and then set the counter to 0 and the status to clear
-	if($a[0] eq "clear")
-	{
-		my $i;
-		for($i=0;$i<ReadingsVal($name,"msgcount",0);$i++)
-		{
-			$data{$name}{$i} = "";
-		}
-		$hash->{READINGS}{msgcount}{TIME} = TimeNow();
-		$hash->{READINGS}{msgcount}{VAL} = 0;
-		$hash->{STATE} = "clear";
-
-	}
-
-##### we like to see the buffer
-
-	if($a[0] eq "list")
-	{
-		my $i;
-		my $mess = "---- Lines of data for $name ----\n";
-		for($i=0;$i<ReadingsVal($name,"msgcount",0);$i++)
-		{
-			$mess .= $data{$name}{$i};
-		}
-		return "$mess---- End of data for $name ----";
-	}
-	
-  Log GetLogLevel($name,2), "messenger set $name $v";
-
-#   set stats  
- # $hash->{CHANGED}[0] = $v;
-  $hash->{READINGS}{state}{TIME} = TimeNow();
-  $hash->{READINGS}{state}{VAL} = $v;
-  return undef;
-}
-
-##############################################
-# Define Function
-# set the counter to 0
-# and filemode to "new"
-##############################################
-sub
-MSGFile_Define($$)
-{
-  my ($hash, $def) = @_;
-  my @a = split("[ \t][ \t]*", $def);
-  my $errmsg = "wrong syntax: define <name> MSGFile filename";
-  my $name = $hash->{NAME};
-
-  return $errmsg    if(@a != 3);
-  $attr{$name}{filename} = $a[2];
-  $attr{$name}{filemode} = "new";
-  $attr{$name}{CR} = "1";
-  
-
-  $hash->{STATE} = "ready";
-  $hash->{TYPE}  = "MSGFile";
-  $hash->{READINGS}{msgcount}{TIME} = TimeNow();
-  $hash->{READINGS}{msgcount}{VAL}  = 0;
-  return undef;
-}
-##############################################
-# Undefine Function
-# flush all lines of data
-##############################################
-sub
-MSGFile_Undef($$)
-{
-	my ($hash, $name) = @_;
-	my $i;
-############  flush the data 
-	for($i=0;$i<ReadingsVal($name,"msgcount",0);$i++)
-	{
-		$data{$name}{$i} = "";
-	}
-
-	delete($modules{MSGFile}{defptr}{$hash->{CODE}}) if($hash && $hash->{CODE});
-	return undef;
-}
-1;
+##############################################
+# $Id: 76_MSGFile.pm 2012-06-20 18:29:00 rbente
+##############################################
+package main;
+
+use strict;
+use warnings;
+use Switch;
+my %sets = (
+  "add" => "MSGFile",
+  "clear" => "MSGFile",
+  "list" => "MSGFile"
+);
+##############################################
+# Initialize Function
+#  Attributes are:
+#     filename    the name of the file
+#     filemode    new = file will be created from scratch
+#                 append = add the new lines to the end of the existing data
+#     CR          0 = no CR added to the end of the line
+#                 1 = CR added to the end of the line
+##############################################
+sub
+MSGFile_Initialize($)
+{
+  my ($hash) = @_;
+
+  $hash->{SetFn}     = "MSGFile_Set";
+  $hash->{DefFn}     = "MSGFile_Define";
+  $hash->{UndefFn}   = "MSGFile_Undef";
+  $hash->{AttrList}  = "loglevel:0,1,2,3,4,5,6 filename filemode:new,append CR:0,1";
+}
+
+##############################################
+# Set Function
+# all the data are stored in the global array  @data
+# as counter we use a READING named msgcount
+##############################################
+sub
+MSGFile_Set($@)
+{
+  my ($hash, @a) = @_;
+    return "Unknown argument $a[1], choose one of ->  " . join(" ", sort keys %sets)
+  	if(!defined($sets{$a[1]}));
+
+  
+  my $name = shift @a;
+
+	return "no set value specified" if(int(@a) < 1);
+	return "Unknown argument ?" if($a[0] eq "?");
+	my $v = join(" ", @a);
+
+##### we like to add another line of data	
+	if($a[0] eq "add")
+	{
+##### split the line in command and data	
+		my $mx = shift @a;
+		my $my = join(" ",@a);
+##### check if we like to have and CR at the end of the line		
+		if(AttrVal($name, "CR", "0") eq "1")
+		{
+			$my = $my . "\n";
+		}
+##### get the highest number of lines, store the line in  @data and increase 
+##### the counter, at the end set the status
+		my $count = $hash->{READINGS}{msgcount}{VAL};
+		$data{$name}{$count} = $my;
+		$hash->{READINGS}{msgcount}{TIME} = TimeNow();
+		$hash->{READINGS}{msgcount}{VAL}  = $count + 1;
+		$hash->{STATE} = "addmsg";
+
+	}
+	
+##### we like to clear our buffer, first clear all lines of @data
+##### and then set the counter to 0 and the status to clear
+	if($a[0] eq "clear")
+	{
+		my $i;
+		for($i=0;$i<ReadingsVal($name,"msgcount",0);$i++)
+		{
+			$data{$name}{$i} = "";
+		}
+		$hash->{READINGS}{msgcount}{TIME} = TimeNow();
+		$hash->{READINGS}{msgcount}{VAL} = 0;
+		$hash->{STATE} = "clear";
+
+	}
+
+##### we like to see the buffer
+
+	if($a[0] eq "list")
+	{
+		my $i;
+		my $mess = "---- Lines of data for $name ----\n";
+		for($i=0;$i<ReadingsVal($name,"msgcount",0);$i++)
+		{
+			$mess .= $data{$name}{$i};
+		}
+		return "$mess---- End of data for $name ----";
+	}
+	
+  Log GetLogLevel($name,2), "messenger set $name $v";
+
+#   set stats  
+ # $hash->{CHANGED}[0] = $v;
+  $hash->{READINGS}{state}{TIME} = TimeNow();
+  $hash->{READINGS}{state}{VAL} = $v;
+  return undef;
+}
+
+##############################################
+# Define Function
+# set the counter to 0
+# and filemode to "new"
+##############################################
+sub
+MSGFile_Define($$)
+{
+  my ($hash, $def) = @_;
+  my @a = split("[ \t][ \t]*", $def);
+  my $errmsg = "wrong syntax: define <name> MSGFile filename";
+  my $name = $hash->{NAME};
+
+  return $errmsg    if(@a != 3);
+  $attr{$name}{filename} = $a[2];
+  $attr{$name}{filemode} = "new";
+  $attr{$name}{CR} = "1";
+  
+
+  $hash->{STATE} = "ready";
+  $hash->{TYPE}  = "MSGFile";
+  $hash->{READINGS}{msgcount}{TIME} = TimeNow();
+  $hash->{READINGS}{msgcount}{VAL}  = 0;
+  return undef;
+}
+##############################################
+# Undefine Function
+# flush all lines of data
+##############################################
+sub
+MSGFile_Undef($$)
+{
+	my ($hash, $name) = @_;
+	my $i;
+############  flush the data 
+	for($i=0;$i<ReadingsVal($name,"msgcount",0);$i++)
+	{
+		$data{$name}{$i} = "";
+	}
+
+	delete($modules{MSGFile}{defptr}{$hash->{CODE}}) if($hash && $hash->{CODE});
+	return undef;
+}
+1;
diff --git a/fhem/FHEM/76_MSGMail.pm b/fhem/FHEM/76_MSGMail.pm
index 6b7af5c3e..32c9d2c20 100644
--- a/fhem/FHEM/76_MSGMail.pm
+++ b/fhem/FHEM/76_MSGMail.pm
@@ -1,158 +1,158 @@
-##############################################
-# $Id: 76_MSGFile.pm 2012-06-20 18:29:00 rbente
-##############################################
-package main;
+##############################################
+# $Id: 76_MSGFile.pm 2012-06-20 18:29:00 rbente
+##############################################
+package main;
 
-use strict;
-use warnings;
-use Switch;
-my %sets = (
-  "add" => "MSGMail",
-  "clear" => "MSGMail",
-  "list" => "MSGMail"
-);
-##############################################
-# Initialize Function
-#  Attributes are:
-#     authfile    the name of the file which contains userid and password
-#     smtphost    the smtp server hostname
-#     smtpport    the port of the smtp host
-#     subject     subject of the email
-#     from        from mailaddress (sender)
-#     to          to mailaddress (receipent)
-#     cc          carbon copy address(es)  (delimiter is comma)
-#     CR          0 = no CR added to the end of the line
-#                 1 = CR added to the end of the line
-##############################################
-sub
-MSGMail_Initialize($)
-{
-  my ($hash) = @_;
+use strict;
+use warnings;
+use Switch;
+my %sets = (
+  "add" => "MSGMail",
+  "clear" => "MSGMail",
+  "list" => "MSGMail"
+);
+##############################################
+# Initialize Function
+#  Attributes are:
+#     authfile    the name of the file which contains userid and password
+#     smtphost    the smtp server hostname
+#     smtpport    the port of the smtp host
+#     subject     subject of the email
+#     from        from mailaddress (sender)
+#     to          to mailaddress (receipent)
+#     cc          carbon copy address(es)  (delimiter is comma)
+#     CR          0 = no CR added to the end of the line
+#                 1 = CR added to the end of the line
+##############################################
+sub
+MSGMail_Initialize($)
+{
+  my ($hash) = @_;
 
-  $hash->{SetFn}     = "MSGMail_Set";
-  $hash->{DefFn}     = "MSGMail_Define";
-  $hash->{UndefFn}   = "MSGMail_Undef";
-  $hash->{AttrList}  = "loglevel:0,1,2,3,4,5,6 authfile smtphost smtpport subject from to cc CR:0,1";
-}
+  $hash->{SetFn}     = "MSGMail_Set";
+  $hash->{DefFn}     = "MSGMail_Define";
+  $hash->{UndefFn}   = "MSGMail_Undef";
+  $hash->{AttrList}  = "loglevel:0,1,2,3,4,5,6 authfile smtphost smtpport subject from to cc CR:0,1";
+}
 
-##############################################
-# Set Function
-# all the data are stored in the global array  @data
-# as counter we use a READING named msgcount
-##############################################
-sub
-MSGMail_Set($@)
-{
-  my ($hash, @a) = @_;
-    return "Unknown argument $a[1], choose one of ->  " . join(" ", sort keys %sets)
-  	if(!defined($sets{$a[1]}));
-  my $name = shift @a;
+##############################################
+# Set Function
+# all the data are stored in the global array  @data
+# as counter we use a READING named msgcount
+##############################################
+sub
+MSGMail_Set($@)
+{
+  my ($hash, @a) = @_;
+    return "Unknown argument $a[1], choose one of ->  " . join(" ", sort keys %sets)
+  	if(!defined($sets{$a[1]}));
+  my $name = shift @a;
 
-	return "no set value specified" if(int(@a) < 1);
-#	return "Unknown argument ?" if($a[0] eq "?");
-	my $v = join(" ", @a);
-##### we like to add another line of data
-	if($a[0] eq "add")
-	{
-##### split the line in command and data	
-		my $mx = shift @a;
-		my $my = join(" ",@a);
-##### check if we like to have and CR at the end of the line		
-		if(AttrVal($name, "CR", "0") eq "1")
-		{
-			$my = $my . "\n";
-		}
-##### get the highest number of lines, stored the line in  @data and increase 
-##### the counter, at the end set the status
-		my $count = $hash->{READINGS}{msgcount}{VAL};
-		$data{$name}{$count} = $my;
-		$hash->{READINGS}{msgcount}{TIME} = TimeNow();
-		$hash->{READINGS}{msgcount}{VAL}  = $count + 1;
-		$hash->{STATE} = "addmsg";
+	return "no set value specified" if(int(@a) < 1);
+#	return "Unknown argument ?" if($a[0] eq "?");
+	my $v = join(" ", @a);
+##### we like to add another line of data
+	if($a[0] eq "add")
+	{
+##### split the line in command and data	
+		my $mx = shift @a;
+		my $my = join(" ",@a);
+##### check if we like to have and CR at the end of the line		
+		if(AttrVal($name, "CR", "0") eq "1")
+		{
+			$my = $my . "\n";
+		}
+##### get the highest number of lines, stored the line in  @data and increase 
+##### the counter, at the end set the status
+		my $count = $hash->{READINGS}{msgcount}{VAL};
+		$data{$name}{$count} = $my;
+		$hash->{READINGS}{msgcount}{TIME} = TimeNow();
+		$hash->{READINGS}{msgcount}{VAL}  = $count + 1;
+		$hash->{STATE} = "addmsg";
 
-	}
-##### we like to clear our buffer, first clear all lines of @data
-##### and then set the counter to 0 and the status to clear
-	
-	if($a[0] eq "clear")
-	{
-		my $i;
-		for($i=0;$i<ReadingsVal($name,"msgcount",0);$i++)
-		{
-			$data{$name}{$i} = "";
-		}
-		$hash->{READINGS}{msgcount}{TIME} = TimeNow();
-		$hash->{READINGS}{msgcount}{VAL} = 0;
-		$hash->{STATE} = "clear";
+	}
+##### we like to clear our buffer, first clear all lines of @data
+##### and then set the counter to 0 and the status to clear
+	
+	if($a[0] eq "clear")
+	{
+		my $i;
+		for($i=0;$i<ReadingsVal($name,"msgcount",0);$i++)
+		{
+			$data{$name}{$i} = "";
+		}
+		$hash->{READINGS}{msgcount}{TIME} = TimeNow();
+		$hash->{READINGS}{msgcount}{VAL} = 0;
+		$hash->{STATE} = "clear";
 
-	}
-	
-##### we like to see the buffer
-
-	if($a[0] eq "list")
-	{
-		my $i;
-		my $mess = "---- Lines of data for $name ----\n";
-		for($i=0;$i<ReadingsVal($name,"msgcount",0);$i++)
-		{
-			$mess .= $data{$name}{$i};
-		}
-		return "$mess---- End of data for $name ----";
-	}	
-  Log GetLogLevel($name,2), "messenger set $name $v";
+	}
+	
+##### we like to see the buffer
 
-  #   set stats  
- # $hash->{CHANGED}[0] = $v;
-  $hash->{READINGS}{state}{TIME} = TimeNow();
-  $hash->{READINGS}{state}{VAL} = $v;
-  return undef;
-}
+	if($a[0] eq "list")
+	{
+		my $i;
+		my $mess = "---- Lines of data for $name ----\n";
+		for($i=0;$i<ReadingsVal($name,"msgcount",0);$i++)
+		{
+			$mess .= $data{$name}{$i};
+		}
+		return "$mess---- End of data for $name ----";
+	}	
+  Log GetLogLevel($name,2), "messenger set $name $v";
 
-##############################################
-# Define Function
-# set the counter to 0
-##############################################
-sub
-MSGMail_Define($$)
-{
-  my ($hash, $def) = @_;
-  my @a = split("[ \t][ \t]*", $def);
-  my $errmsg = "wrong syntax: define <name> MSGMail from to smtphost authfile";
-  my $name = $hash->{NAME};
+  #   set stats  
+ # $hash->{CHANGED}[0] = $v;
+  $hash->{READINGS}{state}{TIME} = TimeNow();
+  $hash->{READINGS}{state}{VAL} = $v;
+  return undef;
+}
 
-  return $errmsg    if(@a != 6);
-##### set all  the Attributes
-  $attr{$name}{from} = $a[2];
-  $attr{$name}{to} = $a[3];
-  $attr{$name}{smtphost} = $a[4];
-  $attr{$name}{authfile} = $a[5];
-  $attr{$name}{subject} = "FHEM ";
-  $attr{$name}{CR} = "1";
-
+##############################################
+# Define Function
+# set the counter to 0
+##############################################
+sub
+MSGMail_Define($$)
+{
+  my ($hash, $def) = @_;
+  my @a = split("[ \t][ \t]*", $def);
+  my $errmsg = "wrong syntax: define <name> MSGMail from to smtphost authfile";
+  my $name = $hash->{NAME};
 
-  $hash->{STATE} = "ready";
-  $hash->{TYPE}  = "MSGMail";
-  $hash->{READINGS}{msgcount}{TIME} = TimeNow();
-  $hash->{READINGS}{msgcount}{VAL}  = 0;
-  return undef;
-}
-##############################################
-# Undefine Function
-# flush all lines of data
-##############################################
-sub
-MSGMail_Undef($$)
-{
-	my ($hash, $name) = @_;
-	my $i;
-############  flush the data 
-	for($i=0;$i<ReadingsVal($name,"msgcount",0);$i++)
-	{
-		$data{$name}{$i} = "";
-	}
+  return $errmsg    if(@a != 6);
+##### set all  the Attributes
+  $attr{$name}{from} = $a[2];
+  $attr{$name}{to} = $a[3];
+  $attr{$name}{smtphost} = $a[4];
+  $attr{$name}{authfile} = $a[5];
+  $attr{$name}{subject} = "FHEM ";
+  $attr{$name}{CR} = "1";
 
-	delete($modules{MSGMail}{defptr}{$hash->{CODE}}) if($hash && $hash->{CODE});
-	return undef;
-}
 
-1;
+  $hash->{STATE} = "ready";
+  $hash->{TYPE}  = "MSGMail";
+  $hash->{READINGS}{msgcount}{TIME} = TimeNow();
+  $hash->{READINGS}{msgcount}{VAL}  = 0;
+  return undef;
+}
+##############################################
+# Undefine Function
+# flush all lines of data
+##############################################
+sub
+MSGMail_Undef($$)
+{
+	my ($hash, $name) = @_;
+	my $i;
+############  flush the data 
+	for($i=0;$i<ReadingsVal($name,"msgcount",0);$i++)
+	{
+		$data{$name}{$i} = "";
+	}
+
+	delete($modules{MSGMail}{defptr}{$hash->{CODE}}) if($hash && $hash->{CODE});
+	return undef;
+}
+
+1;
diff --git a/fhem/contrib/commandref_join.pl b/fhem/contrib/commandref_join.pl
new file mode 100644
index 000000000..952be6ee3
--- /dev/null
+++ b/fhem/contrib/commandref_join.pl
@@ -0,0 +1,74 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+my $docIn  = "docs/commandref_frame.html";
+my $docOut = "docs/commandref.html";
+my @modDir = ("FHEM");
+
+open(IN, "$docIn")    || die "Cant open $docIn: $!\n";
+open(OUT, ">$docOut") || die "Cant open $docOut: $!\n";
+
+my %mods;
+foreach my $modDir (@modDir) {
+  opendir(DH, $modDir) || die "Cant open $modDir: $!\n";
+  while(my $l = readdir DH) {
+    next if($l !~ m/^\d\d_.*\.pm$/);
+    my $of = $l;
+    $l =~ s/.pm$//;
+    $l =~ s/^[0-9][0-9]_//;
+    $mods{$l} = "$modDir/$of";
+  }
+}
+
+# First run: check what is a command and what is a helper module
+my $status;
+my %noindex;
+while(my $l = <IN>) {
+  last if($l =~ m/<h3>Introduction/);
+  $noindex{$1} = 1 if($l =~ m/href="#(.*)"/);
+}
+seek(IN,0,0);
+
+# Second run: create the file
+# Header
+while(my $l = <IN>) {
+  print OUT $l;
+  last if($l =~ m/#global/);
+}
+
+# index for devices.
+foreach my $mod (sort keys %mods) {
+  next if($noindex{$mod});
+  print OUT "      <a href='#$mod'>$mod</a> &nbsp;\n";
+}
+
+# Copy the middle part
+while(my $l = <IN>) {
+  last if($l =~ m/name="perl"/);
+  print OUT $l;
+}
+
+# Copy the doc part from the module
+foreach my $mod (sort keys %mods) {
+  open(MOD, $mods{$mod}) || die("Cant open $mods{$mod}:$!\n");
+  my $skip = 1;
+  while(my $l = <MOD>) {
+    if($l =~ m/^=begin html/) {
+      $skip = 0;
+    } elsif($l =~ m/^=end html/) {
+      $skip = 1;
+    } elsif(!$skip) {
+      print OUT $l;
+    }
+  }
+  close(MOD);
+}
+
+# Copy the tail
+print OUT '<a name="perl"></a>',"\n";
+while(my $l = <IN>) {
+  print OUT $l;
+}
+close(OUT);
diff --git a/fhem/contrib/commandref_split.pl b/fhem/contrib/commandref_split.pl
new file mode 100644
index 000000000..4cf3d0396
--- /dev/null
+++ b/fhem/contrib/commandref_split.pl
@@ -0,0 +1,63 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+my $docIn  = "docs/commandref.html";
+my $docOut = "docs/commandref_frame.html";
+my @modDir = ("FHEM", "contrib", "webfrontend/pgm5");
+
+open(IN, "$docIn")    || die "Cant open $docIn: $!\n";
+open(OUT, ">$docOut") || die "Cant open $docOut: $!\n";
+
+my %mods;
+foreach my $modDir (@modDir) {
+  opendir(DH, $modDir) || die "Cant open $modDir: $!\n";
+  while(my $l = readdir DH) {
+    next if($l !~ m/^\d\d_.*\.pm$/);
+    my $of = $l;
+    $l =~ s/.pm$//;
+    $l =~ s/^[0-9][0-9]_//;
+    $mods{lc($l)} = "$modDir/$of" if(!$mods{lc($l)});
+  }
+}
+
+my %fnd;
+my $modFileName;
+while(my $l = <IN>) {
+  $l =~ s/[\r\n]//g;
+  if($l =~ m,^<a name="(.*)"></a>$,) {
+    if($modFileName) {
+      print MODOUT "=end html\n=cut\n";
+      close(MODOUT);
+      rename "$modFileName.NEW", $modFileName;
+    }
+    my $mod = lc($1);
+    if($mods{$mod}) {
+      print "Double-Fnd: $mod\n" if($fnd{$mod});
+      $fnd{$mod} = 1;
+      $modFileName = $mods{$mod};
+      open(MODIN, "$modFileName") || die("Cant open $modFileName: $!\n");
+      open(MODOUT, ">$modFileName.NEW") || die("Cant open $modFileName.NEW: $!\n");
+      my $seen1;
+      while(my $l = <MODIN>) {
+        $seen1 = 1 if($l =~ m/^1;[\r\n]*/);
+        last if($l =~ m/=pod/ && $seen1);
+        print MODOUT $l;
+      }
+      print MODOUT "\n\=pod\n=begin html\n\n";
+    } else {
+      print "Not a module: $mod\n";
+      $modFileName = "";
+    }
+  }
+  if($modFileName){
+    print MODOUT "$l\n";
+  } else {
+    print OUT "$l\n";
+  }
+}
+
+foreach my $mod (sort {$mods{$a} cmp $mods{$b}} keys %mods) {
+  print "Missing doc for $mods{$mod}\n" if(!$fnd{$mod});
+}
diff --git a/fhem/docs/commandref.html b/fhem/docs/commandref.html
index d17984d04..253276f1b 100644
--- a/fhem/docs/commandref.html
+++ b/fhem/docs/commandref.html
@@ -56,7 +56,6 @@
       <a href="#sleep">sleep</a> &nbsp;
       <a href="#trigger">trigger</a> &nbsp;
       <a href="#update">update</a> &nbsp;
-      <a href="#updatefhem">updatefhem</a> &nbsp;
       <a href="#usb">usb</a> &nbsp;
       <a href="#xmllist">xmllist</a> &nbsp;
 
@@ -813,10 +812,6 @@ A line ending with \ will be concatenated with the next one, so long lines
     version after the update has finished.
     <br>
     <br>
-    Notice: The former used command "updatefhem" will be replaced by the new
-    command "update" in the 5.3 distribution.
-    <br>
-    <br>
     The new update function will process more advanced distribution information
     as well as control commands for updating, removing or renaming existing files.
     New file structures can also be set up by the new control command files.
@@ -844,77 +839,6 @@ A line ending with \ will be concatenated with the next one, so long lines
   </ul>
 </ul>
 
-<a name="updatefhem"></a>
-<h3>updatefhem</h3>
-<ul>
-  <code>updatefhem [&lt;changed&gt;|&lt;filename&gt;|&lt;housekeeping&gt; [&lt;clean&gt;] [&lt;yes&gt;]|&lt;preserve&gt; [&lt;filename&gt;]]</code> <br>
-  <br>
-    <b>This command is deprecated as of Fhem 5.3</b>
-  <br>
-  <br>
-    Update the fhem modules and documentation from a nightly SVN checkout. For
-    this purpose Fhem contacts http://fhem.de/fhemupdate, compares the stored
-    timestamps of the local files with the filelist on the server, and
-    downloads the files changed on the server. For all downloaded modules a
-    reload will be scheduled if the corresponding module is loaded.
-    <br>
-    <br>
-    Note: Since Version 5.3 a new directory structure is used by Fhem. The
-    WebInterface pgm2 is separated from <a href="#modpath">modpath</a>/FHEM
-    directory. The directory modpath/www/pgm2 is the new home of pgm2 and
-    of its files. It is recommended to update to the new structure via the
-    &lt;housekeeping&gt; arguments.
-    <br>
-    <br>
-    The complete installation of Fhem will be saved via the <a href="#backup">backup</a>
-    command on every update. You can skip this backups by setting
-    the global attribute <a href="#backup_before_update">backup_before_update</a> to 0.
-    <br>
-    <br>
-    Have you change or replace original files of the Fhem Distribution,
-    these files will normally be overwritten during an update. To protect
-    your locally modified or replaced files during an update, you can exclude
-    these files with the global attribute <a href="#exclude_from_update">exclude_from_update</a>.
-    <br>
-    <br>
-    If &lt;changed&gt; is specified, updatefhem returns a list of new or
-    modified files since the last update. Furthermore it returns the last
-    changes from the CHANGED file (if the file exists on the update server).
-    <br>
-    <br>
-    If an explicit &lt;filename&gt; is given, then only this file will be
-    downloaded.
-    <br>
-    <br>
-    If &lt;housekeeping&gt; is specified, then updatefhem switch your Fhem
-    installation to the new directory structure for the pgm2 WebInterface.
-    The old files are archived like the &lt;backup&gt; argument and the new
-    files are stored to modpath/www/pgm2. None of the existing files of pgm2
-    in modpath/FHEM will be deleted, but are no longer in use.<br>
-    If you like to delete the no more needed files for pgm2 in modpath/FHEM,
-    you should call &lt;housekeeping&gt; with the argument &lt;clean&gt; &lt;yes&gt;.
-    All files of pgm2 are removed from modpath/FHEM and files like
-    .*example.*, .gplot, .html .css, .js, and .(gif|jpg|png|svg) are moved
-    to modpath/www/pgm2.
-    <br>
-    <br>
-    If &lt;preserve&gt; is specified, you could preserve the old directory
-    structure. All files of pgm2 are updated and stored in modpath/FHEM like
-    the former (before Fhem 5.3) updatefhem funktion. To update an explicit
-    file to the old structure append the file as &lt;filename&gt;.<br>
-    Note: After running the housekeeping process, the argument &lt;preserve&gt;
-    is no longer necessary and no more supported.
-    <br>
-    <br>
-    Notes:
-    <ul>
-      <li>If the main program (fhem.pl) is changed, a manual restart of fhem
-      will be necessary to apply the changes.</li>
-      <li>After running &lt;housekeeping&gt; it is recommended to restart Fhem.</li>
-    </ul>
-    <br>
-</ul>
-
 <a name="CULflash"></a>
 <h3>CULflash</h3>
 <ul>
@@ -1230,8 +1154,6 @@ A line ending with \ will be concatenated with the next one, so long lines
   </pre>
 </ul>
 
-<h2>Devices</h2>
-
 <a name="global"></a>
 <h3>global</h3>
 <ul>
@@ -2517,7 +2439,7 @@ A line ending with \ will be concatenated with the next one, so long lines
   <br>
   <br>
 
-  <a name="FHT8Vdefine"></a>
+  <a name="PIDdefine"></a>
   <b>Define</b>
   <ul>
     <code>define &lt;name&gt; PID sensor[:reading:regexp] actor[:cmd:min:max] [p i d]</code>
@@ -2566,14 +2488,14 @@ A line ending with \ will be concatenated with the next one, so long lines
   </ul>
   <br>
 
-  <a name="FHT8Vget"></a>
+  <a name="PIDget"></a>
   <b>Get </b>
   <ul>
       N/A
   </ul>
   <br>
 
-  <a name="FHT8Vattr"></a>
+  <a name="PIDattr"></a>
   <b>Attributes</b>
   <ul>
     <li><a href="#disable">disable</a></li>
@@ -5118,7 +5040,6 @@ A line ending with \ will be concatenated with the next one, so long lines
   <br>
 
   <a name="KS300define"></a>
-  <a name="KS300"></a>
   <b>Define</b>
   <ul>
     <code>define &lt;name&gt; KS300 &lt;housecode&gt; [ml/raincounter [wind-factor]]</code>
@@ -5175,79 +5096,82 @@ A line ending with \ will be concatenated with the next one, so long lines
 <a name="MSG"></a>
 <h3>MSG</h3>
 <ul>
-The MSG device is the backend device for all the message handling (I/O-engine).
-Under normal conditions only one MSG device is needed to serve multiple frontend
-message devices like file or email.
-<br><br>
-<a name="MSGdefine"></a>
-<b>Define</b>
-<ul>
-<code>define &lt;name&gt; MSG </code><br><br>
-Specifies the MSG device. A single MSG device could serve multiple MSG frontends.
-But, for special conditions there could be defined more than one MSG device.
-</ul>
-<br>
-<a name="MSGset"></a>
-<b>Set</b>
-<ul>
-<code>set &lt;name&gt; send|write &lt;devicename&gt;</code><br><br>
-</ul>
-Notes:
-<ul>
-To send the data, both send or write could be used.<br>
-	The devicename is the name of a frontenddevice previously
-	defined. Based on the type of the frontend device, the MSG device
-	will send out the lines of data.
-	<br>
-	Frontend devices are available for:<br>
-		<ul><li><a href="#MSGFile">File</a></li>
-		<li><a href="#MSGMail">EMail with SSL Authentification</a></li></ul>
-	For details about this devices, please review the device-definitions.<br>
-	After sending/writing the data, the data stills exists with the
-	frontend device, MSG do not delete/purge any data, this must be done
-	by the frontend device.
-	<br><br>
-		Examples:
-		<ul>
-			<code>define myMsg MSG</code>
-		</ul>
-</ul>
-<a name="MSGVattr"></a>
-<b>Attributes</b>
-<ul>
-    <li><a href="#IODev">IODev</a></li>
-    <li><a href="#dummy">dummy</a></li>
-    <li><a href="#ignore">ignore</a></li>
-    <li><a href="#loglevel">loglevel</a></li>
-    <li><a href="#eventMap">eventMap</a></li><br>
+  The MSG device is the backend device for all the message handling (I/O-engine).
+  Under normal conditions only one MSG device is needed to serve multiple frontend
+  message devices like file or email.
+  <br><br>
+  <a name="MSGdefine"></a>
+  <b>Define</b>
+  <ul>
+  <code>define &lt;name&gt; MSG </code><br><br>
+  Specifies the MSG device. A single MSG device could serve multiple MSG frontends.
+  But, for special conditions there could be defined more than one MSG device.
+  </ul>
+  <br>
+  <a name="MSGset"></a>
+  <b>Set</b>
+  <ul>
+  <code>set &lt;name&gt; send|write &lt;devicename&gt;</code><br><br>
+  </ul>
+  Notes:
+  <ul>
+  To send the data, both send or write could be used.<br>
+  The devicename is the name of a frontenddevice previously
+  defined. Based on the type of the frontend device, the MSG device
+  will send out the lines of data.
+  <br>
+  Frontend devices are available for:<br>
+  	<ul><li><a href="#MSGFile">File</a></li>
+  	<li><a href="#MSGMail">EMail with SSL Authentification</a></li></ul>
+  For details about this devices, please review the device-definitions.<br>
+  After sending/writing the data, the data stills exists with the
+  frontend device, MSG do not delete/purge any data, this must be done
+  by the frontend device.
+  <br><br>
+  	Examples:
+  	<ul>
+  		<code>define myMsg MSG</code>
+  	</ul>
+  </ul>
+  <a name="MSGVattr"></a>
+  <b>Attributes</b>
+  <ul>
+      <li><a href="#IODev">IODev</a></li>
+      <li><a href="#dummy">dummy</a></li>
+      <li><a href="#ignore">ignore</a></li>
+      <li><a href="#loglevel">loglevel</a></li>
+      <li><a href="#eventMap">eventMap</a></li><br>
+    </ul>
   </ul>
-</ul>
 <br><br>
+
 <a name="MSGFile"></a>
 <h3>MSGFile</h3>
 <ul>
-		The MSGFile device is a frontend device for message handling.
-		With a MSGFile device data is written to disk (or other media).
-		Multiple MSGFile devices could be defined.
-		To write the data to disk, a MSG device is necessary.
-		A MSGFile device needs the operating systems rights to write to the filesystem.
-		To set the rights for a directory, please use OS related commands.
-<br><br>
-	<a name="#MSGFileDefine"></a>
-	<b>Define</b>
-	<ul><br>
-		<code>define &lt;name&gt; MSGFile &lt;filename&gt;</code><br><br>
-		Specifies the MSGFile device. At definition the message counter is set to 0.
-		A filename must be specified at definition.
-	</ul>
-			<br>
-		Examples:
-		<ul>
-			<code>define myFile MSGFile</code>
-		</ul><br>
-<a name="#MSGFileSet"></a>
-<b>Set</b><br>
-<ul><code>set &lt;name&gt; add|clear|list [text]</code><br>
+    The MSGFile device is a frontend device for message handling.
+    With a MSGFile device data is written to disk (or other media).
+    Multiple MSGFile devices could be defined.
+    To write the data to disk, a MSG device is necessary.
+    A MSGFile device needs the operating systems rights to write to the filesystem.
+    To set the rights for a directory, please use OS related commands.
+    <br><br>
+
+  <a name="MSGFileDefine"></a>
+    <b>Define</b>
+    <ul><br>
+            <code>define &lt;name&gt; MSGFile &lt;filename&gt;</code><br><br>
+            Specifies the MSGFile device. At definition the message counter is set to 0.
+            A filename must be specified at definition.
+    </ul>
+    <br>
+    Examples:
+    <ul>
+      <code>define myFile MSGFile</code>
+    </ul><br>
+  <a name="MSGFileSet"></a>
+
+  <b>Set</b><br>
+  <ul><code>set &lt;name&gt; add|clear|list [text]</code><br>
 	Set is used to manipulate the message buffer of the device. The message
 	buffer is an array of lines of data, stored serial based on the incoming
 	time into the buffer. Lines of data inside the buffer could not be deleted
@@ -5274,9 +5198,10 @@ To send the data, both send or write could be used.<br>
 			<code>set myMsg write myFile</code><br>
 			<code>set myFile clear</code><br>
 		</ul><br>
-		<a name="MSGFileVattr"></a>
-<b>Attributes</b>
-<ul>
+
+  <a name="MSGFileVattr"></a>
+  <b>Attributes</b>
+  <ul>
     <li><a href="MSGFilefilename">filename</a><br>
 		sets the filename, must be a fully qualified filename.
 		FHEM must have the rights to write this file to the directory</li>
@@ -5296,30 +5221,32 @@ To send the data, both send or write could be used.<br>
 <a name="MSGMail"></a>
 <h3>MSGMail</h3>
 <ul>
-		The MSGMail device is a frontend device for mail message handling.
-		With a MSGMaildevice data is fowarded to a mail provider and send to a recipent.
-		Multiple MSGMail devices could be defined.
-		MSGMail supports by the moment only mail provider, which uses SSL secured connection
-		like Googlemail, GMX, Yahoo or 1und1 for example.
-		To send an email, a MSG device is necessary.<br>
-		<b>MAIL::Lite</b> and <b>Net::SMTP::SSL</b> from CPAN is needed to use MSGMail!!
-<br><br>
-	<a name="#MSGMailDefine"></a>
-	<b>Define</b>
-	<ul><br>
-		<code>define &lt;name&gt; MSGMail &lt;from&gt; &lt;to&gt; &lt;smtphost&gt; &lt;authfile&gt;</code><br><br>
-		Specifies the MSGMail device. At definition the message counter is set to 0.
-		From, To, SMTPHost and the authfile (see attributes below) need to be defined
-		at definition time.
-	</ul>
-			<br>
-		Examples:
-		<ul>
-			<code>define myMail MSGMail from@address.com to@address.com smtp.provider.host /etc/msgauthfile</code>
-		</ul><br>
-<a name="#MSGMailSet"></a>
-<b>Set</b><br>
-<ul><code>set &lt;name&gt; add|clear|list [text]</code><br>
+  The MSGMail device is a frontend device for mail message handling.
+  With a MSGMaildevice data is fowarded to a mail provider and send to a recipent.
+  Multiple MSGMail devices could be defined.
+  MSGMail supports by the moment only mail provider, which uses SSL secured connection
+  like Googlemail, GMX, Yahoo or 1und1 for example.
+  To send an email, a MSG device is necessary.<br>
+  <b>MAIL::Lite</b> and <b>Net::SMTP::SSL</b> from CPAN is needed to use MSGMail!!
+  <br><br>
+
+  <a name="MSGMailDefine"></a>
+  <b>Define</b>
+  <ul><br>
+          <code>define &lt;name&gt; MSGMail &lt;from&gt; &lt;to&gt; &lt;smtphost&gt; &lt;authfile&gt;</code><br><br>
+          Specifies the MSGMail device. At definition the message counter is set to 0.
+          From, To, SMTPHost and the authfile (see attributes below) need to be defined
+          at definition time.
+  </ul>
+                  <br>
+          Examples:
+          <ul>
+                  <code>define myMail MSGMail from@address.com to@address.com smtp.provider.host /etc/msgauthfile</code>
+          </ul><br>
+
+  <a name="MSGMailSet"></a>
+  <b>Set</b><br>
+  <ul><code>set &lt;name&gt; add|clear|list [text]</code><br>
 	Set is used to manipulate the message buffer of the device. The message
 	buffer is an array of lines of data, stored serial based on the incoming
 	time into the buffer. Lines of data inside the buffer could not be deleted
@@ -5348,12 +5275,12 @@ To send the data, both send or write could be used.<br>
 			<code>set myMsg send myMail</code><br>
 			<code>set myMail clear</code><br>
 		</ul><br>
-</ul>
+  </ul>
 
-<a name="MSGMailattr"></a>
-<b>Attributes</b>
-<ul>
-	Almost all of these attributes are not optional, most of them could set at definition.<br>
+  <a name="MSGMailattr"></a>
+  <b>Attributes</b>
+  <ul>
+    Almost all of these attributes are not optional, most of them could set at definition.<br>
     <li><a href="MSGMailFrom">from</a><br>
 		sets the mail address of the sender</li>
     <li><a href="MSGMailTo">to</a><br>
@@ -6167,7 +6094,7 @@ To send the data, both send or write could be used.<br>
 
   <br>
   <br>
-  <a name="POKEYS_define"></a>
+  <a name="POKEYSdefine"></a>
   <b>Define</b>
   <ul>
     <code>define &lt;name&gt; POKEYS &lt;ip-address&gt; &lt;pin&gt; &lt;io-state&gt; [&lt;time in ms&gt;]</code> <br>
@@ -6189,7 +6116,7 @@ To send the data, both send or write could be used.<br>
     </ul>
     </ul> <br>
 
-  <a name="POKEYS_set"></a>
+  <a name="POKEYSset"></a>
   <b>Set</b>
   <ul>
 	<code>set &lt;name&gt; &lt;state&gt; [&lt;time in ms&gt;]</code> <br>
@@ -6204,7 +6131,7 @@ To send the data, both send or write could be used.<br>
     </ul>
   </ul><br>
 
-  <a name="POKEYS_get"></a>
+  <a name="POKEYSget"></a>
   <b>Get</b>
   <ul>
 	<code>get &lt;name&gt; &lt;type&gt; </code> <br>
@@ -6219,7 +6146,7 @@ To send the data, both send or write could be used.<br>
     </ul>
   </ul><br>
 
-  <a name="POKEYS_attr"></a>
+  <a name="POKEYSattr"></a>
   <b>Attributes</b>
   <ul>
     todo <br>
@@ -7834,782 +7761,782 @@ The one byte hex string is generated by the Oregon sensor when is it powered on.
 
 </ul>
   
-          <a name="OWX"></a>
-        <h3>OWX</h3>
-        <ul> FHEM module to commmunicate with 1-Wire bus devices <ul>
-                <li>via an active DS2480/DS2482/DS2490/DS9097U bus master interface attached to an
-                    USB port or </li>
-                <li>via a passive DS9097 interface attached to an USB port or</li>
-                <li>via a network-attached CUNO or through a COC on the RaspBerry Pi</li>
-            </ul> Internally these interfaces are vastly different, read the corresponding <a
-                href="http://fhemwiki.de/wiki/Interfaces_f%C3%BCr_1-Wire"> Wiki pages </a>
-            <br />
-            <br />
-            <b>Example</b><br />
-            <ul>
-                <code>define OWio1 OWX /dev/ttyUSB1</code>
-                <br />
-                <code>define OWio2 OWX COC</code>
-                <br />
-            </ul>
-            <br />
-            <a name="OWXdefine">
-                <b>Define</b></a>
-            <ul>
-                <code>define &lt;name&gt; OWX &lt;serial-device&gt;</code> or <br />
-                <code>define &lt;name&gt; OWX &lt;cuno/coc-device&gt;</code>
-                <br /><br /> Define a 1-Wire interface to communicate with a 1-Wire bus.<br />
-                <br />
-                <li>
-                    <code>&lt;serial-device&gt;</code> The serial device (e.g. USB port) to which
-                    the 1-Wire bus is attached.</li>
-                <li>
-                    <code>&lt;cuno-device&gt;</code> The previously defined CUNO to which the 1-Wire
-                    bus is attached. </li>
-            </ul>
-            <br />
-            <a name="OWXset">
-                <b>Set</b></a>
-            <ul>
-                <li><a name="owx_interval">
-                        <code>set &lt;name&gt; interval &lt;value&gt;</code>
-                    </a>
-                    <br /><br /> sets the time period in seconds for "kicking" the 1-Wire bus
-                    (default is 300 seconds). This means: <ul>
-                        <li>With 1-Wire bus interfaces that do not supply power to the 1-Wire bus
-                            (attr buspower parasitic), the 1-Wire bus is reset at these intervals. </li>
-                        <li>With 1-Wire bus interfaces that supply power to the 1-Wire bus (attr
-                            buspower = real), all temperature measurement devices on the bus receive
-                            the command to start a temperature conversion (saves a lot of time when
-                            reading) </li>
-                        <li>With 1-Wire bus interfaces that contain a busmaster chip, the response
-                            to a reset pulse contains information about alarms.</li>
-                    </ul><br />
-                </li>
-                <li><a name="owx_followAlarms">
-                        <code>set &lt;name&gt; followAlarms on|off</code>
-                    </a>
-                    <br /><br /> instructs the module to start an alarm search in case a reset pulse
-                    discovers any 1-Wire device which has the alarm flag set. </li>
-            </ul>
-            <br />
-            <a name="OWXget">
-                <b>Get</b></a>
-            <ul>
-                <li><a name="owx_alarms"></a>
-                    <code>get &lt;name&gt; alarms</code>
-                    <br /><br /> performs an "alarm search" for devices on the 1-Wire bus and, if
-                    found, generates an event in the log (not with CUNO). </li>
-                <br />
-                <li><a name="owx_devices"></a>
-                    <code>get &lt;name&gt; devices</code>
-                    <br /><br /> redicovers all devices on the 1-Wire bus. If a device found has a
-                    previous definition, this is automatically used. If a device is found but has no
-                    definition, it is autocreated. If a defined device is not on the 1-Wire bus, it
-                    is autodeleted. </li>
-                <br />
-                <br />
-            </ul>
-            <a name="OWXattr">
-                <b>Attributes</b></a>
-            <ul>
-                <li><a name="OWXbuspower"><code>attr &lt;name&gt; buspower real|parasitic</code></a>
-                    <br />tells FHEM whether power is supplied to the 1-Wire bus or not.</li>
-                <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
-            </ul>
-        </ul>
-        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
-        <a name="OWAD"></a>
-        <h3>OWAD</h3>
-        <ul>FHEM module to commmunicate with 1-Wire A/D converters<br /><br /> Note:<br /> This
-            1-Wire module so far works only with the OWX interface module. Please define an <a
-                href="#OWX">OWX</a> device first. <br />
-            <br /><b>Example</b><br />
-            <ul>
-                <code>define OWX_AD OWAD 724610000000 45</code>
-                <br />
-                <code>attr OWX_AD DAlarm high</code>
-                <br />
-                <code>attr OWX_AD DFactor 31.907097</code>
-                <br />
-                <code>attr OWX_AD DHigh 50.0</code>
-                <br />
-                <code>attr OWX_AD DName relHumidity|humidity</code>
-                <br />
-                <code>attr OWX_AD DOffset -0.8088</code>
-                <br />
-                <code>attr OWX_AD DUnit percent|%</code>
-                <br />
+<a name="OWX"></a>
+<h3>OWX</h3>
+<ul> FHEM module to commmunicate with 1-Wire bus devices <ul>
+        <li>via an active DS2480/DS2482/DS2490/DS9097U bus master interface attached to an
+            USB port or </li>
+        <li>via a passive DS9097 interface attached to an USB port or</li>
+        <li>via a network-attached CUNO or through a COC on the RaspBerry Pi</li>
+    </ul> Internally these interfaces are vastly different, read the corresponding <a
+        href="http://fhemwiki.de/wiki/Interfaces_f%C3%BCr_1-Wire"> Wiki pages </a>
+    <br />
+    <br />
+    <b>Example</b><br />
+    <ul>
+        <code>define OWio1 OWX /dev/ttyUSB1</code>
+        <br />
+        <code>define OWio2 OWX COC</code>
+        <br />
+    </ul>
+    <br />
+    <a name="OWXdefine">
+        <b>Define</b></a>
+    <ul>
+        <code>define &lt;name&gt; OWX &lt;serial-device&gt;</code> or <br />
+        <code>define &lt;name&gt; OWX &lt;cuno/coc-device&gt;</code>
+        <br /><br /> Define a 1-Wire interface to communicate with a 1-Wire bus.<br />
+        <br />
+        <li>
+            <code>&lt;serial-device&gt;</code> The serial device (e.g. USB port) to which
+            the 1-Wire bus is attached.</li>
+        <li>
+            <code>&lt;cuno-device&gt;</code> The previously defined CUNO to which the 1-Wire
+            bus is attached. </li>
+    </ul>
+    <br />
+    <a name="OWXset">
+        <b>Set</b></a>
+    <ul>
+        <li><a name="owx_interval">
+                <code>set &lt;name&gt; interval &lt;value&gt;</code>
+            </a>
+            <br /><br /> sets the time period in seconds for "kicking" the 1-Wire bus
+            (default is 300 seconds). This means: <ul>
+                <li>With 1-Wire bus interfaces that do not supply power to the 1-Wire bus
+                    (attr buspower parasitic), the 1-Wire bus is reset at these intervals. </li>
+                <li>With 1-Wire bus interfaces that supply power to the 1-Wire bus (attr
+                    buspower = real), all temperature measurement devices on the bus receive
+                    the command to start a temperature conversion (saves a lot of time when
+                    reading) </li>
+                <li>With 1-Wire bus interfaces that contain a busmaster chip, the response
+                    to a reset pulse contains information about alarms.</li>
             </ul><br />
-            <a name="OWADdefine"></a>
-            <b>Define</b>
-            <ul>
-                <code>define &lt;name&gt; OWAD [&lt;model&gt;] &lt;id&gt; [&lt;interval&gt;]</code>
-                <br /><br /> Define a 1-Wire A/D converter.<br /><br />
-                <li>
-                    <code>[&lt;model&gt;]</code><br /> Defines the A/D converter model (and thus
-                    1-Wire family id), currently the following values are permitted: <ul>
-                        <li>model DS2450 with family id 20 (default if the model parameter is
-                            omitted)</li>
-                    </ul>
-                </li>
-                <li>
-                    <code>&lt;id&gt;</code>
-                    <br />12-character unique ROM id of the converter device without family id and
-                    CRC code </li>
-                <li>
-                    <code>&lt;interval&gt;</code>
-                    <br />Measurement interval in seconds. The default is 300 seconds. </li>
-                <br />
+        </li>
+        <li><a name="owx_followAlarms">
+                <code>set &lt;name&gt; followAlarms on|off</code>
+            </a>
+            <br /><br /> instructs the module to start an alarm search in case a reset pulse
+            discovers any 1-Wire device which has the alarm flag set. </li>
+    </ul>
+    <br />
+    <a name="OWXget">
+        <b>Get</b></a>
+    <ul>
+        <li><a name="owx_alarms"></a>
+            <code>get &lt;name&gt; alarms</code>
+            <br /><br /> performs an "alarm search" for devices on the 1-Wire bus and, if
+            found, generates an event in the log (not with CUNO). </li>
+        <br />
+        <li><a name="owx_devices"></a>
+            <code>get &lt;name&gt; devices</code>
+            <br /><br /> redicovers all devices on the 1-Wire bus. If a device found has a
+            previous definition, this is automatically used. If a device is found but has no
+            definition, it is autocreated. If a defined device is not on the 1-Wire bus, it
+            is autodeleted. </li>
+        <br />
+        <br />
+    </ul>
+    <a name="OWXattr">
+        <b>Attributes</b></a>
+    <ul>
+        <li><a name="OWXbuspower"><code>attr &lt;name&gt; buspower real|parasitic</code></a>
+            <br />tells FHEM whether power is supplied to the 1-Wire bus or not.</li>
+        <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
+    </ul>
+</ul>
+
+<a name="OWAD"></a>
+<h3>OWAD</h3>
+<ul>FHEM module to commmunicate with 1-Wire A/D converters<br /><br /> Note:<br /> This
+    1-Wire module so far works only with the OWX interface module. Please define an <a
+        href="#OWX">OWX</a> device first. <br />
+    <br /><b>Example</b><br />
+    <ul>
+        <code>define OWX_AD OWAD 724610000000 45</code>
+        <br />
+        <code>attr OWX_AD DAlarm high</code>
+        <br />
+        <code>attr OWX_AD DFactor 31.907097</code>
+        <br />
+        <code>attr OWX_AD DHigh 50.0</code>
+        <br />
+        <code>attr OWX_AD DName relHumidity|humidity</code>
+        <br />
+        <code>attr OWX_AD DOffset -0.8088</code>
+        <br />
+        <code>attr OWX_AD DUnit percent|%</code>
+        <br />
+    </ul><br />
+    <a name="OWADdefine"></a>
+    <b>Define</b>
+    <ul>
+        <code>define &lt;name&gt; OWAD [&lt;model&gt;] &lt;id&gt; [&lt;interval&gt;]</code>
+        <br /><br /> Define a 1-Wire A/D converter.<br /><br />
+        <li>
+            <code>[&lt;model&gt;]</code><br /> Defines the A/D converter model (and thus
+            1-Wire family id), currently the following values are permitted: <ul>
+                <li>model DS2450 with family id 20 (default if the model parameter is
+                    omitted)</li>
             </ul>
-            <br />
-            <a name="OWADset">
-                <b>Set</b></a>
-            <ul>
-                <li><a name="owad_interval">
-                        <code>set &lt;name&gt; interval &lt;int&gt;</code></a><br /> Measurement
-                    interval in seconds. The default is 300 seconds. </li>
-            </ul>
-            <br />
-            <a name="OWADget">
-                <b>Get</b></a>
-            <ul>
-                <li><a name="owad_id">
-                        <code>get &lt;name&gt; id</code></a>
-                    <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
-                <li><a name="owad_present">
-                        <code>get &lt;name&gt; present</code>
-                    </a>
-                    <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
-                <li><a name="owad_interval2">
-                        <code>get &lt;name&gt; interval</code></a><br />Returns measurement interval
-                    in seconds. </li>
-                <li><a name="owad_reading">
-                        <code>get &lt;name&gt; reading</code></a><br />Obtain the measuement values. </li>
-                <li><a name="owad_alarm">
-                        <code>get &lt;name&gt; alarm</code></a><br />Obtain the alarm values. </li>
-                <li><a name="owad_status">
-                        <code>get &lt;name&gt; status</code></a><br />Obtain the i/o status values.
-                </li>
-            </ul>
-            <br />
-            <a name="OWADattr">
-                <b>Attributes</b></a>
-            <ul>
-                <li><a name="owad_stateAL0"><code>attr &lt;name&gt; stateAL0
-                        &lt;string&gt;</code></a>
-                    <br />character string for denoting low normal condition, default is green down
-                    triangle, e.g. the code &lt;span
-                    style="color:green"&gt;&amp;#x25BE;&lt;/span&gt; leading to the sign <span
-                        style="color:green">&#x25BE;</span>
-                </li>
-                <li><a name="owad_stateAH0"><code>attr &lt;name&gt; stateAH0
-                        &lt;string&gt;</code></a>
-                    <br />character string for denoting high alarm condition, default is green
-                    upward triangle, e.g. the code &lt;span
-                    style="color:green"&gt;&amp;#x25B4;&lt;/span&gt; leading to the sign <span
-                        style="color:green">&#x25B4;</span>
-                </li>
-                <li><a name="owad_stateAL1"><code>attr &lt;name&gt; stateAL1
-                        &lt;string&gt;</code></a>
-                    <br />character string for denoting low alarm condition, default is red down
-                    triangle, e.g. the code &lt;span style="color:red"&gt;&amp;#x25BE;&lt;/span&gt;
-                    leading to the sign <span style="color:red">&#x25BE;</span></li>
-                <li><a name="owad_stateAH1"><code>attr &lt;name&gt; stateAH1
-                        &lt;string&gt;</code></a>
-                    <br />character string for denoting high alarm condition, default is red upward
-                    triangle, e.g. the code &lt;span style="color:red"&gt;&amp;#x25B4;&lt;/span&gt;
-                    leading to the sign <span style="color:red">&#x25B4;</span>
-                </li>
-            </ul> For each of the following attributes, the channel identification A,B,C,D may be
-            used. <ul>
-                <li><a name="owad_cname"><code>attr &lt;name&gt; &lt;channel&gt;Name
-                            &lt;string&gt;|&lt;string&gt;</code></a>
-                    <br />name for the channel | a type description for the measured value. </li>
-                <li><a name="owad_cunit"><code>attr &lt;name&gt; &lt;channel&gt;Unit
-                            &lt;string&gt;|&lt;string&gt;</code></a>
-                    <br />unit of measurement for this channel | its abbreviation. </li>
-                <li><a name="owad_coffset"><code>attr &lt;name&gt; &lt;channel&gt;Offset
-                            &lt;float&gt;</code></a>
-                    <br />offset added to the reading in this channel. </li>
-                <li><a name="owad_cfactor"><code>attr &lt;name&gt; &lt;channel&gt;Factor
-                            &lt;float&gt;</code></a>
-                    <br />factor multiplied to (reading+offset) in this channel. </li>
-                <li><a name="owad_calarm"><code>attr &lt;name&gt; &lt;channel&gt;Alarm
-                            &lt;string&gt;</code></a>
-                    <br />alarm setting in this channel, either both, low, high or none (default). </li>
-                <li><a name="owad_clow"><code>attr &lt;name&gt; &lt;channel&gt;Low
-                            &lt;float&gt;</code></a>
-                    <br />measurement value (on the scale determined by offset and factor) for low
-                    alarm. </li>
-                <li><a name="owad_chigh"><code>attr &lt;name&gt; &lt;channel&gt;High
-                            &lt;float&gt;</code></a>
-                    <br />measurement value (on the scale determined by offset and factor) for high
-                    alarm. </li>
-                <li><a name="owad_event"><code>attr &lt;name&gt; event on-change|on-update
-                    </code></a>This attribte work similarly, but not identically to the standard event-on-update-change/event-on-update-reading attribute.
-                    <ul><li><code>event on-update</code> (default) will write a notify/FileLog event any time a measurement is received.</li>
-                        <li><code>event on-change</code> will write a notify/FileLog event only when a measurement is different from the previous one.</li>
-                        </ul>
-                </li>
-                <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
-            </ul>
-        </ul>
-        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
-        <a name="OWCOUNT"></a>
-        <h3>OWCOUNT</h3>
-        <ul>FHEM module to commmunicate with 1-Wire Counter/RAM DS2423 #<br /><br /> Note:<br />
-            This 1-Wire module so far works only with the OWX interface module. Please define an <a
-                href="#OWX">OWX</a> device first. <br />
-            <br /><b>Example</b><br />
-            <ul>
-                <code>define OWX_C OWCOUNT DS2423 CE780F000000 300</code>
-                <br />
-                <code>attr OWX_C AName Water|volume</code>
-                <br />
-                <code>attr OWX_C AUnit liters|l</code>
-                <br />
-                <code>attr OWX_CAMode daily</code>
-                <br />
-            </ul><br />
-            <a name="OWCOUNTdefine"></a>
-            <b>Define</b>
-            <ul>
-                <code>define &lt;name&gt; OWCOUNT [&lt;model&gt;] &lt;id&gt;
-                    [&lt;interval&gt;]</code>
-                <br /><br /> Define a 1-Wire counter.<br /><br />
-                <li>
-                    <code>[&lt;model&gt;]</code><br /> Defines the counter model (and thus 1-Wire
-                    family id), currently the following values are permitted: <ul>
-                        <li>model DS2423 with family id 1D (default if the model parameter is
-                            omitted)</li>
-                    </ul>
-                </li>
-                <li>
-                    <code>&lt;id&gt;</code>
-                    <br />12-character unique ROM id of the converter device without family id and
-                    CRC code </li>
-                <li>
-                    <code>&lt;interval&gt;</code>
-                    <br />Measurement interval in seconds. The default is 300 seconds. </li>
-            </ul>
-            <br />
-            <a name="OWCOUNTset">
-                <b>Set</b></a>
-            <ul>
-                <li><a name="owcount_interval">
-                        <code>set &lt;name&gt; interval &lt;int&gt;</code></a><br /> Measurement
-                    interval in seconds. The default is 300 seconds. </li>
-                <li><a name="owcount_memory">
-                        <code>set &lt;name&gt; memory &lt;page&gt;</code></a><br />Write 32 bytes to
-                    memory page 0..13 </li>
-                <li><a name="owcount_midnight">
-                        <code>set &lt;name&gt; midnight &lt;channel-name&gt;</code></a><br />Write
-                    the day's starting value for counter &lt;channel&gt; (A, B or named channel, see
-                    below)</li>
-            </ul>
-            <br />
-            <a name="OWCOUNTget">
-                <b>Get</b></a>
-            <ul>
-                <li><a name="owcount_id">
-                        <code>get &lt;name&gt; id</code></a>
-                    <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
-                <li><a name="owcount_present">
-                        <code>get &lt;name&gt; present</code>
-                    </a>
-                    <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
-                <li><a name="owcount_interval2">
-                        <code>get &lt;name&gt; interval</code></a><br />Returns measurement interval
-                    in seconds. </li>
-                <li><a name="owcount_memory2">
-                        <code>get &lt;name&gt; memory &lt;page&gt;</code></a><br />Obtain 32 bytes
-                    from memory page 0..13 </li>
-                <li><a name="owcount_midnight2">
-                        <code>get &lt;name&gt; midnight &lt;channel-name&gt;</code></a><br />Obtain
-                    the day's starting value for counter &lt;channel&gt; (A, B or named channel, see
-                    below)</li>
-                <li><a name="owcount_counter">
-                        <code>get &lt;name&gt; counter &lt;channel-name&gt;</code></a><br />Obtain
-                    the current value for counter &lt;channel&gt; (A, B or named channel, see
-                    below)</li>
-                <li><a name="owcount_counters">
-                        <code>get &lt;name&gt; counters</code></a><br />Obtain the current value
-                    both counters</li>
-            </ul>
-            <br />
-            <a name="OWCOUNTattr">
-                <b>Attributes</b></a>
-            <ul>For each of the following attributes, the channel identification A,B may be used.
-                        <li><a name="owcount_cname"><code>attr &lt;name&gt; &lt;channel&gt;Name
-                            &lt;string&gt;|&lt;string&gt;</code></a>
-                    <br />name for the channel | a type description for the measured value. </li>
-                <li><a name="owcount_cunit"><code>attr &lt;name&gt; &lt;channel&gt;Unit
-                            &lt;string&gt;|&lt;string&gt;</code></a>
-                    <br />unit of measurement for this channel | its abbreviation. </li>
-                <li><a name="owcount_coffset"><code>attr &lt;name&gt; &lt;channel&gt;Offset
-                            &lt;float&gt;</code></a>
-                    <br />offset added to the reading in this channel. </li>
-                <li><a name="owcount_cfactor"><code>attr &lt;name&gt; &lt;channel&gt;Factor
-                            &lt;float&gt;</code></a>
-                    <br />factor multiplied to (reading+offset) in this channel. </li>
-                <li><a name="owcount_cmode"><code>attr &lt;name&gt; &lt;channel&gt;Mode daily |
-                            normal</code></a>
-                    <br />factor multiplied to (reading+offset) in this channel. </li>
-                <li><a name="owcount_event"><code>attr &lt;name&gt; event on-change|on-update
-                </code></a>This attribte work similarly, but not identically to the standard event-on-update-change/event-on-update-reading attribute.
-                    <ul><li><code>event on-update</code> (default) will write a notify/FileLog event any time a measurement is received.</li>
-                        <li><code>event on-change</code> will write a notify/FileLog event only when a measurement is different from the previous one.</li>
-                    </ul>
-                </li>
-                <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
-            </ul>
-        </ul>
-        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
-        <a name="OWID"></a>
-        <h3>OWID</h3>
-        <ul>FHEM module for 1-Wire devices that know only their unique ROM ID<br />
-            <br />Note:<br /> This 1-Wire module so far works only with the OWX interface module.
-            Please define an <a href="#OWX">OWX</a> device first. <br />
-            <br /><b>Example</b><br />
-            <ul>
-                <code>define ROM1 OWX_ID OWCOUNT CE780F000000</code>
-                <br />
-            </ul><br />
-            <a name="OWIDdefine"></a>
-            <b>Define</b>
-            <ul>
-                <code>define &lt;name&gt; OWID &lt;id&gt; </code>
-                <br /><br /> Define a 1-Wire device.<br /><br />
-                <li>
-                    <code>&lt;id&gt;</code>
-                    <br />12-character unique ROM id of the converter device without family id and
-                    CRC code </li>
-            </ul>
-            <br />
-            <a name="OWIDget">
-                <b>Get</b></a>
-            <ul>
-                <li><a name="owid_id">
-                        <code>get &lt;name&gt; id</code></a>
-                    <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
-                <li><a name="owid_present">
-                        <code>get &lt;name&gt; present</code>
-                    </a>
-                    <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
-            </ul>
-            <br />
-        </ul>
-        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
-        <a name="OWLCD"></a>
-        <h3>OWLCD</h3>
-        <ul>FHEM module to commmunicate with the <a
-                href="http://www.louisswart.co.za/1-Wire_Overview.html">1-Wire LCD controller</a>
-            from Louis Swart (1-Wire family id FF). See also the corresponding <a
-                href="http://fhemwiki.de/wiki/1-Wire_Textdisplay">Wiki page.</a><br /><br />
-            Note:<br /> This 1-Wire module so far works only with the OWX interface module. Please
-            define an <a href="#OWX">OWX</a> device first. <br />
-            <br /><b>Example</b><br />
-            <ul>
-                <code>define OWX_LCD OWLCD 9F0700000100</code>
-                <br />
-            </ul>
-            <br />
-            <a name="OWLCDdefine"></a>
-            <b>Define</b>
-            <ul>
-                <code>define &lt;name&gt; OWLCD &lt;id&gt;</code>
-                <br /><br /> Define a 1-Wire LCD device.<br /><br />
-                <li>
-                    <code>&lt;id&gt;</code>
-                    <br />12-character unique ROM id of the converter device without family id and
-                    CRC code </li>
-            </ul>
-            <br />
-            <a name="OWLCDset">
-                <b>Set</b></a>
-            <ul>
-                <li><a name="owlcd_icon">
-                        <code>set &lt;name&gt; icon &lt;int&gt; on|off|blink</code></a><br /> Set
-                    one of the icons 0..14 on, off or blinking</li>
-                <li><a name="owlcd_icon2">
-                        <code>set &lt;name&gt; icon 15 0..6</code></a><br /> Set icon 15 to one of
-                    its values</li>
-                <li><a name="owlcd_icon3">
-                        <code>set &lt;name&gt; icon none</code></a><br /> Set all icons off</li>
-                <li><a name="owlcd_line">
-                        <code>set &lt;name&gt; line &lt;int&gt; &lt;string&gt;</code></a><br />
-                    Write LCD line 0..3 with some content </li>
-                <li><a name="owlcd_memory">
-                        <code>set &lt;name&gt; memory &lt;page&gt;
-                    &lt;string&gt;</code></a><br />Write memory page 0..6</li>
-                <li><a name="owlcd_gpio">
-                        <code>set &lt;name&gt; gpio &lt;value&gt;</code></a><br />Write state for
-                    all three gpio pins (value = 0..7, for each bit 0=ON, 1=OFF)</li>
-                <li><a name="owlcd_bl">
-                        <code>set &lt;name&gt; backlight ON|OFF</code></a><br />Switch backlight on
-                    or off</li>
-                <li><a name="owlcd_lcd">
-                        <code>set &lt;name&gt; lcd ON|OFF</code></a><br />Switch LCD power on or
-                    off</li>
-                <li><a name="owlcd_gpio">
-                        <code>set &lt;name&gt; reset</code></a><br />Reset the display</li>
-                <li><a name="owlcd_gpio">
-                        <code>set &lt;name&gt; test</code></a><br />Test the display</li>
-            </ul>
-            <br />
-            <a name="owlcdget">
-                <b>Get</b></a>
-            <ul>
-                <li><a name="owlcd_id">
-                        <code>get &lt;name&gt; id</code></a>
-                    <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
-                <li><a name="owlcd_present">
-                        <code>get &lt;name&gt; present</code>
-                    </a>
-                    <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
-                <li><a name="owlcd_memory2">
-                        <code>get &lt;name&gt; memory &lt;page&gt;</code></a><br />Read memory page
-                    0..6 </li>
-                <li><a name="owlcd_gpio">
-                        <code>get &lt;name&gt; gpio</code></a><br />Obtain state of all four input
-                    channels (15 = all off, 0 = all on)</li>
-                <li><a name="owlcd_counter">
-                        <code>get &lt;name&gt; gpio</code></a><br />Obtain state of all four input
-                    counters (4 x 16 Bit)</li>
-                <li><a name="owlcd_version">
-                        <code>get &lt;name&gt; version</code></a><br />Obtain firmware version of
-                    the controller</li>
-            </ul>
-            <br />
-            <a name="owlcdattr">
-                <b>Attributes</b></a>
-            <ul>
-                <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
-            </ul>
-        </ul>
-        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
-        <a name="OWMULTI"></a>
-        <h3>OWMULTI</h3>
-        <ul>FHEM module to commmunicate with 1-Wire multi-sensors, currently the DS2438 smart battery monitor<br /><br /> Note:<br /> This
-            1-Wire module so far works only with the OWX interface module. Please define an <a
-                href="#OWX">OWX</a> device first. <br />
-            <br /><b>Example</b><br />
-            <ul>
-                <code>define OWX_M OWMULTI 7C5034010000 45</code>
-                <br />
-                <code>attr OWX_M VName relHumidity|humidity</code>
-                <br />
-                <code>attr OWX_M VUnit percent|%</code>
-                <br />
-                <code>attr OWX_M VFunction (161.29 * V / VDD - 25.8065)/(1.0546 - 0.00216 * T)</code>
-                <br />
-            </ul><br />
-            <a name="OWMULTIdefine"></a>
-            <b>Define</b>
-            <ul>
-                <code>define &lt;name&gt; OWMULTI [&lt;model&gt;] &lt;id&gt; [&lt;interval&gt;]</code>
-                <br /><br /> Define a 1-Wire multi-sensor<br /><br />
-                <li>
-                    <code>[&lt;model&gt;]</code><br /> Defines the sensor model (and thus
-                    1-Wire family id), currently the following values are permitted: <ul>
-                        <li>model DS2438 with family id 26 (default if the model parameter is
-                            omitted). Measured is a temperature value, an external voltage and the current supply voltage</li>
-                    </ul>
-                </li>
-                <li>
-                    <code>&lt;id&gt;</code>
-                    <br />12-character unique ROM id of the converter device without family id and
-                    CRC code </li>
-                <li>
-                    <code>&lt;interval&gt;</code>
-                    <br />Measurement interval in seconds. The default is 300 seconds. </li>
-                <br />
-            </ul>
-            <br />
-            <a name="OWMULTIset">
-                <b>Set</b></a>
-            <ul>
-                <li><a name="owmulti_interval">
-                    <code>set &lt;name&gt; interval &lt;int&gt;</code></a><br /> Measurement
-                    interval in seconds. The default is 300 seconds. </li>
-            </ul>
-            <br />
-            <a name="OWMULTIget">
-                <b>Get</b></a>
-            <ul>
-                <li><a name="owmulti_id">
-                    <code>get &lt;name&gt; id</code></a>
-                    <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
-                <li><a name="owmulti_present">
-                    <code>get &lt;name&gt; present</code>
-                </a>
-                    <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
-                <li><a name="owmulti_interval2">
-                    <code>get &lt;name&gt; interval</code></a><br />Returns measurement interval
-                    in seconds. </li>
-                <li><a name="owmulti_reading">
-                    <code>get &lt;name&gt; reading</code></a><br />Obtain the measurement value from VFunction. </li>
-                <li><a name="owmulti_temperature">
-                    <code>get &lt;name&gt; temperature</code></a><br />Obtain the temperature value. </li>
-                <li><a name="owmulti_vdd">
-                    <code>get &lt;name&gt; VDD</code></a><br />Obtain the current supply voltage.
-                </li>
-                <li><a name="owmulti_raw">
-                    <code>get &lt;name&gt; V</code> or <code>get &lt;name&gt; raw</code></a><br />Obtain the raw external voltage measurement.
-                </li>
-            </ul>
-            <br />
-            <a name="OWMULTIattr">
-                <b>Attributes</b></a>
-            <ul>
-                <li><a name="owmulti_vname"><code>attr &lt;name&gt; VName
+        </li>
+        <li>
+            <code>&lt;id&gt;</code>
+            <br />12-character unique ROM id of the converter device without family id and
+            CRC code </li>
+        <li>
+            <code>&lt;interval&gt;</code>
+            <br />Measurement interval in seconds. The default is 300 seconds. </li>
+        <br />
+    </ul>
+    <br />
+    <a name="OWADset">
+        <b>Set</b></a>
+    <ul>
+        <li><a name="owad_interval">
+                <code>set &lt;name&gt; interval &lt;int&gt;</code></a><br /> Measurement
+            interval in seconds. The default is 300 seconds. </li>
+    </ul>
+    <br />
+    <a name="OWADget">
+        <b>Get</b></a>
+    <ul>
+        <li><a name="owad_id">
+                <code>get &lt;name&gt; id</code></a>
+            <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
+        <li><a name="owad_present">
+                <code>get &lt;name&gt; present</code>
+            </a>
+            <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
+        <li><a name="owad_interval2">
+                <code>get &lt;name&gt; interval</code></a><br />Returns measurement interval
+            in seconds. </li>
+        <li><a name="owad_reading">
+                <code>get &lt;name&gt; reading</code></a><br />Obtain the measuement values. </li>
+        <li><a name="owad_alarm">
+                <code>get &lt;name&gt; alarm</code></a><br />Obtain the alarm values. </li>
+        <li><a name="owad_status">
+                <code>get &lt;name&gt; status</code></a><br />Obtain the i/o status values.
+        </li>
+    </ul>
+    <br />
+    <a name="OWADattr">
+        <b>Attributes</b></a>
+    <ul>
+        <li><a name="owad_stateAL0"><code>attr &lt;name&gt; stateAL0
+                &lt;string&gt;</code></a>
+            <br />character string for denoting low normal condition, default is green down
+            triangle, e.g. the code &lt;span
+            style="color:green"&gt;&amp;#x25BE;&lt;/span&gt; leading to the sign <span
+                style="color:green">&#x25BE;</span>
+        </li>
+        <li><a name="owad_stateAH0"><code>attr &lt;name&gt; stateAH0
+                &lt;string&gt;</code></a>
+            <br />character string for denoting high alarm condition, default is green
+            upward triangle, e.g. the code &lt;span
+            style="color:green"&gt;&amp;#x25B4;&lt;/span&gt; leading to the sign <span
+                style="color:green">&#x25B4;</span>
+        </li>
+        <li><a name="owad_stateAL1"><code>attr &lt;name&gt; stateAL1
+                &lt;string&gt;</code></a>
+            <br />character string for denoting low alarm condition, default is red down
+            triangle, e.g. the code &lt;span style="color:red"&gt;&amp;#x25BE;&lt;/span&gt;
+            leading to the sign <span style="color:red">&#x25BE;</span></li>
+        <li><a name="owad_stateAH1"><code>attr &lt;name&gt; stateAH1
+                &lt;string&gt;</code></a>
+            <br />character string for denoting high alarm condition, default is red upward
+            triangle, e.g. the code &lt;span style="color:red"&gt;&amp;#x25B4;&lt;/span&gt;
+            leading to the sign <span style="color:red">&#x25B4;</span>
+        </li>
+    </ul> For each of the following attributes, the channel identification A,B,C,D may be
+    used. <ul>
+        <li><a name="owad_cname"><code>attr &lt;name&gt; &lt;channel&gt;Name
                     &lt;string&gt;|&lt;string&gt;</code></a>
-                    <br />name for the channel | a type description for the measured value. </li>
-                <li><a name="owmulti_vunit"><code>attr &lt;name&gt; VUnit
+            <br />name for the channel | a type description for the measured value. </li>
+        <li><a name="owad_cunit"><code>attr &lt;name&gt; &lt;channel&gt;Unit
                     &lt;string&gt;|&lt;string&gt;</code></a>
-                    <br />unit of measurement for this channel | its abbreviation. </li>
-                <li><a name="owmulti_vfunction"><code>attr &lt;name&gt; VFunction
+            <br />unit of measurement for this channel | its abbreviation. </li>
+        <li><a name="owad_coffset"><code>attr &lt;name&gt; &lt;channel&gt;Offset
+                    &lt;float&gt;</code></a>
+            <br />offset added to the reading in this channel. </li>
+        <li><a name="owad_cfactor"><code>attr &lt;name&gt; &lt;channel&gt;Factor
+                    &lt;float&gt;</code></a>
+            <br />factor multiplied to (reading+offset) in this channel. </li>
+        <li><a name="owad_calarm"><code>attr &lt;name&gt; &lt;channel&gt;Alarm
                     &lt;string&gt;</code></a>
-                    <br />arbitrary functional expression involving the values VDD, V, T. Example see above.
-                    <ul>
-                    <li>VDD is replaced by the measured supply voltage in Volt,</li>
-                    <li> V by the measured external voltage,</li>
-                    <li>T by the measured and corrected temperature in its unit</li>
-                </ul></li>
-                <li><a name="owmulti_tempOffset"><code>attr &lt;name&gt; tempOffset
+            <br />alarm setting in this channel, either both, low, high or none (default). </li>
+        <li><a name="owad_clow"><code>attr &lt;name&gt; &lt;channel&gt;Low
+                    &lt;float&gt;</code></a>
+            <br />measurement value (on the scale determined by offset and factor) for low
+            alarm. </li>
+        <li><a name="owad_chigh"><code>attr &lt;name&gt; &lt;channel&gt;High
+                    &lt;float&gt;</code></a>
+            <br />measurement value (on the scale determined by offset and factor) for high
+            alarm. </li>
+        <li><a name="owad_event"><code>attr &lt;name&gt; event on-change|on-update
+            </code></a>This attribte work similarly, but not identically to the standard event-on-update-change/event-on-update-reading attribute.
+            <ul><li><code>event on-update</code> (default) will write a notify/FileLog event any time a measurement is received.</li>
+                <li><code>event on-change</code> will write a notify/FileLog event only when a measurement is different from the previous one.</li>
+                </ul>
+        </li>
+        <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
+    </ul>
+</ul>
+
+<a name="OWCOUNT"></a>
+<h3>OWCOUNT</h3>
+<ul>FHEM module to commmunicate with 1-Wire Counter/RAM DS2423 #<br /><br /> Note:<br />
+    This 1-Wire module so far works only with the OWX interface module. Please define an <a
+        href="#OWX">OWX</a> device first. <br />
+    <br /><b>Example</b><br />
+    <ul>
+        <code>define OWX_C OWCOUNT DS2423 CE780F000000 300</code>
+        <br />
+        <code>attr OWX_C AName Water|volume</code>
+        <br />
+        <code>attr OWX_C AUnit liters|l</code>
+        <br />
+        <code>attr OWX_CAMode daily</code>
+        <br />
+    </ul><br />
+    <a name="OWCOUNTdefine"></a>
+    <b>Define</b>
+    <ul>
+        <code>define &lt;name&gt; OWCOUNT [&lt;model&gt;] &lt;id&gt;
+            [&lt;interval&gt;]</code>
+        <br /><br /> Define a 1-Wire counter.<br /><br />
+        <li>
+            <code>[&lt;model&gt;]</code><br /> Defines the counter model (and thus 1-Wire
+            family id), currently the following values are permitted: <ul>
+                <li>model DS2423 with family id 1D (default if the model parameter is
+                    omitted)</li>
+            </ul>
+        </li>
+        <li>
+            <code>&lt;id&gt;</code>
+            <br />12-character unique ROM id of the converter device without family id and
+            CRC code </li>
+        <li>
+            <code>&lt;interval&gt;</code>
+            <br />Measurement interval in seconds. The default is 300 seconds. </li>
+    </ul>
+    <br />
+    <a name="OWCOUNTset">
+        <b>Set</b></a>
+    <ul>
+        <li><a name="owcount_interval">
+                <code>set &lt;name&gt; interval &lt;int&gt;</code></a><br /> Measurement
+            interval in seconds. The default is 300 seconds. </li>
+        <li><a name="owcount_memory">
+                <code>set &lt;name&gt; memory &lt;page&gt;</code></a><br />Write 32 bytes to
+            memory page 0..13 </li>
+        <li><a name="owcount_midnight">
+                <code>set &lt;name&gt; midnight &lt;channel-name&gt;</code></a><br />Write
+            the day's starting value for counter &lt;channel&gt; (A, B or named channel, see
+            below)</li>
+    </ul>
+    <br />
+    <a name="OWCOUNTget">
+        <b>Get</b></a>
+    <ul>
+        <li><a name="owcount_id">
+                <code>get &lt;name&gt; id</code></a>
+            <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
+        <li><a name="owcount_present">
+                <code>get &lt;name&gt; present</code>
+            </a>
+            <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
+        <li><a name="owcount_interval2">
+                <code>get &lt;name&gt; interval</code></a><br />Returns measurement interval
+            in seconds. </li>
+        <li><a name="owcount_memory2">
+                <code>get &lt;name&gt; memory &lt;page&gt;</code></a><br />Obtain 32 bytes
+            from memory page 0..13 </li>
+        <li><a name="owcount_midnight2">
+                <code>get &lt;name&gt; midnight &lt;channel-name&gt;</code></a><br />Obtain
+            the day's starting value for counter &lt;channel&gt; (A, B or named channel, see
+            below)</li>
+        <li><a name="owcount_counter">
+                <code>get &lt;name&gt; counter &lt;channel-name&gt;</code></a><br />Obtain
+            the current value for counter &lt;channel&gt; (A, B or named channel, see
+            below)</li>
+        <li><a name="owcount_counters">
+                <code>get &lt;name&gt; counters</code></a><br />Obtain the current value
+            both counters</li>
+    </ul>
+    <br />
+    <a name="OWCOUNTattr">
+        <b>Attributes</b></a>
+    <ul>For each of the following attributes, the channel identification A,B may be used.
+                <li><a name="owcount_cname"><code>attr &lt;name&gt; &lt;channel&gt;Name
+                    &lt;string&gt;|&lt;string&gt;</code></a>
+            <br />name for the channel | a type description for the measured value. </li>
+        <li><a name="owcount_cunit"><code>attr &lt;name&gt; &lt;channel&gt;Unit
+                    &lt;string&gt;|&lt;string&gt;</code></a>
+            <br />unit of measurement for this channel | its abbreviation. </li>
+        <li><a name="owcount_coffset"><code>attr &lt;name&gt; &lt;channel&gt;Offset
+                    &lt;float&gt;</code></a>
+            <br />offset added to the reading in this channel. </li>
+        <li><a name="owcount_cfactor"><code>attr &lt;name&gt; &lt;channel&gt;Factor
+                    &lt;float&gt;</code></a>
+            <br />factor multiplied to (reading+offset) in this channel. </li>
+        <li><a name="owcount_cmode"><code>attr &lt;name&gt; &lt;channel&gt;Mode daily |
+                    normal</code></a>
+            <br />factor multiplied to (reading+offset) in this channel. </li>
+        <li><a name="owcount_event"><code>attr &lt;name&gt; event on-change|on-update
+        </code></a>This attribte work similarly, but not identically to the standard event-on-update-change/event-on-update-reading attribute.
+            <ul><li><code>event on-update</code> (default) will write a notify/FileLog event any time a measurement is received.</li>
+                <li><code>event on-change</code> will write a notify/FileLog event only when a measurement is different from the previous one.</li>
+            </ul>
+        </li>
+        <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
+    </ul>
+</ul>
+
+<a name="OWID"></a>
+<h3>OWID</h3>
+<ul>FHEM module for 1-Wire devices that know only their unique ROM ID<br />
+    <br />Note:<br /> This 1-Wire module so far works only with the OWX interface module.
+    Please define an <a href="#OWX">OWX</a> device first. <br />
+    <br /><b>Example</b><br />
+    <ul>
+        <code>define ROM1 OWX_ID OWCOUNT CE780F000000</code>
+        <br />
+    </ul><br />
+    <a name="OWIDdefine"></a>
+    <b>Define</b>
+    <ul>
+        <code>define &lt;name&gt; OWID &lt;id&gt; </code>
+        <br /><br /> Define a 1-Wire device.<br /><br />
+        <li>
+            <code>&lt;id&gt;</code>
+            <br />12-character unique ROM id of the converter device without family id and
+            CRC code </li>
+    </ul>
+    <br />
+    <a name="OWIDget">
+        <b>Get</b></a>
+    <ul>
+        <li><a name="owid_id">
+                <code>get &lt;name&gt; id</code></a>
+            <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
+        <li><a name="owid_present">
+                <code>get &lt;name&gt; present</code>
+            </a>
+            <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
+    </ul>
+    <br />
+</ul>
+
+<a name="OWLCD"></a>
+<h3>OWLCD</h3>
+<ul>FHEM module to commmunicate with the <a
+        href="http://www.louisswart.co.za/1-Wire_Overview.html">1-Wire LCD controller</a>
+    from Louis Swart (1-Wire family id FF). See also the corresponding <a
+        href="http://fhemwiki.de/wiki/1-Wire_Textdisplay">Wiki page.</a><br /><br />
+    Note:<br /> This 1-Wire module so far works only with the OWX interface module. Please
+    define an <a href="#OWX">OWX</a> device first. <br />
+    <br /><b>Example</b><br />
+    <ul>
+        <code>define OWX_LCD OWLCD 9F0700000100</code>
+        <br />
+    </ul>
+    <br />
+    <a name="OWLCDdefine"></a>
+    <b>Define</b>
+    <ul>
+        <code>define &lt;name&gt; OWLCD &lt;id&gt;</code>
+        <br /><br /> Define a 1-Wire LCD device.<br /><br />
+        <li>
+            <code>&lt;id&gt;</code>
+            <br />12-character unique ROM id of the converter device without family id and
+            CRC code </li>
+    </ul>
+    <br />
+    <a name="OWLCDset">
+        <b>Set</b></a>
+    <ul>
+        <li><a name="owlcd_icon">
+                <code>set &lt;name&gt; icon &lt;int&gt; on|off|blink</code></a><br /> Set
+            one of the icons 0..14 on, off or blinking</li>
+        <li><a name="owlcd_icon2">
+                <code>set &lt;name&gt; icon 15 0..6</code></a><br /> Set icon 15 to one of
+            its values</li>
+        <li><a name="owlcd_icon3">
+                <code>set &lt;name&gt; icon none</code></a><br /> Set all icons off</li>
+        <li><a name="owlcd_line">
+                <code>set &lt;name&gt; line &lt;int&gt; &lt;string&gt;</code></a><br />
+            Write LCD line 0..3 with some content </li>
+        <li><a name="owlcd_memory">
+                <code>set &lt;name&gt; memory &lt;page&gt;
+            &lt;string&gt;</code></a><br />Write memory page 0..6</li>
+        <li><a name="owlcd_gpio">
+                <code>set &lt;name&gt; gpio &lt;value&gt;</code></a><br />Write state for
+            all three gpio pins (value = 0..7, for each bit 0=ON, 1=OFF)</li>
+        <li><a name="owlcd_bl">
+                <code>set &lt;name&gt; backlight ON|OFF</code></a><br />Switch backlight on
+            or off</li>
+        <li><a name="owlcd_lcd">
+                <code>set &lt;name&gt; lcd ON|OFF</code></a><br />Switch LCD power on or
+            off</li>
+        <li><a name="owlcd_gpio">
+                <code>set &lt;name&gt; reset</code></a><br />Reset the display</li>
+        <li><a name="owlcd_gpio">
+                <code>set &lt;name&gt; test</code></a><br />Test the display</li>
+    </ul>
+    <br />
+    <a name="owlcdget">
+        <b>Get</b></a>
+    <ul>
+        <li><a name="owlcd_id">
+                <code>get &lt;name&gt; id</code></a>
+            <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
+        <li><a name="owlcd_present">
+                <code>get &lt;name&gt; present</code>
+            </a>
+            <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
+        <li><a name="owlcd_memory2">
+                <code>get &lt;name&gt; memory &lt;page&gt;</code></a><br />Read memory page
+            0..6 </li>
+        <li><a name="owlcd_gpio">
+                <code>get &lt;name&gt; gpio</code></a><br />Obtain state of all four input
+            channels (15 = all off, 0 = all on)</li>
+        <li><a name="owlcd_counter">
+                <code>get &lt;name&gt; gpio</code></a><br />Obtain state of all four input
+            counters (4 x 16 Bit)</li>
+        <li><a name="owlcd_version">
+                <code>get &lt;name&gt; version</code></a><br />Obtain firmware version of
+            the controller</li>
+    </ul>
+    <br />
+    <a name="owlcdattr">
+        <b>Attributes</b></a>
+    <ul>
+        <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
+    </ul>
+</ul>
+
+<a name="OWMULTI"></a>
+<h3>OWMULTI</h3>
+<ul>FHEM module to commmunicate with 1-Wire multi-sensors, currently the DS2438 smart battery monitor<br /><br /> Note:<br /> This
+    1-Wire module so far works only with the OWX interface module. Please define an <a
+        href="#OWX">OWX</a> device first. <br />
+    <br /><b>Example</b><br />
+    <ul>
+        <code>define OWX_M OWMULTI 7C5034010000 45</code>
+        <br />
+        <code>attr OWX_M VName relHumidity|humidity</code>
+        <br />
+        <code>attr OWX_M VUnit percent|%</code>
+        <br />
+        <code>attr OWX_M VFunction (161.29 * V / VDD - 25.8065)/(1.0546 - 0.00216 * T)</code>
+        <br />
+    </ul><br />
+    <a name="OWMULTIdefine"></a>
+    <b>Define</b>
+    <ul>
+        <code>define &lt;name&gt; OWMULTI [&lt;model&gt;] &lt;id&gt; [&lt;interval&gt;]</code>
+        <br /><br /> Define a 1-Wire multi-sensor<br /><br />
+        <li>
+            <code>[&lt;model&gt;]</code><br /> Defines the sensor model (and thus
+            1-Wire family id), currently the following values are permitted: <ul>
+                <li>model DS2438 with family id 26 (default if the model parameter is
+                    omitted). Measured is a temperature value, an external voltage and the current supply voltage</li>
+            </ul>
+        </li>
+        <li>
+            <code>&lt;id&gt;</code>
+            <br />12-character unique ROM id of the converter device without family id and
+            CRC code </li>
+        <li>
+            <code>&lt;interval&gt;</code>
+            <br />Measurement interval in seconds. The default is 300 seconds. </li>
+        <br />
+    </ul>
+    <br />
+    <a name="OWMULTIset">
+        <b>Set</b></a>
+    <ul>
+        <li><a name="owmulti_interval">
+            <code>set &lt;name&gt; interval &lt;int&gt;</code></a><br /> Measurement
+            interval in seconds. The default is 300 seconds. </li>
+    </ul>
+    <br />
+    <a name="OWMULTIget">
+        <b>Get</b></a>
+    <ul>
+        <li><a name="owmulti_id">
+            <code>get &lt;name&gt; id</code></a>
+            <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
+        <li><a name="owmulti_present">
+            <code>get &lt;name&gt; present</code>
+        </a>
+            <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
+        <li><a name="owmulti_interval2">
+            <code>get &lt;name&gt; interval</code></a><br />Returns measurement interval
+            in seconds. </li>
+        <li><a name="owmulti_reading">
+            <code>get &lt;name&gt; reading</code></a><br />Obtain the measurement value from VFunction. </li>
+        <li><a name="owmulti_temperature">
+            <code>get &lt;name&gt; temperature</code></a><br />Obtain the temperature value. </li>
+        <li><a name="owmulti_vdd">
+            <code>get &lt;name&gt; VDD</code></a><br />Obtain the current supply voltage.
+        </li>
+        <li><a name="owmulti_raw">
+            <code>get &lt;name&gt; V</code> or <code>get &lt;name&gt; raw</code></a><br />Obtain the raw external voltage measurement.
+        </li>
+    </ul>
+    <br />
+    <a name="OWMULTIattr">
+        <b>Attributes</b></a>
+    <ul>
+        <li><a name="owmulti_vname"><code>attr &lt;name&gt; VName
+            &lt;string&gt;|&lt;string&gt;</code></a>
+            <br />name for the channel | a type description for the measured value. </li>
+        <li><a name="owmulti_vunit"><code>attr &lt;name&gt; VUnit
+            &lt;string&gt;|&lt;string&gt;</code></a>
+            <br />unit of measurement for this channel | its abbreviation. </li>
+        <li><a name="owmulti_vfunction"><code>attr &lt;name&gt; VFunction
+            &lt;string&gt;</code></a>
+            <br />arbitrary functional expression involving the values VDD, V, T. Example see above.
+            <ul>
+            <li>VDD is replaced by the measured supply voltage in Volt,</li>
+            <li> V by the measured external voltage,</li>
+            <li>T by the measured and corrected temperature in its unit</li>
+        </ul></li>
+        <li><a name="owmulti_tempOffset"><code>attr &lt;name&gt; tempOffset
+            &lt;float&gt;</code>
+        </a>
+            <br />temperature offset in &deg;C added to the raw temperature reading. </li>
+        <li><a name="owmulti_tempUnit"><code>attr &lt;name&gt; tempUnit
+            Celsius|Kelvin|Fahrenheit|C|K|F</code>
+        </a>
+            <br />unit of measurement (temperature scale), default is Celsius = &deg;C </li>
+        <li><a name="owmulti_event"><code>attr &lt;name&gt; event on-change|on-update
+        </code></a>This attribte work similarly, but not identically to the standard event-on-update-change/event-on-update-reading attribute.
+            <ul><li><code>event on-update</code> (default) will write a notify/FileLog event any time a measurement is received.</li>
+                <li><code>event on-change</code> will write a notify/FileLog event only when a measurement is different from the previous one.</li>
+            </ul>
+        </li>
+        <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
+  </ul>
+</ul>
+
+<a name="OWSWITCH"></a>
+<h3>OWSWITCH</h3>
+<ul>FHEM module to commmunicate with 1-Wire Programmable Switches <br /><br /> Note:<br />
+    This 1-Wire module so far works only with the OWX interface module. Please define an <a
+        href="#OWX">OWX</a> device first. <br />
+    <br /><b>Example</b><br />
+    <ul>
+        <code>define OWX_S OWSWITCH DS2413 B5D502000000 60</code>
+        <br />
+        <code>attr OWX_S AName Lampe|light</code>
+        <br />
+        <code>attr OWX_S AUnit AN|AUS</code>
+        <br />
+    </ul>
+    <br />
+    <a name="OWSWITCHdefine"></a>
+    <b>Define</b>
+    <ul>
+        <code>define &lt;name&gt; OWSWITCH [&lt;model&gt;] &lt;id&gt;
+            [&lt;interval&gt;]</code>
+        <br /><br /> Define a 1-Wire switch.<br /><br />
+        <li>
+            <code>[&lt;model&gt;]</code><br /> Defines the switch model (and thus 1-Wire
+            family id), currently the following values are permitted: <ul>
+                <li>model DS2413 with family id 3A (default if the model parameter is
+                    omitted). 2 Channel switch with onboard memory</li>
+                <li>model DS2406 with family id 12. 2 Channel switch </li>
+                <li>model DS2406 with family id 29. 8 Channel switch</li>
+            </ul>
+        </li>
+        <li>
+            <code>&lt;id&gt;</code>
+            <br />12-character unique ROM id of the converter device without family id and
+            CRC code </li>
+        <li>
+            <code>&lt;interval&gt;</code>
+            <br />Measurement interval in seconds. The default is 300 seconds. </li>
+    </ul>
+    <br />
+    <a name="OWSWITCHset">
+        <b>Set</b></a>
+    <ul>
+        <li><a name="owswitch_interval">
+                <code>set &lt;name&gt; interval &lt;int&gt;</code></a><br /> Measurement
+            interval in seconds. The default is 300 seconds. </li>
+        <li><a name="owswitch_output">
+                <code>set &lt;name&gt; output &lt;channel-name&gt; ON |
+                    OFF</code></a><br />Set value for channel (A,B,... or defined channel name). 1 = OFF, 0 = ON in normal usage. 
+                     See also the note above</li>
+        <li><a name="owswitch_gpio">
+            <code>set &lt;name&gt; gpio &lt;value&gt;</code></a><br />Set values for channels (For 2 channels: 3 = A and B OFF, 1 = B ON 2 = A ON 0 = both ON)</li>
+        <li><a name="owswitch_init">
+            <code>set &lt;name&gt; init yes</code></a><br /> Re-initialize the device</li>
+    </ul>
+    <br />
+    <a name="OWSWITCHget">
+        <b>Get</b></a>
+    <ul>
+        <li><a name="owswitch_id">
+                <code>get &lt;name&gt; id</code></a>
+            <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
+        <li><a name="owswitch_present">
+                <code>get &lt;name&gt; present</code>
+            </a>
+            <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
+        <li><a name="owswitch_interval2">
+                <code>get &lt;name&gt; interval</code></a><br />Returns measurement interval
+            in seconds. </li>
+        <li><a name="owswitch_input">
+                <code>get &lt;name&gt; input &lt;channel-name&gt;</code></a><br />
+                state for channel (A,B, ... or defined channel name)
+                This value reflects the measured value, not necessarily the one set as
+                output state, because the output transistors are open collector switches. A measured
+                state of 1 = OFF therefore corresponds to an output state of 1 = OFF, but a measured
+                state of 0 = ON can also be due to an external shortening of the output.</li>
+        <li><a name="owswitch_gpio">
+                <code>get &lt;name&gt; gpio</code></a><br />Obtain state of all
+            channels</li>
+    </ul>
+    <br />
+    <a name="OWSWITCHattr">
+        <b>Attributes</b></a> For each of the following attributes, the channel
+    identification A,B,... may be used. <ul>
+        <li><a name="owswitch_cname"><code>attr &lt;name&gt; &lt;channel&gt;Name
+                    &lt;string&gt;|&lt;string&gt;</code></a>
+            <br />name for the channel | a type description for the measured value. </li>
+        <li><a name="owswitch_cunit"><code>attr &lt;name&gt; &lt;channel&gt;Unit
+                    &lt;string&gt;|&lt;string&gt;</code></a>
+            <br />display for on | off condition </li>
+        <li><a name="owswitch_event"><code>attr &lt;name&gt; event on-change|on-update
+        </code></a>This attribte work similarly, but not identically to the standard event-on-update-change/event-on-update-reading attribute.
+            <ul><li><code>event on-update</code> (default) will write a notify/FileLog event any time a measurement is received.</li>
+                <li><code>event on-change</code> will write a notify/FileLog event only when a measurement is different from the previous one.</li>
+            </ul>
+        </li>
+        <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
+    </ul>
+</ul>
+
+<a name="OWTHERM"></a>
+<h3>OWTHERM</h3>
+<ul>FHEM module to commmunicate with 1-Wire bus digital thermometer devices<br /><br />
+    Note:<br /> This is the only 1-Wire module which so far works with both the OWFS and the
+    OWX interface module. Please define an <a href="#OWFS">OWFS</a> device or an <a
+        href="#OWX">OWX</a> device first. <br />
+    <br /><b>Example</b><br />
+    <ul>
+        <code>define OWX_T OWTHERM DS18B20 E8D09B030000 300</code>
+        <br />
+        <code>attr OWX_T tempUnit Kelvin</code>
+        <br />
+    </ul><br />
+    <a name="OWTHERMdefine"></a>
+    <b>Define</b>
+    <ul>
+        <code>define &lt;name&gt; OWTHERM [&lt;model&gt;] &lt;id&gt;
+            [&lt;interval&gt;]</code>
+        <br /><br /> Define a 1-Wire digital thermometer device.<br /><br />
+        <li>
+            <code>[&lt;model&gt;]</code><br /> Defines the thermometer model (and thus
+            1-Wire family id) currently the following values are permitted: <ul>
+                <li>model DS1820 with family id 10 (default if the model parameter is
+                    omitted)</li>
+                <li>model DS1822 with family id 22</li>
+                <li>model DS18B20 with family id 28</li>
+            </ul>
+        </li>
+        <li>
+            <code>&lt;id&gt;</code>
+            <br />12-character unique ROM id of the thermometer device without family id and
+            CRC code </li>
+        <li>
+            <code>&lt;interval&gt;</code>
+            <br /> Temperature measurement interval in seconds. The default is 300 seconds. </li>
+        <br /> Example: <br />
+        <code>define Temp1 OWTHERM 14B598010800 300 </code><br />
+    </ul>
+    <br />
+    <a name="OWTHERMset">
+        <b>Set</b></a>
+    <ul>
+        <li><a name="owtherm_interval">
+                <code>set &lt;name&gt; interval &lt;int&gt;</code></a><br /> Temperature
+            measurement intervall in seconds. The default is 300 seconds.</li>
+        <li><a name="owtherm_tempHigh">
+                <code>set &lt;name&gt; tempHigh &lt;float&gt;</code></a>
+            <br /> The high alarm temperature (on the temperature scale chosen by the
+            attribute value) </li>
+        <li><a name="owtherm_tempLow">
+                <code>set &lt;name&gt; tempLow &lt;float&gt;</code></a>
+            <br /> The low alarm temperature (on the temperature scale chosen by the
+            attribute value) </li>
+    </ul>
+    <br />
+    <a name="OWTHERMget">
+        <b>Get</b></a>
+    <ul>
+        <li><a name="owtherm_id">
+                <code>get &lt;name&gt; id</code></a>
+            <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
+        <li><a name="owtherm_present">
+                <code>get &lt;name&gt; present</code></a>
+            <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
+        <li><a name="owtherm_interval2">
+                <code>get &lt;name&gt; interval</code></a><br />Returns temperature
+            measurement interval in seconds.</li>
+        <li><a name="owtherm_temperature">
+                <code>get &lt;name&gt; temperature</code></a><br />Obtain the temperature. </li>
+        <li><a name="owtherm_alarm">
+                <code>get &lt;name&gt; alarm</code></a><br />Obtain the alarm temperature
+            values. </li>
+    </ul>
+    <br />
+    <a name="OWTHERMattr">
+        <b>Attributes</b></a>
+    <ul>
+        <li><a name="owtherm_stateAL"><code>attr &lt;name&gt; stateAL &lt;string&gt;</code>
+            </a>
+            <br />character string for denoting low alarm condition, default is red down
+            triangle, e.g. the code &lt;span style="color:red"&gt;&amp;#x25BE;&lt;/span&gt;
+            leading to the sign <span style="color:red">&#x25BE;</span>
+        </li>
+        <li><a name="owtherm_stateAH"><code>attr &lt;name&gt; stateAH &lt;string&gt;</code>
+            </a>
+            <br />character string for denoting high alarm condition, default is red upward
+            triangle, e.g. the code &lt;span style="color:red"&gt;&amp;#x25B4;&lt;/span&gt;
+            leading to the sign <span style="color:red">&#x25B4;</span>
+        </li>
+        <li><a name="owtherm_tempOffset"><code>attr &lt;name&gt; tempOffset
                     &lt;float&gt;</code>
-                </a>
-                    <br />temperature offset in &deg;C added to the raw temperature reading. </li>
-                <li><a name="owmulti_tempUnit"><code>attr &lt;name&gt; tempUnit
+            </a>
+            <br />temperature offset in &deg;C added to the raw temperature reading. </li>
+        <li><a name="owtherm_tempUnit"><code>attr &lt;name&gt; tempUnit
                     Celsius|Kelvin|Fahrenheit|C|K|F</code>
-                </a>
-                    <br />unit of measurement (temperature scale), default is Celsius = &deg;C </li>
-                <li><a name="owmulti_event"><code>attr &lt;name&gt; event on-change|on-update
-                </code></a>This attribte work similarly, but not identically to the standard event-on-update-change/event-on-update-reading attribute.
-                    <ul><li><code>event on-update</code> (default) will write a notify/FileLog event any time a measurement is received.</li>
-                        <li><code>event on-change</code> will write a notify/FileLog event only when a measurement is different from the previous one.</li>
-                    </ul>
-                </li>
-                <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
-            
-        </ul>
-        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
-        <a name="OWSWITCH"></a>
-        <h3>OWSWITCH</h3>
-        <ul>FHEM module to commmunicate with 1-Wire Programmable Switches <br /><br /> Note:<br />
-            This 1-Wire module so far works only with the OWX interface module. Please define an <a
-                href="#OWX">OWX</a> device first. <br />
-            <br /><b>Example</b><br />
-            <ul>
-                <code>define OWX_S OWSWITCH DS2413 B5D502000000 60</code>
-                <br />
-                <code>attr OWX_S AName Lampe|light</code>
-                <br />
-                <code>attr OWX_S AUnit AN|AUS</code>
-                <br />
+            </a>
+            <br />unit of measurement (temperature scale), default is Celsius = &deg;C </li>
+        <li><a name="owtherm_tempHigh2">
+                <code>attr &lt;name&gt; tempHigh &lt;float&gt;</code>
+            </a>
+            <br /> high alarm temperature (on the temperature scale chosen by the attribute
+            value). </li>
+        <li><a name="owtherm_tempLow2">
+                <code>attr &lt;name&gt; tempLow &lt;float&gt;</code>
+            </a>
+            <br /> low alarm temperature (on the temperature scale chosen by the attribute
+            value). </li>
+        <li><a name="owtherm_event"><code>attr &lt;name&gt; event on-change|on-update
+        </code></a>This attribte work similarly, but not identically to the standard event-on-update-change/event-on-update-reading attribute.
+            <ul><li><code>event on-update</code> (default) will write a notify/FileLog event any time a measurement is received.</li>
+                <li><code>event on-change</code> will write a notify/FileLog event only when a measurement is different from the previous one.</li>
             </ul>
-            <br />
-            <a name="OWSWITCHdefine"></a>
-            <b>Define</b>
-            <ul>
-                <code>define &lt;name&gt; OWSWITCH [&lt;model&gt;] &lt;id&gt;
-                    [&lt;interval&gt;]</code>
-                <br /><br /> Define a 1-Wire switch.<br /><br />
-                <li>
-                    <code>[&lt;model&gt;]</code><br /> Defines the switch model (and thus 1-Wire
-                    family id), currently the following values are permitted: <ul>
-                        <li>model DS2413 with family id 3A (default if the model parameter is
-                            omitted). 2 Channel switch with onboard memory</li>
-                        <li>model DS2406 with family id 12. 2 Channel switch </li>
-                        <li>model DS2406 with family id 29. 8 Channel switch</li>
-                    </ul>
-                </li>
-                <li>
-                    <code>&lt;id&gt;</code>
-                    <br />12-character unique ROM id of the converter device without family id and
-                    CRC code </li>
-                <li>
-                    <code>&lt;interval&gt;</code>
-                    <br />Measurement interval in seconds. The default is 300 seconds. </li>
-            </ul>
-            <br />
-            <a name="OWSWITCHset">
-                <b>Set</b></a>
-            <ul>
-                <li><a name="owswitch_interval">
-                        <code>set &lt;name&gt; interval &lt;int&gt;</code></a><br /> Measurement
-                    interval in seconds. The default is 300 seconds. </li>
-                <li><a name="owswitch_output">
-                        <code>set &lt;name&gt; output &lt;channel-name&gt; ON |
-                            OFF</code></a><br />Set value for channel (A,B,... or defined channel name). 1 = OFF, 0 = ON in normal usage. 
-                             See also the note above</li>
-                <li><a name="owswitch_gpio">
-                    <code>set &lt;name&gt; gpio &lt;value&gt;</code></a><br />Set values for channels (For 2 channels: 3 = A and B OFF, 1 = B ON 2 = A ON 0 = both ON)</li>
-                <li><a name="owswitch_init">
-                    <code>set &lt;name&gt; init yes</code></a><br /> Re-initialize the device</li>
-            </ul>
-            <br />
-            <a name="OWSWITCHget">
-                <b>Get</b></a>
-            <ul>
-                <li><a name="owswitch_id">
-                        <code>get &lt;name&gt; id</code></a>
-                    <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
-                <li><a name="owswitch_present">
-                        <code>get &lt;name&gt; present</code>
-                    </a>
-                    <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
-                <li><a name="owswitch_interval2">
-                        <code>get &lt;name&gt; interval</code></a><br />Returns measurement interval
-                    in seconds. </li>
-                <li><a name="owswitch_input">
-                        <code>get &lt;name&gt; input &lt;channel-name&gt;</code></a><br />
-                        state for channel (A,B, ... or defined channel name)
-                        This value reflects the measured value, not necessarily the one set as
-                        output state, because the output transistors are open collector switches. A measured
-                        state of 1 = OFF therefore corresponds to an output state of 1 = OFF, but a measured
-                        state of 0 = ON can also be due to an external shortening of the output.</li>
-                <li><a name="owswitch_gpio">
-                        <code>get &lt;name&gt; gpio</code></a><br />Obtain state of all
-                    channels</li>
-            </ul>
-            <br />
-            <a name="OWSWITCHattr">
-                <b>Attributes</b></a> For each of the following attributes, the channel
-            identification A,B,... may be used. <ul>
-                <li><a name="owswitch_cname"><code>attr &lt;name&gt; &lt;channel&gt;Name
-                            &lt;string&gt;|&lt;string&gt;</code></a>
-                    <br />name for the channel | a type description for the measured value. </li>
-                <li><a name="owswitch_cunit"><code>attr &lt;name&gt; &lt;channel&gt;Unit
-                            &lt;string&gt;|&lt;string&gt;</code></a>
-                    <br />display for on | off condition </li>
-                <li><a name="owswitch_event"><code>attr &lt;name&gt; event on-change|on-update
-                </code></a>This attribte work similarly, but not identically to the standard event-on-update-change/event-on-update-reading attribute.
-                    <ul><li><code>event on-update</code> (default) will write a notify/FileLog event any time a measurement is received.</li>
-                        <li><code>event on-change</code> will write a notify/FileLog event only when a measurement is different from the previous one.</li>
-                    </ul>
-                </li>
-                <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
-            </ul>
-        </ul>
-        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
-        <a name="OWTHERM"></a>
-        <h3>OWTHERM</h3>
-        <ul>FHEM module to commmunicate with 1-Wire bus digital thermometer devices<br /><br />
-            Note:<br /> This is the only 1-Wire module which so far works with both the OWFS and the
-            OWX interface module. Please define an <a href="#OWFS">OWFS</a> device or an <a
-                href="#OWX">OWX</a> device first. <br />
-            <br /><b>Example</b><br />
-            <ul>
-                <code>define OWX_T OWTHERM DS18B20 E8D09B030000 300</code>
-                <br />
-                <code>attr OWX_T tempUnit Kelvin</code>
-                <br />
-            </ul><br />
-            <a name="OWTHERMdefine"></a>
-            <b>Define</b>
-            <ul>
-                <code>define &lt;name&gt; OWTHERM [&lt;model&gt;] &lt;id&gt;
-                    [&lt;interval&gt;]</code>
-                <br /><br /> Define a 1-Wire digital thermometer device.<br /><br />
-                <li>
-                    <code>[&lt;model&gt;]</code><br /> Defines the thermometer model (and thus
-                    1-Wire family id) currently the following values are permitted: <ul>
-                        <li>model DS1820 with family id 10 (default if the model parameter is
-                            omitted)</li>
-                        <li>model DS1822 with family id 22</li>
-                        <li>model DS18B20 with family id 28</li>
-                    </ul>
-                </li>
-                <li>
-                    <code>&lt;id&gt;</code>
-                    <br />12-character unique ROM id of the thermometer device without family id and
-                    CRC code </li>
-                <li>
-                    <code>&lt;interval&gt;</code>
-                    <br /> Temperature measurement interval in seconds. The default is 300 seconds. </li>
-                <br /> Example: <br />
-                <code>define Temp1 OWTHERM 14B598010800 300 </code><br />
-            </ul>
-            <br />
-            <a name="OWTHERMset">
-                <b>Set</b></a>
-            <ul>
-                <li><a name="owtherm_interval">
-                        <code>set &lt;name&gt; interval &lt;int&gt;</code></a><br /> Temperature
-                    measurement intervall in seconds. The default is 300 seconds.</li>
-                <li><a name="owtherm_tempHigh">
-                        <code>set &lt;name&gt; tempHigh &lt;float&gt;</code></a>
-                    <br /> The high alarm temperature (on the temperature scale chosen by the
-                    attribute value) </li>
-                <li><a name="owtherm_tempLow">
-                        <code>set &lt;name&gt; tempLow &lt;float&gt;</code></a>
-                    <br /> The low alarm temperature (on the temperature scale chosen by the
-                    attribute value) </li>
-            </ul>
-            <br />
-            <a name="OWTHERMget">
-                <b>Get</b></a>
-            <ul>
-                <li><a name="owtherm_id">
-                        <code>get &lt;name&gt; id</code></a>
-                    <br /> Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC </li>
-                <li><a name="owtherm_present">
-                        <code>get &lt;name&gt; present</code></a>
-                    <br /> Returns 1 if this 1-Wire device is present, otherwise 0. </li>
-                <li><a name="owtherm_interval2">
-                        <code>get &lt;name&gt; interval</code></a><br />Returns temperature
-                    measurement interval in seconds.</li>
-                <li><a name="owtherm_temperature">
-                        <code>get &lt;name&gt; temperature</code></a><br />Obtain the temperature. </li>
-                <li><a name="owtherm_alarm">
-                        <code>get &lt;name&gt; alarm</code></a><br />Obtain the alarm temperature
-                    values. </li>
-            </ul>
-            <br />
-            <a name="OWTHERMattr">
-                <b>Attributes</b></a>
-            <ul>
-                <li><a name="owtherm_stateAL"><code>attr &lt;name&gt; stateAL &lt;string&gt;</code>
-                    </a>
-                    <br />character string for denoting low alarm condition, default is red down
-                    triangle, e.g. the code &lt;span style="color:red"&gt;&amp;#x25BE;&lt;/span&gt;
-                    leading to the sign <span style="color:red">&#x25BE;</span>
-                </li>
-                <li><a name="owtherm_stateAH"><code>attr &lt;name&gt; stateAH &lt;string&gt;</code>
-                    </a>
-                    <br />character string for denoting high alarm condition, default is red upward
-                    triangle, e.g. the code &lt;span style="color:red"&gt;&amp;#x25B4;&lt;/span&gt;
-                    leading to the sign <span style="color:red">&#x25B4;</span>
-                </li>
-                <li><a name="owtherm_tempOffset"><code>attr &lt;name&gt; tempOffset
-                            &lt;float&gt;</code>
-                    </a>
-                    <br />temperature offset in &deg;C added to the raw temperature reading. </li>
-                <li><a name="owtherm_tempUnit"><code>attr &lt;name&gt; tempUnit
-                            Celsius|Kelvin|Fahrenheit|C|K|F</code>
-                    </a>
-                    <br />unit of measurement (temperature scale), default is Celsius = &deg;C </li>
-                <li><a name="owtherm_tempHigh2">
-                        <code>attr &lt;name&gt; tempHigh &lt;float&gt;</code>
-                    </a>
-                    <br /> high alarm temperature (on the temperature scale chosen by the attribute
-                    value). </li>
-                <li><a name="owtherm_tempLow2">
-                        <code>attr &lt;name&gt; tempLow &lt;float&gt;</code>
-                    </a>
-                    <br /> low alarm temperature (on the temperature scale chosen by the attribute
-                    value). </li>
-                <li><a name="owtherm_event"><code>attr &lt;name&gt; event on-change|on-update
-                </code></a>This attribte work similarly, but not identically to the standard event-on-update-change/event-on-update-reading attribute.
-                    <ul><li><code>event on-update</code> (default) will write a notify/FileLog event any time a measurement is received.</li>
-                        <li><code>event on-change</code> will write a notify/FileLog event only when a measurement is different from the previous one.</li>
-                    </ul>
-                </li>
-                <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
-            </ul>
-        </ul>
+        </li>
+        <li>Standard attributes alias, comment, <a href="#eventMap">eventMap</a>, <a href="#loglevel">loglevel</a>, <a href="#webCmd">webCmd</a></li>
+    </ul>
+</ul>
 
 <a name="RFXCOM"></a>
 <h3>RFXCOM</h3>
@@ -9807,7 +9734,6 @@ href="http://www.elv.de/output/controller.aspx?cid=74&detail=10&detail2=29870">U
   <br>
 </ul>
 
-<a name="TCM120"></a>
 <a name="TCM"></a>
 <h3>TCM</h3>
 <ul>
@@ -10388,6 +10314,7 @@ volume</pre>
   </ul>
   <br>
 </ul>
+</ul>
 
 <a name="ZWDongle"></a>
 <h3>ZWDongle</h3>
@@ -11504,13 +11431,13 @@ volume</pre>
         "Put" the newly created device in this room. The name can contain the
         wildcards %TYPE and %NAME, see the example above.</li><br>
 
-    <a name="filelog"></a>
+    <a name="filelogattr"></a>
     <li>filelog<br>
         Create a filelog associated with the device. The filename can contain
         the wildcards %TYPE and %NAME, see the example above. The filelog will
         be "put" in the same room as the device.</li><br>
 
-    <a name="weblink"></a>
+    <a name="weblinkattr"></a>
     <li>weblink<br>
         Create a weblink associated with the device/filelog.</li><br>
 
@@ -12126,6 +12053,7 @@ volume</pre>
   </ul>
   <br>
 </ul>
+</ul>
 
 <a name="watchdog"></a>
 <h3>watchdog</h3>
@@ -12183,7 +12111,6 @@ volume</pre>
       <li>a generic watchdog (one watchdog responsible for more devices) is
           currently not possible.</li>
     </ul>
-    </ul>
 
     <br>
   </ul>
@@ -12204,7 +12131,6 @@ volume</pre>
     </li>
   </ul>
   <br>
-
 </ul>
 
 <a name="telnet"></a>
diff --git a/fhem/docs/fhem.html b/fhem/docs/fhem.html
index 86a21a715..60f09b862 100644
--- a/fhem/docs/fhem.html
+++ b/fhem/docs/fhem.html
@@ -75,7 +75,7 @@
       Nightly SVN version: a 
       <a href="http://www.dhs-computertechnik.de/downloads/fhem-cvs.tgz">
       tarball</a>, or from the fhem commandline via <a
-      href="commandref.html#updatefhem">updatefhem</a>.  <br><br>
+      href="commandref.html#update">update</a>.  <br><br>
 
 
       Please fill out our <a href="survey.pl">survey</a>,