[gelöst] Heizungsregelung mit Servomotor

Begonnen von pure-current, 20 November 2018, 19:02:23

Vorheriges Thema - Nächstes Thema

pure-current

Hallo,

ich versuche gerade einen Stellknopf einer Wohnmobil-Heizung (Truma) mit Hilfe eines Servomotors temperaturgeregelt zu stellen.
Ich habe dazu einen kräftigen Servo, der 270° Stellweg macht (passt zum Weg des Heizungs-Stellknopf).
Die Steuerung per python-script klappt auch schon.
#!/usr/bin/python
import RPi.GPIO as gpio
import time
from argparse import ArgumentParser
parser = ArgumentParser(description='Servo movement')
parser.add_argument('--move_to', dest='move_to', default='0', type=str)
args = parser.parse_args()

#Servo-GPIO (PWM-GPIO 18, Pin 12)
servopin = 18
aktWinkel = 0

# GPIO initialisieren
gpio.setmode(gpio.BCM)
gpio.setup(servopin, gpio.OUT)

# PWM-Frequenz auf 50 Hz setzen
servo = gpio.PWM(servopin, 50)

pwm_neu = float (args.move_to)/10 + 2.5
servo.start(0)
servo.ChangeDutyCycle(pwm_neu)
time.sleep(1)
servo.ChangeDutyCycle(0)
servo.stop (0)
gpio.cleanup()


Aufruf: sudo python /home/pi/servo3.py --move_to PROZENTWERT
von Putty aus gehts einwandfrei...

Am Pi hängt ein DS18B20 1-Wire Temp.-Sensor, der soll die Messung übernehmen.
Mit Hilfe von PID20 soll der Stellwert 0-100% an den Servo geschickt werden.
Stellwerte kommen beim Dummy "Truma.Servo" auch an.
Jetzt müsste fhem nur noch das python-script servo3.py aufrufen können

meine fhem.cfg sieht so aus:
define 1wire GPIO4 BUSMASTER
define Raumtemp GPIO4 28-0113161a281e
attr Raumtemp room Truma
attr Raumtemp stateFormat {round (ReadingsVal("Raumtemp","temperature","?"),1)}

define Truma.Regler PID20 Raumtemp:temperature Truma.Servo
attr Truma.Regler pidActorInterval 10
attr Truma.Regler pidActorTreshold 5
attr Truma.Regler pidUpdateInterval 10

define Truma.Servo dummy

define Servo.stellen notify Truma.Servo set {\
system('sudo python /home/pi/servo3.py --move_to $EVTPART1 &')}
attr Servo.stellen room Truma


Der Aufruf "{system('sudo python /home/pi/servo3.py --move_to $EVTPART1 &')}" klappt aber nicht.
(ich hab' auch schon "{system ('sudo..."   oder  "{system("sudo..." versucht, geht auch nicht).

im Raspbian ist in der "/etc/sudoers" der Eintrag

fhem ALL=NOPASSWD: /usr/bin/python /home/pi/servo3.py*

hinzugefügt.

Sogar in der Befehlszeile von fhem klappt der Aufruf. ({system('sudo python /home/pi/servo3.py --move_to 50 &')}   z.B.

Nur im notify kommt eine Fehlermeldung:
Servo.stellen return value: Please define {
system('sudo first

bzw.
Servo.stellen return value: Please define ({system first
(wenn man zw. system und "(" ein Leerzeichen macht)

Hat irgendjemand ne Idee, was ich falsch mach'?
Raspberry PI mit drei stackable CC (2x866MHz-HM&WMBUS, 1x433MHz-Somfy)
HM-LAN (Keymatic, Dimmer, Bewegungsmelder, Rolladen, Lichtschalter, KFM100)
div. Tasmota via MQTT

2. Raspberry Pi/FHEM im Wohnmobil (Heizungsregelung,GPS) Batterieüberwachung-toDo

MadMax-FHEM

Der set vor dem Aufruf im Notify ist Quatsch...

Wenn der Aufruf:

{system('sudo python /home/pi/servo3.py --move_to $EVTPART1 &')}

in der fhem-Web-Zeile geht, dann einfach das Notify wie folgt:

define Servo.stellen notify Truma.Servo {system('sudo python /home/pi/servo3.py --move_to $EVTPART1 &')}

Es sollte aber auch so gehen:

define Servo.stellen notify Truma.Servo "sudo python /home/pi/servo3.py --move_to $EVTPART1 &"

Du solltest allerdings prüfen welche Events vom Dummy kommen können und was dann an das Script übergeben wird (also was $EVTPART1 jeweils ist)...
...weil es wird auf ALLES vom Dummy getriggert...

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)

pure-current

oh mann,

manchmal sieht man vor lauter Wald die Bäume nicht....

Das "set" hat sich beim definieren eingeschlichen...

Hab' ich einfach nicht gesehen....

Ich werd's morgen gleich mal probieren. Im Moment bin ich nicht mehr vor Ort.
Raspberry PI mit drei stackable CC (2x866MHz-HM&WMBUS, 1x433MHz-Somfy)
HM-LAN (Keymatic, Dimmer, Bewegungsmelder, Rolladen, Lichtschalter, KFM100)
div. Tasmota via MQTT

2. Raspberry Pi/FHEM im Wohnmobil (Heizungsregelung,GPS) Batterieüberwachung-toDo

pure-current

OK.
War jetzt doch noch mal vor Ort.
Mit der von dir vorgeschlagenen Schreibweise

define Servo.stellen notify Truma.Servo {system('sudo python /home/pi/servo3.py --move_to $EVTPART1 &')}

kommt jetzt folgender Fehler:

2018.11.20 22:23:26 1: ERROR evaluating my $TYPE='dummy';my $EVENT='90';my $NAME='Truma.Servo';my $SELF='Servo.stellen';my $EVTPART0='90';{system("sudo python /home/pi/servo3.py --move_to $EVTPART1 &")}: Global symbol "$EVTPART1" requires explicit package name (did you forget to declare "my $EVTPART1"?) at (eval 332) line 1.

2018.11.20 22:23:26 3: Servo.stellen return value: Global symbol "$EVTPART1" requires explicit package name (did you forget to declare "my $EVTPART1"?) at (eval 332) line 1.

2018.11.20 22:23:26 3: PID20 Truma.Regler: Calc.709 <set Truma.Servo  90>
Raspberry PI mit drei stackable CC (2x866MHz-HM&WMBUS, 1x433MHz-Somfy)
HM-LAN (Keymatic, Dimmer, Bewegungsmelder, Rolladen, Lichtschalter, KFM100)
div. Tasmota via MQTT

2. Raspberry Pi/FHEM im Wohnmobil (Heizungsregelung,GPS) Batterieüberwachung-toDo

MadMax-FHEM

Das meinte ich mit prüfen was $EVTPART1 etc. ist.
So wie es aussieht steht in $EVENT nur 90 drin und dann ist $EVTPART0 eben auch 90 und $EVTPART1 gibt es nicht bzw. undefined...

Da wie geschrieben das Notify auf ALLES reagiert was an Events vom Dummy produziert wird.

Und du bist sicher, dass der Befehl:

{system('sudo python /home/pi/servo3.py --move_to 80 &')}

in der FHEMWEB-Zeile geht (nur sicherhietshalber nachgefragt)...

Was noch sein kann: Punkte haben bei RegEx eine besondere Bedeutung, nicht dass da der Punkt in den Namen Probleme macht. (daher habe ich stattdessen Unterstrich _ )...

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)

pure-current

OK - Es geht!

Ich war mir sicher, dass das Event zweiteilig (so wie "Temperature 23") ist, deshalb der $EVTPART1.
Ist aber tatsächlich so, dass nur ein reiner Stellwert drinsteht.

mit der Zeile

Truma.Servo {system("sudo python /home/pi/servo3.py --move_to $EVENT &")}


geht's wunderbar!

Vielen Dank!
Raspberry PI mit drei stackable CC (2x866MHz-HM&WMBUS, 1x433MHz-Somfy)
HM-LAN (Keymatic, Dimmer, Bewegungsmelder, Rolladen, Lichtschalter, KFM100)
div. Tasmota via MQTT

2. Raspberry Pi/FHEM im Wohnmobil (Heizungsregelung,GPS) Batterieüberwachung-toDo

MadMax-FHEM

Bitte gerne!

Trotzdem evtl. mal im Eventmonitor (mit Filter auf den Dummy) schauen was so für Events kommen, nicht dass dann mal ein anderer als erwartet dabei ist und das Skript oder der Stellmotor komische Sachen machen...

Wenn nötig bzw. immer besser mit RegEx das notify etwas "genauer reagieren" zu lassen...

Alles nur Hinweise und "best practice"...

Ansonsten den Thread als gelöst kennzeichnen, umbenennen in beispielsweise [gelöst] Heizungsregelung mit Servomotor

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)