(gelöst) Shell Rückgabe (mit Zeitverzug) in myUtils auswerten

Begonnen von ohosch, 23 Juni 2020, 09:16:05

Vorheriges Thema - Nächstes Thema

ohosch

Hallo Leute,

vielleicht kann mir jemand bei einem kleinen myUtils Scrpit weiterhelfen.

Ich rufe per {get_fax_data()} aus FHEM das folgende Script auf.

sub get_fax_data()
{
my $Fax_Data = `python3 /opt/fhem/www/scripts/FaxHandler/ff-fax-handler.py`;     
  fhem("setreading Fax_Input Gesamt $Fax_Data");
 
  my @Fax_Array = split(/\n/,$Fax_Data);
  fhem("setreading Fax_Input Einsatzstichwort $Fax_Array[1]");
  fhem("setreading Fax_Input Datum $Fax_Array[0]");

}


Das Python Script benötigt allerdings bis zu 40 Sekunden bei der Ausgabe (wenn ein neues Fax anliegt).
Wie bekomme ich es hin, dass die Ausgabe des Scripts erst in $Fax_Data übernommen wird, wenn das Script durchgelaufen ist?
Zum Zeitpunkt wo die setreadings ausgeführt werden, liegt noch keine Ausgabe an, sodass dies fehlschlägt.

Vielen Dank schon mal für Eure Tipps.
Ohosch

MadMax-FHEM

Entweder non-Blocking auslagern ODER aus dem Python Script die Werte setzen: http(s) oder telnet Kommando an fhem

Beispiele für Shell (bash) sollten zu finden sein...

Ansonsten, also wenn du das in einer sub "wartend" umsetzt, dann blockiert fhem solange!!

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

ohosch

Danke für die Idee.
In der Tat ist es sauberer die Readings direkt aus dem Python Script per http Request zu füllen, als diese über die Shell Ausgabe einzulesen und zu zerpflücken.

Anfänglich hatte mir hier noch der CSRF Token aus der WEB Definition Probleme gemacht,da sich der Token ja bei jedem neustart von FHEM ändert. Diesen kann man man aber mit der Variable $FW_CSRF dem Script mit übergeben.

Wernieman

oder im Script per http(s) Abfrage dieses ermitteln ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Prof. Dr. Peter Henning

Man kann auch in Python einen kleinen Server bauen, den man aus FHEM heraus antriggert, der dann autonom läuft und bei Eintreffen des Fax wiederum FHEM bedient.

LG

pah

Wernieman

Oder gleich im System laufen lassen ..

Meine Fritzbox verschickt eine Mail, wenn ein Fax ankommt. Diese Mail wird ausgewertet (Der interne Mailserver trickert ein Script) .......
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

ohosch

So, jetzt läuft das ganze, war aber noch ein steiniger Weg.

Vielen Dank für die vielen Antworten.  :)

Wir haben uns, wie oben beschrieben dazu entschlossen den Weg zu wählen, die Readings direkt aus dem Python Script zu befüllen.
Dabei sind wir dann doch darüber gestolpert, dass ein Shell Aufruf die FHEM Instanz blockiert.
Die Folge davon war, dass das Script seinen Wunsch Readings zu schreiben, die im Script über einen HTTP Request realisiert sind nicht loswerden konnte, da zu dem Zeitpunkt kein HTTP Request angenommen werden konnte.

Um FHEM dazuzubekommen, während der Laufzeit des Scriptes wieder Request annehmen zu können, musste der Aufruf der Routine in den MyUtils als "Blocking Call" geschehen.

{BlockingCall("get_fax_data",$FW_CSRF)}

$FW_CSRF ist der Parameter, der der Routine mit übergeben wird, in diesem Fall der CSRF Sting.

CoolTux

Zitat von: ohosch am 05 Juli 2020, 09:01:52
So, jetzt läuft das ganze, war aber noch ein steiniger Weg.

Vielen Dank für die vielen Antworten.  :)

Wir haben uns, wie oben beschrieben dazu entschlossen den Weg zu wählen, die Readings direkt aus dem Python Script zu befüllen.
Dabei sind wir dann doch darüber gestolpert, dass ein Shell Aufruf die FHEM Instanz blockiert.
Die Folge davon war, dass das Script seinen Wunsch Readings zu schreiben, die im Script über einen HTTP Request realisiert sind nicht loswerden konnte, da zu dem Zeitpunkt kein HTTP Request angenommen werden konnte.

Um FHEM dazuzubekommen, während der Laufzeit des Scriptes wieder Request annehmen zu können, musste der Aufruf der Routine in den MyUtils als "Blocking Call" geschehen.

{BlockingCall("get_fax_data",$FW_CSRF)}

$FW_CSRF ist der Parameter, der der Routine mit übergeben wird, in diesem Fall der CSRF Sting.

Wenn ihr eh BlockingCall macht warum dann nicht innerhalb des BlockingCall auf die Antwort des Python Skriptes warten?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Wernieman

Oder sich fragen, warum Blockiert FHEM? Und genau diese Blockade beseitigen
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html