FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: DL8EI Ralph am 25 Mai 2023, 14:39:56

Titel: Meldung in Reading statt ins Logbuch
Beitrag von: DL8EI Ralph am 25 Mai 2023, 14:39:56
Hallo,
wie bekommt man diese Rück-Meldung2023.05.25 08:45:06 3: atChkSMS: -1
Sende SMS 1/1....warte auf Netz-Bestätiung..OK, Nachricht-Referenz=173
Drücken Sie Strg-C, wenn Sie unterbrechen möchten...
in ein auswertbares Reading statt ins Logbuch ?
Hat jemand bitte eine Idee?
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: MadMax-FHEM am 25 Mai 2023, 14:52:48
Wenn du noch mitteilen würdest was du da überhaupt tust?
Du löst etwas per at aus?
System-Befehl/Shell-Kommando?

Dann musst du das wohl entweder im Shell-Script in ein Reading schreiben (falls es nur ein Shell-Befehl ist -> Script drumrum und dann dort in ein Reading schreiben)...
...oder den Befehl anders aufrufen und dann den Rückgabewert in ein Reading schreiben.

Aber ohne zu wissen was du (genau) tust wird es schwer zu helfen.

Steht aber alles hier: https://forum.fhem.de/index.php?topic=71806.0

Gruß, Joachim
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: Jamo am 25 Mai 2023, 20:18:55
Das sollte so gehen, für den Fall das Du gammu aus einem Shell script startest.
Hier ungetestet mal ein Bash shell Script "mySMS.sh", mit dem das gehen sollte, und das man aus fhem raus starten kann.
Die Telefonnummer und der Text wird an das bash script übergeben.
Die System message wird in die varaible $returnValue übergeben.
In ein reading bekommst Du es, mit dem echo -n . . .
 
#!/bin/bash
# exit immediately if no parameters supplied
if [ $# -lt 2 ] ; then
    echo "UNDEF, keine nummer und/oder text spezifiziert"
    echo "USAGE: ./mySMS.sh +49123456789 'test sms von gammu'"
  exit 1
fi

NUMMER=$1
TEXT=$2

# System Message in variable schreiben
$returnValue=$(gammu sendsms TEXT "$1" -text "$2")

$ variable in reading von device schreiben
echo -n "$(wget -q -O - "http://DE.IN.E.IP:PORT/fhem?cmd=setreading%20device%20reading%20$returnValue&XHR=1")"

Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: betateilchen am 25 Mai 2023, 20:31:23
Zitat von: Jamo am 25 Mai 2023, 20:18:55In ein reading bekommst Du es, mit dem echo -n . . .

Wenn man eh schon auf Betriebssystemebene ist, geht das aber auch einfacher und ohne den echo-Krampf.

perl /opt/fhem/fhem.pl 7072 "setreading testDevice testReading testWert"
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: Jamo am 25 Mai 2023, 21:20:35
ZitatWenn man eh schon auf Betriebssystemebene ist, geht das aber auch einfacher und ohne den echo-Krampf.
Ja, dann muss aber ein telnet device definiert sein, das habe ich nicht.

Hier im Forum auch nochmal die Lösungen zur gleichen Fragestellung: https://forum.fhem.de/index.php?topic=79082.0
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: Otto123 am 26 Mai 2023, 09:40:50
Zitat von: Jamo am 25 Mai 2023, 20:18:55In ein reading bekommst Du es, mit dem echo -n . . .
In deinem Beispiel müsste aber csrf Token ausgeschaltet sein - was nicht empfehlenswert ist!  (steht auch in deinem Link :) )
Wie man damit umgehen kann steht hier https://wiki.fhem.de/wiki/CsrfToken-HowTo

Für die Anwendung das Telnet Device zu definieren ist für die meisten User ev. wieder einfacher. :) Das Telnet "Loch" ist immer noch besser als einfach csrf zu deaktivieren.
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: MadMax-FHEM am 26 Mai 2023, 10:06:01
Zitat von: Otto123 am 26 Mai 2023, 09:40:50Das Telnet "Loch" ist immer noch besser als einfach csrf zu deaktivieren.
Und es lässt sich doch auch nur lokal öffnen ;)

Also im DEF ohne "global", dann geht es nur localhost...

Gruß, Joachim
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: Wernieman am 26 Mai 2023, 10:34:27
Also um Daten vom Script zu FHEM zu Pushen gibt es doch schon viele Lösungen .. müssen wir das hier nochmals "durchdiskutieren"?
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: frank am 26 Mai 2023, 12:27:15
auf einträge in fhem.log kann man auch ein notify triggern lassen.
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: DL8EI Ralph am 26 Mai 2023, 18:27:00
Moin und Danke zunächst,
den Posts #1 - #6
kann ich mangels Wissen nicht folgen und versuche mich einzulesen.

zu Post #9
Mit fast 9000 Posts bist Du soweit voraus, dass das aus Deiner Sicht gewiß zutrifft.
Aus meiner Anfänger-Sicht bin ich mit der Fülle der möglichen Lösungen schlichtweg überfordert.

Zitat von: frank am 26 Mai 2023, 12:27:15auf einträge in fhem.log kann man auch ein notify triggern lassen.
Das schien für mich am verständlichsten und das habe ich auch probiert
Mein Notify:
Internals:
   CFGFN     
   DEF        n_LogFehler:.*Fehler.* {}
   FUUID      6470a817-f33f-a76b-18b6-826164c60c722ddf
   NAME       n_LogFehler
   NOTIFYDEV  n_LogFehler
   NR         133550
   NTFY_ORDER 50-n_LogFehler
   REGEXP     n_LogFehler:.*Fehler.*
   STATE      active
   TRIGGERTIME 1685106514.87943
   TYPE       notify
   eventCount 10
   READINGS:
     2023-05-26 15:10:00   state           active
     triggeredByDev:
       TIME       
       VAL        n_LogFehler
funktioniert  nicht auf den von mir gesuchten Log-Eintrag "Fehler"
Fehler beim Öffnen des Geräts, es existiert nicht.
Fehler beim Öffnen des Geräts, es existiert nicht.

Aber warum nicht ???

Es geht aber mit anderer REGEX "FS20" richtig auf die Logbucheintröge
2023.05.26 15:08:27 3: n_LogFehler return value: HASH(0x4a12bc8)
2023.05.26 15:08:27 3: FS20 set X6 off
2023.05.26 15:08:22 3: n_LogFehler return value: HASH(0x5475168)
2023.05.26 15:08:22 3: FS20 set X6 on
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: Otto123 am 26 Mai 2023, 19:15:43
Du hast die Doku nicht gelesen :( und das entscheidende attribute vergessen
https://fhem.de/commandref_DE.html#notify
ZitatAttribute
...
readLog
Das notify wird für Meldungen, die im FHEM-Log erscheinen, ausgegeführt. Das "Event-Generierende-Gerät" wird auf dem notify selbst gesetzt. Z.Bsp. kann man mit folgendem notify auf die Startup Meldung reagieren:
define n notify n:.*Server.started.* { Log 1, "Wirklich" }
attr n readLog
Oder Du hast nur die Hälfte gepostet. Auf alle Fälle sehe ich in dem Stückchen in deinem Post #1 kein einziges Wort Fehler - also warum das Suchmuster .*Fehler.* ?

Was funktioniert:  ;D
define n notify n:.*Fehler.* {}
attr n readLog 1
Und dann ein Log Eintrag erzeugen. Im Device sieht man das getriggert wurde ;)
{Log 1,'Ein Fehler ist eingetreten'}
Aber ich würde mir die erstgenannten Möglichkeiten anschauen und diesen vermurksten Log Eintrag vermeiden.
Hast Du ein telnet Device?
list TYPE=telnetWenn nicht dann:
define telnetPort telnet 7072 Dann in Deinen Scriptcode die Zeile von betateilchen richtig einbauen.
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: DL8EI Ralph am 27 Mai 2023, 00:15:02
Ja, war unvollständig, hatte natürlich attr n_LogFehler readLog 1 drin, wobei
die 1 nicht dokumentiert ist, habe ich selber "erspielt".

Oben habe ich ja auch gesagt, dass die notify funktioniert nur eben nicht auf den Logbucheintrag
Fehler beim Öffnen des Geräts, es existiert nicht.
Der kommt nämlich ohne Datum und andere Angaben davor.
Könnte das der Grund sein, dass das nicht notifyiert wird ?
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: Otto123 am 27 Mai 2023, 09:13:19
Vermutung:
Es handelt sich um eine Meldung eines aus FHEM aufgerufenen Programmes. Diese landet als Ausgabe über stdout im FHEM Logfile.
Kann sein, dass in dem Fall ein solches notify nicht reagiert. Müsste man mal gezielt probieren.

Die Alternative wurde ja schon aufgezeigt ;)
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: frank am 27 Mai 2023, 09:53:12
wenn dies exakt dein 3-zeiliger logeintrag war/ist:
2023.05.25 08:45:06 3: atChkSMS: -1
Sende SMS 1/1....warte auf Netz-Bestätiung..OK, Nachricht-Referenz=173
Drücken Sie Strg-C, wenn Sie unterbrechen möchten...

dann versuche erst mal nur einen teil der fehlermeldung für die DEF deines notifys.
leerzeichen und zeilenumbrüche mindestens durch "punkte" ersetzen, sonderzeichen eventuell auch, also zb mal so:
n_LogFehler:.*warte.auf.Netz.* {}
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: betateilchen am 27 Mai 2023, 11:53:07
Es wäre halt doch hilfreich, wenn wir mal ein list des FHEM devices hätten, bei dessen Aktivität diese Meldung überhaupt erzeugt wird.

Und das hat grundsätzlich nix damit zu tun, ob jemand 5 Beiträge hat oder 9000.
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: betateilchen am 27 Mai 2023, 12:44:15
Zitat von: Otto123 am 27 Mai 2023, 09:13:19Kann sein, dass in dem Fall ein solches notify nicht reagiert. Müsste man mal gezielt probieren.

ausprobiert...


1. das bash skript:

#!/bin/bash

echo "das ist ein TestText"

-snip
2. das at device:

defmod test_at at +*00:01:00 {qx(/tmp/test.sh)}

-snip
3. das notify device:

defmod test_notify notify test_notify:.* {Debug "Logeintrag: ".$EVENT}
attr test_notify readLog 1

-snip

Als Ergebnis taucht im Logfile auf:

2023.05.27 12:38:38 3: test_at: das ist ein TestText
2023.05.27 12:38:38 1: DEBUG>Logeintrag: 2023.05.27 12:38:38 3: test_at: das ist ein TestText

2023.05.27 12:39:38 3: test_at: das ist ein TestText
2023.05.27 12:39:38 1: DEBUG>Logeintrag: 2023.05.27 12:39:38 3: test_at: das ist ein TestText

2023.05.27 12:40:38 3: test_at: das ist ein TestText
2023.05.27 12:40:38 1: DEBUG>Logeintrag: 2023.05.27 12:40:38 3: test_at: das ist ein TestText

2023.05.27 12:41:38 3: test_at: das ist ein TestText
2023.05.27 12:41:38 1: DEBUG>Logeintrag: 2023.05.27 12:41:38 3: test_at: das ist ein TestText

2023.05.27 12:42:38 3: test_at: das ist ein TestText
2023.05.27 12:42:38 1: DEBUG>Logeintrag: 2023.05.27 12:42:38 3: test_at: das ist ein TestText

works as designed.
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: Otto123 am 27 Mai 2023, 15:28:23
andere Test (erzeugt keinen Logeintrag  wie Dein at)

Mein notify aus #10 mit dem Ausführungsteil {Debug "Logeintrag: ".$EVENT}
Befehle in der FHEM Kommandozeile. So wird das notify getriggert
{Log 1, 'Ein Fehler ist aufgetreten'}So wird das notify nicht getriggert
"echo 'Der Fehler aus dem Hintergrund'"
Logeinträge
2023.05.27 15:25:32 1: Ein Fehler ist aufgetreten
2023.05.27 15:25:32 1: DEBUG>Logeintrag: 2023.05.27 15:25:32 1: Ein Fehler ist aufgetreten
Der Fehler aus dem Hintergrund
Meine Vermutung wird bestätigt?

@Frank ich denke der Logeintrag ist nicht mehrzeilig. Die erste Zeile ist der Logeintrag von FHEM, der Rest wird vom Script nach stdout geschrieben und landet im Log. Dein Ansatz wird dabei nicht funktionieren.
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: DL8EI Ralph am 27 Mai 2023, 21:00:44
Die auslösende at sieht so aus
define atChkSMS at *08:45:00 {system ("gammu sendsms TEXT 0123 4567890 -text 'Test SMS-Versand' ")}

Wenn es richtig funktioniert, dann sieht es im Logbuch so aus:
2023.05.27 08:42:38 1: RMDIR: ./restoreDir/save/2023-05-24
Drücken Sie Strg-C, wenn Sie unterbrechen möchten...
Sende SMS 1/1....warte auf Netz-Bestätiung..OK, Nachricht-Referenz=175
2023.05.27 08:45:07 3: atChkSMS: -1
2023.05.27 08:47:41 3: CUL_HM set HM_Klemme statusRequest noArg

Hier mal die relevanten Logauszüge, wenn es nicht funktioniert hat:
2023.05.24 10:00:00 3: FS20 set CheckAlive off
2023.05.24 10:00:00 3:

Drücken Sie Strg-C, wenn Sie unterbrechen möchten...
Sende SMS 1/1....warte auf Netz-Bestätiung..Fehler 500, Nachricht-Referenz=-1
Unbekannter Fehler.
2023.05.24 10:00:29 3: atChkSMS: -1
2023.05.24 10:07:30 3: CUL_HM set Anzeige1 statusRequest noArg
2023.05.24 11:37:30 3: CUL_HM set U_USV_Work statusRequest noArg
Fehler beim Öffnen des Geräts, es existiert nicht.
2023.05.24 11:54:04 1: RMDIR: ./restoreDir/save/2023-05-19
2023.05.24 21:08:56 3: FS20 set X6 on
Unbekannter Fehler.
2023.05.24 21:08:56 3: UNIRoll set GW_WoZi down

Aber es geht ja gar nicht primär im die auslösende at und deren Folgen, sondern
ich möchte gern generell das Erscheinen eines beliebigen im Logbuch auftauchenden Textes - hier: "Fehler" -
unanbhängig von dessen Quelle als Event notifyen können.
Ich hatte erwartet, dass das mit logRead so gelingt. Dem ist aber wohl nicht so.
Ich glaube inzwischen, dass für logRead zuvor im Logbuch bestimmte Struturen gegeben sein müssen.

Otto123 hat recht: der Eintrag in Log ist einzeilig bzw. kann einzeilig sein.

Den Umgang mit Scripten unter Linux habe ich noch nicht verstanden, in Linux bin ich noch Laie, da muss ich noch Wissen schöpfen.
Wenn ich das raus habe, dann werde ich obige Vorschläge probieren.

Danke an Alle bis hierher.
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: Otto123 am 27 Mai 2023, 21:45:46
Wenn Du den Aufruf anstatt mit system("") mit qx() wie in betateilchens Beispiel machst wird es ev. funktionieren. Allerdings wird dann FHEM für die Zeitdauer der Ausführung blockieren. Das ist nicht empfehlenswert.
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: DL8EI Ralph am 27 Mai 2023, 23:39:49
Der Logbucheintrag ändert sich in:
sh: 1: gammu sendsms TEXT 0123 4567890 -text 'Test SMS-Versand' : not foundDarauf notifyen lässt sich wie vorher nicht.
Titel: Aw: Meldung in Reading statt ins Logbuch
Beitrag von: Wernieman am 28 Mai 2023, 11:27:49
Empfehlung:
Packe lieber den Aufruf in ein Script. Dann kannst Du z.B. auch die Fehlerrückgabe des Scriptes durch $? Auswerten.

mal als Prototyp (Ungetestet)
#/bin/bash

gammu sendsms TEXT 0123 4567890 -text 'Test SMS-Versand'
error=$?

if [ $error -ne 0 ]
  then echo "Errorcode $error"
fi

Wie oben schon gesagt, kannst Du die Daten dann auch nach FHEM pushen. Da kommt es jetzt darauf an, welche Möglichkeiten DEIN Fhem bietet.

Siehe z.B. auch
https://tecadmin.net/bash-error-detection-and-handling-tips-and-tricks/ (https://tecadmin.net/bash-error-detection-and-handling-tips-and-tricks/)
https://linuxhint.com/bash_error_handling/ (https://linuxhint.com/bash_error_handling/)

Werte von FHEM an das Script, siehe "Otto":
https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html (https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html)

Werte vom Script an FHEM, auch da "siehe Otto"
https://github.com/heinz-otto/fhemcl (https://github.com/heinz-otto/fhemcl)

FHEM ist eben die Unx .. mehrere Wege führen ans Ziel ..... und jeder mit Vor/Nachteilen. Wir können Dir nicht sagen, was für Dein Problem die beste Lösung ist.

P.S: Anstatt ein Externes Shell-Script geht natürlich auch eine myutils-Codezeile. Die kann aber, wie Otto schon schrieb, blockieren. Ein mit "" aufgerufenes Shell-Script dagegen ist immer "nonblocking"

Btw:
Noch eine Kleinigkeit: Ich würde Dir empfehlen ein Programm aus einem Script IMMER mit dem vollen Pfad aufzurufen. Also z.B. anstatt gammu ein /usr/gammu, wenn garming unter /usr installiert wurde. Wo es installiert ist, kannst DU mit "whois garming" rausfinden.
Hintergrund: Unix sucht immer in den Pfaden, die per $PATH  vorgegeben wird. Bei Scripten, die z.B. per cron aufgerufen werden, ist diese Variable aber nicht gesetzt. Somit funktioniert dann das Script als User (gesetztes $PFAD) aber nicht als Deamon oder Cron-Job. Solche Fehler (und es ist ein Scriptfehler) sind sehr schwierig und nervig zu finden.

P.S: wie schon erwähnt, wurde schon mehrfach im Forum durchdiskutiert ...