FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Pille90 am 11 Mai 2018, 22:45:31

Titel: Python Skript Reading an FHEM Übergeben
Beitrag von: Pille90 am 11 Mai 2018, 22:45:31
Hallo Zusammen,

ich habe ein Frage bzgl. der Übergabe von Werten von einem Python Skript an FHEM.

Folgende Definition habe ich in meinem Notify aktuell:
    USdummy:on {
my $rueckgabe = {system ('sudo python /etc/Melder.py')};;
fhem("set WassermengeZisterne $rueckgabe;;");;
}


als Ergebnis im WassermengeZisterne dummy kommt sowas in der Art raus:

Readings
state HASH(0x12255a8); 2018-05-11 22:36:46


Herauskommen sollte aber das Ergebnis dass direkt im Terminal mit dem Befehl sudo python /etc/Melder.py rauskommt:

Waiting to settle
Distance: 369.52 cm


Kamm mir wer sagen wie ich den Code im Notify abändern muss, dass mir der Distancewert sauber übertragen wird und in den Dummy geschrieben wird.

Vielen Dank im Voraus.

VG Florian
Titel: Antw:Python Skript Reading an FHEM Übergeben
Beitrag von: MadMax-FHEM am 11 Mai 2018, 23:20:22
Du könntest auch im python Script per Telnet-Aufruf den Wert direkt in den Dummy schreiben...

Dann noch den Aufruf des Scripts in " " somit blockiert fhem auch nicht...

Ansonsten evtl. mit qx(sudo python /etc/Melder.py)

Gruß, Joachim
Titel: Antw:Python Skript Reading an FHEM Übergeben
Beitrag von: JoWiemann am 12 Mai 2018, 08:30:01
Zitat von: Pille90 am 11 Mai 2018, 22:45:31
Hallo Zusammen,

ich habe ein Frage bzgl. der Übergabe von Werten von einem Python Skript an FHEM.

Folgende Definition habe ich in meinem Notify aktuell:
    USdummy:on {
my $rueckgabe = {system ('sudo python /etc/Melder.py')};;
fhem("set WassermengeZisterne $rueckgabe;;");;
}


als Ergebnis im WassermengeZisterne dummy kommt sowas in der Art raus:

Readings
state HASH(0x12255a8); 2018-05-11 22:36:46


Herauskommen sollte aber das Ergebnis dass direkt im Terminal mit dem Befehl sudo python /etc/Melder.py rauskommt:

Waiting to settle
Distance: 369.52 cm


Kamm mir wer sagen wie ich den Code im Notify abändern muss, dass mir der Distancewert sauber übertragen wird und in den Dummy geschrieben wird.

Vielen Dank im Voraus.

VG Florian

Hallo Florian,

der Aufruf system(...) gibt immer nur den erfolgreichen Aufruf oder den erhaltenen Fehler beim Aufruf zurück. Um die Rückgabe des aufgerufenen Programms zu erhalten musst Du qx(...) nehmen. Ich habe Dir mal ein Python-Programm angehängt, bei dem direkt im Programm ein Dummy gefüllt wird.


Grüße Jörg
Titel: Antw:Python Skript Reading an FHEM Übergeben
Beitrag von: Pille90 am 12 Mai 2018, 08:59:36
Hallo Zusammen,

danke für die Antworten, ich hab mal versucht eine Zeile einzufügen, leider ohne Erfolgt. Wo im Skript und wie muss ich genau die Übergabe eingeben. Bekomms nicht auf meinen Fall übertragen

Anbei der Code des GPIO SKripts


import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

trig_pin = 8
echo_pin = 7
GPIO.setup(trig_pin,GPIO.OUT)
GPIO.setup(echo_pin,GPIO.IN)

GPIO.output(trig_pin, False)
print "Waiting to settle"
time.sleep(1)
GPIO.output(trig_pin,True)
time.sleep(0.00001)
GPIO.output(trig_pin,False)

while GPIO.input(echo_pin)==0:
start = time.time()

while GPIO.input(echo_pin)==1:
end = time.time()

duration = end - start
distance = duration * 17150
distance = round(distance, 2)
print "Distance:",distance,"cm"
fhem_set("WertZisterne", "state" + repr(distance) +)
GPIO.cleanup()


Das kommt dabei aktuell raus:

root@raspberrypi:/home/pi# python /etc/Melder.py
  File "/etc/Melder.py", line 28
    fhem_set("WertZisterne", "state" distance)
                                            ^
SyntaxError: invalid syntax


Vielen Dank im Voraus.

Florian
Titel: Antw:Python Skript Reading an FHEM Übergeben
Beitrag von: MadMax-FHEM am 12 Mai 2018, 09:32:16
Du hast vergessen die Funktion fhem_set mit in dein python Script zu integrieren...

def fhem_set( var, value):
    #print "set " +  var + " " + value
    subprocess.call(['perl', '/usr/share/fhem/fhem.pl', '7072', 'set '+ var +' ' + value])


Das ist ja kein "normaler" python Befehl...

Kurz da nur Handy...

Gruß, Joachim
Titel: Antw:Python Skript Reading an FHEM Übergeben
Beitrag von: Pille90 am 13 Mai 2018, 11:15:18
Hallo Zusammen,

vielen Dank nochmal, funktioniert soweit, dass ein Übertrag nach FHEM stattfindet, doch leider nicht der richtige. Was muss ich im fhem_set bei distance eingeben, damit auch das Ergebnis des Skriptes übertragen wird. Aktuell wurde in FHEM das Ergebnis "distance" geschrieben.

import RPi.GPIO as GPIO
import time
import subprocess

GPIO.setmode(GPIO.BCM)

trig_pin = 8
echo_pin = 7
GPIO.setup(trig_pin,GPIO.OUT)
GPIO.setup(echo_pin,GPIO.IN)

GPIO.output(trig_pin, False)
print "Waiting to settle"
time.sleep(1)
GPIO.output(trig_pin,True)
time.sleep(0.00001)
GPIO.output(trig_pin,False)

while GPIO.input(echo_pin)==0:
start = time.time()

while GPIO.input(echo_pin)==1:
end = time.time()

duration = end - start
distance = duration * 17150
distance = round(distance, 2)
print "Distance:",distance,"cm"

def fhem_set( var, value):
    #print "set " +  var + " " + value
    subprocess.call(['perl', '/opt/fhem/fhem.pl', '7072', 'set '+ var +' ' + value])

fhem_set("WertZisterne", "distance")


GPIO.cleanup()
Titel: Antw:Python Skript Reading an FHEM Übergeben
Beitrag von: JoWiemann am 13 Mai 2018, 11:17:46
Du übergibst den String "distance" mit: fhem_set("WertZisterne", distance) sollte es funktionieren.


Grüße Jörg
Titel: Antw:Python Skript Reading an FHEM Übergeben
Beitrag von: Pille90 am 13 Mai 2018, 11:20:29
Hallo Jörg,

bei deiner Eingabe kommt folgender Fehler:

Waiting to settle
Distance: 3480.16 cm
Traceback (most recent call last):
  File "/etc/Melder.py", line 34, in <module>
    fhem_set("WertZisterne", distance)
  File "/etc/Melder.py", line 32, in fhem_set
    subprocess.call(['perl', '/opt/fhem/fhem.pl', '7072', 'set '+ var +' ' + value])
TypeError: cannot concatenate 'str' and 'float' objects
Titel: Antw:Python Skript Reading an FHEM Übergeben
Beitrag von: Carsten1981 am 14 Januar 2021, 12:05:18
Hallo,

ich würde das Thema gerne noch mal aufgreifen, da ich vor dem gleichen Problem stehe. Die Übertragung funktioniert, ich kann einen Dummy ein Reading übertragen, aber leider funktioniert es mit einer Variable nicht....



#!/usr/bin/env python3

import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
reader = SimpleMFRC522()
import subprocess

def fhem_set( var, value):
    #print "set " +  var + " " + value
    subprocess.call(['perl', '/opt/fhem/fhem.pl', '7072', 'set '+ var +' ' + va$

try:
        Nummer, text = reader.read()
        print(Nummer)
        print(text)
        fhem_set("TEST", (Nummer))
#        (perl /opt/fhem/fhem.pl localhost:7072 'set TEST id')
finally:
        GPIO.cleanup()


Ich würde halt gerne "einfach" die (Nummer) übertragen....
:'( :'( :'( :'(

Das ist die Fehlermeldung nach dem auslesen des RFID Tags

520241656121

Traceback (most recent call last):
  File "Read.py", line 17, in <module>
    fhem_set("TEST", (Nummer))
  File "Read.py", line 11, in fhem_set
    subprocess.call(['perl', '/opt/fhem/fhem.pl', '7072', 'set '+ var +' ' + value])
TypeError: Can't convert 'int' object to str implicitly


Vielleicht hat ja jemand noch eine Idee..
Danke schon mal im Vorraus

Gruß Carsten