diff --git a/fhem/CHANGED b/fhem/CHANGED index 3618babb7..dc18c0d41 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: 50_SSChatBot: new getter apiInfo + - feature: 49_SSCam: new getter apiInfo - bugfix: 10_SOMFY: corrected autostore rolling code (esp. restart) - feature: 14_SD_WS: protocol 27 / new sensor EFS-3110A - feature: 93_DbRep: sqlCmd supports PREPARE statement, Forum: #114293 diff --git a/fhem/FHEM/50_SSChatBot.pm b/fhem/FHEM/50_SSChatBot.pm index 0ca9bc005..8f47aa5e1 100644 --- a/fhem/FHEM/50_SSChatBot.pm +++ b/fhem/FHEM/50_SSChatBot.pm @@ -43,7 +43,9 @@ use FHEM::SynoModules::SMUtils qw( jboolmap moduleVersion sortVersion - showModuleInfo + showModuleInfo + completeAPI + showAPIinfo setReadingErrorNone setReadingErrorState addSendqueueEntry @@ -126,6 +128,7 @@ BEGIN { # Versions History intern my %vNotesIntern = ( + "1.11.0" => "27.09.2020 optimize getApiSites_Parse, new getter apiInfo ", "1.10.7" => "26.09.2020 more subs to SMUtils and common optimization ", "1.10.6" => "25.09.2020 use module FHEM::SynoModules::API ", "1.10.5" => "25.09.2020 get error Codes from FHEM::SynoModules::ErrCodes, unify moduleVersion, integrate FHEM::SynoModules::SMUtils ", @@ -153,7 +156,8 @@ my %vNotesIntern = ( # Versions History extern my %vNotesExtern = ( - "1.7.0" => "26.05.2020 Now it is possible to send SVG plots very easily with the command asyncSendItem ", + "1.11.0" => "27.09.2020 New get command 'apiInfo' retrieves the API information and opens a popup window to show it. ", + "1.7.0" => "26.05.2020 It is possible to send SVG plots very easily with the command asyncSendItem ", "1.4.0" => "15.03.2020 Command '1_sendItem' renamed to 'asyncSendItem' because of Aesthetics ", "1.3.0" => "13.03.2020 The set command 'sendItem' was renamed to '1_sendItem' to avoid changing the botToken by chance. ". "Also attachments are allowed now in the '1_sendItem' command. ", @@ -192,6 +196,7 @@ my %hget = ( # Ha chatUserlist => { fn => \&_getchatUserlist }, chatChannellist => { fn => \&_getchatChannellist }, versionNotes => { fn => \&_getversionNotes }, + apiInfo => { fn => \&_getapiInfo }, ); my %hmodep = ( # Hash für Opmode Parse @@ -593,6 +598,7 @@ sub Get { } else { $getlist = "Unknown argument $opt, choose one of ". + "apiInfo:noArg ". "storedToken:noArg ". "chatUserlist:noArg ". "chatChannellist:noArg ". @@ -637,6 +643,38 @@ sub _getstoredToken { ; } + +################################################################ +# Getter apiInfo - Anzeige die API Infos in Popup +################################################################ +sub _getapiInfo { + my $paref = shift; + my $hash = $paref->{hash}; + my $name = $paref->{name}; + + # übergebenen CL-Hash (FHEMWEB) in Helper eintragen + delClHash ($name); + getClHash ($hash,1); + + $hash->{HELPER}{API}{PARSET} = 0; # erzwinge Abruf API + + # Eintrag zur SendQueue hinzufügen + my $params = { + name => $name, + opmode => "apiInfo", + method => "", + userid => "", + text => "", + fileUrl => "", + channel => "", + attachment => "" + }; + addSendqueue($params); + getApiSites ($name); + +return; +} + ################################################################ # Getter chatUserlist ################################################################ @@ -808,7 +846,7 @@ sub addSendqueue { my $channel = $paref->{channel}; my $attachment = $paref->{attachment}; - if(!$text && $opmode !~ /chatUserlist|chatChannellist/x) { + if(!$text && $opmode !~ /chatUserlist|chatChannellist|apiInfo/x) { my $err = qq{can't add message to queue: "text" is empty}; Log3($name, 2, "$name - ERROR - $err"); @@ -970,7 +1008,7 @@ sub getApiSites { my @ak; for my $key (keys %{$hash->{HELPER}{API}}) { - next if($key =~ /^(?: PARSET | INFO)$/x); + next if($key =~ /^PARSET$/x); push @ak, $hash->{HELPER}{API}{$key}{NAME}; } my $apis = join ",", @ak; @@ -1007,6 +1045,7 @@ sub getApiSites_parse { my $hash = $param->{hash}; my $name = $hash->{NAME}; + my $opmode = $hash->{OPMODE}; my $inaddr = $hash->{INADDR}; my $inport = $hash->{INPORT}; @@ -1014,17 +1053,15 @@ sub getApiSites_parse { my ($error,$errorcode,$success); - 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, "$name - ERROR message: $err"); setReadingErrorState ($hash, $err); checkRetry ($name,1); return; - - } elsif ($myjson ne "") { - # Evaluiere ob Daten im JSON-Format empfangen wurden + } + elsif ($myjson ne "") { # Evaluiere ob Daten im JSON-Format empfangen wurden ($hash, $success) = evalJSON($hash,$myjson); unless ($success) { Log3($name, 4, "$name - Data returned: ".$myjson); @@ -1032,42 +1069,30 @@ sub getApiSites_parse { return; } - my $data = decode_json($myjson); + my $jdata = decode_json($myjson); - # Logausgabe decodierte JSON Daten - Log3($name, 5, "$name - JSON returned: ". Dumper $data); + Log3($name, 5, "$name - JSON returned: ". Dumper $jdata); - $success = $data->{'success'}; + $success = $jdata->{'success'}; - if ($success) { - # Pfad und Maxversion von "SYNO.Chat.External" ermitteln - my $externalpath = $data->{'data'}->{$external}->{'path'}; - $externalpath =~ tr/_//d if (defined($externalpath)); - my $externalver = $data->{'data'}->{$external}->{'maxVersion'}; - - # ermittelte Werte in $hash einfügen - if(defined($externalpath) && defined($externalver)) { - $hash->{HELPER}{API}{EXTERNAL}{PATH} = $externalpath; - $hash->{HELPER}{API}{EXTERNAL}{VER} = $externalver; + if ($success) { + completeAPI ($jdata, $hash->{HELPER}{API}); # übergibt Referenz zum instanziierten API-Hash - $hash->{HELPER}{API}{PARSET} = 1; # API Hash values sind gesetzt - - Log3 ($name, 4, "$name - API completed after retrieval and adaption:\n".Dumper $hash->{HELPER}{API}); - - setReadingErrorNone($hash, 1); - } - else { - $errorcode = "805"; - $error = expErrors($hash,$errorcode); # Fehlertext zum Errorcode ermitteln + setReadingErrorNone($hash, 1); - setReadingErrorState ($hash, $error, $errorcode); - checkRetry ($name,1); - return; - } + $hash->{HELPER}{API}{PARSET} = 1; # API Hash values sind gesetzt + + Log3 ($name, 4, "$name - API completed after retrieval and adaption:\n".Dumper $hash->{HELPER}{API}); + + if ($opmode eq "apiInfo") { # API Infos in Popup anzeigen + showAPIinfo ($hash, $hash->{HELPER}{API}); # übergibt Referenz zum instanziierten API-Hash) + checkRetry ($name,0); + return; + } } else { $errorcode = "806"; - $error = expErrors($hash,$errorcode); # Fehlertext zum Errorcode ermitteln + $error = expErrors($hash,$errorcode); # Fehlertext zum Errorcode ermitteln setReadingErrorState ($hash, $error, $errorcode); Log3($name, 2, "$name - ERROR - the API-Query couldn't be executed successfully"); @@ -2341,6 +2366,15 @@ return ($cr, $state); Get