Skip to content

Logik Programmierung mit Eclipse und Remote Debug auf Smarthome.py

ratzi82 edited this page Jan 2, 2015 · 8 revisions

Einleitung

Da ab und zu hier im Forum schon nach IDE, Code Validierung und Debuging gefragt wurde, nachfolgend ein kleines Tutorial wie Logiken in Eclipse PyDev geschrieben werden können und als Remote Debug Process auf dem SH.py ausgeführt werden können.

Warum?

  • smarthome.py läuft auf Raspberry Pi und ist im Schaltschrank eingebaut. Zugriff nur über SSH
  • Code Entwicklung über Windows Laptop im Notepad++. Hat zwar Syntax Highlighting, zeigt aber keine Syntax Fehler an. Zeit verschwendet weil Punkt, Komma oder Strich fehlen.
  • Ein Einblick ins sh Framework würde sicherlich auch nicht schaden.

Lösung

  • Verwendung von Eclipse, einer genialen IDE und im Gegensatz zu Pycharm kostenlos
  • Verwendung des kostenlosen Remote Debuggers Pydev für Python

Die folgende Anleitung beschreibt die Installation von Eclipse auf einem Windows System sowie der Installation des Remote Debuggers Pydev auf dem smarthome.py Raspberry Image in der Version 2.1.

Voraussetzungen:

Damit der Remote Debugger pydevd später funktioniert müssen folgende Voraussetzungen erfüllt sein:

  • Auf Debug Server und Client muss die gleiche minor Version von Python laufen, momentan python 3.2
  • Auf Debug Server und Client muss die Source Code Datei exakt den gleichen Inhalt haben. Hierzu weiter unten noch ein Beispiel wie Server und Client auf die selbe Datei zugreifen können.
  • Java, Eclipse und Python laufen bei mir als 32bit auf der Windows Maschine. Mischen geht nicht, das hat mich einige Gläser Rotwein gekostet

Schritt 1

Downloads

Anmerkung: Eclipse gibt es auch schon als fertiges Eclipse PyDev Paket zum Download. Das hat bei mir aber Fehler verursacht. Daher Eclipse Standard und das PyDev Plugin selbst installieren, wie beschrieben.

Installation Python

Installer ausführen und am besten nach C:\python32 installieren.


Achtung Unbedingt beachten, dass der Installationspfad keine Leerzeichen enthält, also z.B. nicht nach "Program Files" da sonst PyDev nicht läuft.


Installation Eclipse

Zip File entpacken, Eclipse muss nicht installiert werden. Sollte Eclipse beim Start eine Fehlermeldung liefern, dann fehlt der Pfad zur Java in der Windows Pfadvariablen und muss nachgetragen werden. Die Erklärung spar ich mir, notfalls Herrn Google fragen.


Achtung Auch hier darauf achten, dass keine Leerzeichen im Installationspfad enthalten sind. Eclipse muss zur Installation von Plugins als Administrator ausgeführt werden!


Installation Pydev

In Eclipse unter "Help" --> "Install new Software" die Installationsmaske laden. Rechts auf Add und folgendes Repository hinzufügen.

Warten bis Eclipse die installierbaren Pakete anzeigt und dann unter PyDev "PyDev for Eclipse 3.2.1.20140109...." anhaken. Durchs Menü hangeln und warten bis Eclipse das PyDev Update installiert hat.


Achtung Nicht das http://pydev.org/update Repository verwenden, die 2013 Versionen liefern mit Python 3.2 einen Syntax Error


Eclipse Konfigurieren

--> "Window" --> "Preferences" --> "Pydev" --> "Interpreter" --> "Python Interpreter"

  • auf new klicken und die installiere python.exe auswählen
  • darauf hin werden automatisch einige PYTHONPATH Pfade ergänzt

Erstmal Lokal Testen

Jetzt ist Eclipse so konfiguriert, dass Lokal in Python programmiert und getestet werden kann.

Neues Projekt:

  • "File" --> "New" --> "Project"
  • Unter PyDev "PyDev Project" auswählen. Name vergeben und Interpreter auswählen.

Neues Module:

  • "File" --> "New" --> "Other"
  • "Pydev Module" auswählen.
  • Dateiname ohne Endung ".py" wählen.
  • Template "Empty" wählen.

Testprogramm:

#!/usr/bin/env python
#

x = 0

while x<100 :
  print(x)
  x = x+1

Jetzt wird man schon schnell merken, dass Eclipse immer sofort auf Fehler im Code hinweist. Das Leben kann so schön sein. Jetzt einfach mal auf "Run" drücken und dann sollten im Console Fenster die Zahlen 0 - 99 auftauchen.

Schritt 2

Wenn Eclipse und PyDev fehlerfrei läuft, kann es mit der Installation des Debuggers weitergehen.

Lokale Installation des Debuggers auf dem Windows Client

Der Debugger pydevd wird automatisch mit dem PyDev Paket mitgeliefert. Es muss nur noch ein PYTHONPATH auf das Folder gesetzt werden.

  • pydevd.py im Ordner Eclipse/plugins suchen und Dateipfad kopieren (z.B. bei mir unter: F:\eclipse\plugins\org.python.pydev_3.2.1.20140109 1857\pysrc)
  • --> "Window" --> "Preferences" --> "Pydev" --> "Interpreter" --> "Python Interpreter" öffnen
  • unter PYTHONPATH auf "New Folder" und den Pfad zur pydevd.py eintragen

Debugger Testen

  • --> "Windows" --> "Open Perspective" -->"Other" eine Debug Perspektive öffnen
  • im Python Script muss der Debugger zunächst mit "import pydevd" geladen werden.
  • ein breakpoint setzt man mit der Anweisung "pydevd.settrace("IP des Client")"

Code sollte dann so aussehen:

#!/usr/bin/env python
#

import pydevd

x = 0

while x<100 :
    print(x)
    pydevd.settrace("192.168.2.31")
    x = x+1

Jetzt den Debugger mit einem Klick auf das Käfersymbol starten und testen. Step over, into, etc. Zusätzliche Breakpoints einfach mit einem weiteren pydevd.settrace an einer anderen Stelle einfügen.


Achtung: Hier ist die IP des Rechners auf dem Eclipse läuft gemeint. Der Debugger warted dann später auf Befehle von Smarthome mit einem TCP Listen


Am Besten erst einmal mit der Funktion der Debug Perspektive vertraut machen. Step into, Step over, resume, etc. Rechts oben sieht man die Variablen und deren Inhalt. Dort wird später auch die Struktur von sh einsehbar sein.

Schritt 3

Achtung: Die Schritte im Teil 1 und Teil 2 beschränken sich auf den Client. Da kann man nichts kaputt machen. Jetzt muss aber mittels Shell auf smarthome gearbeitet werden. Hier also vorsichtig sein und lieber mal ein Backup fahren.

Installation des Debuggers auf dem Smarthome Server

Hierzu hab ich mich eigentlich weitestgehend an folgendes Tutorial gehalten:

Da mich das dennoch mehrere Stunden gekostet hat, nachfolgend einige Kommentare:

  • Als erstes muss das komplette pysrc Folder welches den pydevd enthält, per WinSCP oder über die Samba Freigabe auf den Raspberry kopiert werden.

  • Am besten jetzt einen Ordner "pysrc" unter "/usr/local/lib/python3.2/dist-packages/" anlegen:

sudo mkdir /usr/local/lib/python3.2/dist-packages/pysrc
  • Dann alles erst mal in das soeben erstellte Verzeichnis "pysrc" kopieren:
sudo cp -R pysrc/* /usr/local/lib/python3.2/dist-packages/pysrc
  • Damit dieses Verzeichnis in Python bekannt ist, müssen wir jetzt noch die Variable "PYTHONPATH" anpassen, dazu erweitern wir den Pfad mit Hilfe der ~/.bashrc:
vim ~/.bashrc

ganz am Ende folgendes einfügen:

# update PYTHONPATH for smarthome remote python development and debugging with pydev
export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.2/dist-packages/pysrc

Dann einmal die .bashrc neu sourcen:

. ~/.bashrc
  • Prüfen ob der Pfad als python Pfad verfügbar ist:
python -c "import sys
from pprint import pprint as pp
pp(sys.path)"

Die Ausgabe sollte ungefähr so aussehen:

['',
 '/usr/local/lib/python2.7/dist-packages/distribute-0.6.49-py2.7.egg',
 '/usr/local/lib/python2.7/dist-packages/pyserial-2.7-py2.7.egg',
 '/usr/local/lib/python2.7/dist-packages/Twisted-14.0.0-py2.7-linux-armv6l.egg',
 '/usr/local/lib/python2.7/dist-packages/zope.interface-4.1.1-py2.7-linux-armv6l.egg',
 '/usr/smarthome',
 '/usr/local/lib/python3.2/dist-packages/pysrc',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-linux2',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/local/lib/python2.7/dist-packages/setuptools-0.6c11-py2.7.egg-info',
 '/usr/lib/python2.7/dist-packages']
  • Ich empfehle für die Entwicklung der Logiken auf dem Smarthome ein separates Verzeichnis anzulegen und nicht im "logic" Folder zu arbeiten. Dieses Folder heißt bei mir "pydev" und liegt im root Verzeichnis von smarthome. Verzeichnis anlegen mit:
mkdir /usr/smarthome/pydev
  • Jetzt müssen wir dem Debugger noch dem Zusammenhang zwischen Eclipse und Smarthome klar machen. Dazu gibt es eine Variable "PATHS_FROM_ECLIPSE_TO_PYTHON" in der Datei "pydevd_file_utils.py". Datei mit einem Editor öffnen:
sudo vim /usr/local/lib/python3.2/dist-packages/pydevd_file_utils.py
  • und dann die Variable folgendermaßen setzen:
PATHS_FROM_ECLIPSE_TO_PYTHON = [(r'C:\pfad\zum\eclipse\workspace\auf\windows', r'/usr/smarthome/pydev')]
  • Wie oben bereits erwähnt muss immer sichergestellt sein, dass sich die Skripte auf dem Eclipse Rechner und auf Smarthome exakt gleichen müssen, sonst läuft das Debugging nicht. Damit ich nicht immer synchronisiseren muss, hab ich mir auf dem Windowsrechner ein Netzlaufwerk eingerichtet, welches direkt auf das "pydev" Folder des Raspberrys zeigt. Dank der bereits eingerichteten Samba Freigabe ist das ja kein Problem mehr. Damit sieht meine Variable jetzt so aus:
PATHS_FROM_ECLIPSE_TO_PYTHON = [(r'X:', r'/usr/smarthome/pydev')]
  • Dann muss logischer Weise noch ein neuer Eclipse Workspace wie oben beschrieben im Laufwerk "X:" erstellt werden. Somit sollten jetzt alle neuen Python Scripte die mit Eclipse erstellt werden, automatisch bereits auf dem Raspberry liegen.

Einbau des Debuggers in die Logik

  • als letztes muss nur noch der Debugger in das Logikscript geladen werden, das geht genau gleich wie im Teil 2 bereits beschrieben. Erst import pydevd und dann pydev.settrace. Wieder sicherstellen, dass die IP des Windows Clients verwendet wird.

Testprogramm:

#!/usr/bin/env python
#
import re
import pydevd

for item in sh :
	
	for child in item :
		
		for gadget in child :
			print (gadget.id())
			rolloRegex = re.match(r".*Roll", gadget.id())
			if rolloRegex is not None :
				print ("Sollte ein Rolladen sein!")
				pydevd.settrace("192.168.2.31")

Debuggen

  • Als erstes den Debug Server starten. Hierzu in Eclipse in die Debug Perspektive wechseln und dann unter "Pydev"-->"Start Debug Server" den Server Starten. Der Server startet und hört auf Port 5678.
  • Als nächstes müssen wir Smarthome noch das erstelle Logikscript zugänglich machen. Dazu erstellen wir einen symbolischen Link im "logics" Ordner:
cd /usr/smarthome/logics
ln -s ../pydev/logic_develop.py logic_develop.py
  • Als nächstes Smarthome stoppen und im Debug Modus neu starten damit das Logikscript eingelesen wird. Wie man eine Logik unter smarthome.py definiert und triggert erspare ich mir jetzt. Hierzu bitte die smarthome.py Doku konsultieren.
  • Jetzt die Logik triggern.

Jetzt sollte Eclipse automatisch reagieren. Wählt man jetzt in Eclipse im Debug Fenster die Zeile "module" an, kann man rechts im Variablen Fenster schön den kompletten Aufbau von sh erkennen.

Ansonsten sei an dieser Stelle auf den Thread im Forum verwiesen: http://knx-user-forum.de/smarthome-py/32271-logik-programmierung-mit-eclipse-und-remote-debug-auf-sh.html

Hoffe geholfen zu haben.

Clone this wiki locally