[gelöst] Problem beim Ausführen eines Python Scripts per FHEM

Begonnen von TomS85, 24 Oktober 2019, 20:07:29

Vorheriges Thema - Nächstes Thema

TomS85

Ich habe aktuell ein Problem mit dem Aufruf der Python Pcomfortapi zur Steuerung meiner Panasonic Klimaanlage über FHEM ( https://github.com/lostfields/python-panasonic-comfort-cloud ).

Das Script bietet die Möglichkeit, den Aktuellen Status der Klimaanlage auszulesen und die Anlage zu steuern.
Beim auslesen (-get) funktioniert alles einwandfrei - dort werden mir die aktuellen Betriebsstatus ausgegeben, die ich auch in Readings schreiben kann. Beim schreiben der Werte (-set) an die Klimaanlage, d.h. einschalten der Anlage bekomme ich im FHEM Logfile folgende Meldung und der Befehl wird nicht ausgeführt:
Traceback (most recent call last):
  File "/usr/local/bin/pcomfortcloud", line 6, in <module>
    from pkg_resources import load_entry_point
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 3191, in <module>
    @_call_aside
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 3175, in _call_aside
    f(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 3204, in _initialize_master_working_set
    working_set = WorkingSet._build_master()
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 583, in _build_master
    ws.require(__requires__)
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 900, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 794, in resolve
    new_requirements = dist.requires(req.extras)[::-1]
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2700, in requires
    dm = self._dep_map
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2666, in _dep_map
    self.__dep_map = self._filter_extras(self._build_dep_map())
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2681, in _filter_extras
    invalid_marker(marker)
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 1360, in invalid_marker
    evaluate_marker(text)
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 1378, in evaluate_marker
    return marker.evaluate()
  File "/usr/lib/python2.7/dist-packages/pkg_resources/_vendor/packaging/markers.py", line 297, in evaluate
    current_environment = default_environment()
  File "/usr/lib/python2.7/dist-packages/pkg_resources/_vendor/packaging/markers.py", line 261, in default_environment
    "platform_machine": platform.machine(),
  File "/usr/lib/python2.7/platform.py", line 1358, in machine
    return uname()[4]
  File "/usr/lib/python2.7/platform.py", line 1288, in uname
    processor = _syscmd_uname('-p','')
  File "/usr/lib/python2.7/platform.py", line 1023, in _syscmd_uname
    rc = f.close()
IOError: [Errno 10] No child processes


Ich rufe das Python Tool über Perl in FHEM mit folgendem Befehl auf, um z.B. die Klimaanlage einzuschalten:
system('sudo pcomfortcloud user passwort set -p On 1');

Wenn ich das Tool über die Konsole direkt (mit gleichem Befehl) ausführe, läuft es jedoch einwandfrei.

Leider bin ich weder in Linux noch in FHEM oder Python fit, daher stehe ich aktuell auf dem Schlauch und weiß nicht weiter, wie ich das Problem in den Griff bekommen könnte.

Ich bin für alle Tipps dankbar!

Beste Grüße,
Tom

TomS85

Niemand eine Idee?

Ich vermute ja mal, dass es sich um ein Rechteproblem handelt, denn mit dem User "Pi" lässt sich das Script ja auf der Shell ausführen. Ich weiß jedoch nicht, welche Rechte ich dem User fhem geben müsste, damit die Ausführung aus FHEM heraus klappt.

MadMax-FHEM

Funktioniert das Script auch ohne sudo mit dem User pi!?

Ansonsten: wie genau rufst du es WO in fhem auf!?

Also exakter Befehl (inkl. aller Klammern etc.) und WO rufst du auf...

Ansonsten evtl. mal angeben, dass es Python ist, also mit dem Python vorne dran.
Was "vorne dran" muss bekommst du mit "which python" raus...

Ansonsten:
Wo liegt das Script?
Wo "stehst" du, wenn du das Script als User pi aufrufst?
Schon mal den kompletten Pfad mit angegeben?

Und: wenn du sudo brauchst, dann muss der User fhem (vorausgesetzt: Standardinstallation OHNE Veränderung/Anpassung von User/Rechten, also fhem läuft unter dem User fhem) das auch OHNE Passwortabfrage können/dürfen (Stichwort: sudoers)...

Allerdings sieht dann die Fehlermeldung normalerweise anders aus...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

ch.eick

Moin.

Hast Du das verwendete Modul als User pi mit sudo pip .... installiert, damit es auch von allen Usern verwendet werden kann?

Auf der Shell kannst Du mit dem Kommando history noch mal nachschauen.

Gruß
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

TomS85

#4
Danke schonmal für die Antworten!

installiert hatte ich das Tool in der Shell per "sudo python setup.py", nachdem ich das Archiv heruntergeladen und entpackt hatte.

Der Aufruf für die Shell mit User "Pi" funktioniert auch ohne sudo.

In FHEM rufe ich über ein notify auf, welches bei Eingang einer neuen Whatsapp Message (yowsup) aufgerufen wird über folgenden Code:
system('sudo pcomfortcloud username password set -p On 1');

In einem "at", welches alle 5 Minuten aufgerufen wird, lese ich die aktuellen Ist-Werte mit demselben Tool per Attribut "get" aus:
system('pcomfortcloud username password get 1 > panasonicvalues.txt');
Dieser Aufruf funktioniert auch und ich kann meine Readings damit füllen.

Ich teste gleich mal, ob der Aufruf mit "set" Attribut über das "at", welches alle 5 Minuten ausgeführt wird, funktioniert. =>Edit: Der Aufruf über das "at" funktioniert auch nicht - selber Fehler.

Der Befehl "which python" auf der Shell liefert mir "/usr/bin/python" zurück.
Das Script rufe ich auf der Shell mit User Pi z.B. vom Homeverzeichnis aus auf - funktioniert aber auch aus jedem anderen Verzeichnis heraus.


TomS85

So, ich bin einen Schritt weiter. Ich habe versucht, das pcomfortcloud Tool mit dem User fhem neu zu installieren (in der shell) und bekam folgende Fehlermeldung:
ZitatThe installation directory you specified (via --install-dir, --prefix, or the distutils default setting) was: /usr/local/lib/python2.7/dist-packages/

Perhaps your account does not have write access to this directory?  If the installation directory is a system-owned directory, you may need to sign in as the administrator or "root" account.  If you do not have administrative access to this machine, you may wish to choose a different installation directory, preferably one that is listed in your PYTHONPATH environment variable.

For information on other options, you may wish to consult the documentation at:https://setuptools.readthedocs.io/en/latest/easy_install.html

Please make the appropriate changes for your system and try again.

Offenbar hat der user fhem also keinen Zugriff auf /usr/local/lib/python2.7/dist-packages/, wo das pcomfortcloud installiert ist.

Weiß jemand, wie ich die Rechte vergeben kann - bin leider noch blutiger Linux-Anfänger

MadMax-FHEM

Da fehlen aber mindestens die "Perl-Klammern"!?

Daher ja auch: mit ALLEN Klammern...

Besser noch ein list des at und notify...

Hast du mal versucht GENAU den Aufruf (ohne sudo) den du als User pi auf der Console machst einfach in Anführungszeichen zu setzen und dann einfach in der FhemWeb-Eingabe zu testen!?

Vielleicht hilft auch das: http://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html

Funktioniert es, wenn du dich auf der Shell als User fhem "anmeldest"?

Also:

sudo -su fhem bash

Und dann den Befehl ausführst!?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

TomS85

Der Aufruf im notify sieht so aus (dieser Befehl funktioniert nicht, mit o.g. Fehlermeldung):
ZitatWhatsAppThomas:message.*
{
   system('pcomfortcloud username password set -p On 1');
}

im At so (dieser Befehl funktioniert - gibt die Werte zurück):
Zitat+*00:05:00
{
system('pcomfortcloud username password get 1 > panasonicvalues.txt');
}

Mit deinem genannten Befehl kann ich mich mit dem user fhem in der Shell anmelden. Wenn ich dort den Befehl "pcomfortcloud username password set -p On 1" absetze, wird dieser auch ausgeführt und die Heizung schaltet sich ein.
Wenn ich denselben Befehl in der FHEMweb Befehlszeile eingebe, wird der Befehl ebenso ausgeführt und die Heizung schaltet ein.

MadMax-FHEM

Dann setze doch den Befehl, der in FhemWeb funktioniert "einfach" hinter das at bzw. notify...
...sollte dort ja dann auch funktionieren...

Und lists besser in "code-Tags"...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

TomS85

Super, danke dir! Jetzt klappt es! Was für eine schwere Geburt :D

Ich habe den Aufruf in dem notify nun so:
fhem '"pcomfortcloud username password set -p On 1"';

Danke nochmal für die Unterstützung!

MadMax-FHEM

#10
Bitte gerne!

Sollte aber hinter dem at und notify auch so funktionieren:


"pcomfortcloud username password set -p On 1"


dann aber nat. ohne geschweifte Klammern!

Weil:

geschweifte Klammer -> Wechsel nach Perl

fhem-Befehl -> Wechsel zurück zu fhem

Du springst also unnötig hin und her... ;)

https://wiki.fhem.de/wiki/Klammerebenen

EDIT: bitte noch ein [gelöst] vor den ersten Beitrag...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

TomS85

Zitat von: MadMax-FHEM am 01 November 2019, 12:23:08
Bitte gerne!

Sollte aber hinter dem at und notify auch so funktionieren:


"pcomfortcloud username password set -p On 1"


dann aber nat. ohne geschweifte Klammern!

Weil:

geschweifte Klammer -> Wechsel nach Perl

fhem-Befehl -> Wechsel zurück zu fhem

Du springst also unnötig hin und her... ;)

https://wiki.fhem.de/wiki/Klammerebenen

EDIT: bitte noch ein [gelöst] vor den ersten Beitrag...

Gruß, Joachim

Ich habe in dem At und dem notify aktuell noch rund 100 Zeilen Perl Code, aus dem heraus ich das Python Script aufrufe (habe den Perl Teil nur der Übersichtlichkeit halber weggelassen). Deshalb hatte ich eigentlich auch versucht, das Script über Perl mit dem system-Befehl aufzurufen (was aber offenbar nicht klappt - keine Ahnung warum). Innerhalb meiner if-Struktur wechsle ich dann jetzt eben wieder zu einem fhem Befehl. Aber solange das funktioniert, reicht mir das voll und ganz :)

MadMax-FHEM

Zukünftig dann aber immer wirklich GENAU das posten was du hast und zwar ALLES...
...sonst ist helfen oft nicht so einfach.

Manchmal "verschwinden" durch "vereinfachen" eben die wichtigen Dinge... ;)

Viel Spaß dann noch, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)