mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-12 02:39:57 +00:00
mqtt2.template: add 8ch eth board; small update to zwutils
git-svn-id: https://svn.fhem.de/fhem/trunk@25139 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
45db448d78
commit
445810a4bb
@ -3499,6 +3499,86 @@ set DEVICE attrTemplate speechcontrol_type_switch
|
||||
attr DEVICE model 6channel_ethernet_board_6input_unified
|
||||
setreading DEVICE attrTemplateVersion 20200602
|
||||
|
||||
###############
|
||||
#dingtian 8ch relay board
|
||||
#
|
||||
#specials: event-on-change-reading and timestamp-on-change-reading via Perl...
|
||||
#
|
||||
# input by rico5588, see forum https://forum.fhem.de/index.php/topic,123709.msg1182787.html#msg1182787
|
||||
name:8channel_relay_board_8di_split
|
||||
filter:TYPE=MQTT2_DEVICE
|
||||
desc:For use with dingtian 8-ch digital Input and 8-ch relay output ethernet board.<br>NOTE: First experimental version, for configuration and to contribute see <a href="https://forum.fhem.de/index.php/topic,123709.msg1182787.html#msg1182787">Forum Thread</a>. You have to configure MQTT first as described in product manual.<br>Split version - you'll get 8 independent devices.
|
||||
order:W_05
|
||||
par:DEVNAME;Device's name in the topic tree;{ AttrVal('DEVICE','readingList','') =~ m,dingtian/([^/]+)/, ? $1 : undef }
|
||||
par:ICON;ICON as set, defaults to on;{ AttrVal('DEVICE','icon','on') }
|
||||
attr DEVICE icon ICON
|
||||
deletereading -q DEVICE (?!associatedWith|IODev).*
|
||||
attr DEVICE readingList /dingtian/DEVNAME/out/lwt_availability:.* LWT\
|
||||
/dingtian/DEVNAME/out/(relay|input)[1-8]:.* {}\
|
||||
/dingtian/DEVNAME/out/r1:.* { my $state = lc $EVENT; return if ReadingsVal($NAME,'state','unknown') eq $state; {state=>$state} }\
|
||||
/dingtian/DEVNAME/out/i1:.* {my $state = lc $EVENT; return if ReadingsVal($NAME,'di1','unknown') eq $state; {di1=>$state}}\
|
||||
/dingtian/DEVNAME/out/i2:.* {my $state = lc $EVENT; return if ReadingsVal($NAME,'di2','unknown') eq $state; {di2=>$state}}\
|
||||
/dingtian/DEVNAME/out/i3:.* {my $state = lc $EVENT; return if ReadingsVal($NAME,'di3','unknown') eq $state; {di3=>$state}}\
|
||||
/dingtian/DEVNAME/out/i4:.* {my $state = lc $EVENT; return if ReadingsVal($NAME,'di4','unknown') eq $state; {di4=>$state}}\
|
||||
/dingtian/DEVNAME/out/i5:.* {my $state = lc $EVENT; return if ReadingsVal($NAME,'di5','unknown') eq $state; {di5=>$state}}\
|
||||
/dingtian/DEVNAME/out/i6:.* {my $state = lc $EVENT; return if ReadingsVal($NAME,'di6','unknown') eq $state; {di6=>$state}}\
|
||||
/dingtian/DEVNAME/out/i7:.* {my $state = lc $EVENT; return if ReadingsVal($NAME,'di7','unknown') eq $state; {di7=>$state}}\
|
||||
/dingtian/DEVNAME/out/i8:.* {my $state = lc $EVENT; return if ReadingsVal($NAME,'di8','unknown') eq $state; {di8=>$state}}\
|
||||
/dingtian/DEVNAME/out/ip:.* ip\
|
||||
/dingtian/DEVNAME/out/sn:.* sn\
|
||||
/dingtian/DEVNAME/out/mac:.* mac\
|
||||
/dingtian/DEVNAME/out/dicnt:.* dicnt\
|
||||
/dingtian/DEVNAME/out/relay_cnt:.* relay_cnt
|
||||
attr DEVICE setExtensionsEvent 1
|
||||
attr DEVICE setList on:noArg /dingtian/DEVNAME/in/r1 ON\
|
||||
off:noArg /dingtian/DEVNAME/in/r1 OFF
|
||||
attr DEVICE webCmd :
|
||||
copy DEVICE DEVICE_CH2
|
||||
deleteattr DEVICE_CH2 stateFormat
|
||||
copy DEVICE_CH2 DEVICE_CH3
|
||||
copy DEVICE_CH2 DEVICE_CH4
|
||||
copy DEVICE_CH2 DEVICE_CH5
|
||||
copy DEVICE_CH2 DEVICE_CH6
|
||||
copy DEVICE_CH2 DEVICE_CH7
|
||||
copy DEVICE_CH2 DEVICE_CH8
|
||||
attr DEVICE_CH2 readingList /dingtian/DEVNAME/out/r2:.* { my $state = lc $EVENT; return if ReadingsVal($NAME,'state','unknown') eq $state; {state=>$state} }
|
||||
attr DEVICE_CH3 readingList /dingtian/DEVNAME/out/r3:.* { my $state = lc $EVENT; return if ReadingsVal($NAME,'state','unknown') eq $state; {state=>$state} }
|
||||
attr DEVICE_CH4 readingList /dingtian/DEVNAME/out/r4:.* { my $state = lc $EVENT; return if ReadingsVal($NAME,'state','unknown') eq $state; {state=>$state} }
|
||||
attr DEVICE_CH5 readingList /dingtian/DEVNAME/out/r5:.* { my $state = lc $EVENT; return if ReadingsVal($NAME,'state','unknown') eq $state; {state=>$state} }
|
||||
attr DEVICE_CH6 readingList /dingtian/DEVNAME/out/r6:.* { my $state = lc $EVENT; return if ReadingsVal($NAME,'state','unknown') eq $state; {state=>$state} }
|
||||
attr DEVICE_CH6 readingList /dingtian/DEVNAME/out/r7:.* { my $state = lc $EVENT; return if ReadingsVal($NAME,'state','unknown') eq $state; {state=>$state} }
|
||||
attr DEVICE_CH6 readingList /dingtian/DEVNAME/out/r8:.* { my $state = lc $EVENT; return if ReadingsVal($NAME,'state','unknown') eq $state; {state=>$state} }
|
||||
attr DEVICE_CH2 setList on:noArg /dingtian/DEVNAME/in/r2 ON\
|
||||
off:noArg /dingtian/DEVNAME/in/r2 OFF
|
||||
attr DEVICE_CH3 setList on:noArg /dingtian/DEVNAME/in/r3 ON\
|
||||
off:noArg /dingtian/DEVNAME/in/r3 OFF
|
||||
attr DEVICE_CH4 setList on:noArg /dingtian/DEVNAME/in/r4 ON\
|
||||
off:noArg /dingtian/DEVNAME/in/r4 OFF
|
||||
attr DEVICE_CH5 setList on:noArg /dingtian/DEVNAME/in/r5 ON\
|
||||
off:noArg /dingtian/DEVNAME/in/r5 OFF
|
||||
attr DEVICE_CH6 setList on:noArg /dingtian/DEVNAME/in/r6 ON\
|
||||
off:noArg /dingtian/DEVNAME/in/r6 OFF
|
||||
attr DEVICE_CH7 setList on:noArg /dingtian/DEVNAME/in/r7 ON\
|
||||
off:noArg /dingtian/DEVNAME/in/r7 OFF
|
||||
attr DEVICE_CH8 setList on:noArg /dingtian/DEVNAME/in/r8 ON\
|
||||
off:noArg /dingtian/DEVNAME/in/r8 OFF
|
||||
set DEVICE attrTemplate set_associatedWith \CHANNELS=8
|
||||
attr DEVICE devStateIcon offline:rc_STOP@red online:rc_STOP@green
|
||||
attr DEVICE stateFormat LWT\
|
||||
state\
|
||||
<br>\
|
||||
DigiIn\
|
||||
di1\
|
||||
di2\
|
||||
di3\
|
||||
di4\
|
||||
di5\
|
||||
di6\
|
||||
di7\
|
||||
di8
|
||||
set DEVICE attrTemplate speechcontrol_type_switch
|
||||
setreading DEVICE,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6,DEVICE_CH7,DEVICE_CH8 attrTemplateVersion 20211028
|
||||
attr DEVICE,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6,DEVICE_CH7,DEVICE_CH8 model 8channel_relay_board_8di_split
|
||||
|
||||
|
||||
###############
|
||||
|
@ -19,14 +19,14 @@ BEGIN {
|
||||
qw(
|
||||
InternalVal
|
||||
readingsSingleUpdate
|
||||
readingsBulkUpdate
|
||||
readingsBulkUpdate
|
||||
ReadingsVal
|
||||
ReadingsNum
|
||||
ReadingsAge
|
||||
devspec2array
|
||||
FW_makeImage
|
||||
defs
|
||||
Log3
|
||||
Log3
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -43,7 +43,7 @@ sub identify_channel_devices {
|
||||
my $devname = shift;
|
||||
my $wanted = shift // return;
|
||||
|
||||
my $mainId = substr(InternalVal($devname,"nodeIdHex","00"),0,2);
|
||||
my $mainId = substr(InternalVal($devname,'nodeIdHex','00'),0,2);
|
||||
my $wantedId = $mainId;
|
||||
$wantedId .= "0$wanted" if $wanted;
|
||||
my @names = devspec2array("TYPE=ZWave:FILTER=nodeIdHex=$wantedId");
|
||||
@ -53,48 +53,44 @@ sub identify_channel_devices {
|
||||
|
||||
sub devStateIcon_shutter {
|
||||
my $levelname = shift // return;
|
||||
my $model = shift // "FGR223";
|
||||
my $mode = shift // "roller"; # or "venetian"
|
||||
my $model = shift // 'FGR223';
|
||||
my $mode = shift // 'roller'; # or "venetian"
|
||||
my $slatname = $levelname;
|
||||
my $dimlevel= ReadingsNum($levelname,"dim",0);
|
||||
my $ret ="";
|
||||
my $dimlevel= ReadingsNum($levelname,'dim',0);
|
||||
my $ret ='';
|
||||
my $slatlevel = 0;
|
||||
my $slatcommand_string = "dim ";
|
||||
my $slatcommand_string = 'dim ';
|
||||
my $moving = 0;
|
||||
|
||||
if ($model eq "FGR223") {
|
||||
if ($mode eq "venetian") {
|
||||
#my ($def,$defnr) = split(" ", InternalVal($levelname,"DEF",$levelname));
|
||||
#$defnr++;
|
||||
#my @slatnames = devspec2array("DEF=$def".'.'.$defnr);
|
||||
|
||||
$slatname = identify_channel_devices($levelname,2);
|
||||
$slatlevel= ReadingsNum($slatname,"state",0);
|
||||
|
||||
if ($model eq 'FGR223') {
|
||||
if ($mode eq 'venetian') {
|
||||
$slatname = identify_channel_devices($levelname,2);
|
||||
$slatlevel= ReadingsNum($slatname,'state',0);
|
||||
}
|
||||
$moving = 1 if ReadingsNum($levelname,"power",0) > 0;
|
||||
}
|
||||
if ($model eq "FGRM222") {
|
||||
if ($mode eq "venetian") {
|
||||
$slatlevel= ReadingsNum($slatname,"positionSlat",0);
|
||||
$slatcommand_string = "positionSlat ";
|
||||
$moving = 1 if ReadingsNum($levelname,'power',0) > 0;
|
||||
}
|
||||
if ($model eq 'FGRM222') {
|
||||
if ($mode eq 'venetian') {
|
||||
$slatlevel= ReadingsNum($slatname,'positionSlat',0);
|
||||
$slatcommand_string = 'positionSlat ';
|
||||
}
|
||||
$moving = 1 if ReadingsNum($levelname,"power",0) > 0;
|
||||
}
|
||||
$moving = 1 if ReadingsNum($levelname,'power',0) > 0;
|
||||
}
|
||||
|
||||
#levelicon
|
||||
my $symbol_string = "fts_shutter_";
|
||||
my $command_string = "dim 99";
|
||||
$command_string = "dim 0" if $dimlevel > 50;
|
||||
my $symbol_string = 'fts_shutter_';
|
||||
my $command_string = 'dim 99';
|
||||
$command_string = 'dim 0' if $dimlevel > 50;
|
||||
$symbol_string .= int ((109 - $dimlevel)/10)*10;
|
||||
$ret .= $moving ? "<a href=\"/fhem?cmd.dummy=set $levelname stop&XHR=1\">" . FW_makeImage("edit_settings","edit_settings") . "</a> "
|
||||
: "<a href=\"/fhem?cmd.dummy=set $levelname $command_string&XHR=1\">" . FW_makeImage($symbol_string,"fts_shutter_10") . "</a> ";
|
||||
$ret .= $moving ? "<a href=\"/fhem?cmd.dummy=set $levelname stop&XHR=1\">" . FW_makeImage('edit_settings','edit_settings') . "</a> "
|
||||
: "<a href=\"/fhem?cmd.dummy=set $levelname $command_string&XHR=1\">" . FW_makeImage($symbol_string,'fts_shutter_10') . "</a> ";
|
||||
|
||||
#slat
|
||||
if ($mode eq "venetian") {
|
||||
$symbol_string = "fts_blade_arc_close_";
|
||||
$slatlevel > 49 ? $symbol_string .= "00" : $slatlevel > 24 ? $symbol_string .= "50" : $slatlevel < 25 ? $symbol_string .= "100" : undef;
|
||||
$slatlevel > 49 ? $slatcommand_string .= "0" : $slatlevel > 24 ? $slatcommand_string .= "50" : $slatlevel < 25 ? $slatcommand_string .= "25" : undef;
|
||||
$symbol_string = FW_makeImage($symbol_string,"fts_blade_arc_close_100");
|
||||
if ($mode eq 'venetian') {
|
||||
$symbol_string = 'fts_blade_arc_close_';
|
||||
$slatlevel > 49 ? $symbol_string .= '00' : $slatlevel > 24 ? $symbol_string .= '50' : $slatlevel < 25 ? $symbol_string .= '100' : undef;
|
||||
$slatlevel > 49 ? $slatcommand_string .= '0' : $slatlevel > 24 ? $slatcommand_string .= '50' : $slatlevel < 25 ? $slatcommand_string .= '25' : undef;
|
||||
$symbol_string = FW_makeImage($symbol_string,'fts_blade_arc_close_100');
|
||||
$ret .= qq(<a href="/fhem?cmd.dummy=set $slatname $slatcommand_string&XHR=1">$symbol_string $slatlevel %</a>);
|
||||
}
|
||||
|
||||
@ -105,14 +101,13 @@ sub devStateIcon_shutter {
|
||||
sub desiredTemp {
|
||||
my $name = shift // return;
|
||||
my $call = shift // 'OK';
|
||||
|
||||
|
||||
my $hash = $defs{$name} // return;
|
||||
my $now = time;
|
||||
my $state = ReadingsVal($name,'state','unknown');
|
||||
my $stateNum = ReadingsNum($name,'state',20);
|
||||
Log3($hash, 3, "ZWave-utils desiredTemp called, state is $state");
|
||||
#return if ReadingsAge($name,'state',10000000) > 3;
|
||||
|
||||
|
||||
if ($state =~ m,desired-temp|thermostatSetpointSet,) {
|
||||
readingsBulkUpdate($hash, 'desired-temp',$stateNum,1);
|
||||
return;
|
||||
@ -125,7 +120,7 @@ sub desiredTemp {
|
||||
readingsBulkUpdate($hash, 'desired-temp',ReadingsVal($name,'energySaveHeating','unknown'),1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if ($state =~ m,off,) {
|
||||
readingsBulkUpdate($hash, 'desired-temp',6,'unknown',1);
|
||||
return;
|
||||
@ -138,10 +133,12 @@ sub desiredTemp {
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
=item summary helper functions needed for attrTemplate for TYPE ZWave
|
||||
=item summary_DE needed Hilfsfunktionen für attrTemplate bei ZWave-TYPE Geräten
|
||||
=begin html
|
||||
|
||||
There may be room for improvement, please adress any issues in https://forum.fhem.de/index.php/topic,114109.0.html.
|
||||
<a id="attrT_ZWave_Utils"></a>
|
||||
<h3>attrT_ZWave_Utils</h3>
|
||||
|
Loading…
x
Reference in New Issue
Block a user