vom Python Sript daten an device überteragen

Begonnen von saschaev, 24 November 2019, 13:51:44

Vorheriges Thema - Nächstes Thema

saschaev

Hallo,
bin zwar nicht mehr neu als Benutzer vom Fhem aber würde sagen trotzdem noch blutiger Anfänger.
Habe mir in meine Zisterne einen Ultraschalsensor eingebaut um den Wasserstand zu messen( mit einen Python Script),funktioniert auch alles.
Script wird über Contab Befehl ausgeführt. Kann auch über Fhem das Script aufrufen dort schreibt es mir die Daten in die Logfile. Jetzt möchte ich über einen Dummy das Script ausführen und die gemessenen Daten in Fhem mir anzeigen lassen. Es wird auch ausgeführt bloß bekomme ich die Daten nicht zu gesicht , nur wieder in der Logdatei.



auszug vom script

[ Meine Tanks haben Maximal 5000 Liter bei 220 cm Füllhöhe
#    Zusätzlich 4 cm Offset vom Einbauort des Sensors
      Fuelstand = 250 - Distance
      Liter = 5000 / 250 * Fuelstand
      Zeit = time.time()

      ZeitStempel = datetime.datetime.fromtimestamp(Zeit).strftime('%Y-%m-%d_%H:%M:%S')

      print (ZeitStempel),("Zisterne Fuelhoehe: %.1f cm" % Fuelstand),("Liter: %.0f l" % Liter)


      time.sleep(2)]



das Device

defmod actWasserstandZisterne notify WasserstandZisterne {my $Value=ReadingsVal("Zisterne_Inhalt_Reading", "Zisterne Fuelhoehe","");; system ("sudo /home/pi/zisterne.py & Value")}

Biite um eure Hilfe

amenomade

Lieber direkt aus deinem Python Skript die Readings setzen.

Da Du Werte setzen möchtest, müsstest Du mit qx() statt system() arbeiten. Das wäre dann ein blokierendes Call. Alle andere Alternativen bedeuten viel mehr Code.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

ZitatLieber direkt aus deinem Python Skript die Readings setzen.
Dafür evtl. das Fhem Client von Otto schauen https://github.com/heinz-otto/fhemcl
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

saschaev


Werte an FHEM uebergeben

      #fhem.pl 7072 "setreading Zisterne_Inhalt Fuelstand Fuelhoehe "

      #os.system(perl /opt/fhem/fhem.pl7072 ("setreading Zisterne_Inhalt Fuelhoehe"+str(Fuelstand ))

      #fh.pl7072("setreading Zisterne_Inhalt Fuelhoehe"+str(Fuelstand ))

  #echo -en "set Zisterne_Inhalt Fuelhoehe\nquit\n" | nc -w 5 localhost 7072 >/dev/null
#def fhem_set( var, value):
      #print "set " +  var + " " + value
      #subprocess.call(['perl', '/opt/fhem/fhem.pl', '7072', 'set '+ var +' ' + value])

      #fhem_set("Zisterne_Inhalt",Wasserstand)




Das hatte ich schon ausprobiert,  habe es aber nicht hinbekommen

amenomade

Und? An welcher Stelle hat es nicht funktioniert, und mit welcher Fehlermeldung?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

saschaev


#Werte an FHEM uebergeben

      fhem.pl 7072 "setreading Zisterne_Inhalt Fuelstand Fuelhoehe "

os.system(perl /opt/fhem/fhem.pl7072 ("setreading Zisterne_Inhalt Fuelhoehe"+str(Fuelstand ))

fh.pl7072("setreading Zisterne_Inhalt Fuelhoehe"+str(Fuelstand ))

SyntaxError: invalid syntax

echo -en "set Zisterne_Inhalt Fuelhoehe\nquit\n" | nc -w 5 localhost 7072 >/dev/null
IdentationError:  unexpected ident

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

saschaev

habe das aus dem Netz von verschiedenen seiten zusammen gesucht.
wie gesagt bin da echt der Neuling und habe bisher alle immer zusammen gesucht und das hat auch immer bisher geklappt.
Sind ja verschiedene Befehle die ich im script stehen gelassen habe und nur deaktiviert habe.

amenomade

#8
Also....

fhem.pl 7072 "setreading Zisterne_Inhalt Fuelstand Fuelhoehe "Das kann aus einem python Skript nicht funktionieren, das es Perl rufen sollte.
os.system(perl /opt/fhem/fhem.pl7072 ("setreading Zisterne_Inhalt Fuelhoehe"+str(Fuelstand ))Damit es eine Chance hatzu funktionieren, muss mindestens ein Leerzeichen vor 7072 stehen
fh.pl7072("setreading Zisterne_Inhalt Fuelhoehe"+str(Fuelstand ))Damit es funktioniert, muss die Funktion fh.pl7072 (oder fh.pl mit Leerzeichen und dann 7072) zuerst definiert werden. Das klingt aber wiederum wie ein Perl Skript (siehe 1)

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Kannst auch hier schauen: https://github.com/domschl/python-fhem
Aber bitte nicht einfach blind kopieren, sondern versuchen zu verstehen
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

saschaev



fh.pl 7072("setreading Zisterne_Inhalt Fuelhoehe"+str(Fuelstand ))


bringt den Fehler

File "zisterne.py", line 101
    fh.pl 7072("setreading Zisterne_Inhalt Fuelhoehe"+str(Fuelstand ))
             ^
SyntaxError: invalid syntax


os.system(perl /opt/fhem/fhem.pl 7072 ("setreading Zisterne_Inhalt Fuelhoehe"+str(Fuelstand ))


bringt den Fehler

File "zisterne.py", line 99
    os.system(perl /opt/fhem/fhem.pl 7072 ("setreading Zisterne_Inhalt Fuelhoehe"+str(Fuelstand ))
                                        ^
SyntaxError: invalid syntax

saschaev

Mit

('perl /opt/fhem/fhem.pl 7072 "setreading Zisterne_Inhalt Fuelhoehe"+str(Fuelstand)')



habe ich keinen fehler aber trozdem kein wert (eintrag) in Fhem


amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

saschaev

2019.11.24 21:28:21 3: actWasserstandZisterne return value: -1
sudo: /etc/sudoers.d ist für alle beschreibbar (world writable)
2019-11-24_21:28:25 Zisterne Fuelhoehe: 180.8 cm Liter: 3616 l

bin mir aber nicht sicher was nach setreading stehen muß

('perl /opt/fhem/fhem.pl 7072 "setreading Zisterne_Inhalt Zisterne Fuelhoehe"+str(Fuelhoehe)')

('perl /opt/fhem/fhem.pl 7072 "setreading >Device< >gemessener Wert<      "+str(>einheit<)')

#    Meine Tanks haben Maximal 5000 Liter bei 220 cm Füllhöhe
#    Zusätzlich 7 cm Offset vom Einbauort des Sensors
      Fuelstand = 250 - Distance
      Liter = 5000 / 250 * Fuelstand
      Zeit = time.time()

      ZeitStempel = datetime.datetime.fromtimestamp(Zeit).strftime('%Y-%m-%d_%H:%M:%S')

      print (ZeitStempel),("Zisterne Fuelhoehe: %.1f cm" % Fuelstand),("Liter: %.0f l" % Liter)


      time.sleep(2)


#Werte an FHEM uebergeben


      ('perl /opt/fhem/fhem.pl 7072 "setreading Zisterne_Inhalt Zisterne Fuelhoehe"+str(Fuelhoehe)')



amenomade

Was willst Du in welchen Reading von welchem Device setzen? Syntax ist
setreading <device> <reading> <wert>

+ ist Konkatenation von Strings. Es muss sicher ausserhalb der Hochkommas stehen
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus