[gelöst] Fritzbox Log auswerten und für ausgewählten Eintrag MSG schicken

Begonnen von RalfRog, 20 März 2023, 15:43:59

Vorheriges Thema - Nächstes Thema

RalfRog

Edit 26.03.2023: auf Basis dieses Beitrags  ist ein Codeschnipsel https://forum.fhem.de/index.php?topic=132856.0 entstanden.

Vorbemerkung
Ich hatte mir bisher mit Hilfe der wöchentlichen Statusmail beim Inhalt "Anmeldung gescheitert" per Mailregel eine Desktopbenachrichtgung aufpoppen lassen.
Die Mail bzw. Loginfo darin dann zu suchen ist eher lästig und hat auch bis zu eine Woche Verzögerung.

Aufgrund der erweiterten Möglichkeiten mit dem Modul 72_FRITZBOX.pm und den Kommandos "get fritzbox luaData" oder "get fritzbox luaquery" kann man den Inhalt des Logfiles erhalten (siehe 2. Code-Abschnitt) und kann den String auf das Vorhandensein eines bestimmen Textes prüfen. Das funktioniert soweit ist aber aus meiner Sicht sehr umständlich wenn mehrere Dinge wie Meldung und zusätzlich Datum gefunden werden sollen.

Mein erster Wurf war:
my $loginfo = fhem("get Fritzbox luaQuery logger:status/log_separate/list(zeit,meldung)",1);
   $loginfo =~/Anmeldung des Benutzers (.*) an der.*IP-Adresse (.*) gescheitert.*falsches Kennwort/;
   fhem("msg push -1 IntruderCheck letzter Eintrag: $1 - $2",1);

Idee

Daten, Beispiel:
Result of data = 'xhr' => '1'
'lang' => 'de'
'page' => 'log'
'xhrId' => 'log'
'filter' => 'sys'
'useajax' => '1'
'no_sidrenew' => ''

----------------------------------------------------------------------
$VAR1 = {
          'data' => {
                      'wlan' => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' ),
                      'log' => [
                                 {
                                   'msg' => "Anmeldung an der FRITZ!Box-Benutzeroberfl\x{c3}\x{a4}che von IP-Adresse 2001:1111:2222::1111:2222:3333:4444.",
                                   'nohelp' => 0,
                                   'group' => 'sys',
                                   'date' => '18.03.23',
                                   'helplink' => '/help/help.lua?sid=a904ec8b9477e735&helppage=hilfe_syslog_500.html',
                                   'time' => '12:43:42',
                                   'id' => 500
                                 },
                                 {
                                   'group' => 'sys',
                                   'nohelp' => 0,
                                   'msg' => "MyFRITZ! Fehler: Der MyFRITZ!-Name wurde erfolgreich aktualisiert, anschlie\x{c3}\x{9f}end trat jedoch ein Fehler bei der DNS-Aufl\x{c3}\x{b6}sung auf.",
                                   'helplink' => '/help/help.lua?sid=a904ec8b9477e735&helppage=hilfe_syslog_535.html',
                                   'date' => '18.03.23',
                                   'time' => '11:45:32',
                                   'id' => 535
                                 },
                                 {
                                   'group' => 'sys',
                                   'nohelp' => 0,
                                   'msg' => 'Verbindung zum Online-Speicher hergestellt.',
                                   'helplink' => '/help/help.lua?sid=a904ec8b9477e735&helppage=hilfe_syslog_3330.html',
                                   'date' => '18.03.23',
                                   'time' => '11:44:00',
                                   'id' => 3330
                                 },
                                 {
                                   'msg' => 'Verbindung zum Online-Speicher beendet.',
                                   'group' => 'sys',
                                   'nohelp' => 0,
                                   'helplink' => '/help/help.lua?sid=a904ec8b9477e735&helppage=hilfe_syslog_3331.html',
                                   'date' => '18.03.23',
                                   'time' => '11:39:11',
                                   'id' => 3331
                                 }
                               ],
                      'filter' => 'sys',
                      'wlanGuestPushmail' => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' ),
                      'show' => {
                                  'usb' => $VAR1->{'data'}{'wlanGuestPushmail'},
                                  'fon' => $VAR1->{'data'}{'wlanGuestPushmail'},
                                  'wlan' => {
                                              'has_wpa3_support' => $VAR1->{'data'}{'wlan'},
                                              'has_wpa2_support' => $VAR1->{'data'}{'wlanGuestPushmail'}
                                            },
                                  'sys' => $VAR1->{'data'}{'wlanGuestPushmail'},
                                  'net' => $VAR1->{'data'}{'wlanGuestPushmail'},
                                  'all' => $VAR1->{'data'}{'wlanGuestPushmail'}
                                }
                    },
          'timeTillLogout' => '1184',
          'time' => [],
          'hide' => {
                      'provServ' => $VAR1->{'data'}{'wlanGuestPushmail'},
                      'rrd' => $VAR1->{'data'}{'wlanGuestPushmail'},
                      'dectRdio' => $VAR1->{'data'}{'wlanGuestPushmail'},
                      'liveTv' => $VAR1->{'data'}{'wlanGuestPushmail'},
                      'mobile' => $VAR1->{'data'}{'wlanGuestPushmail'},
                      'ssoSet' => $VAR1->{'data'}{'wlanGuestPushmail'},
                      'liveImg' => $VAR1->{'data'}{'wlanGuestPushmail'},
                      'rss' => $VAR1->{'data'}{'wlanGuestPushmail'},
                      'dectMail' => $VAR1->{'data'}{'wlanGuestPushmail'}
                    },
          'pid' => 'log',
          'sid' => 'a904ec8b9477e735'
        };

Die Idee war darin den Teil "log[...{viele},{Daten}...]," in einem  Array von Hashes zu speichern um leicht auf die Inhalte wie "time" oder "date" der einzelnen Logeinträge zugreifen zu können (nachdem ich als Perlnovize erstmal versucht habe Scalare, Arrays, Hashes Zugriff und Referenzen ansatzweise zu verstehen).

Viel Zeit habe ich gebraucht um tatsächlich ein Array von Hashes zu erhalten. Zunächst haben alle Versuche neben den vielen Fehlern zu einem Array von Strings geführt. Damit kommt man nicht einzeln an die Werte wie "time" oder "date" etc.. Letzlich führte die Funktion "eval" zu Ziel.

... und die Lösung

Sub in "99_myUtils.pm"  ToDo ==> es fehlt noch "log3" zu nutzen und die Variable $name zu übergeben

Das funktioniert! Meine Frage: ist der Code ok oder Murks?
sub Intruder {
    my $logref; # später die Array-Referenz für das komplette LOG
    my $idx;    # index Zähler um String schneiden
    my $resp;   # für Zwischenwerte und Return
    my $resp1;  # für Zwischenwerte und Return
    my $resp2;  # für Zwischenwerte und Return
    my $loginfo = fhem("get fritzbox luaData xhr 1 lang de page log xhrId log filter sys useajax 1 no_sidrenew nop",1);

# Anfang bis 'log' => [ abschneiden
    $idx = index($loginfo,"'log' => [");
    $loginfo = substr($loginfo,$idx+8);

# keine Ahnung ob es nützt viel Text aus dem String zu löschen, oder kontraproduktiv da zu viel Rechenzeit
    $loginfo =~ s/'helplink' =>.*?html',?//sg;  # Zeilen mit helplink "löschen" durch ersetzen mit nichts

# Vorsicht!! da mir unklar ist ob das "\x{c3}\x{a4}" später Probleme im String verursacht
    $loginfo =~ s/\\x\{c3\}\\x\{a4\}/ae/sg;     # alle Zeilen mit ä => \x{c3}\x{a4} durch ae ersetzen
    $loginfo =~ s/\\x\{c3\}\\x\{9f\}/ss/sg;     # alle Zeilen mit ß => \x{c3}\x{9f} durch ss ersetzen
    $loginfo =~ s/\\x\{c3\}\\x\{b6\}/oe/sg;     # alle Zeilen mit ö => \x{c3}\x{b6} durch oe ersetzen
    $loginfo =~ s/\\x\{c3\}\\x\{bc\}/ue/sg;     # alle Zeilen mit ü => \x{c3}\x{bc} durch ue ersetzen
    $loginfo =~ s/\\x\{c3\}\\x\{84\}/Ae/sg;     # alle Zeilen mit Ä => \x{c3}\x{84} durch Ae ersetzen

# Ende nach Logeinträgen abschneiden
    $idx = index($loginfo,"],");
    $loginfo = substr($loginfo,0,$idx+1);

# Array aus Hashes bilden
    $logref = eval $loginfo; # hier entsteht die Referenz auf das Array
    $idx = @{$logref};       # Anzahl der Elemente: @-> dereferenziert das Array
    Log 3,"Log:System enthält $idx Eintraege";

############################
######## Ab hier Auswertung auf bestimmte Einträge
### Variablendef für die Auswerung
my $lst_intrud_tim = ReadingsVal("FritzIntruder","LastIntruderTime","");

    foreach $resp (@{$logref}) {
# Debug $resp -> {id};
            if ($resp -> {id} == 505) {           # 505 User und falsches Kennwort
                $resp1 = ($resp -> {date}."_".$resp -> {time});
# Debug $lst_intrud_tim;
# Debug $resp1;
                if ($lst_intrud_tim ne $resp1) {  # wenn die Zeit ungleich dann Daten schreiben und Schluss
                    $resp2 = ($resp -> {msg});
                    fhem("setreading FritzIntruder LastIntruderTime $resp1",1);
                    fhem("setreading FritzIntruder LastIntruder $resp2",1);
                    fhem("msg push -1 IntruderCheck letzter Eintrag: $resp2",1);
                    Log 3,"Log:System    Zeit: $resp1";
                    Log 3,"Log:System Meldung: $resp2";
                    return;                    } 

                else {                            # dann war die Zeit gleich, nix in Readings schreiben und auch Schluss
                    Log 3,"Log:System identische Zeit/Meldung, kein Update der Readings";                     
                    return;}

                Log 3,"Log:System kein User-Anmeldeversuch mit falschem Passwort";                   }       


            else {}                               # Prüfung auf andere ID weitere Tests dann aber mit elsif

                               }

return;
# return $idx;

   }

Problem

Im Log sehe ich ab und zu Errors 2/3 der Aufrufe laufen durch 1/3 bringt den Fehler.

2023.03.20 03:59:10.678 3: Log:System enthält 1588 Eintraege
2023.03.20 03:59:10.680 3: Log:System identische Zeit/Meldung, kein Update der Readings
2023.03.20 04:59:10.702 3: Log:System enthält 1588 Eintraege
2023.03.20 04:59:10.703 3: Log:System identische Zeit/Meldung, kein Update der Readings
2023.03.20 05:59:10.405 1: ERROR evaluating my $SELF=   $evalSpecials->{'%SELF'};{Intruder}: Can't use an undefined value as an ARRAY reference at ./FHEM/99_myUtils.pm line 86.

2023.03.20 05:59:10.407 3: FritzIntruder: Can't use an undefined value as an ARRAY reference at ./FHEM/99_myUtils.pm line 86.

2023.03.20 06:59:10.983 3: Log:System enthält 1588 Eintraege
2023.03.20 06:59:10.985 3: Log:System identische Zeit/Meldung, kein Update der Readings
2023.03.20 07:59:10.766 3: Log:System enthält 1588 Eintraege
2023.03.20 07:59:10.768 3: Log:System identische Zeit/Meldung, kein Update der Readings
2023.03.20 08:56:49.266 1: ERROR evaluating my $SELF=   $evalSpecials->{'%SELF'};{Intruder}: Can't use an undefined value as an ARRAY reference at ./FHEM/99_myUtils.pm line 86.

2023.03.20 08:56:49.267 3: FritzIntruder: Can't use an undefined value as an ARRAY reference at ./FHEM/99_myUtils.pm line 86.

Line 86 ist:
$idx = @{$logref};      # Anzahl der Elemente: @-> dereferenziert das Array
Aber was ist der undef. Wert für die ARRAY reference? $logref? Warum nur manchmal?


Wer kann was zum Code und zum Eroor sagen?

Gruß und Dank Ralf

FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

JoWiemann

Hallo Ralf,

am einfachsten ist es wohl ich baue in das get einen Parameter ein, der Dir das Ergebnis als hash zurück gibt. Dann ist es einfacher weiter zu verarbeiten.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

RalfRog

#2
Da hast du wohl recht...  ;D  wäre super!

Ich war von ein paar Wochen schon mal in deinem Support-Thread auf dem Trip und hatte da irgendwas von JSON geschrieben...
Das was der Startpunkt für meine erste Versuche/Variante... :))

Wenn wir hier gerade bei Erweiterung für LOG sind: man kann im Logging ein/ausschalten, dass erweiterte man WLAN Info loggen will bzw. wählen ob man alles oder Teile sehen will.
Lt. Browser Tools gibts:
Zitatget <name> luaData:
xhr 1 filter wlan wlan off lang de page log                                                  -> off oder on erweitertes  WLAN-Logging
xhr 1 lang de page log xhrId log filter all useajax 1 no_sidrenew nop      -> Log-Einträge Alle
xhr 1 lang de page log xhrId log filter sys useajax 1 no_sidrenew nop      -> Log-Einträge System
xhr 1 lang de page log xhrId log filter wlan useajax 1 no_sidrenew nop   -> Log-Einträge WLAN
xhr 1 lang de page log xhrId log filter usb useajax 1 no_sidrenew nop    -> Log-Einträge USB
xhr 1 lang de page log xhrId log filter net useajax 1 no_sidrenew nop    -> Log-Einträge Internetverbindung
xhr 1 lang de page log xhrId log filter fon useajax 1 no_sidrenew nop    -> Log-Einträge USB

Ich glaube per luaData kommen die besseren Logdaten als mit  luaQuery (logger:status/log_separate/list(time,msg,ref,type)
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

JoWiemann

Zitat von: RalfRog am 20 März 2023, 17:36:47Wenn wir hier gerade bei Erweiterung für LOG sind: man kann im Logging ein/ausschalten, dass erweiterte man WLAN Info loggen will bzw. wählen ob man alles oder Teile sehen will.
Lt. Browser Tools gibts:
Zitatget <name> luaData:
xhr 1 filter wlan wlan off lang de page log                                                  -> off oder on erweitertes  WLAN-Logging
xhr 1 lang de page log xhrId log filter all useajax 1 no_sidrenew nop      -> Log-Einträge Alle
xhr 1 lang de page log xhrId log filter sys useajax 1 no_sidrenew nop      -> Log-Einträge System
xhr 1 lang de page log xhrId log filter wlan useajax 1 no_sidrenew nop   -> Log-Einträge WLAN
xhr 1 lang de page log xhrId log filter usb useajax 1 no_sidrenew nop    -> Log-Einträge USB
xhr 1 lang de page log xhrId log filter net useajax 1 no_sidrenew nop    -> Log-Einträge Internetverbindung
xhr 1 lang de page log xhrId log filter fon useajax 1 no_sidrenew nop    -> Log-Einträge USB


Vorschlag:

get <fritzbox> fritzLog <hash | table> <auswahlliste>

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

RalfRog

Zitat von: JoWiemann am 20 März 2023, 21:18:38Vorschlag:
get <fritzbox> fritzLog <hash | table> <auswahlliste>

Sieht sehr praktikabel aus. Bin gespannt  ;D
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

JoWiemann

#5
Hallo Ralf,

anbei eine erste Beta (07.50.10 Beta). Ich habe das Ganze non Blocking implementiert. Für Deine eigene Verarbeitung ist eine Sub in der 99_myUtils.pm vorgesehen:

sub myUtilsFritzLogExPost($$$) {
  my ($hash, $filter, $result) = @_;

  if(defined $result->{Error}) {
    FRITZBOX_Log $hash, 2, "ERROR: fritzLogInfo: " . $result->{Error};
    return $result->{Error};
  }

  FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: \n" . Dumper $result;

  if ($filter eq "all") {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: all";

  } elsif ($filter eq "sys") {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: sys";

  } elsif ($filter eq "wlan") {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: wlan";

  } elsif ($filter eq "usb") {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: usb";

  } elsif ($filter eq "net") {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: net";

  } elsif ($filter eq "fon") {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: fon";

  } else {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: wrong filter";

  }

  return "done";

}

Mit dem Aufruf:
get <fritzbox> fritzLog hash <all | sys | wlan | usb | net | fon> wird eine data.lua Abfrage durchgeführt und das Ergebnis an die Sub myUtilsFritzLogExPost übergeben.

get <fritzbox> fritzLog table <all | sys | wlan | usb | net | fon> habe ich noch nicht implementiert.

Mit:
set <fritzbox> wlanLogExtended <on | off> kannst Du "Auch An- und Abmeldungen und erweiterte WLAN-Informationen protokollieren" steuern.

Da non Blocking erfolgt die Rückmeldung in den Readings:
fritzLogExPost = Status des Funktionsaufrufes myUtilsFritzLogExPost<br>
fritzLogInfo = Status der Log Informations Abfrage.

Die aktuelle Einstellung wird im Reading wlanLogEx hinterlegt.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

RalfRog

#6
Reaktion kommt. Komme erst heut Abend dazu.
Super dein Codevorschlag... könnte aber vielleicht ne Frage verursachen  ::)


Öhhhh... war nicht gerade noch der Download da oder habe ich falsch geguckt?
Finde ihn nicht.

Wieder da  ;) HAst wohl gerade das Update auf 10a gemacht.
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

RalfRog

#7
Ein erster Test  ;D

"Shutdown restart" bei disable = 1 der drei Devices  (VERSION 07.50.10a Beta)

Im FHEM Log eine Warning beim Hochlauf:
2023.03.21 17:44:00.375 1: PERL WARNING: "my" variable @webCmdArray masks earlier declaration in same scope at ./FHEM/72_FRITZBOX.pm line 3430, <$fh> line 59.

Nachdem Masterbox disable = 0 kommt eine weitere Warning
2023.03.21 17:46:21.051 3: FRITZBOX!0000 [fritzbox: API_Check_Run.1579] - INFO: Created m3u file './www/images/fritzbox.m3u'.
2023.03.21 17:46:33.319 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/72_FRITZBOX.pm line 2607.


Thema Logfunktion:
Aufruf get <name> fritzLog hash fon  => sieht gut aus, Info FHEM-Log ok. Beide Readings = done

Frage ins Blaue: wenn ich im Log die Rückgabewerte anschaue müsste der Zugriff auf die Daten so möglich sein:
Edit $hash{data}{log}[array-index 0 bis n]{msg} oder -> geht nicht
$result -> {data} -> {log} -> [array-index 0 bis n] -> {msg}  -> aber so, mal als Test per Debug auf index 4 ausgegeben.

Habe ich jetzt noch nicht eingebaut

Außerdem mal ins Unreine gesprochen:
  • mit der vorgegebenen Sub myUtilsFritzLogExPost kann man im Prinzip umgehen und direkt im AT oder Ähnlichem das get benutzen
  • wäre es andererseits sinnvoller ein get <name> fritzLog hash fon in der eigenen Sub (beliebiger eigener Name) aufzurufen um dann innerhalb der Sub den hash zurückgegeben zu bekommen. Dann ist man unabhängig vom vorgegebenen Namen.
    Bedeutet natürlich, dass das Ergebnis im Nirwana landet wenn man das get auf der Oberfläche aufruft


So ich muss nachher nochmal ein bischen weiterspielen  ;)

Jo, SUUUUPER vielen Dank!



FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

JoWiemann

Zitat von: RalfRog am 21 März 2023, 18:24:02wäre es andererseits sinnvoller ein get <name> fritzLog hash fon in der eigenen Sub (beliebiger eigener Name) aufzurufen um dann innerhalb der Sub den hash zurückgegeben zu bekommen. Dann ist man unabhängig vom vorgegebenen Namen.
Bedeutet natürlich, dass das Ergebnis im Nirwana landet wenn man das get auf der Oberfläche aufruft[/li][/list]

Dann musst Du Dich selber um das non Blocking kümmern. Bei non Blocking läuft ja die Abarbeitung asynchron zu den anderen Fhem Prozessen. Das Ergebnis muss ja dann irgendwo hin, wo es weiter verarbeitet werden kann. Die vorgegeben Sub wird im Moment einfach als Abzweig für die eigene Verarbeitung genutzt und zwar noch in der asynchronen Abarbeitung. Erst nach der Rückkehr wird der non Blocking Prozess ordnungsgemäß beendet.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

JoWiemann

#9
Zitat von: RalfRog am 21 März 2023, 18:24:02Ein erster Test  ;D

"Shutdown restart" bei disable = 1 der drei Devices  (VERSION 07.50.10a Beta)

Im FHEM Log eine Warning beim Hochlauf:
2023.03.21 17:44:00.375 1: PERL WARNING: "my" variable @webCmdArray masks earlier declaration in same scope at ./FHEM/72_FRITZBOX.pm line 3430, <$fh> line 59.

Nachdem Masterbox disable = 0 kommt eine weitere Warning
2023.03.21 17:46:21.051 3: FRITZBOX!0000 [fritzbox: API_Check_Run.1579] - INFO: Created m3u file './www/images/fritzbox.m3u'.
2023.03.21 17:46:33.319 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/72_FRITZBOX.pm line 2607.


Anbei eine neue Beta, wo Deine Findings behoben sind. Außerdem habe ich das Attribut fritzBoxIP wieder auf "auslaufend" gesetzt und einen entsprechenden Test beim Define auf gültigen DSN Namen eingebaut. Sofern das Attribut gesetzt ist erfolgt ein Hinweis las Internal INFO3.

Das get <fritzbox> fritzLog table ... ist jetzt auch hinterlegt.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

RalfRog

Zitat von: JoWiemann am 21 März 2023, 19:43:51Dann musst Du Dich selber um das non Blocking kümmern. Bei non Blocking läuft ja die Abarbeitung asynchron zu den anderen Fhem Prozessen. Das Ergebnis muss ja dann irgendwo hin, wo es weiter verarbeitet werden kann. Die vorgegeben Sub wird im Moment einfach als Abzweig für die eigene Verarbeitung genutzt und zwar noch in der asynchronen Abarbeitung. Erst nach der Rückkehr wird der non Blocking Prozess ordnungsgemäß beendet.

Grüße Jörg

Da überwiegen wohl die Vorteile deutlich. Mir wären diese Feinheiten nicht wirklich klar - und das geht vermitlich vielen so.

Im Text zum GET ist ja deutlich genannt wir die Funktion heisst die aufgerufen wird.

Allerdings denke ich, dass dein Code-Teil auf jeden Fall was für das Wiki wäre.
Als Ungeübter scheitert man vermutlich sonst daran was man denn so in die SUB reinschreiben muss.
Ich hatte da jetzt hier im thread einen unsagbaren Vorteil. ;) Ich würde sonst definitv daran scheitern - einfach weil das Wissen/Erfahrung fehlt.

Schönen Abend
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

JoWiemann

Zitat von: RalfRog am 21 März 2023, 21:44:24Da überwiegen wohl die Vorteile deutlich. Mir wären diese Feinheiten nicht wirklich klar - und das geht vermitlich vielen so.

Im Text zum GET ist ja deutlich genannt wir die Funktion heisst die aufgerufen wird.

Allerdings denke ich, dass dein Code-Teil auf jeden Fall was für das Wiki wäre.
Als Ungeübter scheitert man vermutlich sonst daran was man denn so in die SUB reinschreiben muss.
Ich hatte da jetzt hier im thread einen unsagbaren Vorteil. ;) Ich würde sonst definitv daran scheitern - einfach weil das Wissen/Erfahrung fehlt.

Schönen Abend

Hallo Ralf,

ja, Wiki ist auch noch so ein offenes ToDo. Würde beim nächsten Einchecken dann das Wiki mal pflegen und auch den Beispiel Code hinterlegen.

Hoffe jetzt erst einmal, dass Du Deine Use Cases damit abbilden kannst.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

RalfRog

Jo ja echt genial

Die tolle Arbeit der vielen letzten Wochen war für mich fast nur nice to see or have.
Meine bisherige Automation war nächtlich ein Teil der WLANs an-/abzuschalten und in der FTUI Oberfläche einen Button um das Gast-WLAN zu aktivieren.

Ein paar interessante (besser ausgewählte) Daten zeitnah per Push-Meldung aus dem Fritz-Log zu erhalten ist für mich echter Mehrwert!!!

Gruß Ralf
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

RalfRog

#13
Tests mit VERSION  07.50.10c Beta

  • Ausführen shutdown restart mit MasterBox disable = 0 (also aktiv)
2023.03.21 22:22:27.494 0: Server shutdown
2023.03.21 22:22:33 1: PERL WARNING: Useless use of a constant (2) in void context at ./FHEM/99_myUtils.pm line 27.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of concatenation (.) or string in void context at ./FHEM/99_myUtils.pm line 27.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant (3) in void context at ./FHEM/99_myUtils.pm line 32.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of concatenation (.) or string in void context at ./FHEM/99_myUtils.pm line 32.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant (3) in void context at ./FHEM/99_myUtils.pm line 37.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant ("INFO: fritzLogInfo: all") in void context at ./FHEM/99_myUtils.pm line 37.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant (3) in void context at ./FHEM/99_myUtils.pm line 40.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant ("INFO: fritzLogInfo: sys") in void context at ./FHEM/99_myUtils.pm line 40.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant (3) in void context at ./FHEM/99_myUtils.pm line 43.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant ("INFO: fritzLogInfo: wlan") in void context at ./FHEM/99_myUtils.pm line 43.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant (3) in void context at ./FHEM/99_myUtils.pm line 46.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant ("INFO: fritzLogInfo: usb") in void context at ./FHEM/99_myUtils.pm line 46.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant (3) in void context at ./FHEM/99_myUtils.pm line 49.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant ("INFO: fritzLogInfo: net") in void context at ./FHEM/99_myUtils.pm line 49.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant (3) in void context at ./FHEM/99_myUtils.pm line 52.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant ("INFO: fritzLogInfo: fon") in void context at ./FHEM/99_myUtils.pm line 52.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant (3) in void context at ./FHEM/99_myUtils.pm line 55.
2023.03.21 22:22:34 1: PERL WARNING: Useless use of a constant ("INFO: fritzLogInfo: wrong filter") in void context at ./FHEM/99_myUtils.pm line 55.
2023.03.21 22:22:34.699 1: Including fhem.cfg
=> es werden praktisch alle Zeilen mit FRITZBOX_Log ausgespuckt
=> keine weiteren Medungen beim restlichen Hochlauf


  • Hinweistext in "get <name> fritzLog" Ü falsch codiert
    => R�ckmeldung in den Readings


  • Ausführen get <name> fritzLog table fon
    => Tabelle ist da (fon schön kurz) mit einer Warning
2023.03.21 22:28:17.158 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/72_FRITZBOX.pm line 5329.=> Nachfolgender Aufruf mit Parameter Sys (oder nochmals Fon) ist ohne weitere Warning


Um die Tabelle durch zu nummerieren nutzt du die Überschrift ID. Das ist gleichzeitig auch der key (Feld-Name) der Fehlernummer.
Wenn man einen bestimmten Fehler sucht nimmt man am besten die {'id'} als Suchkriterium.
Könnte man eventuell in der Tabelle falsch interpretieren.
=> Vorschlag: "blöd jetzt fällt mir nix Gescheites ein"


  • Aufruf get <name> fritzLog hash fon   => Error:
2023.03.21 22:41:54.642 3: FRITZBOX!7590 [fritzbox: Run_fritzloginfo.3481] - DEBUG: fritzlog -> fritzloginfo, hash, fon
2023.03.21 22:41:54.648 3: FRITZBOX!7590 [fritzbox: Run_fritzloginfo.3491] - DEBUG: data.lua:
xhr 1 lang de page log xhrId log filter fon useajax 1 no_sidrenew
2023.03.21 22:41:55.407 2: FRITZBOX!7590 [fritzbox: Run_fritzloginfo.3505] - ERROR: fritzLogExPost: Can't locate object method "FRITZBOX_Log" via package "fritzbox" (perhaps you forgot to load "fritzbox"?) at ./FHEM/99_myUtils.pm line 32.
=> wiederholt sich bei mehrfachem aufruf
=> Aaaaber wenn man die 99_myUtils.pm mit EditFiles aufruft und einfach wieder speichert funktioniert es danach
=> habe mal den Devicenamen geändert auf fritzzbox. (shutdown reboot). Der Fehler bleibt in der Meldung steht dann hier der neue Name via package "fritzzbox" (perhaps you forgot to load "fritzzbox"?)


Das kann ich nicht einordnen.
-> Wenn ich etwas anders mach soll lass es mich wissen.
Zumal ich beim neuerlichen Gegentest durch zurückspielen der 10aBeta im Gegensatz zum esten Versuch um 18.30 Uhr nun ähnliche Fehler wie jetzt bei der 10cBeta habe.

Zur Sicherheit hier mal die komplette 99_myUtils.pm habe aber nicht bewusst etwas geändert
##############################################
# $Id: myUtilsTemplate.pm 21509 2020-03-25 11:20:51Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;
use Blocking;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.


sub myUtilsFritzLogExPost($$$) {
  my ($hash, $filter, $result) = @_;

  if(defined $result->{Error}) {
    FRITZBOX_Log $hash, 2, "ERROR: fritzLogInfo: " . $result->{Error};
    return $result->{Error};
  }

  FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: \n" . Dumper $result;



  if ($filter eq "all") {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: all";

  } elsif ($filter eq "sys") {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: sys";

  } elsif ($filter eq "wlan") {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: wlan";

  } elsif ($filter eq "usb") {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: usb";

  } elsif ($filter eq "net") {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: net";

  } elsif ($filter eq "fon") {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: fon";

  } else {
    FRITZBOX_Log $hash, 3, "INFO: fritzLogInfo: wrong filter";

  }



my $tstvar2 = $result -> {data} -> {log} -> [4] -> {msg};
Debug $tstvar2;


  return "done";

}


##### Zeile 55
#  log noch auf log3 anpassen, Variable $name nötig
#  Log auf Anmeldeversuche prüfen und TelegramNachricht schicken
sub Intruder {
    my $logref; # später die Array-Referenz für das komplette LOG
    my $idx;    # index Zähler um String schneiden
    my $resp;   # für Zwischenwerte und Return
    my $resp1;  # für Zwischenwerte und Return
    my $resp2;  # für Zwischenwerte und Return
    my $loginfo = fhem("get fritzbox luaData xhr 1 lang de page log xhrId log filter sys useajax 1 no_sidrenew nop",1);

# Anfang bis 'log' => [ abschneiden
    $idx = index($loginfo,"'log' => [");
    $loginfo = substr($loginfo,$idx+8);

# keine Ahnung ob es nützt viel Text aus dem String zu löschen, oder kontraproduktiv da zu viel Rechenzeit
    $loginfo =~ s/'helplink' =>.*?html',?//sg;  # Zeilen mit helplink "löschen" durch ersetzen mit nichts

# Vorsicht!! da mir unklar ist ob das "\x{c3}\x{a4}" später Probleme im String verursacht
    $loginfo =~ s/\\x\{c3\}\\x\{a4\}/ae/sg;     # alle Zeilen mit ä => \x{c3}\x{a4} durch ae ersetzen
    $loginfo =~ s/\\x\{c3\}\\x\{9f\}/ss/sg;     # alle Zeilen mit ß => \x{c3}\x{9f} durch ss ersetzen
    $loginfo =~ s/\\x\{c3\}\\x\{b6\}/oe/sg;     # alle Zeilen mit ö => \x{c3}\x{b6} durch oe ersetzen
    $loginfo =~ s/\\x\{c3\}\\x\{bc\}/ue/sg;     # alle Zeilen mit ü => \x{c3}\x{bc} durch ue ersetzen
    $loginfo =~ s/\\x\{c3\}\\x\{84\}/Ae/sg;     # alle Zeilen mit Ä => \x{c3}\x{84} durch Ae ersetzen

# Ende nach Logeinträgen abschneiden
    $idx = index($loginfo,"],");
    $loginfo = substr($loginfo,0,$idx+1);

# Array aus Hashes bilden   # Zeile 84
    $logref = eval ($loginfo); # hier entsteht die Referenz auf das Array
foreach my $i (1..20){my $ii = 2 *$i;}   # etwas Zeit verbrauchen
    $idx = @{$logref};       # Anzahl der Elemente: @-> dereferenziert das Array
    Log 3,"Log:System enthält $idx Eintraege";

############################ Zeile 90
######## Ab hier Auswertung auf bestimmte Einträge
### Variablendef für die Auswerung
my $lst_intrud_tim = ReadingsVal("FritzIntruder","LastIntruderTime","");

    foreach $resp (@{$logref}) {
# Debug $resp -> {id};
            if ($resp -> {id} == 505) {           # 505 User und falsches Kennwort
                $resp1 = ($resp -> {date}."_".$resp -> {time});
# Debug $lst_intrud_tim;
# Debug $resp1;
                if ($lst_intrud_tim ne $resp1) {  # wenn die Zeit ungleich dann Daten schreiben und Schluss
                    $resp2 = ($resp -> {msg});
                    fhem("setreading FritzIntruder LastIntruderTime $resp1",1);
                    fhem("setreading FritzIntruder LastIntruder $resp2",1);
                    fhem("msg push -1 IntruderCheck letzter Eintrag: $resp2",1);
                    Log 3,"Log:System    Zeit: $resp1";
                    Log 3,"Log:System Meldung: $resp2";
                    return;                    } 

                else {                            # dann war die Zeit gleich, nix in Readings schreiben und auch Schluss
                    Log 3,"Log:System identische Zeit/Meldung, kein Update der Readings";                     
                    return;}

                Log 3,"Log:System kein User-Anmeldeversuch mit falschem Passwort";                   }       


            else {}                               # Prüfung auf andere ID weitere Tests dann aber mit elsif

                               }

return;
# return $idx;

   }

#############
1;


FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

JoWiemann

#14
Hallo Ralf,

das FRITZBOX_Log ist in der 99_myUtils.pm falsch. Bitte in Log3 abändern. War ein copy/paste Fehler.
FRITZBOX_Log ist ein Sub in 72_FRITZBOX.pm und nicht immer in der 99_myUtils bekannt.

Außerdem hatte ich nicht den $hash übergeben. Ist jetzt geändert.

sub myUtilsFritzLogExPost($$$) {
  my ($hash, $filter, $result) = @_;

  my $name = $hash->{NAME};

  if(defined $result->{Error}) {
    Log3 $name, 2, "ERROR: fritzLogInfo: " . $result->{Error};
    return $result->{Error};
  }

  Log3 $name, 3, "INFO: fritzLogInfo: \n" . Dumper $result;

  if ($filter eq "all") {
    Log3 $name, 3, "INFO: fritzLogInfo: all";

  } elsif ($filter eq "sys") {
    Log3 $name, 3, "INFO: fritzLogInfo: sys";

  } elsif ($filter eq "wlan") {
    Log3 $name, 3, "INFO: fritzLogInfo: wlan";

  } elsif ($filter eq "usb") {
    Log3 $name, 3, "INFO: fritzLogInfo: usb";

  } elsif ($filter eq "net") {
    Log3 $name, 3, "INFO: fritzLogInfo: net";

  } elsif ($filter eq "fon") {
    Log3 $name, 3, "INFO: fritzLogInfo: fon";

  } else {
    Log3 $name, 3, "INFO: fritzLogInfo: wrong filter";

  }

  return "done";
}

ID habe ich umgestellt auf id der Meldung. Der concatenation Fehler war Dummheit.

Grüße und im Anhang eine neue Beta.
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM