fireworker72
Anmeldungsdatum: 11. März 2017
Beiträge: Zähle...
|
Hallo freunde Ich hab eine Datei mit folgendem Inhalt (Auszug) | <GroupAddress Name="Temperatur erweiterungsmodul" Address="0/2/9" DPTs="DPST-9-1" />
<GroupAddress Name="Licht tv schalten" Address="0/2/10" DPTs="DPT-1" />
<GroupAddress Name="Licht tv dimmen" Address="0/2/11" DPTs="DPST-3-7" />
<GroupAddress Name="Licht zimmer schalten" Address="0/2/12" DPTs="DPT-1" />
<GroupAddress Name="Licht zimmer dimmen" Address="0/2/13" DPTs="DPST-3-7" />
<GroupAddress Name="Geräte ein aus" Address="0/2/14" DPTs="DPT-1" />
<GroupAddress Name="Temperatur 3fach Tür Küche" Address="0/2/15" DPTs="DPST-9-1" />
<GroupAddress Name="Szene Badezimmer aktiv RM" Address="0/2/16" DPTs="DPT-1" />
<GroupAddress Name="Licht Spiegel Schalten" Address="0/2/17" DPTs="DPT-1" />
<GroupAddress Name="STellgrösse heizen" Address="0/2/18" />
|
Ich möchte diese jetzt einlesen so das z.B.: die Variable 0/2/9 den Wert 9.001 hat
oder 0/2/12 den Wert 1.000
oder 0/2/13 den Wert 3.007 Irgendwie weiß ich da jetzt nicht wie ich es angehen soll Bitte daher um eure Hilfe LG
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Um XML in der Bash zu verarbeiten gibt es Tools wie xmlstarlet. Variablennamen in der Bash dürfen nicht mit einer Ziffer beginnen und keine Sonderzeichen (wie Pfadtrenner) enthalten - man könnte sowas wie '0/2/9' höchstens als Key in einem Assoziativen Array speichern - und mir ist noch nicht klar, woher die Werte kommen sollen.
|
fireworker72
(Themenstarter)
Anmeldungsdatum: 11. März 2017
Beiträge: 64
|
Servus Die werte kommen aus einem Programm und stehen fix in der Datei (wird einmal Angelegt) Ich lese in Bash Werte von einem Bus ein z.B. Ga 0/2/12 "wert" und müsste die dann mit dem hinterlegten Wert aus der Var 0/2/12 vergleichen if [ 0/2/12 = 1.001 ]
then
irgendwas if [ 0/2/12 = 3.007 ]
then
irgendwas anderes
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4378
Wohnort: Göttingen
|
Hm, den in deinem Beispiel genannten Wert bei 0/2/12 kann ich gar nicht sehen. Hast Du vielleicht mal ein "echtes" Beispiel der XML?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Mir ist immer noch nicht klar, wie der Algorithmus aussieht, der da umgesetzt werden soll. Tun wir mal so, als ob es eine Named Pipe gäbe, aus der zeilenweise drei mit Whitespace getrennte Werte purzeln, von denen nur die beiden letzten interessant sind:
| declare -A ref
ref['0/2/12']='1.001'
ref['0/2/13']='3.007'
while read -r _ name value;
do
[ "${ref[$name]}" = "$value" ] && echo "value for $name equals reference value $value"
done < /pfad/zur/named_pipe
|
|
fireworker72
(Themenstarter)
Anmeldungsdatum: 11. März 2017
Beiträge: 64
|
Doc_Symbiosis schrieb: Hm, den in deinem Beispiel genannten Wert bei 0/2/12 kann ich gar nicht sehen. Hast Du vielleicht mal ein "echtes" Beispiel der XML?
Hier steht er <GroupAddress Name="Licht zimmer schalten" Address="0/2/12" DPTs="DPT-1" /> Ich weiß auch nicht ob das überhaupt ein richtiges xml ist wird halt vom Programm so gespeichert (siehe Anhang) LG
- peter.xml (46.4 KiB)
- Download peter.xml
|
fireworker72
(Themenstarter)
Anmeldungsdatum: 11. März 2017
Beiträge: 64
|
Also nochmal zur Sicherheit Ich lese vom KNX Bus Hex Werte ein die Ich in Adresse und Wert aufteile. in der Var $Ga steht (nach dem umwandeln) die Adresse in form x/x/x und in der Var $state stehen die restlichen Hexwerte die da so kommen. (das funktioniert auch schon alles) auf der anderen Seite hab Ich eine Datei in der definiert ist welchen DPT Wert die eingelesene Gruppenadresse hat. Und je nachdem welcher DPT Wert da steht muss Ich zur Berechnung des Wertes von $state in irgend ein bestimmtes Case springen LG
|
fireworker72
(Themenstarter)
Anmeldungsdatum: 11. März 2017
Beiträge: 64
|
seahawk1986 schrieb: Um XML in der Bash zu verarbeiten gibt es Tools wie xmlstarlet. Variablennamen in der Bash dürfen nicht mit einer Ziffer beginnen und keine Sonderzeichen (wie Pfadtrenner) enthalten - man könnte sowas wie '0/2/9' höchstens als Key in einem Assoziativen Array speichern - und mir ist noch nicht klar, woher die Werte kommen sollen.
Hmmm ich hab aber genau solche werte 0/0/0 in der Var stehen (die Lese Ich vom KNX-Bus ein)
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
fireworker72 schrieb: Hmmm ich hab aber genau solche werte 0/0/0 in der Var stehen (die Lese Ich vom KNX-Bus ein)
Ja, als Wert einer Variable ist das kein Problem (das darf eine beliebige Byte-Abfolge sein), aber man kann das nicht als Variablenname nehmen. fireworker72 schrieb: Ich weiß auch nicht ob das überhaupt ein richtiges xml ist wird halt vom Programm so gespeichert (siehe Anhang)
Das ist richtiges XML, aber mir ist immer noch nicht klar, wie das bei der Zuordnung der Werte helfen soll... - an die Werte der Address-Attribute aus der XML-Datei kommt man z.B. so:
xmlstarlet sel -T -t -v '//_:GroupAddress/@Address' -n peter.xml
|
fireworker72
(Themenstarter)
Anmeldungsdatum: 11. März 2017
Beiträge: 64
|
seahawk1986 schrieb:
Das ist richtiges XML, aber mir ist immer noch nicht klar, wie das bei der Zuordnung der Werte helfen soll... - an die Werte der Address-Attribute aus der XML-Datei kommt man z.B. so:
xmlstarlet sel -T -t -v '//_:GroupAddress/@Address' -n peter.xml
ankommend vom Bus ist:
DPT5.001 8-Bit Unsigned Value”
DPT7.001 2-Octet Unsigned Value”
DPT8.001 2-Octet Signed Value”
DPT8.001 2-Octet Float Value”
usw und je nachdem muss Ich die Werte nach ieeE 754 berechnen was müsste Ich da hinzufügen um z.B.: die Adresse 0/1/8 abzufragen? mit | xmlstarlet sel -T -t -v '//_:GroupAddress/@Address' -n peter.xml
|
wirft er mir nur alle Adressen aus
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Was willst du denn genau an Werten sehen? So gibt er z.b. das komplette XML-Element mit dem Attribut Address='0/1/8' aus:
$ xmlstarlet sel -t -c "//_:GroupAddress[@Address='0/1/8']" -n peter.xml
<GroupAddress xmlns="http://knx.org/xml/ga-export/01" Name="Wandleuchte" Address="0/1/8"/>
Und so nur den Namen:
$ xmlstarlet sel -t -v "//_:GroupAddress[@Address='0/1/8']/@Name" -n peter.xml
Wandleuchte
|
fireworker72
(Themenstarter)
Anmeldungsdatum: 11. März 2017
Beiträge: 64
|
seahawk1986 schrieb: Was willst du denn genau an Werten sehen? So gibt er z.b. das komplette XML-Element mit dem Attribut Address='0/1/8' aus:
$ xmlstarlet sel -t -c "//_:GroupAddress[@Address='0/1/8']" -n peter.xml
<GroupAddress xmlns="http://knx.org/xml/ga-export/01" Name="Wandleuchte" Address="0/1/8"/>
Und so nur den Namen:
$ xmlstarlet sel -t -v "//_:GroupAddress[@Address='0/1/8']/@Name" -n peter.xml
Wandleuchte
von <GroupAddress Name="Temperatur erweiterungsmodul" Address="0/2/9" DPTs="DPST-9-1" /> den Wert DPST-9-1 oder noch besser nur 9-1
|
fireworker72
(Themenstarter)
Anmeldungsdatum: 11. März 2017
Beiträge: 64
|
Ich habs xmlstarlet sel -t -v "//_:GroupAddress[@Address='0/2/9']/@DPTs" 😉 Danke für eure Hilfe
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Mit sinnvoll gewählten Beispielen wäre das erheblich schneller gegangen.. 😉
|
fireworker72
(Themenstarter)
Anmeldungsdatum: 11. März 2017
Beiträge: 64
|
Sorry aber wie hätt ich es darstellen/Beschreiben sollen? damit es beim nächsten mal besser ist
|