[Gelöst] Tablet UI Problem mit Customreading

Begonnen von Nitaro, 23 Mai 2020, 14:05:50

Vorheriges Thema - Nächstes Thema

Nitaro

if ($error) {return $error} else {return $content[1]}
Lief bei mir zwar wieder auf einen Fehler, aber ohne funktioniert es prima  :)
Vielen Dank Euch beiden !

TomLee

Also ich fänds gut wenn du für künftige Leser(/Verbesserungsvorschläge) noch deine endgültige Lösung zeigst.

Nitaro

#17
Ja du hast natürlich recht.

Ich habe auf meinem Synology DS918+ Probleme mit dem auslesen via SNMP gehabt.
Daher habe ich auf einem Volume des NAS folgendes bash script angelegt um entsprechende Werte (Temperaturen, Belegung, Uptime) auszulesen:

#!/bin/sh

core0=$(cat /sys/bus/platform/devices/coretemp.0/hwmon/hwmon0/temp2_input | sed 's/...$/.0/')
core1=$(cat /sys/bus/platform/devices/coretemp.0/hwmon/hwmon0/temp3_input | sed 's/...$/.0/')
core2=$(cat /sys/bus/platform/devices/coretemp.0/hwmon/hwmon0/temp4_input | sed 's/...$/.0/')
core3=$(cat /sys/bus/platform/devices/coretemp.0/hwmon/hwmon0/temp5_input | sed 's/...$/.0/')

echo "$core0"  > /volume1/XYZ/synology_fhem_readings/readings1.txt
echo "$core1" >> /volume1/XYZ/synology_fhem_readings/readings1.txt
echo "$core2" >> /volume1/XYZ/synology_fhem_readings/readings1.txt
echo "$core3" >> /volume1/XYZ/synology_fhem_readings/readings1.txt

HDD1=$(smartctl -d sat -A /dev/sda | grep -i Temperature_Celsius | tr -s ' ' | cut -d\  -f 10 | sed 's/$/.0/')
HDD2=$(smartctl -d sat -A /dev/sdb | grep -i Temperature_Celsius | tr -s ' ' | cut -d\  -f 10 | sed 's/$/.0/')
HDD3=$(smartctl -d sat -A /dev/sdc | grep -i Temperature_Celsius | tr -s ' ' | cut -d\  -f 10 | sed 's/$/.0/')
HDD4=$(smartctl -d sat -A /dev/sdd | grep -i Temperature_Celsius | tr -s ' ' | cut -d\  -f 10 | sed 's/$/.0/')

echo "$HDD1" >> /volume1/XYZ/synology_fhem_readings/readings1.txt
echo "$HDD2" >> /volume1/XYZ/synology_fhem_readings/readings1.txt
echo "$HDD3" >> /volume1/XYZ/synology_fhem_readings/readings1.txt
echo "$HDD4" >> /volume1/XYZ/synology_fhem_readings/readings1.txt

UPTIME1=$(uptime | awk '{print $3" "$4}' | cut -d ',' -f1)
echo "$UPTIME1" >> /volume1/XYZ/synology_fhem_readings/readings1.txt

DISKUSAGE1=$(df | tr -s ' ' $'\t' | grep cachedev_0 | cut -f5)
DISKUSAGE2=$(df | tr -s ' ' $'\t' | grep volume_2 | cut -f5)


echo "$DISKUSAGE1" >> /volume1/XYZ/synology_fhem_readings/readings1.txt
echo "$DISKUSAGE2" >> /volume1/XYZ/synology_fhem_readings/readings1.txt


Dann habe ich auf dem NAS unter Systemsteuerung->Aufgabenplanung eine Aufgabe für das Script angelegt
(Erstellen->Geplante Aufgabe->Benutzerdefiniertes Script). Unter Zeitplan habe ich die Ausführung alle 5 Minuten ausgewählt.
In der Registerkarte "Aufgabeneinstellungen" habe ich bei "Befehl ausführen" folgendes eingetragen:
bash /volume1/XYZ/synology_fhem_readings/synology_fhem.sh

Mein fhem Server hat das Laufwerk des NAS unter /mnt/ gemountet.
Das fhem Device welches nun alle 6 Minuten die erzeugte Datei des Nas einliest sieht so aus:

defmod NAS CustomReadings
attr NAS interval 360
attr NAS readingDefinitions Core0_Temp:{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});;if ($error) {return $error} else {return $content[0]} },Core1_Temp:{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});;if ($error) {return $error} else {return $content[1]} },Core2_Temp:{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});;if ($error) {return $error} else {return $content[2]} },Core3_Temp:{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});;if ($error) {return $error} else {return $content[3]} },HDD1_Temp:{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});;if ($error) {return $error} else {return $content[4]} },HDD2_Temp:{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});;if ($error) {return $error} else {return $content[5]} },HDD3_Temp:{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});;if ($error) {return $error} else {return $content[6]} },HDD4_Temp:{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});;if ($error) {return $error} else {return $content[7]} },Uptime:{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});;if ($error) {return $error} else {return $content[8]} },Raid1_Usage:{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});;if ($error) {return $error} else {return $content[9]} },Raid2_Usage:{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});;if ($error) {return $error} else {return $content[10]} }
attr NAS room Ankleidezimmer

setstate NAS OK
setstate NAS 2020-05-26 12:38:00 Core0_Temp 34.0
setstate NAS 2020-05-26 12:38:00 Core1_Temp 35.0
setstate NAS 2020-05-26 12:38:00 Core2_Temp 33.0
setstate NAS 2020-05-26 12:38:00 Core3_Temp 33.0
setstate NAS 2020-05-26 12:38:00 HDD1_Temp 28.0
setstate NAS 2020-05-26 12:38:00 HDD2_Temp 29.0
setstate NAS 2020-05-26 12:38:00 HDD3_Temp 29.0
setstate NAS 2020-05-26 12:38:00 HDD4_Temp 28.0
setstate NAS 2020-05-26 12:38:00 Raid1_Usage 44%
setstate NAS 2020-05-26 12:38:00 Raid2_Usage 9%
setstate NAS 2020-05-26 12:38:00 Uptime 19:39
setstate NAS 2020-05-26 12:38:00 state OK

amenomade

Zitat von: Nitaro am 23 Mai 2020, 20:16:47
if ($error) {return $error} else {return $content[1]}
Lief bei mir zwar wieder auf einen Fehler, aber ohne funktioniert es prima  :)
Vielen Dank Euch beiden !
Natürlich hattest Du auch am Anfang my ($error, @content) geändert, und das letzte } nicht vergessen? ;)

Aber wiederum: man kann die Befehle direkt im Eingabefeld von Fhem inkl. die { } testen! So sieht man sofort, was der Fehler ist. Auch ggf wenn es ein Syntax-Fehler ist.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Nitaro

Zitat von: amenomade am 23 Mai 2020, 20:50:34
Natürlich hattest Du auch am Anfang my ($error, @content) geändert, und das letzte } nicht vergessen? ;)
Natürlich hatte ich das $error am Anfang nicht aber die } am Ende  ;D

Wenn ich mal ganz viel Geduld aufbringen kann, versuche ich der
der Perl Syntax nochmal die Freundschaft anzubieten  :)

Nitaro

Kann mir noch mal bitte jemand bei der Syntax helfen ?

Ich habe den obrigen Vorschlag mit $error versucht einzubauen, das sieht dann wie folgt aus:
{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});if ($error) {return $error} else {return $content[9]} }

Ich bekomme bei dem Versuch, die über die Kommandozeile dann die Fehlermeldung:
Unknown command {, try help.
IF: no left bracket:  {return $error} else {return $content[9]} }


Wo hab ich da den Fehler ?

TomLee

Für die Kommandozeile nimm mal zwei Semikolon:

Zitat{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});;if ($error) {return $error} else {return $content[9]} }

Bekomme zwar ne 1 zurück, das aber denk ich korrekt so, keine Meldung im Log.

Nitaro

#22
Danke, das funktionert...etwas  :D
Er gibt den Wert aus Zeile 10 der Textdatei zurück, nicht wie angegeben aus der 9.
Auch wenn ich das so unter readingDefinitions eintrage:
Uptime:{ my ($error,@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});if ($error) {return $error} else {return $content[9]} }
Erhalte ich den Wert aus Zeile 10.

Wenn ich es, so wie ich es hatte ohne error, eintrage:
Uptime:{ my (@content) = FileRead({FileName => "/mnt/XYZ/synology_fhem_readings/readings1.txt", ForceType => "file"});return $content[9] }
Erhalte ich den Wert aus Zeile 9

TomLee

ZitatEr gibt den Wert aus Zeile 10 der Textdatei zurück, nicht wie angegeben aus der 9.
Auch wenn ich das so unter readingDefinitions eintrage:

Ist bei mir auch so, habs nochmal ausprobiert.
Das 1 bei mir zurückkam lag daran das ich wegen schnell schnell das 9. Element (wie du) versucht hatte auszulesen, welches bei meiner Testdatei nicht existiert  ::), die Datei hat nur 3 Zeilen.

Nitaro

#24
Ich bekomme den Wert der ersten Zeile mit Hilfe von [0] und nicht mit [1].
Sieht aus als würde die Zählweise jetzt bei 0 beginnen.