Jump to content

Shell Bindings Prototyp


Recommended Posts

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:

 

$ ./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:

 

$ ./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:

 

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

 

Funktionen

 

Temperaturabfrage eines Temperature Bricklets mit UID SCT31:

 

$ ./tinkerforge call temperature-bricklet --uid SCT31 get-temperature
temperature=2325

 

Auch hier funktionieren --execute und --replace:

 

$ ./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:

 

$ ./tinkerforge call temperature-bricklet --uid SCT31 set-temperature-callback-period 500

 

Auf Callbacks warten:

 

$ python3 ./tinkerforge dispatch temperature-bricklet --uid SCT31 temperature
temperature=2418
temperature=2431

 

Auch hier funktionieren --execute und --replace:

 

./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?

tinkerforge

Link zu diesem Kommentar
Share on other sites

Hallo photron,

 

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

 

# ./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.  ;)

 

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:

 

# 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)

 

Ein Enumerate mit Standardausgabe:

Das sind also quasi Variablen die man mit "--execute" und "--replace" weiterverarbeiten kann!?

 

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

 

Link zu diesem Kommentar
Share on other sites

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.

 

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 :)

 

Ein Enumerate mit Standardausgabe:

Das sind also quasi Variablen die man mit "--execute" und "--replace" weiterverarbeiten kann!?

 

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.

 

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}:

 

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

Link zu diesem Kommentar
Share on other sites

  • 3 months later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...