mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-22 20:24:36 +00:00
00_TCM: changes see EnOcean forum
git-svn-id: https://svn.fhem.de/fhem/trunk@23390 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
fe49645fa3
commit
ec07561859
@ -28,25 +28,25 @@ sub TCM_CSUM($);
|
|||||||
sub TCM_Initialize($) {
|
sub TCM_Initialize($) {
|
||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
# Provider
|
# Provider
|
||||||
$hash->{ReadFn} = "TCM_Read";
|
$hash->{ReadFn} = "TCM_Read";
|
||||||
$hash->{WriteFn} = "TCM_Write";
|
$hash->{WriteFn} = "TCM_Write";
|
||||||
$hash->{ReadyFn} = "TCM_Ready";
|
$hash->{ReadyFn} = "TCM_Ready";
|
||||||
$hash->{Clients} = ":EnOcean:";
|
$hash->{Clients} = ":EnOcean:";
|
||||||
my %matchList= (
|
my %matchList= (
|
||||||
"1:EnOcean" => "^EnOcean:",
|
"1:EnOcean" => "^EnOcean:",
|
||||||
);
|
);
|
||||||
$hash->{MatchList} = \%matchList;
|
$hash->{MatchList} = \%matchList;
|
||||||
# Normal devices
|
# Normal devices
|
||||||
$hash->{DefFn} = "TCM_Define";
|
$hash->{DefFn} = "TCM_Define";
|
||||||
$hash->{FingerprintFn} = "TCM_Fingerprint";
|
$hash->{FingerprintFn} = "TCM_Fingerprint";
|
||||||
$hash->{UndefFn} = "TCM_Undef";
|
$hash->{UndefFn} = "TCM_Undef";
|
||||||
$hash->{GetFn} = "TCM_Get";
|
$hash->{GetFn} = "TCM_Get";
|
||||||
$hash->{SetFn} = "TCM_Set";
|
$hash->{SetFn} = "TCM_Set";
|
||||||
$hash->{NotifyFn} = "TCM_Notify";
|
$hash->{NotifyFn} = "TCM_Notify";
|
||||||
$hash->{AttrFn} = "TCM_Attr";
|
$hash->{AttrFn} = "TCM_Attr";
|
||||||
$hash->{AttrList} = "assignIODev:select,no,yes baseID blockSenderID:own,no comModeUTE:auto,biDir,uniDir comType:TCM,RS485 do_not_notify:1,0 " .
|
$hash->{AttrList} = "assignIODev:select,no,yes baseID blockSenderID:own,no comModeUTE:auto,biDir,uniDir comType:TCM,RS485 do_not_notify:1,0 " .
|
||||||
"dummy:1,0 fingerprint:off,on learningDev:all,teachMsg learningMode:always,demand,nearfield " .
|
"dummy:1,0 fingerprint:off,on learningDev:all,teachMsg learningMode:always,demand,nearfield " .
|
||||||
"sendInterval:0,25,40,50,100,150,200,250 smartAckMailboxMax:slider,0,1,20 " .
|
"msgCounter:select,off,on sendInterval:0,25,40,50,100,150,200,250 smartAckMailboxMax:slider,0,1,20 " .
|
||||||
"smartAckLearnMode:simple,advance,advanceSelectRep";
|
"smartAckLearnMode:simple,advance,advanceSelectRep";
|
||||||
$hash->{ShutdownFn} = "TCM_Shutdown";
|
$hash->{ShutdownFn} = "TCM_Shutdown";
|
||||||
$hash->{NotifyOrderPrefix} = "45-";
|
$hash->{NotifyOrderPrefix} = "45-";
|
||||||
@ -76,6 +76,7 @@ sub TCM_Define($$) {
|
|||||||
$attr{$name}{dummy} = 1;
|
$attr{$name}{dummy} = 1;
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
InternalTimer(gettimeofday() + 60, 'TCM_msgCounter', $hash, 0);
|
||||||
my $ret = DevIo_OpenDev($hash, 0, undef);
|
my $ret = DevIo_OpenDev($hash, 0, undef);
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
@ -314,6 +315,7 @@ sub TCM_Write($$$$) {
|
|||||||
#Log3 $name, 5, "TCM $name awaitCmdResp: " . join(' ', @{$hash->{helper}{awaitCmdResp}});
|
#Log3 $name, 5, "TCM $name awaitCmdResp: " . join(' ', @{$hash->{helper}{awaitCmdResp}});
|
||||||
}
|
}
|
||||||
Log3 $name, 5, "TCM $name sent ESP: $bstring";
|
Log3 $name, 5, "TCM $name sent ESP: $bstring";
|
||||||
|
push(@{$hash->{helper}{sndCounter}}, gettimeofday() + 0) if (AttrVal($hash->{NAME}, 'msgCounter', 'off') eq 'on');
|
||||||
DevIo_SimpleWrite($hash, $bstring, 1);
|
DevIo_SimpleWrite($hash, $bstring, 1);
|
||||||
# next commands will be sent with a delay
|
# next commands will be sent with a delay
|
||||||
usleep(int(AttrVal($name, "sendInterval", 100)) * 1000);
|
usleep(int(AttrVal($name, "sendInterval", 100)) * 1000);
|
||||||
@ -437,6 +439,7 @@ sub TCM_Read($) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$data = $rest;
|
$data = $rest;
|
||||||
|
push(@{$hash->{helper}{rcvCounter}}, gettimeofday() + 0) if (AttrVal($hash->{NAME}, 'msgCounter', 'off') eq 'on');
|
||||||
}
|
}
|
||||||
|
|
||||||
if(length($data) >= 4) {
|
if(length($data) >= 4) {
|
||||||
@ -614,6 +617,7 @@ sub TCM_Read($) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$data = $rest;
|
$data = $rest;
|
||||||
|
push(@{$hash->{helper}{rcvCounter}}, gettimeofday() + 0) if (AttrVal($hash->{NAME}, 'msgCounter', 'off') eq 'on');
|
||||||
}
|
}
|
||||||
|
|
||||||
if(length($data) >= 4) {
|
if(length($data) >= 4) {
|
||||||
@ -1247,22 +1251,70 @@ sub TCM_ReadAnswer($$) {
|
|||||||
sub TCM_BlockSenderID($$$) {
|
sub TCM_BlockSenderID($$$) {
|
||||||
my ($hash, $blockSenderID, $senderID) = @_;
|
my ($hash, $blockSenderID, $senderID) = @_;
|
||||||
return undef if ($blockSenderID eq 'no');
|
return undef if ($blockSenderID eq 'no');
|
||||||
my $name = $hash->{NAME};
|
return undef if (!exists $modules{"$hash->{TYPE}"}{BaseID});
|
||||||
foreach (@{$modules{"$hash->{TYPE}"}{BaseID}}) {
|
foreach (@{$modules{"$hash->{TYPE}"}{BaseID}}) {
|
||||||
if (hex($_) == (hex($senderID) & 0xFFFFFF80)) {
|
if (hex($_) == (hex($senderID) & 0xFFFFFF80)) {
|
||||||
Log3 $name, 4, "TCM $name received own telegram from SenderID $senderID blocked.";
|
Log3 $hash->{NAME}, 4, "TCM $hash->{NAME} received own telegram from SenderID $senderID blocked.";
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return undef if (!exists $modules{"$hash->{TYPE}"}{ChipID});
|
||||||
foreach (@{$modules{"$hash->{TYPE}"}{ChipID}}) {
|
foreach (@{$modules{"$hash->{TYPE}"}{ChipID}}) {
|
||||||
if (hex($_) == hex($senderID)) {
|
if (hex($_) == hex($senderID)) {
|
||||||
Log3 $name, 4, "TCM $name received own telegram from $senderID blocked.";
|
Log3 $hash->{NAME}, 4, "TCM $hash->{NAME} received own telegram from $senderID blocked.";
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
sub TCM_msgCounter($) {
|
||||||
|
my $hash = shift(@_);
|
||||||
|
my $timeNow = gettimeofday();
|
||||||
|
my ($count, $countPerDay, $countPerHour, $countPerMin);
|
||||||
|
RemoveInternalTimer($hash, 'TCM_msgCounter');
|
||||||
|
if (AttrVal($hash->{NAME}, 'msgCounter', 'off') eq 'off') {
|
||||||
|
delete $hash->{MsgRcvPerDay};
|
||||||
|
delete $hash->{MsgRcvPerHour};
|
||||||
|
delete $hash->{MsgRcvPerMin};
|
||||||
|
delete $hash->{MsgSndPerDay};
|
||||||
|
delete $hash->{MsgSndPerHour};
|
||||||
|
delete $hash->{MsgSndPerMin};
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
# receive counter
|
||||||
|
if (exists $hash->{helper}{rcvCounter}) {
|
||||||
|
($count, $countPerDay, $countPerHour, $countPerMin) = (0, 0, 0, 0);
|
||||||
|
foreach my $timestamp (@{$hash->{helper}{rcvCounter}}) {
|
||||||
|
$countPerDay = $count if ($timestamp < $timeNow - 86400);
|
||||||
|
$countPerHour = $count if ($timestamp < $timeNow - 3600);
|
||||||
|
$countPerMin = $count if ($timestamp < $timeNow - 60);
|
||||||
|
$count ++;
|
||||||
|
}
|
||||||
|
splice(@{$hash->{helper}{rcvCounter}}, 0, $countPerDay);
|
||||||
|
$hash->{MsgRcvPerDay} = $#{$hash->{helper}{rcvCounter}};
|
||||||
|
$hash->{MsgRcvPerHour} = $hash->{MsgRcvPerDay} + $countPerDay - $countPerHour;
|
||||||
|
$hash->{MsgRcvPerMin} = $hash->{MsgRcvPerDay} + $countPerDay - $countPerMin;
|
||||||
|
}
|
||||||
|
# send counter
|
||||||
|
if (exists $hash->{helper}{sndCounter}) {
|
||||||
|
($count, $countPerDay, $countPerHour, $countPerMin) = (0, 0, 0, 0);
|
||||||
|
foreach my $timestamp (@{$hash->{helper}{sndCounter}}) {
|
||||||
|
$countPerDay = $count if ($timestamp < $timeNow - 86400);
|
||||||
|
$countPerHour = $count if ($timestamp < $timeNow - 3600);
|
||||||
|
$countPerMin = $count if ($timestamp < $timeNow - 60);
|
||||||
|
$count ++;
|
||||||
|
}
|
||||||
|
splice(@{$hash->{helper}{sndCounter}}, 0, $countPerDay);
|
||||||
|
$hash->{MsgSndPerDay} = $#{$hash->{helper}{sndCounter}};
|
||||||
|
$hash->{MsgSndPerHour} = $hash->{MsgSndPerDay} + $countPerDay - $countPerHour;
|
||||||
|
$hash->{MsgSndPerMin} = $hash->{MsgSndPerDay} + $countPerDay - $countPerMin;
|
||||||
|
}
|
||||||
|
InternalTimer(gettimeofday() + 60, 'TCM_msgCounter', $hash, 0);
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
sub TCM_Attr(@) {
|
sub TCM_Attr(@) {
|
||||||
my ($cmd, $name, $attrName, $attrVal) = @_;
|
my ($cmd, $name, $attrName, $attrVal) = @_;
|
||||||
@ -1348,6 +1400,19 @@ sub TCM_Attr(@) {
|
|||||||
CommandDeleteAttr(undef, "$name $attrName");
|
CommandDeleteAttr(undef, "$name $attrName");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} elsif ($attrName eq "msgCounter") {
|
||||||
|
if (!defined $attrVal){
|
||||||
|
|
||||||
|
} elsif ($attrVal eq 'off') {
|
||||||
|
RemoveInternalTimer($hash, 'TCM_msgCounter');
|
||||||
|
} elsif ($attrVal eq 'on') {
|
||||||
|
RemoveInternalTimer($hash, 'TCM_msgCounter');
|
||||||
|
InternalTimer(gettimeofday() + 60, 'TCM_msgCounter', $hash, 0);
|
||||||
|
} else {
|
||||||
|
Log3 $name, 2, "TCM $name attribute-value [$attrName] = $attrVal wrong";
|
||||||
|
CommandDeleteAttr(undef, "$name $attrName");
|
||||||
|
}
|
||||||
|
|
||||||
} elsif ($attrName eq "sendInterval") {
|
} elsif ($attrName eq "sendInterval") {
|
||||||
if (!defined $attrVal){
|
if (!defined $attrVal){
|
||||||
|
|
||||||
@ -1382,6 +1447,8 @@ sub TCM_Notify(@) {
|
|||||||
my ($hash, $dev) = @_;
|
my ($hash, $dev) = @_;
|
||||||
if ($dev->{TYPE} eq 'Global' && grep (m/^INITIALIZED|REREADCFG$/, @{$dev->{CHANGED}})){
|
if ($dev->{TYPE} eq 'Global' && grep (m/^INITIALIZED|REREADCFG$/, @{$dev->{CHANGED}})){
|
||||||
#if ($dev->{NAME} eq "global" && grep (m/^INITIALIZED|REREADCFG$/, @{$dev->{CHANGED}})){
|
#if ($dev->{NAME} eq "global" && grep (m/^INITIALIZED|REREADCFG$/, @{$dev->{CHANGED}})){
|
||||||
|
RemoveInternalTimer($hash, 'TCM_msgCounter');
|
||||||
|
InternalTimer(gettimeofday() + 60, 'TCM_msgCounter', $hash, 0) if (AttrVal($hash->{NAME}, 'msgCounter', 'off') eq 'on');
|
||||||
TCM_InitSerialCom($hash);
|
TCM_InitSerialCom($hash);
|
||||||
my $assignIODevFlag = AttrVal($hash->{NAME}, 'assignIODev', undef);
|
my $assignIODevFlag = AttrVal($hash->{NAME}, 'assignIODev', undef);
|
||||||
if (defined $assignIODevFlag) {
|
if (defined $assignIODevFlag) {
|
||||||
@ -1411,7 +1478,9 @@ sub TCM_Notify(@) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log3 $hash->{NAME}, 2, "TCM registered transceiver BaseID: " . join(':', @{$modules{"$hash->{TYPE}"}{BaseID}}) . " ChipID: " . join(':', @{$modules{"$hash->{TYPE}"}{ChipID}});
|
if (exists($modules{"$hash->{TYPE}"}{BaseID}) && exists($modules{"$hash->{TYPE}"}{ChipID})) {
|
||||||
|
Log3 $hash->{NAME}, 2, "TCM registered transceiver BaseID: " . join(':', @{$modules{"$hash->{TYPE}"}{BaseID}}) . " ChipID: " . join(':', @{$modules{"$hash->{TYPE}"}{ChipID}});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return undef;
|
return undef;
|
||||||
@ -1443,6 +1512,7 @@ sub TCM_Undef($$) {
|
|||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
RemoveInternalTimer($hash, 'TCM_msgCounter');
|
||||||
delete $hash->{helper}{init_done};
|
delete $hash->{helper}{init_done};
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
@ -1786,6 +1856,11 @@ sub TCM_Shutdown($) {
|
|||||||
[learningMode] = demand: Teach-In/Teach-Out telegrams accepted if Fhem is in learning mode, see also <code>set <IODev> teach <t/s></code><br>
|
[learningMode] = demand: Teach-In/Teach-Out telegrams accepted if Fhem is in learning mode, see also <code>set <IODev> teach <t/s></code><br>
|
||||||
[learningMode] = nearfield: Teach-In/Teach-Out telegrams accepted if Fhem is in learning mode and the signal strength RSSI >= -60 dBm.<be>
|
[learningMode] = nearfield: Teach-In/Teach-Out telegrams accepted if Fhem is in learning mode and the signal strength RSSI >= -60 dBm.<be>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a name="TCM_msgCounter">msgCounter</a> <off|on>,
|
||||||
|
[msgCounter] = off is default.<br>
|
||||||
|
Counts the received and sent messages in the last day, last hour, and minute, see internals MsgRcvPerDay, MsgSndPerDay,
|
||||||
|
MsgRcvPerHour, MsgSndPerHour, MsgRcvPerMin MsgSndPerMin.
|
||||||
|
</li>
|
||||||
<li><a name="TCM_sendInterval">sendInterval</a> <0 ... 250><br>
|
<li><a name="TCM_sendInterval">sendInterval</a> <0 ... 250><br>
|
||||||
ESP2: [sendInterval] = 100 ms is default.<br>
|
ESP2: [sendInterval] = 100 ms is default.<br>
|
||||||
ESP3: [sendInterval] = 0 ms is default.<br>
|
ESP3: [sendInterval] = 0 ms is default.<br>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user