From 1195ea6763af3fdc7567298e7713a794e91dce9f Mon Sep 17 00:00:00 2001 From: pahenning <> Date: Thu, 25 Oct 2012 17:00:12 +0000 Subject: [PATCH] git-svn-id: https://svn.fhem.de/fhem/trunk@2017 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/contrib/1-Wire/00_OWX.pm | 2083 ----------------- fhem/contrib/1-Wire/21_OWAD.pm | 1024 -------- fhem/contrib/1-Wire/21_OWCOUNT.pm | 1020 -------- fhem/contrib/1-Wire/21_OWID.pm | 212 -- fhem/contrib/1-Wire/21_OWLCD.pm | 1037 -------- fhem/contrib/1-Wire/21_OWMULTI.pm | 850 ------- fhem/contrib/1-Wire/21_OWSWITCH.pm | 894 ------- fhem/contrib/1-Wire/21_OWTHERM.pm | 815 ------- fhem/contrib/1-Wire/LCD_Terminal1.png | Bin 89714 -> 0 bytes fhem/contrib/1-Wire/LCD_Terminal2.png | Bin 215618 -> 0 bytes .../Schaltplan_Aktives_1-Wire_Interface.png | Bin 19686 -> 0 bytes .../Schaltplan_Passives_1-Wire_Interface.png | Bin 29208 -> 0 bytes .../Schaltplan_USB_1-Wire_Interface.png | Bin 41324 -> 0 bytes fhem/contrib/1-Wire/commandref.html | 786 ------- 14 files changed, 8721 deletions(-) delete mode 100644 fhem/contrib/1-Wire/00_OWX.pm delete mode 100644 fhem/contrib/1-Wire/21_OWAD.pm delete mode 100644 fhem/contrib/1-Wire/21_OWCOUNT.pm delete mode 100644 fhem/contrib/1-Wire/21_OWID.pm delete mode 100644 fhem/contrib/1-Wire/21_OWLCD.pm delete mode 100644 fhem/contrib/1-Wire/21_OWMULTI.pm delete mode 100644 fhem/contrib/1-Wire/21_OWSWITCH.pm delete mode 100755 fhem/contrib/1-Wire/21_OWTHERM.pm delete mode 100755 fhem/contrib/1-Wire/LCD_Terminal1.png delete mode 100755 fhem/contrib/1-Wire/LCD_Terminal2.png delete mode 100644 fhem/contrib/1-Wire/Schaltplan_Aktives_1-Wire_Interface.png delete mode 100644 fhem/contrib/1-Wire/Schaltplan_Passives_1-Wire_Interface.png delete mode 100644 fhem/contrib/1-Wire/Schaltplan_USB_1-Wire_Interface.png delete mode 100755 fhem/contrib/1-Wire/commandref.html diff --git a/fhem/contrib/1-Wire/00_OWX.pm b/fhem/contrib/1-Wire/00_OWX.pm deleted file mode 100644 index 4e4b515cd..000000000 --- a/fhem/contrib/1-Wire/00_OWX.pm +++ /dev/null @@ -1,2083 +0,0 @@ -######################################################################################## -# -# OWX.pm -# -# TODO: Abfangen, wenn das Serial Device nach Öffnung nicht existiert ??? -# set init als rediscover ausführen. -# ungültige ID's von ungültigen devices => rauswerfen. -# -# FHEM module to commmunicate with 1-Wire bus devices -# * via an active DS2480/DS2482/DS2490/DS9097U bus master interface attached to an USB port -# * via a passive DS9097 interface attached to an USB port -# * via a network-attached CUNO -# Internally these interfaces are vastly different, read the corresponding Wiki pages -# http://fhemwiki.de/wiki/Interfaces_f%C3%BCr_1-Wire -# -# Version 2.24 - October, 2012 -# -# Prof. Dr. Peter A. Henning, 2012 -# -# define OWX for USB interfaces or -# define OWX for a CUNO or COC interface -# -# where may be replaced by any name string -# is a serial (USB) device -# is a CUNO or COC device -# -# get alarms => find alarmed 1-Wire devices (not with CUNO) -# get devices => find all 1-Wire devices -# -# set interval => set period for temperature conversion and alarm testing -# set followAlarms on/off => determine whether an alarm is followed by a search for -# alarmed devices -# -# attr buspower real/parasitic - whether the 1-Wire bus is really powered or -# the 1-Wire devices take their power from the data wire (parasitic is default !) -# -# Ordering of subroutines in this module -# 1. Subroutines independent of bus interface type -# 2. Subroutines for a specific type of the interface -# -######################################################################################## -# -# 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 strict; -use warnings; -use Device::SerialPort; -use vars qw{%attr %defs}; - -require "$attr{global}{modpath}/FHEM/DevIo.pm"; - -sub Log($$); - -# Line counter -my $cline=0; - -# These we may get on request -my %gets = ( - "alarms" => "A", - "devices" => "D" -); - -# These occur in a pulldown menu as settable values for the bus master -my %sets = ( - "interval" => "T", - "followAlarms" => "F" -); - -# These are attributes -my %attrs = ( -); - -#-- some globals needed for the 1-Wire module -my $owx_hwdevice; -#-- baud rate serial interface -my $owx_baud=9600; -#-- Debugging 0,1,2,3 -my $owx_debug=0; -#-- bus master mode -my $owx_mode="undef"; -#-- bus interface -my $owx_interface=""; -#-- 8 byte 1-Wire device address -my @owx_ROM_ID =(0,0,0,0 ,0,0,0,0); -#-- List of addresses found on the bus -my @owx_devs=(); -my @owx_fams=(); -my @owx_alarm_devs=(); -#-- 16 byte search string -my @owx_search=(0,0,0,0 ,0,0,0,0, 0,0,0,0, 0,0,0,0); -#-- search state for 1-Wire bus search -my $owx_LastDiscrepancy = 0; -my $owx_LastFamilyDiscrepancy = 0; -my $owx_LastDeviceFlag = 0; - -######################################################################################## -# -# The following subroutines are independent of the bus interface -# -######################################################################################## -# -# OWX_Initialize -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWX_Initialize ($) { - my ($hash) = @_; - #-- Provider - $hash->{Clients} = ":OWAD:OWCOUNT:OWID:OWLCD:OWMULTI:OWSWITCH:OWTHERM:"; - - #-- Normal Devices - $hash->{DefFn} = "OWX_Define"; - $hash->{UndefFn} = "OWX_Undef"; - $hash->{GetFn} = "OWX_Get"; - $hash->{SetFn} = "OWX_Set"; - $hash->{AttrList}= "loglevel:0,1,2,3,4,5,6 buspower:real,parasitic"; -} - -######################################################################################## -# -# OWX_Define - Implements DefFn function -# -# Parameter hash = hash of device addressed, def = definition string -# -######################################################################################## - -sub OWX_Define ($$) { - my ($hash, $def) = @_; - my @a = split("[ \t][ \t]*", $def); - - #-- check syntax - if(int(@a) < 3){ - return "OWX: Syntax error - must be define OWX" - } - - #-- check syntax - Log 1,"OWX: Warning - Some parameter(s) ignored, must be define OWX |" - if(int(@a) > 3); - #-- If this line contains 3 parameters, it is the bus master definition - my $dev = $a[2]; - - #-- TODO: what should we do when the specified device name contains @ already ? - $hash->{DeviceName} = $dev."\@9600"; - #-- Dummy 1-Wire ROM identifier - $hash->{ROM_ID} = "FF"; - - #-- First step: check if we have a directly connected serial interface or a CUNO/COC attached - # (mod suggested by T.Faust) - if ( $dev =~ m/\/dev\/.*/ ){ - #-- TODO: what should we do when the specified device name contains @ already ? - $hash->{DeviceName} = $dev."\@9600"; - #-- Second step in case of serial device: open the serial device to test it - my $msg = "OWX: Serial device $dev"; - my $ret = DevIo_OpenDev($hash,0,undef); - $owx_hwdevice = $hash->{USBDev}; - if(!defined($owx_hwdevice)){ - Log 1, $msg." not defined"; - return "OWX: Can't open serial device $dev: $!" - } else { - Log 1,$msg." defined"; - } - $owx_hwdevice->reset_error(); - $owx_hwdevice->baudrate(9600); - $owx_hwdevice->databits(8); - $owx_hwdevice->parity('none'); - $owx_hwdevice->stopbits(1); - $owx_hwdevice->handshake('none'); - $owx_hwdevice->write_settings; - #-- store with OWX device - $hash->{INTERFACE} = "serial"; - $hash->{HWDEVICE} = $owx_hwdevice; - - #-- sleeping for some time - select(undef,undef,undef,0.1); - - } else { - $hash->{DeviceName} = $dev; - #-- Second step in case of CUNO: See if we can open it - my $msg = "OWX: CUNO/COC device $dev"; - $owx_hwdevice = $main::defs{$dev}; - if($owx_hwdevice){ - Log 1,$msg." defined"; - #-- store with OWX device - $hash->{INTERFACE} = "CUNO"; - $hash->{HWDEVICE} = $owx_hwdevice; - #-- reset the 1-Wire system in CUNO - CUL_SimpleWrite($owx_hwdevice, "Oi"); - }else{ - Log 1, $msg." not defined"; - return "OWX: Can't open CUNO/COC device $dev: $!" - } - } - #-- Third step: see, if a bus interface is detected - if (!OWX_Detect($hash)){ - $hash->{STATE} = "Failed"; - $hash->{PRESENT} = 0; - $init_done = 1; - return undef; - } - - #-- In 10 seconds discover all devices on the 1-Wire bus - InternalTimer(gettimeofday()+10, "OWX_Discover", $hash,0); - - #-- Default settings - $hash->{interval} = 300; # kick every minute - $hash->{followAlarms} = "off"; - $hash->{ALARMED} = "no"; - - #-- InternalTimer blocks if init_done is not true - my $oid = $init_done; - $hash->{PRESENT} = 1; - $hash->{STATE} = "Initialized"; - $init_done = 1; - #-- Intiate first alarm detection and eventually conversion in a minute or so - InternalTimer(gettimeofday() + $hash->{interval}, "OWX_Kick", $hash,1); - $init_done = $oid; - $hash->{STATE} = "Active"; - return undef; -} - -######################################################################################## -# -# OWX_Alarms - Find devices on the 1-Wire bus, -# which have the alarm flag set -# -# Parameter hash = hash of bus master -# -# Return 1 : OK -# 0 : no device present -# -######################################################################################## - -sub OWX_Alarms ($) { - my ($hash) = @_; - my $name = $hash->{NAME}; - my @owx_alarm_names=(); - - #-- Discover all alarmed devices on the 1-Wire bus - @owx_alarm_devs=(); - my $res = OWX_First_SER($hash,"alarm"); - while( $owx_LastDeviceFlag==0 && $res != 0){ - $res = $res & OWX_Next_SER($hash,"alarm"); - } - if( @owx_alarm_devs == 0){ - return "OWX: No alarmed 1-Wire devices found on bus $name"; - } - - #-- walk through all the devices to get their proper fhem names - foreach my $fhem_dev (sort keys %main::defs) { - #-- skip if busmaster - next if( $name eq $main::defs{$fhem_dev}{NAME} ); - #-- all OW types start with OW - next if( substr($main::defs{$fhem_dev}{TYPE},0,2) ne "OW"); - foreach my $owx_dev (@owx_alarm_devs) { - #-- two pieces of the ROM ID found on the bus - my $owx_rnf = substr($owx_dev,3,12); - my $owx_f = substr($owx_dev,0,2); - my $id_owx = $owx_f.".".$owx_rnf; - - #-- skip if not in alarm list - if( $owx_dev eq $main::defs{$fhem_dev}{ROM_ID} ){ - $main::defs{$fhem_dev}{STATE} = "Alarmed"; - push(@owx_alarm_names,$main::defs{$fhem_dev}{NAME}); - } - } - } - #-- so far, so good - what do we want to do with this ? - return "OWX: Alarmed 1-Wire devices found on bus $name (".join(",",@owx_alarm_names).")"; -} - -######################################################################################## -# -# OWX_Complex - Send match ROM, data block and receive bytes as response -# -# Parameter hash = hash of bus master, -# owx_dev = ROM ID of device -# data = string to send -# numread = number of bytes to receive -# -# Return response, if OK -# 0 if not OK -# -######################################################################################## - -sub OWX_Complex ($$$$) { - my ($hash,$owx_dev,$data,$numread) =@_; - my $name = $hash->{NAME}; - - #-- get the interface - $owx_interface = $hash->{INTERFACE}; - $owx_hwdevice = $hash->{HWDEVICE}; - - #-- interface error - if( !(defined($owx_interface))){ - Log 3,"OWX: Complex called with unknown interface on bus $name"; - return 0; - #-- here we treat the directly connected serial interfaces - }elsif( ($owx_interface eq "DS2480") || ($owx_interface eq "DS9097") ){ - return OWX_Complex_SER($hash,$owx_dev,$data,$numread); - - #-- here we treat the network-connected CUNO - }elsif( $owx_interface eq "CUNO" ){ - return OWX_Complex_CUNO($hash,$owx_dev,$data,$numread); - - #-- interface error - }else{ - Log 3,"OWX: Complex called with unknown interface $owx_interface on bus $name"; - return 0; - } -} - -######################################################################################## -# -# OWX_CRC - Check the CRC8 code of a device address in @owx_ROM_ID -# -# Parameter romid = if not zero, return the CRC8 value instead of checking it -# -######################################################################################## - -my @crc8_table = ( - 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65, - 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220, - 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98, - 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255, - 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7, - 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154, - 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36, - 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185, - 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205, - 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80, - 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238, - 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115, - 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139, - 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22, - 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168, - 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53); - - -sub OWX_CRC ($) { - my ($romid) = @_; - my $crc8=0; - - if( $romid eq "0" ){ - for(my $i=0; $i<8; $i++){ - $crc8 = $crc8_table[ $crc8 ^ $owx_ROM_ID[$i] ]; - } - return $crc8; - } else { - #-- from search string to byte id - $romid=~s/\.//g; - for(my $i=0;$i<8;$i++){ - $owx_ROM_ID[$i]=hex(substr($romid,2*$i,2)); - } - for(my $i=0; $i<7; $i++){ - $crc8 = $crc8_table[ $crc8 ^ $owx_ROM_ID[$i] ]; - } - return $crc8; - } -} - -######################################################################################## -# -# OWX_CRC - Check the CRC8 code of an a byte string -# -# Parameter string, crc. -# If crc is defined, make a comparison, otherwise output crc8 -# -######################################################################################## - -sub OWX_CRC8 ($$) { - my ($string,$crc) = @_; - my $crc0=ord($crc); - my $crc8=0; - my @strhex; - - for(my $i=0; $i<8; $i++){ - $strhex[$i]=ord(substr($string,$i,1)); - $crc8 = $crc8_table[ $crc8 ^ $strhex[$i] ]; - } - - if( defined($crc) ){ - if ( $crc0 == $crc8 ){ - return 1; - }else{ - return 0; - } - }else{ - return $crc8; - } -} - -######################################################################################## -# -# OWX_CRC16 - Calculate the CRC16 code of a string -# -# TODO UNFINISHED CODE -# -# Parameter crc - previous CRC code, c next character -# -######################################################################################## - -sub OWX_CRC16($) { - my ($data) = @_; - - my $crc=0; - for( my $i=0; $i New CRC value = %x",$crc; - } - return $crc; -} - - -sub OWX_DOCRC16($$) { - my ($crc,$c) = @_; - - #-- polynomial for x^16 + x^15 + x^2 + 1 - my $mask = 0xA001; - - my $i; - for($i=0;$i<8;$i++) { - if(($crc ^ ord($c)) & 1) { - $crc=($crc>>1)^$mask; - } else { - $crc>>=1; - } - $c>>=1; - } - return ($crc); -} - -######################################################################################## -# -# OWX_Detect - Detect 1-Wire interface -# TODO: HAS TO BE SPLIT INTO INTERFACE DEPENDENT AND INDEPENDENT PART -# -# Method rather crude - treated as an 2480, and see whatis returned -# -# Parameter hash = hash of bus master -# -# Return 1 : OK -# 0 : not OK -# -######################################################################################## - -sub OWX_Detect ($) { - my ($hash) = @_; - - my ($i,$j,$k,$l,$res,$ret,$ress); - my $name = $hash->{NAME}; - my $ress0 = "OWX: 1-Wire bus $name: interface "; - $ress = $ress0; - - #-- get the interface - $owx_interface = $hash->{INTERFACE}; - $owx_hwdevice = $hash->{HWDEVICE}; - - #-- here we treat the directly connected serial interfaces - if($owx_interface eq "serial"){ - #-- timing byte for DS2480 - OWX_Query_2480($hash,"\xC1"); - - #-- Max 4 tries to detect an interface - for($l=0;$l<4;$l++) { - #-- write 1-Wire bus (Fig. 2 of Maxim AN192) - $res = OWX_Query_2480($hash,"\x17\x45\x5B\x0F\x91"); - - #-- process 4/5-byte string for detection - if( !defined($res)){ - $res=""; - $ret=0; - }elsif( ($res eq "\x16\x44\x5A\x00\x90") || ($res eq "\x16\x44\x5A\x00\x93")){ - $ress .= "master DS2480 detected for the first time"; - $owx_interface="DS2480"; - $ret=1; - } elsif( $res eq "\x17\x45\x5B\x0F\x91"){ - $ress .= "master DS2480 re-detected"; - $owx_interface="DS2480"; - $ret=1; - } elsif( ($res eq "\x17\x0A\x5B\x0F\x02") || ($res eq "\x00\x17\x0A\x5B\x0F\x02") || ($res eq "\x30\xf8\x00") ){ - $ress .= "passive DS9097 detected"; - $owx_interface="DS9097"; - $ret=1; - } else { - $ret=0; - } - last - if( $ret==1 ); - $ress .= "not found, answer was "; - for($i=0;$i".$ob."<="; - if( !defined($ob)){ - $ob=""; - $ret=0; - }elsif( $ob =~ m/OK.*/){ - $owx_interface="CUNO"; - $ress .= "DS2482 detected in $owx_hwdevice->{NAME}"; - $ret=1; - } else { - $ret=0; - } - last - if( $ret==1 ); - $ress .= "not found, answer was ".$ob; - Log 1, $ress; - $ress = $ress0; - #-- sleeping for some time - select(undef,undef,undef,0.5); - } - if( $ret == 0 ){ - $owx_interface=undef; - $ress .= "in $owx_hwdevice->{NAME} could not be addressed"; - } - } - #-- store with OWX device - $hash->{INTERFACE} = $owx_interface; - Log 1, $ress; - return $ret; -} - -######################################################################################## -# -# OWX_Discover - Discover devices on the 1-Wire bus, -# autocreate devices if not already present -# -# Parameter hash = hash of bus master -# -# Return 1 : OK -# 0 : no device present -# -######################################################################################## - -sub OWX_Discover ($) { - my ($hash) = @_; - my $res; - my $name = $hash->{NAME}; - - #-- get the interface - $owx_interface = $hash->{INTERFACE}; - $owx_hwdevice = $hash->{HWDEVICE}; - - #-- Discover all devices on the 1-Wire bus - @owx_devs=(); - my @owx_names=(); - #-- directly connected interface - if( $owx_interface =~ m/DS.*/ ){ - $res = OWX_First_SER($hash,"discover"); - while( $owx_LastDeviceFlag==0 && $res!=0 ){ - $res = $res & OWX_Next_SER($hash,"discover"); - } - #-- Ask the cuno - }else { - CUL_SimpleWrite($owx_hwdevice, "OCf"); - #-- sleeping for some time - select(undef,undef,undef,3); - CUL_SimpleWrite($owx_hwdevice, "Oc"); - select(undef,undef,undef,0.5); - my $ob = OWX_SimpleRead($owx_hwdevice); - if( $ob ){ - foreach my $dx (split(/\n/,$ob)){ - $dx =~ s/\d+\://; - my $ddx = substr($dx,14,2)."."; - #-- reverse data from culfw - for( my $i=1;$i<7;$i++){ - $ddx .= substr($dx,14-2*$i,2); - } - $ddx .= ".".substr($dx,0,2); - push (@owx_devs,$ddx); - } - } - } - #-- Go through all devices found on this bus - foreach my $owx_dev (@owx_devs) { - #-- three pieces of the ROM ID found on the bus - my $owx_rnf = substr($owx_dev,3,12); - my $owx_f = substr($owx_dev,0,2); - my $owx_crc = substr($owx_dev,15,3); - my $id_owx = $owx_f.".".$owx_rnf; - - my $match = 0; - - #-- Check against all existing devices - foreach my $fhem_dev (sort keys %main::defs) { - #-- skip if busmaster - # next if( $hash->{NAME} eq $main::defs{$fhem_dev}{NAME} ); - #-- all OW types start with OW - next if( substr($main::defs{$fhem_dev}{TYPE},0,2) ne "OW"); - my $id_fhem = substr($main::defs{$fhem_dev}{ROM_ID},0,15); - #-- skip interface device - next if( length($id_fhem) != 15 ); - #-- testing if equal to the one found here - # even with improper family - # Log 1, " FHEM-Device = ".substr($id_fhem,3,12)." OWX discovered device ".substr($id_owx,3,12); - if( substr($id_fhem,3,12) eq substr($id_owx,3,12) ) { - #-- warn if improper family id - if( substr($id_fhem,0,2) ne substr($id_owx,0,2) ){ - Log 1, "OWX: Warning, $fhem_dev is defined with improper family id ".substr($id_fhem,0,2). - ", correcting to ".substr($id_owx,0,2); - $main::defs{$fhem_dev}{OW_FAMILY} = substr($id_owx,0,2); - } - push(@owx_names,$main::defs{$fhem_dev}{NAME}); - #-- replace the ROM ID by the proper value including CRC - $main::defs{$fhem_dev}{ROM_ID}=$owx_dev; - $main::defs{$fhem_dev}{PRESENT}=1; - $match = 1; - last; - } - # - } - - #-- autocreate the device - if( $match==0 ){ - #-- Default name OWX_FF_XXXXXXXXXXXX, default type = OWX_FF - my $name = sprintf "OWX_%s_%s",$owx_f,$owx_rnf; - #-- Family 10 = Temperature sensor, assume DS1820 as default - if( $owx_f eq "10" ){ - CommandDefine(undef,"$name OWTHERM DS1820 $owx_rnf"); - #-- Family 12 = Switch, assume DS2406 as default - }elsif( $owx_f eq "12" ){ - CommandDefine(undef,"$name OWSWITCH DS2406 $owx_rnf"); - #-- Family 1D = Counter/RAM, assume DS2423 as default - }elsif( $owx_f eq "1D" ){ - CommandDefine(undef,"$name OWCOUNT DS2423 $owx_rnf"); - #-- Family 20 = A/D converter, assume DS2450 as default - } elsif( $owx_f eq "20" ){ - CommandDefine(undef,"$name OWAD DS2450 $owx_rnf"); - #-- Family 22 = Temperature sensor, assume DS1822 as default - }elsif( $owx_f eq "22" ){ - CommandDefine(undef,"$name OWTHERM DS1822 $owx_rnf"); - #-- Family 26 = Multisensor, assume DS2438 as default - }elsif( $owx_f eq "26" ){ - CommandDefine(undef,"$name OWMULTI DS2438 $owx_rnf"); - #-- Family 28 = Temperature sensor, assume DS18B20 as default - }elsif( $owx_f eq "28" ){ - CommandDefine(undef,"$name OWTHERM DS18B20 $owx_rnf"); - #-- Family 29 = Switch, assume DS2408 as default - }elsif( $owx_f eq "29" ){ - CommandDefine(undef,"$name OWSWITCH DS2408 $owx_rnf"); - #-- Family 3A = Switch, assume DS2413 as default - }elsif( $owx_f eq "3A" ){ - CommandDefine(undef,"$name OWSWITCH DS2413 $owx_rnf"); - #-- Family FF = LCD display - }elsif( $owx_f eq "FF" ){ - CommandDefine(undef,"$name OWLCD $owx_rnf"); - #-- All unknown families are ID only (ID-Chips have family id 09) - } else { - CommandDefine(undef,"$name OWID $owx_f $owx_rnf"); - } - #-- yes, it is on the bus and therefore present - push(@owx_names,$name); - $main::defs{$name}{PRESENT}=1; - #-- THIS IODev, default room - CommandAttr (undef,"$name IODev $hash->{NAME}"); - CommandAttr (undef,"$name room OWX"); - #-- replace the ROM ID by the proper value - $main::defs{$name}{ROM_ID}=$owx_dev; - } - } - - #-- final step: Undefine all 1-Wire devices which are not on this bus but have this IODev - foreach my $fhem_dev (sort keys %main::defs) { - #-- skip if malformed device - #next if( !defined($main::defs{$fhem_dev}{NAME}) ); - #-- all OW types start with OW - next if( substr($main::defs{$fhem_dev}{TYPE},0,2) ne "OW"); - #-- skip if the device is present. - next if( $main::defs{$fhem_dev}{PRESENT} == 1); - #-- skip if different IODev - next if( $main::defs{$fhem_dev}{IODev}{NAME} ne $hash->{NAME} ); - Log 1, "OWX: Deleting unused 1-Wire device $main::defs{$fhem_dev}{NAME} of type $main::defs{$fhem_dev}{TYPE}"; - CommandDelete(undef,$main::defs{$fhem_dev}{NAME}); - } - Log 1, "OWX: 1-Wire devices found on bus $name: (".join(",",@owx_names).")"; - return "OWX: 1-Wire devices found on bus $name: (".join(",",@owx_names).")"; -} - -######################################################################################## -# -# OWX_Get - Implements GetFn function -# -# Parameter hash = hash of the bus master a = argument array -# -######################################################################################## - -sub OWX_Get($@) { - my ($hash, @a) = @_; - return "OWX: Get needs exactly one parameter" if(@a != 2); - - my $name = $hash->{NAME}; - my $owx_dev = $hash->{ROM_ID}; - - if( $a[1] eq "alarms") { - my $res = OWX_Alarms($hash); - #-- process result - return $res - - } elsif( $a[1] eq "devices") { - my $res = OWX_Discover($hash); - #-- process result - return $res - - } else { - return "OWX: Get with unknown argument $a[1], choose one of ". - join(",", sort keys %gets); - } -} - -######################################################################################## -# -# OWX_Kick - Initiate some processes in all devices -# -# Parameter hash = hash of bus master -# -# Return 1 : OK -# 0 : Not OK -# -######################################################################################## - -sub OWX_Kick($) { - my($hash) = @_; - my $ret; - - #-- Call us in n seconds again. - InternalTimer(gettimeofday()+ $hash->{interval}, "OWX_Kick", $hash,1); - #-- During reset we see if an alarmed device is present. - OWX_Reset($hash); - - #-- Only if we have real power on the bus - if( defined($attr{$hash->{NAME}}{buspower}) && ($attr{$hash->{NAME}}{buspower} eq "real") ){ - #-- issue the skip ROM command \xCC followed by start conversion command \x44 - $ret = OWX_Complex($hash,"","\xCC\x44",0); - if( $ret eq 0 ){ - Log 3, "OWX: Failure in temperature conversion\n"; - return 0; - } - #-- sleeping for some time - select(undef,undef,undef,0.5); - } - return 1; -} - -######################################################################################## -# -# OWX_Reset - Reset the 1-Wire bus -# -# Parameter hash = hash of bus master -# -# Return 1 : OK -# 0 : not OK -# -######################################################################################## - -sub OWX_Reset ($) { - my ($hash)=@_; - - #-- get the interface - $owx_interface = $hash->{INTERFACE}; - $owx_hwdevice = $hash->{HWDEVICE}; - - #-- interface error - if( !(defined($owx_interface))){ - Log 3,"OWX: Reset called with undefined interface"; - return 0; - }elsif( $owx_interface eq "DS2480" ){ - return OWX_Reset_2480($hash); - }elsif( $owx_interface eq "DS9097" ){ - return OWX_Reset_9097($hash); - }elsif( $owx_interface eq "CUNO" ){ - return OWX_Reset_CUNO($hash); - }else{ - Log 3,"OWX: Reset called with unknown interface $owx_interface"; - return 0; - } -} - -######################################################################################## -# -# OWX_Set - Implements SetFn function -# -# Parameter hash , a = argument array -# -######################################################################################## - -sub OWX_Set($@) { - my ($hash, @a) = @_; - my $name = shift @a; - my $res; - - #-- First we need to find the ROM ID corresponding to the device name - my $owx_romid = $hash->{ROM_ID}; - Log 5, "OWX_Set request $name $owx_romid ".join(" ",@a); - - #-- for the selector: which values are possible - return join(" ", sort keys %sets) if(@a != 2); - return "OWX_Set: With unknown argument $a[0], choose one of " . join(" ", sort keys %sets) - if(!defined($sets{$a[0]})); - - #-- Set timer value - if( $a[0] eq "interval" ){ - #-- only values >= 15 secs allowed - if( $a[1] >= 15){ - $hash->{interval} = $a[1]; - $res = 1; - } else { - $res = 0; - } - } - - #-- Set alarm behaviour - if( $a[0] eq "followAlarms" ){ - #-- only values >= 15 secs allowed - if( (lc($a[1]) eq "off") && ($hash->{followAlarms} eq "on") ){ - $hash->{interval} = "off"; - $res = 1; - }elsif( (lc($a[1]) eq "on") && ($hash->{followAlarms} eq "off") ){ - $hash->{interval} = "off"; - $res = 1; - } else { - $res = 0; - } - - } - Log GetLogLevel($name,3), "OWX_Set $name ".join(" ",@a)." => $res"; - DoTrigger($name, undef) if($init_done); - return "OWX_Set => $name ".join(" ",@a)." => $res"; -} - -######################################################################################## -# -# OWX_Undef - Implements UndefFn function -# -# Parameter hash = hash of the bus master, name -# -######################################################################################## - -sub OWX_Undef ($$) { - my ($hash, $name) = @_; - RemoveInternalTimer($hash); - DevIo_CloseDev($hash); - return undef; -} - -######################################################################################## -# -# OWX_Verify - Verify a particular device on the 1-Wire bus -# -# Parameter hash = hash of bus master, dev = 8 Byte ROM ID of device to be tested -# -# Return 1 : device found -# 0 : device not -# -######################################################################################## - -sub OWX_Verify ($$) { - my ($hash,$dev) = @_; - my $i; - - #-- get the interface - $owx_interface = $hash->{INTERFACE}; - $owx_hwdevice = $hash->{HWDEVICE}; - - #-- directly connected interface - if( ($owx_interface eq "DS2480") || ($owx_interface eq "DS9097") ){ - return OWX_Verify_SER($hash,$dev) - #-- Ask the cuno - }elsif( $owx_interface eq "CUNO" ) { - return OWX_Verify_CUNO($hash,$dev) - } else { - Log 1,"OWX: Verify called with unknown interface"; - return 0; - } -} - -######################################################################################## -# -# The following subroutines in alphabetical order are only for direct serial bus interface -# -######################################################################################## -# -# OWX_Complex_SER - Send match ROM, data block and receive bytes as response -# -# Parameter hash = hash of bus master, -# owx_dev = ROM ID of device -# data = string to send -# numread = number of bytes to receive -# -# Return response, if OK -# 0 if not OK -# -######################################################################################## - -sub OWX_Complex_SER ($$$$) { - my ($hash,$owx_dev,$data,$numread) =@_; - - my $select; - my $res = ""; - my $res2 = ""; - my ($i,$j,$k); - - #-- has match ROM part - if( $owx_dev ){ - #-- ID of the device - my $owx_rnf = substr($owx_dev,3,12); - my $owx_f = substr($owx_dev,0,2); - - #-- 8 byte 1-Wire device address - my @owx_ROM_ID =(0,0,0,0 ,0,0,0,0); - #-- from search string to byte id - $owx_dev=~s/\.//g; - for(my $i=0;$i<8;$i++){ - $owx_ROM_ID[$i]=hex(substr($owx_dev,2*$i,2)); - } - $select=sprintf("\x55%c%c%c%c%c%c%c%c",@owx_ROM_ID).$data; - #-- has no match ROM part - } else { - $select=$data; - } - #-- has receive data part - if( $numread >0 ){ - #$numread += length($data); - for( my $i=0;$i<$numread;$i++){ - $select .= "\xFF"; - }; - } - - #-- for debugging - if( $owx_debug > 1){ - $res2 = "OWX_Complex_SER: Sending out "; - for($i=0;$i 1){ - $res2 = "OWX_Complex_SER: Receiving "; - for($i=0;$i{HWDEVICE}; - $owx_hwdevice->baudrate($owx_baud); - $owx_hwdevice->write_settings; - - if( $owx_debug > 2){ - my $res = "OWX: Sending out "; - for($i=0;$iwrite($cmd); - - Log 1, "OWX: Write incomplete $count_out ne ".(length($cmd))."" if ( $count_out != length($cmd) ); - #-- sleeping for some time - select(undef,undef,undef,0.04); - - #-- read the data - my ($count_in, $string_in) = $owx_hwdevice->read(48); - - if( $owx_debug > 2){ - my $res = "OWX: Receiving "; - for($i=0;$i<$count_in;$i++){ - $j=int(ord(substr($string_in,$i,1))/16); - $k=ord(substr($string_in,$i,1))%16; - $res.=sprintf "0x%1x%1x ",$j,$k; - } - Log 3, $res; - } - - #-- sleeping for some time - select(undef,undef,undef,0.04); - return($string_in); -} - -######################################################################################## -# -# OWX_Reset_2480 - Reset the 1-Wire bus (Fig. 4 of Maxim AN192) -# -# Parameter hash = hash of bus master -# -# Return 1 : OK -# 0 : not OK -# -######################################################################################## - -sub OWX_Reset_2480 ($) { - - my ($hash)=@_; - my $cmd=""; - - my ($res,$r1,$r2); - #-- if necessary, prepend \xE3 character for command mode - if( $owx_mode ne "command" ){ - $cmd = "\xE3"; - } - #-- Reset command \xC5 - $cmd = $cmd."\xC5"; - #-- write 1-Wire bus - $res =OWX_Query_2480($hash,$cmd); - - #-- if not ok, try for max. a second time - $r1 = ord(substr($res,0,1)) & 192; - if( $r1 != 192){ - #Log 1, "Trying second reset"; - $res =OWX_Query_2480($hash,$cmd); - } - - #-- process result - $r1 = ord(substr($res,0,1)) & 192; - if( $r1 != 192){ - Log 3, "OWX: Reset failure"; - return 0; - } - $hash->{ALARMED} = "no"; - - $r2 = ord(substr($res,0,1)) & 3; - - if( $r2 == 3 ){ - #Log 3, "OWX: No presence detected"; - return 1; - }elsif( $r2 ==2 ){ - Log 1, "OWX: Alarm presence detected"; - $hash->{ALARMED} = "yes"; - } - return 1; -} - -######################################################################################## -# -# OWX_Search_2480 - Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing -# search state. -# -# Parameter hash = hash of bus master, mode=alarm,discover or verify -# -# Return 1 : device found, ROM number in owx_ROM_ID and pushed to list (LastDeviceFlag=0) -# or only in owx_ROM_ID (LastDeviceFlag=1) -# 0 : device not found, or ot searched at all -# -######################################################################################## - -sub OWX_Search_2480 ($$) { - my ($hash,$mode)=@_; - - my ($sp1,$sp2,$response,$search_direction,$id_bit_number); - - #-- Response search data parsing operates bytewise - $id_bit_number = 1; - - select(undef,undef,undef,0.5); - - #-- clear 16 byte of search data - @owx_search=(0,0,0,0 ,0,0,0,0, 0,0,0,0, 0,0,0,0); - #-- Output search data construction (Fig. 9 of Maxim AN192) - # operates on a 16 byte search response = 64 pairs of two bits - while ( $id_bit_number <= 64) { - #-- address single bits in a 16 byte search string - my $newcpos = int(($id_bit_number-1)/4); - my $newimsk = ($id_bit_number-1)%4; - #-- address single bits in a 8 byte id string - my $newcpos2 = int(($id_bit_number-1)/8); - my $newimsk2 = ($id_bit_number-1)%8; - - if( $id_bit_number <= $owx_LastDiscrepancy){ - #-- first use the ROM ID bit to set the search direction - if( $id_bit_number < $owx_LastDiscrepancy ) { - $search_direction = ($owx_ROM_ID[$newcpos2]>>$newimsk2) & 1; - #-- at the last discrepancy search into 1 direction anyhow - } else { - $search_direction = 1; - } - #-- fill into search data; - $owx_search[$newcpos]+=$search_direction<<(2*$newimsk+1); - } - #--increment number - $id_bit_number++; - } - #-- issue data mode \xE1, the normal search command \xF0 or the alarm search command \xEC - # and the command mode \xE3 / start accelerator \xB5 - if( $mode ne "alarm" ){ - $sp1 = "\xE1\xF0\xE3\xB5"; - } else { - $sp1 = "\xE1\xEC\xE3\xB5"; - } - #-- issue data mode \xE1, device ID, command mode \xE3 / end accelerator \xA5 - $sp2=sprintf("\xE1%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\xE3\xA5",@owx_search); - $response = OWX_Query_2480($hash,$sp1); - $response = OWX_Query_2480($hash,$sp2); - - #-- interpret the return data - if( length($response)!=16 ) { - Log 3, "OWX: Search 2nd return has wrong parameter with length = ".length($response).""; - return 0; - } - #-- Response search data parsing (Fig. 11 of Maxim AN192) - # operates on a 16 byte search response = 64 pairs of two bits - $id_bit_number = 1; - #-- clear 8 byte of device id for current search - @owx_ROM_ID =(0,0,0,0 ,0,0,0,0); - - while ( $id_bit_number <= 64) { - #-- adress single bits in a 16 byte string - my $newcpos = int(($id_bit_number-1)/4); - my $newimsk = ($id_bit_number-1)%4; - - #-- retrieve the new ROM_ID bit - my $newchar = substr($response,$newcpos,1); - - #-- these are the new bits - my $newibit = (( ord($newchar) >> (2*$newimsk) ) & 2) / 2; - my $newdbit = ( ord($newchar) >> (2*$newimsk) ) & 1; - - #-- output for test purpose - #print "id_bit_number=$id_bit_number => newcpos=$newcpos, newchar=0x".int(ord($newchar)/16). - # ".".int(ord($newchar)%16)." r$id_bit_number=$newibit d$id_bit_number=$newdbit\n"; - - #-- discrepancy=1 and ROM_ID=0 - if( ($newdbit==1) and ($newibit==0) ){ - $owx_LastDiscrepancy=$id_bit_number; - if( $id_bit_number < 9 ){ - $owx_LastFamilyDiscrepancy=$id_bit_number; - } - } - #-- fill into device data; one char per 8 bits - $owx_ROM_ID[int(($id_bit_number-1)/8)]+=$newibit<<(($id_bit_number-1)%8); - - #-- increment number - $id_bit_number++; - } - return 1; -} - -######################################################################################## -# -# OWX_WriteBytePower_2480 - Send byte to bus with power increase (Fig. 16 of Maxim AN192) -# -# Parameter hash = hash of bus master, dbyte = byte to send -# -# Return 1 : OK -# 0 : not OK -# -######################################################################################## - -sub OWX_WriteBytePower_2480 ($$) { - - my ($hash,$dbyte) =@_; - my $cmd="\x3F"; - my $ret="\x3E"; - #-- if necessary, prepend \xE3 character for command mode - if( $owx_mode ne "command") { - $cmd = "\xE3".$cmd; - } - #-- distribute the bits of data byte over several command bytes - for (my $i=0;$i<8;$i++){ - my $newbit = (ord($dbyte) >> $i) & 1; - my $newchar = 133 | ($newbit << 4); - my $newchar2 = 132 | ($newbit << 4) | ($newbit << 1) | $newbit; - #-- last command byte still different - if( $i == 7){ - $newchar = $newchar | 2; - } - $cmd = $cmd.chr($newchar); - $ret = $ret.chr($newchar2); - } - #-- write 1-Wire bus - my $res = OWX_Query($hash,$cmd); - #-- process result - if( $res eq $ret ){ - Log 5, "OWX: WriteBytePower OK"; - return 1; - } else { - Log 3, "OWX: WriteBytePower failure"; - return 0; - } -} - -######################################################################################## -# -# The following subroutines in alphabetical order are only for a DS9097 bus interface -# -######################################################################################## -# -# OWX_Block_9097 - Send data block ( -# -# Parameter hash = hash of bus master, data = string to send -# -# Return response, if OK -# 0 if not OK -# -######################################################################################## - -sub OWX_Block_9097 ($$) { - my ($hash,$data) =@_; - - my $data2=""; - my $res=0; - for (my $i=0; $i{HWDEVICE}; - $owx_hwdevice->baudrate($owx_baud); - $owx_hwdevice->write_settings; - - if( $owx_debug > 2){ - my $res = "OWX: Sending out "; - for($i=0;$iwrite($cmd); - - Log 1, "OWX: Write incomplete $count_out ne ".(length($cmd))."" if ( $count_out != length($cmd) ); - #-- sleeping for some time - select(undef,undef,undef,0.01); - - #-- read the data - my ($count_in, $string_in) = $owx_hwdevice->read(48); - - if( $owx_debug > 2){ - my $res = "OWX: Receiving "; - for($i=0;$i<$count_in;$i++){ - $j=int(ord(substr($string_in,$i,1))/16); - $k=ord(substr($string_in,$i,1))%16; - $res.=sprintf "0x%1x%1x ",$j,$k; - } - Log 3, $res; - } - - #-- sleeping for some time - select(undef,undef,undef,0.01); - - return($string_in); -} - -######################################################################################## -# -# OWX_ReadBit_9097 - Read 1 bit from 1-wire bus (Fig. 5/6 from Maxim AN214) -# -# Parameter hash = hash of bus master -# -# Return bit value -# -######################################################################################## - -sub OWX_ReadBit_9097 ($) { - my ($hash) = @_; - - #-- set baud rate to 115200 and query!!! - my $sp1="\xFF"; - $owx_baud=115200; - my $res=OWX_Query_9097($hash,$sp1); - $owx_baud=9600; - #-- process result - if( substr($res,0,1) eq "\xFF" ){ - return 1; - } else { - return 0; - } -} - -######################################################################################## -# -# OWX_Reset_9097 - Reset the 1-Wire bus (Fig. 4 of Maxim AN192) -# -# Parameter hash = hash of bus master -# -# Return 1 : OK -# 0 : not OK -# -######################################################################################## - -sub OWX_Reset_9097 ($) { - - my ($hash)=@_; - my $cmd=""; - - #-- Reset command \xF0 - $cmd="\xF0"; - #-- write 1-Wire bus - my $res =OWX_Query_9097($hash,$cmd); - #-- TODO: process result - #-- may vary between 0x10, 0x90, 0xe0 - return 1; -} - -######################################################################################## -# -# OWX_Search_9097 - Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing -# search state. -# -# Parameter hash = hash of bus master, mode=alarm,discover or verify -# -# Return 1 : device found, ROM number in owx_ROM_ID and pushed to list (LastDeviceFlag=0) -# or only in owx_ROM_ID (LastDeviceFlag=1) -# 0 : device not found, or ot searched at all -# -######################################################################################## - -sub OWX_Search_9097 ($$) { - - my ($hash,$mode)=@_; - - my ($sp1,$sp2,$response,$search_direction,$id_bit_number); - - #-- Response search data parsing operates bitwise - $id_bit_number = 1; - my $rom_byte_number = 0; - my $rom_byte_mask = 1; - my $last_zero = 0; - - #-- issue search command - $owx_baud=115200; - $sp2="\x00\x00\x00\x00\xFF\xFF\xFF\xFF"; - $response = OWX_Query_9097($hash,$sp2); - $owx_baud=9600; - #-- issue the normal search command \xF0 or the alarm search command \xEC - #if( $mode ne "alarm" ){ - # $sp1 = 0xF0; - #} else { - # $sp1 = 0xEC; - #} - - #$response = OWX_TouchByte($hash,$sp1); - - #-- clear 8 byte of device id for current search - @owx_ROM_ID =(0,0,0,0 ,0,0,0,0); - - while ( $id_bit_number <= 64) { - #loop until through all ROM bytes 0-7 - my $id_bit = OWX_TouchBit_9097($hash,1); - my $cmp_id_bit = OWX_TouchBit_9097($hash,1); - - #print "id_bit = $id_bit, cmp_id_bit = $cmp_id_bit\n"; - - if( ($id_bit == 1) && ($cmp_id_bit == 1) ){ - #print "no devices present at id_bit_number=$id_bit_number \n"; - next; - } - if ( $id_bit != $cmp_id_bit ){ - $search_direction = $id_bit; - } else { - # hä ? if this discrepancy if before the Last Discrepancy - # on a previous next then pick the same as last time - if ( $id_bit_number < $owx_LastDiscrepancy ){ - if (($owx_ROM_ID[$rom_byte_number] & $rom_byte_mask) > 0){ - $search_direction = 1; - } else { - $search_direction = 0; - } - } else { - # if equal to last pick 1, if not then pick 0 - if ($id_bit_number == $owx_LastDiscrepancy){ - $search_direction = 1; - } else { - $search_direction = 0; - } - } - # if 0 was picked then record its position in LastZero - if ($search_direction == 0){ - $last_zero = $id_bit_number; - # check for Last discrepancy in family - if ($last_zero < 9) { - $owx_LastFamilyDiscrepancy = $last_zero; - } - } - } - # print "search_direction = $search_direction, last_zero=$last_zero\n"; - # set or clear the bit in the ROM byte rom_byte_number - # with mask rom_byte_mask - #print "ROM byte mask = $rom_byte_mask, search_direction = $search_direction\n"; - if ( $search_direction == 1){ - $owx_ROM_ID[$rom_byte_number] |= $rom_byte_mask; - } else { - $owx_ROM_ID[$rom_byte_number] &= ~$rom_byte_mask; - } - # serial number search direction write bit - $response = OWX_WriteBit_9097($hash,$search_direction); - # increment the byte counter id_bit_number - # and shift the mask rom_byte_mask - $id_bit_number++; - $rom_byte_mask <<= 1; - #-- if the mask is 0 then go to new rom_byte_number and - if ($rom_byte_mask == 256){ - $rom_byte_number++; - $rom_byte_mask = 1; - } - $owx_LastDiscrepancy = $last_zero; - } - return 1; -} - -######################################################################################## -# -# OWX_TouchBit_9097 - Write/Read 1 bit from 1-wire bus (Fig. 5-8 from Maxim AN 214) -# -# Parameter hash = hash of bus master -# -# Return bit value -# -######################################################################################## - -sub OWX_TouchBit_9097 ($$) { - my ($hash,$bit) = @_; - - my $sp1; - #-- set baud rate to 115200 and query!!! - if( $bit == 1 ){ - $sp1="\xFF"; - } else { - $sp1="\x00"; - } - $owx_baud=115200; - my $res=OWX_Query_9097($hash,$sp1); - $owx_baud=9600; - #-- process result - my $sp2=substr($res,0,1); - if( $sp1 eq $sp2 ){ - return 1; - }else { - return 0; - } -} - -######################################################################################## -# -# OWX_TouchByte_9097 - Write/Read 8 bit from 1-wire bus -# -# Parameter hash = hash of bus master -# -# Return bit value -# -######################################################################################## - -sub OWX_TouchByte_9097 ($$) { - my ($hash,$byte) = @_; - - my $loop; - my $result=0; - my $bytein=$byte; - - for( $loop=0; $loop < 8; $loop++ ){ - #-- shift result to get ready for the next bit - $result >>=1; - #-- if sending a 1 then read a bit else write 0 - if( $byte & 0x01 ){ - if( OWX_ReadBit_9097($hash) ){ - $result |= 0x80; - } - } else { - OWX_WriteBit_9097($hash,0); - } - $byte >>= 1; - } - return $result; -} - -######################################################################################## -# -# OWX_WriteBit_9097 - Write 1 bit to 1-wire bus (Fig. 7/8 from Maxim AN 214) -# -# Parameter hash = hash of bus master -# -# Return bit value -# -######################################################################################## - -sub OWX_WriteBit_9097 ($$) { - my ($hash,$bit) = @_; - - my $sp1; - #-- set baud rate to 115200 and query!!! - if( $bit ==1 ){ - $sp1="\xFF"; - } else { - $sp1="\x00"; - } - $owx_baud=115200; - my $res=OWX_Query_9097($hash,$sp1); - $owx_baud=9600; - #-- process result - if( substr($res,0,1) eq $sp1 ){ - return 1; - } else { - return 0; - } -} - -######################################################################################## -# -# The following subroutines in alphabetical order are only for a CUNO interface -# -######################################################################################## -# -# OWX_Complex_CUNO - Send match ROM, data block and receive bytes as response -# -# Parameter hash = hash of bus master, -# owx_dev = ROM ID of device -# data = string to send -# numread = number of bytes to receive -# -# Return response, if OK -# 0 if not OK -# -######################################################################################## - -sub OWX_Complex_CUNO ($$$$) { - my ($hash,$owx_dev,$data,$numread) =@_; - - my $select; - my $res = ""; - - #-- has match ROM part - if( $owx_dev ){ - #-- ID of the device - my $owx_rnf = substr($owx_dev,3,12); - my $owx_f = substr($owx_dev,0,2); - - #-- 8 byte 1-Wire device address - my @owx_ROM_ID =(0,0,0,0 ,0,0,0,0); - #-- from search string to reverse string id - $owx_dev=~s/\.//g; - for(my $i=0;$i<8;$i++){ - $owx_ROM_ID[7-$i]=substr($owx_dev,2*$i,2); - } - $select=sprintf("Om%s%s%s%s%s%s%s%s",@owx_ROM_ID); - Log 3,"OWX: Sending match ROM to CUNO ".$select - if( $owx_debug > 1); - CUL_SimpleWrite($owx_hwdevice, $select); - my $ob = OWX_SimpleRead($owx_hwdevice); - #-- padding first 9 bytes into result string, since we have this - # in the serial interfaces as well - $res .= "000000000"; - } - #-- has data part - if ( $data ){ - OWX_Send_CUNO($hash,$data); - $res .= $data; - } - #-- has receive part - if( $numread > 0 ){ - #$numread += length($data); - $res.=OWX_Receive_CUNO($hash,$numread); - } - Log 3,"OWX: returned from CUNO $res" - if( $owx_debug > 1); - return $res; -} - -######################################################################################## -# -# OWX_Receive_CUNO - Read from the CUNO -# -# Parameter: hash = hash of bus master, numread = number of bytes to read -# -# Return: string received from the CUNO -# -######################################################################################## - -sub OWX_Receive_CUNO ($$) { - my ($hash,$numread) = @_; - my $res=""; - my $res2=""; - - for( - my $i=0;$i<$numread;$i++){ - CUL_SimpleWrite($owx_hwdevice, "OrB"); - my $ob = OWX_SimpleRead($owx_hwdevice); - #-- process results - if( !(defined($ob)) ){ - return ""; - #-- four bytes received makes one byte of result - }elsif( length($ob) == 4 ){ - $res .= sprintf("%c",hex(substr($ob,0,2))); - $res2 .= "0x".substr($ob,0,2)." "; - #-- 20 bytes received = leftover from match - }elsif( length($ob) == 20 ){ - $numread++; - }else{ - Log 1,"OWX: Received unexpected number of ".length($ob)." bytes from CUNO/COC"; - } - } - Log 3, "OWX: Receive from CUNO/COC $numread bytes = $res2" - if( $owx_debug > 1); - - return($res); -} - -######################################################################################## -# -# OWX_Reset_CUNO - Reset the 1-Wire bus -# -# Parameter hash = hash of bus master -# -# Return 1 : OK -# 0 : not OK -# -######################################################################################## - -sub OWX_Reset_CUNO ($) { - CUL_SimpleWrite($owx_hwdevice, "ORb"); - my $ob = OWX_SimpleRead($owx_hwdevice); - if( substr($ob,0,4) eq "OK:1" ){ - return 1; - }else{ - return 0 - } -} - -######################################################################################### -# -# OWX_Send_CUNO - Send data block -# -# Parameter hash = hash of bus master, data = string to send -# -# Return response, if OK -# 0 if not OK -# -######################################################################################## - -sub OWX_Send_CUNO ($$) { - my ($hash,$data) =@_; - my ($i,$j,$k); - my $res = ""; - my $res2 = ""; - - for( $i=0;$i 1); -} - -######################################################################################### -# -# OWX_SimpleRead - Reading with retry. -# Suggested in this way by Dirk Tostmann -# -# Parameter hash = hash of device -# -# Return response, if OK -# 0 if not OK -# -######################################################################################## - -sub OWX_SimpleRead($) -{ - my ($hash) = @_; - my $buf = DevIo_DoSimpleRead($owx_hwdevice); - - # Lets' try again: Some drivers return len(0) on the first read... - if(defined($buf) && length($buf) == 0) { - #-- allow some time - select(undef,undef,undef,0.5); - $buf = DevIo_DoSimpleRead($owx_hwdevice); - } - - if(!defined($buf) || length($buf) == 0) { - DevIo_Disconnected($hash); - return undef; - } - return $buf; -} -######################################################################################## -# -# OWX_Verify_CUNO - Verify a particular device on the 1-Wire bus -# -# Parameter hash = hash of bus master, dev = 8 Byte ROM ID of device to be tested -# -# Return 1 : device found -# 0 : device not -# -######################################################################################## - -sub OWX_Verify_CUNO ($$) { - my ($hash,$dev) = @_; - my $i; - - #-- Ask the cuno - CUL_SimpleWrite($owx_hwdevice, "OCf"); - #-- sleeping for some time - select(undef,undef,undef,3); - CUL_SimpleWrite($owx_hwdevice, "Oc"); - my $ob = OWX_SimpleRead($owx_hwdevice); - if( $ob ){ - foreach my $dx (split(/\n/,$ob)){ - $dx =~ s/\d+\://; - my $ddx = substr($dx,14,2)."."; - #-- reverse data from culfw - for( my $i=1;$i<7;$i++){ - $ddx .= substr($dx,14-2*$i,2); - } - $ddx .= ".".substr($dx,0,2); - return 1 if( $dev eq $ddx); - } - return 0; - } else { - return 0; - } -} - -1; diff --git a/fhem/contrib/1-Wire/21_OWAD.pm b/fhem/contrib/1-Wire/21_OWAD.pm deleted file mode 100644 index 17a0caa2b..000000000 --- a/fhem/contrib/1-Wire/21_OWAD.pm +++ /dev/null @@ -1,1024 +0,0 @@ -######################################################################################## -# -# OWAD.pm -# -# WIESO UNINITIALIZED in 623FF -# -# FHEM module to commmunicate with 1-Wire A/D converters DS2450 -# -# Attention: This module may communicate with the OWX module, -# but currently not with the 1-Wire File System OWFS -# -# Prefixes for subroutines of this module: -# OW = General 1-Wire routines Peter Henning) -# OWX = 1-Wire bus master interface (Peter Henning) -# OWFS = 1-Wire file system (??) -# -# Prof. Dr. Peter A. Henning, 2012 -# -# Version 2.24 - October, 2012 -# -# Setup bus device in fhem.cfg as -# -# 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 event on-change/on-update = when to write an event (default= on-update) -# -# attr stateAL0 "" = character string for denoting low normal condition, default is green down triangle -# attr stateAH0 "" = character string for denoting high normal condition, default is green up triangle -# attr stateAL1 "" = character string for denoting low alarm condition, default is red down triangle -# attr stateAH1 "" = character string for denoting high alarm condition, default is red 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 -# attr Offset = offset added to the reading in this channel -# attr Factor = factor multiplied to (reading+offset) in this channel -# 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; - -#-- Prototypes to make komodo happy -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; -my @owg_shigh; -#-- alarm values - always the raw values committed to the device -my @owg_vlow; -my @owg_vhigh; -#-- variables for display strings -my ($stateal1,$stateah1,$stateal0,$stateah0); - -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 ". - "stateAL0 stateAL1 stateAH0 stateAH1 event:on-update,on-change "; - - 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]."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" - # determine CRC Code - only if this is a direct interface - $crc = defined($hash->{IODev}->{INTERFACE}) ? sprintf("%02x",OWX_CRC("20.".$id."00")) : "00"; - - #-- Define device internals - $hash->{ROM_ID} = "20.".$id.$crc; - $hash->{OW_ID} = $id; - $hash->{OW_FAMILY} = "20"; - $hash->{PRESENT} = 0; - $hash->{INTERVAL} = $interval; - - #-- Couple to I/O device - AssignIoPort($hash); - Log 3, "OWAD: Warning, no 1-Wire I/O device found for $name." - if(!defined($hash->{IODev}->{NAME})); - $modules{OWAD}{defptr}{$id} = $hash; - $hash->{STATE} = "Defined"; - 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}; - - $stateal1 = defined($attr{$name}{stateAL1}) ? $attr{$name}{stateAL1} : ""; - $stateah1 = defined($attr{$name}{stateAH1}) ? $attr{$name}{stateAH1} : ""; - $stateal0 = defined($attr{$name}{stateAL0}) ? $attr{$name}{stateAL0} : ""; - $stateah0 = defined($attr{$name}{stateAH0}) ? $attr{$name}{stateAH0} : ""; - - #-- Initial readings - @owg_val = (0.0,0.0,0.0,0.0); - @owg_slow = (0,0,0,0); - @owg_shigh = (0,0,0,0); - - #-- 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,""); - } - - #-- offset and scale factor - my $offset = defined($attr{$name}{$owg_fixed[$i]."Offset"}) ? $attr{$name}{$owg_fixed[$i]."Offset"} : 0.0; - my $factor = defined($attr{$name}{$owg_fixed[$i]."Factor"}) ? $attr{$name}{$owg_fixed[$i]."Factor"} : 1.0; - #-- 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]; - $hash->{READINGS}{"$owg_channel[$i]"}{OFFSET} = $offset; - $hash->{READINGS}{"$owg_channel[$i]"}{FACTOR} = $factor; - - #-- 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; - }; - $owg_vlow[$i] = ($vlow/$factor - $offset); - $owg_vhigh[$i] = ($vhigh/$factor - $offset); - } - - #-- 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"; - } - - #-- Initialize all the display stuff - OWAD_FormatValues($hash); -} - -######################################################################################## -# -# 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); - my ($value1,$value2,$value3) = ("","",""); - my $galarm = 0; - - my $tn = TimeNow(); - - #-- formats for output - for (my $i=0;$i{READINGS}{"$owg_channel[$i]"}{OFFSET}; - $factor = $hash->{READINGS}{"$owg_channel[$i]"}{FACTOR}; - #-- correct values for proper offset, factor - $vval = int(($owg_val[$i] + $offset)*$factor*1000)/1000;; - #-- put into READINGS - $hash->{READINGS}{"$owg_channel[$i]"}{VAL} = $vval; - $hash->{READINGS}{"$owg_channel[$i]"}{TIME} = $tn; - - #-- correct alarm values for proper offset, factor - $vlow = int(($owg_vlow[$i] + $offset)*$factor*1000)/1000; - $vhigh = int(($owg_vhigh[$i] + $offset)*$factor*1000)/1000; - - #-- put into READINGS - $hash->{READINGS}{$owg_channel[$i]."Low"}{VAL} = $vlow; - $hash->{READINGS}{$owg_channel[$i]."Low"}{TIME} = $tn; - $hash->{READINGS}{$owg_channel[$i]."High"}{VAL} = $vhigh; - $hash->{READINGS}{$owg_channel[$i]."High"}{TIME} = $tn; - - #-- string buildup for return value, STATE and alarm - $value1 .= sprintf( "%s: %5.3f %s", $owg_channel[$i], $vval,$hash->{READINGS}{"$owg_channel[$i]"}{UNITABBR}); - $value2 .= sprintf( "%s: %5.2f %s ", $owg_channel[$i], $vval,$hash->{READINGS}{"$owg_channel[$i]"}{UNITABBR}); - $value3 .= sprintf( "%s: " , $owg_channel[$i]); - - #-- Test for alarm condition - #-- alarm signature low - if( $owg_slow[$i] == 0 ) { - #$value2 .= " "; - $value3 .= "-"; - } else { - if( $vval > $vlow ){ - $owg_slow[$i] = 1; - $value2 .= $stateal0; - $value3 .= $stateal0; - } else { - $galarm = 1; - $owg_slow[$i] = 2; - $value2 .= $stateal1; - $value3 .= $stateal1; - } - } - #-- alarm signature high - if( $owg_shigh[$i] == 0 ) { - #$value2 .= " "; - $value3 .= "-"; - } else { - if( $vval < $vhigh ){ - $owg_shigh[$i] = 1; - $value2 .= $stateah0; - $value3 .= $stateah0; - } else { - $galarm = 1; - $owg_shigh[$i] = 2; - $value2 .= $stateah1; - $value3 .= $stateah1; - } - } - - #-- insert comma - if( $i{STATE} = $value2; - #-- alarm - $hash->{ALARM} = $galarm; - $hash->{READINGS}{alarms}{VAL} = $value3; - $hash->{READINGS}{alarms}{TIME} = $tn; - return $value1; -} - -######################################################################################## -# -# OWAD_Get - Implements GetFn function -# -# Parameter hash = hash of device addressed, a = argument array -# -######################################################################################## - -sub OWAD_Get($@) { - my ($hash, @a) = @_; - - my $reading = $a[1]; - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - 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 - my $interface= $hash->{IODev}->{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); - - #-- output string looks differently here - $value = ""; - for (my $i=0;$i{READINGS}{$owg_channel[$i]."Low"}{VAL}, - $hash->{READINGS}{$owg_channel[$i]."High"}{VAL}; - } - return "OWAD: $name.$reading => $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); - return "OWAD: $name.$reading => ".$hash->{READINGS}{alarms}{VAL}; - } -} - -####################################################################################### -# -# 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 $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 - my $interface= $hash->{IODev}->{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"; - } - $hash->{PRESENT} = 1; - - #-- old state, new state - my $oldval = $hash->{STATE}; - $value=OWAD_FormatValues($hash); - my $newval = $hash->{STATE}; - #--logging depends on setting of the event-attribute - Log 5, $value; - my $ev = defined($attr{$name}{"event"}) ? $attr{$name}{"event"} : "on-update"; - if( ($ev eq "on-update") || (($ev eq "on-change") && ($newval ne $oldval)) ){ - $hash->{CHANGED}[0] = $value; - DoTrigger($name, undef); - } - - 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 "OWXAD: Device $owx_dev 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 "OWXAD: 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); - #Log 1, "OWXAD: Device $owx_dev returns data of length ".length($res); - if( $res eq 0 ){ - return "OWXAD: Device $owx_dev not accessible in reading $page page"; - } - - #-- reset the bus - OWX_Reset($master); - - #-- process results - @data=split(//,$res); - return "OWXAD: invalid data length, ".int(@data)." bytes" - if (@data != 22); - #return "invalid data" - # if (ord($data[17])<=0); - #return "invalid CRC" - # if (OWX_CRC8(substr($res,10,8),$data[18])==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<4;$i++){ - $select .= sprintf "%c\xFF\xFF\xFF",int($owg_vlow[$i]*255000/$owg_range[$i]); - $select .= sprintf "%c\xFF\xFF\xFF",int($owg_vhigh[$i]*255000/$owg_range[$i]); - } - #=============== set the status =============================== - } elsif ( $page eq "status" ) { - my ($sb1,$sb2); - #-- issue the match ROM command \x55 and the set status memory page command - # \x55\x08\x00 reading 8 data bytes and 2 CRC bytes - $select="\x55\x08\x00"; - for( $i=0;$i<4;$i++){ - if( $owg_mode[$i] eq "input" ){ - #-- resolution (TODO: check !) - $sb1 = $owg_resoln[$i]-1; - #-- alarm enabled - $sb2 = ( $owg_slow[$i] > 0 ) ? 4 : 0; - $sb2 += ( $owg_shigh[$i] > 0 ) ? 8 : 0; - #-- range - $sb2 |= 1 - if( $owg_range[$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; diff --git a/fhem/contrib/1-Wire/21_OWCOUNT.pm b/fhem/contrib/1-Wire/21_OWCOUNT.pm deleted file mode 100644 index a5f159630..000000000 --- a/fhem/contrib/1-Wire/21_OWCOUNT.pm +++ /dev/null @@ -1,1020 +0,0 @@ -######################################################################################## -# -# OWCOUNT.pm -# -# FHEM module to commmunicate with 1-Wire Counter/RAM DS2423 -# -# Attention: This module may communicate with the OWX module, -# but currently not with the 1-Wire File System OWFS -# -# Prefixes for subroutines of this module: -# OW = General 1-Wire routines Peter Henning) -# OWX = 1-Wire bus master interface (Peter Henning) -# OWFS = 1-Wire file system (??) -# -# Prof. Dr. Peter A. Henning, 2012 -# -# Version 2.24 - October, 2012 -# -# Setup bus device in fhem.cfg as -# -# define OWCOUNT [] [interval] -# -# where may be replaced by any name string -# -# is a 1-Wire device type. If omitted, we assume this to be an -# DS2423 Counter/RAM -# 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 memory => 32 byte string from page 0..13 -# get midnight => todays starting value for counter -# get counter => value for counter -# get counters => values for both counters -# -# set interval => set query interval for measurement -# set memory => 32 byte string into page 0..13 -# set midnight => todays starting value for counter -# set init yes => re-initialize device -# -# Additional attributes are defined in fhem.cfg, in some cases per channel, where =A,B -# Note: attributes are read only during initialization procedure - later changes are not used. -# -# attr event on-change/on-update = when to write an event (default= on-update) -# -# attr UnitInReading = whether the physical unit is written into the reading = 1 (default) or 0 -# attr Name | = name for the channel | a type description for the measured value -# attr Unit | = unit of measurement for this channel | its abbreviation -# attr Offset = offset added to the reading in this channel -# attr Factor = factor multiplied to (reading+offset) in this channel -# attr Mode = counting mode = normal(default) or daily -# attr Period = period for rate calculation = hour (default), minute or second -# -# In normal counting mode each returned counting value will be factor*(reading+offset) -# In daily counting mode each returned counting value will be factor*(reading+offset)-midnight -# where midnight is stored as string in the 32 byte memory associated with the counter -# -# Log Lines -# after each interval : / : / -# example: 2012-07-30_00:07:55 OWX_C Taste: 17.03 p 28.1 p/h B: 7.0 cts 0.0 cts/min -# after midnight : : -# example: 2012-07-30_00:00:57 OWX_C D_29: 2012-7-29_23:59:59 Taste: 110.0 p, B: 7.0 cts -######################################################################################## -# -# 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; - -#-- Prototypes to make komodo happy -use vars qw{%attr %defs}; -use strict; -use warnings; -sub Log($$); - -#-- channel name - fixed is the first array, variable the second -my @owg_fixed = ("A","B"); -my @owg_channel; -my @owg_rate; -#-- channel values - always the raw values from the device -my @owg_val; -my @owg_midnight; -my $owg_str; - -my %gets = ( - "id" => "", - "present" => "", - "interval" => "", - "memory" => "", - "midnight" => "", - "counter" => "", - "counters" => "" -); - -my %sets = ( - "interval" => "", - "memory" => "", - "midnight" => "", - "init" => "" -); - -my %updates = ( - "present" => "", - "counter" => "" -); - - -######################################################################################## -# -# The following subroutines are independent of the bus interface -# -# Prefix = OWCOUNT -# -######################################################################################## -# -# OWCOUNT_Initialize -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWCOUNT_Initialize ($) { - my ($hash) = @_; - - $hash->{DefFn} = "OWCOUNT_Define"; - $hash->{UndefFn} = "OWCOUNT_Undef"; - $hash->{GetFn} = "OWCOUNT_Get"; - $hash->{SetFn} = "OWCOUNT_Set"; - - #-- see header for attributes - my $attlist = "IODev do_not_notify:0,1 showtime:0,1 model:DS2423 loglevel:0,1,2,3,4,5 UnitInReading:0,1 ". - "event:on-update,on-change"; - for( my $i=0;$i{AttrList} = $attlist; -} - -######################################################################################### -# -# OWCOUNT_Define - Implements DefFn function -# -# Parameter hash = hash of device addressed, def = definition string -# -######################################################################################### - -sub OWCOUNT_Define ($$) { - my ($hash, $def) = @_; - - 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 "OWCOUNT: Wrong syntax, must be define OWCOUNT [] [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 = "DS2423"; - $id = $a[2]; - if(int(@a)>=4) { $interval = $a[3]; } - } elsif( $a3 =~ m/^[0-9|a-f|A-F]{12}$/ ) { - $model = $a[2]; - return "OWCOUNT: Wrong 1-Wire device model $model" - if( $model ne "DS2423"); - $id = $a[3]; - if(int(@a)>=5) { $interval = $a[4]; } - } else { - return "OWCOUNT: $a[0] ID $a[2] invalid, specify a 12 digit value"; - } - - #-- 1-Wire ROM identifier in the form "FF.XXXXXXXXXXXX.YY" - # determine CRC Code - only if this is a direct interface - $crc = defined($hash->{IODev}->{INTERFACE}) ? sprintf("%02x",OWX_CRC("1D.".$id."00")) : "00"; - - #-- Define device internals - $hash->{ROM_ID} = "1D.".$id.$crc; - $hash->{OW_ID} = $id; - $hash->{OW_FAMILY} = "1D"; - $hash->{PRESENT} = 0; - $hash->{INTERVAL} = $interval; - - #-- Couple to I/O device - AssignIoPort($hash); - Log 3, "OWCOUNT: Warning, no 1-Wire I/O device found for $name." - if(!defined($hash->{IODev}->{NAME})); - $modules{OWCOUNT}{defptr}{$id} = $hash; - $hash->{STATE} = "Defined"; - Log 3, "OWCOUNT: Device $name defined."; - - #-- Initialization reading according to interface type - my $interface= $hash->{IODev}->{TYPE}; - - #-- Start timer for initialization in a few seconds - InternalTimer(time()+1, "OWCOUNT_InitializeDevice", $hash, 0); - - #-- Start timer for updates - InternalTimer(time()+$hash->{INTERVAL}, "OWCOUNT_GetValues", $hash, 0); - - return undef; -} - -######################################################################################## -# -# OWCOUNT_InitializeDevice - delayed setting of initial readings and channel names -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWCOUNT_InitializeDevice($) { - my ($hash) = @_; - - my $name = $hash->{NAME}; - $hash->{PRESENT} = 0; - - #-- 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"} : "counts|cts"; - my @unarr= split(/\|/,$unit); - if( int(@unarr)!=2 ){ - Log 1, "OWCOUNT: Incomplete channel unit specification $unit. Better use |$unit"; - push(@unarr,""); - } - - #-- rate unit - my $period = defined($attr{$name}{$owg_fixed[$i]."Period"}) ? $attr{$name}{$owg_fixed[$i]."Period"} : "hour"; - - #-- offset and scale factor - my $offset = defined($attr{$name}{$owg_fixed[$i]."Offset"}) ? $attr{$name}{$owg_fixed[$i]."Offset"} : 0; - my $factor = defined($attr{$name}{$owg_fixed[$i]."Factor"}) ? $attr{$name}{$owg_fixed[$i]."Factor"} : 1; - #-- 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]; - $hash->{READINGS}{"$owg_channel[$i]"}{PERIOD} = $period; - $hash->{READINGS}{"$owg_channel[$i]"}{OFFSET} = $offset; - $hash->{READINGS}{"$owg_channel[$i]"}{FACTOR} = $factor; - - $owg_rate[$i] = $cnama[0]."_rate"; - my $runit = ""; - if( $period eq "hour" ){ - $runit = "/h"; - }elsif( $period eq "minute" ){ - $runit = "/min"; - } else { - $runit = "/s"; - } - $hash->{READINGS}{"$owg_rate[$i]"}{TYPE} = $cnama[1]."_rate"; - $hash->{READINGS}{"$owg_rate[$i]"}{UNIT} = $unarr[0].$runit; - $hash->{READINGS}{"$owg_rate[$i]"}{UNITABBR} = $unarr[1].$runit; - #-- some special cases - # Energy/Power - $hash->{READINGS}{"$owg_rate[$i]"}{UNIT} = "kW" - if ($unarr[0].$runit eq "kWh/h" ); - $hash->{READINGS}{"$owg_rate[$i]"}{UNITABBR} = "kW" - if ($unarr[1].$runit eq "kWh/h" ); - #Log 1,"OWCOUNT InitializeDevice with period $period and UNITABBR = ".$hash->{READINGS}{"$owg_rate[$i]"}{UNITABBR}; - - } - - #-- set status according to interface type - my $interface= $hash->{IODev}->{TYPE}; - - #-- OWX interface - if( !defined($interface) ){ - return "OWCOUNT: Interface missing"; - } elsif( $interface eq "OWX" ){ - #-- OWFS interface - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSAD_GetPage($hash,"reading"); - #-- Unknown interface - }else{ - return "OWCOUNT: InitializeDevice with wrong IODev type $interface"; - } - #-- Initialize all the display stuff - OWCOUNT_FormatValues($hash); -} - -######################################################################################## -# -# OWCOUNT_FormatValues - put together various format strings and assemble STATE variable -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWCOUNT_FormatValues($) { - my ($hash) = @_; - - my $name = $hash->{NAME}; - my ($offset,$factor,$period,$unit,$runit,$midnight,$vval,$vrate); - my ($value1,$value2,$value3,$value4,$value5) = ("","","","",""); - my $galarm = 0; - - my $tn = TimeNow(); - my ($sec, $min, $hour, $day, $month, $year, $wday,$yday,$isdst) = localtime(time); - my ($seco,$mino,$houro,$dayo,$montho,$yearo,$dayrest); - my $daybreak = 0; - my $monthbreak = 0; - - my $present = $hash->{PRESENT}; - #-- remove units if they are unwanted - my $unir = defined($attr{$name}{"UnitInReading"}) ? $attr{$name}{"UnitInReading"} : 1; - - #-- formats for output - for (my $i=0;$i{READINGS}{"$owg_channel[$i]"}{OFFSET}; - $factor = $hash->{READINGS}{"$owg_channel[$i]"}{FACTOR}; - $unit = $hash->{READINGS}{"$owg_channel[$i]"}{UNITABBR}; - $period = $hash->{READINGS}{"$owg_channel[$i]"}{PERIOD}; - $runit = $hash->{READINGS}{"$owg_rate[$i]"}{UNITABBR}; - - #-- only if attribute value Mode=daily, take the midnight value from memory - if( defined($attr{$name}{$owg_fixed[$i]."Mode"} )){ - if( $attr{$name}{$owg_fixed[$i]."Mode"} eq "daily"){ - $midnight = $owg_midnight[$i]; - #-- parse float from midnight - $midnight =~ /([\d\.]+)/; - $midnight = 0.0 if(!(defined($midnight))); - } else { - $midnight = 0.0; - } - } else { - $midnight = 0.0; - } - - #-- correct values for proper offset, factor - # careful: midnight value has not been corrected so far ! - #-- 1 decimal - if( $factor == 1.0 ){ - $vval = int(($owg_val[$i] + $offset - $midnight)*10)/10; - #-- 3 decimals - } else { - $vval = int((($owg_val[$i] + $offset)*$factor - $midnight)*1000)/1000; - } - - #-- get the old values - my $oldval = $hash->{READINGS}{"$owg_channel[$i]"}{VAL}; - my $oldtim = $hash->{READINGS}{"$owg_channel[$i]"}{TIME}; - $oldtim = "" if(!defined($oldtim)); - - #-- safeguard against the case where no previous measurement - if( length($oldtim) > 0 ){ - #-- time difference in seconds - ($yearo,$montho,$dayrest) = split(/-/,$oldtim); - $dayo = substr($dayrest,0,2); - ($houro,$mino,$seco) = split(/:/,substr($dayrest,3)); - my $delt = ($hour-$houro)*3600 + ($min-$mino)*60 + ($sec-$seco); - #-- correct time for wraparound at midnight - if( ($delt<0) && ($present==1)){ - $daybreak = 1; - $delt += 86400; - } - #-- correct $vval for wraparound of 32 bit counter - if( ($vval < $oldval) && ($daybreak==0) && ($present==1) ){ - Log 1,"OWCOUNT TODO: Counter wraparound"; - } - - if( $daybreak==1 ){ - #-- linear interpolation - my $dt = ((24-$houro)*3600 -$mino*60 - $seco)/( ($hour+24-$houro)*3600 + ($min-$mino)*60 + ($sec-$seco) ); - my $dv = $oldval*(1-$dt)+$vval*$dt; - #-- correct reading in daily mode - if( $midnight > 0.0 ){ - $vval -= $dv; - $delt *= (1-$dt); - $oldval = 0.0; - } - #-- in any mode store the interpolated value in the midnight store - $midnight += $dv; - OWXCOUNT_SetPage($hash,14+$i,sprintf("%f",$midnight)); - #-- string buildup for monthly logging - $value4 .= sprintf( "%s: %5.1f %s", $owg_channel[$i], $dv,$unit); - if( $day<$dayo ){ - $monthbreak = 1; - Log 1, "OWCOUNT: Change of month"; - #-- string buildup for yearly logging - $value5 .= sprintf( "%s: %5.1f %s", $owg_channel[$i], $dv,$unit); - } - } - #-- rate - if( ($delt > 0.0) && $present ){ - $vrate = ($vval-$oldval)/$delt; - } else { - $vrate = 0.0; - } - #-- correct rate for period setting - if( $period eq "hour" ){ - $vrate*=3600; - }elsif( $period eq "minute" ){ - $vrate*=60; - } - - if( !defined($runit) ){ - Log 1,"OWCOUNT: Error in rate unit definition. i=$i, owg_rate[i]=".$owg_rate[$i]; - $runit = "ERR"; - } - - #-- string buildup for return value and STATE - if( $unir ){ - #-- 1 decimal - if( $factor == 1.0 ){ - $value1 .= sprintf( "%s: %5.1f %s %5.2f %s", $owg_channel[$i], $vval,$unit,$vrate,$runit); - $value2 .= sprintf( "%s: %5.1f %s %5.2f %s", $owg_channel[$i], $vval,$unit,$vrate,$runit); - #-- 3 decimals - } else { - $value1 .= sprintf( "%s: %5.3f %s %5.2f %s", $owg_channel[$i], $vval,$unit,$vrate,$runit); - $value2 .= sprintf( "%s: %5.2f %s %5.2f %s", $owg_channel[$i], $vval,$unit,$vrate,$runit); - } - }else { - #-- 1 decimal - if( $factor == 1.0 ){ - $value1 .= sprintf( "%s: %5.1f %5.2f", $owg_channel[$i], $vval,$vrate); - $value2 .= sprintf( "%s: %5.1f %5.2f", $owg_channel[$i], $vval,$vrate); - #-- 3 decimals - } else { - $value1 .= sprintf( "%s: %5.3f %5.2f", $owg_channel[$i], $vval,$vrate); - $value2 .= sprintf( "%s: %5.2f %5.2f", $owg_channel[$i], $vval,$vrate); - } - } - $value3 .= sprintf( "%s: " , $owg_channel[$i]); - } - #-- put into READINGS - $hash->{READINGS}{"$owg_channel[$i]"}{VAL} = $vval; - #-- but times and rate only when valid - if( $present ){ - $hash->{READINGS}{"$owg_channel[$i]"}{TIME} = $tn; - $hash->{READINGS}{"$owg_rate[$i]"}{VAL} = $vrate; - $hash->{READINGS}{"$owg_rate[$i]"}{TIME} = $tn; - } else { - $hash->{READINGS}{"$owg_channel[$i]"}{TIME} = ""; - $hash->{READINGS}{"$owg_rate[$i]"}{VAL} = ""; - $hash->{READINGS}{"$owg_rate[$i]"}{TIME} = ""; - } - #-- insert comma - if( $i{STATE} = $value2; - - #-- write units as header if they are unwanted in lines - if( $unir == 0 ){ - #TODO: the entry into CHANGED must be into the lowest array position - } - - if( $daybreak == 1 ){ - $value4 = sprintf("D_%d: %d-%d-%d_23:59:59 %s",$dayo,$yearo,$montho,$dayo,$value4); - #-- needs to be higher array elements, - $hash->{CHANGED}[1] = $value4; - Log 1,$name." ".$value4; - if( $monthbreak == 1){ - $value5 = sprintf("M_%d: %d-%d-%d_23:59:59 %s",$montho,$yearo,$montho,$dayo,$value5); - #-- needs to be higher array elements, - $hash->{CHANGED}[2] = $value5; - Log 1,$name." ".$value5; - } - } - return $value1; -} - -######################################################################################## -# -# OWCOUNT_Get - Implements GetFn function -# -# Parameter hash = hash of device addressed, a = argument array -# -######################################################################################## - -sub OWCOUNT_Get($@) { - my ($hash, @a) = @_; - - my $reading = $a[1]; - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - my $value = undef; - my $ret = ""; - my $page; - my $channo = undef; - my $channel; - - #-- check syntax - return "OWCOUNT: Get argument is missing @a" - if(int(@a) < 2); - - #-- check argument - return "OWCOUNT: 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 - #-- TODO: THIS IS TOO STRONG !!! - #$hash->{PRESENT} = 0; - - #-- get memory page/counter according to interface type - my $interface= $hash->{IODev}->{TYPE}; - - #-- check syntax for getting memory page 0..13 or midnight A/B - if( ($reading eq "memory") || ($reading eq "midnight") ){ - if( $reading eq "memory" ){ - return "OWCOUNT: set needs parameter when reading memory: " - if( int(@a)<2 ); - $page=int($a[2]); - if( ($page<0) || ($page>13) ){ - return "OWXCOUNT: Wrong memory page requested"; - } - }else{ - return "OWCOUNT: set needs parameter when reading midnight: " - if( int(@a)<2 ); - #-- find out which channel we have - if( ($a[2] eq $owg_channel[0]) || ($a[2] eq "A") ){ - $page=14; - }elsif( ($a[2] eq $owg_channel[1]) || ($a[2] eq "B") ){ - $page=15; - } else { - return "OWCOUNT: invalid midnight counter address, must be A, B or defined channel name" - } - } - #-- OWX interface - if( $interface eq "OWX" ){ - $ret = OWXCOUNT_GetPage($hash,$page); - #-- OWFS interface - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSAD_GetPage($hash,"reading"); - #-- Unknown interface - }else{ - return "OWCOUNT: Get with wrong IODev type $interface"; - } - #-- when we have a return code, we have an error - if( $ret ){ - return $ret; - }else{ - return "OWCOUNT: $name.$reading [$page] =>".$owg_str; - } - } - - #-- check syntax for getting counter - if( $reading eq "counter" ){ - return "OWCOUNT: get needs parameter when reading counter: " - if( int(@a)<2 ); - #-- find out which channel we have - if( ($a[2] eq $owg_channel[0]) || ($a[2] eq "A") ){ - $page=14; - }elsif( ($a[2] eq $owg_channel[1]) || ($a[2] eq "B") ){ - $page=15; - } else { - return "OWCOUNT: invalid counter address, must be A, B or defined channel name" - } - - #-- OWX interface - if( $interface eq "OWX" ){ - $ret = OWXCOUNT_GetPage($hash,$page); - #-- OWFS interface - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSAD_GetPage($hash,"reading"); - #-- Unknown interface - }else{ - return "OWCOUNT: Get with wrong IODev type $interface"; - } - #-- check syntax for getting counters - }elsif( $reading eq "counters" ){ - return "OWCOUNT: get needs no parameter when reading counters" - if( int(@a)==1 ); - #-- OWX interface - if( $interface eq "OWX" ){ - $ret = OWXCOUNT_GetPage($hash,14); - $ret = OWXCOUNT_GetPage($hash,15); - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSAD_GetValues($hash); - }else{ - return "OWCOUNT: GetValues with wrong IODev type $interface"; - } - } - #-- process results - if( $ret ){ - return "OWCOUNT: Could not get values from device $name"; - } - $hash->{PRESENT} = 1; - return "OWCOUNT: $name.$reading => ".OWCOUNT_FormatValues($hash); - -} - -####################################################################################### -# -# OWCOUNT_GetValues - Updates the reading from one device -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWCOUNT_GetValues($) { - my $hash = shift; - - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - 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}, "OWCOUNT_GetValues", $hash, 1); - - #-- reset presence - maybe this is too strong - $hash->{PRESENT} = 0; - - #-- Get readings according to interface type - my $interface= $hash->{IODev}->{TYPE}; - if( $interface eq "OWX" ){ - $ret = OWXCOUNT_GetPage($hash,14); - $ret = OWXCOUNT_GetPage($hash,15); - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSAD_GetValues($hash); - }else{ - return "OWCOUNT: GetValues with wrong IODev type $interface"; - } - - #-- process results - if( defined($ret) ){ - return "OWCOUNT: Could not get values from device $name"; - } - $hash->{PRESENT} = 1; - - #-- old state, new state - my $oldval = $hash->{STATE}; - $value=OWCOUNT_FormatValues($hash); - my $newval = $hash->{STATE}; - #--logging depends on setting of the event-attribute - Log 5, $value; - my $ev = defined($attr{$name}{"event"}) ? $attr{$name}{"event"} : "on-update"; - if( ($ev eq "on-update") || (($ev eq "on-change") && ($newval ne $oldval)) ){ - $hash->{CHANGED}[0] = $value; - DoTrigger($name, undef); - } - - return undef; -} - -####################################################################################### -# -# OWCOUNT_Set - Set one value for device -# -# Parameter hash = hash of device addressed -# a = argument array -# -######################################################################################## - -sub OWCOUNT_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(" ", keys %sets); - return $newkeys ; - } - - #-- check syntax - return "OWCOUNT: Set needs one parameter" - if( int(@a)!=3 ); - #-- check argument - if( !defined($sets{$a[1]}) ){ - return "OWCOUNT: Set with unknown argument $a[1]"; - } - - #-- define vars - my $ret = undef; - my $page; - my $data; - my $channo = undef; - my $channel; - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - - #-- reset the device - if($key eq "init") { - return "OWCOUNT: init needs parameter 'yes'" - if($value ne "yes"); - OWCOUNT_InitializeDevice($hash); - return "OWCOUNT: Re-initialized device"; - } - - #-- set new timer interval - if($key eq "interval") { - # check value - return "OWCOUNT: Set with short interval, must be > 1" - if(int($value) < 1); - # update timer - $hash->{INTERVAL} = $value; - RemoveInternalTimer($hash); - InternalTimer(gettimeofday()+$hash->{INTERVAL}, "OWCOUNT_GetValues", $hash, 1); - return undef; - } - - #-- set memory page/counter according to interface type - my $interface= $hash->{IODev}->{TYPE}; - - #-- check syntax for setting memory page 0..13 or midnight A/B - if( ($key eq "memory") || ($key eq "midnight") ){ - if( $key eq "memory" ){ - return "OWCOUNT: set needs parameter when writing memory: " - if( int(@a)<2 ); - $page=int($a[2]); - if( ($page<0) || ($page>13) ){ - return "OWXCOUNT: Wrong memory page write attempted"; - } - }else{ - return "OWCOUNT: set needs parameter when writing midnight: " - if( int(@a)<2 ); - #-- find out which channel we have - if( ($a[2] eq $owg_channel[0]) || ($a[2] eq "A") ){ - $page=14; - }elsif( ($a[2] eq $owg_channel[1]) || ($a[2] eq "B") ){ - $page=15; - } else { - return "OWCOUNT: invalid midnight counter address, must be A, B or defined channel name" - } - } - - $data=$a[3]; - for( my $i=4;$i 32 ){ - Log 1,"OWXCOUNT: memory data truncated to 32 characters"; - $data=substr($data,0,32); - }elsif( length($data) < 32 ){ - for(my $i=length($data)-1;$i<32;$i++){ - $data.=" "; - } - } - - #-- OWX interface - if( $interface eq "OWX" ){ - $ret = OWXCOUNT_SetPage($hash,$page,$data); - #-- OWFS interface - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSAD_setPage($hash,$page,$data); - #-- Unknown interface - }else{ - return "OWCOUNT: Set with wrong IODev type $interface"; - } - } - - #-- process results - we have to reread the device - $hash->{PRESENT} = 1; - OWCOUNT_GetValues($hash); - OWCOUNT_FormatValues($hash); - Log 4, "OWCOUNT: Set $hash->{NAME} $key $value"; -} - -######################################################################################## -# -# OWCOUNT_Undef - Implements UndefFn function -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWCOUNT_Undef ($) { - my ($hash) = @_; - delete($modules{OWCOUNT}{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 = OWFSCOUNT -# -######################################################################################## - - - - - -######################################################################################## -# -# The following subroutines in alphabetical order are only for a 1-Wire bus connected -# directly to the FHEM server -# -# Prefix = OWXCOUNT -# -######################################################################################## -# -# OWXAD_GetPage - Get one memory page + counter from device -# -# Parameter hash = hash of device addressed -# page = 0..15 -# -######################################################################################## - -sub OWXCOUNT_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); - - #=============== wrong value requested =============================== - if( ($page<0) || ($page>15) ){ - return "OWXCOUNT: Wrong memory page requested"; - } - #=============== get memory + counter =============================== - #-- issue the match ROM command \x55 and the read memory + counter command - # \xA5 TA1 TA2 reading 40 data bytes and 2 CRC bytes - my $ta2 = ($page*32) >> 8; - my $ta1 = ($page*32) & 255; - #Log 1, "OWXCOUNT: getting page Nr. $ta2 $ta1"; - $select=sprintf("\xA5%c%c",$ta1,$ta2); - #-- reset the bus - OWX_Reset($master); - #-- reading 9 + 3 + 40 data bytes and 2 CRC bytes = 54 bytes - $res=OWX_Complex($master,$owx_dev,$select,42); - if( $res eq 0 ){ - return "OWX: Device $owx_dev not accessible in reading $page page"; - } - - #-- process results - if( length($res) < 54 ) { - #Log 1, "OWXCOUNT: warning, have received ".length($res)." bytes in first step"; - #-- read the data in a second step - $res.=OWX_Complex($master,"","",0); - #-- process results - if( length($res) < 54 ) { - #Log 1, "OWXCOUNT: warning, have received ".length($res)." bytes in second step"; - #-- read the data in a third step - $res.=OWX_Complex($master,"","",0); - } - } - #-- reset the bus - OWX_Reset($master); - - #-- process results - @data=split(//,$res); - return "OWXCOUNT: invalid data length, ".length($res)." bytes in three steps" - if( length($res) < 54); - #return "invalid data" - # if (ord($data[17])<=0); - #return "invalid CRC" - # if (OWX_CRC8(substr($res,10,8),$data[18])==0); - - #-- first 12 byte are 9 ROM ID +3 command, next 32 are memory - #-- memory part, treated as string - $owg_str=substr($res,12,32); - #-- counter part - if( ($page == 14) || ($page == 15) ){ - @data=split(//,substr($res,44)); - if ( ($data[4] | $data[5] | $data[6] | $data[7]) ne "\x00" ){ - Log 1, "OWXCOUNT: Device $owx_dev returns invalid data ".ord($data[4])." ".ord($data[5])." ".ord($data[6])." ".ord($data[7]); - return "OWXCOUNT: Device $owx_dev returns invalid data"; - } - - #-- first ignore memory and only use counter (Fehler gefunden von jamesgo) - my $value = (ord($data[3])<<24) + (ord($data[2])<<16) +(ord($data[1])<<8) + ord($data[0]); - - if( $page == 14) { - $owg_val[0] = $value; - $owg_midnight[0] = $owg_str; - }elsif( $page == 15) { - $owg_val[1] = $value; - $owg_midnight[1] = $owg_str; - } - } - - return undef; -} - -######################################################################################## -# -# OWXCOUNT_SetPage - Set one memory page of device -# -# Parameter hash = hash of device addressed -# page = "alarm" or "status" -# -######################################################################################## - -sub OWXCOUNT_SetPage($$$) { - - my ($hash,$page,$data) = @_; - - my ($select, $res, $res2, $res3); - - #-- ID of the device, hash of the busmaster - my $owx_dev = $hash->{ROM_ID}; - my $master = $hash->{IODev}; - - #=============== wrong value requested =============================== - if( ($page<0) || ($page>15) ){ - return "OWXCOUNT: Wrong memory page requested"; - } - #=============== set memory ========================================= - #-- issue the match ROM command \x55 and the write scratchpad command - # \x0F TA1 TA2 and the read scratchpad command reading 3 data bytes - my $ta2 = ($page*32) >> 8; - my $ta1 = ($page*32) & 255; - #Log 1, "OWXCOUNT: setting page Nr. $ta2 $ta1"; - $select=sprintf("\x0F%c%c",$ta1,$ta2).$data; - #-- reset the bus - OWX_Reset($master); - #-- reading 9 + 3 + 16 bytes = 29 bytes - $res=OWX_Complex($master,$owx_dev,$select,0); - if( $res eq 0 ){ - return "OWX: Device $owx_dev not accessible in writing scratchpad"; - } - - #-- issue the match ROM command \x55 and the read scratchpad command - # \xAA - #-- reset the bus - OWX_Reset($master); - #-- reading 9 + 4 + 16 bytes = 28 bytes - # TODO: sometimes much less than 28 - $res=OWX_Complex($master,$owx_dev,"\xAA",28); - if( length($res) < 13 ){ - return "OWX: Device $owx_dev not accessible in reading scratchpad"; - } - - #-- issue the match ROM command \x55 and the copy scratchpad command - # \x5A followed by 3 byte authentication code - $select="\x5A".substr($res,10,3); - #-- reset the bus - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,6); - - #-- process results - if( $res eq 0 ){ - return "OWXCOUNT: Device $owx_dev not accessible for writing"; - } - - return undef; -} - -1; diff --git a/fhem/contrib/1-Wire/21_OWID.pm b/fhem/contrib/1-Wire/21_OWID.pm deleted file mode 100644 index 45c6c9135..000000000 --- a/fhem/contrib/1-Wire/21_OWID.pm +++ /dev/null @@ -1,212 +0,0 @@ -######################################################################################## -# -# OWID.pm -# -# FHEM module to commmunicate with general 1-Wire ID-ROMS -# -# Attention: This module may communicate with the OWX module, -# but currently not with the 1-Wire File System OWFS -# -# Prefixes for subroutines of this module: -# OW = General 1-Wire routines Peter Henning) -# -# Prof. Dr. Peter A. Henning, 2012 -# -# Version 2.24 - October, 2012 -# -# Setup bus device in fhem.cfg as -# -# define OWID -# -# where may be replaced by any name string -# -# is a 2 character (1 byte) 1-Wire Family ID -# -# is a 12 character (6 byte) 1-Wire ROM ID -# without Family ID, e.g. A2D90D000800 -# -# get id => FAM_ID.ROM_ID.CRC -# get present => 1 if device present, 0 if not -# -# -######################################################################################## -# -# 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; - -#-- Prototypes to make komodo happy -use vars qw{%attr %defs}; -use strict; -use warnings; -sub Log($$); - -#-- declare variables -my %gets = ( - "present" => "", - "id" => "" -); -my %sets = (); -my %updates = (); - -######################################################################################## -# -# The following subroutines are independent of the bus interface -# -# Prefix = OWID -# -######################################################################################## -# -# OWID_Initialize -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWID_Initialize ($) { - my ($hash) = @_; - - $hash->{DefFn} = "OWID_Define"; - $hash->{UndefFn} = "OWID_Undef"; - $hash->{GetFn} = "OWID_Get"; - $hash->{SetFn} = undef; - my $attlist = "IODev do_not_notify:0,1 showtime:0,1 loglevel:0,1,2,3,4,5 "; - $hash->{AttrList} = $attlist; -} - -######################################################################################### -# -# OWID_Define - Implements DefFn function -# -# Parameter hash = hash of device addressed, def = definition string -# -######################################################################################### - -sub OWID_Define ($$) { - my ($hash, $def) = @_; - - #-- define OWID - my @a = split("[ \t][ \t]*", $def); - - my ($name,$fam,$id,$crc,$ret); - - #-- default - $name = $a[0]; - $ret = ""; - - #-- check syntax - return "OWID: Wrong syntax, must be define OWID " - if(int(@a) !=4 ); - - #-- check id - if( $a[2] =~ m/^[0-9|a-f|A-F]{2}$/ ) { - $fam = $a[2]; - } else { - return "OWID: $a[0] family id $a[2] invalid, specify a 2 digit value"; - } - if( $a[3] =~ m/^[0-9|a-f|A-F]{12}$/ ) { - $id = $a[3]; - } else { - return "OWID: $a[0] ID $a[3] invalid, specify a 12 digit value"; - } - - #-- 1-Wire ROM identifier in the form "FF.XXXXXXXXXXXX.YY" - # determine CRC Code YY - 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; - - #-- Couple to I/O device - AssignIoPort($hash); - Log 3, "OWID: Warning, no 1-Wire I/O device found for $name." - if(!defined($hash->{IODev}->{NAME})); - - $modules{OWID}{defptr}{$id} = $hash; - - $hash->{STATE} = "Defined"; - Log 3, "OWID: Device $name defined."; - - #-- Initialization reading according to interface type - my $interface= $hash->{IODev}->{TYPE}; - - $hash->{STATE} = "Initialized"; - return undef; -} - -######################################################################################## -# -# OWID_Get - Implements GetFn function -# -# Parameter hash = hash of device addressed, a = argument array -# -######################################################################################## - -sub OWID_Get($@) { - my ($hash, @a) = @_; - - my $reading = $a[1]; - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - my $value = undef; - my $ret = ""; - my $offset; - my $factor; - - #-- check syntax - return "OWID: Get argument is missing @a" - if(int(@a) != 2); - - #-- check argument - return "OWID: 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"; - } -} - -######################################################################################## -# -# OWID_Undef - Implements UndefFn function -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWID_Undef ($) { - my ($hash) = @_; - delete($modules{OWID}{defptr}{$hash->{OW_ID}}); - RemoveInternalTimer($hash); - return undef; -} - -1; diff --git a/fhem/contrib/1-Wire/21_OWLCD.pm b/fhem/contrib/1-Wire/21_OWLCD.pm deleted file mode 100644 index 2f9c27cfc..000000000 --- a/fhem/contrib/1-Wire/21_OWLCD.pm +++ /dev/null @@ -1,1037 +0,0 @@ -######################################################################################## -# -# OWLCD.pm -# -# FHEM module to commmunicate with the 1-Wire LCD hardware -# -# Attention: This module may communicate with the OWX module, -# but currently not with the 1-Wire File System OWFS -# -# Prefixes for subroutines of this module: -# OW = General 1-Wire routines Peter Henning -# -# Prof. Dr. Peter A. Henning, 2012 -# -# Version 2.24 - October, 2012 -# -# Setup bus device in fhem.cfg as -# -# define OWLCD -# -# where may be replaced by any name string -# -# is a 12 character (6 byte) 1-Wire ROM ID -# without Family ID, e.g. A2D90D000800 -# -# get id => FAM_ID.ROM_ID.CRC -# get present => 1 if device present, 0 if not -# get gpio => current state of the gpio pins (15 = all off, 0 = all on) -# get counter => four values (16 Bit) of the gpio counter -# get version => firmware version of the LCD adapter -# get memory => get one of the internal memory pages 0..6 -# -# set alert red|yellow|beep|none => set one of the alert states (gpio pins) -# set icon on|off|blink => set one of the icons 0..14 -# set icon 15 0..6 => set icon no. 15 in one of its values -# set line => set one of the display lines 0..3 -# set memory set one of the internal memory pages 0..6 -# set gpio => state of the gpio pins 0..7 -# set backlight on|off => set backlight on or off -# set lcd on|off => set LCD power on or off -# set reset => reset the display -# set test => display a test content -# -# Careful: Not ASCII ! strange Codepage -######################################################################################## -# -# 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; - -#-- Prototypes to make komodo happy -use vars qw{%attr %defs}; -use strict; -use warnings; -sub Log($$); - -#-- controller may be HD44780 or KS0073 -# these values have to be changed for different display -# geometries or memory maps -my $lcdcontroller = "KS0073"; -my $lcdlines = 4; -my $lcdchars = 20; -my @lcdpage = (0,32,64,96); -#my @lcdpage = (0,64,20,84); - -#-- declare variables -my %gets = ( - "present" => "", - "id" => "", - "memory" => "", - "gpio" => "", - "counter" => "", - "version" => "", - #"register" => "", - #"data" => "" -); -my %sets = ( - "icon" => "", - "line" => "", - "alert" => "", - "memory" => "", - "gpio" => "", - "backlight" => "", - "lcd" => "", - "reset" => "", - "test" => "" - -); -my %updates = (); - -######################################################################################## -# -# The following subroutines are independent of the bus interface -# -# Prefix = OWLCD -# -######################################################################################## -# -# OWLCD_Initialize -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWLCD_Initialize ($) { - my ($hash) = @_; - - $hash->{DefFn} = "OWLCD_Define"; - $hash->{UndefFn} = "OWLCD_Undef"; - $hash->{GetFn} = "OWLCD_Get"; - $hash->{SetFn} = "OWLCD_Set"; - my $attlist = "IODev do_not_notify:0,1 showtime:0,1 loglevel:0,1,2,3,4,5 ". - ""; - $hash->{AttrList} = $attlist; -} - -######################################################################################### -# -# OWLCD_Define - Implements DefFn function -# -# Parameter hash = hash of device addressed, def = definition string -# -######################################################################################### - -sub OWLCD_Define ($$) { - my ($hash, $def) = @_; - - #-- define OWLCD - my @a = split("[ \t][ \t]*", $def); - - my ($name,$fam,$id,$crc,$ret); - - #-- default - $name = $a[0]; - $ret = ""; - - #-- check syntax - return "OWLCD: Wrong syntax, must be define OWLCD " - if(int(@a) !=3 ); - - #-- check id - if( $a[2] =~ m/^[0-9|a-f|A-F]{12}$/ ) { - $id = $a[2]; - } else { - return "OWLCD: $a[0] ID $a[2] invalid, specify a 12 digit value"; - } - - #-- 1-Wire ROM identifier in the form "FF.XXXXXXXXXXXX.YY" - # determine CRC Code - only if this is a direct interface - $crc = defined($hash->{IODev}->{INTERFACE}) ? sprintf("%02x",OWX_CRC("FF.".$id."00")) : "00"; - - #-- Define device internals - $hash->{ROM_ID} = "FF.".$id.$crc; - $hash->{OW_ID} = $id; - $hash->{OW_FAMILY} = "FF"; - $hash->{PRESENT} = 0; - - #-- Couple to I/O device - AssignIoPort($hash); - Log 3, "OWLCD: Warning, no 1-Wire I/O device found for $name." - if(!defined($hash->{IODev}->{NAME})); - - $modules{OWLCD}{defptr}{$id} = $hash; - - $hash->{STATE} = "Defined"; - Log 3, "OWLCD: Device $name defined."; - - #-- Initialization reading according to interface type - my $interface= $hash->{IODev}->{TYPE}; - #-- OWX interface - if( $interface eq "OWX" ){ - OWXLCD_InitializeDevice($hash); - #-- set backlight on - OWXLCD_SetFunction($hash,"bklon",0); - #-- erase all icons - OWXLCD_SetIcon($hash,0,0); - #-- erase alarm state - OWXLCD_SetFunction($hash,"gpio",15); - #-- Unknown interface - }else{ - return "OWLCD: Wrong IODev type $interface"; - } - $hash->{STATE} = "Initialized"; - return undef; -} - -######################################################################################## -# -# OWLCD_Get - Implements GetFn function -# -# Parameter hash = hash of device addressed, a = argument array -# -######################################################################################## - -sub OWLCD_Get($@) { - my ($hash, @a) = @_; - - my $reading = $a[1]; - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - my $value = undef; - my $ret = ""; - my $offset; - my $factor; - - #-- check syntax - return "OWLCD: Get argument is missing @a" - if(int(@a) < 2); - - #-- check argument - return "OWLCD: 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 gpio states - if($a[1] eq "gpio") { - $value = OWXLCD_Get($hash,"gpio"); - return "$name.gpio => $value"; - } - - #-- get gpio counters - if($a[1] eq "counter") { - $value = OWXLCD_Get($hash,"counter"); - return "$name.counter => $value"; - } - - #-- get version - if($a[1] eq "version") { - $value = OWXLCD_Get($hash,"version"); - return "$name.version => $value"; - } - - #-- get EEPROM content - if($a[1] eq "memory") { - my $page = ($a[2] =~ m/\d/) ? int($a[2]) : 0; - Log 1,"Calling GetMemory with page $page"; - $value = OWXLCD_GetMemory($hash,$page); - return "$name $reading $page => $value"; - } -} - -####################################################################################### -# -# OWLCD_Set - Set one value for device -# -# Parameter hash = hash of device addressed -# a = argument array -# -######################################################################################## - -sub OWLCD_Set($@) { - my ($hash, @a) = @_; - - my $key = $a[1]; - my $value = $a[2]; - my ($line,$icon,$i); - - #-- for the selector: which values are possible - return join(" ", keys %sets) - if ( (@a == 2) && !(($key eq "reset") || ($key eq "test")) ); - - #-- check argument - if( !defined($sets{$a[1]}) ){ - return "OWLCD: Set with unknown argument $a[1]"; - } - - #-- check syntax for setting line - if( $key eq "line" ){ - return "OWLCD: Set needs one or two parameters when setting line value: <#line> " - if( int(@a)<3 ); - $line = ($a[2] =~ m/\d/) ? $a[2] : 0; - $value = $a[3]; - if( defined($value) ){ - for( $i=4; $i< int(@a); $i++){ - $value .= " ".$a[$i]; - } - }else{ - $value=""; - } - #-- check syntax for setting memory - } elsif( $key eq "memory" ){ - return "OWLCD: Set needs two parameters when setting memory page: <#page> " - if( int(@a)<4 ); - $line = ($a[2] =~ m/\d/) ? int($a[2]) : 0; - $value = $a[3]; - for( $i=4; $i< int(@a); $i++){ - $value .= " ".$a[$i]; - } - #-- check syntax for setting alert - } elsif( $key eq "alert" ){ - return "OWLCD: Set needs a parameter when setting alert: /none/off" - if( int(@a)<3 ); - #-- check syntax for setting icon - } elsif ( $key eq "icon" ){ - if( ($a[2] ne "0") && ($a[2] ne "none") ){ - return "OWLCD: Set needs two parameters when setting icon value: <#icon> on/off/blink (resp. 0..5/off/blink for #16)" - if( (int(@a)!=4) ); - $icon = ($a[2] =~ m/\d\d?/) ? $a[2] : 0; - $value = $a[3]; - } else { - return "OWLCD: Set needs only one parameter when resetting icons" - if( (int(@a)!=3) ); - $icon = 0; - $value = "OFF"; - } - #-- check syntax for reset and test - } elsif ( ($key eq "reset") || ($key eq "test") ){ - return "OWLCD: Set needs no parameters when setting $key value" - if( int(@a)!=2 ); - #-- other syntax - } else { - return "OWLCD: Set needs one parameter when setting $key value" - if( int(@a)!=3 ); - } - - #-- define vars - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - - #-- set gpio ports from all off = to all on = 7 - if($key eq "gpio") { - #-- check value and write to device - return "OWLCD: Set with wrong value for gpio port, must be 0 <= gpio <= 7" - if( ! ((int($value) >= 0) && (int($value) <= 7)) ); - OWXLCD_SetFunction($hash, "gpio", int($value)); - return undef; - } - - #-- set LCD ON or OFF - if($key eq "lcd") { - #-- check value and write to device - if( uc($value) eq "ON"){ - OWXLCD_SetFunction($hash, "lcdon", 0); - }elsif( uc($value) eq "OFF" ){ - OWXLCD_SetFunction($hash, "lcdoff", 0); - } else { - return "OWLCD: Set with wrong value for lcd, must be on/off" - } - return undef; - } - - #-- set LCD Backlight ON or OFF - if($key eq "backlight") { - #-- check value and write to device - if( uc($value) eq "ON"){ - OWXLCD_SetFunction($hash, "bklon", 0); - }elsif( uc($value) eq "OFF" ){ - OWXLCD_SetFunction($hash, "bkloff", 0); - } else { - return "OWLCD: Set with wrong value for backlight, must be on/off" - } - return undef; - } - - #-- reset - if($key eq "reset") { - OWXLCD_SetFunction($hash,"reset",0); - OWXLCD_SetIcon($hash,0,0); - OWXLCD_SetFunction($hash,"gpio",15); - return undef; - } - - #-- set icon - if($key eq "icon") { - return "OWLCD: Wrong icon type, choose 0..16" - if( ( 0 > $icon ) || ($icon > 16) ); - #-- check value and write to device - if( $icon == 16 ){ - if( uc($value) eq "OFF" ){ - OWXLCD_SetIcon($hash, 16, 0); - }elsif( uc($value) eq "BLINK" ){ - OWXLCD_SetIcon($hash, 16, 6); - }elsif( ((int($value) > 0) && (int($value) < 6)) ){ - OWXLCD_SetIcon($hash, 16, int($value)); - } else { - return "OWLCD: Set with wrong value for icon #16, must be 0..5/off/blink" - } - }else{ - if( uc($value) eq "OFF"){ - OWXLCD_SetIcon($hash, $icon, 0); - }elsif( uc($value) eq "ON" ){ - OWXLCD_SetIcon($hash, $icon, 1); - }elsif( uc($value) eq "BLINK" ){ - OWXLCD_SetIcon($hash, $icon, 2); - } else { - return "OWLCD: Set with wrong value for icon $icon, must be on/off/blink" - } - } - return undef; - } - - #-- set a single LCD line - if($key eq "line") { - return "OWLCD: Wrong line number, choose 0..".$lcdlines - if( ( 0 > $line ) || ($line > ($lcdlines-1)) ); - return "OWLCD: Wrong line length, must be < ".$lcdchars - if( length($value) > $lcdchars ); - #-- check value and write to device - OWXLCD_SetLine($hash,$line,$value); - return undef; - } - - #-- set memory page 0..6 - if($key eq "memory") { - return "OWLCD: Wrong page number, choose 0..6" - if( (0 > $line) || ($line > 6) ); - return "OWLCD: Wrong line length, must be <=16 " - if( length($value) > 16 ); - #-- check value and write to device - Log 1,"Calling SetMemory with page $line"; - OWXLCD_SetMemory($hash,$line,$value); - return undef; - } - - #-- set alert - if($key eq "alert") { - if(lc($value) eq "beep") { - OWXLCD_SetFunction($hash,"gpio",14); - return undef; - }elsif(lc($value) eq "red") { - OWXLCD_SetFunction($hash,"gpio",13); - return undef; - }elsif(lc($value) eq "yellow") { - OWXLCD_SetFunction($hash,"gpio",11); - return undef; - }elsif( (lc($value) eq "off") || (lc($value) eq "none") ) { - OWXLCD_SetFunction($hash,"gpio",15); - return undef; - }else{ - return "OWLCD: Set with wrong value for alert type, must be beep/red/yellow/off"; - } - } - - #-- start test - if($key eq "test") { - OWXLCD_SetLine($hash,0,"Hallo Welt"); - OWXLCD_SetLine($hash,1,"Mary had a big lamb"); - OWXLCD_SetLine($hash,2,"Solar 4.322 kW "); - OWXLCD_SetLine($hash,3,"\x5B\x5C\x5E\x7B\x7C\x7E\xBE"); - return undef; - } -} - -######################################################################################## -# -# OWLCD_Undef - Implements UndefFn function -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWLCD_Undef ($) { - my ($hash) = @_; - delete($modules{OWLCD}{defptr}{$hash->{OW_ID}}); - RemoveInternalTimer($hash); - return undef; -} - -######################################################################################## -# -# OWXLCD_Byte - write a single byte to the LCD device -# -# Parameter hash = hash of device addressed -# cmd = register or data -# byte = byte -# -######################################################################################## - -sub OWXLCD_Byte($$$) { - - my ($hash,$cmd,$byte) = @_; - - my ($select, $select2, $res, $res2, $res3, @data); - - #-- ID of the device - my $owx_dev = $hash->{ROM_ID}; - my $owx_rnf = substr($owx_dev,3,12); - my $owx_f = substr($owx_dev,0,2); - - #-- hash of the busmaster - my $master = $hash->{IODev}; - - my ($i,$j,$k); - - #=============== write to LCD register =============================== - if ( $cmd eq "register" ) { - #-- issue the read LCD register command \x10 - $select = sprintf("\x10%c",$byte); - #=============== write to LCD data =============================== - }elsif ( $cmd eq "data" ) { - #-- issue the read LCD data command \x12 - $select = sprintf("\x12%c",$byte); - #=============== wrong value requested =============================== - } else { - return "OWXLCD: Wrong byte write attempt"; - } - - #-- write to device - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,0); - #-- process results - if( $res eq 0 ){ - return "OWLCD: Device $owx_dev not accessible for writing a byte"; - } - - return undef; -} - -######################################################################################## -# -# OWXLCD_Get - get values from the LCD device -# -# Parameter hash = hash of device addressed -# cmd = command string -# -######################################################################################## - -sub OWXLCD_Get($$) { - - my ($hash,$cmd,$value) = @_; - - my ($select, $select2, $len, $addr, $res, $res2, $res3, @data); - - #-- ID of the device - my $owx_dev = $hash->{ROM_ID}; - my $owx_rnf = substr($owx_dev,3,12); - my $owx_f = substr($owx_dev,0,2); - - #-- hash of the busmaster - my $master = $hash->{IODev}; - - my ($i,$j,$k); - - #=============== fill scratch with gpio ports =============================== - if ( $cmd eq "gpio" ) { - #-- issue the read GPIO command \x22 (1 byte) - $select = "\x22"; - $len = 1; - #=============== fill scratch with gpio counters =============================== - }elsif ( $cmd eq "counter" ) { - #-- issue the read counter command \x23 (8 bytes) - $select = "\x23"; - $len = 8; - #=============== fill scratch with version =============================== - }elsif ( $cmd eq "version" ) { - #-- issue the read version command \x41 - $select = "\x41"; - $len = 16; - } else { - return "OWXLCD: Wrong get attempt"; - } - #-- write to device - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,0); - - #-- process results - if( $res eq 0 ){ - return "OWLCD: Device $owx_dev not accessible for reading"; - } - - #-- issue the read scratchpad command \xBE - $select2 = "\xBE"; - #-- write to device - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select2,$len); - - #-- process results - if( $res eq 0 ){ - return "OWLCD: Device $owx_dev not accessible for reading in 2nd step"; - } - - #-- process results (10 byes or more have been sent) - $res = substr($res,10); - - #=============== gpio ports =============================== - if ( $cmd eq "gpio" ) { - return ord($res); - #=============== gpio counters =============================== - }elsif ( $cmd eq "counter" ) { - for( $i=0; $i<4; $i++){ - $data[$i] = ord(substr($res,2*$i+1,1))*256+ord(substr($res,2*$i,1)); - } - return join(" ",@data); - #=============== version =============================== - }elsif ( $cmd eq "version" ) { - return $res; - } - - return $res; -} - -######################################################################################## -# -# OWXLCD_GetMemory - get memory page from LCD device (EXPERIMENTAL) -# -# Parameter hash = hash of device addressed -# page = memory page address -# -######################################################################################## - -sub OWXLCD_GetMemory($$) { - - my ($hash,$page) = @_; - - my ($select, $res, $res2, $res3); - - #-- ID of the device - my $owx_dev = $hash->{ROM_ID}; - my $owx_rnf = substr($owx_dev,3,12); - my $owx_f = substr($owx_dev,0,2); - - #-- hash of the busmaster - my $master = $hash->{IODev}; - - my ($i,$j,$k); - - #-- issue the match ROM command \x55 and the copy eeprom to scratchpad command \x4E - #Log 1," page read is ".$page; - $select = sprintf("\4E%c\x10\x37",$page); - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,0); - - #-- process results - if( $res eq 0 ){ - return "OWLCD: Device $owx_dev not accessible for reading"; - } - - #-- sleeping for some time - #select(undef,undef,undef,0.5); - - #-- issue the match ROM command \x55 and the read scratchpad command \xBE - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,"\xBE",16); - - #-- process results - if( $res eq 0 ){ - return "OWLCD: Device $owx_dev not accessible for reading in 2nd step"; - } - - #-- process results (10 byes or more have been sent) - $res2 = substr($res,11,16); - - Log 1," Having received ".length($res)." bytes"; - return $res2; -} - -######################################################################################## -# -# OWXLCD_InitializeDevice - initialize the display -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWXLCD_InitializeDevice($) { - my ($hash) = @_; - - my ($i,$data,$select, $res); - - #-- ID of the device - my $owx_dev = $hash->{ROM_ID}; - my $owx_rnf = substr($owx_dev,3,12); - my $owx_f = substr($owx_dev,0,2); - - #-- hash of the busmaster - my $master = $hash->{IODev}; - - #-- supposedly we do not need to do anything with a HD44780 - if( $lcdcontroller eq "HD44780"){ - return undef; - #-- need some additional sequence for KS0073 - }elsif ( $lcdcontroller eq "KS0073"){ - - #-- Function Set: 4 bit data size, RE => 0 = \x20 - #OWXLCD_Byte($hash,"register",32); - - #-- Entry Mode Set: cursor auto increment = \x06 - #OWXLCD_Byte($hash,"register",6); - - #-- Function Set: 4 bit data size, RE => 1, blink Enable = \x26 - OWXLCD_Byte($hash,"register",38); - - #-- Ext. Function Set: 4 line mode = \x09 - OWXLCD_Byte($hash,"register",9); - - #-- Function Set: 4 bit data size, RE => 0 = \x20 - OWXLCD_Byte($hash,"register",32); - - #-- Display ON/OFF: display on, cursor off, blink off = \x0C - OWXLCD_Byte($hash,"register",12); - - #-- Clear Display - OWXLCD_Byte($hash,"register",1); - - return undef; - #-- or else - } else { - return "OWXLCD: Wrong LCD controller type"; - } - -} - -######################################################################################## -# -# OWXLCD_SetFunction - write state and values of the LCD device -# -# Parameter hash = hash of device addressed -# cmd = command string -# value = data value -# -######################################################################################## - -sub OWXLCD_SetFunction($$$) { - - my ($hash,$cmd,$value) = @_; - - 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); - - #=============== set gpio ports =============================== - if ( $cmd eq "gpio" ) { - #-- issue the write GPIO command - # \x21 followed by the data value (= integer 0 - 7) - $select = sprintf("\x21%c",$value); - #=============== switch LCD on =============================== - }elsif ( $cmd eq "lcdon" ) { - #-- issue the lcd on cmd - $select = "\x03"; - #=============== switch LCD off =============================== - }elsif ( $cmd eq "lcdoff" ) { - #-- issue the lcd off cmd - $select = "\x05"; - #=============== switch LCD backlight on =============================== - }elsif ( $cmd eq "bklon" ) { - #-- issue the backlight on cmd - $select = "\x08"; - #=============== switch LCD backlight off =============================== - }elsif ( $cmd eq "bkloff" ) { - #-- issue the backlight off cmd - $select = "\x07"; - #=============== switch LCD backlight off =============================== - }elsif ( $cmd eq "reset" ) { - #-- issue the clear LCD command - $select = "\x49"; - #=============== wrong write attempt =============================== - } else { - return "OWXLCD: Wrong function selected"; - } - - #-- write to device - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,0); - #-- process results - if( $res eq 0 ){ - return "OWLCD: Device $owx_dev not accessible for writing"; - } - - return undef; -} - -######################################################################################## -# -# OWXLCD_SetIcon - set one of the icons -# -# Parameter hash = hash of device addressed -# icon = address of the icon used = 0,1 .. 16 (0 = all off) -# value = data value: 0 = off, 1 = on, 2 = blink -# for battery icon 16: 0 = off, 1 = empty ... 5 = full, 6 = empty blink -# -######################################################################################## - -sub OWXLCD_SetIcon($$$) { - my ($hash,$icon,$value) = @_; - - my ($i,$data,$select, $res); - - #-- ID of the device, hash of the busmaster - my $owx_dev = $hash->{ROM_ID}; - my $master = $hash->{IODev}; - - #-- only for KS0073 - if ( $lcdcontroller eq "KS0073"){ - - #-- write 16 zeros to erase all icons - if( $icon == 0){ - #-- 4 bit data size, RE => 1, blink Enable = \x26 - $select = "\x10\x26"; - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,0); - - #-- SEGRAM addres to 0 = \x40, - $select = "\x10\x40"; - #-- write 16 zeros to scratchpad - $select .= "\x4E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,0); - - #-- issue the copy scratchpad to LCD command \x48 - $select="\x48"; - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,0); - } else { - #-- determine data value - if( int($icon) != 16 ){ - if( $value == 0 ){ - $data = 0; - } elsif ( $value == 1) { - $data = 16; - } elsif ( $value == 2) { - $data = 80; - } else { - return "OWXLCD: Wrong data value $value for icon $icon"; - } - } else { - if( $value == 0 ){ - $data = 0; - } elsif ( $value == 1) { - $data = 16; - } elsif ( $value == 2) { - $data = 24; - } elsif ( $value == 3) { - $data = 28; - } elsif ( $value == 4) { - $data = 30; - } elsif ( $value == 5) { - $data = 31; - } elsif ( $value == 6) { - $data = 80; - } else { - return "OWXLCD: Wrong data value $value for icon $icon"; - } - } - #-- 4 bit data size, RE => 1, blink Enable = \x26 - $select = "\x10\x26"; - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,0); - - #-- SEGRAM addres to 0 = \x40 + icon address - $select = sprintf("\x10%c",63+$icon); - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,0); - - #-- data - $select = sprintf("\x12%c",$data); - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,0); - } - - #-- return to normal state - $select = "\x10\x20"; - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,0); - #-- or else - } else { - return "OWXLCD: Wrong LCD controller type"; - } -} - -######################################################################################## -# -# OWXLCD_SetLine - set one of the display lines -# -# Parameter hash = hash of device addressed -# line = line number (0..3) -# msg = data string to be written -# -######################################################################################## - -sub OWXLCD_SetLine($$$) { - - my ($hash,$line,$msg) = @_; - - my ($select, $res, $res2, $res3, $i, $msgA, $msgB); - $res2 = ""; - $line = int($line); - $msg = defined($msg) ? $msg : ""; - #-- replace umlaut chars for special codepage - $msg =~ s/ä/\x7B/g; - $msg =~ s/ö/\x7C/g; - $msg =~ s/ü/\x7E/g; - $msg =~ s/Ä/\x5B/g; - $msg =~ s/Ö/\x5C/g; - $msg =~ s/Ü/\x5E/g; - $msg =~ s/ß/\xBE/g; - - #--take out degree sign - if( $msg =~ m/.*\°\;.*/ ) { - my @ma = split(/\°\;/,$msg); - $msg = $ma[0]."\x80".$ma[1]; - } - #-- ID of the device, hash of the busmaster - my $owx_dev = $hash->{ROM_ID}; - my $master = $hash->{IODev}; - - #-- split if longer than 16 bytes, fill each with blanks - # has already been checked to be <= $lcdchars - if( $lcdchars > 16 ){ - if( length($msg) > 16 ) { - $msgA = substr($msg,0,16); - $msgB = substr($msg,16,length($msg)-16); - for($i = 0;$i<$lcdchars-length($msg);$i++){ - $msgB .= "\x20"; - } - } else { - $msgA = $msg; - for($i = 0;$i<16-length($msg);$i++){ - $msgA .= "\x20"; - } - for($i = 0;$i<$lcdchars-16;$i++){ - $msgB .= "\x20"; - } - } - }else{ - $msgA = $msg; - for($i = 0;$i<$lcdchars-length($msg);$i++){ - $msgA .= "\x20"; - } - $msgB = undef; - } - - #-- issue the match ROM command \x55 and the write scratchpad command \x4E - # followed by LCD page address and the text - $select=sprintf("\x4E%c",$lcdpage[$line]).$msgA; - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,0); - - #-- issue the copy scratchpad to LCD command \x48 - $select="\x48"; - OWX_Reset($master); - $res3=OWX_Complex($master,$owx_dev,$select,0); - - #-- if second string available: - if( defined($msgB) ) { - #select(undef,undef,undef,0.005); - #-- issue the match ROM command \x55 and the write scratchpad command \x4E - # followed by LCD page address and the text - $select=sprintf("\x4E%c",$lcdpage[$line]+16).$msgB; - OWX_Reset($master); - $res2=OWX_Complex($master,$owx_dev,$select,0); - - #-- issue the copy scratchpad to LCD command \x48 - $select="\x48"; - OWX_Reset($master); - $res3=OWX_Complex($master,$owx_dev,$select,0); - } - - #-- process results - if( ($res eq 0) || ($res2 eq 0) || ($res3 eq 0) ){ - return "OWLCD: Device $owx_dev not accessible for writing"; - } - - return undef; - -} - -######################################################################################## -# -# OWXLCD_SetMemory - set internal nonvolatile memory -# -# Parameter hash = hash of device addressed -# page = page number (0..14) -# msg = data string to be written -# -######################################################################################## - -sub OWXLCD_SetMemory($$$) { - - my ($hash,$page,$msg) = @_; - - my ($select, $res, $res2, $res3, $i, $msgA); - $page = int($page); - $msg = defined($msg) ? $msg : ""; - - #-- ID of the device, hash of the busmaster - my $owx_dev = $hash->{ROM_ID}; - my $master = $hash->{IODev}; - - #-- fillup with blanks - $msgA = $msg; - for($i = 0;$i<16-length($msg);$i++){ - $msgA .= "\x20"; - } - - #-- issue the match ROM command \x55 and the write scratchpad command \x4E - # followed by LCD page address and the text - #Log 1," page written is ".$page; - $select=sprintf("\x4E\%c",$page).$msgA; - OWX_Reset($master); - $res=OWX_Complex($master,$owx_dev,$select,0); - - #-- issue the copy scratchpad to EEPROM command \x39 - OWX_Reset($master); - $res2=OWX_Complex($master,$owx_dev,"\x39",0); - - #-- process results - if( ($res eq 0) || ($res2 eq 0) ){ - return "OWLCD: Device $owx_dev not accessible for writing"; - } - - return undef; - -} - -1; diff --git a/fhem/contrib/1-Wire/21_OWMULTI.pm b/fhem/contrib/1-Wire/21_OWMULTI.pm deleted file mode 100644 index 1807c5819..000000000 --- a/fhem/contrib/1-Wire/21_OWMULTI.pm +++ /dev/null @@ -1,850 +0,0 @@ -######################################################################################## -# -# OWMULTI.pm -# -# FHEM module to commmunicate with 1-Wire chip DS2438Z - Smart Battery Monitor -# -# Prefixes for subroutines of this module: -# OW = General 1-Wire routines (Martin Fischer, Peter Henning) -# OWX = 1-Wire bus master interface (Peter Henning) -# -# Prof. Dr. Peter A. Henning, 2012 -# -# Version 2.24 - October, 2012 -# -# Setup bus device in fhem.cfg as -# -# define OWMULTI [] [interval] -# -# where may be replaced by any name string -# -# is a 1-Wire device type. If omitted, we assume this to be an -# DS2438 -# -# 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 => OW_FAMILY.ROM_ID.CRC -# get present => 1 if device present, 0 if not -# get interval => query interval -# get reading => measurement value obtained from VFunction -# get temperature => temperature measurement -# get VDD => supply voltage measurement -# get V|raw => raw external voltage measurement -# -# set interval => set period for measurement -# -# Additional attributes are defined in fhem.cfg -# Note: attributes "tempXXXX" are read during every update operation. -# -# attr event on-change/on-update = when to write an event (default= on-update) -# -# attr tempOffset = temperature offset in degree Celsius added to the raw temperature reading -# attr tempUnit = unit of measurement, e.g. Celsius/Kelvin/Fahrenheit or C/K/F, default is Celsius -# attr VName | = name for the channel | a type description for the measured value -# attr VUnit | = unit of measurement for the voltage channel | its abbreviation -# attr Vfunction = arbitrary functional expression involving the values VDD, V, T -# VDD is replaced by the measured supply voltage in Volt, -# V by the measured external voltage -# T by the measured and corrected temperature in its unit -# -######################################################################################## -# -# 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; - -#-- Prototypes to make komodo happy -use vars qw{%attr %defs}; -use strict; -use warnings; -sub Log($$); - -#-- temperature and voltage globals - always the raw values from the device -my $owg_temp; -my $owg_volt; -my $owg_vdd; -my $owg_channel; - -my %gets = ( - "id" => "", - "present" => "", - "interval" => "", - "reading" => "", - "temperature" => "", - "VDD" => "", - "V" => "", - "raw" => "", -); - -my %sets = ( - "interval" => "", -); - -my %updates = ( - "present" => "", - "reading" => "", -); - -######################################################################################## -# -# The following subroutines are independent of the bus interface -# -# Prefix = OWMULTI -# -######################################################################################## -# -# OWMULTI_Initialize -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWMULTI_Initialize ($) { - my ($hash) = @_; - - $hash->{DefFn} = "OWMULTI_Define"; - $hash->{UndefFn} = "OWMULTI_Undef"; - $hash->{GetFn} = "OWMULTI_Get"; - $hash->{SetFn} = "OWMULTI_Set"; - #tempOffset = a temperature offset added to the temperature reading for correction - #tempUnit = a unit of measure: C/F/K - $hash->{AttrList}= "IODev do_not_notify:0,1 showtime:0,1 loglevel:0,1,2,3,4,5 ". - "event:on-update,on-change ". - "tempOffset tempUnit:C,Celsius,F,Fahrenheit,K,Kelvin ". - "VName VUnit VFunction"; - } - -######################################################################################## -# -# OWMULTI_Define - Implements DefFn function -# -# Parameter hash = hash of device addressed, def = definition string -# -######################################################################################## - -sub OWMULTI_Define ($$) { - my ($hash, $def) = @_; - - # define OWMULTI [] [interval] - # e.g.: define flow OWMULTI 525715020000 300 - my @a = split("[ \t][ \t]*", $def); - - my ($name,$model,$fam,$id,$crc,$interval,$ret); - my $tn = TimeNow(); - - #-- default - $name = $a[0]; - $interval = 300; - $ret = ""; - - #-- check syntax - return "OWMULTI: Wrong syntax, must be define OWMULTI [] [interval]" - if(int(@a) < 2 || int(@a) > 6); - - #-- 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 eq "none") || ($a3 eq "none") ) { - return "OWMULTI: ID = none is obsolete now, please redefine"; - } elsif( $a2 =~ m/^[0-9|a-f|A-F]{12}$/ ) { - $model = "DS2438"; - $id = $a[2]; - if(int(@a)>=4) { $interval = $a[3]; } - Log 1, "OWMULTI: Parameter [alarminterval] is obsolete now - must be set with I/O-Device" - if(int(@a) == 5); - } elsif( $a3 =~ m/^[0-9|a-f|A-F]{12}$/ ) { - $model = $a[2]; - $id = $a[3]; - if(int(@a)>=5) { $interval = $a[4]; } - Log 1, "OWMULTI: Parameter [alarminterval] is obsolete now - must be set with I/O-Device" - if(int(@a) == 6); - } else { - return "OWMULTI: $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 "DS2438" ){ - $fam = "26"; - }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->{OW_ID} = $id; - $hash->{OW_FAMILY} = $fam; - $hash->{PRESENT} = 0; - $hash->{ROM_ID} = $fam.".".$id.$crc; - $hash->{INTERVAL} = $interval; - - #-- Couple to I/O device - AssignIoPort($hash); - Log 3, "OWMULTI: Warning, no 1-Wire I/O device found for $name." - if(!defined($hash->{IODev}->{NAME})); - $modules{OWMULTI}{defptr}{$id} = $hash; - $hash->{STATE} = "Defined"; - Log 3, "OWMULTI: Device $name defined."; - - #-- Start timer for initialization in a few seconds - InternalTimer(time()+10, "OWMULTI_InitializeDevice", $hash, 0); - - #-- Start timer for updates - InternalTimer(time()+$hash->{INTERVAL}, "OWMULTI_GetValues", $hash, 0); - - return undef; -} - -######################################################################################## -# -# OWMULTI_InitializeDevice - delayed setting of initial readings and channel names -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWMULTI_InitializeDevice($) { - my ($hash) = @_; - - my $name = $hash->{NAME}; - my @args; - - #-- unit attribute defined ? - $hash->{READINGS}{"temperature"}{UNIT} = defined($attr{$name}{"tempUnit"}) ? $attr{$name}{"tempUnit"} : "Celsius"; - $hash->{READINGS}{"temperature"}{TYPE} = "temperature"; - - #-- Initial readings temperature sensor - $owg_temp = 0.0; - $owg_volt = 0.0; - $owg_vdd = 5.0; - #-- Set channel name, channel unit for voltage channel - my $cname = defined($attr{$name}{"VName"}) ? $attr{$name}{"VName"} : "voltage|voltage"; - my @cnama = split(/\|/,$cname); - if( int(@cnama)!=2){ - Log 1, "OWMULTI: Incomplete channel name specification $cname. Better use $cname|"; - push(@cnama,"unknown"); - } - - #-- unit - my $unit = defined($attr{$name}{"VUnit"}) ? $attr{$name}{"VUnit"} : "Volt|V"; - my @unarr= split(/\|/,$unit); - if( int(@unarr)!=2 ){ - Log 1, "OWMULTI: Incomplete channel unit specification $unit. Better use $unit|"; - push(@unarr,""); - } - - #-- put into readings - $owg_channel = $cnama[0]; - $hash->{READINGS}{"$owg_channel"}{TYPE} = $cnama[1]; - $hash->{READINGS}{"$owg_channel"}{UNIT} = $unarr[0]; - $hash->{READINGS}{"$owg_channel"}{UNITABBR} = $unarr[1]; - - #-- Initialize all the display stuff - OWMULTI_FormatValues($hash); - -} - -######################################################################################## -# -# OWMULTI_FormatValues - put together various format strings -# -# Parameter hash = hash of device addressed, fs = format string -# -######################################################################################## - -sub OWMULTI_FormatValues($) { - my ($hash) = @_; - - my $name = $hash->{NAME}; - my ($tunit,$toffset,$tfactor,$tabbr,$tval,$vfunc,$vval); - my ($value1,$value2) = ("",""); - - my $tn = TimeNow(); - - #-- attributes defined ? - $tunit = defined($attr{$name}{"tempUnit"}) ? $attr{$name}{"tempUnit"} : $hash->{READINGS}{"temperature"}{UNIT}; - $toffset = defined($attr{$name}{"tempOffset"}) ? $attr{$name}{"tempOffset"} : 0.0 ; - $tfactor = 1.0; - - if( $tunit eq "Celsius" ){ - $tabbr = "°C"; - } elsif ($tunit eq "Kelvin" ){ - $tabbr = "K"; - $toffset += "273.16" - } elsif ($tunit eq "Fahrenheit" ){ - $tabbr = "°F"; - $toffset = ($toffset+32)/1.8; - $tfactor = 1.8; - } else { - $tabbr="?"; - Log 1, "OWMULTI_FormatValues: unknown unit $tunit"; - } - #-- these values are rather coplex to obtain, therefore save them in the hash - $hash->{READINGS}{"temperature"}{UNIT} = $tunit; - $hash->{READINGS}{"temperature"}{UNITABBR} = $tabbr; - $hash->{tempf}{offset} = $toffset; - $hash->{tempf}{factor} = $tfactor; - - #-- correct values for proper offset, factor - $tval = ($owg_temp + $toffset)*$tfactor; - - #-- put into READINGS - $hash->{READINGS}{"temperature"}{VAL} = $tval; - $hash->{READINGS}{"temperature"}{TIME} = $tn; - - my $cname = defined($attr{$name}{"VName"}) ? $attr{$name}{"VName"} : "voltage|voltage"; - my @cnama = split(/\|/,$cname); - $owg_channel=$cnama[0]; - - #-- attribute VFunction defined ? - $vfunc = defined($attr{$name}{"VFunction"}) ? $attr{$name}{"VFunction"} : "V"; - - #-- replace by proper values - $vfunc =~ s/VDD/\$owg_vdd/g; - $vfunc =~ s/V/\$owg_volt/g; - $vfunc =~ s/T/\$tval/g; - - #-- determine the measured value from the function - $vfunc = "\$owg_vdd = $owg_vdd; \$owg_volt = $owg_volt; \$tval = $tval; ".$vfunc; - $vfunc = eval($vfunc); - if( $vfunc ne "" ){ - $vval = int( $vfunc*1000 )/1000; - } else { - $vval = 0.0; - } - - #-- put into READINGS - $hash->{READINGS}{"$owg_channel"}{VAL} = $vval; - $hash->{READINGS}{"$owg_channel"}{TIME} = $tn; - $hash->{READINGS}{"VDD"}{VAL} = $owg_vdd; - $hash->{READINGS}{"VDD"}{TIME} = $tn; - - #-- string buildup for return value, STATE - $value1 .= sprintf( "%s: %5.3f %s temperature %5.3f %s VDD %5.2f V", $owg_channel, $vval,$hash->{READINGS}{"$owg_channel"}{UNITABBR},$tval,$tabbr,$owg_vdd); - $value2 .= sprintf( "%s: %5.2f %s (T: %5.2f %s)", $owg_channel, $vval,$hash->{READINGS}{"$owg_channel"}{UNITABBR},$tval,$tabbr); - - #-- STATE - $hash->{STATE} = $value2; - - return $value1; -} - -######################################################################################## -# -# OWMULTI_Get - Implements GetFn function -# -# Parameter hash = hash of device addressed, a = argument array -# -######################################################################################## - -sub OWMULTI_Get($@) { - my ($hash, @a) = @_; - - my $reading = $a[1]; - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - my $value = undef; - my $ret = ""; - - #-- check syntax - return "OWMULTI: Get argument is missing @a" - if(int(@a) != 2); - - #-- check argument - return "OWMULTI: 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 other values according to interface type - my $interface= $hash->{IODev}->{TYPE}; - - #-- get present - if($a[1] eq "present" ) { - #-- OWX interface - if( $interface eq "OWX" ){ - #-- hash of the busmaster - my $master = $hash->{IODev}; - $value = OWX_Verify($master,$hash->{ROM_ID}); - $hash->{PRESENT} = $value; - return "$name.present => $value"; - } else { - return "OWMULTI: Verification not yet implemented for interface $interface"; - } - } - - #-- get interval - if($reading eq "interval") { - $value = $hash->{INTERVAL}; - return "$name.interval => $value"; - } - - #-- reset presence - $hash->{PRESENT} = 0; - - #-- OWX interface - if( $interface eq "OWX" ){ - #-- not different from getting all values .. - $ret = OWXMULTI_GetValues($hash); - #-- OWFS interface not yet implemented - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSMULTI_GetValues($hash); - #-- Unknown interface - }else{ - return "OWMULTI: Get with wrong IODev type $interface"; - } - - #-- process results - if( defined($ret) ){ - return "OWMULTI: Could not get values from device $name, return was $ret"; - } - $hash->{PRESENT} = 1; - OWMULTI_FormatValues($hash); - - #-- return the special reading - if ($reading eq "reading") { - return "OWMULTI: $name.reading => ". - $hash->{READINGS}{"$owg_channel"}{VAL}; - } - if ($reading eq "temperature") { - return "OWMULTI: $name.temperature => ". - $hash->{READINGS}{"temperature"}{VAL}; - } - if ($reading eq "VDD") { - return "OWMULTI: $name.VDD => ". - $hash->{READINGS}{"VDD"}{VAL}; - } - if ( ($reading eq "V")|($reading eq "raw")) { - return "OWMULTI: $name.V => ". - $owg_volt; - } - return undef; -} - -####################################################################################### -# -# OWMULTI_GetValues - Updates the readings from device -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWMULTI_GetValues($@) { - my $hash = shift; - - my $name = $hash->{NAME}; - my $value = ""; - my $ret = ""; - - #-- restart timer for updates - RemoveInternalTimer($hash); - InternalTimer(time()+$hash->{INTERVAL}, "OWMULTI_GetValues", $hash, 1); - - #-- reset presence - $hash->{PRESENT} = 0; - - #-- Get values according to interface type - my $interface= $hash->{IODev}->{TYPE}; - if( $interface eq "OWX" ){ - #-- max 3 tries - for(my $try=0; $try<3; $try++){ - $ret = OWXMULTI_GetValues($hash); - last - if( !defined($ret) ); - } - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSTHERM_GetValues($hash); - }else{ - Log 3, "OWMULTI: GetValues with wrong IODev type $interface"; - return 1; - } - - #-- process results - if( defined($ret) ){ - Log 3, "OWMULTI: Could not get values from device $name, reason $ret"; - return 1; - } - $hash->{PRESENT} = 1; - - #-- old state, new state - my $oldval = $hash->{STATE}; - $value=OWMULTI_FormatValues($hash); - my $newval = $hash->{STATE}; - #--logging depends on setting of the event-attribute - Log 5, $value; - my $ev = defined($attr{$name}{"event"}) ? $attr{$name}{"event"} : "on-update"; - if( ($ev eq "on-update") || (($ev eq "on-change") && ($newval ne $oldval)) ){ - $hash->{CHANGED}[0] = $value; - DoTrigger($name, undef); - } - - return undef; -} - -####################################################################################### -# -# OWMULTI_Set - Set one value for device -# -# Parameter hash = hash of device addressed -# a = argument string -# -######################################################################################## - -sub OWMULTI_Set($@) { - my ($hash, @a) = @_; - - #-- for the selector: which values are possible - return join(" ", sort keys %sets) if(@a == 2); - #-- check syntax - return "OWMULTI: Set needs one parameter" - if(int(@a) != 3); - #-- check argument - return "OWMULTI: Set with unknown argument $a[1], choose one of ".join(",", sort keys %sets) - if(!defined($sets{$a[1]})); - - #-- define vars - my $key = $a[1]; - my $value = $a[2]; - my $ret = undef; - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - - #-- set new timer interval - if($key eq "interval") { - # check value - return "OWMULTI: Set with short interval, must be > 1" - if(int($value) < 1); - # update timer - $hash->{INTERVAL} = $value; - RemoveInternalTimer($hash); - InternalTimer(gettimeofday()+$hash->{INTERVAL}, "OWMULTI_GetValues", $hash, 1); - return undef; - } - - #-- set other values depending on interface type - my $interface = $hash->{IODev}->{TYPE}; - my $offset = $hash->{tempf}{offset}; - my $factor = $hash->{tempf}{factor}; - - #-- find upper and lower boundaries for given offset/factor - my $mmin = (-55+$offset)*$factor; - my $mmax = (125+$offset)*$factor; - return sprintf("OWMULTI: Set with wrong value $value for $key, range is [%3.1f,%3.1f]",$mmin,$mmax) - if($value < $mmin || $value > $mmax); - - #-- seems to be ok, put into the device - $a[2] = int($value/$factor-$offset); - - #-- OWX interface - if( $interface eq "OWX" ){ - $ret = OWXMULTI_SetValues($hash,@a); - #-- OWFS interface not yet implemented - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSTHERM_SetValues($hash,@a); - # return $ret - # if(defined($ret)); - } else { - return "OWMULTI: Set with wrong IODev type $interface"; - } - - #-- process results - we have to reread the device - $hash->{PRESENT} = 1; - OWMULTI_GetValues($hash); - OWMULTI_FormatValues($hash); - Log 4, "OWMULTI: Set $hash->{NAME} $key $value"; - - return undef; -} - -######################################################################################## -# -# OWMULTI_Undef - Implements UndefFn function -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWMULTI_Undef ($) { - my ($hash) = @_; - - delete($modules{OWMULTI}{defptr}{$hash->{OW_ID}}); - RemoveInternalTimer($hash); - return undef; -} - -######################################################################################## -# -# The following subroutines in alphabetical order are only for a 1-Wire bus connected -# directly to the FHEM server -# -# Prefix = OWXMULTI -# -######################################################################################## -# -# OWXMULTI_GetValues - Get reading from one device -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWXMULTI_GetValues($) { - - my ($hash) = @_; - - my ($i,$j,$k,$res,$res2); - - #-- ID of the device - my $owx_dev = $hash->{ROM_ID}; - #-- hash of the busmaster - my $master = $hash->{IODev}; - - #-- switch the device to current measurement off, VDD only - OWX_Reset($master); - #-- issue the match ROM command \x55 and the write scratchpad command - if( OWX_Complex($master,$owx_dev,"\x4E\x00\x08",0) eq 0 ){ - return "$owx_dev write status failed"; - } - - #-- copy scratchpad to register - OWX_Reset($master); - #-- issue the match ROM command \x55 and the copy scratchpad command - if( OWX_Complex($master,$owx_dev,"\x48\x00",0) eq 0){ - return "$owx_dev copy scratchpad failed"; - } - - #-- initiate temperature conversion - OWX_Reset($master); - #-- issue the match ROM command \x55 and the start conversion command - if( OWX_Complex($master,$owx_dev,"\x44",0) eq 0 ){ - return "$owx_dev temperature conversion failed"; - } - #-- conversion needs some 10 ms ! - select(undef,undef,undef,0.012); - - #-- initiate voltage conversion - OWX_Reset($master); - #-- issue the match ROM command \x55 and the start conversion command - if( OWX_Complex($master,$owx_dev,"\xB4",0) eq 0 ){ - return "$owx_dev voltage conversion failed"; - } - #-- conversion needs some 4 ms ! - select(undef,undef,undef,0.006); - - #-- from memory to scratchpad - OWX_Reset($master); - #-- issue the match ROM command \x55 and the recall memory command - if( OWX_Complex($master,$owx_dev,"\xB8\x00",0) eq 0 ){ - return "$owx_dev recall memory failed"; - } - #-- copy needs some 10 ms ! - select(undef,undef,undef,0.012); - - #-- NOW ask the specific device - OWX_Reset($master); - #-- issue the match ROM command \x55 and the read scratchpad command \xBE - #-- reading 9 + 2 + 9 data bytes = 20 bytes - $res=OWX_Complex($master,$owx_dev,"\xBE\x00",9); - #Log 1,"OWXMULTI: data length from reading device is ".length($res)." bytes"; - #-- process results - if( $res eq 0 ){ - return "$owx_dev not accessible in 2nd step"; - } - - # $res2 = "====> OWXMULTI Received "; - # for(my $i=0;$i DS2438 - - #-- temperature - my $lsb = ord($data[12]); - my $msb = ord($data[13]) & 127; - my $sign = ord($data[13]) & 128; - - #-- test with -55 degrees - #$lsb = 0; - #$sign = 1; - #$msb = 73; - - #-- 2's complement form = signed bytes - $owg_temp = $msb+ $lsb/256; - if( $sign !=0 ){ - $owg_temp = -128+$owg_temp; - } - - #-- voltage - $lsb = ord($data[14]); - $msb = ord($data[15]) & 3; - - #-- test with 5V - #$lsb = 244; - #$msb = 1; - - #-- supply voltage - $owg_vdd = ($msb*256+ $lsb)/100; - - #-- switch the device to current measurement off, V external only - OWX_Reset($master); - #-- issue the match ROM command \x55 and the write scratchpad command - if( OWX_Complex($master,$owx_dev,"\x4E\x00\x00",0) eq 0 ){ - return "$owx_dev write status failed"; - } - - #-- copy scratchpad to register - OWX_Reset($master); - #-- issue the match ROM command \x55 and the copy scratchpad command - if( OWX_Complex($master,$owx_dev,"\x48\x00",0) eq 0){ - return "$owx_dev copy scratchpad failed"; - } - - #-- initiate voltage conversion - OWX_Reset($master); - #-- issue the match ROM command \x55 and the start conversion command - if( OWX_Complex($master,$owx_dev,"\xB4",0) eq 0 ){ - return "$owx_dev voltage conversion failed"; - } - #-- conversion needs some 4 ms ! - select(undef,undef,undef,0.006); - - #-- from memory to scratchpad - OWX_Reset($master); - #-- issue the match ROM command \x55 and the recall memory command - if( OWX_Complex($master,$owx_dev,"\xB8\x00",0) eq 0 ){ - return "$owx_dev recall memory failed"; - } - #-- copy needs some 10 ms ! - select(undef,undef,undef,0.012); - - #-- NOW ask the specific device - OWX_Reset($master); - #-- issue the match ROM command \x55 and the read scratchpad command \xBE - #-- reading 9 + 2 + 9 data bytes = 20 bytes - $res=OWX_Complex($master,$owx_dev,"\xBE\x00",9); - #Log 1,"OWXMULTI: data length from reading device is ".length($res)." bytes"; - #-- process results - if( $res eq 0 ){ - return "$owx_dev not accessible in 2nd step"; - } - - # $res2 = "====> OWXMULTI Received "; - # for(my $i=0;$i DS2438 - - #-- voltage - $lsb = ord($data[14]); - $msb = ord($data[15]) & 3; - - #-- test with 7.2 V - #$lsb = 208; - #$msb = 2; - - #-- external voltage - $owg_volt = ($msb*256+ $lsb)/100; - - return undef; - - #} else { - # return "OWXMULTI: Unknown device family $hash->{OW_FAMILY}\n"; - #} -} - -####################################################################################### -# -# OWXMULTI_SetValues - Implements SetFn function -# -# Parameter hash = hash of device addressed -# a = argument array -# -######################################################################################## - -sub OWXMULTI_SetValues($@) { - my ($hash, @a) = @_; - - my ($i,$j,$k); - - my $name = $hash->{NAME}; - #-- ID of the device - my $owx_dev = $hash->{ROM_ID}; - #-- hash of the busmaster - my $master = $hash->{IODev}; - - #-- define vars - my $key = $a[1]; - my $value = $a[2]; - - OWX_Reset($master); - - #-- issue the match ROM command \x55 and the write scratchpad command \x4E, - # followed by the write EEPROM command \x48 - # - # so far writing the EEPROM does not work properly. - # 1. \x48 directly appended to the write scratchpad command => command ok, no effect on EEPROM - # 2. \x48 appended to match ROM => command not ok. - # 3. \x48 sent by WriteBytePower after match ROM => command ok, no effect on EEPROM - - my $select=sprintf("\x4E%c%c\x48",0,0); - my $res=OWX_Complex($master,$owx_dev,$select,0); - - if( $res eq 0 ){ - return "OWXMULTI: Device $owx_dev not accessible"; - } - - DoTrigger($name, undef) if($init_done); - return undef; -} - - - -1; diff --git a/fhem/contrib/1-Wire/21_OWSWITCH.pm b/fhem/contrib/1-Wire/21_OWSWITCH.pm deleted file mode 100644 index ff5a409a4..000000000 --- a/fhem/contrib/1-Wire/21_OWSWITCH.pm +++ /dev/null @@ -1,894 +0,0 @@ -######################################################################################## -# -# OWSWITCH.pm -# -# FHEM module to commmunicate with 1-Wire adressable switches DS2413, DS206, DS2408 -# -# Attention: This module may communicate with the OWX module, -# but currently not with the 1-Wire File System OWFS -# -# TODO: Kanalattribute ändern zur Laufzeit. -# -# -# Prefixes for subroutines of this module: -# OW = General 1-Wire routines Peter Henning) -# OWX = 1-Wire bus master interface (Peter Henning) -# OWFS = 1-Wire file system (??) -# -# Prof. Dr. Peter A. Henning, 2012 -# -# Version 2.24 - October, 2012 -# -# Setup bus device in fhem.cfg as -# -# define OWSWITCH [] [interval] -# -# where may be replaced by any name string -# -# is a 1-Wire device type. If omitted, we assume this to be an -# DS2413. Allowed values are DS2413, DS2406 -# 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 input => state for channel (name A, B or defined channel name) -# note: 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. -# get gpio => values for channels -# -# set interval => set period for measurement -# set output ON|OFF => set value for channel (name A, B or defined channel name) -# note: 1 = OFF, 0 = ON in normal usage. See also the note above -# set gpio value => set values for channels (3 = both OFF, 1 = B ON 2 = A ON 0 = both ON) -# set init yes => re-initialize device -# -# Additional attributes are defined in fhem.cfg, in some cases per channel, where =A,B -# Note: attributes are read only during initialization procedure - later changes are not used. -# -# attr event on-change/on-update = when to write an event (default= on-update) -# -# attr Name | = name for the channel | a type description for the measured value -# attr Unit | = values to display in state variable for on|off condition -# attr stateS = character string denoting external shortening condition -# -######################################################################################## -# -# 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; - -#-- Prototypes to make komodo happy -use vars qw{%attr %defs}; -use strict; -use warnings; -sub Log($$); - -#-- channel name - fixed is the first array, variable the second -my @owg_fixed = ("A","B","C","D","E","F","G","H"); -my @owg_channel; -#-- channel values - always the raw input resp. output values from the device -my @owg_val; -my @owg_vax; - -my %gets = ( - "id" => "", - "present" => "", - "interval" => "", - "input" => "", - "gpio" => "" -); - -my %sets = ( - "interval" => "", - "output" => "", - "gpio" => "", - "init" => "" -); - -my %updates = ( - "present" => "", - "gpio" => "" -); - -my %cnumber = ( - "DS2413" => 2, - "DS2406" => 2, - "DS2408" => 8 - ); - -######################################################################################## -# -# The following subroutines are independent of the bus interface -# -# Prefix = OWSWITCH -# -######################################################################################## -# -# OWSWITCH_Initialize -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWSWITCH_Initialize ($) { - my ($hash) = @_; - - $hash->{DefFn} = "OWSWITCH_Define"; - $hash->{UndefFn} = "OWSWITCH_Undef"; - $hash->{GetFn} = "OWSWITCH_Get"; - $hash->{SetFn} = "OWSWITCH_Set"; - - my $attlist = "IODev do_not_notify:0,1 showtime:0,1 model:DS2413,DS2406,DS2408 loglevel:0,1,2,3,4,5 ". - "event:on-update,on-change"; - - #TODO: correct number of channels - - for( my $i=0;$i<8;$i++ ){ - $attlist .= " ".$owg_fixed[$i]."Name"; - $attlist .= " ".$owg_fixed[$i]."Unit"; - $attlist .= " ".$owg_fixed[$i]."stateS"; - } - $hash->{AttrList} = $attlist; -} - -######################################################################################### -# -# OWSWITCH_Define - Implements DefFn function -# -# Parameter hash = hash of device addressed, def = definition string -# -######################################################################################### - -sub OWSWITCH_Define ($$) { - my ($hash, $def) = @_; - - # define OWSWITCH [] [interval] - # e.g.: define flow OWSWITCH 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 "OWSWITCH: Wrong syntax, must be define OWSWITCH [] [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 = "DS2413"; - $id = $a[2]; - if(int(@a)>=4) { $interval = $a[3]; } - } elsif( $a3 =~ m/^[0-9|a-f|A-F]{12}$/ ) { - $model = $a[2]; - $id = $a[3]; - if(int(@a)>=5) { $interval = $a[4]; } - } else { - return "OWSWITCH: $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 "DS2413" ){ - $fam = "3A"; - CommandAttr (undef,"$name model DS2413"); - }elsif( $model eq "DS2406" ){ - $fam = "12"; - CommandAttr (undef,"$name model DS2406"); - }elsif( $model eq "DS2408" ){ - $fam = "29"; - CommandAttr (undef,"$name model DS2408"); - }else{ - return "OWSWITCH: Wrong 1-Wire device model $model"; - } - - #-- 1-Wire ROM identifier in the form "FF.XXXXXXXXXXXX.YY" - # 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); - Log 3, "OWSWITCH: Warning, no 1-Wire I/O device found for $name." - if(!defined($hash->{IODev}->{NAME})); - $modules{OWSWITCH}{defptr}{$id} = $hash; - $hash->{STATE} = "Defined"; - Log 3, "OWSWITCH: Device $name defined."; - - #-- Initialization reading according to interface type - my $interface= $hash->{IODev}->{TYPE}; - - #-- Start timer for initialization in a few seconds - InternalTimer(time()+1, "OWSWITCH_InitializeDevice", $hash, 0); - - #-- Start timer for updates - InternalTimer(time()+$hash->{INTERVAL}, "OWSWITCH_GetValues", $hash, 0); - - return undef; -} - -######################################################################################## -# -# OWSWITCH_InitializeDevice - delayed setting of initial readings and channel names -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWSWITCH_InitializeDevice($) { - my ($hash) = @_; - - my $name = $hash->{NAME}; - - #-- Set channel names, channel units - for( my $i=0;$i<$cnumber{$attr{$name}{"model"}} ;$i++) { - #-- Initial readings OFF - $owg_val[$i] = 1; - $owg_vax[$i] = 1; - #-- name - my $cname = defined($attr{$name}{$owg_fixed[$i]."Name"}) ? $attr{$name}{$owg_fixed[$i]."Name"} : $owg_fixed[$i]."|onoff"; - my @cnama = split(/\|/,$cname); - if( int(@cnama)!=2){ - Log 1, "OWSWITCH: Incomplete channel name specification $cname. Better use $cname|"; - push(@cnama,"unknown"); - } - - #-- unit - my $unit = defined($attr{$name}{$owg_fixed[$i]."Unit"}) ? $attr{$name}{$owg_fixed[$i]."Unit"} : "ON|OFF"; - my @unarr= split(/\|/,$unit); - if( int(@unarr)!=2 ){ - Log 1, "OWSWITCH: Wrong channel unit specification $unit, replaced by ON|OFF"; - $unit="ON|OFF"; - } - - #-- put into readings - $owg_channel[$i] = $cnama[0]; - $hash->{READINGS}{"$owg_channel[$i]"}{TYPE} = $cnama[1]; - $hash->{READINGS}{"$owg_channel[$i]"}{UNIT} = $unit; - $hash->{READINGS}{"$owg_channel[$i]"}{UNITABBR} = $unit; - } - - #-- set status according to interface type - my $interface= $hash->{IODev}->{TYPE}; - - #-- OWX interface - if( !defined($interface) ){ - return "OWSWITCH: Interface missing"; - } elsif( $interface eq "OWX" ){ - #-- OWFS interface - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSAD_GetPage($hash,"reading"); - #-- Unknown interface - }else{ - return "OWSWITCH: InitializeDevice with wrong IODev type $interface"; - } - - #-- Initialize all the display stuff - OWSWITCH_FormatValues($hash); -} - -######################################################################################## -# -# OWSWITCH_FormatValues - put together various format strings -# -# Parameter hash = hash of device addressed, fs = format string -# -######################################################################################## - -sub OWSWITCH_FormatValues($) { - my ($hash) = @_; - - my $name = $hash->{NAME}; - my ($offset,$factor,$vval,$vvax,$vstr,$cname,@cnama,@unarr); - my ($value1,$value2,$value3) = ("","",""); - - my $tn = TimeNow(); - - #-- formats for output - for (my $i=0;$i<$cnumber{$attr{$name}{"model"}};$i++){ - $cname = defined($attr{$name}{$owg_fixed[$i]."Name"}) ? $attr{$name}{$owg_fixed[$i]."Name"} : $owg_fixed[$i]; - @cnama = split(/\|/,$cname); - $owg_channel[$i]=$cnama[0]; - - #-- input state is 0 = ON or 1 = OFF - $vval = $owg_val[$i]; - #-- output state is 0 = ON or 1 = OFF - $vvax = $owg_vax[$i]; - - #-- string buildup for return value and STATE - @unarr= split(/\|/,$hash->{READINGS}{"$owg_channel[$i]"}{UNIT}); - $cname = defined($attr{$name}{$owg_fixed[$i]."stateS"}) ? $attr{$name}{$owg_fixed[$i]."stateS"} : ""; - $vstr = $unarr[$vval]; - $vstr .= $cname if( ($vval == 0) && ($vvax == 1) ); - $vstr = "ERR" if( ($vval == 1) && ($vvax == 0) ); - - $value1 .= sprintf( "%s: %s", $owg_channel[$i], $vstr); - $value2 .= sprintf( "%s: %s ", $owg_channel[$i], $vstr); - $value3 .= sprintf( "%s: " , $owg_channel[$i]); - - #-- put into READINGS - $hash->{READINGS}{"$owg_channel[$i]"}{VAL} = $vstr; - $hash->{READINGS}{"$owg_channel[$i]"}{TIME} = $tn; - - #-- insert comma - if( $i<$cnumber{$attr{$name}{"model"}}-1 ){ - $value1 .= " "; - $value2 .= ", "; - $value3 .= ", "; - } - } - #-- STATE - $hash->{STATE} = $value2; - - return $value1; -} - -######################################################################################## -# -# OWSWITCH_Get - Implements GetFn function -# -# Parameter hash = hash of device addressed, a = argument array -# -######################################################################################## - -sub OWSWITCH_Get($@) { - my ($hash, @a) = @_; - - my $reading = $a[1]; - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - my ($value,$value2,$value3) = (undef,undef,undef); - my $ret = ""; - my $offset; - my $factor; - my $page; - - #-- check syntax - return "OWSWITCH: Get argument is missing @a" - if(int(@a) < 2); - - #-- check argument - return "OWSWITCH: 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 values according to interface type - my $interface= $hash->{IODev}->{TYPE}; - - #-- get single state - # TODO: WAS passiert, wenn channel name noch falsch ist ? - if( $reading eq "input" ){ - return "OWSWITCH: get needs parameter when reading input: " - if( int(@a)<2 ); - my $fnd=undef; - for (my $i=0;$i<$cnumber{$attr{$name}{"model"}};$i++){ - if( ($a[2] eq $owg_channel[$i]) || ($a[2] eq $owg_fixed[$i]) ){ - $fnd=$i; - last; - } - } - return "OWSWITCH: invalid output address, must be A,B,... or defined channel name" - if( !defined($fnd) ); - - #-- OWX interface - if( $interface eq "OWX" ){ - $ret = OWXSWITCH_GetState($hash); - #-- OWFS interface - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSSWITCH_GetPage($hash,"reading"); - #-- Unknown interface - }else{ - return "OWSWITCH: Get with wrong IODev type $interface"; - } - #-- process results - OWSWITCH_FormatValues($hash); - my @states = split(/,/,$hash->{STATE}); - - return $a[2]." = ".$states[$fnd]; - - #-- get all states - }elsif( $reading eq "gpio" ){ - return "OWSWITCH: get needs no parameter when reading gpio" - if( int(@a)==1 ); - - if( $interface eq "OWX" ){ - $ret = OWXSWITCH_GetState($hash); - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSAD_GetValues($hash); - }else{ - return "OWSWITCH: GetValues with wrong IODev type $interface"; - } - } - #-- process results - if( defined($ret) ){ - return "OWSWITCH: Could not get values from device $name"; - } - $hash->{PRESENT} = 1; - return "OWSWITCH: $name.$reading => ".OWSWITCH_FormatValues($hash); - -} - -####################################################################################### -# -# OWSWITCH_GetValues - Updates the reading from one device -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWSWITCH_GetValues($) { - my $hash = shift; - - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - my $value = ""; - my $ret = ""; - my $offset; - my $factor; - - #-- restart timer for updates - RemoveInternalTimer($hash); - InternalTimer(time()+$hash->{INTERVAL}, "OWSWITCH_GetValues", $hash, 1); - - #-- reset presence - $hash->{PRESENT} = 0; - - #-- Get readings according to interface type - my $interface= $hash->{IODev}->{TYPE}; - if( $interface eq "OWX" ){ - $ret = OWXSWITCH_GetState($hash); - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSSWITCH_GetValues($hash); - }else{ - return "OWSWITCH: GetValues with wrong IODev type $interface"; - } - - #-- process results - if( defined($ret) ){ - return "OWSWITCH: Could not get values from device $name"; - } - $hash->{PRESENT} = 1; - #-- old state, new state - my $oldval = $hash->{STATE}; - $value=OWSWITCH_FormatValues($hash); - my $newval = $hash->{STATE}; - #--logging depends on setting of the event-attribute - Log 5, $value; - my $ev = defined($attr{$name}{"event"}) ? $attr{$name}{"event"} : "on-update"; - if( ($ev eq "on-update") || (($ev eq "on-change") && ($newval ne $oldval)) ){ - $hash->{CHANGED}[0] = $value; - DoTrigger($name, undef); - } - - return undef; -} - -####################################################################################### -# -# OWSWITCH_Set - Set one value for device -# -# Parameter hash = hash of device addressed -# a = argument array -# -######################################################################################## - -sub OWSWITCH_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); - return $newkeys ; - } - - #-- check argument - if( !defined($sets{$a[1]}) ){ - return "OWSWITCH: Set with unknown argument $a[1]"; - } - - #-- define vars - my $ret = undef; - my $channel = undef; - my $channo = undef; - my $condx; - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - - #-- reset the device - if($key eq "init") { - return "OWCOUNT: init needs parameter 'yes'" - if($value ne "yes"); - OWSWITCH_InitializeDevice($hash); - return "OWCOUNT: Re-initialized device"; - } - - #-- set new timer interval - if($key eq "interval") { - # check value - return "OWSWITCH: Set with short interval, must be > 1" - if(int($value) < 1); - # update timer - $hash->{INTERVAL} = $value; - RemoveInternalTimer($hash); - InternalTimer(gettimeofday()+$hash->{INTERVAL}, "OWSWITCH_GetValues", $hash, 1); - return undef; - } - - - #-- Set readings according to interface type - my $interface= $hash->{IODev}->{TYPE}; - - #-- set single state - # TODO: WAS passiert, wenn channel name noch falsch ist ? - if( $key eq "output" ){ - return "OWSWITCH: get needs parameter when writing output: " - if( int(@a)<2 ); - #-- find out which channel we have - my $fnd=undef; - for (my $i=0;$i<$cnumber{$attr{$name}{"model"}};$i++){ - if( ($a[2] eq $owg_channel[$i]) || ($a[2] eq $owg_fixed[$i]) ){ - $fnd=$i; - last; - } - } - return "OWSWITCH: invalid output address, must be A,B,... or defined channel name" - if( !defined($fnd) ); - #-- prepare gpio value - my $nval; - if( lc($a[3]) eq "on" ){ - $nval = 0; - }elsif( lc($a[3]) eq "off" ){ - $nval = 1; - }else{ - return "OWSWITCH: Wrong data value $a[3], must be ON or OFF"; - } - - #-- OWX interface - if( $interface eq "OWX" ){ - $ret = OWXSWITCH_GetState($hash); - $value = 0; - #-- vax or val ? - for (my $i=0;$i<$cnumber{$attr{$name}{"model"}};$i++){ - $value += ($owg_vax[$i]<<$i) - if( $i != $fnd ); - $value += ($nval<<$i) - if( $i == $fnd ); - } - $ret = OWXSWITCH_SetState($hash,$value); - #-- OWFS interface - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSAD_GetPage($hash,"reading"); - #-- Unknown interface - }else{ - return "OWSWITCH: Get with wrong IODev type $interface"; - } - - #-- set state - }elsif( $key eq "gpio" ){ - #-- check value and write to device - return "OWSWITCH: Set with wrong value for gpio port, must be 0 <= gpio <= ".(1 << $cnumber{$attr{$name}{"model"}} - 1) - if( ! ((int($value) >= 0) && (int($value) <= (1 << $cnumber{$attr{$name}{"model"}} -1 ))) ); - - if( $interface eq "OWX" ){ - $ret = OWXSWITCH_SetState($hash,int($value)); - #}elsif( $interface eq "OWFS" ){ - # $ret = OWFSSWITCH_GetValues($hash); - }else{ - return "OWSWITCH: GetValues with wrong IODev type $interface"; - } - } - - #-- process results - we have to reread the device - $hash->{PRESENT} = 1; - OWSWITCH_GetValues($hash); - #OWSWITCH_FormatValues($hash); - Log 4, "OWSWITCH: Set $hash->{NAME} $key $value"; - #$hash->{CHANGED}[0] = $value; - return undef; -} - -######################################################################################## -# -# OWSWITCH_Undef - Implements UndefFn function -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWSWITCH_Undef ($) { - my ($hash) = @_; - delete($modules{OWSWITCH}{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 = OWFSSWITCH -# -######################################################################################## - - - -######################################################################################## -# -# The following subroutines in alphabetical order are only for a 1-Wire bus connected -# directly to the FHEM server -# -# Prefix = OWXSWITCH -# -######################################################################################## -# -# OWXAD_GetState - Get gpio ports from device -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWXSWITCH_GetState($) { - my ($hash) = @_; - - my ($select, $res, $res2, $res3, @data); - - #-- ID of the device - my $owx_dev = $hash->{ROM_ID}; - my $owx_rnf = substr($owx_dev,3,12); - my $owx_f = substr($owx_dev,0,2); - - #-- hash of the busmaster - my $master = $hash->{IODev}; - - my ($i,$j,$k); - - #-- family = 3A => DS2413 - if( $hash->{OW_FAMILY} eq "3A" ) { - #=============== get gpio values =============================== - #-- issue the match ROM command \x55 and the read gpio command - # \xF5 plus 2 empty bytes - #-- reset the bus - OWX_Reset($master); - #-- read the data - $res=OWX_Complex($master,$owx_dev,"\xF5",2); - if( $res eq 0 ){ - return "OWXSWITCH: Device $owx_dev not accessible in reading"; - } - #-- family = 12 => DS2406 - }elsif( $hash->{OW_FAMILY} eq "12" ) { - #=============== get gpio values =============================== - #-- issue the match ROM command \x55 and the access channel command - # \xF5 plus the two byte channel control and the value - $select=sprintf("\xF5\xDC\xFF"); - #-- reset the bus - OWX_Reset($master); - #-- read the data - $res=OWX_Complex($master,$owx_dev,$select,1); - if( $res eq 0 ){ - return "OWXSWITCH: Device $owx_dev not accessible in writing"; - } - #-- family = 29 => DS2408 - }elsif( $hash->{OW_FAMILY} eq "29" ) { - #=============== get gpio values =============================== - #-- issue the match ROM command \x55 and the read PIO rtegisters command - # \xF5 plus the two byte channel target address - #-- reading 9 + 3 + 10 data bytes = 22 bytes - $select=sprintf("\xF0\x88\x00"); - #-- reset the bus - OWX_Reset($master); - #-- read the data - $res=OWX_Complex($master,$owx_dev,$select,10); - if( $res eq 0 ){ - return "OWXSWITCH: Device $owx_dev not accessible in writing"; - } - } else { - return "OWXSWITCH: Unknown device family $hash->{OW_FAMILY}\n"; - } - - #-- process results - @data=split(//,substr($res,10)); - #return "invalid data length" - # if (@data != 22); - #return "invalid data" - # if (ord($data[17])<=0); - #return "invalid CRC" - # if (OWX_CRC8(substr($res,10,8),$data[18])==0); - - #-- reset the bus - OWX_Reset($master); - - # note: value 1 corresponds to OFF, 0 to ON normally - # note: val = input value, vax = output value - #-- family = 3A => DS2413 - if( $hash->{OW_FAMILY} eq "3A" ) { - $owg_val[0] = ord($data[0]) & 1; - $owg_vax[0] = (ord($data[0])>>1) & 1; - $owg_val[1] = (ord($data[0])>>2) & 1; - $owg_vax[1] = (ord($data[0])>>3) & 1; - - #-- family = 12 => DS2406 - }elsif( $hash->{OW_FAMILY} eq "12" ) { - $owg_val[0] = (ord($data[2])>>2) & 1; - $owg_vax[0] = ord($data[2]) & 1; - $owg_val[1] = (ord($data[2])>>3) & 1; - $owg_vax[1] = (ord($data[2])>>1) & 1; - #-- family = 29 => DS2408 - }elsif( $hash->{OW_FAMILY} eq "29" ) { - for(my $i=0;$i<8;$i++){ - $owg_val[$i] = (ord($data[2])>>$i) & 1; - $owg_vax[$i] = (ord($data[3])>>$i) & 1; - } - } - return undef -} - -######################################################################################## -# -# OWXSWITCH_SetPage - Set gpio ports of device -# -# Parameter hash = hash of device addressed -# value = integer value for device outputs -# -######################################################################################## - -sub OWXSWITCH_SetState($$) { - - my ($hash,$value) = @_; - - - my ($select, $res, $res2, @data); - - #-- ID of the device - my $owx_dev = $hash->{ROM_ID}; - my $owx_rnf = substr($owx_dev,3,12); - my $owx_f = substr($owx_dev,0,2); - - #-- hash of the busmaster - my $master = $hash->{IODev}; - - my ($i,$j,$k); - - #-- family = 3A => DS2413 - if( $hash->{OW_FAMILY} eq "3A" ) { - #=============== set gpio values =============================== - #-- issue the match ROM command \x55 and the write gpio command - # \x5A plus the value byte and its complement - $select=sprintf("\x5A%c%c",252+$value,3-$value); - #-- reset the bus - OWX_Reset($master); - #-- read the data - $res=OWX_Complex($master,$owx_dev,$select,1); - if( $res eq 0 ){ - return "OWXSWITCH: Device $owx_dev not accessible in writing"; - } - #-- family = 12 => DS2406 - }elsif( $hash->{OW_FAMILY} eq "12" ) { - #=============== set gpio values =============================== - # Writing the output state via the access channel command does - # not work contrary to documentation. Using the write status command - #-- issue the match ROM command \x55 and the read status command - # \xAA at address TA1 = \x07 TA2 = \x00 - #-- reset the bus - OWX_Reset($master); - #-- read the data - $res = OWX_Complex($master,$owx_dev,"\xAA\x07\x00",1); - my $stat = substr($res,10,1); - my $statneu = ( $stat & 159 ) | (($value<<5) & 96) ; - #-- issue the match ROM command \x55 and the write status command - # \x55 at address TA1 = \x07 TA2 = \x00 - # - $select=sprintf("\x55\x07\x00%c",$statneu); - #-- reset the bus - OWX_Reset($master); - #-- read the data - $res=OWX_Complex($master,$owx_dev,$select,2); - if( $res eq 0 ){ - return "OWXSWITCH: Device $owx_dev not accessible in writing"; - } - $owg_val[0] = $value % 2; - $owg_vax[0] = $owg_val[0]; - $owg_val[1] = int($value / 2); - $owg_vax[1] = $owg_val[1]; - #-- family = 29 => DS2408 - }elsif( $hash->{OW_FAMILY} eq "29" ) { - #=============== set gpio values =============================== - #-- issue the match ROM command \x55 and the write gpio command - # \x5A plus the value byte and its complement - $select=sprintf("\x5A%c%c",$value,255-$value); - #-- reset the bus - OWX_Reset($master); - #-- read the data - $res=OWX_Complex($master,$owx_dev,$select,1); - if( $res eq 0 ){ - return "OWXSWITCH: Device $owx_dev not accessible in writing"; - } - - } else { - return "OWXSWITCH: Unknown device family $hash->{OW_FAMILY}\n"; - } - #-- reset the bus - OWX_Reset($master); - - #-- process results - @data=split(//,substr($res,10)); - - #-- family = 3A => DS2413 - if( $hash->{OW_FAMILY} eq "3A" ) { - if( $data[2] ne "\xAA"){ - return "OWXSWITCH: State could not be set for device $owx_dev"; - } - #-- family = 12 => DS2406 - }elsif( $hash->{OW_FAMILY} eq "12" ) { - #-- very crude check - should be CRC - if( int(@data) != 5){ - return "OWXSWITCH: State could not be set for device $owx_dev"; - } - #-- family = 29 => DS2408 - }elsif( $hash->{OW_FAMILY} eq "29" ) { - if( $data[2] ne "\xAA"){ - return "OWXSWITCH: State could not be set for device $owx_dev"; - } - } - return undef - -} - -1; diff --git a/fhem/contrib/1-Wire/21_OWTHERM.pm b/fhem/contrib/1-Wire/21_OWTHERM.pm deleted file mode 100755 index c2c962cc3..000000000 --- a/fhem/contrib/1-Wire/21_OWTHERM.pm +++ /dev/null @@ -1,815 +0,0 @@ -######################################################################################## -# -# OWTHERM.pm -# -# FHEM module to commmunicate with 1-Wire temperature sensors DS1820, DS18S20, DS18B20, DS1822 -# -# Attention: This module may communicate with the OWX module, -# and also with the 1-Wire File System OWFS -# -# Prefixes for subroutines of this module: -# OW = General 1-Wire routines (Martin Fischer, Peter Henning) -# OWFS = 1-Wire file system (Martin Fischer) -# OWX = 1-Wire bus master interface (Peter Henning) -# -# Prof. Dr. Peter A. Henning, 2012 -# Martin Fischer, 2011 -# -# Version 2.24 - October, 2012 -# -# Setup bus device in fhem.cfg as -# -# define OWTHERM [] [interval] -# -# where may be replaced by any name string -# -# is a 1-Wire device type. If omitted, we assume this to be an -# DS1820 temperature sensor -# Currently allowed values are DS1820, DS18B20, DS1822 -# 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 => OW_FAMILY.ROM_ID.CRC -# get present => 1 if device present, 0 if not -# get interval => query interval -# get temperature => temperature measurement -# get alarm => alarm temperature settings -# -# set interval => set period for measurement -# set tempLow => lower alarm temperature setting -# set tempHigh => higher alarm temperature setting -# -# Additional attributes are defined in fhem.cfg -# Note: attributes "tempXXXX" are read during every update operation. -# -# attr event on-change/on-update = when to write an event (default= on-update) -# -# attr stateAL "" = character string for denoting low alarm condition, default is red down triangle -# attr stateAH "" = character string for denoting high alarm condition, default is red up triangle -# attr tempOffset = temperature offset in degree Celsius added to the raw temperature reading -# attr tempUnit = unit of measurement, e.g. Celsius/Kelvin/Fahrenheit or C/K/F, default is Celsius -# attr tempLow = value for low alarm -# attr tempHigh = value 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; - -#-- Prototypes to make komodo happy -use vars qw{%attr %defs}; -use strict; -use warnings; -sub Log($$); - -#-- temperature globals - always the raw values from the device -my $owg_temp = 0; -my $owg_th = 0; -my $owg_tl = 0; - -#-- variables for display strings -my $stateal; -my $stateah; - -my %gets = ( - "id" => "", - "present" => "", - "interval" => "", - "temperature" => "", - "alarm" => "" -); - -my %sets = ( - "interval" => "", - "tempHigh" => "", - "tempLow" => "" -); - -my %updates = ( - "present" => "", - "temperature" => "", - "alarm" => "" -); - -######################################################################################## -# -# The following subroutines are independent of the bus interface -# -# Prefix = OWTHERM -# -######################################################################################## -# -# OWTHERM_Initialize -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWTHERM_Initialize ($) { - my ($hash) = @_; - - $hash->{DefFn} = "OWTHERM_Define"; - $hash->{UndefFn} = "OWTHERM_Undef"; - $hash->{GetFn} = "OWTHERM_Get"; - $hash->{SetFn} = "OWTHERM_Set"; - #tempOffset = a temperature offset added to the temperature reading for correction - #tempUnit = a unit of measure: C/F/K - $hash->{AttrList}= "IODev do_not_notify:0,1 showtime:0,1 loglevel:0,1,2,3,4,5 ". - "event:on-update,on-change ". - "stateAL stateAH ". - "tempOffset tempUnit:C,Celsius,F,Fahrenheit,K,Kelvin ". - "tempLow tempHigh"; - } - -######################################################################################## -# -# OWTHERM_Define - Implements DefFn function -# -# Parameter hash = hash of device addressed, def = definition string -# -######################################################################################## - -sub OWTHERM_Define ($$) { - my ($hash, $def) = @_; - - # define OWTHERM [] [interval] - # e.g.: define flow OWTHERM 525715020000 300 - my @a = split("[ \t][ \t]*", $def); - - my ($name,$model,$fam,$id,$crc,$interval,$ret); - my $tn = TimeNow(); - - #-- default - $name = $a[0]; - $interval = 300; - $ret = ""; - - #-- check syntax - return "OWTHERM: Wrong syntax, must be define OWTHERM [] [interval]" - if(int(@a) < 2 || int(@a) > 6); - - #-- 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 eq "none") || ($a3 eq "none") ) { - return "OWTHERM: ID = none is obsolete now, please redefine"; - } elsif( $a2 =~ m/^[0-9|a-f|A-F]{12}$/ ) { - $model = "DS1820"; - $id = $a[2]; - if(int(@a)>=4) { $interval = $a[3]; } - Log 1, "OWTHERM: Parameter [alarminterval] is obsolete now - must be set with I/O-Device" - if(int(@a) == 5); - } elsif( $a3 =~ m/^[0-9|a-f|A-F]{12}$/ ) { - $model = $a[2]; - $id = $a[3]; - if(int(@a)>=5) { $interval = $a[4]; } - Log 1, "OWTHERM: Parameter [alarminterval] is obsolete now - must be set with I/O-Device" - if(int(@a) == 6); - } else { - return "OWTHERM: $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 "DS1820" ){ - $fam = "10"; - }elsif( $model eq "DS1822" ){ - $fam = "22"; - }elsif( $model eq "DS18B20" ){ - $fam = "28"; - }else{ - return "OWTHERM: 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->{ALARM} = 0; - $hash->{OW_ID} = $id; - $hash->{OW_FAMILY} = $fam; - $hash->{PRESENT} = 0; - $hash->{ROM_ID} = $fam.".".$id.$crc; - $hash->{INTERVAL} = $interval; - - #-- Couple to I/O device - AssignIoPort($hash); - Log 3, "OWTHERM: Warning, no 1-Wire I/O device found for $name." - if(!defined($hash->{IODev}->{NAME})); - $modules{OWTHERM}{defptr}{$id} = $hash; - $hash->{STATE} = "Defined"; - Log 3, "OWTHERM: Device $name defined."; - - #-- Start timer for initialization in a few seconds - InternalTimer(time()+10, "OWTHERM_InitializeDevice", $hash, 0); - - #-- Start timer for updates - InternalTimer(time()+$hash->{INTERVAL}, "OWTHERM_GetValues", $hash, 0); - - return undef; -} - -######################################################################################## -# -# OWTHERM_InitializeDevice - delayed setting of initial readings and channel names -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWTHERM_InitializeDevice($) { - my ($hash) = @_; - - my $name = $hash->{NAME}; - my @args; - - $stateal = defined($attr{$name}{stateAL}) ? $attr{$name}{stateAL} : ""; - $stateah = defined($attr{$name}{stateAH}) ? $attr{$name}{stateAH} : ""; - - #-- unit attribute defined ? - $hash->{READINGS}{"temperature"}{UNIT} = defined($attr{$name}{"tempUnit"}) ? $attr{$name}{"tempUnit"} : "Celsius"; - $hash->{READINGS}{"temperature"}{TYPE} = "temperature"; - - #-- Initial readings temperature sensor - $owg_temp = 0.0; - $owg_tl = defined($attr{$name}{"tempLow"}) ? $attr{$name}{"tempLow"} : 0.0; - $owg_th = defined($attr{$name}{"tempHigh"}) ? $attr{$name}{"tempHigh"} : 100.0; - #-- Initialize all the display stuff - OWTHERM_FormatValues($hash); - #-- alarm - @args = ($name,"tempLow",$owg_tl); - OWTHERM_Set($hash,@args); - @args = ($name,"tempHigh",$owg_th); - OWTHERM_Set($hash,@args); - -} - -######################################################################################## -# -# OWTHERM_FormatValues - put together various format strings -# -# Parameter hash = hash of device addressed, fs = format string -# -######################################################################################## - -sub OWTHERM_FormatValues($) { - my ($hash) = @_; - - my $name = $hash->{NAME}; - my ($unit,$offset,$factor,$abbr,$vval,$vlow,$vhigh,$statef); - my ($value1,$value2,$value3) = ("","",""); - - my $tn = TimeNow(); - - #-- attributes defined ? - $stateal = defined($attr{$name}{stateAL}) ? $attr{$name}{stateAL} : ""; - $stateah = defined($attr{$name}{stateAH}) ? $attr{$name}{stateAH} : ""; - $unit = defined($attr{$name}{"tempUnit"}) ? $attr{$name}{"tempUnit"} : $hash->{READINGS}{"temperature"}{UNIT}; - $offset = defined($attr{$name}{"tempOffset"}) ? $attr{$name}{"tempOffset"} : 0.0 ; - $factor = 1.0; - - if( $unit eq "Celsius" ){ - $abbr = "°C"; - } elsif ($unit eq "Kelvin" ){ - $abbr = "K"; - $offset += "273.16" - } elsif ($unit eq "Fahrenheit" ){ - $abbr = "°F"; - $offset = ($offset+32)/1.8; - $factor = 1.8; - } else { - $abbr="?"; - Log 1, "OWTHERM_FormatValues: unknown unit $unit"; - } - #-- these values are rather coplex to obtain, therefore save them in the hash - $hash->{READINGS}{"temperature"}{UNIT} = $unit; - $hash->{READINGS}{"temperature"}{UNITABBR} = $abbr; - $hash->{tempf}{offset} = $offset; - $hash->{tempf}{factor} = $factor; - - #-- correct values for proper offset, factor - $vval = ($owg_temp + $offset)*$factor; - - #-- put into READINGS - $hash->{READINGS}{"temperature"}{VAL} = $vval; - $hash->{READINGS}{"temperature"}{TIME} = $tn; - - #-- correct alarm values for proper offset, factor - $vlow = ($owg_tl + $offset)*$factor; - $vhigh = ($owg_th + $offset)*$factor; - - #-- put into READINGS - $hash->{READINGS}{"tempLow"}{VAL} = $vlow; - $hash->{READINGS}{"tempLow"}{TIME} = $tn; - $hash->{READINGS}{"tempHigh"}{VAL} = $vhigh; - $hash->{READINGS}{"tempHigh"}{TIME} = $tn; - - #-- formats for output - $statef = "%5.2f ".$abbr; - $value1 = "temperature: ".sprintf($statef,$vval); - $value2 = sprintf($statef,$vval); - $hash->{ALARM} = 1; - - #-- Test for alarm condition - if( ($vval <= $vlow) && ( $vval >= $vhigh ) ){ - $value2 .= " ".$stateal.$stateah; - $value3 .= " ".$stateal.$stateah; - }elsif( $vval <= $vlow ){ - $value2 .= " ".$stateal; - $value3 .= " ".$stateal; - }elsif( $vval >= $vhigh ){ - $value2 .= " ".$stateah; - $value3 .= " ".$stateah; - } else { - $hash->{ALARM} = 0; - } - - #-- STATE - $hash->{STATE} = $value2; - #-- alarm - #$hash->{READINGS}{alarms}{VAL} = $value3; - #$hash->{READINGS}{alarms}{TIME} = $tn; - return $value1; -} - -######################################################################################## -# -# OWTHERM_Get - Implements GetFn function -# -# Parameter hash = hash of device addressed, a = argument array -# -######################################################################################## - -sub OWTHERM_Get($@) { - my ($hash, @a) = @_; - - my $reading = $a[1]; - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - my $value = undef; - my $ret = ""; - - #-- check syntax - return "OWTHERM: Get argument is missing @a" - if(int(@a) != 2); - - #-- check argument - return "OWTHERM: 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 other values according to interface type - my $interface= $hash->{IODev}->{TYPE}; - - #-- get present - if($a[1] eq "present" ) { - #-- OWX interface - if( $interface eq "OWX" ){ - #-- hash of the busmaster - my $master = $hash->{IODev}; - $value = OWX_Verify($master,$hash->{ROM_ID}); - $hash->{PRESENT} = $value; - return "$name.present => $value"; - } else { - return "OWTHERM: Verification not yet implemented for interface $interface"; - } - } - - #-- get interval - if($reading eq "interval") { - $value = $hash->{INTERVAL}; - return "$name.interval => $value"; - } - - #-- reset presence - $hash->{PRESENT} = 0; - - #-- OWX interface - if( $interface eq "OWX" ){ - #-- not different from getting all values .. - $ret = OWXTHERM_GetValues($hash); - #-- OWFS interface - }elsif( $interface eq "OWFS" ){ - $ret = OWFSTHERM_GetValues($hash); - #-- Unknown interface - }else{ - return "OWTHERM: Get with wrong IODev type $interface"; - } - - #-- process results - if( defined($ret) ){ - return "OWTHERM: Could not get values from device $name, return was $ret"; - } - $hash->{PRESENT} = 1; - OWTHERM_FormatValues($hash); - - #-- return the special reading - if ($reading eq "temperature") { - return "OWTHERM: $name.temperature => ". - $hash->{READINGS}{"temperature"}{VAL}; - } elsif ($reading eq "alarm") { - return "OWTHERM: $name.alarm => L ".$hash->{READINGS}{"tempLow"}{VAL}. - " H ".$hash->{READINGS}{"tempHigh"}{VAL}; - } - return undef; -} - -####################################################################################### -# -# OWTHERM_GetValues - Updates the readings from device -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWTHERM_GetValues($@) { - my $hash = shift; - - my $name = $hash->{NAME}; - my $value = ""; - my $ret = ""; - - #-- restart timer for updates - RemoveInternalTimer($hash); - InternalTimer(time()+$hash->{INTERVAL}, "OWTHERM_GetValues", $hash, 1); - - #-- reset presence - $hash->{PRESENT} = 0; - - #-- Get values according to interface type - my $interface= $hash->{IODev}->{TYPE}; - if( $interface eq "OWX" ){ - #-- max 3 tries - for(my $try=0; $try<3; $try++){ - $ret = OWXTHERM_GetValues($hash); - last - if( !defined($ret) ); - } - }elsif( $interface eq "OWFS" ){ - $ret = OWFSTHERM_GetValues($hash); - }else{ - Log 3, "OWTHERM: GetValues with wrong IODev type $interface"; - return 1; - } - - #-- process results - if( defined($ret) ){ - Log 3, "OWTHERM: Could not get values from device $name, reason $ret"; - return 1; - } - $hash->{PRESENT} = 1; - - #-- old state, new state - my $oldval = $hash->{STATE}; - $value=OWTHERM_FormatValues($hash); - my $newval = $hash->{STATE}; - #--logging depends on setting of the event-attribute - Log 5, $value; - my $ev = defined($attr{$name}{"event"}) ? $attr{$name}{"event"} : "on-update"; - if( ($ev eq "on-update") || (($ev eq "on-change") && ($newval ne $oldval)) ){ - $hash->{CHANGED}[0] = $value; - DoTrigger($name, undef); - } - - return undef; -} - -####################################################################################### -# -# OWTHERM_Set - Set one value for device -# -# Parameter hash = hash of device addressed -# a = argument string -# -######################################################################################## - -sub OWTHERM_Set($@) { - my ($hash, @a) = @_; - - #-- for the selector: which values are possible - return join(" ", sort keys %sets) if(@a == 2); - #-- check syntax - return "OWTHERM: Set needs one parameter" - if(int(@a) != 3); - #-- check argument - return "OWTHERM: Set with unknown argument $a[1], choose one of ".join(",", sort keys %sets) - if(!defined($sets{$a[1]})); - - #-- define vars - my $key = $a[1]; - my $value = $a[2]; - my $ret = undef; - my $name = $hash->{NAME}; - my $model = $hash->{OW_MODEL}; - - #-- set new timer interval - if($key eq "interval") { - # check value - return "OWTHERM: Set with short interval, must be > 1" - if(int($value) < 1); - # update timer - $hash->{INTERVAL} = $value; - RemoveInternalTimer($hash); - InternalTimer(gettimeofday()+$hash->{INTERVAL}, "OWTHERM_GetValues", $hash, 1); - return undef; - } - - #-- set other values depending on interface type - my $interface = $hash->{IODev}->{TYPE}; - my $offset = $hash->{tempf}{offset}; - my $factor = $hash->{tempf}{factor}; - - #-- find upper and lower boundaries for given offset/factor - my $mmin = (-55+$offset)*$factor; - my $mmax = (125+$offset)*$factor; - return sprintf("OWTHERM: Set with wrong value $value for $key, range is [%3.1f,%3.1f]",$mmin,$mmax) - if($value < $mmin || $value > $mmax); - - #-- seems to be ok, put into the device - $a[2] = int($value/$factor-$offset); - - #-- OWX interface - if( $interface eq "OWX" ){ - $ret = OWXTHERM_SetValues($hash,@a); - #-- OWFS interface - }elsif( $interface eq "OWFS" ){ - $ret = OWFSTHERM_SetValues($hash,@a); - return $ret - if(defined($ret)); - } else { - return "OWTHERM: Set with wrong IODev type $interface"; - } - - #-- process results - we have to reread the device - $hash->{PRESENT} = 1; - OWTHERM_GetValues($hash); - OWTHERM_FormatValues($hash); - Log 4, "OWTHERM: Set $hash->{NAME} $key $value"; - - return undef; -} - -######################################################################################## -# -# OWTHERM_Undef - Implements UndefFn function -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWTHERM_Undef ($) { - my ($hash) = @_; - - delete($modules{OWTHERM}{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 = OWFSTHERM -# -######################################################################################## -# -# OWFSTHERM_GetValues - Get reading from one device -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWFSTHERM_GetValues($) -{ - my ($hash) = @_; - - my $ret = OW::get("/uncached/".$hash->{OW_FAMILY}.".".$hash->{OW_ID}."/temperature"); - if( defined($ret) ) { - $hash->{PRESENT} = 1; - $owg_temp = $ret; - $owg_th = OW::get("/uncached/".$hash->{OW_FAMILY}.".".$hash->{OW_ID}."/temphigh"); - $owg_tl = OW::get("/uncached/".$hash->{OW_FAMILY}.".".$hash->{OW_ID}."/templow"); - } else { - $hash->{PRESENT} = 0; - $owg_temp = 0.0; - $owg_th = 0.0; - $owg_tl = 0.0; - } - - return undef; -} - -####################################################################################### -# -# OWFSTHERM_SetValues - Implements SetFn function -# -# Parameter hash = hash of device addressed -# a = argument array -# -######################################################################################## - -sub OWFSTHERM_SetValues($@) { - my ($hash, @a) = @_; - - #-- define vars - my $key = lc($a[1]); - my $value = $a[2]; - - return OW::put($hash->{OW_FAMILY}.".".$hash->{OW_ID}."/$key",$value); -} - -######################################################################################## -# -# The following subroutines in alphabetical order are only for a 1-Wire bus connected -# directly to the FHEM server -# -# Prefix = OWXTHERM -# -######################################################################################## -# -# OWXTHERM_GetValues - Get reading from one device -# -# Parameter hash = hash of device addressed -# -######################################################################################## - -sub OWXTHERM_GetValues($) { - - my ($hash) = @_; - - my ($i,$j,$k); - - #-- For default, perform the conversion NOT now - my $con=1; - - #-- ID of the device - my $owx_dev = $hash->{ROM_ID}; - #-- hash of the busmaster - my $master = $hash->{IODev}; - - #-- check, if the conversion has been called before - only on devices with real power - if( defined($attr{$hash->{IODev}->{NAME}}{buspower}) && ( $attr{$hash->{IODev}->{NAME}}{buspower} eq "real") ){ - $con=0; - } - - #-- if the conversion has not been called before - if( $con==1 ){ - OWX_Reset($master); - #-- issue the match ROM command \x55 and the start conversion command - if( OWX_Complex($master,$owx_dev,"\x44",0) eq 0 ){ - return "$owx_dev not accessible"; - } - #-- conversion needs some 950 ms - but we may also do it in shorter time ! - select(undef,undef,undef,1.0); - } - - #-- NOW ask the specific device - OWX_Reset($master); - #-- issue the match ROM command \x55 and the read scratchpad command \xBE - #-- reading 9 + 1 + 8 data bytes and 1 CRC byte = 19 bytes - my $res=OWX_Complex($master,$owx_dev,"\xBE",9); - #Log 1,"OWXTHERM: data length from reading device is ".length($res)." bytes"; - #-- process results - if( $res eq 0 ){ - return "$owx_dev not accessible in 2nd step"; - } - - #-- process results - my @data=split(//,$res); - return "invalid data length, ".int(@data)." bytes" - if (@data != 19); - return "invalid data" - if (ord($data[17])<=0); - return "invalid CRC" - if (OWX_CRC8(substr($res,10,8),$data[18])==0); - - #-- this must be different for the different device types - # family = 10 => DS1820, DS18S20 - if( $hash->{OW_FAMILY} eq "10" ) { - - my $count_remain = ord($data[16]); - my $count_perc = ord($data[17]); - my $delta = -0.25 + ($count_perc - $count_remain)/$count_perc; - - my $lsb = ord($data[10]); - my $msb = 0; - my $sign = ord($data[11]) & 255; - - #-- test with -25 degrees - #$lsb = 12*16+14; - #$sign = 1; - #$delta = 0; - - #-- 2's complement form = signed bytes - $owg_temp = int($lsb/2) + $delta; - if( $sign !=0 ){ - $owg_temp = -128+$owg_temp; - } - - $owg_th = ord($data[12]) > 127 ? 128-ord($data[12]) : ord($data[12]); - $owg_tl = ord($data[13]) > 127 ? 128-ord($data[13]) : ord($data[13]); - - return undef; - - } elsif ( ($hash->{OW_FAMILY} eq "22") || ($hash->{OW_FAMILY} eq "28") ) { - - my $lsb = ord($data[10]); - my $msb = ord($data[11]) & 7; - my $sign = ord($data[11]) & 248; - - #-- test with -55 degrees - #$lsb = 9*16; - #$sign = 1; - #$msb = 7; - - #-- 2's complement form = signed bytes - $owg_temp = $msb*16+ $lsb/16; - if( $sign !=0 ){ - $owg_temp = -128+$owg_temp; - } - $owg_th = ord($data[12]) > 127 ? 128-ord($data[12]) : ord($data[12]); - $owg_tl = ord($data[13]) > 127 ? 128-ord($data[13]) : ord($data[13]); - - return undef; - - } else { - return "OWXTHERM: Unknown device family $hash->{OW_FAMILY}\n"; - } -} - -####################################################################################### -# -# OWXTHERM_SetValues - Implements SetFn function -# -# Parameter hash = hash of device addressed -# a = argument array -# -######################################################################################## - -sub OWXTHERM_SetValues($@) { - my ($hash, @a) = @_; - - my ($i,$j,$k); - - my $name = $hash->{NAME}; - #-- ID of the device - my $owx_dev = $hash->{ROM_ID}; - #-- hash of the busmaster - my $master = $hash->{IODev}; - - #-- define vars - my $key = $a[1]; - my $value = $a[2]; - $owg_tl = $value if( $key eq "tempLow" ); - $owg_th = $value if( $key eq "tempHigh" ); - - #-- put into 2's complement formed (signed byte) - my $tlp = $owg_tl < 0 ? 128 - $owg_tl : $owg_tl; - my $thp = $owg_th < 0 ? 128 - $owg_th : $owg_th; - - OWX_Reset($master); - - #-- issue the match ROM command \x55 and the write scratchpad command \x4E, - # followed by the write EEPROM command \x48 - # - # so far writing the EEPROM does not work properly. - # 1. \x48 directly appended to the write scratchpad command => command ok, no effect on EEPROM - # 2. \x48 appended to match ROM => command not ok. - # 3. \x48 sent by WriteBytePower after match ROM => command ok, no effect on EEPROM - - my $select=sprintf("\x4E%c%c\x48",$thp,$tlp); - my $res=OWX_Complex($master,$owx_dev,$select,0); - - if( $res eq 0 ){ - return "OWXTHERM: Device $owx_dev not accessible"; - } - - DoTrigger($name, undef) if($init_done); - return undef; -} - - - -1; diff --git a/fhem/contrib/1-Wire/LCD_Terminal1.png b/fhem/contrib/1-Wire/LCD_Terminal1.png deleted file mode 100755 index 0c953e3dab7775177771c4846d5b04aee9a4eea9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89714 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 $KCR8^^QN-sf~e(KIX)iV6PS4D>lXkl%W2$! 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

{{aC({=V__chp_|6gF57U~mmc}j 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�W`*cd3QgnhcUlT)!GlCe93!D&UW~^; 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М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 diff --git a/fhem/contrib/1-Wire/Schaltplan_USB_1-Wire_Interface.png b/fhem/contrib/1-Wire/Schaltplan_USB_1-Wire_Interface.png deleted file mode 100644 index 4c5f08cefbf7a782fc917adb9d8f7a9091dc6478..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41324 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 LaI!C@dHw4@*a%yN diff --git a/fhem/contrib/1-Wire/commandref.html b/fhem/contrib/1-Wire/commandref.html deleted file mode 100755 index 67d5537ac..000000000 --- a/fhem/contrib/1-Wire/commandref.html +++ /dev/null @@ -1,786 +0,0 @@ - - - - - - -

OWX

-
    FHEM module to commmunicate with 1-Wire bus devices
      -
    • via an active DS2480/DS2482/DS2490/DS9097U bus master interface attached to an - USB port or
    • -
    • via a passive DS9097 interface attached to an USB port or
    • -
    • via a network-attached CUNO or through a COC on the RaspBerry Pi
    • -
    Internally these interfaces are vastly different, read the corresponding Wiki pages -
    -
    - Example
    -
      - define OWio1 OWX /dev/ttyUSB1 -
      - define OWio2 OWX COC -
      -
    -
    - - Define -
      - define <name> OWX <serial-device> or
      - define <name> OWX <cuno/coc-device> -

      Define a 1-Wire interface to communicate with a 1-Wire bus.
      -
      -
    • - <serial-device> The serial device (e.g. USB port) to which - the 1-Wire bus is attached.
    • -
    • - <cuno-device> The previously defined CUNO to which the 1-Wire - bus is attached.
    • -
    -
    - - Set -
      -
    • - set <name> interval <value> - -

      sets the time period in seconds for "kicking" the 1-Wire bus - (default is 300 seconds). This means:
        -
      • 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.
      • -
      • 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)
      • -
      • With 1-Wire bus interfaces that contain a busmaster chip, the response - to a reset pulse contains information about alarms.
      • -

      -
    • -
    • - set <name> followAlarms on|off - -

      instructs the module to start an alarm search in case a reset pulse - discovers any 1-Wire device which has the alarm flag set.
    • -
    -
    - - Get -
      -
    • - get <name> alarms -

      performs an "alarm search" for devices on the 1-Wire bus and, if - found, generates an event in the log (not with CUNO).
    • -
      -
    • - get <name> devices -

      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.
    • -
      -
      -
    - - Attributes - -
- - -

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 -
      -
    • attr <name> stateAL0 - <string> -
      character string for denoting low normal condition, default is green down - triangle, e.g. the code <span - style="color:green">&#x25BE;</span> leading to the sign -
    • -
    • attr <name> stateAH0 - <string> -
      character string for denoting high alarm condition, default is green - upward triangle, e.g. the code <span - style="color:green">&#x25B4;</span> leading to the sign -
    • -
    • attr <name> stateAL1 - <string> -
      character string for denoting low alarm condition, default is red down - triangle, e.g. the code <span style="color:red">&#x25BE;</span> - leading to the sign
    • -
    • attr <name> stateAH1 - <string> -
      character string for denoting high alarm condition, default is red upward - triangle, e.g. the code <span style="color:red">&#x25B4;</span> - leading to the sign -
    • -
    For each of the following attributes, the channel identification A,B,C,D may be - used. -
- - -

OWCOUNT

- - - -

OWID

-
    FHEM module for 1-Wire devices that know only their unique ROM ID
    -
    Note:
    This 1-Wire module so far works only with the OWX interface module. - Please define an OWX device first.
    -
    Example
    -
      - define ROM1 OWX_ID OWCOUNT CE780F000000 -
      -

    - - Define -
      - define <name> OWID <id> -

      Define a 1-Wire device.

      -
    • - <id> -
      12-character unique ROM id of the converter device without family id and - CRC code
    • -
    -
    - - Get - -
    -
- - -

OWLCD

- - - -

OWMULTI

-
    FHEM module to commmunicate with 1-Wire multi-sensors, currently the DS2438 smart battery monitor

    Note:
    This - 1-Wire module so far works only with the OWX interface module. Please define an OWX device first.
    -
    Example
    -
      - define OWX_M OWMULTI 7C5034010000 45 -
      - attr OWX_M VName relHumidity|humidity -
      - attr OWX_M VUnit percent|% -
      - attr OWX_M VFunction (161.29 * V / VDD - 25.8065)/(1.0546 - 0.00216 * T) -
      -

    - - Define -
      - define <name> OWMULTI [<model>] <id> [<interval>] -

      Define a 1-Wire multi-sensor

      -
    • - [<model>]
      Defines the sensor model (and thus - 1-Wire family id), currently the following values are permitted:
        -
      • 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
      • -
      -
    • -
    • - <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 - - - -

    OWSWITCH

    -
      FHEM module to commmunicate with 1-Wire Programmable Switches

      Note:
      - This 1-Wire module so far works only with the OWX interface module. Please define an OWX device first.
      -
      Example
      -
        - define OWX_S OWSWITCH DS2413 B5D502000000 60 -
        - attr OWX_S AName Lampe|light -
        - attr OWX_S AUnit AN|AUS -
        -
      -
      - - Define -
        - define <name> OWSWITCH [<model>] <id> - [<interval>] -

        Define a 1-Wire switch.

        -
      • - [<model>]
        Defines the switch model (and thus 1-Wire - family id), currently the following values are permitted:
          -
        • model DS2413 with family id 3A (default if the model parameter is - omitted). 2 Channel switch with onboard memory
        • -
        • model DS2406 with family id 12. 2 Channel switch
        • -
        • model DS2406 with family id 29. 8 Channel switch
        • -
        -
      • -
      • - <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 -
        -
      • - get <name> id -
        Returns the full 1-Wire device id OW_FAMILY.ROM_ID.CRC
      • -
      • - get <name> present - -
        Returns 1 if this 1-Wire device is present, otherwise 0.
      • -
      • - get <name> interval
        Returns measurement interval - in seconds.
      • -
      • - get <name> input <channel-name>
        - 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.
      • -
      • - get <name> gpio
        Obtain state of all - channels
      • -
      -
      - - Attributes For each of the following attributes, the channel - identification A,B,... may be used. -
    - - -

    OWTHERM

    -
      FHEM module to commmunicate with 1-Wire bus digital thermometer devices

      - Note:
      This is the only 1-Wire module which so far works with both the OWFS and the - OWX interface module. Please define an OWFS device or an OWX device first.
      -
      Example
      -
        - define OWX_T OWTHERM DS18B20 E8D09B030000 300 -
        - attr OWX_T tempUnit Kelvin -
        -

      - - Define -
        - define <name> OWTHERM [<model>] <id> - [<interval>] -

        Define a 1-Wire digital thermometer device.

        -
      • - [<model>]
        Defines the thermometer model (and thus - 1-Wire family id) currently the following values are permitted:
          -
        • model DS1820 with family id 10 (default if the model parameter is - omitted)
        • -
        • model DS1822 with family id 22
        • -
        • model DS18B20 with family id 28
        • -
        -
      • -
      • - <id> -
        12-character unique ROM id of the thermometer device without family id and - CRC code
      • -
      • - <interval> -
        Temperature measurement interval in seconds. The default is 300 seconds.
      • -
        Example:
        - define Temp1 OWTHERM 14B598010800 300
        -
      -
      - - Set - -
      - - Get - -
      - - Attributes - -
    - - -
    - -