From 445810a4bb527dc9f644267c4ef8fd7799b550e6 Mon Sep 17 00:00:00 2001 From: Beta-User <> Date: Thu, 28 Oct 2021 17:45:34 +0000 Subject: [PATCH] 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 --- fhem/FHEM/lib/AttrTemplate/mqtt2.template | 80 +++++++++++++++++++ .../AttrTemplate/99_attrT_ZWave_Utils.pm | 75 +++++++++-------- 2 files changed, 116 insertions(+), 39 deletions(-) diff --git a/fhem/FHEM/lib/AttrTemplate/mqtt2.template b/fhem/FHEM/lib/AttrTemplate/mqtt2.template index 459a4ce67..a4c383987 100644 --- a/fhem/FHEM/lib/AttrTemplate/mqtt2.template +++ b/fhem/FHEM/lib/AttrTemplate/mqtt2.template @@ -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.
NOTE: First experimental version, for configuration and to contribute see Forum Thread. You have to configure MQTT first as described in product manual.
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\ +
\ +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 ############### diff --git a/fhem/contrib/AttrTemplate/99_attrT_ZWave_Utils.pm b/fhem/contrib/AttrTemplate/99_attrT_ZWave_Utils.pm index c1839c62e..e15bc4805 100644 --- a/fhem/contrib/AttrTemplate/99_attrT_ZWave_Utils.pm +++ b/fhem/contrib/AttrTemplate/99_attrT_ZWave_Utils.pm @@ -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 ? "" . FW_makeImage("edit_settings","edit_settings") . " " - : "" . FW_makeImage($symbol_string,"fts_shutter_10") . " "; + $ret .= $moving ? "" . FW_makeImage('edit_settings','edit_settings') . " " + : "" . FW_makeImage($symbol_string,'fts_shutter_10') . " "; #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($symbol_string $slatlevel %); } @@ -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.

attrT_ZWave_Utils