2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-05-03 13:45:36 +00:00

74_Unifi: fixed restore clients at fhem restart

git-svn-id: https://svn.fhem.de/fhem/trunk@19464 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
wuehler 2019-05-25 16:19:00 +00:00
parent b2b6adff99
commit efd77ff319

View File

@ -67,6 +67,8 @@
# - feature: 74_Unifi: persist disconnected clients and rebuild them after fhem-restart # - feature: 74_Unifi: persist disconnected clients and rebuild them after fhem-restart
# V 3.3.1 # V 3.3.1
# - fixed: 74_Unifi: fixed Loglevel # - fixed: 74_Unifi: fixed Loglevel
# V 3.3.2
# - fixed: 74_Unifi: fixed restore clients at fhem restart
package main; package main;
@ -247,6 +249,16 @@ sub Unifi_Notify($$) {
return if(!grep(m/^DEFINED $name|MODIFIED $name|INITIALIZED|REREADCFG$/, @{$dev->{CHANGED}})); return if(!grep(m/^DEFINED $name|MODIFIED $name|INITIALIZED|REREADCFG$/, @{$dev->{CHANGED}}));
#restore clients
for my $readingName (keys %{$hash->{READINGS}}) {
Log3 $name, 5, "$name ($self) - checking 1 $readingName";
if($readingName =~ m/\..*_mac$/){
Log3 $name, 5, "$name ($self) - found 1 $readingName";
my $mac=ReadingsVal($name,$readingName,"");
$hash->{restoreClients}->{$mac} = 1;
}
}
if(AttrVal($name, "disable", 0)) { if(AttrVal($name, "disable", 0)) {
Log3 $name, 5, "$name ($self) - executed. - Device '$name' is disabled, do nothing..."; Log3 $name, 5, "$name ($self) - executed. - Device '$name' is disabled, do nothing...";
Unifi_CONNECTED($hash,'disabled'); Unifi_CONNECTED($hash,'disabled');
@ -260,32 +272,35 @@ sub Unifi_Notify($$) {
$hash->{unifi}->{customClientReadings}->{attr_value} = AttrVal($name,"customClientReadings",$defaultClientReadings); $hash->{unifi}->{customClientReadings}->{attr_value} = AttrVal($name,"customClientReadings",$defaultClientReadings);
Unifi_initCustomClientReadings($hash); Unifi_initCustomClientReadings($hash);
for my $readingName (keys %{$hash->{READINGS}}) {
#Log3 $name, 1, "$name ($self) - checking 1 $readingName"; # TODO: der folgende Block kann Ende 2019 entfernt werden. Es ist der alte Restore-Mechanismus
if($readingName =~ m/\..*_user_id$/){ # Dieser wurde ersetzt durch de restore von mac-Adressen und anschließendem updateClient in doUpdate()
#Log3 $name, 1, "$name ($self) - found 1 $readingName"; #for my $readingName (keys %{$hash->{READINGS}}) {
my $readingValue=ReadingsVal($name,$readingName,""); # #Log3 $name, 1, "$name ($self) - checking 1 $readingName";
if($readingValue =~ m/^[a-fA-F0-9]*$/g){ # if($readingName =~ m/\..*_id$/){
my $clientName=substr($readingName,1,index($readingName,"_user_id")-1); # #Log3 $name, 1, "$name ($self) - found 1 $readingName";
$hash->{clients}->{$readingValue}->{name} = $clientName; # my $readingValue=ReadingsVal($name,$readingName,"");
Log3 $name, 5, "$name ($self) - restored client $clientName with ID $readingValue"; # if($readingValue =~ m/^[a-fA-F0-9]*$/g){
} # my $clientName=substr($readingName,1,index($readingName,"_id")-1);
} # $hash->{clients}->{$readingValue}->{name} = $clientName;
} # Log3 $name, 5, "$name ($self) - restored client $clientName with ID $readingValue";
for my $clientID (keys %{$hash->{clients}}) { # }
my $clientName=$hash->{clients}->{$clientID}->{name}."_"; # }
# TODO: Prüfen, ob es für $clientName ein UnifiClient-Devices gibt und die Werte aus den Readings des UnifiClients wiederherstellen. #}
for my $readingName (keys %{$hash->{READINGS}}) { #for my $clientID (keys %{$hash->{clients}}) {
#Log3 $name, 1, "$name ($self) - checking 2 $readingName for $clientName"; # my $clientName=$hash->{clients}->{$clientID}->{name}."_";
if($readingName =~ m/^$clientName.*/){ # # TODO: Prüfen, ob es für $clientName ein UnifiClient-Devices gibt und die Werte aus den Readings des UnifiClients wiederherstellen.
#Log3 $name, 1, "$name ($self) - found 2 $readingName"; # for my $readingName (keys %{$hash->{READINGS}}) {
my $readingValue=ReadingsVal($name,$readingName,""); # #Log3 $name, 1, "$name ($self) - checking 2 $readingName for $clientName";
my $readingName=substr($readingName,length($clientName)); # if($readingName =~ m/^$clientName.*/){
$hash->{clients}->{$clientID}->{$readingName} = $readingValue; # #Log3 $name, 1, "$name ($self) - found 2 $readingName";
Log3 $name, 5, "$name ($self) - restored internal $readingName = $readingValue for client $clientName"; # my $readingValue=ReadingsVal($name,$readingName,"");
} # my $readingName=substr($readingName,length($clientName));
} # $hash->{clients}->{$clientID}->{$readingName} = $readingValue;
} # Log3 $name, 5, "$name ($self) - restored internal $readingName = $readingValue for client $clientName";
# }
# }
#}
} }
return undef; return undef;
@ -814,6 +829,15 @@ sub Unifi_DoUpdate($@) {
} }
if (Unifi_CONNECTED($hash)) { if (Unifi_CONNECTED($hash)) {
# nach Neustart wird restoreClients in notify gefüllt. Muss beim ersten Update nach dem Login erledigt werden
if (defined $hash->{restoreClients}){
Log3 $name, 5, "$name ($self) - restore clients";
for my $mac (keys %{$hash->{restoreClients}}) {
Log3 $name, 5, "$name ($self) - restore mac $mac";
Unifi_UpdateClient_Send($hash,$mac);
}
delete $hash->{restoreClients};
}
$hash->{unifi}->{updateStartTime} = time(); $hash->{unifi}->{updateStartTime} = time();
$hash->{updateDispatch} = { # {updateDispatch}->{callFn}[callFnRef,'receiveFn',receiveFnRef] $hash->{updateDispatch} = { # {updateDispatch}->{callFn}[callFnRef,'receiveFn',receiveFnRef]
Unifi_GetClients_Send => [\&Unifi_GetClients_Send,'Unifi_GetClients_Receive',\&Unifi_GetClients_Receive], Unifi_GetClients_Send => [\&Unifi_GetClients_Send,'Unifi_GetClients_Receive',\&Unifi_GetClients_Receive],
@ -1035,14 +1059,17 @@ sub Unifi_GetClientInsights_Receive($) {
sub Unifi_UpdateClient_Send($$) { sub Unifi_UpdateClient_Send($$) {
my ($hash,$mac) = @_; my ($hash,$mac) = @_;
my ($name,$self) = ($hash->{NAME},Unifi_Whoami()); my ($name,$self) = ($hash->{NAME},Unifi_Whoami());
if (defined $mac && $mac ne ""){
Log3 $name, 5, "$name ($self) - executed with mac ".$mac; Log3 $name, 5, "$name ($self) - executed with mac ".$mac;
HttpUtils_NonblockingGet( { HttpUtils_NonblockingGet( {
%{$hash->{httpParams}}, %{$hash->{httpParams}},
method => "GET", method => "GET",
url => $hash->{unifi}->{url}."stat/user/".$mac, url => $hash->{unifi}->{url}."stat/user/".$mac,
callback => \&Unifi_UpdateClient_Receive callback => \&Unifi_UpdateClient_Receive
} ); } );
}else{
Log3 $name, 4, "$name ($self) - executed without mac.";
}
return undef; return undef;
} }
############################################################################### ###############################################################################
@ -1453,8 +1480,6 @@ sub Unifi_SetClientReadings($$) {
next if( $ignoreWired && $clientRef->{is_wired} ); next if( $ignoreWired && $clientRef->{is_wired} );
next if( $ignoreWireless && !$clientRef->{is_wired} ); next if( $ignoreWireless && !$clientRef->{is_wired} );
# folgenden Block müsste man vielleicht besser in Unifi_GetClients_Receive() einbauen
# Da man hier aber eh über alle Clients iteriert passt das aber auch hier.
{ {
$apName = "unknown"; $apName = "unknown";
if ($clientRef->{is_wired} if ($clientRef->{is_wired}
@ -1523,7 +1548,10 @@ sub Unifi_SetClientReadings($$) {
} }
$clientRef->{fhem_state}="connected"; $clientRef->{fhem_state}="connected";
readingsBulkUpdate($hash,$clientName,'connected'); readingsBulkUpdate($hash,$clientName,'connected');
readingsBulkUpdate($hash,".".$clientName."_user_id",$clientRef->{user_id}); #readingsBulkUpdate($hash,".".$clientName."_id",$clientRef->{_id});
# mac-Adresse in den Readings versteckt (statet mit .) speichern, um nach einem Neustart den client restoren zu können
readingsBulkUpdate($hash,".".$clientName."_mac",$clientRef->{mac}) if defined $clientRef->{mac};
} }
elsif ((!defined($hash->{READINGS}->{$clientName})) || (defined($hash->{READINGS}->{$clientName}) && $hash->{READINGS}->{$clientName} ne "disconnected")) { elsif ((!defined($hash->{READINGS}->{$clientName})) || (defined($hash->{READINGS}->{$clientName}) && $hash->{READINGS}->{$clientName} ne "disconnected")) {
Log3 $name, 5, "$name ($self) - Client '$clientName' previously connected is now disconnected."; Log3 $name, 5, "$name ($self) - Client '$clientName' previously connected is now disconnected.";