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?
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
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")"
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"
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
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.
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
Also um Daten vom Script zu FHEM zu Pushen gibt es doch schon viele Lösungen .. müssen wir das hier nochmals "durchdiskutieren"?
auf einträge in fhem.log kann man auch ein notify triggern lassen.
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
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=telnet
Wenn nicht dann:
define telnetPort telnet 7072
Dann in Deinen Scriptcode die Zeile von betateilchen richtig einbauen.
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 ?
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 ;)
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.* {}
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.
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...
- ein bash-Skript angelegt, das per echo einen Text liefert
- ein at angelegt, das einmal pro Minute das bash-Skript aufruft
- ein notify angelegt, das auf den Logeintrag reagiert
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.
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.
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.
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.
Der Logbucheintrag ändert sich in:
sh: 1: gammu sendsms TEXT 0123 4567890 -text 'Test SMS-Versand' : not found
Darauf notifyen lässt sich wie vorher nicht.
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 ...