Python Skript Reading an FHEM Übergeben

Begonnen von Pille90, 11 Mai 2018, 22:45:31

Vorheriges Thema - Nächstes Thema

Pille90

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

MadMax-FHEM

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
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)

JoWiemann

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
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Pille90

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

MadMax-FHEM

#4
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
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)

Pille90

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()

JoWiemann

Du übergibst den String "distance" mit: fhem_set("WertZisterne", distance) sollte es funktionieren.


Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Pille90

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

Carsten1981

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
fhem 5.8 CUL 433, 8x DS18B20, 8fach 230V Relais
benachrichtigungen über Telegram, Steuerung Solar- und Kaminpumpe, Steuerung Somfy Rollos, Lichtsteuerung über Intertechno, Steuerung Heizungspumpe und Mischer Fußbodenheizung