######################################################################################## # # OWAD.pm # # FHEM module to commmunicate with 1-Wire A/D converters DS2450 # # Prof. Dr. Peter A. Henning, 2012 # # $Id$ # ######################################################################################## # # define OWAD [] [interval] # # where may be replaced by any name string # # is a 1-Wire device type. If omitted, we assume this to be an # DS2450 A/D converter # is a 12 character (6 byte) 1-Wire ROM ID # without Family ID, e.g. A2D90D000800 # [interval] is an optional query interval in seconds # # get id => FAM_ID.ROM_ID.CRC # get present => 1 if device present, 0 if not # get interval => query interval # get reading => measurement for all channels # get alarm => alarm measurement settings for all channels # get status => alarm and i/o status for all channels # # set interval => set period for measurement # # Additional attributes are defined in fhem.cfg, in some cases per channel, where =A,B,C,D # Note: attributes are read only during initialization procedure - later changes are not used. # # attr stateAL0 "" = character string for denoting low normal condition, default is empty # attr stateAH0 "" = character string for denoting high normal condition, default is empty # attr stateAL1 "" = character string for denoting low alarm condition, default is down triangle # attr stateAH1 "" = character string for denoting high alarm condition, default is up triangle # attr Name | = name for the channel | a type description for the measured value # attr Unit | = unit of measurement for this channel | its abbreviation # # ATTENTION: Usage of Offset/Factor is deprecated, replace by Function attribute # attr Offset = offset added to the reading in this channel # attr Factor = factor multiplied to (reading+offset) in this channel # attr Function = arbitrary functional expression involving the values V=VA,VB,VC,VD # VA is replaced by the measured voltage in channel A, etc. # # attr Alarm = alarm setting in this channel, either both, low, high or none (default) # attr Low = measurement value (on the scale determined by offset and factor) for low alarm # attr High = measurement value (on the scale determined by offset and factor) for high alarm # ######################################################################################## # # This programm is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # The GNU General Public License can be found at # http://www.gnu.org/copyleft/gpl.html. # A copy is found in the textfile GPL.txt and important notices to the license # from the author is found in LICENSE.txt distributed with these scripts. # # This script is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # ######################################################################################## package main; use vars qw{%attr %defs}; use strict; use warnings; sub Log($$); #-- value globals my @owg_status; my $owg_state; #-- channel name - fixed is the first array, variable the second my @owg_fixed = ("A","B","C","D"); my @owg_channel; #-- channel values - always the raw values from the device my @owg_val=("","","",""); #-- channel mode - fixed for now my @owg_mode = ("input","input","input","input"); #-- resolution in bit - fixed for now my @owg_resoln = (16,16,16,16); #-- raw range in mV - fixed for now my @owg_range = (5100,5100,5100,5100); #-- alarm status 0 = disabled, 1 = enabled, but not alarmed, 2 = alarmed my @owg_slow=(0,0,0,0); my @owg_shigh=(0,0,0,0); #-- alarm values - always the raw values committed to the device my @owg_vlow; my @owg_vhigh; my %gets = ( "id" => "", "present" => "", "interval" => "", "reading" => "", "alarm" => "", "status" => "", ); my %sets = ( "interval" => "" ); my %updates = ( "present" => "", "reading" => "", "alarm" => "", "status" => "" ); ######################################################################################## # # The following subroutines are independent of the bus interface # # Prefix = OWAD # ######################################################################################## # # OWAD_Initialize # # Parameter hash = hash of device addressed # ######################################################################################## sub OWAD_Initialize ($) { my ($hash) = @_; $hash->{DefFn} = "OWAD_Define"; $hash->{UndefFn} = "OWAD_Undef"; $hash->{GetFn} = "OWAD_Get"; $hash->{SetFn} = "OWAD_Set"; #Name = channel name #Offset = a v(oltage) offset added to the reading #Factor = a v(oltage) factor multiplied with (reading+offset) #Unit = a unit of measure my $attlist = "IODev do_not_notify:0,1 showtime:0,1 model:DS2450 loglevel:0,1,2,3,4,5 ". "event-on-update-reading event-on-change-reading ". "stateAL0 stateAL1 stateAH0 stateAH1"; for( my $i=0;$i<4;$i++ ){ $attlist .= " ".$owg_fixed[$i]."Name"; $attlist .= " ".$owg_fixed[$i]."Offset"; $attlist .= " ".$owg_fixed[$i]."Factor"; $attlist .= " ".$owg_fixed[$i]."Function"; $attlist .= " ".$owg_fixed[$i]."Unit"; $attlist .= " ".$owg_fixed[$i]."Alarm"; $attlist .= " ".$owg_fixed[$i]."Low"; $attlist .= " ".$owg_fixed[$i]."High"; } $hash->{AttrList} = $attlist; } ######################################################################################### # # OWAD_Define - Implements DefFn function # # Parameter hash = hash of device addressed, def = definition string # ######################################################################################### sub OWAD_Define ($$) { my ($hash, $def) = @_; # define OWAD [] [interval] # e.g.: define flow OWAD 525715020000 300 my @a = split("[ \t][ \t]*", $def); my ($name,$model,$fam,$id,$crc,$interval,$scale,$ret); #-- default $name = $a[0]; $interval = 300; $scale = ""; $ret = ""; #-- check syntax return "OWAD: Wrong syntax, must be define OWAD [] [interval]" if(int(@a) < 2 || int(@a) > 5); #-- check if this is an old style definition, e.g. is missing my $a2 = $a[2]; my $a3 = defined($a[3]) ? $a[3] : ""; if( $a2 =~ m/^[0-9|a-f|A-F]{12}$/ ) { $model = "DS2450"; $id = $a[2]; if(int(@a)>=4) { $interval = $a[3]; } } elsif( $a3 =~ m/^[0-9|a-f|A-F]{12}$/ ) { $model = $a[2]; return "OWAD: Wrong 1-Wire device model $model" if( $model ne "DS2450"); $id = $a[3]; if(int(@a)>=5) { $interval = $a[4]; } } else { return "OWAD: $a[0] ID $a[2] invalid, specify a 12 digit value"; } #-- 1-Wire ROM identifier in the form "FF.XXXXXXXXXXXX.YY" # FF = family id follows from the model # YY must be determined from id if( $model eq "DS2450" ){ $fam = "20"; CommandAttr (undef,"$name model DS2450"); }else{ return "OWMULTI: Wrong 1-Wire device model $model"; } #-- determine CRC Code - only if this is a direct interface $crc = defined($hash->{IODev}->{INTERFACE}) ? sprintf("%02x",OWX_CRC($fam.".".$id."00")) : "00"; #-- Define device internals $hash->{ROM_ID} = $fam.".".$id.$crc; $hash->{OW_ID} = $id; $hash->{OW_FAMILY} = $fam; $hash->{PRESENT} = 0; $hash->{INTERVAL} = $interval; #-- Couple to I/O device AssignIoPort($hash); if( !defined($hash->{IODev}->{NAME}) | !defined($hash->{IODev}) | !defined($hash->{IODev}->{PRESENT}) ){ return "OWSWITCH: Warning, no 1-Wire I/O device found for $name."; } if( $hash->{IODev}->{PRESENT} != 1 ){ return "OWSWITCH: Warning, 1-Wire I/O device ".$hash->{IODev}->{NAME}." not present for $name."; } $modules{OWAD}{defptr}{$id} = $hash; #-- readingsSingleUpdate($hash,"state","defined",1); Log 3, "OWAD: Device $name defined."; #-- Initialization reading according to interface type my $interface= $hash->{IODev}->{TYPE}; #-- Start timer for initialization in a few seconds InternalTimer(time()+10, "OWAD_InitializeDevice", $hash, 0); #-- Start timer for updates InternalTimer(time()+$hash->{INTERVAL}, "OWAD_GetValues", $hash, 0); return undef; } ######################################################################################## # # OWAD_InitializeDevice - delayed setting of initial readings and channel names # # Parameter hash = hash of device addressed # ######################################################################################## sub OWAD_InitializeDevice($) { my ($hash) = @_; my $name = $hash->{NAME}; #-- Initial readings @owg_val = ("".""."".""); @owg_slow = ("".""."".""); @owg_shigh = ("".""."".""); #-- Set channel names, channel units and alarm values for( my $i=0;$i"; push(@cnama,"unknown"); } #-- unit my $unit = defined($attr{$name}{$owg_fixed[$i]."Unit"}) ? $attr{$name}{$owg_fixed[$i]."Unit"} : "Volt|V"; my @unarr= split(/\|/,$unit); if( int(@unarr)!=2 ){ Log 1, "OWAD: Incomplete channel unit specification $unit. Better use $unit|"; push(@unarr,""); } #-- put into readings $owg_channel[$i] = $cnama[0]; $hash->{READINGS}{"$owg_channel[$i]"}{TYPE} = $cnama[1]; $hash->{READINGS}{"$owg_channel[$i]"}{UNIT} = $unarr[0]; $hash->{READINGS}{"$owg_channel[$i]"}{UNITABBR} = $unarr[1]; #-- Initial readings my $alarm = defined($attr{$name}{$owg_fixed[$i]."Alarm"}) ? $attr{$name}{$owg_fixed[$i]."Alarm"} : "none"; my $vlow = defined($attr{$name}{$owg_fixed[$i]."Low"}) ? $attr{$name}{$owg_fixed[$i]."Low"} : 0.0; my $vhigh = defined($attr{$name}{$owg_fixed[$i]."High"}) ? $attr{$name}{$owg_fixed[$i]."High"} : 5.0; if( $alarm eq "low" || $alarm eq "both" ){ $owg_slow[$i]=1; } if( $alarm eq "high" || $alarm eq "both" ){ $owg_shigh[$i]=1; }; $owg_vlow[$i] = $vlow; $owg_vhigh[$i] = $vhigh; } #-- Initialize all the display stuff OWAD_FormatValues($hash); #-- set status according to interface type my $interface= $hash->{IODev}->{TYPE}; #-- OWX interface if( !defined($interface) ){ return "OWAD: Interface missing"; } elsif( $interface eq "OWX" ){ OWXAD_SetPage($hash,"alarm"); OWXAD_SetPage($hash,"status"); #-- OWFS interface #}elsif( $interface eq "OWFS" ){ # $ret = OWFSAD_GetPage($hash,"reading"); #-- Unknown interface }else{ return "OWAD: InitializeDevice with wrong IODev type $interface"; } } ######################################################################################## # # OWAD_FormatValues - put together various format strings # # Parameter hash = hash of device addressed, fs = format string # ######################################################################################## sub OWAD_FormatValues($) { my ($hash) = @_; my $name = $hash->{NAME}; my ($offset,$factor,$vval,$vlow,$vhigh,$vfunc); my $vfuncall = ""; my $svalue = ""; #-- insert initial values for( my $k=0;$k{tempf}{"$owg_fixed[$i]"}{function} = $vfunc; #-- replace by proper values (VA -> $owg_val[0] etc.) for( my $k=0;$k{READINGS}{"$owg_channel[$i]"}{UNITABBR}); #-- alarm my $alarm = defined($attr{$name}{$owg_fixed[$i]."Alarm"}) ? $attr{$name}{$owg_fixed[$i]."Alarm"} : "none"; my $vlow = defined($attr{$name}{$owg_fixed[$i]."Low"}) ? $attr{$name}{$owg_fixed[$i]."Low"} : 0.0; my $vhigh = defined($attr{$name}{$owg_fixed[$i]."High"}) ? $attr{$name}{$owg_fixed[$i]."High"} : 5.0; if( $alarm eq "low" || $alarm eq "both" ){ $owg_slow[$i]=1; } if( $alarm eq "high" || $alarm eq "both" ){ $owg_shigh[$i]=1; }; #-- this needs to be fixed => HOW ??? $owg_vlow[$i] = $vlow; $owg_vhigh[$i] = $vhigh; #-- Test for alarm condition #-- alarm signature low if( $owg_slow[$i] == 0 ) { } else { if( $vval > $vlow ){ $owg_slow[$i] = 1; $svalue .= $stateal0; } else { $galarm = 1; $owg_slow[$i] = 2; $svalue .= $stateal1; } } #-- alarm signature high if( $owg_shigh[$i] == 0 ) { } else { if( $vval < $vhigh ){ $owg_shigh[$i] = 1; $svalue .= $stateah0; } else { $galarm = 1; $owg_shigh[$i] = 2; $svalue .= $stateah1; } } #-- put into READINGS readingsBulkUpdate($hash,"$owg_channel[$i]",$vval); readingsBulkUpdate($hash,"$owg_channel[$i]Low",$vlow); readingsBulkUpdate($hash,"$owg_channel[$i]High",$vhigh); } } #-- insert space if( $i{NAME}; my $model = $hash->{OW_MODEL}; my $interface= $hash->{IODev}->{TYPE}; my ($value,$value2,$value3) = (undef,undef,undef); my $ret = ""; my $offset; my $factor; #-- check syntax return "OWAD: Get argument is missing @a" if(int(@a) != 2); #-- check argument return "OWAD: Get with unknown argument $a[1], choose one of ".join(",", sort keys %gets) if(!defined($gets{$a[1]})); #-- get id if($a[1] eq "id") { $value = $hash->{ROM_ID}; return "$name.id => $value"; } #-- get present if($a[1] eq "present") { #-- hash of the busmaster my $master = $hash->{IODev}; $value = OWX_Verify($master,$hash->{ROM_ID}); $hash->{PRESENT} = $value; return "$name.present => $value"; } #-- get interval if($a[1] eq "interval") { $value = $hash->{INTERVAL}; return "$name.interval => $value"; } #-- reset presence $hash->{PRESENT} = 0; #-- get reading according to interface type if($a[1] eq "reading") { #-- OWX interface if( $interface eq "OWX" ){ $ret = OWXAD_GetPage($hash,"reading"); #-- OWFS interface #}elsif( $interface eq "OWFS" ){ # $ret = OWFSAD_GetPage($hash,"reading"); #-- Unknown interface }else{ return "OWAD: Get with wrong IODev type $interface"; } #-- process results if( defined($ret) ){ return "OWAD: Could not get values from device $name"; } $hash->{PRESENT} = 1; return "OWAD: $name.reading => ".OWAD_FormatValues($hash); } #-- get alarm values according to interface type if($a[1] eq "alarm") { #-- OWX interface if( $interface eq "OWX" ){ $ret = OWXAD_GetPage($hash,"alarm"); #-- OWFS interface #}elsif( $interface eq "OWFS" ){ # $ret = OWFSAD_GetPage($hash,"alarm"); #-- Unknown interface }else{ return "OWAD: Get with wrong IODev type $interface"; } #-- process results if( defined($ret) ){ return "OWAD: Could not get values from device $name"; } $hash->{PRESENT} = 1; OWAD_FormatValues($hash); #-- assemble ouput string $value = ""; for (my $i=0;$i{READINGS}{$owg_channel[$i]."Low"}{VAL}, $hash->{READINGS}{$owg_channel[$i]."High"}{VAL}; } return "OWAD: $name.alarm => $value"; } #-- get status values according to interface type if($a[1] eq "status") { #-- OWX interface if( $interface eq "OWX" ){ $ret = OWXAD_GetPage($hash,"status"); #-- OWFS interface #}elsif( $interface eq "OWFS" ){ # $ret = OWFSAD_GetPage($hash,"status"); #-- Unknown interface }else{ return "OWAD: Get with wrong IODev type $interface"; } #-- process results if( defined($ret) ){ return "OWAD: Could not get values from device $name"; } $hash->{PRESENT} = 1; OWAD_FormatValues($hash); #-- assemble output string $value = ""; for (my $i=0;$i ".$value; } } ####################################################################################### # # OWAD_GetValues - Updates the reading from one device # # Parameter hash = hash of device addressed # ######################################################################################## sub OWAD_GetValues($) { my $hash = shift; my $name = $hash->{NAME}; my $model = $hash->{OW_MODEL}; my $interface= $hash->{IODev}->{TYPE}; my $value = ""; my $ret = ""; my $offset; my $factor; #-- define warnings my $warn = "none"; $hash->{ALARM} = "0"; #-- restart timer for updates RemoveInternalTimer($hash); InternalTimer(time()+$hash->{INTERVAL}, "OWAD_GetValues", $hash, 1); #-- reset presence $hash->{PRESENT} = 0; #-- Get readings, alarms and stati according to interface type if( $interface eq "OWX" ){ $ret = OWXAD_GetPage($hash,"reading"); $ret = OWXAD_GetPage($hash,"alarm"); $ret = OWXAD_GetPage($hash,"status"); #}elsif( $interface eq "OWFS" ){ # $ret = OWFSAD_GetValues($hash); }else{ return "OWAD: GetValues with wrong IODev type $interface"; } #-- process results if( defined($ret) ){ return "OWAD: Could not get values from device $name, reason $ret"; } $hash->{PRESENT} = 1; $value=OWAD_FormatValues($hash); Log 5, $value; return undef; } ####################################################################################### # # OWAD_Set - Set one value for device # # Parameter hash = hash of device addressed # a = argument array # ######################################################################################## sub OWAD_Set($@) { my ($hash, @a) = @_; my $key = $a[1]; my $value = $a[2]; #-- for the selector: which values are possible if (@a == 2){ my $newkeys = join(" ", sort keys %sets); for( my $i=0;$i{NAME}; my $model = $hash->{OW_MODEL}; #-- set new timer interval if($key eq "interval") { # check value return "OWAD: Set with short interval, must be > 1" if(int($value) < 1); # update timer $hash->{INTERVAL} = $value; RemoveInternalTimer($hash); InternalTimer(gettimeofday()+$hash->{INTERVAL}, "OWAD_GetValues", $hash, 1); return undef; } #-- find out which channel we have my $tc =$key; if( $tc =~ s/(.*)(Alarm|Low|High)/$channel=$1/se ) { for (my $i=0;$i{IODev}->{TYPE}; #-- check alarm values if( $key =~ m/(.*)(Alarm)/ ) { return "OWAD: Set with wrong value $value for $key, allowed is none/low/high/both" if($value ne "none" && $value ne "low" && $value ne "high" && $value ne "both"); if( $value eq "low" || $value eq "both" ){ $owg_slow[$channo]=1; } else{ $owg_slow[$channo]=0; } if( $value eq "high" || $value eq "both" ){ $owg_shigh[$channo]=1; } else{ $owg_shigh[$channo]=0; } #-- OWX interface if( $interface eq "OWX" ){ $ret = OWXAD_SetPage($hash,"status"); return $ret if(defined($ret)); #-- OWFS interface #}elsif( $interface eq "OWFS" ){ # $ret = OWFSAD_SetValues($hash,@a); # return $ret # if(defined($ret)); } else { return "OWAD: Set with wrong IODev type $interface"; } }elsif( $key =~ m/(.*)(Low|High)/ ) { #$offset = $attr{$name}{$owg_fixed[$channo]."Offset"}; #$factor = $attr{$name}{$owg_fixed[$channo]."Factor"}; #-- find upper and lower boundaries for given offset/factor my $mmin = 0.0; #$mmin += $offset if ( $offset ); #$mmin *= $factor if ( $factor ); my $mmax = $owg_range[$channo]/1000; #$mmax += $offset if ( $offset ); #$mmax *= $factor if ( $factor ); return sprintf("OWAD: Set with wrong value $value for $key, range is [%3.1f,%3.1f]",$mmin,$mmax) if($value < $mmin || $value > $mmax); #$value /= $factor if ( $factor ); #$value -= $offset if ( $offset ); #-- round to those numbers understood by the device my $value2 = int($value*255000/$owg_range[$channo])*$owg_range[$channo]/255000; #-- set alarm value in the device if( $key =~ m/(.*)Low/ ){ $owg_vlow[$channo] = $value2; } elsif( $key =~ m/(.*)High/ ){ $owg_vhigh[$channo] = $value2; } #-- OWX interface if( $interface eq "OWX" ){ $ret = OWXAD_SetPage($hash,"alarm"); return $ret if(defined($ret)); #-- OWFS interface #}elsif( $interface eq "OWFS" ){ # $ret = OWFSAD_SetValues($hash,@a); # return $ret # if(defined($ret)); } else { return "OWAD: Set with wrong IODev type $interface"; } } #-- process results - we have to reread the device $hash->{PRESENT} = 1; OWAD_GetValues($hash); OWAD_FormatValues($hash); Log 4, "OWAD: Set $hash->{NAME} $key $value"; return undef; } ######################################################################################## # # OWAD_Undef - Implements UndefFn function # # Parameter hash = hash of device addressed # ######################################################################################## sub OWAD_Undef ($) { my ($hash) = @_; delete($modules{OWAD}{defptr}{$hash->{OW_ID}}); RemoveInternalTimer($hash); return undef; } ######################################################################################## # # The following subroutines in alphabetical order are only for a 1-Wire bus connected # via OWFS # # Prefix = OWFSAD # ######################################################################################## ######################################################################################## # # The following subroutines in alphabetical order are only for a 1-Wire bus connected # directly to the FHEM server # # Prefix = OWXAD # ######################################################################################## # # OWXAD_GetPage - Get one memory page from device # # Parameter hash = hash of device addressed # page = "reading", "alarm" or "status" # ######################################################################################## sub OWXAD_GetPage($$) { my ($hash,$page) = @_; my ($select, $res, $res2, $res3, @data); #-- ID of the device, hash of the busmaster my $owx_dev = $hash->{ROM_ID}; my $master = $hash->{IODev}; my ($i,$j,$k); #=============== get the voltage reading =============================== if( $page eq "reading") { OWX_Reset($master); #-- issue the match ROM command \x55 and the start conversion command $res= OWX_Complex($master,$owx_dev,"\x3C\x0F\x00\xFF\xFF",0); if( $res eq 0 ){ return "not accessible for conversion"; } #-- conversion needs some 5 ms per channel select(undef,undef,undef,0.02); #-- issue the match ROM command \x55 and the read conversion page command # \xAA\x00\x00 $select="\xAA\x00\x00"; #=============== get the alarm reading =============================== } elsif ( $page eq "alarm" ) { #-- issue the match ROM command \x55 and the read alarm page command # \xAA\x10\x00 $select="\xAA\x10\x00"; #=============== get the status reading =============================== } elsif ( $page eq "status" ) { #-- issue the match ROM command \x55 and the read status memory page command # \xAA\x08\x00 r $select="\xAA\x08\x00"; #=============== wrong value requested =============================== } else { return "wrong memory page requested"; } #-- reset the bus OWX_Reset($master); #-- reading 9 + 3 + 8 data bytes and 2 CRC bytes = 22 bytes $res=OWX_Complex($master,$owx_dev,$select,10); if( $res eq 0 ){ return "not accessible in reading $page page"; } #-- reset the bus OWX_Reset($master); #-- process results @data=split(//,substr($res,9)); return "invalid data length, ".int(@data)." instead of 13 bytes" if (@data != 13); #return "invalid data" # if (ord($data[17])<=0); return "invalid CRC" if (OWX_CRC16(substr($res,9,11),$data[11],$data[12])==0); #=============== get the voltage reading =============================== if( $page eq "reading"){ for( $i=0;$i{ROM_ID}; my $master = $hash->{IODev}; my ($i,$j,$k); #=============== set the alarm values =============================== if ( $page eq "alarm" ) { #-- issue the match ROM command \x55 and the set alarm page command # \x55\x10\x00 reading 8 data bytes and 2 CRC bytes $select="\x55\x10\x00"; for( $i=0;$i 2550 ); } else { $sb1 = 128; $sb2 = 0; } $select .= sprintf "%c\xFF\xFF\xFF",$sb1; $select .= sprintf "%c\xFF\xFF\xFF",$sb2; } #=============== wrong page write attempt =============================== } else { return "OWXAD: Wrong memory page write attempt"; } OWX_Reset($master); $res=OWX_Complex($master,$owx_dev,$select,0); #-- process results if( $res eq 0 ){ return "OWXAD: Device $owx_dev not accessible for writing"; } return undef; } 1; =pod =begin html

OWAD

FHEM module to commmunicate with 1-Wire A/D converters

Note:
This 1-Wire module so far works only with the OWX interface module. Please define an OWX device first.


Example

define OWX_AD OWAD 724610000000 45
attr OWX_AD DAlarm high
attr OWX_AD DFactor 31.907097
attr OWX_AD DHigh 50.0
attr OWX_AD DName RelHumidity|humidity
attr OWX_AD DOffset -0.8088
attr OWX_AD DUnit percent|%


Define

define <name> OWAD [<model>] <id> [<interval>]

Define a 1-Wire A/D converter.

  • [<model>]
    Defines the A/D converter model (and thus 1-Wire family id), currently the following values are permitted:
    • model DS2450 with family id 20 (default if the model parameter is omitted)
  • <id>
    12-character unique ROM id of the converter device without family id and CRC code
  • <interval>
    Measurement interval in seconds. The default is 300 seconds.

Set


Get


Attributes

For each of the following attributes, the channel identification A,B,C,D may be used. =end html =cut