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
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.
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...
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
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?
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
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
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
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...
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
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?
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...)
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
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","")." ;°;C</font>";;\
$ret .= " ;<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)))." ;MB ;";;\
$ret .= "Up: ".sprintf("%.1f", (ReadingsNum($name,"eth0_tx_bytes","")/(1024*1024)))." ;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;;\
}
...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
....ich hab mich für die Version mit netcat entschieden...
system("/bin/echo \"set H3_Teichtemp $ttemp\" | /bin/nc -w5 192.168.3.100 7072");
Das überträgt die Werte prima an den dummy auf dem Server....
Wert kommt an, dummy wird gesetzt, Event wird generiert ... aber irgendwie findet der dummy Wert seinen Weg noch nicht ins Logfile.... mal sehen woran das wieder liegt.
Danke nochmal!!
PS: kann auch nicht funktionieren, wenn man das LogFile "Readonly 1" setzt...
Kann ich das Internal elegant auf 0 setzen?
Zitat von: dougie am 26 August 2021, 09:29:44
Kann ich das Internal elegant auf 0 setzen?
Was meinst Du damit? Internals kannst Du normal nicht beeinflussen/setzen.
Da dein Code jetzt ein system() Aufruf ist: machst Du das remote auch mit Perl oder gar mit FHEM?
...war irgend ein Rechte-Problem... hab das FileLog neu angelegt -> läuft.
Zu deiner Frage: auch auf den abgesetzten RPis läuft ein minimales fhem... daher rufe ich den System Call aus fhem heraus auf.
Das erweitert natürlich die Palette der Möglichkeiten :) ;) :D ;D
fhem.pl <fhemhost>:7072 "<command>..."
Modul FHEM2FHEM, rfhem
https://wiki.fhem.de/wiki/CsrfToken-HowTo#Perl_Sub
MQTT von FHEM zu FHEM ohne extra mosquitto
egal - wenns erstmal läuft ohne in Dateien zu wurschteln :)
Nochmals danke für die Hilfe!
Du hast recht: manchmal hat man (gerade bei fhem) die Qual der Wahl.
Da ich das System nicht pausenlos verändere, lege ich maximalen Wert auf Zuverlässigkeit und bevorzuge daher eben simple Methoden, an deren Funktion ich mich auch in zwei Jahren noch erinnere.
Wenn ich an Microsoft denke, die immer noch an den Fehlern von Windows 10 rumdoktoren, und trotzdem eine Version 11 raus bringen....
So gesehen liebe ich meine uralte fhem Installation.... hat vielleicht nicht alle möglichen Features, aber ist in meinem Fall absolut fit for purpose!