FanSpeedControl PowerBoard X735 von Geekworm / Phyton

Begonnen von sash.sc, 31 Dezember 2021, 11:31:30

Vorheriges Thema - Nächstes Thema

sash.sc

Hallo zusammen.

habe mir über die Tage ein neuen pi4b+ mit dem oben genannten board zusammen gebaut.
Dort gibt es ein phyton script, welches anhand der CPU temp. die drehzal regelt !
Diese würde ich gerne in FHEM abfragen. Mit fehlt jedoch ein Punkt wo ich ansetzen könnte.

Hier mal die beiden Scripts in phyton.

1. zum steuern des fan.


#!/usr/bin/python
import pigpio
import time

servo = 13

pwm = pigpio.pi()
pwm.set_mode(servo, pigpio.OUTPUT)
pwm.set_PWM_frequency( servo, 25000 )
pwm.set_PWM_range(servo, 100)
while(1):
     #get CPU temp
     file = open("/sys/class/thermal/thermal_zone0/temp")
     temp = float(file.read()) / 1000.00
     temp = float('%.2f' % temp)
     file.close()

     if(temp > 30):
          pwm.set_PWM_dutycycle(servo, 40)

     if(temp > 50):
          pwm.set_PWM_dutycycle(servo, 50)

     if(temp > 55):
          pwm.set_PWM_dutycycle(servo, 75)

     if(temp > 60):
          pwm.set_PWM_dutycycle(servo, 90)

     if(temp > 65):
          pwm.set_PWM_dutycycle(servo, 100)

     if(temp < 30):
          pwm.set_PWM_dutycycle(servo, 0)
     time.sleep(1)



hier zum auslesen der drehzahl über die console


#!/usr/bin/python
# this python code is base python 2, not python 3
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time

TACH = 16
PULSE = 2
WAIT_TIME = 1

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(TACH, GPIO.IN, pull_up_down=GPIO.PUD_UP)

t = time.time()
rpm = 0

def fell(n):
    global t
    global rpm

    dt = time.time() - t
    if dt < 0.005: return

    freq = 1 / dt
    rpm = (freq / PULSE) * 60
    t = time.time()

GPIO.add_event_detect(TACH, GPIO.FALLING, fell)

try:
    while True:
        print "%.f RPM" % rpm
        rpm = 0
        time.sleep(1)

except KeyboardInterrupt:
    GPIO.cleanup()




Hier noch den link zur seite mit der software.

https://wiki.geekworm.com/X735_V2.5_Software
Wie kann man den entsprechenden gpio in fhem abfragen ?!?!

Danke im vorraus

Gruß
Sascha
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

MadMax-FHEM

#1
Z.B. statt:

        print "%.f RPM" % rpm

(oder zusätzlich ;) )

sowas:

/usr/bin/perl /opt/fhem/fhem.pl 7072 "setreading Devicename Readingname $rpm" 2>&1 > /dev/null

oder auch mittels echo und nc oder per http(s)...

Otto hat glaub ich einen Blog dazu, also wie Daten von Shell-Script nach fhem...
EDIT: z.B. https://heinz-otto.blogspot.com/2017/03/csrf-token-und-fhem.html

EDIT: siehe auch https://github.com/heinz-otto/fhemcl und https://forum.fhem.de/index.php/topic,115715.msg1100408.html#msg1100408

EDIT: es ginge/geht sicher auch das Script aufzuteilen. Also den Teil der zu Beginn immer muss (einrichten der GPIO usw.) einmal bei Systemstart auszuführen (lassen) und den Teil, wo abgefragt wird dann zyklisch per at aus fhem heraus aufrufen oder per cron... -> es gibt (wie so oft) viele Möglichkeiten ;)

Dazu dann eben telnet in fhem und ein Device was die Daten aufnimmt (zur Not ein dummy ;)  )...
Allerdings würde ich die Abfrage etwas länger pausieren lassen -> sleep länger machen...

Oder eben (falls du das Shell-Script nicht laufen lassen willst) in das Python auch z.B. Telnet richtung fhem, allerdings weiß ich nicht wie man das in Python macht...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

sash.sc

Danke erstmal. Werde nächstes Jahr mal schauen.

Gruß Sascha
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

sash.sc

#3
Zitat von: MadMax-FHEM am 31 Dezember 2021, 11:50:39


EDIT: es ginge/geht sicher auch das Script aufzuteilen. Also den Teil der zu Beginn immer muss (einrichten der GPIO usw.) einmal bei Systemstart auszuführen (lassen) und den Teil, wo abgefragt wird dann zyklisch per at aus fhem heraus aufrufen oder per cron... -> es gibt (wie so oft) viele Möglichkeiten ;)


Danke für deine Ausführungen.

Es wurde ein Phyton script eingerichtet, welches beim booten des pi automatisch mit ausgeführt wird.

Wenn ich in der Console folgendes eingebe, dann wird im Sekundentakt die Umdrehung des Lüfters ausgegeben !

python /home/pi/x735-v2.5/read_fan_speed.py

Das Script habe ich oben im Post mit angehangen.

Ich wollte nur wissen, ob ich an dem Script vorbei die RPM des Lüfters abfragen kann?
Oder ob ich das Script dafür von FHEM aus aufrufen muss bzw kann.

Und wenn, dann wie ?

Generell möchte ich die RPM in ein Reading schreiben.

Genau so sollte es möglich sein, evtl. die RPM zu steuern. in 1. Linie geht es mir um die Abfrage.

Danke und Gruß
Sascha
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

MadMax-FHEM

#4
Ah, ist mir gar nicht aufgefallen, sind ja beides python Scripts...
Dachte das zweite wäre ein Shell-Script...

Dann passt die Zeile so leider wohl nicht.
Wie man telnet mit Python macht weiß ich leider nicht...

Was ich eigenartig finde (bzw. nur unter bestimmten Bedinungen funktionieren dürfte) ist der "Autostart".

So wie ich das überflogen habe funktioniert das, wenn sich der User pi einloggt wird es gestartet.
Also nur, wenn sich tatsächlich der User pi einloggt oder eben "autologin to console" aktiviert ist (dann eben "immer")...

Wie ist das Script gedacht, irgendwie (wie geschrieben: Python ist nicht meine Welt) sieht es nach (wie du auch schreibst) sekündlicher Ausgabe aus (while Schleife).

Was passiert, wenn du das Script so abänderst (kannst ja eine Kopie anlegen):

cp /home/pi/x735-v2.5/read_fan_speed.py home/pi/x735-v2.5/read_fan_speed_once.py

[code]
#!/usr/bin/python
# this python code is base python 2, not python 3
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time

TACH = 16
PULSE = 2
WAIT_TIME = 1

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(TACH, GPIO.IN, pull_up_down=GPIO.PUD_UP)

t = time.time()
rpm = 0

def fell(n):
    global t
    global rpm

    dt = time.time() - t
    if dt < 0.005: return

    freq = 1 / dt
    rpm = (freq / PULSE) * 60
    t = time.time()

GPIO.add_event_detect(TACH, GPIO.FALLING, fell)

try:
        print "%.f RPM" % rpm

    GPIO.cleanup()


Dann sollte 1x die aktuelle Fan-Speed ausgegeben werden?

(ob das mit einem laufenden Script "kollidiert": keine Ahnung -> besser mal den [eh komischen] Autostart rausnehmen)

Wenn das tut, dann entweder rausfinden wie man mit Python telnet oder http(s) Aufrufe macht, dann entsprechend die Zeilen von mir anpassen und statt dem print-Befehl einbauen (wie ja bereits geschrieben).

Alternative (aber nicht sonderlich schön ;)  ) das Python per bash Script aufrufen und dann meine Zeilen (angepasst) einbauen.

In etwa so:


#!/bin"bash

# sollte auch ohne vorangestelltes python gehen, dass es ein python script ist, steht ja im script selbst
speed=$(/home/pi/x735-v2.5/read_fan_speed_once.py)

# Devicename -> halt das fhem device eintragen welches den Wert erhalten soll [kann auch ein dummy sein]
# Readingname -> anpassen wie das Reading heißen soll, das den Wert erhält
/usr/bin/perl /opt/fhem/fhem.pl 7072 "setreading Devicename Readingname $speed" 2>&1 > /dev/null


Das neue bash-Script ausführbar machen (chmod +x Scriptname) und dann mal auf der Console aufrufen:

./Scriptname
(vorausgesetzt du befindest dich dort wo auch das Script ist)

EDIT: nicht vergessen, dazu ist ein telnet-Device in fhem notwendig! Ansonsten eben einen http(s) Aufruf einbauen, siehe Links...

Wenn das geht, kannst du überlegen, wie du es aufgerufen haben willst:

- zyklisch per cron

- zyklisch per at aus fhem

- ...

Beim Steuern kann man das ähnlich machen, müsste man eben nur schauen wie man Parameter an ein Python Script weiter gibt und dort dann statt des temperaturabhängigen Setzens der Geschwindigkeit eben auf den übergebenen Wert setzen...

Ich hoffe der Autostart für das "Steuer-Script" ist anders gelöst?
Weil sonst ist es wohl wie geschrieben: es wird nur autom. gestartet, wenn sich der User pi einloggt (kann nat. auch automatisch erfolgen, Einstellbar z.B. per raspi-config), ansonsten wird die Geschwindigkeit nicht geregelt...
(so sehe ich das jedenfalls)

Schöner ist nat. entweder das Python ganz auf bash umschreiben (es steuert bzw. frägt ja "nur" GPIO ab, das geht auch mit bash) oder eben die telnet oder http(s) Aufrufe Richtung fhem eben in Python programmieren...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

sash.sc

Besteht die Möglichkeit das PWM Signal vom GPIO 13 mittels des Moduls RPI_GPIO auszuwerten ????

Für mich sind es im Moment "zuviele" Zwischenwege um an das Ergebnis zu kommen.

Gruß
Sascha
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

MadMax-FHEM

#6
Zitat von: sash.sc am 02 Januar 2022, 13:43:06
Besteht die Möglichkeit das PWM Signal vom GPIO 13 mittels des Moduls RPI_GPIO auszuwerten ????

Ich weiß nicht genau wie der Wert per GPIO geliefert wird: TACHO -> Analogwert.
Keine Ahnung, ob das RPI_GPIO das kann.

Wenn du das Modul kennst: probiere es aus...


Zitat von: sash.sc am 02 Januar 2022, 13:43:06
Für mich sind es im Moment "zuviele" Zwischenwege um an das Ergebnis zu kommen.

Naja, so viele Schritte sind es auch nicht... ;)

Die "Abwandlung" des Python-Scripts ja nur, weil wir keine "Endlosschleife" brauchen/wollen (die mMn eh keinen Sinn macht: wer will sich schon auf der Console dauernd die Werte anschauen ;) ).

Der "Einbau" bzw. der Aufruf des abgewandelten Python Scripts in ein bash-Script ja nur, weil ich nicht weiß, wie man aus Python eben telnet-Aufrufe macht...
Wenn du das weißt/rauskriegst, dann einfach (wie geschrieben) das einbauen... :)

Ansonsten: was spricht gegen ausprobieren von den geposteten Dingen? 8)

Es gibt auch ein Python-fhem-Modul womit sich wohl Python-Code/-Sctipte/-... "in" fhem Module "wandeln" lassen, habe ich aber noch nicht genutzt...
Glaube das hier: https://forum.fhem.de/index.php/topic,63816.msg550395.html#msg550395

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

sash.sc

#7
Hallo Joachim.

Habe es versucht jetzt mal umzusetzen. Script nach deine Vorgabe abgeändert und eigens gespeichert.
Das 2. Script angelegt und die Daten agepasst, zwecks device und reading, und ausführbar gemacht.
Habe das ganze dann in der comandbar in fhem mit

{system ("/home/pi/x735-v2.5/read_fan.sh")}

ausgeführt. Dauerte einen Moment und es kam der Wert -1 zurück.

Kein reading wurde geändert. Telnet ist auf FHEM aktiviert (Test mit iobroker).

Habe dein script nochmal angepasst.

bekomme da aber nur den Wert 0 RPM zurück

#!/usr/bin/python
# this python code is base python 2, not python 3
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time

TACH = 16
PULSE = 2
WAIT_TIME = 1

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(TACH, GPIO.IN, pull_up_down=GPIO.PUD_UP)

t = time.time()
rpm = 0

def fell(n):
    global t
    global rpm

    dt = time.time() - t
    if dt < 0.005: return

    freq = 1 / dt
    rpm = (freq / PULSE) * 60
    t = time.time()

GPIO.add_event_detect(TACH, GPIO.FALLING, fell)

try:
        print "%.f RPM" % rpm
        rpm = 0

except KeyboardInterrupt:
    GPIO.cleanup()


Das script weclhes von fhem aufgerufen werden soll.


#!/bin/bash

# sollte auch ohne vorangestelltes python gehen, dass es ein python script ist, steht ja im script selbst
speed=$(/home/pi/x735-v2.5/read_fan_speed_once.py)

# Devicename -> halt das fhem device eintragen welches den Wert erhalten soll [kann auch ein dummy sein]
# Readingname -> anpassen wie das Reading heißen soll, das den Wert erhält
/usr/bin/perl /opt/fhem/fhem.pl 7072 "setreading testdummy rpm $speed" 2>&1 > /dev/null


Habe nochmal getestet, das script was kontinuierlich die rpm ausliest. Dort ist der 1. immer 0 rpm. Erst der 2. Wert zeigt die richtigen RPM an.

Gruß
sascha

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

MadMax-FHEM

Ok, das -1 ist normal bei Aufruf mit system ;)
Und der Aufruf mit system aus fhem heraus ist BLOCKIEREND, sollte so also nicht genutzt werden...
...außer mit einem '&' am Ende ;)

Und du hast nicht so gemacht wie geschrieben, leider...

Aber nun sind ja einige Infos da.

Wir brauchen dann wohl zumindest einen Schleifenlauf, baue ich morgen mal um...

Nur zur Sicherheit:

du hast einen dummy angelegt?
du hast ein telnet Device auf 7072 OHNE User/PW?

Was passiert, wenn du:


/usr/bin/perl /opt/fhem/fhem.pl 7072 "setreading testdummy rpm 10" 2>&1 > /dev/null

in der LINUX Console eingibst?

Oder wird nun (doch) das Reading rpm im Device testdummy gesetzt?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MadMax-FHEM

#9
Was passiert mit diesem Script, aufgerufen auf der Linux-Console ;)


#!/usr/bin/python
# this python code is base python 2, not python 3
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time

TACH = 16
PULSE = 2
WAIT_TIME = 1

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(TACH, GPIO.IN, pull_up_down=GPIO.PUD_UP)

t = time.time()
rpm = 0

def fell(n):
    global t
    global rpm

    dt = time.time() - t
    if dt < 0.005: return

    freq = 1 / dt
    rpm = (freq / PULSE) * 60
    t = time.time()

GPIO.add_event_detect(TACH, GPIO.FALLING, fell)

while True:
    print "%.f RPM" % rpm
    if rpm > 0: break
    rpm = 0
    time.sleep(1)

GPIO.cleanup()


Es sollte laufen und einen Wert größer 0 ausgeben und dann beendet sein.
Wichtig bei Python ist wohl die "Einrückung", also das GPIO.cleanup muss wohl ganz an den Zeilenanfang...

Aber das ist nur mein aktuelles "Python-Wissen" (aus "Experimenten")... ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

sash.sc

Über die  Linux console wird das reading geschrieben.
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

MadMax-FHEM

#11
Zitat von: sash.sc am 02 Januar 2022, 22:30:53
Über die  Linux console wird das reading geschrieben.

Mit welcher Variante jetzt?

Das letzte Python von mir und eingebaut in das bash-Script?
EDIT: weil NUR das Python-Script schreibt ja (noch) kein Reading nach fhem! ;)

Du solltest (erst mal) nur das letzte Pythin Script ausführen, um zu sehen, ob denn ein rpm Wert kommt ;)

Ich denke ich habe auch das Telnet gelöst...

Jetzt muss ich aber wirklich wissen: WAS GENAU hast du probiert und WAS GENAU geht nun!

Wenn mein letztes Python (also NUR das Python!) Script auf der Linux Console einen "brauchbaren" Wert ausgibt, dann baue ich da das Telnet-Zeugs ein...

Wenn du willst, kannst du das auch gleich zyklisch lassen, also das "Original-Script" nehmen, den Timer länger machen (nicht alle Sekunde) und dann statt dem Print Befehl den Telnet-Befehl einbauen.
Dann kannst du das angepasste Original-Python-Script wieder "autostart-bar" machen.

ALLERDINGS: mir kommt die im git beschriebene "autostart-Variante" sehr "eigenartig" vor!

Daher würde ich eher das Script OHNE "Dauer-While" zyklisch per cron aufrufen...

EDIT: hier der Code für Telnet IM Python-Script
zu Beginn, gleich nach dem #!/.../python

import telnetlib
tn = telnetlib.Telnet('localhost',7072)

und statt dem Print-Befehl:

tn.write(b"setreading testdummy rpm %s\n"%rpm)


EDIT: hier mal eingebaut in meine letzte Python-Script-Version, in der Annahme, dass es funktioniert ;) (sollte 1x laufen und den aktuellen RPM nach fhem in den dummy schreiben und dann "fertig" sein)

#!/usr/bin/python
# this python code is base python 2, not python 3
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import telnetlib

tn = telnetlib.Telnet('localhost',7072)

TACH = 16
PULSE = 2
WAIT_TIME = 1

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(TACH, GPIO.IN, pull_up_down=GPIO.PUD_UP)

t = time.time()
rpm = 0

def fell(n):
    global t
    global rpm

    dt = time.time() - t
    if dt < 0.005: return

    freq = 1 / dt
    rpm = (freq / PULSE) * 60
    t = time.time()

GPIO.add_event_detect(TACH, GPIO.FALLING, fell)

while True:
    print "%.f RPM" % rpm
    if rpm > 0:
      tn.write(b"setreading testdummy rpm %s\n"%rpm)
      break
    rpm = 0
    time.sleep(1)

GPIO.cleanup()


Bin gespannt auf deine Antworten, damit es etwas klarer wird, was nun geht und was nicht (wäre besser, wenn du genau machen würdest was ich schreibe oder zumindest schreiben würdest WAS GENAU DU WOMIT GENAU gemacht hast und WIE GENAU das Ergebnis war ;)  )

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

sash.sc

#12
Zitat von: MadMax-FHEM am 02 Januar 2022, 22:11:39



/usr/bin/perl /opt/fhem/fhem.pl 7072 "setreading testdummy rpm 10" 2>&1 > /dev/null

in der LINUX Console eingibst?



Gruß, Joachim

In der Linux Console wird damit das reading in testdummy geschrieben mit dem Wert 10.

Habe dann das Phyton script so angepasst bzw übernommen wie aus deinem lestzten Post.


#!/usr/bin/python
# this python code is base python 2, not python 3
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import telnetlib

tn = telnetlib.Telnet('localhost',7072)

TACH = 16
PULSE = 2
WAIT_TIME = 1

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(TACH, GPIO.IN, pull_up_down=GPIO.PUD_UP)

t = time.time()
rpm = 0

def fell(n):
    global t
    global rpm

    dt = time.time() - t
    if dt < 0.005: return

    freq = 1 / dt
    rpm = (freq / PULSE) * 60
    t = time.time()

GPIO.add_event_detect(TACH, GPIO.FALLING, fell)

while True:
    print "%.f RPM" % rpm
    if rpm > 0:
      tn.write(b"setreading testdummy rpm %s\n"%rpm)
      break
    rpm = 0
    time.sleep(1)

GPIO.cleanup()

Und es in der Console ausgeführt.
1. Wert 0rpm
2. Wert 2544 rpm

Edit:
Habe gesehen, dass das angepasste Script auch den Wert in testdummy schreibt. ;D ;D ;D ;D
Wie ruft man aus FHEM das Script auf ?

DANKE !!!!!!!!


Gruß
Sascha
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

MadMax-FHEM

Hallo Sascha,

freut mich, war nicht sicher, ob mein Python-Zeugs auch tut ;) :)

Warum nicht per cron ausführen lassen?

Aber wenn du (unbedingt) aus fhem raus willst:

Script nach /opt/fhem "schieben" (oder dort in einen Unterordner wenn du willst):

sudo mv /home/pi/Script.py /opt/fhem/


Dann nat. die Besitzrechte korrigieren:

sudo chown fhem:dialout /opt/fhem/*.py


sollte zwar schon ausführbar sein aber sicher ist sicher ;)

sudo chmod +x /opt/fhem/*.py


ANMERKUNG: besser statt *.py den Scriptnamen ausschreiben! (aber es sollte unter /opt/fhem/ nicht allzuviele py-Scripte geben ;)  )

Aufruf dann aus fhem z.B. per at:


define atRPM at *00:01:00 "/opt/fhem/Script.py"

(hier geht nat. *.py nicht ;)  )

Somit sollte alle Minute (oder ändern) das Script aufgerufen werden und den Wert setzen...

Wenn du willst, kannst du das Python-Script auch erst mal (nach dem Verschieben etc.) aus fhem aufrufen (bevor du das at definierst):

"/opt/fhem/Script.py"

INKL.!! Der Anführungszeichen in FhemWeb...

U.U. kann es sein, dass fhem ein Python-Script nicht einfach so aufrufen kann (z.B. python nicht gefunden etc.), dann mal folgendes probieren:

which python


Das dann "merken" (kopieren) und VOR den Scriptaufruf dazu nehmen:

"KopiertesHier /opt/fhem/Script.py"


Sollte dann sowas ähnliches ergeben:

"/usr/bin/python /opt/fhem/Script.py"

(evtl. dann die #! Zeile aus dem Python Script entfernen)

Es kann allerdings sein, dass (ab und an) "komische" Sachen im fhem-Log stehen, da bei einem Aufruf aus fhem heraus Fehler etc. im fhem-Log landen (auch verbose hilft dann nicht).
Wie man das bei Python-Scripten unterdrücken kann: keine Ahnung...

Es ginge auch das Script von einer Unit-Datei (Service-Start-Script) aufzurufen und dann wieder eine Endlos-Schleife einbauen...

Liegt an dir...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

sash.sc

Zitat von: MadMax-FHEM am 03 Januar 2022, 16:32:07


Aufruf dann aus fhem z.B. per at:


define atRPM at *00:01:00 "/opt/fhem/Script.py"



Hallo Joachim.

Also, per DOIF und at geht es nicht.
Bekomme dann folgende Meldung im LOG File


RuntimeError: Not running on a RPi!
    GPIO.setup(TACH, GPIO.IN, pull_up_down=GPIO.PUD_UP)
  File "/opt/fhem/RPM/read_fan_speed_once.py", line 16, in <module>
Traceback (most recent call last):


Habe das ganze dann per crontab angelegt, im Minutentakt.
Das funktioniert......

Gruß
Sascha
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb