Neues Python FHEM API-Modul auf PyPI

Begonnen von domschl, 01 Januar 2017, 12:15:41

Vorheriges Thema - Nächstes Thema

domschl

FHEM User, die Python verwenden wollen, um auf den Server zuzugreifen, können das Modul fhem von PyPI verwenden.
Unterstützt wird Lesen und Senden von FHEM readings und commands. Das Modul implementiert Background threading mit Python Queue für Fhem events. Fhem events werden als Python dictionaries aufbereitet and eine Python Queue übergeben.

Installation:
pip install fhem

Projekt-Source und Doku:

Kurzes Beispiel: (mehr Beispiele und Doku siehe Github)

import fhem
import logging

logging.basicConfig()

fh = fhem.Fhem("myserver.home.org")
# Send a command to FHEM (this automatically connects())
fh.send_cmd("set lamp on")
# Get a specific reading from a device
temp = fh.get_dev_reading("LivingThermometer", "temperature")

Brutzel

Super! Genau was ich gesucht habe!
Funktioniert prima!
:)

Vielen Dank dafür!

Gruß
Brutzel

tmachowinski

Guten Abend zusammen!
Das Modul kommt mir irgenwie ziemlich recht, ich bin gerade dabei, mit einem Raspberry verschiedene Techniken auszuprobieren. Ich habe zwar bisher noch nicht sehr viel mit python oder perl direkt gearbeitet, aber einiges erschließt sich mir durch Lesen von Tutorials und manpages etc.

Mir taucht beim basteln jetzt ein konkretes hindernis auf. Ich möchte mithilfe der funktion .send_cmd ein reading in einem dummy device setzen.
Dadurch soll ein per python ausgelesener DHT22 Sensor in fhem eingebaut werden.

also in fhem:
define DHT dummy
attr stateFormat T:temperature H:humidity


in python nutze ich die AdafruitDHT module. Die werfen mir Werte in die Variablen mit den namen temperature und humidity

jetzt möchte ich per python das reading T auf den Wert aus der variablen temperature setzen.

fh.send_cmd("setreading DHT T temperature")

wie bringe ich python jetzt bei, den Wert statt des Variablennamens einzusetzen?

Auch auf die Gefahr hin, dass die Frage mit wenig Basiswissen in Python zu beantworten ist, würde ich mich über eine Antwort freuen.

grüße Thomas

jorge

Hallo tmachowinski,
bastle gerade auch an der api. Bei mir läuft die Variablenübergabe so:

fh.send_cmd("setreading DHT T  "+str(<variable.num>))

LG Jorge
FHEM.RaspberryPi 2 (HM, 1Wire, Callmonitor.FB 7490, GPIO, I2C, MQTT-Server, MCP23018)
FHEM.RaspberryPi  (FHEM2FHEM, CUL, FS20)
FHEM.RPiZeroW (I2C, 1Wire, python.api, XiaomiBTLESens.MQTT)
FHEM.Win7 (FHEM2FHEM,DBLOG.MySql)
ESPEasy (WEMOSD1, I2C, Analog, 1Wire), Sonoff_T1_3ch, Mobotix QM25, robonect

Chilia

Hi,

danke, schönes Modul! Vor allem für Leute die sich in Python etwas wohler fühlen als in Perl ;-)

Ich verwende es um Daten von meinem Geigerzähler in FHEM Readings umzuwandeln (https://forum.fhem.de/index.php/topic,71904.0.html).

Liebe Grüße
  Christian

satprofi

#5
Hallo.
Beim aufruf bekomme ich dies als Antwort:
AttributeError: 'module' object has no attribute 'Fhem'

Hat wer infos?

Danke
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Reinhart

Hallo domschl

Ich habe jetzt dein Modul in Betrieb genommen weil es genau das ist was ich suche!

Leider bekomme ich eine Fehlermeldung beim parsen von JSON.

('E - Failed to decode json, exception raised.', '\xff\xfd\x00{\n  "Arg":"FHT_Wz_Fussb",\n  "Results": [\n  {\n    "Name":"FHT_Wz_Fussb",\n    "PossibleSets":"day day-temp:on,off,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,27.5,28.0,28.5,29.0,29.5,30.0 desired-temp:on,off,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,27.5,28.0,28.5,29.0,29.5,30.0 fri-from1:time fri-from2:time fri-to1:time fri-to2:time holiday1 holiday2 hour lowtemp-offset manu-temp:on,off,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,27.5,28.0,28.5,29.0,29.5,30.0 minute mode mon-from1:time mon-from2:time mon-to1:time mon-to2:time month night-temp:on,off,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,27.5,28.0,28.5,29.0,29.5,30.0 report1 report2 sat-from1:time sat-from2:time sat-to1:time sat-to2:time sun-from1:time sun-from2:time sun-to1:time sun-to2:time thu-from1:time thu-from2:time thu-to1:time thu-to2:time tue-from1:time tue-from2:time tue-to1:time tue-to2:time wed-from1:time wed-from2:time wed-to1:time wed-to2:time windowopen-temp:on,off,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,27.5,28.0,28.5,29.0,29.5,30.0 year",\n    "PossibleAttrs":"alias comment:textField-long eventMap group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 IODev do_not_notify:1,0 model:fht80b dummy:1,0 showtime:1,0 retrycount minfhtbuffer lazy tmpcorr ignore:1,0 event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading DbLogExclude DbLogInclude HKurve actualRoom alexaName alexaRoom attributesExclude captionGroup captionRoom cmdIcon defined_by description devStateIcon devStateStyle disable fp_Grundriss genericDeviceType:security,ignore,switch,outlet,light,blind,thermometer,thermostat,contact,garage,window,lock homebridgeMapping:textField-long icon index item00 item01 item02 item03 item04 item05 item06 item07 item08 item09 item1 item10 item11 item12 item13 item14 item15 item16 item17 item18 item19 item2 item20 item21 item22 item23 item24 item25 item26 item27 item28 item29 item3 item30 item31 item32 item33 item34 item35 item36 item37 item38 item39 item4 item40 item41 item42 item43 item44 item5 item6 model sortby subType suffix valvesFHT_Kueche valvesFHT_KuecheGewichtung valvesFHT_NinaGewichtung valvesFHT_WohnzimmerGewichtung valvesFHT_WohnzimmerOGGewichtung valvesFHT_Wz_FussbGewichtung webCmd webCmdLabel:textField-long widgetOverride yaf_1 yaf_2 yaf_3 yaf_4 yaf_5 yaf_6 userattr",\n    "Internals": {\n      "COC_MSGCNT": "595",\n      "COC_RAWMSG": "810c04xx0909a00106080000367b",\n      "COC_RSSI": "-50",\n      "COC_TIME": "2017-12-21 10:54:26",\n      "CODE": "0608",\n      "DEF": "0608",\n      "LASTInputDev": "COC",\n      "MSGCNT": "595",\n      "NAME": "FHT_Wz_Fussb",\n      "NR": "538",\n      "STATE": "measured-temp: 22.9",\n      "TYPE": "FHT"\n    },\n    "Readings": {\n      "actuator": { "Value":"48%", "Time":"2017-12-21 10:54:26" },\n      "actuator_": { "Value":"048", "Time":"2017-12-21 10:54:26" },\n      "battery": { "Value":"ok", "Time":"2017-12-21 10:42:58" },\n      "desired-temp": { "Value":"22.5", "Time":"2017-12-21 04:46:26" },\n      "lowtemp": { "Value":"ok", "Time":"2017-12-21 10:42:58" },\n      "measured-temp": { "Value":"22.9", "Time":"2017-12-21 10:42:57" },\n      "state": { "Value":"measured-temp: 22.9", "Time":"2017-12-21 10:42:57" },\n      "temperature": { "Value":"22.9", "Time":"2017-12-21 10:42:57" },\n      "warnings": { "Value":"none", "Time":"2017-12-21 10:42:58" },\n      "window": { "Value":"closed", "Time":"2017-12-21 10:42:58" },\n      "windowsensor": { "Value":"ok", "Time":"2017-12-21 10:42:58" }\n    },\n    "Attributes": {\n      "IODev": "COC",\n      "event-on-change-reading": ".*",\n      "icon": "hc_wht_regler",\n      "lazy": "1",\n      "model": "fht80b",\n      "room": "FHT_Regler,_Wohnzimmer",\n      "userReadings": "actuator_ {sprintf(\\u0022%.3d\\u0022, ReadingsNum($name,\\u0022actuator\\u0022,0))}",\n      "yaf_1": "id=102,name=fht80,showicon=1,showlabel=1,fhemname=FHT_Wz_Fussb,y_pos=611,x_pos=195,labeltype=Name,",\n      "yaf_5": "id=117,name=generic,showicon=1,fhemname=FHT_Wz_Fussb,showlabel=0,y_pos=422,x_pos=386,labeltype=Name,statetype=measured-temp,"\n    }\n  }  ],\n  "totalResultsReturned":1\n}\n\n')


Ich bin mir nicht sicher ob es diese Zeichen am Anfang sind:
\xff\xfd\x00

Meine Umgebung: Rasperry B+ mit Stretch und alle Updates. Deine letzte Version vom Github.

Hast du eine Idee an was das liegen kann, bzw. gibt es eventuell neuere Librarys die man einsetzen kann. Eingelesen wird ja schon mal. Übrigens ist es egal welches Reading ich verwende, der Abbruch bleibt bei allen gleich.

LG
Reinhart

FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

domschl

#7
Hallo Reinhart,

sorry, ich habe das erst gerade gelesen.

Heute habe ich eine neuere Version (0.5.0) rausgegeben, aber ich befürchte, das wird Dein Problem nicht lösen.

Habe ich richtig verstanden, daß der Fhem server auf Raspberry B+ läuft? Welches Betriebssystem und welche Python-Version setzt Du als Client ein?

(am Besten auch mal ein kurzes Code-Fragment anhängen, setzt Du z.b. HTTP oder Telnet ein?)

Gruß Dominik.

Reinhart

Danke für deine Antwort!

ich habe es jetzt ganz primitiv gelöst, ich benutze die "fhem.pl" und mache es mit "list" und dem gewünschten Devicenamen, das geht schnell genug und reicht für meine Zwecke.

def get_ebus(fhemdevice,cutter):
   global data 
   # /opt/fhem/fhem.pl 10.0.0.5:7072 'list PumpeWatt'| grep 'STATE' |/usr/bin/awk '{print $3}'
   cmd= "/opt/fhem/fhem.pl " + fhemhost + ":7072 'list " + fhemdevice + "'| grep 'STATE' |/usr/bin/awk '{print $" + cutter +"}'"
   data = subprocess.check_output(cmd, shell = True )
   data = data.rstrip('\)\n')
   data = data.strip()
   return data


Ich steuere damit ein Oled direkt vom Raspi und zeige damit ein paar Werte aus FHEM an. Am Raspi braucht auch kein FHEM installiert sein, die fhem.pl genügt. Während andere Daten im Display angezeigt werden, hole ich schon die nächsten somit gibt es merklich auch keine Wartezeit.

LG
Reinhart
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

tobox

Die aktuelle Version 0.5.1 läuft nicht mit obigem Beispiel. Wenn man nach "import fhem" noch folgendes einfügt, geht es:


import logging
logging.basicConfig()

Huntercover

#10
gibt es eine Möglichkeit hier direkt einen fhem anzugeben der real auf einem anderen Pi läuft?
Ich bekomme so leider diesen Fehler:
  ERROR:fhem:Failed to connect to 192.168.178.24:7072

und werde dann wohl fhem auf jedem Pi samt FHEM2FHEM nutzen müssen ..

@tobox: Danke, den Tipp habe ich benötigt :-)

domschl

@tobox: ich konnte die Probleme mit Logging zwar nicht nachvollziehen, habe aber oben das Beispiel ergänzt.

@Huntercover: die python-API sollte auf jeden Fall auch über Netz funktionieren. Was passiert den, wenn Du mit Telnet auf 192.168.178.24:7072 zugreifst?
Wie sieht das Code-Schnipsel aus, mit dem Du den connect versuchst?
Ich der Telnet-port auf FHEM auch aktiv? Netzwerk-Probleme ausgeschlossen?

Huntercover

@domschl: Genial: lag an der nicht vorhandenen telnet Definition auf dem anderen FHEM / Pi! Danke für den trivialen Tipp :-)

Komisch nur, dass ich mich nicht erinnern kann an telnet überhaupt was selbst einzustellen (bei beiden Pi's).
Irgendwie hat der lokale fhem das selbst angelegt oder was auch immer?!

satprofi

hallo.
was genau ist an dem modul besonders?
ich übergebe werte in meinen pythonscripts folgend


#Werte an FHEM uebergeben
os.system('perl /opt/fhem/fhem.pl 7072 "setreading Xtender_SOC SOC '+str(SOC)+'"')


Gesendet mit Tapatalk

gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

domschl

Reines senden an FHEM geht natürlich auch auf Deinem Weg.

Spannender wird es, wenn Werte gelesen werden sollen, oder irgend eine Form von Authentifizierung verwendet wird.
Außerdem bietet das Modul auch noch Events bei Änderungen von Werten im FHEM.

Das alles mit os.system() zu realisieren, dürfte wohl eine Herausforderung sein ;-)

Eine komplette API-Beschreibung gibt's hier:

* https://github.com/domschl/python-fhem