[gelöst mit RSS] lcd4linux mit Werten aus fhem

Begonnen von matze1999, 06 Juli 2023, 18:24:39

Vorheriges Thema - Nächstes Thema

matze1999

Hallo,

dazu gibt es ein umfangreiches Howto, mit Hilfe dessen ich schon Fotos und das Datum auf meinen "Bilderrahmen" zaubern kann.

Jetzt möchte ich gern, wie im Howto beschrieben, Werte aus fhem auf dem Bilderrahmen ausgeben, erst mal nur die Außentemperatur, im Howto gibt es ein Script dafür, welches ich richtig verstehen möchte:

Am Anfang stehen folgende Zeilen, die ich überhaupt nicht deuten kann:

round()
{
echo $(LANG=C printf %.$2f $(echo "scale=$2;(((10^$2)*$1)+0.5)/(10^$2)" | bc))
};
#
arg=$1

Dann wird es für mich interessant:

#-- get FHEM values
alarm='{Value("WZ.SPF.alarm")."|"}'
warn='{Value("WZ.SPF.warn")."|"}'
scharf='{AttrVal("AAA","level6xec","")}'
aowb='{Value("A.OWB")}'
aowbt='{Value("A.OWB.T")}'
wzowm='{Value("WZ.OWM")}'
nt5000a='{$defs{"nt5000"}{"STATE"}}'
nt5000b='{$defs{"nt5000"}{"READINGS"}{"Wd"}{"VAL"}}'
everb='{Value("E.Verb")}'
gverb='{Value("G.Verb")}'
FHEM=`echo -e "$alarm;$warn;$scharf;$aowb;$aowbt;$wzowm;$everb;$gverb;$nt5000b;$nt5000a" | socat -t50 - TCP:<IP-Adresse von FHEM>
#

In der letzten Zeile aus dem Howto scheint am Ende das ` zu fehlen?

Das habe ich mal genutzt bekomme aber einen Fehler dafür:

socat -t50 - TCP:192.168.1.135
Fehler:

socat[4136716] E TCP: wrong number of parameters (1 instead of 2)
Müsste da nicht noch irgendein Port dazu, welcher?

Dann möchte ich Werte aus fhem lesen, dazu dienen diese Zeilen, wie kommt dieses script an die Werte?:

awst='{Value("MQTT2_DVES_6CA8FD")}'
Mein Device dazu wäre:

attr MQTT2_DVES_6CA8FD stateFormat APDS9960_Illuminance lx | BME280_Temperature °C | BME280_Humidity % | BME280_Pressure hPa
Dann werde aus den eingelesenen Werten die einzelnen Daten separiert, hier wüsste ich gern, was die Zeilen bedeuten:

#--isolate separate values
FHEM3=`echo $FHEM |  cut -d '|' -f3`
rHa=$(round `echo $FHEM3 | awk '{print $3}'` 0)
Ta=$(round `echo $FHEM3 | awk '{print $15}'` 1)
pa=$(round `echo $FHEM3 | awk '{print $12}'` 0)
#

Damit kann ich gar nichts anfangen, brauch ich sicher auch nicht, weil ich keinen Alarm habe:

if [ "$arg" == "show" ]; then
  echo "alarm=$alarm warn=$warn => $scharf; Climate=>$rHa $Ta $pa $rHi $Ti; PV=> $pvpraw $pvp $pvw; EV=> $evp $evw; GV=>$gvp $gvw"
fi

Dann kommt nur noch der Abschnitt, der die scripte aufruft und die Daten übergibt, damit die Bilder für lcd4linux erstellt werden können.

#--create bar graphs
./createTemp.sh $Ta $rHa $pa &
./createDate.sh &

matze1999



matze1999

so, den ersten Fheler habe ich weg:

socat[4136716] E TCP: wrong number of parameters (1 instead of 2)
ich hab jetzt den Telnet Port genommen:

define telnetPort telnet 7072 global
aber dieser Teil:

FHEM3=`echo $FHEM |  cut -d '|' -f3`
rHa=$(round `echo $FHEM3 | awk '{print $3}'` 0)
Ta=$(round `echo $FHEM3 | awk '{print $15}'` 1)
pa=$(round `echo $FHEM3 | awk '{print $12}'` 0)

bringt mir mehrere Zeilen

(standard_in) 1: syntax error

betateilchen

#2
Noch habe ich nicht verstanden, was jetzt die konkrete Frage ist.

Du verwendest ein Skript, das Du nicht verstehst, für eine Installation, die wahrscheinlich komplett anders ist, als die im Beispiel verwendete und wunderst Dich über Ergebnisse, die nicht passen oder erst gar nicht ermittelt werden?

Und dann kippst Du das alles einfach in die Anfängerfragen anstatt in ein dafür passendes Unterforum? Dreist...

Zitat von: matze1999 am 06 Juli 2023, 18:24:39im Howto gibt es ein Script dafür, welches ich richtig verstehen möchte:
Am Anfang stehen folgende Zeilen, die ich überhaupt nicht deuten kann:

round()
{
echo $(LANG=C printf %.$2f $(echo "scale=$2;(((10^$2)*$1)+0.5)/(10^$2)" | bc))
};

Da wird innerhalb des bash-Skripts eine Funktion mit dem Namen "round()" definiert, die nichts weiter tut, als einen übergebenen Zahlenwert ($1) auf eine bestimmte Anzahl von Nachkommmastellen ($2) zu runden und und zurückzugeben.

Zitat von: matze1999 am 06 Juli 2023, 18:24:39arg=$1

Hat nix mit der darüber stehenden Funktionsdefinition zu tun, sondern weist den ersten Aufrufparameter der bash-Datei der Variablen arg zu.

Zitat von: matze1999 am 06 Juli 2023, 18:31:39aber dieser Teil:

FHEM3=`echo $FHEM |  cut -d '|' -f3`
rHa=$(round `echo $FHEM3 | awk '{print $3}'` 0)
Ta=$(round `echo $FHEM3 | awk '{print $15}'` 1)
pa=$(round `echo $FHEM3 | awk '{print $12}'` 0)

bringt mir mehrere Zeilen

(standard_in) 1: syntax error

Vielleicht, weil Dir die darin aufgerufene Funktion round() fehlt?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

matze1999

In welches Unterforum gehört denn das? Dann bitte dorthin verschieben.

Leider ist das HowTo das einzige, was dazu zu finden ist, Bild und Datum zeigt es bei mir schon an, jetzt soll es noch einige Werte aus fhem anzeigen.

die konkrete Frage ist: was bedeuten diese Zeichenketten:

FHEM=`echo -e "$alarm;$warn;$scharf;$aowb;$aowbt;$wzowm;$everb;$gverb;$nt5000b;$nt5000a" | socat -t50 - TCP:<IP-Adresse von FHEM> hier werden die Readings aus fhem geholt, hier fehlt im HowTo der Port, und um welchen Port handelt es sich, den Telnet Port von fhem?

aowb='{Value("A.OWB")}' die holt einen Wert von einem fhem Device? Welches Reading?

FHEM3=`echo $FHEM |  cut -d '|' -f3` hier wird etwas herausgeschnitten (Wahrscheinlich Messwerte) (wei kann man herausfinden was und wie?)

Ta=$(round `echo $FHEM3 | awk '{print $15}'` 1) die extrahiert den entsprechnden Wert aus den Readings (?) des fhem Devices ? wie kann man so was prüfen?

Ich programmiere nicht häufig, eigentlich gar nicht. Ich denke das sind Anfängefragen.

Wenn das zu Dreist... ist, dann bitte den Thread löschen.

matze1999

betateilchen

Verschiebe bitte Deinen Thread erstmal in ein passendes Forum, dann können wir weitermachen.

Da in lcd4linux ja schon ein passender Bereich drinsteckt, schlage ich vor, den Thread dorthin zu verschieben. Es geht ja letztendlich um ein bash skript, das unter Linux ausgeführt werden soll.

Verschieben kannst Du selbst erledigen. Am Ende der Seite gibt es dafür einen Button "Thema verschieben".
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

matze1999

Also ich habe ein fhem Device:

efmod MQTT2_DVES_6CA8FD MQTT2_DEVICE DVES_6CA8FD
attr MQTT2_DVES_6CA8FD alias Wetterstation
attr MQTT2_DVES_6CA8FD autocreate 0
attr MQTT2_DVES_6CA8FD comment NOTE: For on-for-timer SetExtensions are used. You may add on-for-timer option running on the device. The following is limited to 1h max duration, but will not affect future simple "on" commands:<br>on-for-timer {my $duration = $EVTPART1*10;; 'cmnd/cmnd/tasmota_6CA8FD/Backlog POWER1 1;; delay '.$duration.';; POWER1 0'}<br>See the "Praxisbeispiele" in the wiki for "pulseTime1" alternative option and it's restrictions.
attr MQTT2_DVES_6CA8FD devStateStyle style="text-align:left;;font-weight:bold;;"
attr MQTT2_DVES_6CA8FD genericDeviceType switch
attr MQTT2_DVES_6CA8FD group GartenSensor
attr MQTT2_DVES_6CA8FD icon temp_temperature
attr MQTT2_DVES_6CA8FD jsonMap POWER1:0 POWER2:0 POWER3:0 POWER4:0 Dimmer:0 Channel_0:0 Channel_1:0 Channel_2:0 Channel_3:0 Channel_4:0 HSBColor:0 Color:0
attr MQTT2_DVES_6CA8FD model tasmota_basic_state_power1
attr MQTT2_DVES_6CA8FD readingList tele/tasmota_6CA8FD/LWT:.* LWT\
  tele/tasmota_6CA8FD/STATE:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  tele/tasmota_6CA8FD/SENSOR:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  tele/tasmota_6CA8FD/INFO.:.* { $EVENT =~ m,^..Info[1-3]..(.+).$, ?  json2nameValue($1,'',$JSONMAP) : json2nameValue($EVENT,'',$JSONMAP) }\
  tele/tasmota_6CA8FD/UPTIME:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  stat/tasmota_6CA8FD/POWER1:.* state\
  stat/tasmota_6CA8FD/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr MQTT2_DVES_6CA8FD room Garten,MQTT2_DEVICE
attr MQTT2_DVES_6CA8FD sortby -1
attr MQTT2_DVES_6CA8FD stateFormat APDS9960_Illuminance lx | BME280_Temperature °C | BME280_Humidity % | BME280_Pressure hPa

Daraus würde ich gern die readings:

READINGS:
     2023-07-06 19:30:03   APDS9960_Illuminance 220
     2023-07-06 19:30:03   BME280_Humidity 31.5
     2023-07-06 19:30:03   BME280_Pressure 1005.3
     2023-07-06 19:30:03   BME280_Temperature 27.7

per script heraus nehmen und mittels anderen scripten png Grafiken für lcd4linux erstellen.

matze1999

matze1999

soweit ich das übersehen kann wird im Howto hier zusammengestellt, welche Readings abgefragt werden sollen:

#-- get FHEM values
alarm='{Value("WZ.SPF.alarm")."|"}'
warn='{Value("WZ.SPF.warn")."|"}'
scharf='{AttrVal("AAA","level6xec","")}'
aowb='{Value("A.OWB")}'
aowbt='{Value("A.OWB.T")}'
wzowm='{Value("WZ.OWM")}'
nt5000a='{$defs{"nt5000"}{"STATE"}}'
nt5000b='{$defs{"nt5000"}{"READINGS"}{"Wd"}{"VAL"}}'
everb='{Value("E.Verb")}'
gverb='{Value("G.Verb")}'

mittels folgender Zeile wird das dann von fhem geholt:

FHEM=`echo -e "$alarm;$warn;$scharf;$aowb;$aowbt;$wzowm;$everb;$gverb;$nt5000b;$nt5000a" | socat -t50 - TCP:<IP-Adresse von FHEM
in meinem Fall könnte es so aussehen:
#-- get FHEM values
aw='{Value("MQTT2_DVES_6CA8FD")}'

FHEM=`echo -e "aw" | socat -t50 - TCP:192.168.1.135:7072
Hier ist die Frage, ob das über den Telnet Port geht.

Kann man das per Kommandozeile prüfen?

betateilchen

Zitat von: matze1999 am 06 Juli 2023, 19:26:35die konkrete Frage ist: was bedeuten diese Zeichenketten:

FHEM=`echo -e "$alarm;$warn;$scharf;$aowb;$aowbt;$wzowm;$everb;$gverb;$nt5000b;$nt5000a" | socat -t50 - TCP:<IP-Adresse von FHEM>
hier werden die Readings aus fhem geholt, hier fehlt im HowTo der Port

Dass da irgendwo ein ` fehlt, ist korrekt. Aber da fehlt kein Port.
Hier solltest Du die manpage zu socat lesen, um zu verstehen, dass im verwendeten Platzhalter "<IP-Adresse von FHEM>" sowohl die IP-Adresse als auch der port angegeben wird (z.B. 192.168.123.234:80)

Zitat von: matze1999 am 06 Juli 2023, 19:26:35um welchen Port handelt es sich, den Telnet Port von fhem?

Naja, es handelt sich um den port auf dem Zielhost, auf dem der per echo ausgegebene Inhalt landen soll. Im Normalfall wird das der telnet port von FHEM sein. Hier solltest Du vielleicht nochmal die Grundlagen zu FHEM lesen, insbesondere die commandref zu telnet und die Beschreibung, wie man generell Befehle von außen an FHEM schicken kann.
 
Zitat von: matze1999 am 06 Juli 2023, 19:26:35aowb='{Value("A.OWB")}'
die holt einen Wert von einem fhem Device? Welches Reading?

Was passiert, wenn Du {Value("A.OWB")} in die FHEM Befehlszeile eingibst?
Mit der Funktion Value() wird kein Reading geholt, sondern der Inhalt des Internals STATE.
Siehe meine oben genannte Empfehlung zu "Grundlagen von FHEM".

Zitat von: matze1999 am 06 Juli 2023, 19:26:35FHEM3=`echo $FHEM |  cut -d '|' -f3` hier wird etwas herausgeschnitten (Wahrscheinlich Messwerte)
(wie kann man herausfinden was und wie?)

Hier solltest Du die manpage zu "cut" lesen und verstehen.

Hier wird per Konsolenbefehl "echo" der Variableninhalt von $FHEM per pipe (|) an das Programm "cut" übergeben, dieser Input wird anhand des Trennzeichens '|' gesplittet und das dritte Feld (-f3) zurückgegeben und der Variablen FHEM3 zugewiesen.

Zitat von: matze1999 am 06 Juli 2023, 19:26:35Ich programmiere nicht häufig, eigentlich gar nicht. Ich denke das sind Anfängefragen.

Das sind keine Anfängerfragen, und schon gar keine FHEM-spezifischen Fragen.

Hier geht es um Basiswissen zu Linux, insbesondere zum Thema Skript-Programmierung in der Shell, und das hat mit FHEM primär nichts zu tun. Dieses Grundwissen musst Du Dir einfach aneignen, um zu verstehen, was das von Dir entdeckte Skript eigentlich tut.

Auch die im Skript verwendeten Programme "awk" und "sed" sind Linux Kommandos, zu denen Du einfach die manpages lesen musst. Auf die Beschreibung ihrer Verwendung im Skript habe ich jetzt der Einfachheit halber verzichtet.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Vielleicht solltest Du erstmal Antworten abwarten, bevor Du schon wieder zwei neue Beiträge mit Fragen produzierst. Da könnte sonst ein heilloses Durcheinander werden.

Warum verwendest Du nicht einfach ein RSS oder ein InfoPanel device, um die komplette Ausgabe zu erzeugen und an die Anzeige zu übertragen?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

matze1999

dann muss ich mich mal mit diesen alternativen beschäftigen, bei mir scheitert es aktuell daran, dass socat ein Password benötigt und ich nirgends finden kann, wie man mit socat ein Passwort übergibt. (Ich kann mich gar nicht erinnern, dass ich die telnet schnittstelle per Password gesichert habe.

pi@fhem:~ $ sudo echo -e "$aw" | sudo socat -t50 - TCP4:192.168.1.135:7072
��Password: ��

Und ich weiss nicht, wie ich aus dem Value:

147 lx | 26.8 °C | 32.4 % | 1005.4 hPa
mittels $....

awk '{print $15}'
den Temperaturwert bekomme.

Danke, ich werde mich wohl mit den Alternativen beschäftigen müssen.

matze1999

betateilchen

Zitat von: matze1999 am 06 Juli 2023, 20:49:55Und ich weiss nicht, wie ich aus dem Value:

147 lx | 26.8 °C | 32.4 % | 1005.4 hPa
den Temperaturwert bekomme.


Eigentlich hatte ich das oben schon erklärt:

ZitatHier wird per Konsolenbefehl "echo" der Variableninhalt von $FHEM per pipe (|) an das Programm "cut" übergeben, dieser Input wird anhand des Trennzeichens '|' gesplittet und das dritte Feld (-f3) zurückgegeben und der Variablen FHEM3 zugewiesen.

Bei Dir ist halt der Temperaturwert im zweiten Feld, also:

echo "147 lx | 26.8 °C | 32.4 % | 1005.4 hPa" | cut -d '|' -f2
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: matze1999 am 06 Juli 2023, 20:49:55bei mir scheitert es aktuell daran, dass socat ein Password benötigt und ich nirgends finden kann, wie man mit socat ein Passwort übergibt.

Die Passwortabfrage kommt doch nicht aus telnet oder socat, sondern aus dem sudo. Lass das sudo einfach weg.

echo -e {Debug \'123\'} |socat -t50 - TCP4:localhost:7072
erzeugt bei mir völlig problemlos einen Logeintrag in FHEM.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

matze1999

leider nein:

pi@fhem:~ $ echo -e {Debug \'123\'} |socat -t50 - TCP4:localhost:7072
��Password: ��

matze1999

xenos1984

Dafür einen ganzen Haufen Bash-Skripte, ImageMagick etc. zu bemühen erscheint mir unnötig kompliziert. Ich nutze dafür das RSS-Modul, um direkt in FHEM eine Grafik zu erzeugen. Die wird auf dem Zielrechner per HTTP (z.B. wget) abgerufen und in lcd4linux angezeigt.

betateilchen

Das RSS hatte ich ja auch schon als Alternative vorgeschlagen, zumal, wenn man solch umfangreiche Lücken im Wissen über Linux, shell etc. hat.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!