FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: kurtklaiber am 04 Januar 2016, 18:43:54

Titel: Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 04 Januar 2016, 18:43:54
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: viegener am 05 Januar 2016, 00:36:42
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?

Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 05 Januar 2016, 06:18:27
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: viegener am 05 Januar 2016, 11:13:46
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 06 Januar 2016, 14:14:12
Vielen Dank zunächst. Damit komme ich dann vermutlich weiter.
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 10 Januar 2016, 07:01:43
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: viegener am 10 Januar 2016, 10:17:34
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.

Titel: Antw:Aktoren mit Python abfragen
Beitrag von: Hans Franz am 10 Januar 2016, 13:43:44
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 13 Januar 2016, 09:46:07
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: Hans Franz am 13 Januar 2016, 12:28:12
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 13 Januar 2016, 12:59:27
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: Hans Franz am 13 Januar 2016, 13:25:49
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 13 Januar 2016, 14:10:42
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: Hans Franz am 13 Januar 2016, 14:26:04
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. ;)
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: CoolTux am 13 Januar 2016, 14:31:17

#!/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.
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 13 Januar 2016, 16:32:06
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 14 Januar 2016, 07:55:27
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:
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 14 Januar 2016, 07:59:27
Ich habe hier offensichtlich Probleme mit der Synatx. Gibt es eine Doku inder diese beschrieben ist?
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: CoolTux am 14 Januar 2016, 09:07:48
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 14 Januar 2016, 14:13:21
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ß
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: CoolTux am 14 Januar 2016, 14:18:43

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")}"
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 14 Januar 2016, 17:11:56
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: CoolTux am 14 Januar 2016, 17:18:01
Tja was soll ich sagen. Der Perlsyntax ist Dein phytoninterpreter total egal.
Musste halt escapen.
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: CoolTux am 14 Januar 2016, 17:23:45
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.
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 14 Januar 2016, 18:48:37
Vielen Dank für Deine Hilfe.
Ich versuche das alles mal.

Gruß

Kurt

Titel: Antw:Aktoren mit Python abfragen
Beitrag von: Hans Franz am 14 Januar 2016, 19:26:24
read_cmd= '{ReadingsVal("TK_Haustuer","state","")}'
sollte klappen.

Gruß
Hans
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: CoolTux am 14 Januar 2016, 19:50:52
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 14 Januar 2016, 19:56:42
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
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: CoolTux am 14 Januar 2016, 20:10:56
Das liegt aber auch ein bisschen am Halbwissen  :D
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: kurtklaiber am 15 Januar 2016, 16:43:02
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?
Titel: Antw:Aktoren mit Python abfragen
Beitrag von: CoolTux am 15 Januar 2016, 17:12:19
Für was? FHEM, Perl oder Python?