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
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
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
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
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
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()
Du übergibst den String "distance" mit: fhem_set("WertZisterne", distance) sollte es funktionieren.
Grüße Jörg
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
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