Neues Python FHEM API-Modul auf PyPI

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

Vorheriges Thema - Nächstes Thema

satprofi

in diesem falle, hast recht. werd es mir mal ansehen.

Gesendet mit Tapatalk

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

stkr002


Hallo,

ist nicht ganz das Thema, aber vielleicht kann mir jemand helfen: Ich möchte aus FHEM heraus Python-Skripte starten. Das ist mir bisher leider nicht gelungen. Ich kann zwar grundsätzlich die Python-Skripte aufrufen, aber diese werden - warum auch immer - nicht ausgeführt.

Derzeit behelfe ich mir mit dem API-Modul: Ich habe eine Python-Dauerschleife, welche diverse FHEM readings abfragt und dann die entsprechenden python-Skripte startet. Funzt zwar, aber der Direktstart aus FHEM wäre irgendwie eleganter...

mumpitzstuff


Superwutz

#18
Huhu,

ich versuche momentan hiermit ein Userreading von mir zu verändern.
Das klappt leider irgendwie nicht.

So wird in fhem mein reading definiert:
attr Heizstab userReadings Verbrauch {2000}

So versuche ich es in python zu beschreiben:
fh.send_cmd("setreading " + s + " Verbrauch " + str(cpc))

s ist hier der devicename und cpc mein (int) Wert..
Leider ändert sich in fhem gar nichts bei dem Reading..
FHEM unter Windows
Drölfzig Homematic IP Devices

ralfi

Hallöchen, ich hätte da mal eine Frage und zwar:

ich habe das Modul ganz normal mit pip install fhem installiert und versuche mich nun mit dem FHEM Server zu connecten.

Script:

import fhem

fh = fhem.Fhem(.....

Dabei kriege ich folgende Fehlermeldung: AttributeError: 'module' object has no attribute 'Fhem'

wie kann das den Sein???

domschl

Die wahrscheinliche Erklärung ist die Wahl des Filenames Deines scripts.

Es heißt doch nicht etwa fhem.py? ;)

Dann import Dein script nämlich nicht das fhem-Module, sondern sich selbst...

TK67

Hallo domschl,

irgendwie komme ich da im Moment nicht weiter.

Ein fh.get_dev_reading("Victron", "BetriebsartValue") liefert mir
{u'BetriebsartValue': 3, u'Betriebsart': u'Bulk '}

Ein  fh.get_dev_reading("Victron", "BetriebsartValue") bringt mir noch mehr Ausgaben
{u'BetriebsartValue': {u'Value': 3, u'Time': datetime.datetime(2019, 6, 1, 12, 26, 47)}, u'Betriebsart': {u'Value': u'Bulk ', u'Time': datetime.datetime(2019, 6, 1, 12, 26, 47)}}

Internals:
   DEF        /dev/serial/by-id/usb-VictronEnergy_BV_VE_Direct_cable_VE2P2V9M-if00-port0@19200
   DeviceName /dev/serial/by-id/usb-VictronEnergy_BV_VE_Direct_cable_VE2P2V9M-if00-port0@19200
   FD         12
   FUUID      5c52f98f-f33f-e972-cec2-60b0e8e060a18a16
   NAME       Victron
   NR         63
   PARTIAL   
   STATE      Leistung: 230.00 W<br/>Batterie: 13.61 V<br/>Batterie: 16.50 A<br/>Ertrag heute: 0.76 kWh
   TYPE       VEDirect
   READINGS:
     2019-06-01 13:07:31   Betriebsart     Bulk
     2019-06-01 13:07:31   BetriebsartValue 3
     2019-06-01 13:07:31   DaySequenceNumber 316
     2019-06-01 13:07:31   Fehlermeldung   kein Fehler
     2019-06-01 13:07:31   Firmware        1.39
     2019-06-01 13:07:31   Lastausgang     eingeschaltet
     2019-06-01 03:43:48   state           opened
   SENDBUFFER:
     undef
Attributes:
   Darstellung_Ertrag kWh
   addLog     Maximale_Leistung_heute
   room       Solaranlage
   stateFormat Leistung: LeistungPanel_W<br/>Batterie: Spannung_V<br/>Batterie: Strom_A<br/>Ertrag heute: kWh_Ausbeute_heute


Wie komme ich jetzt an den Wert von "BetriebsartValue" also die 3 ? Es scheint so das alle Readings die gleich anfangen im Device, zusammen gefasst werden. Ich benutze zur Zeit die Version 0.6.1

Gruß TK67
FHEM auf Raspberry Pi 3 Model B+

domschl

Hallo,

fh.get_dev_reading(device, reading) (oder get_device_reading()) liefert ein python dictionary:


my_dict = fh.get_dev_reading("Victron", "BetriebsartValue")
print(my_dict)  # {u'BetriebsartValue': 3, u'Betriebsart': u'Bulk '}
betr_val = my_dict["BetriebsartValue"]
print(betr_val)   # Sollte jetzt '3' ausgeben.


kaskadiert (zwei ineinander verschachtelte dictionaries):

# Antwort von Fhem:
my_dict={u'BetriebsartValue': {u'Value': 3, u'Time': datetime.datetime(2019, 6, 1, 12, 26, 47)}, u'Betriebsart': {u'Value': u'Bulk ', u'Time': datetime.datetime(2019, 6, 1, 12, 26, 47)}}
print(my_dict['BetriebsartValue']['Value'])   # -> 3


Zu Python dictionaries, siehe z.b. hier:
https://www.w3schools.com/python/python_dictionaries.asp

Dom.

TK67

Danke für die prompte Antwort und den Link zu den Dictionaries.
Bin leider erst heute wieder dazu gekommen hier weiter zu machen und komme jetzt auch an meinen Zahlenwert.

Eine Frage ist allerdings noch offen, warum wird bei dem gleichen Befehl einmal ein Dictionarie gebildet und dann wiederum nicht.
Habe zum testen mal ein Dummy mit den 2 Readings erzeugt.

list versuch
Internals:
   FUUID      5cf6bacf-f33f-c80d-ddc2-5e09c99527f1887b
   NAME       versuch
   NR         528
   STATE      ???
   TYPE       dummy
   OLDREADINGS:
   READINGS:
     2019-06-04 21:23:59   Betriebsart     Bulk
     2019-06-04 21:23:23   BetriebsartValue 3
   helper:
     bm:
       dummy_Define:
         cnt        1
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        1559673760.1605
         max        5.79357147216797e-05
         tot        5.79357147216797e-05
         mAr:
           HASH(0x6f4d3c0)
           versuch dummy
       dummy_Set:
         cnt        47
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        1559675222.63004
         max        0.000472068786621094
         tot        0.00869655609130859
         mAr:
           HASH(0x6f4d3c0)
           versuch
           ?
Attributes:


Beispiel 1
ein fh.get_dev_reading("versuch", "BetriebsartValue") ergibt:
{u'BetriebsartValue': 3, u'Betriebsart': u'Bulk'}
ein len() auf die Ausgabe ergibt 2, was dann ja die Anzahl der Elemente dastellt

Beispiel 2
im Gegenzug ergibt fh.get_dev_reading("versuch", "Betriebsart") direkt den Wert des Readings:
Bulk
ein ensprechendes len() dann 4, wohl dann die länge des Strings.

Wieso dieses unterschiedliche Verhalten ?
Arbeite jetzt auch schon länger mit dem Modul und hatte eigentlich immer eine Ausgabe die ich direkt weiter verarbeiten konnte, sowie im Beispiel 2.
Scheinbar hatte ich dann wohl nur mit Readings zu tun die nicht einen weiteren Readingnamen in sich beinhalten, wie hier als Beispiel Betriebsart schon in BetriebsartValue steckt.

Ansonsten danke für ein klasse Modul, ohne das ich so manche Sachen gar nicht oder nur mit erheblichen Aufwand hätte umsetzen können.

Gruß TK67
FHEM auf Raspberry Pi 3 Model B+

domschl

Das ist schon merkwürdig.

Um rauszukriegen, wo der Fehler liegt, bitte folgendes ausprobieren

  • Komplettes Code-fragment hier reinkopieren (die erste Mail hatte einen Copy/Paste Fehler: Beides mal war BetriebsartValue verwendet, die Ausgabe passte dann nicht dazu.)
  • Logging am Anfang des codes anschalten:

import logging
logging.basicConfig(level=logging.DEBUG)

Log-Ausgaben dann bitte in die Antwort packen.

Dann sollten wir rausfinden können, an welcher Stelle es schief läuft.

Dom.

TK67

#25
Hab mal alles auf das nötigste verkleinert.

List vom Device
Internals:
   FUUID      5cf6bacf-f33f-c80d-ddc2-5e09c99527f1887b
   NAME       versuch
   NR         528
   STATE      off
   TYPE       dummy
   READINGS:
     2019-06-04 21:23:59   Betriebsart     Bulk
     2019-06-04 21:23:23   BetriebsartValue 3
     2019-06-06 13:21:20   state           off
   helper:
     bm:
       dummy_Set:
         cnt        37
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        1559820074.08844
         max        0.0328681468963623
         tot        0.0684270858764648
         mAr:
           HASH(0x5ad1218)
           versuch
           on
Attributes:


Programmcode:
#!/usr/bin/python
# coding=utf8

import logging
import fhem

logging.basicConfig(level=logging.DEBUG)

fh = fhem.Fhem("192.168.178.14")
fh.connect()
print
print "-------Ausgabe von fh.get_dev_reading('versuch', 'BetriebsartValue')"
print fh.get_dev_reading('versuch', 'BetriebsartValue')
print
print "------Ausgabe von fh.get_dev_reading('versuch', 'Betriebsart')"
print fh.get_dev_reading('versuch', 'Betriebsart')
print
fh.close()

exit(0)


Ausgabe:
pi@raspberrypi:~ $ 1.py
DEBUG:Fhem:Creating socket...
INFO:Fhem:Connecting to 192.168.178.14:7072 without SSL
INFO:Fhem:Connected to 192.168.178.14:7072

-------Ausgabe von fh.get_dev_reading('versuch', 'BetriebsartValue')
WARNING:Fhem:Deprecation: use get_device_reading('device', 'reading') instead of get_dev_reading
DEBUG:Fhem:Sending: jsonlist2 NAME~versuch
DEBUG:Fhem:Connected, sending...
INFO:Fhem:Sent msg, len=23
INFO:Fhem:JSON answer received.
{u'BetriebsartValue': 3, u'Betriebsart': u'Bulk'}

------Ausgabe von fh.get_dev_reading('versuch', 'Betriebsart')
WARNING:Fhem:Deprecation: use get_device_reading('device', 'reading') instead of get_dev_reading
DEBUG:Fhem:Sending: jsonlist2 NAME~versuch
DEBUG:Fhem:Connected, sending...
INFO:Fhem:Sent msg, len=23
INFO:Fhem:JSON answer received.
Bulk

INFO:Fhem:Disconnected from fhem-server


Sehe da jetzt leider bei der Debug Ausgabe keine Unterschiede, bis auf natürlich das Ergebnis.

Das ganze lässt sich wohl auch erweitern, habe zu Testzwecken noch ein Reading "BetriebsartValueOld" erstellt, bei Abfrage dessen werden die anderen beiden Readings auch inkludiert:
print fh.get_dev_reading('versuch', 'BetriebsartValueOld')
{u'BetriebsartValueOld': 5, u'BetriebsartValue': 3, u'Betriebsart': u'Bulk'}

Gruß TK67


Nachtrag:

wenn ich jetzt alle Readings bis auf Betriebsart lösche
bekomme ich immer noch den Wert von Betriebsart, auch wenn ich das nicht mehr existierende fh.get_dev_reading('versuch', 'BetriebsartValue') abfrage
-------Ausgabe von fh.get_dev_reading('versuch', 'BetriebsartValue')
WARNING:Fhem:Deprecation: use get_device_reading('device', 'reading') instead of get_dev_reading
DEBUG:Fhem:Sending: jsonlist2 NAME~versuch
DEBUG:Fhem:Connected, sending...
INFO:Fhem:Sent msg, len=23
INFO:Fhem:JSON answer received.
Bulk


Irgendwas scheint hier fälschlicherweise als Wildcard zu arbeiten, könnte ich mir vorstellen.
FHEM auf Raspberry Pi 3 Model B+

domschl

Danke für die ausführliche Log-Information: In der Tat ein Bug!

Wenn ein Reading-Name einfach eine längere Version eines bereits existierenden Reading-Namens ist, dann gibt das Modul z.Zt. fälschlicherweise beide aus. Wie Du schon vermutet hast, liegt da mit den Wildcards was im argen.

Falls readings 'name' und 'nameplus' existieren, dann gibt eine Anfrage an 'nameplus' auch 'name' aus.

Ich guck mir das mal genauer an.

domschl

Ich denke ich habe das Problem:
https://github.com/domschl/python-fhem/issues/14
Ich bereite eine neue Version 0.6.2 vor.

Noch eine Anmerkung: Die Tatsache, dass manchmal ein dictionary und manchmal 'nur' ein Value ('Bulk') zurueckgegeben wird, liegt daran, dass Du eine alte 'deprecated' API verwendest. Wenn statt dessen 'get_device_reading()' (nicht `get_dev_reading()`) verwendt wird, klappt es und es kommt immer ein Dictionary.

domschl

python-fhem 0.6.2 ist nun auf pypi released: https://pypi.org/project/fhem/

Update mit:

pip install -U fhem

Neben kleiner Bugfixes wie dem Problem, daß bei ähnlichen Readings-Namen zu viele Antworten gegeben wurden, ist die Haupt-Neuheit ein automatisches Test-Framework mit Travis-CI.
Code-Änderungen werden jetzt automatisch gegen eine FHEM-Testinstallation getestet, für Python 2.7, 3.6, Telnet, SSL-Telnet, HTTP, HTTPS und Passwort-Checks.

Empfohlen wird die Verwendung von HTTP oder HTTPS.

Loredo

Ich finde den Namen des Pakets unglücklich gewählt, da es sich hier nicht um ein komplettes FHEM handelt.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER