Neues Python FHEM API-Modul auf PyPI

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

Vorheriges Thema - Nächstes Thema

Forstling

#60
pi@raspberrypi:~ $ ls -la /opt/fhem/FHEM/Python
insgesamt 52
drwxr-xr-x 2 pi   pi       4096 Feb  2 19:15 .
drwxrwxrwx 7 fhem dialout 36864 Feb  2 19:10 ..
-rwxr-xr-x 1 pi   pi       2147 Feb  2 19:58 fhem-dht.py
-rwxrwxrwx 1 pi   pi       1914 Feb  2 20:49 MAX31865.py
pi@raspberrypi:~ $

?

fhem-dht.py funktioniert

amenomade

Zitat von: Forstling am 02 Februar 2020, 21:13:30

fhem-dht.py funktioniert
Ja, aber der User fhem darf es nicht ausführen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Forstling

Jetzt funktioniert es

es Lag daran das FHEM nicht auf den SPI Bus zugreifen durfte.



Gear

#63
Guten Morgen Zusammen!

Ich habe das Problem, dass manchmal beim Auslesen nur ein "{}" ausgelesen wird.
Mein Script funktioniert ohne Probleme, die Verbindung wird als "true" zurückgegeben.

Hat jemand eine Idee?

Edit:
Ich habe nun mal zum Testen ein TimeOut von 1s auch beim Einlesen gemacht, bis jetzt scheinbar kein Problem mehr...
> ODroid H3 => OMV => Docker => FHEM <
Fritz!Box 7590, Fritz!Repeater 6000, MQTT, RaspberryMatic, Zigbee2MQTT, ESP32, ESP8266, Shelly, Grafana ...
> 3D-Druck <

Gear

So, muss mich mal zurückmelden, wegen dem im vorherigen Problem.
Leider gibt es immer mal wieder Probleme beim Auslesen.

Es wird einfach ein {} zurückgegeben, obwohl das Device einen Wert drin hat.

Es scheint, als würde hier FHEM irgendwie blockiert sein?!
Ich hoffe, dass mir jemand helfen kann.
> ODroid H3 => OMV => Docker => FHEM <
Fritz!Box 7590, Fritz!Repeater 6000, MQTT, RaspberryMatic, Zigbee2MQTT, ESP32, ESP8266, Shelly, Grafana ...
> 3D-Druck <

andies

Vielen Dank für das Modul - ich melde mich wegen eines Problems, das oben auch schon angesprochen wurde. Auch bei mir kommt es manchmal vor, dass beim Auslesen eines Readings {} zurückgegeben wird (ich bekomme dann einen KeyError). Der Fehler tritt unsystematisch auf, so dass ich einen Programmierfehler ausschließe.

Ich kann den Fehler abfangen bzw erhöhe dann die Readingwerte in FHEM. Dennoch würde mich interessieren, wie man dem Problem auf dem Grund gehen kann? Innerhalb von FHEM gelingt mir das nicht.

Hier mein gesamter Code, nur "gas" ist wichtig:

#!/usr/bin/env python3
import time
import sys
import spidev
import RPi.GPIO as GPIO
import fhem


fh = fhem.Fhem("raspfhem.fritz.box")

spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 40000
numdata = 100

# RPi.GPIO Layout verwenden (wie Pin-Nummern)
GPIO.setmode(GPIO.BCM)
# Pin 17 auf Input setzen, dort ist der keyence angeschlossen
GPIO.setup(17, GPIO.IN)

def GetADC():
        Msum = 0
        s = 0
        while s < numdata:
            adc = spi.xfer2([0, 0])
            hi = (adc[0] & 0x1F);
            low = (adc[1] & 0xFE);  # FE for B, FC for C chip (MCP3201-B/C) Danil
            data = (hi << 8) | low;
            Msum += int(data)
            s += 1
        return int(Msum/(4*numdata))

def Gaszaehler():
   try:
      ## Die Fassung hat das Risiko, dass mir zu viel KeyError-Fehler auftauchen, daher wird *in* FHEM erhöht#####
      #gas = fh.get_device_reading("Heizungskeller", "gas")    <=== ausgeblendete Version, weil problematisch
      #i = int(gas["Value"])
      #fh.send_cmd("setreading Heizungskeller gas " + str(i+1))

      fh.send_cmd("setreading Heizungskeller gas {(ReadingsVal(\"Heizungskeller\", \"gas\", 0)+1)}") <== so mache ich das jetzt
     
   except IOError as err:
      fh.send_cmd("setreading Heizungskeller Fehler I/O error: {0} " + str(format(err)))
   #except KeyError:
   #  fh.send_cmd("setreading Heizungskeller Fehler KeyError: Reading gas unlesbar " + str(gas))  <== dieser Fehler taucht nur selten, aber zu oft auf
   except:
      fh.send_cmd("setreading Heizungskeller Fehler Unbekannter Fehler: " + str(sys.exc_info()[0]))
      fh.send_cmd("set TelegramBot message ‼️ Heizungskeller Unbekannter Fehler: " + str(sys.exc_info()[0]))
      raise
   return

zaehlerwasser = 0
WasHigh = False

try:
    while True:
        time.sleep(0.07)
        zaehlerwasser += 1
        if (zaehlerwasser == 4500):
            wasser = GetADC()
            wasser = 25*(wasser // 25)
            fh.send_cmd("setreading Heizungskeller wasser " + str(wasser))
FHEM 6.1 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

domschl

Ich würde zunächst vorschlagen, logging zu aktivieren, s. Beispiel:

https://github.com/domschl/python-fhem#set-and-get-transactions


Also:


import logging
import fhem

logging.basicConfig(level=logging.DEBUG)


domschl

Neue Version 0.7.0 auf PyPi.

Neuigkeiten:

- Support für mehrere Sessions parallel zu einem oder mehreren FHEM Servern.
- Automatische Tests für Python 3.8, 3.10, 3.11
- Kein Support für Python 2 mehr (Version 0.6.5 benutzen!)

Update der neuen python-fhem Version mit:

pip install -U fhem

Andreasgs

Mir hats die SD - Karte zerlegt und jetzt setzte ich grade den Raspberry 3 neu auf. Dabei greife ich per RS485 die Daten vom STromzähler ab und schreibe diese mit einem Pythonscritp in FHEM. Jetzt muss ich das FHEM Modul in Python nachinstallieren, bekommen aber folgende Fehlermeldung:

 pip install fhem
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.

    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.

    For more information visit http://rptl.io/venv

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.


Habt ihr ne idee wie ich das gelöst bekomme? Die installation in eine virutelle umgebung führt beim ausführen des Skripts zum selben fehler, als hätte ich in der virtuellen Umgebung das PIP - Modul FHEM nicht installiert.

domschl

Ja, neuere Python Versionen erlauben es nicht mehr 'einfach so' beliebige Python Pakete via PIP in den System-Kontext zu installieren: Wird ein komplexeres Paket mit vielen Abhängigkeiten per PIP installiert, dann können die abhängigen Pakete evtl. Teile der System-Python-Pakete überschreiben und für großes Durcheinander sorgen.

Es gibt zwei Lösungen:

1) "Quick and Dirty": Einfach das flag --break-system-packages bei der Installation mit pip angeben: das FHEM Paket hat keine Abhängigkeiten, daher ist nix schlimmes zu befürchten...
2) "Richtig". Die richtige Methode ist es, ein Python Virtual Environment (venv) anzulegen. Damit erhält jedes Python Projekt seine eigene, private Sammlung von Python Paketen, die nicht miteinander in Konflikt treten. Ein Link zur Doku war ja in der Fehlermeldung drin.

Kurz geht das so:

# Erstellen des venv und des Projekt-Verzeichnisses:
python -m venv mein_projekt
cd mein_projekt
# Jetzt Dein FHEM python Script in dieses Verzeichnis (mein_projekt) kopieren.
# Das venv 'aktivieren'
source bin/activate
# Jetzt ist das Environment so gesetzt, daß nur noch lokale python versionen und pakete verwendet werden.
pip install fhem
# Das funktioniert jetzt!
python mein_python_script.py

Das venv wird mit dem Befehl deactivate beendet. Um es dann wieder zu aktivieren, ins Projekt-Verzeichnis gehen und 'source bin/activate' ausführen, das setzt dann Environment und Pfade korrekt.

Alternative kann man auch die Python Version im Projekt-Verzeichnis direkt starten mit:

.../mein_projekt/bin/python3 mein_python_script.py

Die Aktivierung des Environments wird dann von Python automatisch gemacht.