[gelöst] qx und wget blockiert FHEM bei Nutzung von RSS

Begonnen von h002, 05 Mai 2022, 16:58:54

Vorheriges Thema - Nächstes Thema

h002

Hallo,

wenn folgender Teil meines DOIF ausgeführt wird, blockiert FHEM.


signal_command {
if ( [?signal:msgText] =~ /^rss$/) {
qx"wget --quiet --no-check-certificate https://fhem.intranet:8083/fhem/rss/rssFeed.png -O /opt/fhem/fhem_png_plots/rss.png";
qx"wget --quiet --no-check-certificate https://fhem.intranet:8083/fhem/rss/rssFeedS10.png -O /opt/fhem/fhem_png_plots/rssS10.png";
set_Exec("send_rss_info",5,'fhem_set("signal send &/opt/fhem/fhem_png_plots/rss.png &/opt/fhem/fhem_png_plots/rssS10.png")');
}
}


Rufe ich die URL zu dem PNG direkt auf, wird mir das Bild korrekt angezeigt.

Direkt auf der Shell wird das Bild mit dem folgenden Kommando korrekt gespeichert.

sudo -u fhem wget --quiet --no-check-certificate https://fhem.intranet:8083/fhem/rss/rssFeed.png -O /opt/fhem/fhem_png_plots/rss.png


Starte ich das Kommando über die Weboberfläche von FHEM, blockiert das Kommando FHEM.

{qx"wget --quiet --no-check-certificate https://fhem.intranet:8083/fhem/rss/rssFeed.png -O /opt/fhem/fhem_png_plots/rss.png"}

Die Datei wird zwar auf dem Filesystem erzeugt, ist aber 0 Byte groß.

Im Log bekomme ich bei Ausführung innerhalb von FHEM (DOIF oder WebGui) bis zur Blockierung folgendes angezeigt.


--2022-05-05 16:00:11--  https://fhem.intranet:8083/fhem/rss/rssFeed.png
Auflösen des Hostnamens fhem.intranet (fhem.intranet)... 192.168.1.159
Verbindungsaufbau zu fhem.intranet (fhem.intranet)|192.168.1.159|:8083 ... verbunden.


Es ist dann ein Prozess sichtbar, den ich erst beenden muss, bevor FHEM wieder reagiert.

fhem     25235 19586  0 16:39 ?        00:00:00 wget --quiet --no-check-certificate https://fhem.intranet:8083/fhem/rss/rssFeed.png -O /opt/fhem/fhem_png_plots/rss.png


Führe ich das Kommando direkt auf der Shell aus, bekomme ich diesen Output und alles arbeitet wie gewünscht.


pi@fhem:/opt/fhem/fhem_png_plots $ sudo -u fhem wget --no-check-certificate https://fhem.intranet:8083/fhem/rss/rssFeed.png -O /opt/fhem/fhem_png_plots/rss.png
--2022-05-05 15:51:10--  https://fhem.intranet:8083/fhem/rss/rssFeed.png
Auflösen des Hostnamens fhem.intranet (fhem.intranet)... 192.168.1.159
Verbindungsaufbau zu fhem.intranet (fhem.intranet)|192.168.1.159|:8083 ... verbunden.
WARNUNG: Dem Zertifikat von »fhem.intranet« wird nicht vertraut.
WARNUNG: Das Zertifikat von »»fhem.intranet«« hat keinen bekannten Austeller.
Der Zertifikat-Eigentümer passt nicht zum Hostname »fhem.intranet«.
HTTP-Anforderung gesendet, auf Antwort wird gewartet ... 200 OK
Länge: 101632 (99K) [image/png]
Wird in »/opt/fhem/fhem_png_plots/rss.png« gespeichert.

/opt/fhem/fhem_png_plots/rss.png                     100%[======================================================================================================================>]  99,25K   599KB/s    in 0,2s

2022-05-05 15:51:13 (599 KB/s) - »/opt/fhem/fhem_png_plots/rss.png« gespeichert [101632/101632]


Zu diesem Problem kommt es, nachdem ich mein DOIF auf Perl umgestellt habe. Als ich noch im "DOIF-Modus" unterwegs war, funktionierte alles mit der folgenden Zeile.


DOELSEIF ( [signal:msgText] =~ /^rss$/)
("wget --quiet --no-check-certificate https://fhem.intranet:8083/fhem/rss/rssFeed.png -O /opt/fhem/fhem_png_plots/rss.png")


Die Owner der Files für /opt/fhem stehen alle korrekt auf fhem:dialout. Hoffentlich konnte ich alle Infos sinnvoll liefern, um von euch ein paar Hinweise zur Lösung des Problems in meinem DOIF zu erhalten. ;-) Vielen Dank!


Damian

ZitatStarte ich das Kommando über die Weboberfläche von FHEM, blockiert das Kommando FHEM.

Was verstehst du hier unter Weboberfläche?

Funktioniert der Befehl:

{qx"wget --quiet --no-check-certificate https://fhem.intranet:8083/fhem/rss/rssFeed.png -O /opt/fhem/fhem_png_plots/rss.png"}

in der Kommandozeile?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

h002

Damit meine ich die Weboberfläche von FHEMWEB (siehe Screenshot). Dort kommt es zum beschriebenen Verhalten. Meinst du das mit Kommandozeile?


Damian

Zitat von: h002 am 05 Mai 2022, 20:45:49
Damit meine ich die Weboberfläche von FHEMWEB (siehe Screenshot). Dort kommt es zum beschriebenen Verhalten. Meinst du das mit Kommandozeile?

Das ist ja die Kommandozeile.

Wenn es da schon nicht funktioniert, dann brauchst du im DOIF nicht weitersuchen. Sondern das Problem in Automatisierung-Board schildern, denn es ist kein DOIF-Problem.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

h002


Otto123

#5
Hallo h002,

Wenn Du das:
{qx"wget --quiet --no-check-certificate https://fhem.intranet:8083/fhem/rss/rssFeed.png -O /opt/fhem/fhem_png_plots/rss.png"}
so machst
"wget --quiet --no-check-certificate https://fhem.intranet:8083/fhem/rss/rssFeed.png -O /opt/fhem/fhem_png_plots/rss.png"
Wird es ev. funktionieren. Zumindest ist es bei mir so.
Allerdings wird dieser Code nicht blockierend im Hintergrund ausgeführt, Dein Folgebefehl kann also u.U. früher ausgeführt werden.

Da Du den Code auf der gleichen Maschine ausführst, führt es offenbar zur Blockade von FHEMWEB? Von einer anderen Maschine funktioniert der Code.

Aber irgendwie ist das auch Unfug?
Mach doch einfach:
Edit: Fehler korrigiert.
{qx"cp ./www/rss/rssFeed.png fhem_png_plots/rss.png"}

Wobei mir sich der Sinn der Kopie nicht erschließt. ::)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

h002

Hallo Otto,
danke für deinen Input. Ich habe eben gerade noch experimentiert und eine Möglichkeit gefunden.

Wenn ich bei wget die Option -b für die Ausführung im Hintegrund mitgebe, funktioniert es plötzlich.

Hier das funktionierende Ergebnis mit Hilfe der Kommandozeile.


{qx"wget -O /opt/fhem/fhem_png_plots/rss.png -b -q --no-check-certificate https://192.168.1.159:8083/fhem/rss/rssFeed.png"}


Zitat von: Otto123 am 05 Mai 2022, 23:05:48
so machst
"wget --quiet --no-check-certificate https://fhem.intranet:8083/fhem/rss/rssFeed.png -O /opt/fhem/fhem_png_plots/rss.png"
Wird es ev. funktionieren. Zumindest ist es bei mir so.

Das hat in meinem DOIF im Perlmodus nicht funktioniert. Ich bekam nur die Warnung:


2022.05.05 23:17:20 1: PERL WARNING: Useless use of a constant ("wget --quiet --no-check-certific"...) in void context at (eval 22990) line 74.


Vielen Dank noch mal für das Interesse an meinem Problem :-)

Otto123

#7
Ich habe auch nicht gesagt es funktioniert in Perl :) Es ist die Umsetzung eines Shell Befehls in FHEM, funktioniert so in der Kommandozeile. Die Kommandozeile ist FHEM und kein Perl. {qx()} ist die Umsetzung eines Perlbefehls in FHEM.

Aber damit, dass Du es jetzt in den Hintergrund schickst, wird folgendes passieren:
Befehl1 - läuft 3 sec im Hintergrund
Befehl2 - läuft 4 sec im Hintergrund
Befehl3 - läuft sofort los und will die Ergebnisse von Befehl1 und Befehl2 verarbeiten, die kommen aber später...

Wozu musst Du eine lokale Datei über das Webinterface kopieren?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

h002

#8
Zitat von: Otto123 am 05 Mai 2022, 23:29:26
Wozu musst Du eine lokale Datei über das Webinterface kopieren?

Ich hoffe ich verstehe die Frage richtig. Ich nutze das RSS-Modul (png wird ja erst erzeugt, wenn es explizit aufgerufen wird) und möchte via Signal Messenger das Kommando "rss" senden, um ein png mit aufbereiteten Informationen zu erhalten. Die Verarbeitung erfolgt über das DOIF. Deshalb benötige ich die Kopie, um das Bild über den SignalBot zu versenden.

Otto123

#9
Moin,

ich denke Du hast den Hintergrund meiner Frage nicht verstanden - oder ich liege schief:
Zitatpng wird ja erst erzeugt, wenn es explizit aufgerufen wird
bist Du sicher? ::)

Du machst ja alles auf einer Maschine - richtig? (Sonst käme es nicht zu dem von Dir eingangs beschriebenen Verhalten)
Die Datei https://fhem.intranet:8083/fhem/rss/rssFeed.png findest Du im lokalen Dateisystem unter ./www/rss/rssFeed.png bzw. /opt/fhem/www/rss/rssFeed.png


Ich liege falsch - ich muss weiter nachdenken!!!

Ich meine, Du kannst einfach diese Datei an signal übergeben?

Da gibt es noch den interessanten Beitrag, ich denke der betrifft Dein eingangs beschriebenes Problem:
https://forum.fhem.de/index.php/topic,22520.msg159824.html#msg159824
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

Hallo h002,

Du hast sicher Recht mit dem erzeugen der Datei. Ich war da neben der Spur.

Was ist signal send &/opt/fhem/f ... für ein Kommando? Das ist doch auch ein Shell und kein FHEM Befehl?

Wenn es so ist, solltest Du alle Shell Befehle einfach in ein Script packen und dieses Script komplett aus FHEM heraus starten (wie schon gezeigt den Aufruf einfach in "" packen) Damit wäre die Kette komplett (aber im Hintergrund) und FHEM wird nicht blockieren.
Bild1 holen
Bild2 holen
signal schicken

Sorry nochmal für die Verwirrung. Aber ich bin nach wie vor der Meinung, deine jetzige Lösung funktioniert nicht richtig!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

h002

#11
Hallo Otto,

das "signal send &/opt" ist notwendig, um dem Modul signalbot mitzuteilen, ein Bild was auf dem Dateisystem liegt, zu versenden (siehe Wiki). Es handelt sich um ein set-Kommando des Moduls.

Im DOIF (Perlmodus) funktioniert es nun ja auch mit dem "-b" Parameter.


signal_commands {
##rss Info zu Haus versenden
if ( [signal:msgText] =~ /^rss$/) {
qx"wget -b --no-check-certificate https://fhem.intranet:8083/fhem/rss/rssFeed.png -O /opt/fhem/fhem_png_plots/rss.png";
qx"wget -b --no-check-certificate https://fhem.intranet:8083/fhem/rss/rssFeedS10.png -O /opt/fhem/fhem_png_plots/rssS10.png";
set_Exec("send_rss_info",5,'fhem_set("signal send &/opt/fhem/fhem_png_plots/rss.png &/opt/fhem/fhem_png_plots/rssS10.png")');
}
}


Das set_Exec verzögert ja den Versand um 5 Sekunden, um dem wget Zeit zum Speichern der Bilder zu geben.

Zitat von: Otto123 am 06 Mai 2022, 09:31:14
Da gibt es noch den interessanten Beitrag, ich denke der betrifft Dein eingangs beschriebenes Problem:
https://forum.fhem.de/index.php/topic,22520.msg159824.html#msg159824
Meiner Meinung nach geht es hier um das Konfigurieren des rssLayout zur Einbindung von Bildern. In meinem Fall geht es ja "nur" um die Generierung des Feed und Bereitstellung als Grafik, um es dann mittels signal zu versenden. Im Anhang das Ergebnis, wie es aktuell auch funktioniert und korrekt über den Signal Messenger auf meinem Telefon ankommt.

Die Auslagerung in ein Skript wäre auch eine Möglichkeit. Da ich die DOIFs mag und mit dem Handling einigermaßen zurechtkomme, versuche ich möglichst alles darüber zu realisieren. Da habe ich alles an einer Stelle und kann es für mich besser überblicken.

Du verwirrst mich nicht, sondern verleitest mich zum Nachdenken. Das unterstützt die Lernkurve. ;-)

Otto123

ok habe verstanden, der DOIF Syntax ist mir an der Stelle nicht geläufig, das set steht praktisch im Befehl fhem_set()😅

Gut wenn Du da eine Verzögerung machst funktioniert das auch -  das ist die 5 in dem set_exec Befehl?  ???

Den Link zum RSS Workshop meinte ich nur als Bestätigung in der Richtung meiner Gedanken: es entsteht eine Endlosschleife/Blockade wenn man die URL zur Erzeugung des Bildes aus dem gleichen FHEM aufruft. Genau das tust Du mit deinem ursprünglichen wget. Durch die Verlagerung in den Hintergrund, kann FHEM weiterarbeiten und blockiert sich nicht mehr selbst.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

h002

V
Zitat von: Otto123 am 06 Mai 2022, 12:14:55
Gut wenn Du da eine Verzögerung machst funktioniert das auch -  das ist die 5 in dem set_exec Befehl?  ???
Genau.

Zitat von: Otto123 am 06 Mai 2022, 12:14:55
Den Link zum RSS Workshop meinte ich nur als Bestätigung in der Richtung meiner Gedanken: es entsteht eine Endlosschleife/Blockade wenn man die URL zur Erzeugung des Bildes aus dem gleichen FHEM aufruft. Genau das tust Du mit deinem ursprünglichen wget. Durch die Verlagerung in den Hintergrund, kann FHEM weiterarbeiten und blockiert sich nicht mehr selbst.
Gut zu wissen. Auch wenn ich es technisch nicht im Detail nachvollziehen kann, hilft es mir beim weiteren Ausbau der DOIFs weiter.