2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-21 01:46:08 +00:00

fix: initialization (subscribe)

git-svn-id: https://svn.fhem.de/fhem/trunk@17295 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
hexenmeister 2018-09-07 23:46:50 +00:00
parent e94cb2686b
commit 80ba7c33e9

View File

@ -190,6 +190,8 @@ sub publishDeviceUpdate($$$$);
sub UpdateSubscriptionsSingleDevice($$);
sub InitializeDevices($);
sub firstInit($);
sub reFirstInit($);
sub checkFirstInit($);
sub removeOldUserAttr($;$$);
sub IsObservedAttribute($$);
sub defineGlobalTypeExclude($;$);
@ -205,6 +207,7 @@ sub updateDevCount($);
sub retrieveIODev($);
sub isIODevMQTT2($);
sub isIODevMQTT($);
sub initUserAttr($);
sub isDebug($) {
my ($hash) = @_;
@ -252,7 +255,15 @@ sub Define() {
readingsBulkUpdate($hash,"updated-set-count",$hash->{+HELPER}->{+HS_PROP_NAME_UPDATE_S_CNT});
readingsEndUpdate($hash,0);
firstInit($hash);
initUserAttr($hash);
# unless ($main::init_done) {
# $hash->{subscribe} = [];
# $hash->{subscribeQos} = {};
# $hash->{subscribeExpr} = [];
# }
checkFirstInit($hash);
return undef;
}
@ -266,6 +277,7 @@ sub Undefine() {
}
sub retrieveIODev($) {
return 'MQTT'; # TEST!
my ($hash) = @_;
my $iodn = AttrVal($hash->{NAME}, "IODev", undef);
my $iodt = undef;
@ -273,6 +285,7 @@ sub retrieveIODev($) {
$iodt = $defs{$iodn}{TYPE};
}
$hash->{+HELPER}->{+IO_DEV_TYPE} = $iodt;
#Log3($hash->{NAME},1,"retrieveIODev: ".Dumper($hash->{+HELPER}->{+IO_DEV_TYPE}));
return $hash->{+HELPER}->{+IO_DEV_TYPE};
}
@ -292,16 +305,8 @@ sub isIODevMQTT2($) {
return 1;
}
# Erstinitialization.
# Variablen werden im HASH abgelegt, userattr der betroffenen Geraete wird erweitert, MQTT-Initialisierungen.
sub firstInit($) {
sub initUserAttr($) {
my ($hash) = @_;
if ($main::init_done) {
# IO
AssignIoPort($hash);
$hash->{+HELPER}->{+HS_FLAG_INITIALIZED} = 0;
# wenn bereits ein prefix bestand, die userAttr entfernen : HS_PROP_NAME_PREFIX_OLD != HS_PROP_NAME_PREFIX
my $prefix = $hash->{+HS_PROP_NAME_PREFIX};
#$hash->{+HS_PROP_NAME_DEVSPEC} = defined($devspec)?$devspec:".*";
@ -312,7 +317,7 @@ sub firstInit($) {
removeOldUserAttr($hash, $prefix_old, $devspec);
}
my @devices = devspec2array($devspec);
Log3($hash->{NAME},5,"MQTT-GB:DEBUG:> [$hash->{NAME}] firstInit: addToDevAttrList: $prefix");
Log3($hash->{NAME},5,"MQTT-GB:DEBUG:> [$hash->{NAME}] initUserAttr: addToDevAttrList: $prefix");
foreach my $dev (@devices) {
addToDevAttrList($dev, $prefix.CTRL_ATTR_NAME_DEFAULTS.":textField-long");
addToDevAttrList($dev, $prefix.CTRL_ATTR_NAME_ALIAS.":textField-long");
@ -320,6 +325,36 @@ sub firstInit($) {
addToDevAttrList($dev, $prefix.CTRL_ATTR_NAME_SUBSCRIBE.":textField-long");
addToDevAttrList($dev, $prefix.CTRL_ATTR_NAME_IGNORE.":both,incoming,outgoing");
}
}
sub checkFirstInit($) {
my ($hash) = @_;
#Log3($hash->{NAME},1,"checkFirstInit : ".Dumper($hash->{+HELPER}->{HS_FLAG_FIRST_INIT_DONE}));
return if $hash->{+HELPER}->{HS_FLAG_FIRST_INIT_DONE};
firstInit($hash);
}
sub reFirstInit($) {
my ($hash) = @_;
#Log3($hash->{NAME},1,"reFirstInit : ".Dumper($hash->{+HELPER}->{HS_FLAG_FIRST_INIT_DONE}));
$hash->{+HELPER}->{HS_FLAG_FIRST_INIT_DONE} = 0;
firstInit($hash);
}
# Erstinitialization.
# Variablen werden im HASH abgelegt, userattr der betroffenen Geraete wird erweitert, MQTT-Initialisierungen.
sub firstInit($) {
my ($hash) = @_;
AssignIoPort($hash);
#Log3($hash->{NAME},1,"firstInit [start] : ".Dumper($hash->{+HELPER}->{HS_FLAG_FIRST_INIT_DONE}));
if ($main::init_done) {
# IO
$hash->{+HELPER}->{+HS_FLAG_INITIALIZED} = 0;
return unless defined(AttrVal($hash->{NAME},"IODev",undef));
# Default-Excludes
defineDefaultGlobalExclude($hash);
@ -338,7 +373,13 @@ sub firstInit($) {
InternalTimer(gettimeofday()+$hash->{+HELPER}->{+HS_PROP_NAME_INTERVAL}, "MQTT::GENERIC_BRIDGE::timerProc", $hash, 0);
}
#Log3($hash->{NAME},1,"firstInit [isMqtt: ".isIODevMQTT($hash)."] : ".Dumper($hash->{subscribe}));
MQTT::client_start($hash) if isIODevMQTT($hash); #if defined $hash->{+HELPER}->{+IO_DEV_TYPE} and $hash->{+HELPER}->{+IO_DEV_TYPE} eq 'MQTT';
$hash->{+HELPER}->{HS_FLAG_FIRST_INIT_DONE} = 1;
#Log3($hash->{NAME},1,"firstInit [done] : ".Dumper($hash->{+HELPER}->{HS_FLAG_FIRST_INIT_DONE}));
#Log3($hash->{NAME},1,"firstInit [done] : ".Dumper($hash->{IODev}));
} else {
Log3($hash->{NAME},1,"firstInit [main init not done!]");
}
}
@ -1188,7 +1229,10 @@ sub Notify() {
if( $dev->{NAME} eq "global" ) {
#Log3($hash->{NAME},1,">>>>>>>>>>>>>> : ".Dumper($dev));
if( grep(m/^(INITIALIZED|REREADCFG)$/, @{$dev->{CHANGED}}) ) {
firstInit($hash);
#Log3($hash->{NAME},1,">INITIALIZED>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>: ".Dumper(AttrVal($hash->{NAME},"IODev",'-')));
#Log3($hash->{NAME},1,">INITIALIZED>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>: ".Dumper($main::attr{$hash->{NAME}}));
checkFirstInit($hash);
#InternalTimer(gettimeofday()+1, "MQTT::GENERIC_BRIDGE::checkFirstInit", $hash, 0);
}
my $max = int(@{$dev->{CHANGED}});
@ -1558,20 +1602,29 @@ sub Attr($$$$) {
my $ioDevType = undef;
$ioDevType = $defs{$value}{TYPE} if defined ($value) and defined ($defs{$value});
$hash->{+HELPER}->{+IO_DEV_TYPE} = $ioDevType;
#Log3($hash->{NAME},1,"MQTT_GENERIC_BRIDGE DEBUG: attr: ??? IODev");
if ($main::init_done) {
if ($command eq "set") {
unless (defined ($hash->{IODev}) and ($hash->{IODev} eq $value) ) {
#Log3($hash->{NAME},1,"MQTT_GENERIC_BRIDGE DEBUG: attr: set IODev");
my $oldValue = $main::attr{$name}{IODev};
if ($main::init_done) {
#unless (defined ($hash->{IODev}) and ($hash->{IODev} eq $value) ) {
unless (defined ($oldValue) and ($oldValue eq $value) ) {
#Log3($hash->{NAME},1,"MQTT_GENERIC_BRIDGE DEBUG: attr: change IODev");
MQTT::client_stop($hash) if defined($main::attr{$name}{IODev}) and ($main::attr{$name}{IODev} eq 'MQTT');
$main::attr{$name}{IODev} = $value;
$hash->{IODev} = $value;
RemoveAllSubscripton($hash);
MQTT::client_start($hash) if defined ($ioDevType) and ($ioDevType eq 'MQTT');
#$hash->{IODev} = $value;
reFirstInit($hash);
#RemoveAllSubscripton($hash);
#MQTT::client_start($hash) if defined ($ioDevType) and ($ioDevType eq 'MQTT');
}
}
} else {
if ($main::init_done) {
MQTT::client_stop($hash) if defined ($ioDevType) and ($ioDevType eq 'MQTT');
}
}
last;
};
return undef;
@ -1581,6 +1634,9 @@ sub Attr($$$$) {
sub ioDevConnect($) {
my $hash = shift;
return if isIODevMQTT2($hash); #if $hash->{+HELPER}->{+IO_DEV_TYPE} eq 'MQTT2_SERVER';
MQTT::client_start($hash) if isIODevMQTT($hash);
#Log3($hash->{NAME},1,"MQTT_GENERIC_BRIDGE DEBUG: ioDevConnect");
# TODO
}
@ -1622,7 +1678,7 @@ sub doSetUpdate($$$$$) {
sub onmessage($$$) {
my ($hash,$topic,$message) = @_;
CheckInitialization($hash);
#Log3($hash->{NAME},1,"MQTT_GENERIC_BRIDGE DEBUG: onmessage: $topic => $message");
Log3($hash->{NAME},1,"MQTT_GENERIC_BRIDGE DEBUG: onmessage: $topic => $message");
$hash->{+HELPER}->{+HS_PROP_NAME_INCOMING_CNT}++;
readingsSingleUpdate($hash,"incoming-count",$hash->{+HELPER}->{+HS_PROP_NAME_INCOMING_CNT},1);