automatic login when poll == 1

with errors
This commit is contained in:
Manfred 2022-11-20 21:22:44 +01:00
parent 4fe4018dfc
commit 2d020e92bd

View File

@ -18,7 +18,6 @@ use JSON;
#use vars qw(%data); #use vars qw(%data);
use FHEM::Core::Authentication::Passwords qw(:ALL); use FHEM::Core::Authentication::Passwords qw(:ALL);
# InternalTimer
# strftime # strftime
# RemoveInternalTimer # RemoveInternalTimer
# readingFnAttributes # readingFnAttributes
@ -40,6 +39,7 @@ BEGIN {
AttrVal AttrVal
ReadingsVal ReadingsVal
HttpUtils_NonblockingGet HttpUtils_NonblockingGet
InternalTimer
data data
gettimeofday gettimeofday
fhem fhem
@ -50,7 +50,7 @@ my $Module_Version = '0.0.7';
my $language = 'EN'; my $language = 'EN';
sub Attr_List{ sub Attr_List{
return "matrixRoom matrixSender matrixMessage matrixQuestion_ matrixQuestion_[0-9]+ matrixAnswer_ matrixAnswer_[0-9]+ $readingFnAttributes"; return "matrixLogin:password matrixRoom matrixSender matrixMessage matrixQuestion_ matrixQuestion_[0-9]+ matrixAnswer_ matrixAnswer_[0-9]+ $readingFnAttributes";
} }
sub Define { sub Define {
@ -86,10 +86,24 @@ sub Undef {
sub Startproc { sub Startproc {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
Log3($name, 1, "$name: Startproc V".$hash->{ModuleVersion}." -> V".$Module_Version) if ($hash->{ModuleVersion});
# Update necessary? # Update necessary?
Log3($name, 1, "$name: Start V".$hash->{ModuleVersion}." -> V".$Module_Version) if ($hash->{ModuleVersion});
$hash->{ModuleVersion} = $Module_Version; $hash->{ModuleVersion} = $Module_Version;
$language = AttrVal('global','language','EN'); $language = AttrVal('global','language','EN');
$data{MATRIX}{"$name"}{"softfail"} = 1;
Log3($name, 4, "$name : Matrix::Startproc $hash");
Login($hash) if (ReadingsVal($name,'poll',0) == 1);
}
sub Login {
my $hash = @_;
Log3("nn", 4, "nn : Matrix::Login $hash");
if ($hash eq "1"){
Log3("nn", 4, "nn : Matrix::Login $hash");
} else {
Log3($hash->{NAME}, 4, "$hash->{NAME} : Matrix::Login $hash");
return PerformHttpRequest($hash, 'login', '');
}
} }
########################## ##########################
@ -99,12 +113,12 @@ sub Notify($$)
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $devName = $dev->{NAME}; my $devName = $dev->{NAME};
return "" if(IsDisabled($name)); return "" if(IsDisabled($name));
#Log3($name, 1, "$name : X_Notify $devName");
my $events = deviceEvents($dev,1); my $events = deviceEvents($dev,1);
return if( !$events ); return if( !$events );
if(($devName eq "global") && grep(m/^INITIALIZED|REREADCFG$/, @{$events})) if(($devName eq "global") && grep(m/^INITIALIZED|REREADCFG$/, @{$events}))
{ {
Log3($name, 4, "$name : Matrix::Notify $hash");
Startproc($hash); Startproc($hash);
} }
foreach my $event (@{$events}) { foreach my $event (@{$events}) {
@ -164,7 +178,8 @@ sub Get {
return PerformHttpRequest($hash, $cmd, ''); return PerformHttpRequest($hash, $cmd, '');
} }
elsif ($cmd eq "sync") { elsif ($cmd eq "sync") {
$data{MATRIX}{"$name"}{"FAILS"} = 0; $data{MATRIX}{"$name"}{"softfail"} = 0;
$data{MATRIX}{"$name"}{"hardfail"} = 0;
return PerformHttpRequest($hash, $cmd, ''); return PerformHttpRequest($hash, $cmd, '');
} }
elsif ($cmd eq "filter") { elsif ($cmd eq "filter") {
@ -220,7 +235,7 @@ sub Set {
sub Attr { sub Attr {
my ($cmd,$name,$attr_name,$attr_value) = @_; my ($cmd,$name,$attr_name,$attr_value) = @_;
Log3($name, 1, "Attr - $cmd - $name - $attr_name - $attr_value"); Log3($name, 4, "Attr - $cmd - $name - $attr_name - $attr_value");
if($cmd eq "set") { if($cmd eq "set") {
if ($attr_name eq "matrixQuestion_") { if ($attr_name eq "matrixQuestion_") {
my @erg = split(/ /, $attr_value, 2); my @erg = split(/ /, $attr_value, 2);
@ -241,19 +256,20 @@ sub Attr {
sub Get_Message($$$) { sub Get_Message($$$) {
my($name, $def, $message) = @_; my($name, $def, $message) = @_;
Log3($name, 5, "$name - $def - $message"); Log3($name, 3, "$name - $def - $message");
my $q = AttrVal($name, "matrixQuestion_$def", ""); my $q = AttrVal($name, "matrixQuestion_$def", "");
my $a = AttrVal($name, "matrixAnswer_$def", ""); my $a = AttrVal($name, "matrixAnswer_$def", "");
my @questions = split(':',$q); my @questions = split(':',$q);
shift @questions; shift @questions if ($def ne '99');
my @answers = split(':', $a); my @answers = split(':', $a);
Log3($name, 5, "$name - $q - $a"); Log3($name, 3, "$name - $q - $a");
my $pos = 0; my $pos = 0;
my ($question, $answer); my ($question, $answer);
foreach $question (@questions){ foreach $question (@questions){
Log3($name, 3, "$name - $question - $answers[$pos]");
$answer = $answers[$pos] if ($message eq $question); $answer = $answers[$pos] if ($message eq $question);
if ($answer){ if ($answer){
Log3($name, 5, "$name - $pos - $answer"); Log3($name, 3, "$name - $pos - $answer");
fhem($answer); fhem($answer);
last; last;
} }
@ -267,11 +283,24 @@ sub PerformHttpRequest($$$)
my $now = gettimeofday(); my $now = gettimeofday();
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $passwd = ""; my $passwd = "";
Log3($name, 4, "$name : Matrix::PerformHttpRequest $hash");
if ($def eq "login" || $def eq "reg2"){ if ($def eq "login" || $def eq "reg2"){
$passwd = $hash->{helper}->{passwdobj}->getReadPassword($name) ; $passwd = $hash->{helper}->{passwdobj}->getReadPassword($name) ;
} }
#Log3($name, 5, "PerformHttpRequest - $name - $passwd"); $data{MATRIX}{"$name"}{"msgnumber"} = $data{MATRIX}{"$name"}{"msgnumber"} ? $data{MATRIX}{"$name"}{"msgnumber"} + 1 : 1;
my $msgnumber = $data{MATRIX}{"$name"}{"msgnumber"};
my $deviceId = ReadingsVal($name, 'deviceId', undef) ? ', "deviceId":"'.ReadingsVal($name, 'deviceId', undef).'"' : "";
$data{MATRIX}{"$name"}{"busy"} = $data{MATRIX}{"$name"}{"busy"} ? $data{MATRIX}{"$name"}{"busy"} + 1 : 1; # queue is busy until response is received
$data{MATRIX}{"$name"}{"sync"} = 0 if (!$data{MATRIX}{"$name"}{"sync"});
$data{MATRIX}{"$name"}{'LASTSEND'} = $now; # remember when last sent
if ($def eq "sync" && $data{MATRIX}{"$name"}{"next_refresh"} < $now && AttrVal($name,'matrixLogin','') eq 'password'){
$def = "refresh";
Log3($name, 5, qq($name $data{MATRIX}{"$name"}{"access_token"} sync2refresh - $data{MATRIX}{"$name"}{"next_refresh"} < $now) );
$data{MATRIX}{"$name"}{"next_refresh"} = $now + 300;
}
my $param = { my $param = {
timeout => 10, timeout => 10,
@ -280,17 +309,10 @@ sub PerformHttpRequest($$$)
value => $value, # sichern für eventuelle Wiederholung value => $value, # sichern für eventuelle Wiederholung
method => "POST", # standard, sonst überschreiben method => "POST", # standard, sonst überschreiben
header => "User-Agent: HttpUtils/2.2.3\r\nAccept: application/json", # Den Header gemäß abzufragender Daten setzen header => "User-Agent: HttpUtils/2.2.3\r\nAccept: application/json", # Den Header gemäß abzufragender Daten setzen
callback => \&ParseHttpResponse # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten callback => \&ParseHttpResponse, # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten
msgnumber => $msgnumber # lfd. Nummer Request
}; };
$data{MATRIX}{"$name"}{"busy"} = $data{MATRIX}{"$name"}{"busy"} ? $data{MATRIX}{"$name"}{"busy"} + 1 : 1; # queue is busy until response is received
$data{MATRIX}{"$name"}{'LASTSEND'} = $now; # remember when last sent
if ($def eq "sync" && $data{MATRIX}{"$name"}{"next_refresh"} < $now){
$def = "refresh";
Log3($name, 3, qq($name - sync2refresh - $data{MATRIX}{"$name"}{"next_refresh"} < $now) );
$data{MATRIX}{"$name"}{"next_refresh"} = $now + 300;
}
my $deviceId = ReadingsVal($name, 'deviceId', undef) ? ', "deviceId":"'.ReadingsVal($name, 'deviceId', undef).'"' : "";
if ($def eq "logintypes"){ if ($def eq "logintypes"){
$param->{'url'} = $hash->{server}."/_matrix/client/r0/login"; $param->{'url'} = $hash->{server}."/_matrix/client/r0/login";
$param->{'method'} = 'GET'; $param->{'method'} = 'GET';
@ -308,13 +330,26 @@ sub PerformHttpRequest($$$)
$param->{'data'} = '{"username":"'.$hash->{user}.'", "password":"'.$passwd.'", "auth": {"session":"'.$data{MATRIX}{"$name"}{"session"}.'","type":"m.login.dummy"}}'; $param->{'data'} = '{"username":"'.$hash->{user}.'", "password":"'.$passwd.'", "auth": {"session":"'.$data{MATRIX}{"$name"}{"session"}.'","type":"m.login.dummy"}}';
} }
if ($def eq "login"){ if ($def eq "login"){
if (AttrVal($name,'matrixLogin','') eq 'token'){
$param->{'url'} = $hash->{server}."/_matrix/client/v3/login"; $param->{'url'} = $hash->{server}."/_matrix/client/v3/login";
$param->{'data'} = '{"type":"m.login.password", "refresh_token": true, "identifier":{ "type":"m.id.user", "user":"'.$hash->{user}.'" }, "password":"'.$passwd.'"' $param->{'data'} = qq({"type":"m.login.token", "token":"$passwd", "user": "$hash->{user}", "txn_id": "z4567gerww", "session":"1234"});
.$deviceId.'}'; #$param->{'method'} = 'GET';
} else {
$param->{'url'} = $hash->{server}."/_matrix/client/v3/login";
$param->{'data'} = '{"type":"m.login.password", "refresh_token": true, "identifier":{ "type":"m.id.user", "user":"'.$hash->{user}.'" }, "password":"'.$passwd.'"'.$deviceId.'}';
}
}
if ($def eq "login2"){
$param->{'url'} = $hash->{server}."/_matrix/client/v3/login";
if (AttrVal($name,'matrixLogin','') eq 'token'){
$param->{'data'} = qq({"type":"m.login.token", "token":"$passwd", "user": "\@$hash->{user}:matrix.org", "txn_id": "z4567gerww"});
#$param->{'data'} = qq({"type":"m.login.token", "token":"$passwd"});
}
} }
if ($def eq "refresh"){ if ($def eq "refresh"){
$param->{'url'} = $hash->{server}.'/_matrix/client/v1/refresh'; $param->{'url'} = $hash->{server}.'/_matrix/client/v1/refresh';
$param->{'data'} = '{"refresh_token": "'.$data{MATRIX}{"$name"}{"refresh_token"}.'"}'; $param->{'data'} = '{"refresh_token": "'.$data{MATRIX}{"$name"}{"refresh_token"}.'"}';
Log3($name, 5, qq($name $data{MATRIX}{"$name"}{"access_token"} refreshBeg $param->{'msgnumber'}: $data{MATRIX}{"$name"}{"next_refresh"} > $now) );
} }
if ($def eq "wellknown"){ if ($def eq "wellknown"){
$param->{'url'} = $hash->{server}."/.well-known/matrix/client"; $param->{'url'} = $hash->{server}."/.well-known/matrix/client";
@ -352,7 +387,6 @@ sub PerformHttpRequest($$$)
if ($def eq "questionEnd"){ if ($def eq "questionEnd"){
$value = ReadingsVal($name, "questionId", "") if (!$value); $value = ReadingsVal($name, "questionId", "") if (!$value);
$param->{'url'} = $hash->{server}.'/_matrix/client/v3/rooms/'.AttrVal($name, 'matrixMessage', '!!').'/send/m.poll.end?access_token='.$data{MATRIX}{"$name"}{"access_token"}; $param->{'url'} = $hash->{server}.'/_matrix/client/v3/rooms/'.AttrVal($name, 'matrixMessage', '!!').'/send/m.poll.end?access_token='.$data{MATRIX}{"$name"}{"access_token"};
# ""'.ReadingsVal($name, 'questionEventId', '!!').'
$param->{'data'} = '{"m.relates_to": {"rel_type": "m.reference","eventId": "'.$value.'"},"org.matrix.msc3381.poll.end": {},'. $param->{'data'} = '{"m.relates_to": {"rel_type": "m.reference","eventId": "'.$value.'"},"org.matrix.msc3381.poll.end": {},'.
'"org.matrix.msc1767.text": "Antort '.ReadingsVal($name, "answer", "").' erhalten von '.ReadingsVal($name, "sender", "").'"}'; '"org.matrix.msc1767.text": "Antort '.ReadingsVal($name, "answer", "").' erhalten von '.ReadingsVal($name, "sender", "").'"}';
} }
@ -368,6 +402,8 @@ sub PerformHttpRequest($$$)
$param->{'url'} = $hash->{server}.'/_matrix/client/r0/sync?access_token='.$data{MATRIX}{"$name"}{"access_token"}.$since.$full_state.'&timeout=50000&filter='.ReadingsVal($name, 'filterId',0); $param->{'url'} = $hash->{server}.'/_matrix/client/r0/sync?access_token='.$data{MATRIX}{"$name"}{"access_token"}.$since.$full_state.'&timeout=50000&filter='.ReadingsVal($name, 'filterId',0);
$param->{'method'} = 'GET'; $param->{'method'} = 'GET';
$param->{'timeout'} = 60; $param->{'timeout'} = 60;
$data{MATRIX}{"$name"}{"sync"}++;
Log3($name, 5, qq($name $data{MATRIX}{"$name"}{"access_token"} syncBeg $param->{'msgnumber'}: $data{MATRIX}{"$name"}{"next_refresh"} > $now) );
} }
if ($def eq "filter"){ if ($def eq "filter"){
if ($value){ # get if ($value){ # get
@ -388,9 +424,10 @@ sub PerformHttpRequest($$$)
. ( $param->{data} ? "\r\ndata: $param->{data}, " : "" ) . ( $param->{data} ? "\r\ndata: $param->{data}, " : "" )
. ( $param->{header} ? "\r\nheader: $param->{header}" : "" ); . ( $param->{header} ? "\r\nheader: $param->{header}" : "" );
#readingsSingleUpdate($hash, "fullRequest", $test, 1); # Readings erzeugen #readingsSingleUpdate($hash, "fullRequest", $test, 1); # Readings erzeugen
$test = "$name: Matrix sends with timeout $param->{timeout} to ".$test; $test = "$name: Matrix sends with timeout $param->{timeout} to $test";
Log3($name, 5, $test); Log3($name, 5, $test);
Log3($name, 3, qq($name $param->{'msgnumber'} $def Request Busy/Sync $data{MATRIX}{"$name"}{"busy"} / $data{MATRIX}{"$name"}{"sync"}) );
HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code. HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code.
return undef; return undef;
} }
@ -405,6 +442,7 @@ sub ParseHttpResponse($)
my $now = gettimeofday(); my $now = gettimeofday();
my $nextRequest = ""; my $nextRequest = "";
Log3($name, 3, qq($name $param->{'msgnumber'} $def Result $param->{code}) );
readingsBeginUpdate($hash); readingsBeginUpdate($hash);
###readingsBulkUpdate($hash, "httpHeader", $param->{httpheader}); ###readingsBulkUpdate($hash, "httpHeader", $param->{httpheader});
readingsBulkUpdate($hash, "httpStatus", $param->{code}); readingsBulkUpdate($hash, "httpStatus", $param->{code});
@ -412,17 +450,21 @@ sub ParseHttpResponse($)
if($err ne "") { # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist if($err ne "") { # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
Log3($name, 2, "error while requesting ".$param->{url}." - $err"); # Eintrag fürs Log Log3($name, 2, "error while requesting ".$param->{url}." - $err"); # Eintrag fürs Log
readingsBulkUpdate($hash, "responseError", $err); # Reading erzeugen readingsBulkUpdate($hash, "responseError", $err); # Reading erzeugen
$data{MATRIX}{"$name"}{"FAILS"} = 3; $data{MATRIX}{"$name"}{"softfail"} = 3;
$data{MATRIX}{"$name"}{"hardfail"}++;
} }
elsif($data ne "") { # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes) elsif($data ne "") { # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)
Log3($name, 4, $def." returned: $data"); # Eintrag fürs Log Log3($name, 4, $def." returned: $data"); # Eintrag fürs Log
my $decoded = eval { JSON::decode_json($data) }; my $decoded = eval { JSON::decode_json($data) };
Log3($name, 2, "$name: json error: $@ in data") if( $@ ); Log3($name, 2, "$name: json error: $@ in data") if( $@ );
if ($param->{code} == 200){ if ($param->{code} == 200){
$data{MATRIX}{"$name"}{"FAILS"} = 0; $data{MATRIX}{"$name"}{"softfail"} = 0;
$data{MATRIX}{"$name"}{"hardfail"} = 0;
} else { } else {
$data{MATRIX}{"$name"}{"FAILS"}++; $data{MATRIX}{"$name"}{"softfail"}++;
readingsBulkUpdate($hash, "responseError", $data{MATRIX}{"$name"}{"FAILS"}.' - '.$data); $data{MATRIX}{"$name"}{"hardfail"}++ if ($data{MATRIX}{"$name"}{"softfail"} > 3);
readingsBulkUpdate($hash, "responseError", qq(S$data{MATRIX}{$name}{'softfail'}: $data) );
Log3($name, 5, qq($name $data{MATRIX}{"$name"}{"access_token"} ${def}End $param->{'msgnumber'}: $data{MATRIX}{"$name"}{"next_refresh"} > $now) );
} }
# readingsBulkUpdate($hash, "fullResponse", $data); # readingsBulkUpdate($hash, "fullResponse", $data);
@ -449,25 +491,30 @@ sub ParseHttpResponse($)
$data{MATRIX}{"$name"}{"session"} = $decoded->{'session'}; $data{MATRIX}{"$name"}{"session"} = $decoded->{'session'};
$nextRequest = "";#"reg2"; $nextRequest = "";#"reg2";
} }
$data{MATRIX}{"$name"}{"session"} = $decoded->{'session'} if ($decoded->{'session'});
readingsBulkUpdate($hash, "session", $decoded->{'session'}) if ($decoded->{'session'});
if ($def eq "reg2" || $def eq "login" || $def eq "refresh") { if ($def eq "reg2" || $def eq "login" || $def eq "refresh") {
readingsBulkUpdate($hash, "lastRegister", $param->{code}) if $def eq "reg2"; readingsBulkUpdate($hash, "lastRegister", $param->{code}) if $def eq "reg2";
readingsBulkUpdate($hash, "lastLogin", $param->{code}) if $def eq "login"; readingsBulkUpdate($hash, "lastLogin", $param->{code}) if $def eq "login";
readingsBulkUpdate($hash, "lastRefresh", $param->{code}) if $def eq "refresh"; readingsBulkUpdate($hash, "lastRefresh", $param->{code}) if $def eq "refresh";
if ($param->{code} == 200){ if ($param->{code} == 200){
readingsBulkUpdate($hash, "userId", $decoded->{'userId'}) if ($decoded->{'userId'}); readingsBulkUpdate($hash, "userId", $decoded->{'user_id'}) if ($decoded->{'user_id'});
readingsBulkUpdate($hash, "homeServer", $decoded->{'homeServer'}) if ($decoded->{'homeServer'}); readingsBulkUpdate($hash, "homeServer", $decoded->{'homeServer'}) if ($decoded->{'homeServer'});
readingsBulkUpdate($hash, "deviceId", $decoded->{'deviceId'}) if ($decoded->{'deviceId'}); readingsBulkUpdate($hash, "deviceId", $decoded->{'device_id'}) if ($decoded->{'device_id'});
$data{MATRIX}{"$name"}{"expires"} = $decoded->{'expires_in_ms'} if ($decoded->{'expires_in_ms'}); $data{MATRIX}{"$name"}{"expires"} = $decoded->{'expires_in_ms'} if ($decoded->{'expires_in_ms'});
$data{MATRIX}{"$name"}{"refresh_token"} = $decoded->{'refresh_token'} if ($decoded->{'refresh_token'}); $data{MATRIX}{"$name"}{"refresh_token"} = $decoded->{'refresh_token'} if ($decoded->{'refresh_token'});
$data{MATRIX}{"$name"}{"access_token"} = $decoded->{'access_token'} if ($decoded->{'access_token'}); $data{MATRIX}{"$name"}{"access_token"} = $decoded->{'access_token'} if ($decoded->{'access_token'});
$data{MATRIX}{"$name"}{"next_refresh"} = $now + $data{MATRIX}{"$name"}{"expires"}/1000 - 60; # refresh one minute before end $data{MATRIX}{"$name"}{"next_refresh"} = $now + $data{MATRIX}{"$name"}{"expires"}/1000 - 60; # refresh one minute before end
} }
Log3($name, 5, qq($name $data{MATRIX}{"$name"}{"access_token"} refreshEnd $param->{'msgnumber'}: $data{MATRIX}{"$name"}{"next_refresh"} > $now) );
} }
if ($def eq "wellknown"){ if ($def eq "wellknown"){
# https://spec.matrix.org/unstable/client-server-api/ # https://spec.matrix.org/unstable/client-server-api/
} }
if ($param->{code} == 200 && $def eq "sync"){ if ($param->{code} == 200 && $def eq "sync"){
Log3($name, 5, qq($name $data{MATRIX}{"$name"}{"access_token"} syncEnd $param->{'msgnumber'}: $data{MATRIX}{"$name"}{"next_refresh"} > $now) );
readingsBulkUpdate($hash, "since", $decoded->{'next_batch'}) if ($decoded->{'next_batch'}); readingsBulkUpdate($hash, "since", $decoded->{'next_batch'}) if ($decoded->{'next_batch'});
# roomlist # roomlist
my $list = $decoded->{'rooms'}->{'join'}; my $list = $decoded->{'rooms'}->{'join'};
@ -506,6 +553,11 @@ sub ParseHttpResponse($)
} elsif ($tl->{'type'} eq "org.matrix.msc3381.poll.response"){ } elsif ($tl->{'type'} eq "org.matrix.msc3381.poll.response"){
my $sender = $tl->{'sender'}; my $sender = $tl->{'sender'};
my $message = $tl->{'content'}->{'org.matrix.msc3381.poll.response'}->{'answers'}[0]; my $message = $tl->{'content'}->{'org.matrix.msc3381.poll.response'}->{'answers'}[0];
if ($tl->{'content'}->{'m.relates_to'}){
if ($tl->{'content'}->{'m.relates_to'}->{'rel_type'} eq 'm.reference'){
readingsBulkUpdate($hash, "questionId", $tl->{'content'}->{'m.relates_to'}->{'event_id'})
}
}
if (AttrVal($name, 'matrixSender', '') =~ $sender){ if (AttrVal($name, 'matrixSender', '') =~ $sender){
readingsBulkUpdate($hash, "message", $message); readingsBulkUpdate($hash, "message", $message);
readingsBulkUpdate($hash, "sender", $sender); readingsBulkUpdate($hash, "sender", $sender);
@ -530,31 +582,30 @@ sub ParseHttpResponse($)
readingsBulkUpdate($hash, "logintypes", $types); readingsBulkUpdate($hash, "logintypes", $types);
} }
if ($def eq "filter"){ if ($def eq "filter"){
readingsBulkUpdate($hash, "filterId", $decoded->{'filterId'}) if ($decoded->{'filterId'}); readingsBulkUpdate($hash, "filterId", $decoded->{'filter_id'}) if ($decoded->{'filter_id'});
} }
if ($def eq "msg" ){ if ($def eq "msg" ){
readingsBulkUpdate($hash, "eventId", $decoded->{'eventId'}) if ($decoded->{'eventId'}); readingsBulkUpdate($hash, "eventId", $decoded->{'event_id'}) if ($decoded->{'event_id'});
#m.relates_to #m.relates_to
} }
if ($def eq "question"){ if ($def eq "question"){
readingsBulkUpdate($hash, "questionId", $decoded->{'eventId'}) if ($decoded->{'eventId'}); readingsBulkUpdate($hash, "questionId", $decoded->{'event_id'}) if ($decoded->{'event_id'});
#m.relates_to #m.relates_to
} }
if ($def eq "questionEnd"){ if ($def eq "questionEnd"){
readingsBulkUpdate($hash, "eventId", $decoded->{'eventId'}) if ($decoded->{'eventId'}); readingsBulkUpdate($hash, "eventId", $decoded->{'event_id'}) if ($decoded->{'event_id'});
readingsBulkUpdate($hash, "questionId", "") if ($decoded->{'eventId'}); readingsBulkUpdate($hash, "questionId", "") if ($decoded->{'event_id'});
#m.relates_to #m.relates_to
} }
} }
readingsEndUpdate($hash, 1); readingsEndUpdate($hash, 1);
$data{MATRIX}{"$name"}{"busy"} = $data{MATRIX}{"$name"}{"busy"} - 1; # queue is busy until response is received $data{MATRIX}{"$name"}{"busy"}--; # = $data{MATRIX}{"$name"}{"busy"} - 1; # queue is busy until response is received
$data{MATRIX}{"$name"}{"sync"} = 0 if ($def eq "sync" || !$data{MATRIX}{"$name"}{"sync"}); # possible next sync $data{MATRIX}{"$name"}{"sync"}-- if ($def eq "sync"); # possible next sync
$nextRequest = "" if ($nextRequest eq "sync" && $data{MATRIX}{"$name"}{"sync"} == 1); # only one sync at a time! $nextRequest = "" if ($nextRequest eq "sync" && $data{MATRIX}{"$name"}{"sync"} > 0); # only one sync at a time!
#if ($def eq "sync" && $nextRequest eq "sync" && ReadingsVal($name,'poll',0) == 1 && $data{MATRIX}{"$name"}{"FAILS"} < 3){ # PerformHttpRequest or InternalTimer if FAIL >= 3
# PerformHttpRequest($hash, $nextRequest, ''); Log3($name, 4, "$name : Matrix::ParseHttpResponse $hash");
#} els if ($nextRequest ne "" && ReadingsVal($name,'poll',0) == 1 && $data{MATRIX}{"$name"}{"softfail"} < 3) {
if ($nextRequest ne "" && ReadingsVal($name,'poll',0) == 1 && $data{MATRIX}{"$name"}{"FAILS"} < 3) {
if ($nextRequest eq "sync" && $data{MATRIX}{"$name"}{"repeat"}){ if ($nextRequest eq "sync" && $data{MATRIX}{"$name"}{"repeat"}){
$def = $data{MATRIX}{"$name"}{"repeat"}->{"def"}; $def = $data{MATRIX}{"$name"}{"repeat"}->{"def"};
$value = $data{MATRIX}{"$name"}{"repeat"}->{"value"}; $value = $data{MATRIX}{"$name"}{"repeat"}->{"value"};
@ -563,6 +614,26 @@ sub ParseHttpResponse($)
} else { } else {
PerformHttpRequest($hash, $nextRequest, ''); PerformHttpRequest($hash, $nextRequest, '');
} }
} else {
my $pauseLogin;
if ($data{MATRIX}{"$name"}{"hardfail"} >= 3){
$pauseLogin = 300;
} elsif ($data{MATRIX}{"$name"}{"softfail"} >= 3){
$pauseLogin = 30;
} elsif ($data{MATRIX}{"$name"}{"softfail"} > 0){
$pauseLogin = 10;
} else {
$pauseLogin = 0;
} }
if ($pauseLogin > 0){
my $timeToStart = gettimeofday() + $pauseLogin;
RemoveInternalTimer($hash->{myTimer}) if($hash->{myTimer});
$hash->{myTimer} = { hash=>$hash };
InternalTimer($timeToStart, \&FHEM::Devices::Matrix::Login, $hash->{myTimer});
} else {
Login($hash);
}
}
# Damit ist die Abfrage zuende. # Damit ist die Abfrage zuende.
} }