Hallo zusammen,
ich habe den og. AccesPoint der m.E. zu Homematic Serie gehört. Damit ich die vorhandenen Sensoren und Aktoren in Fhem nutzen kann bin ich auf folgenden Beitrag gestoßen:
https://forum.fhem.de/index.php?topic=83115.0.
Dort kann man mittels Python Skript über einer REST-API Schnittstelle über die Cloud die Werte abfragen.
Die Einrichtung und Erzeugung der Zugnagsdaten hat problemlos geklappt und auch der Abruf der Daten klappt vom Raspi aus ohne Fehler.
Jetzt wollte ich aber das Python Skript in Fhem einbinden und wenn ich das Skript über die Befehlszeile starte bekomme ich folgenden Logeintrag:
ModuleNotFoundError: No module named 'homematicip
Mein Vermutung ist, dass es wohl ein Rechte Problem gibt. Habe dann auch versucht nach besten Wissen und Gewissen die Fhem Rechte zu erteilen und habe vorsichtshalber die Skripte unter /opt/fhem/FHEM/ abgelegt, aber leider erfolglos.
Ein ls -al gibt folgende Werte zurück (habe nur die betroffen Dateien eingefügt)
-rwxr-xr-x 1 fhem root 1592 Nov 16 15:03 api.py
-rwxr-xr-x 1 fhem root 162 Nov 15 22:31 config.ini
Ich hoffe das die Infos für eine grobe Einschätzung des Problem reichen und würde mich über Tipps und Ideen freuen.
Danke.
Was gibtst Du genau in die Befehlezeile ein?
Zitat von: amenomade am 17 November 2019, 17:08:03
Was gibtst Du genau in die Befehlezeile ein?
"python3 /opt/fhem/FHEM/api.py"
Gesendet von meinem JSN-L21 mit Tapatalk
Was ist api.py? Ich kann das mit der verlinkte Anleitung nicht verknüpfen.
Ein Berechtigungsproblem ist es nicht, zumindest nicht direkt, sonst würde er wegen api.py meckern. Aber was api.py im hinten aufruft...?
Zitat von: amenomade am 17 November 2019, 17:24:56
Was ist api.py? Ich kann das mit der verlinkte Anleitung nicht verknüpfen.
Das ist ein Beispiel Skript von der GitHub Seite.
https://github.com/coreGreenberet/homematicip-samples/blob/master/SampleTemplate/empty.py
Gesendet von meinem JSN-L21 mit Tapatalk
Das hatte ich genommen um erstmal ohne fhem sicher eine Verbindung herstellen zu können. Bevor ich an zwei Stellen suchen muss.
Gesendet von meinem JSN-L21 mit Tapatalk
Okay... dann findet er bei "import homematicip" die Quelle nicht.
Wo liegt bei dir das Python-Modul homematicip?
Was sagt
"python3 -c 'import homematicip'"
in der Befehlzeile? Vermutlich auch "no module named homematicip"?
Ich habe gerade Mal was versucht. Erst hatte ich den Befehl "pip3 Install homematicip" vom Pi aus installiert so wie in der Anleitung beschrieben. Jetzt habe ich den Aufruf nochmal über fhem ausgeführt und jetzt ist der Fehler mir dem fehlenden Modul weg aber dafür kommt jetzt das:
Traceback (most recent call last): File "/opt/fhem/FHEM/api.py", line 8, in <module> home.set_auth_token(config.auth_token) AttributeError: 'NoneType' object has no attribute 'auth_token' Traceback (most recent call last): File "/opt/fhem/FHEM/api.py", line 8, in <module> home.set_auth_token(config.auth_token) AttributeError: 'NoneType' object has no attribute 'auth_token' sh: 1: python3 /opt/fhem/FHEM/api.py: not found sh: 1: python3 /opt/fhem/FHEM/api.py: not found
Gesendet von meinem JSN-L21 mit Tapatalk
Naja... es wird schwierig. Jetzt ist er in homematicip, ladet abernicht ordentlich das Submodul home...
Es ist wahrscheinlich die gleiche Ursache: irgendwie mit sys.modules und sys.path verbunden: der User fhem sucht die Sachen nicht an der gleiche Stelle wie der User pi
Zitat von: amenomade am 17 November 2019, 18:00:23
Naja... es wird schwierig. Jetzt ist er in homematicip, ladet abernicht ordentlich das Submodul home...
Es ist wahrscheinlich die gleiche Ursache: irgendwie mit sys.modules und sys.path verbunden: der User fhem sucht die Sachen nicht an der gleiche Stelle wie der User pi
Ja das vermute ich auch. Zu dem Python Skript wird auch noch eine config.ini benötigt, dort stehen die Client ID usw. drin. Die habe ich auch im gleichen Pfad wo das Python Skript liegt. Denn laut der Doku kann es im gleichen Pfad sein aber vielleicht liegt das am fhem Aufruf. Hast du denn eine Idee wo fhem danach suchen könnte?
https://github.com/coreGreenberet/homematicip-rest-api
Gesendet von meinem JSN-L21 mit Tapatalk
Was sagt
"python3 -c 'import sys;;print(sys.path)'"
"python3 -c 'import sys;;print(sys.modules)'"
in Befehlzeile?
Zitat von: amenomade am 17 November 2019, 18:49:45
Was sagt
"python3 -c 'import sys;;print(sys.path)'"
"python3 -c 'import sys;;print(sys.modules)'"
in Befehlzeile?
Zitat von: amenomade am 17 November 2019, 18:49:45
Was sagt
"python3 -c 'import sys;;print(sys.path)'"
"python3 -c 'import sys;;print(sys.modules)'"
in Befehlzeile?
python3 -c 'import sys;;print(sys.path):
['', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/opt/fhem/.local/lib/python3.7/site-packages', '/usr/local/lib/python3.7/dist-packages', '/usr/lib/python3/dist-packages']
"python3 -c 'import sys;;print(sys.modules)':
{'sys': , 'builtins': , '_frozen_importlib': , '_imp': , '_thread': , '_warnings': , '_weakref': , 'zipimport': , '_frozen_importlib_external': , '_io': , 'marshal': , 'posix': , 'encodings': , 'codecs': , '_codecs': , 'encodings.aliases': , 'encodings.utf_8': , '_signal': , '__main__': , 'encodings.latin_1': , 'io': , 'abc': , '_abc': , '_bootlocale': , '_locale': , 'site': , 'os': , 'stat': , '_stat': , 'posixpath': , 'genericpath': , 'os.path': , '_collections_abc': , '_sitebuiltins': , 'types': , 'importlib': , 'importlib._bootstrap': , 'importlib._bootstrap_external': , 'warnings': , 'importlib.util': , 'importlib.abc': , 'importlib.machinery': , 'contextlib': , 'collections': , 'operator': , '_operator': , 'keyword': , 'heapq': , '_heapq': , 'itertools': , 'reprlib': , '_collections': , 'functools': , '_functools': , 'logilab': , 'mpl_toolkits': , 'sitecustomize': }
Gesendet von meinem JSN-L21 mit Tapatalk
Ich bin ein Schritt weiter.
Es reicht nicht aus, dass die config.ini im auszuführenden Verzeichnis liegt. Ich habe den nun nach /etc/homematicip-rest-api/ kopiert und bekomme einen Antwort die auch im Fhem Log geschrieben wird. Jetzt muss ich nur versuchen das in einzelne Readings zu packen.
Ich kann mein Skript soweit nutzen und auch weiter verarbeiten.
Habe aber jetzt das Problem das fhem während der Ausführung blockiert obwohl ich das mit qx ausführe.
Gesendet von meinem JSN-L21 mit Tapatalk
qx(befehl) ist immer blockierend.
qx(befehl &) ist nicht blockierend da ein Subprozess gestartet wird und die Kontrolle wieder dem Hauptprogramm zurückgegeben wird.
"befehl" ist nicht blockierend.
Die Frage ist: brauchst Du den Rückgabewert von python? Dann wird es schwieriger: um es non-blocking zu machen, muss man eine return-funktion programmieren.
Zitat von: amenomade am 18 November 2019, 21:09:26
qx(befehl) ist immer blockierend.
qx(befehl &) ist nicht blockierend da ein Subprozess gestartet wird und die Kontrolle wieder dem Hauptprogramm zurückgegeben wird.
"befehl" ist nicht blockierend.
Die Frage ist: brauchst Du den Rückgabewert von python? Dann wird es schwieriger: um es non-blocking zu machen, muss man eine return-funktion programmieren.
qx(befehl &) habe ich getestet, das blockiert immer noch. Ich brauche die Werte aus dem Python Skript, da die mir z.B. den Status der Fensterkontakte sendet.
So sieht die subroutine aus:
#---------------------------------------
# Homematic-Funktion
#---------------------------------------
sub homematicip(){
my $returnCode = qx(python3 /opt/fhem/www/homematicip-rest-api/api1.py &);
fhem("setReading fenster_badezimmer fenster_badezimmer $returnCode");
}}
Wenn Du die Werte brauchst, dann muss es blockierend sein, da Du doch auf dem Wert warten willst.
Und & wird auch nicht funktionieren.
Dann bleibt nur z.B. https://wiki.fhem.de/wiki/Blocking_Call
Alternativ: dein Skript läuft mit cronjob, und übergibt selbst die Werte an Fhem.
Zitat von: amenomade am 18 November 2019, 22:01:10
Wenn Du die Werte brauchst, dann muss es blockierend sein, da Du doch auf dem Wert warten willst.
Und & wird auch nicht funktionieren.
Dann bleibt nur z.B. https://wiki.fhem.de/wiki/Blocking_Call
Alternativ: dein Skript läuft mit cronjob, und übergibt selbst die Werte an Fhem.
Habe das Problem jetzt gelöst. Ich lasse das Python Skript in einer 5 Sekunden Dauerschleife laufen und sende die Werte mit dem Python FHEM API-Modul direkt als Reading in das Dummy Device. Dadurch blockiert FHEM nicht mehr.