Moin zusammen,
habe mich die letzte Tage ausführlich mit Telegram beschäftigt und es jetzt geschaft mit QueryInline ein Menü zu erstellen, mit welchem ich Steuern und Abfragen kann. Im Bereich Status wird mit z.B. die Uptime, der BAtteriestatus etc angezeigt.
Da heute mein Log zugespamt wurde kam mir die Idee auf Anfrage per Telegram das aktuelle FHEMLogfile zuschicken zu lassen. So könnte man per einfachen klick z.B. im Urlaub feststellen ob es irgdnwelche Probleme gibt.
Ich denke das ist machbar habe aber irgendwie kein Ansatz wie ich das Zusammenbasteln kann, dass auf ein Triggerwort das Log per Telegram zugeschickt wird. Jemand eine Idee auf welchem WEge man sowas realisieren könnte? DANKE und FROHE OSTERN
[EDIT]
mit meiner Sub geht es jetzt
if ($Nachricht eq "Log")
{
fhem("set teleBot sendDocument /opt/fhem/log/fhem-2018-04.log");
}
ABER wie krieg ich es hin das der Filename relativ bleibt ?
if ($Nachricht eq "Log")
{
fhem("set teleBot sendDocument /opt/fhem/log/fhem-%Y-%m.log");
}
funktioniert leider nicht :(
Im Reading 'currentlogfile' des Moduls 'global' steht der aktuelle Pfad der Logdatei so wie du ihn brauchst...
Also solltest du es per:
my $ActLogPath = ReadingsVal("global", "currentlogfile", "n.a.");
auslesen können...
Gruß, Joachim
Zitat von: MadMax-FHEM am 02 April 2018, 13:24:45
Im Reading 'currentlogfile' des Moduls 'global' steht der aktuelle Pfad der Logdatei so wie du ihn brauchst...
Also solltest du es per:
my $ActLogPath = ReadingsVal("global", "currentlogfile", "n.a.");
auslesen können...
Gruß, Joachim
Mega, da wäre ich gar nicht drauf gekommen, allerdings weiteres "Problem"
Wie kriege ich
./log/fhem-2018-04.log
in
/opt/fhem/log/fhem-2018-04.log
.
Was davor setzen wäre kein Problem. Störend ist der
.
[edit]
Habe gerade gesehen mit
set teleBot sendDocument /opt/fhem/./log/fhem-2018-04.log
geht es auch :>
DANKE
Bitte gerne!
Dann noch auf gelöst setzen, umbenennen in beispielsweise [gelöst] Logdatei per TeleGram Bot
Viel Spaß noch, Joachim
Zitat von: MadMax-FHEM am 02 April 2018, 20:28:08
Bitte gerne!
Dann noch auf gelöst setzen, umbenennen in beispielsweise [gelöst] Logdatei per TeleGram Bot
Viel Spaß noch, Joachim
Mache ich sofort aber irgendwie kriege ich es nicht hin ?!?
Habe
sub Logdatei()
{
my $LogPath = (ReadingsVal("global","currentlogfile",0));
fhem("set teleBot sendDocument /opt/fhem/$LogPath");
}
eingerichtet.
Gebe ich {Logdatei} in di Befehlszeile ein kommt:
ZitatFAILED file :/opt/fhem/0: not found or empty
?
Hier noch ein Teil des List
Internals:
DEF no definition
NAME global
NR 1
STATE no definition
TYPE Global
currentlogfile ./log/fhem-2018-04.log
Sorry, currentlogfile ist kein Reading sondern ein Internal...
Daher statt ReadingsVal InternalVal...
Gruß, Joachim
Zitat von: MadMax-FHEM am 02 April 2018, 20:36:28
Sorry, currentlogfile ist kein Reading sondern ein Internal...
Daher statt ReadingsVal InternalVal...
Gruß, Joachim
Mega, läuft DANKE DIR
Dann is ja gut!
Sorry noch mal... ;)
Gruß, Joachim
Hallo gibt es auch die Möglichkeit den log nicht als Datei sondern als Text zu zusenden ?
(geht hier aber nicht um den log ist einer andere die nicht so groß ist)
Gruß Otto
Ja.
Mit Perl die Datei öffnen, auslesen, Inhalt versenden, schließen...
EDIT: vielleicht hilft das weiter https://forum.fhem.de/index.php/topic,79520.msg715968.html#msg715968
Gruß, Joachim
Hab´s versucht :-[
leider stimmt bei mir was nicht ?
FAILS 0
FUUID 5ce1b9ec-f33f-5642-
NAME teleBot
NR 242
OLD_POLLING 32
POLLING 32
SNAME teleBot
STATE Polling
TYPE TelegramBot
UPDATER 0
WAIT 0
me 82xxxxxx:Fhem_otto:@Fxxxxxx_1_bot
sentLastResult SUCCESS
sentMsgId
sentMsgOptions
sentMsgPeer Otto
sentMsgPeerId 824xxxxxx
sentMsgResult WAITING
sentMsgText
2020-10-23_22:20:38 Seriell UNKNOWNCODE 00110: Fre 23-Okt-20 22:16:44: ZENTRALE ZUR�CKSETZEN (FBF)
sourceVersion $Id: 50_TelegramBot.pm 23001 2020-10-21 19:33:31Z viegener $
gesendet hab ich mit :
set teleBot cmdSend ( taillog("/opt/fhem/log/Seriell.txt",10)}
und bei sendMsgText stehts ja auch drin aber warum versendet er es nicht ?
Gruß Otto
Was steht in sendMsgText?
EDIT: ok, steht oben im list.
Dein tail-Aufruf ist ein System-Shell-Aufruf.
Glaub nicht, dass der so funktioniert...
Du wirst den Inhalt verm. vorher in eine Variable schreiben müssen...
EDIT: Sorry auf dem Handy "verlesen"...
Keine Ahnung, sorry...
EDIT: was macht "taillog"? Wo(her) ist die Funktion?
Gruß, Joachim
Hallo,
ist in der 99_myUtils.pm
ub read_back($$)
{
my ($fh,$lines)=@_;
my $line_cnt=0;
my $data='';
seek($fh,0,02);
my $pos=tell($fh);
while($line_cnt < $lines and $pos > 0)
{
$pos--;
seek($fh,$pos,00);
my $bite=getc($fh);
$line_cnt++ if($bite eq $/);
}
return <$fh>;
}
sub taillog($$){
my $filename = shift or die "Usage: $0 file numlines\n";
my $numlines = shift;
open(my $fh,"<$filename") or die ("Couldn't open $filename: $!");
my @lines = read_back($fh,$numlines);
close($fh);
my $zeilen = join("\n",@lines);
return sprintf($zeilen);
}
ist von "topfi"
Gruß Otto
Ich lasse mir nur die letzten zwei Tage sowie zehn Zeilen schicken. Anemonade hatte eine viel bessere Programmierung, die finde ich gerade nicht. Also meine
###############################################################################
#
# Letzten zehn Einträge des Logfiles auslesen, damit sie gesendet werden können
# https://forum.fhem.de/index.php/topic,108574.msg1025597.html#msg1025597
#
###############################################################################
sub LogFileEintraegeSenden(){
# Datum holen
my $datum = POSIX::strftime("%Y-%m",localtime(time));
my $today_log = POSIX::strftime("%Y.%m.%d",localtime(time));
my $yesterday_log = POSIX::strftime("%Y.%m.%d",localtime(time-24*60*60));
my $nachricht = "";
my ($err, @nachrichtenliste) = FileRead({FileName => "/opt/fhem/log/fhem-$datum.log", ForceType => "file"});
if ($err) {
$nachricht = "Fehler beim Lesen der Logdatei /opt/fhem/log/fhem-$datum.log: $err";
} else {
# Eintraege mit anderem Datum entfernen
my @datatosend;
if (@nachrichtenliste > 19) {
@datatosend = @nachrichtenliste[-20..-1];
} else {
@datatosend = @nachrichtenliste;
}
foreach my $nachrichtenzeile(@datatosend){
$nachrichtenzeile =~ s/[;&><]//g; ##Semikolon entfernen, siehe https://core.telegram.org/bots/api#markdown-style
#Log3(undef, 0, "substr= ".substr($nachrichtenzeile, 0, 10))."#";
#Log3(undef, 0, "today= ".$today_log)."#";
if ((substr($nachrichtenzeile, 0, 10) eq $today_log) or (substr($nachrichtenzeile, 0, 10) eq $yesterday_log)){
$nachricht .= substr($nachrichtenzeile, 11)."\n";
}
}
}
fhem("set TelegramBot silentmsg ```".$nachricht."```");
}
Ich lasse mir das aktuelle Log schicken (bzw. rufe es ab) mitset TeleBot sendDocument {(InternalVal("Logfile","currentlogfile",""))}