Hallo Freunde,
ich bin dabei mit einem Raspi und Fhem eine Alarmanlage zu entwickeln.
Dabei wäre es für mich jetzt sehr hilfreich, wenn aus Python heraus eonige Sensoren direkt abfragen könnten.
Hat mir dazu jemand eine n guten Rat, wie das geht?
mfg
Kurt
Ich bin nicht sicher was Du mit direkt abfragen meinst?
Wenn es darum geht aus python heraus auf FHEM zuzugreifen, um den Status von Sensoren zu überprüfen, so gäbe es auf jeden Fall die Möglichkeit über telnet oder über einen Webrequest auf FHEM zu zuzugreifen. Die Syntax von telnet ist recht simpel und die Ergebnisse sollten sich leicht weiterbearbeiten lassen. Per Web kann man ebenfalls "Rohdaten" bekommen, d.h. ohne das ganze HTML drumherum.
Sowohl telnet also auch web-Zugriff (longpoll) erlauben es auch eine Art PUSH einzurichten.
Wodurch ist denn die Auswahl python gegeben, würde es nicht Sinn machen die Alarmanlage in FHEM (direkt) zu realisieren oder ist das bereits eine fertige Alarmanlage und Du verwendest nur python als Kopplung?
Zunächst vielen Dank für die Antwort. Aus meiner Sicht war Python nötig, weil ich zu meinem Raspi ein Display nutze, über welches die Alarmanlage komplett bedient werden soll. (Eingabe von Entsperrcode usw.) Das wäre über FHEM nicht so einfach möglich.
Ich möchte ledglich den Zustand von mehreren Fenster/Türkontakten überwachen (offen oder geschlossen), um daraus Bedingungen abzuleiten.
Kannst Du mir ein kurzes Beispiel zeigen, wie eine Abfrage über Telnet aussehen könnte?
Das würde mir sehr helfen.
Vielen Dank im Voraus.
Grüße
Kurt
Beispiel in telnet ist einfach, da über telnet das gesamte spektrum der fhem befehle zur verfügung steht. Um zum beispiel alle informationen eines devices sensor1 abzufragen gibt man nach öffnen der telnet session list sensor1
ein.
Allerdings kommt da vermutlich viel mehr info zurück als man braucht insofern wäre eine benachrichtigung bei veränderungen vermutlich besser. Dafür steht per telnet das kommando inform zur verfügung. Inform ist quasi der event monitor für eine telnet verbindung. Welche events interessant sind kann man dann auch noch per regexp einschränken
Vielen Dank zunächst. Damit komme ich dann vermutlich weiter.
Hallo Feunde.
ich brauche nochmal Hilfe.
Leider habe ich mit Telnet noch keine Erfahrung.
Kann mir jemand den Python Code verraten, mit dem ich ein Telnet Port öffnen und einen Fhem Sensor abfragen kann.
Das wäre super.
Vielen Dank im Voraqus.
Gruß
Kurt
Da muss ich passen, python ist nicht mein bereich. Da fhem selber in perl geschrieben ist, gibt es hier eine menge perl wissen im forum. Deshalb auch meine ursprüngliche frage, warum du python für deine alarmanlage verwendest. Wenn du selber nicht so erfahren mit python bist erscheint mir das überdenkenswert. Ansonsten kannst du mit der frage natürlich auch in ein python forum gehen.
Hallo,
Ich kann auch kein Python, aber mit dem Code hat es mal funktioniert, glaube ich:
import telnetlib
def fhem_get(send_cmd):
try:
tn = telnetlib.Telnet(fhemhost, int(fhemport))
tn.write(send_cmd + "\n")
tn.write("quit\n")
ret = tn.read_all()
tn.close()
except:
print "telnet exception."
return ret
Gruß
Hans
Leider komme ich damit immer noch nicht zurecht.
Es gelingt mir offensichtlich nicht den Telnet Kanal zu öffnen.
Mein Code sieht momentan wie folgt aus:
import getpass
import sys
import telnetlib
host="192.168.178.42:7072"
tn=telnetlib.TELNET_PORT(host)
darauf bekomme ich immer folgende Fehlermeldung:
TypeError: ´int´ object is not callable
in Fhem ist telnet offensichtlich definiert.
Kann mir dazu noch jemand helfen?
Gruß
Kurt
Hallo,
Hab's mal getestet:
#!/usr/bin/python
import telnetlib
send_cmd = '{ReadingsVal("CUL_WS_1","temperature","")}'
fhemhost = '192.168.178.42'
fhemport = 7072
try:
tn = telnetlib.Telnet(fhemhost, int(fhemport))
tn.write(send_cmd + "\n")
tn.write("quit\n")
ret = tn.read_all()
tn.close()
except:
print "telnet exception."
print ret
liefert mir (natürlich andere IP):
fhem_send.py
17.0
Bye...
Gruß
Hans
Hallo Hans
zunächst vielen Dank für die prompte Anwort.
Leider bekomme ich damit immer noch die gleiche Fehlermeldung.
Wie muss denn die Definition des telnet im Fhem genau aussehen?
Gruß
Kurt
Internals:
CONNECTS 286
DEF 7072 global
FD 6
NAME telnetPort
NR 4
NTFY_ORDER 50-telnetPort
PORT 7074
STATE Initialized
TYPE telnet
Also ganz normal.
Deine Fehlermeldung ist aber eine typisch pythonartige.
Vermutung: fhemhost muss vom Typ 'String', fhemport vom Typ 'Integer' sein. telnetlib.Telnet
erwartet diese zwei Parameter im Aufruf.
Oder du hast in deinem Code eine Zuweisung, die sich mit dem Telnetaufruf beisst.
Gruß
Hans
Hallo Hans,
so langsam ist mir die Sache peinlich
Ich habe die IP (fhemhost ="192.168.178.42") als String und das Port (fhemport= 7072) als Integer definiert.
Um mögliche Einflüsse auszuschließen habe, nache dem Dein Code auch nicht funktioniert, lediglich die Definitionen
import getpass
import sys
import telnetlib
fhemhost="192.168.178.42"
fhemport = 7072
tn=telnetlib.TELNET_PORT(fhemhost, int(fhemport))
ausgeführt.
Leider bekomme ich immer den Fehler: TypeError ´int´ object is not callable.
Kann das ein Rechteproblem von Linux auf dem Rasppi sein?
Danke für Deine HIlfe
Gruß
Kurt
Das try: und except: solltest du nicht weglassen. Scheint zu dem Fehler zu führen.
Gruß
Hans
P.S.:
Und die Funktion heisst:telnetlib.Telnet(). TELNET_PORT kenne ich nicht.
Aber ich kann auch kein Python. ;)
#!/usr/bin/python
import telnetlib
send_cmd = '{ReadingsVal("CUL_WS_1","temperature","")}'
fhemhost = '192.168.178.42'
fhemport = 7072
try:
tn = telnetlib.Telnet(fhemhost, int(fhemport))
tn.write(send_cmd + "\n")
tn.write("quit\n")
ret = tn.read_all()
tn.close()
except:
print "telnet exception."
print ret
Teste doch erstmal das hier. Wenn das hier geht kannst Du ja Deine Wünsche anpassen.
Hallo Hans,
jetzt bin ich einen Schritt weiter.
Die Funktion telnetlib.TELNET_PORT gibt es zwar, aber nur mit telnetlib.Telnet() tut es jetzt.
Allerdings muss ich noch herausfinden, warum dazu try und except notwendig sind.
Vielen Dank, Du warst mir eine große Hilfe.
Gruß
Kurt
Jetzt bräuchte ich nochmal Unterstützung.
Das betätigen von Aktoren in Fhem funktioniert.
Probleme habe ich noch mit dem Auslesen der Zustände von Sensoren.
was ist an folgendem Code falsch?
read_cmd= "{TK_Haustuer}{readings}{state}{val}
try:
Ich habe hier offensichtlich Probleme mit der Synatx. Gibt es eine Doku inder diese beschrieben ist?
Da fehlen Gänsefüße am Ende
read_cmd= "{TK_Haustuer}{readings}{state}{val}
try:
und warum nimmst Du nicht ReadingsVal oder wegen meiner Value
Grüße
Das Gänsefüßchen ist nicht das Problem. Das habe ich hier beim Übertrag schlicht vergessen.
Eigentlich funktionieren aus Python Sicht beide Varianten
read_cmd= "{TK_Haustuer}{READINGS}{state}{VAL}"
read_cmd= "ReadingsVal(TK_Haustuer,state,VAL)}"
Der Code wird so offensichtlich auch an Fhem übergeben (also kein Syntaxfehler in Python) aber mit
tn.write(read_cmd + "\n"
ret = tn.read_all()
print ret
wird von Fhem folgender Fehler übergeben:
Bareword "TK_Haustuer" not allowed while "strict subs" in use at (eval 140) line 1.
Das selbe auch für "state" und "Val".
Mit dieser Fehlermedung kann ich bis jetzt noch nichts anfangen
Gruß
read_cmd= "ReadingsVal("TK_Haustuer","state","VAL")}"
Wobei das mit VAL so nicht korrekt ist. Was genau soll VAL eigentlich sein?
Kannst auch so machen
read_cmd= "Value("TK_Haustuer")}"
Mein Python Editor meldet einen Syntaxerror, wenn ich die " " vor die Klammern und in die Klammern hineinsetze.
Wenn ich die "" innerhalb der Klammern weglasse dann bekomme ich den oben bereits beschriebenen Fehler:
Bareword "TK_Haustuer" not allowed while "strict subs" in use (eval 153) line 1.
Ansonsten verhalten sich alle drei Varianten gleich.
Gruß
Kurt
Tja was soll ich sagen. Der Perlsyntax ist Dein phytoninterpreter total egal.
Musste halt escapen.
Was mir noch ein fällt. Du bist ja in FHEM Telnet. Du musst von da ja noch auf die Perl ebene oder Du macht ein list Device mit Optionen oder parst das Ergebnis. Schau Dir mal list an und welche Optionen Du da hast um ein bestimmtes Reading ab zu fragen.
Vielen Dank für Deine Hilfe.
Ich versuche das alles mal.
Gruß
Kurt
read_cmd= '{ReadingsVal("TK_Haustuer","state","")}'
sollte klappen.
Gruß
Hans
Das klappt so auch. Aber ich denke mal er kommt besser weg mit nem FHEM list. Ich glaube man konnte da auch Readings mit angeben. Mag aber jetzt nicht nach suchen.
Grüße
Das tut:
read_cmd= ("list FK1_Hobbyraum state VAL
Das Ganze hat allerdings mit ingenieurmässigem Arbeiten nicht mehr viel zu tun. Das ist ein reines probieren.
Grüße
Das liegt aber auch ein bisschen am Halbwissen :D
Das möchte ich nicht bestreiten.
Allerdings vermisse ich eine gute Dokumentaion, aus der ich die andere Hälfte beziehen könnte. ;)
Kannst Du mir hier einen guten Tipp geben?
Für was? FHEM, Perl oder Python?