Author Topic: Shell Bindings Prototyp  (Read 3016 times)

photron

  • Tinkerforge Staff
  • Administrator
  • Hero Member
  • *****
  • Posts: 2.475
    • View Profile
Shell Bindings Prototyp
« on: April 22, 2013, 16:11:19 »
Da das doch recht schnell von der Hand ging hier mal ein erster Prototyp der Shell Bindings. Sie basieren auf den Python Bindings und die Kommandozeilenbehandlung ist mit argparse gemacht. Dadurch wird mindestens Python 2.7 benötigt.

Enumerate

Ein Enumerate mit Standardausgabe:

Code: [Select]
$ ./tinkerforge enumerate
uid=68aT1f
connected-uid=0
position=b'0'
hardware-version=1,0,0
firmware-version=2,0,6
device-identifier=13
uid=SCT31
connected-uid=68aT1f
position=b'a'
hardware-version=1,1,0
firmware-version=2,0,0
device-identifier=216

Ein Enumerate mit --execute. Alle Parameter des Enumerate Callbacks werden durch Leerzeichen getrennt an die --execute Befehlszeile angehängt und dann das Ergebnis ausgeführt:

Code: [Select]
$ ./tinkerforge enumerate --execute echo
68aT1f 0 0 1,0,0 2,0,6 13 0
SCT31 68aT1f a 1,1,0 2,0,0 216 0

Ein Enumerate mit --execute und --replace. Das --replace Flag sorgt dafür, dass auf die --execute Befehlszeile die format Funktion aus Python angewandt wird:

Code: [Select]
$ ./tinkerforge enumerate --execute "echo {uid} {device-identifier}" --replace
68aT1f 13
SCT31 216

Funktionen

Temperaturabfrage eines Temperature Bricklets mit UID SCT31:

Code: [Select]
$ ./tinkerforge call temperature-bricklet --uid SCT31 get-temperature
temperature=2325

Auch hier funktionieren --execute und --replace:

Code: [Select]
$ ./tinkerforge call temperature-bricklet --uid SCT31 get-temperature --execute 'echo "scale=2; {temperature} / 100" | bc | xargs printf "Die Temperatur beträgt: %s °C\n" ' --replace
Die Temperatur beträgt: 23.18 °C

Callbacks

Aufruf der set-temperature-callback-period Funktion des Temperature Bricklets mit UID SCT31:

Code: [Select]
$ ./tinkerforge call temperature-bricklet --uid SCT31 set-temperature-callback-period 500
Auf Callbacks warten:

Code: [Select]
$ python3 ./tinkerforge dispatch temperature-bricklet --uid SCT31 temperature
temperature=2418
temperature=2431

Auch hier funktionieren --execute und --replace:

Code: [Select]
./tinkerforge dispatch temperature-bricklet --uid SCT31 temperature --execute 'echo "scale=2; {temperature} / 100" | bc | xargs printf "Die Temperatur beträgt: %s °C\n" ' --replace
Die Temperatur beträgt: 23.18 °C
Die Temperatur beträgt: 23.25 °C

Was haltet ihr davon?

FabianB

  • Sr. Member
  • ****
  • Posts: 285
    • View Profile
Re: Shell Bindings Prototyp
« Reply #1 on: April 22, 2013, 18:37:05 »
Sehr cool, nach so etwas hatte ich vor Ewigkeiten schonmal gefragt. Sieht auf den ersten Blick sehr gut aus. Ich habe leider gerade keine Zeit, das mal genauer zu betrachten und auszuprobieren. Das werde ich aber bald nachholen. Bis dahin: Weiter so.
Gruß,
FabianB

Loetkolben

  • Hero Member
  • *****
  • Posts: 1.178
    • View Profile
Re: Shell Bindings Prototyp
« Reply #2 on: April 23, 2013, 17:44:15 »
Hallo photron,

das sieht ja interessant aus und es funktioniert sogar. Herzlichen Glueckwunsch!  :)

Code: [Select]
# ./tinkerforge_shell_bindings.20130422.sh --host 192.168.1.40 --port 4223 call temperature-bricklet --uid abc get-temperature
temperature=2231


Das ist ja Python. :staun: Das muss ja installiert sein. Da wird es wohl kein Binary geben.  ;)

Quote
Dadurch wird mindestens Python 2.7 benötigt.
Das ist zumindest bei Debian sqeeze nicht richtig. An anderer Stelle habe ich schonmal gehakt. Es reicht hier Python 2.6:

Code: [Select]
# dpkg -l | grep python
ii  libapache2-mod-python              3.3.1-9+b1                   Python-embedding module for Apache 2
ii  libpython2.6                       2.6.6-8+b1                   Shared Python runtime library (version 2.6)
ii  python                             2.6.6-3+squeeze7             interactive high-level object-oriented language (default version)
ii  python-argparse                    1.1-1                        optparse-inspired command-line parsing library
ii  python-central                     0.6.16+nmu1                  register and build utility for Python packages
ii  python-minimal                     2.6.6-3+squeeze7             minimal subset of the Python language (default version)
ii  python-psyco                       1.6-2                        Python specializing compiler
ii  python-support                     1.0.10                       automated rebuilding support for Python modules
ii  python2.6                          2.6.6-8+b1                   An interactive high-level object-oriented language (version 2.6)
ii  python2.6-minimal                  2.6.6-8+b1                   A minimal subset of the Python language (version 2.6)

Quote
Ein Enumerate mit Standardausgabe:
Das sind also quasi Variablen die man mit "--execute" und "--replace" weiterverarbeiten kann!?

Quote
Das --replace Flag sorgt dafür, dass auf die --execute Befehlszeile die format Funktion aus Python angewandt wird:

Warum muss das sein und was ist "format Funktion aus Python"?


Callbacks habe ich nicht probiert, da ich sie nicht benoetige. Mal sehen was ich damit mache(n kann).

Viele Gruesse


Der Loetkolben

mchott

  • Jr. Member
  • **
  • Posts: 61
    • View Profile
Re: Shell Bindings Prototyp
« Reply #3 on: April 24, 2013, 08:13:03 »
Allein um mal lowlevel zu testen ist das eine gute Sache...sicher auch für die ShellPowerUser interessant.

photron

  • Tinkerforge Staff
  • Administrator
  • Hero Member
  • *****
  • Posts: 2.475
    • View Profile
Re: Re: Shell Bindings Prototyp
« Reply #4 on: April 24, 2013, 10:41:23 »
Das ist ja Python. :staun: Das muss ja installiert sein. Da wird es wohl kein Binary geben.  ;)

Der Vorteil an daran, dass in Python zu machen ist, dass es überall da funktioniert wo Python und argparse vorhanden sind. Wir müssen also nicht für n verschiedene Plattformen n verschiedene Binaries erstellen. Der Nachteil daran ist, dass Python benötigt wird, ja.

Quote
Dadurch wird mindestens Python 2.7 benötigt.
Das ist zumindest bei Debian sqeeze nicht richtig. An anderer Stelle habe ich schonmal gehakt. Es reicht hier Python 2.6:

Okay. Laut Python Dokumentation ist es seit 2.7 in der Standard Library. Das hindert Debian natürlich nicht daran das auch für Python 2.6 bereitzustellen :)

Quote
Ein Enumerate mit Standardausgabe:
Das sind also quasi Variablen die man mit "--execute" und "--replace" weiterverarbeiten kann!?

Quote
Das --replace Flag sorgt dafür, dass auf die --execute Befehlszeile die format Funktion aus Python angewandt wird:

Warum muss das sein und was ist "format Funktion aus Python"?

Ohne --execute werden die Ausgaben von Gettern und Enumerate als <key>=<value> per Zeile auf stdout ausgegeben. Das kannst du dann mit xargs, awk, etc weiterverarbeiten.

--execute ist einfach eine andere optionale Variante die Ausgabe zu verarbeiten/formatieren. Die ist z.B. mit Hinblick auf Windows gedacht, wo Sachen wie xargs und awk nicht so einfach zur Hand sind.

--execute nimmt einen Shell Befehl entgegen und hängt dann einfach alle Ausgabewerte an.

Code: [Select]
tinkerforge call temperature-bricklet --uid SCT31 get-temperature --execute "echo"
Hier wird dann "echo 2258" ausgeführt.

Mit --replace können im Shell Befehl Platzhalter verwendet werden. In diesem Fall {temperature}:

Code: [Select]
tinkerforge call temperature-bricklet --uid SCT31 get-temperature --execute "echo `date +%s` {temperature} >> t.log" --replace
Hier wird dann "echo `date +%s` 2258 >> t.log" ausgeführt.

Für diese Platzhalter wird einfach die Python format Funktion verwendet:

http://docs.python.org/2/library/string.html#format-examples

photron

  • Tinkerforge Staff
  • Administrator
  • Hero Member
  • *****
  • Posts: 2.475
    • View Profile
Re: Shell Bindings Prototyp
« Reply #5 on: April 24, 2013, 15:58:57 »
Und jetzt auch mit dem ersten Versuch für bash Completion. Dafür muss sich tinkerforge im PATH befinden, tinkerforge.bash_completion muss nach /etc/bash_completion.d/ und in tinkerforge umbenannt werden.

photron

  • Tinkerforge Staff
  • Administrator
  • Hero Member
  • *****
  • Posts: 2.475
    • View Profile
Re: Shell Bindings Prototyp
« Reply #6 on: August 14, 2013, 14:58:45 »
Die Shell Bindings sind nun veröffentlicht.