diff --git a/fhem/FHEM/50_SSChatBot.pm b/fhem/FHEM/50_SSChatBot.pm
index 1b2df41d0..0ca9bc005 100644
--- a/fhem/FHEM/50_SSChatBot.pm
+++ b/fhem/FHEM/50_SSChatBot.pm
@@ -38,20 +38,23 @@ use warnings;
use GPUtils qw(GP_Import GP_Export); # wird für den Import der FHEM Funktionen aus der fhem.pl benötigt
use FHEM::SynoModules::API qw(:all); # API Modul
-my $vAPI = FHEM::SynoModules::API->VERSION();
-use FHEM::SynoModules::SMUtils qw(jboolmap
- sortVersion
+use FHEM::SynoModules::SMUtils qw(
+ jboolmap
+ moduleVersion
+ sortVersion
+ showModuleInfo
setReadingErrorNone
setReadingErrorState
+ addSendqueueEntry
listSendqueue
purgeSendqueue
updQueueLength
- );
-my $vSMUtils = FHEM::SynoModules::SMUtils->VERSION(); # Hilfsroutinen Modul
+ getClHash
+ delClHash
+ ); # Hilfsroutinen Modul
-use FHEM::SynoModules::ErrCodes qw(:all);
-my $vErrCodes = FHEM::SynoModules::ErrCodes->VERSION(); # Error Code Modul
+use FHEM::SynoModules::ErrCodes qw(:all); # Error Code Modul
use Data::Dumper; # Perl Core module
use MIME::Base64;
@@ -123,8 +126,9 @@ BEGIN {
# Versions History intern
my %vNotesIntern = (
- "1.10.6" => "22.08.2020 use module FHEM::SynoModules::API ",
- "1.10.5" => "25.09.2020 get error Codes from FHEM::SynoModules::ErrCodes, unify setVersionInfo, integrate FHEM::SynoModules::SMUtils ",
+ "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 ",
"1.10.4" => "22.08.2020 minor code changes ",
"1.10.3" => "20.08.2020 more code refactoring according PBP ",
"1.10.2" => "19.08.2020 more code refactoring and little improvements ",
@@ -196,7 +200,7 @@ my %hmodep = ( # Ha
sendItem => { fn => \&_parseSendItem },
);
-my %hrecbot = ( # Hash für botCGI receice Slash-commands (/set, /get, /code)
+my %hrecbot = ( # Hash für botCGI receive Slash-commands (/set, /get, /code)
set => { fn => \&__botCGIrecSet },
get => { fn => \&__botCGIrecGet },
cod => { fn => \&__botCGIrecCod },
@@ -263,7 +267,16 @@ sub Define {
CommandAttr(undef,"$name room Chat");
$hash->{HELPER}{API} = \%hapi; # API Template in HELPER kopieren
- setVersionInfo ($hash, \%vNotesIntern); # Versionsinformationen setzen
+
+ my $params = {
+ hash => $hash,
+ notes => \%vNotesIntern,
+ useAPI => 1,
+ useSMUtils => 1,
+ useErrCodes => 1
+ };
+ use version 0.77; our $VERSION = moduleVersion ($params); # Versionsinformationen setzen
+
getToken($hash,1,"botToken"); # Token lesen
$data{SSChatBot}{$name}{sendqueue}{index} = 0; # Index der Sendequeue initialisieren
@@ -633,8 +646,8 @@ sub _getchatUserlist {
my $name = $paref->{name};
# übergebenen CL-Hash (FHEMWEB) in Helper eintragen
- delClhash ($name);
- getClhash ($hash,1);
+ delClHash ($name);
+ getClHash ($hash,1);
# Eintrag zur SendQueue hinzufügen
my $params = {
@@ -662,8 +675,8 @@ sub _getchatChannellist {
my $name = $paref->{name};
# übergebenen CL-Hash (FHEMWEB) in Helper eintragen
- delClhash ($name);
- getClhash ($hash,1);
+ delClHash ($name);
+ getClHash ($hash,1);
# Eintrag zur SendQueue hinzufügen
my $params = {
@@ -687,91 +700,12 @@ return;
################################################################
sub _getversionNotes {
my $paref = shift;
- my $arg = $paref->{arg};
- my $header = "Module release information
";
- my $header1 = "Helpful hints
";
- my $ret = "";
- my %hs;
+ $paref->{hintextde} = \%vHintsExt_de;
+ $paref->{hintexten} = \%vHintsExt_en;
+ $paref->{notesext} = \%vNotesExtern;
- # Ausgabetabelle erstellen
- my ($val0,$val1);
- my $i = 0;
-
- $ret = "";
-
- # Hints
- if(!$arg || $arg =~ /hints/x || $arg =~ /[\d]+/x) {
- $ret .= sprintf("
$header1
");
- $ret .= "
";
- $ret .= "";
- $ret .= "";
- if($arg && $arg =~ /[\d]+/x) {
- my @hints = split(",",$arg);
- for my $hint (@hints) {
- if(AttrVal("global","language","EN") eq "DE") {
- $hs{$hint} = $vHintsExt_de{$hint};
- }
- else {
- $hs{$hint} = $vHintsExt_en{$hint};
- }
- }
- }
- else {
- if(AttrVal("global","language","EN") eq "DE") {
- %hs = %vHintsExt_de;
- }
- else {
- %hs = %vHintsExt_en;
- }
- }
- $i = 0;
- for my $key (sortVersion("desc",keys %hs)) {
- $val0 = $hs{$key};
- $ret .= sprintf("$key | $val0 | " );
- $ret .= "
";
- $i++;
-
- if ($i & 1) { # $i ist ungerade
- $ret .= "";
- }
- else {
- $ret .= "
";
- }
- }
- $ret .= "
";
- $ret .= "";
- $ret .= "
";
- $ret .= "
";
- }
-
- # Notes
- if(!$arg || $arg =~ /rel/x) {
- $ret .= sprintf("$header
");
- $ret .= "
";
- $ret .= "";
- $ret .= "";
- $i = 0;
- for my $key (sortVersion("desc",keys %vNotesExtern)) {
- ($val0,$val1) = split(/\s/x, $vNotesExtern{$key},2);
- $ret .= sprintf("$key | $val0 | $val1 | " );
- $ret .= "
";
- $i++;
-
- if ($i & 1) { # $i ist ungerade
- $ret .= "";
- }
- else {
- $ret .= "
";
- }
- }
- $ret .= "
";
- $ret .= "";
- $ret .= "
";
- $ret .= "
";
- }
-
- $ret .= "";
+ my $ret = showModuleInfo ($paref);
return $ret;
}
@@ -882,25 +816,19 @@ sub addSendqueue {
return;
}
-
- $data{SSChatBot}{$name}{sendqueue}{index}++;
- my $index = $data{SSChatBot}{$name}{sendqueue}{index};
-
- Log3($name, 5, "$name - Add Item to queue - Idx: $index, Opmode: $opmode, Text: $text, fileUrl: $fileUrl, attachment: $attachment, userid: $userid");
-
- my $pars = {'opmode' => $opmode,
- 'method' => $method,
- 'userid' => $userid,
- 'channel' => $channel,
- 'text' => $text,
- 'attachment' => $attachment,
- 'fileUrl' => $fileUrl,
- 'retryCount' => 0
- };
-
- $data{SSChatBot}{$name}{sendqueue}{entries}{$index} = $pars;
-
- updQueueLength ($hash); # update Länge der Sendequeue
+
+ my $entry = {
+ 'opmode' => $opmode,
+ 'method' => $method,
+ 'userid' => $userid,
+ 'channel' => $channel,
+ 'text' => $text,
+ 'attachment' => $attachment,
+ 'fileUrl' => $fileUrl,
+ 'retryCount' => 0
+ };
+
+ addSendqueueEntry ($hash, $entry); # den Datensatz zur Sendqueue hinzufügen
return;
}
@@ -998,8 +926,7 @@ sub getApiSites {
my $inprot = $hash->{INPROT};
my ($url,$param,$idxset,$ret);
-
- # API-Pfade und MaxVersions ermitteln
+
Log3($name, 4, "$name - ####################################################");
Log3($name, 4, "$name - ### start Chat operation Send ");
Log3($name, 4, "$name - ####################################################");
@@ -1380,7 +1307,7 @@ sub _parseUsers {
# Ausgabe Popup der User-Daten (nach readingsEndUpdate positionieren sonst
# "Connection lost, trying reconnect every 5 seconds" wenn > 102400 Zeichen)
asyncOutput ($hash->{HELPER}{CL}{1},"$out");
- InternalTimer (gettimeofday()+10.0, "FHEM::SSChatBot::delClhash", $name, 0);
+ InternalTimer (gettimeofday()+10.0, "FHEM::SSChatBot::delClHash", $name, 0);
return;
}
@@ -1428,7 +1355,7 @@ sub _parseChannels {
# Ausgabe Popup der User-Daten (nach readingsEndUpdate positionieren sonst
# "Connection lost, trying reconnect every 5 seconds" wenn > 102400 Zeichen)
asyncOutput ($hash->{HELPER}{CL}{1},"$out");
- InternalTimer(gettimeofday()+5.0, "FHEM::SSChatBot::delClhash", $name, 0);
+ InternalTimer(gettimeofday()+5.0, "FHEM::SSChatBot::delClHash", $name, 0);
return;
}
@@ -1649,67 +1576,6 @@ sub formString {
return ($txt);
}
-#############################################################################################
-# Clienthash übernehmen oder zusammenstellen
-# Identifikation ob über FHEMWEB ausgelöst oder nicht -> erstellen $hash->CL
-#############################################################################################
-sub getClhash {
- my ($hash,$nobgd)= @_;
- my $name = $hash->{NAME};
- my $ret;
-
- if($nobgd) {
- # nur übergebenen CL-Hash speichern,
- # keine Hintergrundverarbeitung bzw. synthetische Erstellung CL-Hash
- $hash->{HELPER}{CL}{1} = $hash->{CL};
- return;
- }
-
- if (!defined($hash->{CL})) { # Clienthash wurde nicht übergeben und wird erstellt (FHEMWEB Instanzen mit canAsyncOutput=1 analysiert)
- my @webdvs = devspec2array("TYPE=FHEMWEB:FILTER=canAsyncOutput=1:FILTER=STATE=Connected");
- my $i = 1;
- for my $outdev (@webdvs) {
- next if(!$defs{$outdev});
- $hash->{HELPER}{CL}{$i}->{NAME} = $defs{$outdev}{NAME};
- $hash->{HELPER}{CL}{$i}->{NR} = $defs{$outdev}{NR};
- $hash->{HELPER}{CL}{$i}->{COMP} = 1;
- $i++;
- }
- }
- else { # übergebenen CL-Hash in Helper eintragen
- $hash->{HELPER}{CL}{1} = $hash->{CL};
- }
-
- # Clienthash auflösen zur Fehlersuche (aufrufende FHEMWEB Instanz
- if (defined($hash->{HELPER}{CL}{1})) {
- for (my $k=1; (defined($hash->{HELPER}{CL}{$k})); $k++ ) {
- Log3($name, 4, "$name - Clienthash number: $k");
- while (my ($key,$val) = each(%{$hash->{HELPER}{CL}{$k}})) {
- $val = $val?$val:" ";
- Log3($name, 4, "$name - Clienthash: $key -> $val");
- }
- }
- }
- else {
- Log3($name, 2, "$name - Clienthash was neither delivered nor created !");
- $ret = "Clienthash was neither delivered nor created. Can't use asynchronous output for function.";
- }
-
-return ($ret);
-}
-
-#############################################################################################
-# Clienthash löschen
-#############################################################################################
-sub delClhash {
- my $name = shift;
- my $hash = $defs{$name};
-
- delete($hash->{HELPER}{CL});
-
-return;
-}
-
####################################################################################
# Ausgabe der SVG-Funktion "plotAsPng" in eine Datei schreiben
# Die Datei wird im Verzeichnis "/opt/fhem/www/images" erstellt
@@ -2277,45 +2143,6 @@ sub ___botCGIorder {
return ($cr, $state);
}
-#############################################################################################
-# Versionierungen des Moduls setzen
-# Die Verwendung von Meta.pm und Packages wird berücksichtigt
-#############################################################################################
-sub setVersionInfo {
- my $hash = shift;
- my $notes = shift;
-
- my $v = (sortVersion("desc",keys %{$notes}))[0];
- my $type = $hash->{TYPE};
- $hash->{HELPER}{PACKAGE} = __PACKAGE__;
- $hash->{HELPER}{VERSION} = $v;
-
- $hash->{HELPER}{VERSION_API} = $vAPI // "unused";
- $hash->{HELPER}{VERSION_SMUtils} = $vSMUtils // "unused";
- $hash->{HELPER}{VERSION_ErrCodes} = $vErrCodes // "unused";
-
- if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) { # META-Daten sind vorhanden
- $modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{}{META}}
-
- if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id$ im Kopf komplett! vorhanden )
- $modules{$type}{META}{x_version} =~ s/1\.1\.1/$v/gx;
- }
- else {
- $modules{$type}{META}{x_version} = $v;
- }
- return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id$ im Kopf komplett! vorhanden )
-
- if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) { # es wird mit Packages gearbeitet -> mit {->VERSION()} im FHEMWEB kann Modulversion abgefragt werden
- use version 0.77; our $VERSION = FHEM::Meta::Get($hash, 'version'); ## no critic 'VERSION'
- }
- }
- else { # herkömmliche Modulstruktur
- $hash->{VERSION} = $v;
- }
-
-return;
-}
-
1;
=pod
@@ -2445,10 +2272,19 @@ return;
set <Name> asyncSendItem text="https://www.synology.com" [users="<User>"]
set <Name> asyncSendItem text="Check this! <https://www.synology.com|Click here> for details!" [users="<User1>,<User2>"]
set <name> asyncSendItem text="a funny picture" fileUrl="http://imgur.com/xxxxx" [users="<User1>,<User2>"]
- set <Name> asyncSendItem text="current plot file" svg="<SVG-Device>[,<Zoom>][,<Offset>]" [users="<User1>,<User2>"]
set <Name> asyncSendItem text="<Message text>" attachments="[{
"callback_id": "<Text for Reading recCallbackId>", "text": "<Heading of the button>",
- "actions":[{"type": "button", "name": "<text>", "value": "<value>", "text": "<text>", "style": "<color>"}] }]"
+ "actions":[{"type": "button", "name": "<text>", "value": "<value>", "text": "<text>", "style": "<color>"}] }]"
+
+
+
+ Plot outputs from SVG devices can be sent directly:
+
+
+ set <Name> asyncSendItem text="current plot file" svg="<SVG-Device>[,<Zoom>][,<Offset>]" [users="<User1>,<User2>"]
+
+
+ Further information is available in the Wiki.
@@ -2770,13 +2606,21 @@ return;
set <Name> asyncSendItem text="https://www.synology.com" [users="<User>"]
set <Name> asyncSendItem text="Überprüfen Sie dies!! <https://www.synology.com|Click hier> für Einzelheiten!" [users="<User1>,<User2>"]
set <Name> asyncSendItem text="ein lustiges Bild" fileUrl="http://imgur.com/xxxxx" [users="<User1>,<User2>"]
- set <Name> asyncSendItem text="aktuelles Plotfile" svg="<SVG-Device>[,<Zoom>][,<Offset>]" [users="<User1>,<User2>"]
set <Name> asyncSendItem text="<Mitteilungstext>" attachments="[{
"callback_id": "<Text für Reading recCallbackId>", "text": "<Überschrift des Buttons>",
"actions":[{"type": "button", "name": "<Text>", "value": "<Wert>", "text": "<Text>", "style": "<Farbe>"}] }]"
-
+
+
+ Es können Plotausgaben von SVG-Devices direkt versendet werden:
+
+
+ set <Name> asyncSendItem text="aktuelles Plotfile" svg="<SVG-Device>[,<Zoom>][,<Offset>]" [users="<User1>,<User2>"]
+
+
+ Weitere Informationen dazu sind im Wiki ausgeführt.
+