Seltsames Problem mit Perl qx Befehl

Begonnen von dougie, 25 August 2021, 08:33:57

Vorheriges Thema - Nächstes Thema

dougie


So etwa zwei mal pro Jahr muss ich leider was fragen, weil ich selber keine Lösung finde.

In diesem Fall ist es ein seltsames Verhalten mit dem Perl qx Befehl.

Ich hab ein Dummy, das mit

readingDefinitions
energy:qx(sed -n '1p' /mnt/remote/solarpi/TotalPower.txt),power:qx(sed -n '2p' /mnt/remote/solarpi/TotalPower.txt)


Zwei Werte aus einem Text-File ausliest. Das funktioniert tage- und manchmal wochenlang problemlos.
Ab und zu jedoch liefert qx dann nur noch ein "Error"

Ich hab das in der Kommandozeile nachgestellt und dort tritt das auch auf.
Wenn ich den Rechner reboote, ist wieder alles ok.

Hat da jemand eine mögliche Erklärung für?

VG
Ralf

betateilchen

Warum liest Du das Textfile nicht mit FileRead() ein und verarbeitest es komplett in FHEM?
Vor allem, da Du ja beide Werte aus dem gleichen Textfile haben willst, wäre das sicher eine elegantere Lösung gegenüber zwei Betriebssystemaufrufen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

dougie


Ich danke dir für die Antwort.

Mögliches Problem: ich bin vor ner ganzen Weile aufgrund von zu wenig Zeit aus der laufenden Entwicklung ausgestiegen.

Meine fhem Version : Version $Id: fhem.pl 9118 2015-08-23 12:43:56Z rudolfkoenig $

Aber ich geb zu, das ich FileRead noch nie verwendet hab...

yersinia

Zitat von: dougie am 25 August 2021, 09:27:18Meine fhem Version : Version $Id: fhem.pl 9118  2015-08-23 12:43:56Z rudolfkoenig $
:o :o :o :o :o :o :o  :-X
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

dougie



So isses halt  ;D

Frei nach Murphy: If something isn't broken -> don't fix it!


Also mit

my @SolarData=FileRead('/mnt/remote/solarpi/TotalPower.txt')

hätte ich die Daten im Array SolarData... korrekt?

Otto123

Zitat von: dougie am 25 August 2021, 08:33:57
Ab und zu jedoch liefert qx dann nur noch ein "Error"
...
Wenn ich den Rechner reboote, ist wieder alles ok.

Hat da jemand eine mögliche Erklärung für?
Hallo Ralf,
die schnöde "Error" Meldung kann ich mit meinen Systemen nicht nachvollziehen.
Ich würde vermuten, dass die remotedatei / die Verbindung / der Mountpoint zu diesem Zeitpunkt nicht mehr zur Verfügung steht.
Es sollte sich in diesem Zeitpunkt eine umfangreichere Meldung im FHEM Logfile finden, typischerweise nicht im normalen FHEM Log Format. Die Errormeldung von sed geht nicht an qx sondern über die Standardausgabe ins Logfile.

Du solltest also egal wie die Lösung aussieht, vorher testen ob die Datei existiert.

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

dougie

Klar, verstehe schon das meine Info nicht vollständig ist. Musste gestern Abend rebooten und konnte daher heute Morgen nicht mehr nachstellen.

Nur als Zusatzinfo: Das fhem System ist ein Laptop mit Debain Linux 9 als Server

Einige verteilte RPis liefern ihre Daten in ein textfile auf einer Freigabe des Servers. Damit versuche ich zu vermeiden, das sich fhem aufhängt, wenn einer der remote RPis mal nicht erreichbar ist. Daher ist für fhem die Datei von der gelesen wird "lokal".

VG
Ralf

MadMax-FHEM

qx hängt aber auch ;)

Warum nicht gleich die Daten auf dem Raspi an fhem schicken, wenn sie entstehen?

Z.B. per HTTP(S), MQTT, Telnet, ...

Dann blockt nichts, du musst nichts mounten/freigeben UND die Daten sind genau dann in fhem, wenn sie "entstehen"...

Aktuell: es "entstehen" Daten -> Datei -> "irgendwann" mal auslesen und in fhem "integrieren"...

"Zukünftig": es "entstehen" Daten -> HTTP(S)/MQTT/Telnet/... -> Daten sind in fhem :)

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)

Beta-User

Zitat von: MadMax-FHEM am 25 August 2021, 11:38:38
[...] Warum nicht gleich die Daten auf dem Raspi an fhem schicken, wenn sie entstehen?

Z.B. per [...] MQTT, [...]
...spätestens für MQTT wäre dann aber ein update dringlichst anzuraten ;) ...

Zitat von: dougie am 25 August 2021, 09:37:08
Also mit

my @SolarData=FileRead('/mnt/remote/solarpi/TotalPower.txt')

hätte ich die Daten im Array SolarData... korrekt?
Fast: https://wiki.fhem.de/wiki/DevelopmentModuleAPI#FileRead => zurückgegeben werden eventuelle Fehler und das Array...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

MadMax-FHEM

Zitat von: Beta-User am 25 August 2021, 12:00:01
...spätestens für MQTT wäre dann aber ein update dringlichst anzuraten ;) ...

Ich habe mqtt auch nur genannt, weil man wohl "neuerdings" alles mit mqtt macht/zu machen scheint... ;)

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)

dougie

#10


Klingt sehr charmant! Würde mir sehr gefallen! ...also insofern ...bei mir läuft MQTT, weil ich damit einige Tasmota Steckdosen schalte :-)

Jetzt müsste ich nur noch eben lernen, wir ich den entfernten RPi dazu bringe die Daten via MQTT anzuliefern...
Gibts da auch nen Guide?

Beta-User

Jein.

Es gibt einen Thread von hexenmeister mit Anwendungsbeispielen zu MQTT_GENERIC_BRIDGE, das aber vermutlich bei einem so alten FHEM nicht mit dabei ist... (Da wird auch noch MQTT als IO-Modul verwendet, aber auch da würde ich für (Wieder-) "Einsteiger" MQTT2_CLIENT empfehlen...)
(Es gibt auch mehrere zu IoBroker&Co via MQTT, da gilt eigentlich auch nichts anderes, und "jemand" hat dazu auch ein paar Takte geschrieben, wie man das ggf. hinsichtlich der Topic-Struktur so aufbauen kann, dass (als MQTT2_DEVICEs) auf der "Empfängerseite" gleich so strukturiert wird, dass man damit (hoffentlich) was anfangen kann, ohne viel manuellen Aufwand zu treiben...)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

Telnet geht z.B. einfach mit netcat - da brauchst Du wahrscheinlich gar nichts auf den remote Pis installieren:
https://forum.fhem.de/index.php/topic,80371.msg723862.html#msg723862
per http brauchst auch nichts zu installieren, für den Komfort vielleicht ein Script wie hier:
https://github.com/heinz-otto/fhemcl
für mqtt brauchst Du remote den mosquitto client, da hab ich hier mal rumprobiert und die Versuche aufgeschrieben:
https://heinz-otto.blogspot.com/search?q=mqtt
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

yersinia

Um von einem RasPi Infos via mqtt an FHEM zu senden, nutze ich auf allen RasPis mosquitto-client (wie Otto schon schrieb) und via cron alle 10 Minuten auszuführendes script unter /usr(local/bin - das ganze baut eine JSON-Strukur auf und schickt es via mosquitto_pub an den MQTT Server (bei mir FHEM):
#!/bin/bash

mqtt_host="[FHEM IP]"
mqtt_port="1883"
mqtt_user="[FHEM MQTT User]"
mqtt_pass="[FHEM MQTT User Password]"
mqtt_clientid="[CLIENT ID]"
mqtt_topicid="[TOPIC ID]"

jsontxt='{'
#date date +%FT%T
        jsontxt+='"time":"'
                jsontxt+=$(date +%FT%T)
        jsontxt+='",'
#host name
        jsontxt+='"hostname":"'
                jsontxt+=$(hostname)
        jsontxt+='",'
#kernel version
        jsontxt+='"kernel_version":"'
                jsontxt+=$(uname -r)
        jsontxt+='",'
#uptime -p
        jsontxt+='"uptime_p":"'
                jsontxt+=$(uptime -p)
        jsontxt+='",'
#loadavg
        jsontxt+='"loadavg":"'
                jsontxt+=$(cat /proc/loadavg)
        jsontxt+='",'
#ip address
        jsontxt+='"IPAddress":"'
                jsontxt+=$(hostname -I)
        jsontxt+='",'
#cpu temp
        jsontxt+='"cputemp":"'
                jsontxt+=$(vcgencmd measure_temp | egrep -o '[0-9]*\.[0-9]*')
        jsontxt+='",'
#eth 0 stats
        jsontxt+='"eth0_rx_bytes":"'
                jsontxt+=$(cat /sys/class/net/eth0/statistics/rx_bytes)
        jsontxt+='",'
#eth 0 stats
        jsontxt+='"eth0_tx_bytes":"'
                jsontxt+=$(cat /sys/class/net/eth0/statistics/tx_bytes)
        jsontxt+='",'
#fan
        jsontxt+='"state_fan":"'
                jsontxt+=$(cat /sys/class/gpio/gpio17/value)
        jsontxt+='",'
jsontxt+='}'
#printf "$jsontxt"
mosquitto_pub -h $mqtt_host -p $mqtt_port -u $mqtt_user -P $mqtt_pass -i $mqtt_clientid -t tele/$mqtt_topicid/sysstat -m "$jsontxt"


Das dazugehörige Device in FHEM:
defmod MQTT2_raspi MQTT2_DEVICE raspi
attr MQTT2_raspi IODev MQTT2_FHEM_Server
attr MQTT2_raspi event-on-change-reading cputemp
attr MQTT2_raspi icon RPi
attr MQTT2_raspi readingList [CLIENT ID]:tele/[TOPIC ID]/sysstat:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr MQTT2_raspi stateFormat { my $ret = "<div style=\"text-align:left;;\"><font style=\"color:";;\
if(ReadingsNum($name,"cputemp",0) < 50.0) {\
$ret .= "limegreen";;\
} elsif (ReadingsNum($name,"cputemp",0) < 60.0) {\
$ret .= "yellow";;\
} else {\
$ret .= "red";;\
}\
$ret .= ";;font-weight:bold;;\">".ReadingsVal($name,"cputemp","")."&nbsp;;&deg;;C</font>";;\
$ret .= "&nbsp;;<img src=\"/fhem/images/default/icoLuefter.png\" style=\"width:10px;;height:10px;;background-color:";;\
if(ReadingsNum($name,"state_fan",0) == 1) {\
$ret .= "green";;\
} else {\
$ret .= "red";;\
}\
$ret .= ";;\" alt=\"".ReadingsVal($name,"state_fan","?")."\" /><br />";;\
$ret .= "Down: ".sprintf("%.1f", (ReadingsNum($name,"eth0_rx_bytes","")/(1024*1024)))."&nbsp;;MB&nbsp;;";;\
$ret .= "Up: ".sprintf("%.1f", (ReadingsNum($name,"eth0_tx_bytes","")/(1024*1024)))."&nbsp;;MB<br />";;\
$ret .= "Load: ".ReadingsVal($name,"loadavg","")."<br />";;\
$ret .= "Kernel: ".ReadingsVal($name,"kernel_version","")."<br />";;\
$ret .= "(Updated: ".ReadingsTimestamp($name,"cputemp","2000-01-01 00:00:00").")";;\
$ret .= "</div>";;\
return $ret;;\
}
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

dougie


...ihr seid mal wieder großartig! Vielen Dank!

Ich schau mir das heute Abend in Ruhe an ... irgendeine Lösung wird es werden.
Telnet wäre natürlich auch super .... simpel und robust....

VG
Ralf