Aktoren mit Python abfragen

Begonnen von kurtklaiber, 04 Januar 2016, 18:43:54

Vorheriges Thema - Nächstes Thema

kurtklaiber

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

viegener

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?

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

kurtklaiber

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

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

kurtklaiber

Vielen Dank zunächst. Damit komme ich dann vermutlich weiter.

kurtklaiber

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

viegener

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.

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Hans Franz

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
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

kurtklaiber

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

Hans Franz

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
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

kurtklaiber

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

Hans Franz

#11
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
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

kurtklaiber

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

Hans Franz

#13
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. ;)
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

CoolTux


#!/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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net