mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-24 15:19:21 +00:00
00_OWX.pm: Bugfix globale Variablen
21_OWMULTI.pm: Neue Version, angepasst für die Funktionen des Batterie-Monitoring 21_OWTHERM.pm: Neue Version 36_Shelly.pm: Bugfix git-svn-id: https://svn.fhem.de/fhem/trunk@20282 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
b351fbd75a
commit
36b7898726
@ -53,7 +53,7 @@ sub Log3($$$);
|
||||
use vars qw{%owg_family %gets %sets $owx_version $owx_debug};
|
||||
# 1-Wire devices
|
||||
# http://owfs.sourceforge.net/family.html
|
||||
%owg_family = (
|
||||
my %owg_family = (
|
||||
"01" => ["DS2401/DS2411/DS1990A","OWID DS2401"],
|
||||
"05" => ["DS2405","OWID DS2405"],
|
||||
"09" => ["DS2502","OWID DS2502"],
|
||||
@ -79,7 +79,7 @@ use vars qw{%owg_family %gets %sets $owx_version $owx_debug};
|
||||
);
|
||||
|
||||
#-- These we may get on request
|
||||
%gets = (
|
||||
my %gets = (
|
||||
"alarms" => "A",
|
||||
"devices" => "D",
|
||||
"version" => "V",
|
||||
@ -88,7 +88,7 @@ use vars qw{%owg_family %gets %sets $owx_version $owx_debug};
|
||||
|
||||
#-- These occur in a pulldown menu as settable values for the bus master
|
||||
# (expert mode: all, standard mode: only reopen)
|
||||
%sets = (
|
||||
my %sets = (
|
||||
"close" => "c",
|
||||
"open" => "O",
|
||||
"reopen" => "R",
|
||||
@ -99,7 +99,7 @@ use vars qw{%owg_family %gets %sets $owx_version $owx_debug};
|
||||
);
|
||||
|
||||
#-- some globals needed for the 1-Wire module
|
||||
$owx_version="7.11";
|
||||
$owx_version="7.21";
|
||||
|
||||
#-- debugging now verbosity, this is just for backward compatibility
|
||||
$owx_debug=0;
|
||||
@ -191,7 +191,7 @@ sub OWX_Define ($$) {
|
||||
$hwdevice = OWX_I2C->new($hash);
|
||||
|
||||
#-- check if we have a COC/CUNO interface attached
|
||||
}elsif( $defs{$dev} && $defs{$dev}->{VERSION} && $defs{$dev}->{VERSION} =~ m/CSM|CUNO|MapleCUN...(4|5|6|7|C|D|E|F)/ ){
|
||||
}elsif( $defs{$dev} && $defs{$dev}->{VERSION} && $defs{$dev}->{VERSION} =~ m/CSM|CUNO|CUBE|MapleCUN...(4|5|6|7|C|D|E|F)/ ){
|
||||
require "$attr{global}{modpath}/FHEM/11_OWX_CCC.pm";
|
||||
$hwdevice = OWX_CCC->new($hash);
|
||||
|
||||
@ -1542,7 +1542,7 @@ sub OWX_PrQueue($){
|
||||
if ( defined($slave->{NEXTSEND})){
|
||||
if( $now < $slave->{NEXTSEND} ){
|
||||
#-- reschedule, if necessary
|
||||
if( ($qlen==1) || (($qlen > 1) && ($queue->[1]{$hash} eq $slave)) ){
|
||||
if( ($qlen==1) || (($qlen > 1) && $queue->[1]{$hash} && ($queue->[1]{$hash} eq $slave)) ){
|
||||
#Log 1, "OWX_PrQueue: device ".$slave->{NAME}." mindelay not over, rescheduling."
|
||||
InternalTimer($now+$shortDelay, "OWX_PrQueue", "queue:$name", 0);
|
||||
return;
|
||||
@ -1733,7 +1733,7 @@ sub OWX_WDBGL($$$$) {
|
||||
<a name="OWX"></a>
|
||||
<h3>OWX</h3>
|
||||
<ul>
|
||||
<a href="http://fhemwiki.de/wiki/Interfaces_f%C3%BCr_1-Wire">Deutsche Dokumentation im Wiki</a> vorhanden, die englische Version gibt es hier: <a href="/fhem/docs/commandref.html#OWX">OWX</a>
|
||||
<a href="http://fhemwiki.de/wiki/Interfaces_f%C3%BCr_1-Wire">Deutsche Dokumentation im Wiki</a> vorhanden, die englische Version gibt es hier: <a href="commandref.html#OWX">OWX</a>
|
||||
</ul>
|
||||
=end html_DE
|
||||
=cut
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -42,12 +42,11 @@ BEGIN {
|
||||
};
|
||||
};
|
||||
|
||||
use ProtoThreads;
|
||||
no warnings 'deprecated';
|
||||
sub Log3($$$);
|
||||
sub AttrVal($$$);
|
||||
|
||||
my $owx_version="7.01";
|
||||
my $owx_version="7.2";
|
||||
|
||||
my %gets = (
|
||||
"id" => ":noArg",
|
||||
@ -206,9 +205,7 @@ sub OWTHERM_Define ($$) {
|
||||
if( !defined($hash->{IODev}) or !defined($hash->{IODev}->{NAME}) ){
|
||||
return "OWTHERM: Warning, no 1-Wire I/O device found for $name.";
|
||||
#-- if coupled, test if ASYNC or not
|
||||
} else {
|
||||
$hash->{ASYNC} = $hash->{IODev}->{TYPE} eq "OWX_ASYNC" ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
$modules{OWTHERM}{defptr}{$id} = $hash;
|
||||
#--
|
||||
@ -446,13 +443,6 @@ sub OWTHERM_Get($@) {
|
||||
if( $interface eq "OWX" ){
|
||||
$ret = OWXTHERM_GetValues($hash);
|
||||
|
||||
#-- OWX_ASYNC interface
|
||||
}elsif( $interface eq "OWX_ASYNC" ){
|
||||
eval {
|
||||
$ret = OWX_ASYNC_RunToCompletion($hash,OWXTHERM_PT_GetValues($hash));
|
||||
};
|
||||
$ret = GP_Catch($@) if $@;
|
||||
|
||||
#-- OWFS interface
|
||||
}elsif( $interface eq "OWServer" ){
|
||||
$ret = OWFSTHERM_GetValues($hash);
|
||||
@ -513,16 +503,10 @@ sub OWTHERM_GetValues($@) {
|
||||
|
||||
#-- Get values according to interface type
|
||||
my $interface= $hash->{IODev}->{TYPE};
|
||||
#-- OWX interface
|
||||
if( $interface eq "OWX" ){
|
||||
$ret = OWXTHERM_GetValues($hash);
|
||||
}elsif( $interface eq "OWX_ASYNC" ){
|
||||
#-- skip, if the conversion is driven by master
|
||||
unless ( defined($attr{$name}{tempConv}) && ( $attr{$name}{tempConv} eq "onkick") ){
|
||||
eval {
|
||||
OWX_ASYNC_Schedule( $hash, OWXTHERM_PT_GetValues($hash) );
|
||||
};
|
||||
$ret = GP_Catch($@) if $@;
|
||||
}
|
||||
#-- OWFS interface
|
||||
}elsif( $interface eq "OWServer" ){
|
||||
$ret = OWFSTHERM_GetValues($hash);
|
||||
}else{
|
||||
@ -616,11 +600,6 @@ sub OWTHERM_InitializeDevice($) {
|
||||
#-- OWX interface
|
||||
if( $interface eq "OWX" ){
|
||||
$ret = OWXTHERM_SetValues($hash,$args);
|
||||
}elsif( $interface eq "OWX_ASYNC" ){
|
||||
eval {
|
||||
$ret = OWX_ASYNC_RunToCompletion($hash,OWXTHERM_PT_SetValues($hash,$args));
|
||||
};
|
||||
$ret = GP_Catch($@) if $@;
|
||||
#-- OWFS interface
|
||||
}elsif( $interface eq "OWServer" ){
|
||||
$ret = OWFSTHERM_SetValues($hash,$args);
|
||||
@ -712,12 +691,6 @@ sub OWTHERM_Set($@) {
|
||||
#-- OWX interface
|
||||
if( $interface eq "OWX" ){
|
||||
$ret = OWXTHERM_SetValues($hash,$args);
|
||||
}elsif( $interface eq "OWX_ASYNC" ){
|
||||
$args->{format} = 1;
|
||||
eval {
|
||||
OWX_ASYNC_Schedule( $hash, OWXTHERM_PT_SetValues($hash,$args) );
|
||||
};
|
||||
$ret = GP_Catch($@) if $@;
|
||||
#-- OWFS interface
|
||||
}elsif( $interface eq "OWServer" ){
|
||||
$ret = OWFSTHERM_SetValues($hash,$args);
|
||||
@ -1002,14 +975,14 @@ sub OWXTHERM_GetValues($) {
|
||||
#-- issue the match ROM command \x55 and the start conversion command \x44
|
||||
#-- conversion needs some 950 ms - but we may also do it in shorter time !
|
||||
if( $con==1 ){
|
||||
#-- OLD OWX interface
|
||||
#-- synchronous OWX interface
|
||||
if( !$master->{ASYNCHRONOUS} ){
|
||||
OWX_Reset($master);
|
||||
if( OWX_Complex($master,$owx_dev,"\x44",0) eq 0 ){
|
||||
return "OWTHERM: $name not accessible";
|
||||
}
|
||||
select(undef,undef,undef,$convtimes{AttrVal($name,"resolution",12)}*0.001);
|
||||
#-- NEW OWX interface
|
||||
#-- asynchronous OWX interface
|
||||
}else{
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "convert", 5, $owx_dev, "\x44", 0, 1, undef, undef, $convtimes{AttrVal($name,"resolution",12)}*0.001 );
|
||||
@ -1019,7 +992,7 @@ sub OWXTHERM_GetValues($) {
|
||||
#-- NOW ask the specific device
|
||||
#-- issue the match ROM command \x55 and the read scratchpad command \xBE
|
||||
#-- reading 9 + 1 + 8 data bytes and 1 CRC byte = 19 bytes
|
||||
#-- OLD OWX interface
|
||||
#-- synchronous OWX interface
|
||||
if( !$master->{ASYNCHRONOUS} ){
|
||||
OWX_Reset($master);
|
||||
my $res=OWX_Complex($master,$owx_dev,"\xBE",9);
|
||||
@ -1029,7 +1002,7 @@ sub OWXTHERM_GetValues($) {
|
||||
if( length($res)!=19);
|
||||
return OWXTHERM_BinValues($hash,"getsp",$owx_dev,undef,undef,9,substr($res,10,9));
|
||||
|
||||
#-- NEW OWX interface
|
||||
#-- asynchronous OWX interface
|
||||
}else{
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "readsp", 1, $owx_dev, "\xBE", 0, 19, 0, \&OWXTHERM_BinValues, undef);
|
||||
@ -1096,127 +1069,6 @@ sub OWXTHERM_SetValues($$) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
########################################################################################
|
||||
#
|
||||
# OWXTHERM_GetValues - Trigger reading from one device
|
||||
#
|
||||
# Parameter hash = hash of device addressed
|
||||
#
|
||||
########################################################################################
|
||||
|
||||
sub OWXTHERM_PT_GetValues($) {
|
||||
|
||||
my ($hash) = @_;
|
||||
|
||||
return PT_THREAD(sub {
|
||||
my ($thread) = @_;
|
||||
#-- For default, perform the conversion now
|
||||
my $con=1;
|
||||
|
||||
#-- ID of the device
|
||||
my $owx_dev = $hash->{ROM_ID};
|
||||
|
||||
#-- hash of the busmaster
|
||||
my $master = $hash->{IODev};
|
||||
my $name = $hash->{NAME};
|
||||
|
||||
PT_BEGIN($thread);
|
||||
|
||||
#-- check, if the conversion has been called before for all sensors
|
||||
if( defined($attr{$name}{tempConv}) && ( $attr{$name}{tempConv} eq "onkick") ){
|
||||
$con=0;
|
||||
}
|
||||
|
||||
#-- if the conversion has not been called before
|
||||
if( $con==1 ){
|
||||
#-- issue the match ROM command \x55 and the start conversion command \x44
|
||||
my $now = gettimeofday();
|
||||
my $delay = $convtimes{AttrVal($name,"resolution",12)};
|
||||
$thread->{ExecuteTime} = $now + $delay*0.001;
|
||||
$thread->{pt_execute} = OWX_ASYNC_PT_Execute($master,1,$owx_dev,"\x44",0);
|
||||
PT_WAIT_THREAD($thread->{pt_execute});
|
||||
die $thread->{pt_execute}->PT_CAUSE() if ($thread->{pt_execute}->PT_STATE() == PT_ERROR);
|
||||
PT_YIELD_UNTIL(gettimeofday() >= $thread->{ExecuteTime});
|
||||
delete $thread->{ExecuteTime};
|
||||
}
|
||||
#-- NOW ask the specific device
|
||||
#-- issue the match ROM command \x55 and the read scratchpad command \xBE
|
||||
#-- reading 9 + 1 + 8 data bytes and 1 CRC byte = 19 bytes
|
||||
$thread->{pt_execute} = OWX_ASYNC_PT_Execute($master,1,$owx_dev,"\xBE",9);
|
||||
PT_WAIT_THREAD($thread->{pt_execute});
|
||||
die $thread->{pt_execute}->PT_CAUSE() if ($thread->{pt_execute}->PT_STATE() == PT_ERROR);
|
||||
OWXTHERM_BinValues($hash,undef,1,$owx_dev,undef,9,$thread->{pt_execute}->PT_RETVAL());
|
||||
PT_END;
|
||||
});
|
||||
}
|
||||
|
||||
#######################################################################################
|
||||
#
|
||||
# OWXTHERM_PT_SetValues - Implements SetFn function async
|
||||
#
|
||||
# Parameter hash = hash of device addressed
|
||||
# a = argument array
|
||||
#
|
||||
########################################################################################
|
||||
|
||||
sub OWXTHERM_PT_SetValues($$) {
|
||||
|
||||
my ($hash,$args) = @_;
|
||||
|
||||
return PT_THREAD( sub {
|
||||
my ($thread) = @_;
|
||||
|
||||
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};
|
||||
|
||||
PT_BEGIN($thread);
|
||||
|
||||
unless (defined $args->{resolution} or defined $args->{tempLow} or defined $args->{tempHigh}) {
|
||||
PT_EXIT;
|
||||
}
|
||||
|
||||
#-- $owg_tl and $owg_th are preset and may be changed here
|
||||
foreach my $key (keys %$args) {
|
||||
$hash->{owg_tl} = $args->{$key} if( lc($key) eq "templow");
|
||||
$hash->{owg_th} = $args->{$key} if( lc($key) eq "temphigh");
|
||||
$hash->{owg_cf} = $args->{$key} if( lc($key) eq "resolution");
|
||||
}
|
||||
|
||||
#-- put into 2's complement formed (signed byte)
|
||||
my $tlp = $hash->{owg_tl} < 0 ? 128 - $hash->{owg_tl} : $hash->{owg_tl};
|
||||
my $thp = $hash->{owg_th} < 0 ? 128 - $hash->{owg_th} : $hash->{owg_th};
|
||||
#-- resolution is defined in bits 5+6 of configuration register
|
||||
my $cfg = defined $hash->{owg_cf} ? (($hash->{owg_cf}-9) << 5) | 0x1f : 0x7f;
|
||||
|
||||
#-- issue the match ROM command \x55 and the write scratchpad command \x4E,
|
||||
# followed by 3 bytes of data (alarm_temp_high, alarm_temp_low, config)
|
||||
# config-byte of 0x7F means 12 bit resolution (750ms convert time)
|
||||
#
|
||||
# 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%c",$thp,$tlp,$cfg);
|
||||
$thread->{pt_execute} = OWX_ASYNC_PT_Execute($master,1,$owx_dev,$select,3);
|
||||
PT_WAIT_THREAD($thread->{pt_execute});
|
||||
die $thread->{pt_execute}->PT_CAUSE() if ($thread->{pt_execute}->PT_STATE() == PT_ERROR);
|
||||
|
||||
#-- process results
|
||||
$hash->{PRESENT} = 1;
|
||||
if ($args->{format}) {
|
||||
OWTHERM_FormatValues($hash);
|
||||
}
|
||||
PT_END;
|
||||
});
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
=pod
|
||||
|
@ -39,7 +39,7 @@ use vars qw{%attr %defs};
|
||||
sub Log($$);
|
||||
|
||||
#-- globals on start
|
||||
my $version = "2.06";
|
||||
my $version = "2.07";
|
||||
|
||||
#-- these we may get on request
|
||||
my %gets = (
|
||||
@ -1449,17 +1449,17 @@ sub Shelly_updown2($){
|
||||
<code>set <name> on-for-timer|off-for-timer <time></code>
|
||||
<br />switches device on or off for <time> seconds. </li>
|
||||
<li>
|
||||
<code>set <name> hsv <hue value 0..360><saturation value 0..1><brightness value 0..1> </code>
|
||||
<br />6-digit hex string to set the color.</li>
|
||||
<code>set <name> hsv <hue value 0..360>,<saturation value 0..1>,<brightness value 0..1> </code>
|
||||
<br />comma separated list of hue, saturation and value to set the color</li>
|
||||
<li>
|
||||
<code>set <name> rgb <rrggbb> </code>
|
||||
<br />6-digit hex string to set the color.</li>
|
||||
<br />6-digit hex string to set the color</li>
|
||||
<li>
|
||||
<code>set <name> rgbw <rrggbbww> </code>
|
||||
<br />8-digit hex string to set the color and white value</li>
|
||||
<li>
|
||||
<code>set <name> white <integer></code>
|
||||
<br /> number 0..255 to set the white value </li>
|
||||
<br /> number 0..255 to set the white value</li>
|
||||
</ul>
|
||||
<a name="Shellyget" id="Shellyget"></a>
|
||||
<h4>Get</h4>
|
||||
|
Loading…
x
Reference in New Issue
Block a user