39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0

Begonnen von epsrw1, 24 Mai 2014, 15:52:17

Vorheriges Thema - Nächstes Thema

epsrw1

die aktuelle version des moduls befindet sich jeweils hier im ersten beitrag dieses themas.




hallo zusammen,
hier mein jetztes projekt: ich steuere damit einen 4-wege-mischer für meinen heizungsvorlauf, sollte aber für jede art von motorbetriebenem ventil o.a. funktionieren. als backend für eine rolladensteuerung wurde es ebenfalls erfolgreich getestet. das modul wird mit GPIO oder PiFace Pin-nummern für 2 relaisausgänge gestartet. aus den werten MaxTics (default=100, für prozentanzeige) und MaxDriveSeconds (bei mir 107) wird die zeit berechnet, die der motor nach rechts oder links laufen muss um die mit set gewünschte ventilstellung zu erreichen.
fhem läuft dann weiter ohne einzufrieren, und prüft im loop nur noch ob die stop-zeit im cache erreicht ist. da der stop nie exakt zur geplanten zeit ausgeführt wird, liegt im cache ein weiterer wert der die differenz zwischen geplanter und tatsächlicher stopzeit dem nächsten kommando hinzurechnet. so werden sich addierende kleine zeitdifferenzen vermieden.
zum kalibrieren (set calibrate) fährt der motor einfach volle zeit nach links/null, da ist bei mir ein mechanischer endschalter drin.
Will man während einer Bewegung den Motor anhalten sendet man einfach set <name> stop ab. die aktuelle position wird dann neu berechnet und der motor gestoppt.
edit: mögliche devices seit version 2.0 sind Gpio, PiFace-Digital, beliebiges Fhem Device, und beliebiges über shellcommand ansprechbares device.
kalibrierung kann R/L eingestellt werden.
die aktoren können variabel angesprichen werden, invert-funktion und mapping für zB On/Off
http://www.fhemwiki.de/wiki/Mischersteuerung
http://www.fhemwiki.de/wiki/STELLMOTOR
LG, florian

hoffentlich ist es für jemanden nützlich:

# $Id: 39_STELLMOTOR.pm 3002 2014-10-03 11:51:00Z Florian Duesterwald $

Ich habe keine Ahnung, aber davon wenigstens ganz viel

epsrw1


# $Id: 55_STELLMOTOR.pm 5251 2014-05-24 22:05:47Z Florian Duesterwald $
Ich habe keine Ahnung, aber davon wenigstens ganz viel

epsrw1


# $Id: 55_STELLMOTOR.pm 5251 2014-05-26 19:40:47Z Florian Duesterwald $
Ich habe keine Ahnung, aber davon wenigstens ganz viel

cwagner

Hi Florian,

bin auf Dein Modul gestoßen, das exakt das verspricht, an dem ich herumbastele. Du bist aber viel weiter als ich.  Nur statt GPIOs von einem PI würde ich gerne  normale Aktoren ansteuern.

Eigentlich müsste man (wobei mir die Kenntnisse in Perl fehlen) "nur" die Portansteuerung auf die Syntax von Schaltaktoren umstellen: mein Linkslauf für N Sekunden wäre set Switch_Heizkeller output B on-for-timer N und für Rechtslauf für M Sekunden: set Switch_Heizkeller output C on-for-timer M.

Wärest Du in der Lage, das anzupassen?

Herzliche Grüße
Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

epsrw1

in zeile 132/133 steht zum beispiel:
   }elsif($OutType eq "OtherOutType"){
      #To Do ...

:)

was für einen typ aktor verwendest Du denn? ich hoffe nichts mit funk, da ist das genaue timing sehr schwer. die lösung on-for-timer zum beispiel bringt bei so einem motor der oft kleine schritte hin und her macht irgendwann einen unmöglichen wert heraus da sich winzige differenzen in der ausschaltzeit nach und nach immer mehr summieren.
ich erahne noch ein anderes problem aus Deiner fragestellung, wenn Du rechts bzw linkslauf des gleichen motors über 2 verschiedene ausgänge ansteuerst, besteht die möglichkeit daß Dein motor abraucht falls die software mal spinnen sollte. aus diesem grund habe ich vorgesehen daß ein ausgang ein umschaltrelais betätigt für R/L und nur das zweite relais dem ganzen dann strom zuführt.
LG, florian
Ich habe keine Ahnung, aber davon wenigstens ganz viel

cwagner

Hallo Florian,

hatte ursprünglich mit Funk experimentiert und dann Deine Vermutung bestätigt gefunden - zuviel Funkverkehr bzw. zu träge Reaktion.

Deshalb habe ich auf 1-Wire umgestellt, da kann ich viel zackiger schalten, notfalls im Sekundentakt. Habe auch mit einem Notify und einem kleinen Codeschnipsel das am Laufen, aber zum Beispiel das Problem mit dem Kalibrieren oder auch den Rundungsfehlern nicht so schön im Griff wie Du.

Das Problem mit dem Verhindern des Fehlers, dass gleichzeitig R- und L-Lauf angesteuert wird, habe ich so gelöst, dass ich zwei Umschaltrelais von je einem Schaltaktor ansteuere und die Verdrahtung des Honeywell-4-Wege-Mischers so gewählt, dass wenn Relais A geschaltet wird, B keine Phase mehr hat und umgekehrt. Wenn also beide Relais "An" sind, kommt beim Motor aber nur ein Signal an.

Der Befehl für Links-Lauf  zum Beispiel würde        set Switch_Heizkeller output B ON      lauten (Ausschalten: OFF)
Der Befehl für Rechts-Lauf wäre dann                    set Switch_Heizkeller output C OFF   (Ausschalten wäre dann auch wieder OFF)

Grüße

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

epsrw1

hallo christian,
die idee mit den relais über kreuz um das motor-abrauchen zu verhindern gefällt mir ! warum bin ich da nicht darauf gekommen .... naja, zu spät.

1w ist ja schon einigermaßen zeitnah, die genaue zeitspanne von programmcode "aus" bis zum tatsächlichen ausschalten bleibt aber dabei eine unbekannte, da jeweils ein (immer verschieden langer) loop des servers abgewartet wird bevor es tatsächlich an den 1w controller übermittelt, und dann nochmal eine kurze (vermutlich gleichbleibende) spanne bis der aktor reagiert.
eventuell wäre es sinnvoll einen internen counter "nachzurüsten" der das kalibrieren alle soundso viele schaltvorgänge startet, damit die schaltdifferenzen sich nicht zu viel aufsummieren. das schau ich mir mal an als erstes (bei mir ist das calibrate einfach nur ein täglicher timer).

vielleicht können wir mal jemanden fragen, der viel mit den OW modulen zu tun hat, ob es eine möglichkeit gibt den schaltvorgang direkt intern im modul anzusprechen, statt auf den nächsten fhem-loop zu warten.

hast Du die möglichkeit einen 1w master extra dafür abzustellen, der deutlich kürzer als eine sekunde eingestellt ist?
je nach motorgeschwindigkeit müßte man sonst andauernd neu kalibrieren. bei mir zB dauert der max.weg 107 sec, d.h. nach nur 10 drive-anweisungen in verschiedene richtungen ist der timing-fehler schon pi mal auge 5% oder so. ich habe bei mir so ca alle 5 minuten einen drive am motor wenn die heizung läuft, das wäre dann 2 mal pro stunde kalibrieren à 1:47 minuten ... nicht so toll. insbesondere kommen beim kalibrieren die temperaturen durcheinander da der hebel ja tatsächlich in extremposition fährt.

oder vielleicht einen puffer dazwischen, zb PID20 device, das die gewünschte position dynamisch nachregelt, dann ist zwar der angezeigte position-wert u.ust.müll aber die temperatur wird trotzdem sinnvoll eingestellt.

was meinst Du?

LG, florian
Ich habe keine Ahnung, aber davon wenigstens ganz viel

cwagner

Hi Florian,

Also einen eigenen Testbus kann ich schon aufmachen.

Und meine jetzige Konstruktion nutzt die Rückkopplung von einem Vorlauffühler über PID20, um die Stellbefehle zu ermitteln. Die Prozentangaben, die PID20 liefert, die ich dann erhalte, vergleiche ich mit dem vorherigen Wert und schicke dann für das Delta den on-for-timer-Befehl.

lg
Christian

PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

epsrw1

hallo christian,
getestet mit dummy, sollte soweit klappen bei Dir :) das system mit ausgang R/L und ausgang Start konnte ich auf die schnelle nicht dynamisieren, müßte aber mit Deinen relais über kreuz auch machbar sein. set-befehle schicken standardmäßig: rechts-links-ausgang: 0=links=minus 1=rechts=plus, start-ausgang 0=off 1=on
angesichts dr uhrzeit sinkt bei mir gerade der WAF meiner künste ;) ich bitte um rückmeldung ob es funktioniert bzw. eventueller fehler.
hier und da sind noch zusätzliche Log(....) zeilen drin, die sollten dann raus wenn es reibungslos funktioniert.
LG, florian

edit:
define Stellmotor2 STELLMOTOR FhemDev Stellmotor2rl Stellmotor2start
attr Stellmotor2 MaxDriveSeconds 107
attr Stellmotor2 MaxTics 100
attr Stellmotor2 pollInterval 0.1
define Stellmotor2rl dummy
define Stellmotor2start dummy


# $Id: 98_STELLMOTOR.pm 5251 2014-05-27 01:57:47Z Florian Duesterwald $

Ich habe keine Ahnung, aber davon wenigstens ganz viel

cwagner

Hi Florian,

alle Achtung für den Biss!

Habe es gleich ausprobiert: Die beiden dummys angelegt und dann
erstmal Deine Beispielzeile:
define Stellmotor2 FhemDev Stellmotor2rl Stellmotor2start

Nach ein paar Fehlschlägen war ich wach genug, um zu erkennen, dass der Modulname fehlt. Also:
define Stellmotor2 FhemDev STELLMOTOR Stellmotor2rl Stellmotor2start

"Es" tut auch etwas und ich habe als erstes verstanden, dass ich nur in 10er Schritten setten kann, bei
set Stellmotor2 45 erhalte ich auf der Telnet-Konsole

# Use of uninitialized value $args[1] in string eq at ./FHEM/98_STELLMOTOR.pm li
ne 94.
Use of uninitialized value $moveTarget in string eq at ./FHEM/98_STELLMOTOR.pm l
ine 99.
Use of uninitialized value $moveTarget in string eq at ./FHEM/98_STELLMOTOR.pm l
ine 107.
Use of uninitialized value $moveTarget in numeric lt (<) at ./FHEM/98_STELLMOTOR
.pm line 107.
Use of uninitialized value $moveTarget in concatenation (.) or string at ./FHEM/
98_STELLMOTOR.pm line 108.
Argument "Stellmotor2rl" isn't numeric in numeric eq (==) at ./FHEM/98_STELLMOTO
R.pm line 217.


Im Augenblick verstehe ich noch nicht, wie ich anstelle der Dummys meine beiden Relais einbinde.
Leider muss ich nun erst einmal weg...

Vielleicht interessiert Dich mein bisherige Miniansatz:
FBH_Stellwert {
  my $alt_stellwert = ReadingsVal("FBH_Stellwert","Alt_Stellwert",0);
  fhem ("setreading FBH_Stellwert Alt_Stellwert $EVENT");
  my $delta=($EVENT-$alt_stellwert)*.95;
  if ($delta >= 1) {fhem("set Switch_Heizkeller output B on-for-timer $delta")};
  if ($delta <= 1) {$delta = abs($delta);fhem("set Switch_Heizkeller output C on-for-timer $delta")};
Log 3, "Stellwertveränderung $delta"
}


Getriggert wird in dem Notify auf eine Änderung von FBH_Stellwert (das enthält die Prozentzahl zb. 45). Das Auslöse-Ereignis ändert sich jedes Mal, wenn PID20 durch den Temperaturfühler eine Veränderung der Vorlauftemperatur mitbekommt. Diese Zahl kann jeden Wert zwischen 0 und 100 annehmen (über PID20 kann man ihm vorgeben auch nur zwischen zB. 5 und 93 zu regeln)


Herzliche Grüße

Christian

PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

epsrw1

hallo zusammen :)
richtig ist natürlich:
define Stellmotor2 FhemDev STELLMOTOR Stellmotor2rl Stellmotor2start

habe das weiter oben gleich editiert um kunfusion zu vermeiden.

Zitat"Es" tut auch etwas und ich habe als erstes verstanden, dass ich nur in 10er Schritten setten kann, bei
set Stellmotor2 45 erhalte ich auf der Telnet-Konsole
es kann jeder ganzzahlige wert zwischen 1 und <MaxTics> (def.100) gesetzt werden. in der set-liste hab' ich die rausgenommen weil es unpraktisch war einen halben kilometer bis zu den "reset" und "calibrate" durchzuscrollen. wert 45 ist innerhalb des zulässigen bereiches.

ZitatArgument "Stellmotor2rl" isn't numeric in numeric eq (==) at ./FHEM/98_STELLMOTO
R.pm line 217.
beschriebenen fehler ab l.94 konnte ich nicht reproduzieren. die letzte zeile Deiner konsolenmeldung zitiert jedoch das versuchte kommando, da muss ein tippfehler im set gewesen sein ("set stellmotor2 Stellmotor2rl 45") bzw. zuviel copy/paste erwischt

ZitatIm Augenblick verstehe ich noch nicht, wie ich anstelle der Dummys meine beiden Relais einbinde.
ich weiß nicht wie Deine elektrischen anschlüsse gemacht sind (doppelrelais über kreuz??). wenn ich mal unterstelle daß der motor nach "minus" läuft wenn B=0 und C=1, und richtung "plus" läuft wenn B=1 und C=1 (und steht wenn B und C beide null) würde die def folgendermaßen aussehen:

define Stellmotor2 FhemDev STELLMOTOR out_B out_C

STELLMOTOR erwartet für die ausgänge ein device das einfach nur "0" und "1" als set befehl nimmt.
"set Switch_Heizkeller output B on-for-timer $delta" sieht anders aus, der befehlteil ist "Switch_Heizkeller output B" und STELLMOTOR fügt dem dann hinten 0 oder 1 hinzu. wie man fhem beibringt dass das arg leerzeichen enthält weiß ich nicht. vermutlich geht das nicht und du mußt Deinen Switch_Heizkeller anders definieren daß er ohne die parameter output und B auskommt (oder einfach einen anderen aktor verwenden der einzelnen output hat und mit "set Aktor 1" auskommt)
zum testen geht auch ein dummy mit notify, aber für den betrieb ist das absoluter quark da die timingdifferenz noch mehr steigt als es eh schon der fall ist durch das fhem command (schätze, dreifach:+loop dummy setzen, +loop notify trigger +loop aktor setzen)
define rl_notif notify Stellmotor2rl {fhem("set Switch_Heizkeller output B ".Value("stellmotor2rl"))}

aber wirklich nur zum testen, sonst zeigt das reading position nur noch absoluten schrott an....
LG, florian
Ich habe keine Ahnung, aber davon wenigstens ganz viel

epsrw1

fehler L.168, bei device type FhemDev war der linkslauf versehentlich auf rechtslauf.

# $Id: 98_STELLMOTOR.pm 5251 2014-05-27 01:57:47Z Florian Duesterwald $

Ich habe keine Ahnung, aber davon wenigstens ganz viel

cwagner

Hi Florian,

jetzt habe ich es verstanden und zugleich sehe ich auch die Grenzen: Meine Konstruktion wird mit 98_STELLMOTOR funktionieren, wenn es bei negativen Stellwerten (Linkslauf) einen Aktor 1 settet und bei positiven Werten (Rechtslauf) einen Aktor 2 settet. Und das jeweils solange, wie nach Deiner Berechnung notwendig ist. Dabei reizt mich Deine Berücksichtigung von Rechenzeiten und das Ausgleichen von Summierungsfehlern und die durchdachten Einstellmöglichkeiten.

Dein Modul verfolgt eine etwas andere Konzept als ich derzeit umsetzen kann. Da ich nur 1-Wire und HM-Aktoren habe, komme ich erstmal nicht weiter.

Eine Idee wäre, Linkslauf durch den 1. Parameter (Stellmotor2rl) und Rechtslauf durch den 2. Parameter (Stellmotor2start) vorzugeben:

define Stellmotor2 FhemDev STELLMOTOR Switch_Heizkeller Switch_Heizkeller

Der Parameter 1 (ein) würde dann lauten bei Linkslauf: output B on  bei Rechtslauf: output C off
Der Parameter 0 (aus) würde dann laut bei Linkslauf: output B off    bei Rechtslauf: output C off

Das wäre natürlich eine ziemliche Veränderung Deines Moduls. Da sind wir glaube ich erst einmal am Ende....


Grüße
Christian
 
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

epsrw1

bitte gib mir ein paar tage zeit (habe z.zt. nachtdienst), dann wird das auch noch gehen (dynamisierung fhem-cmds) :)
Ich habe keine Ahnung, aber davon wenigstens ganz viel

cwagner

Guten Morgen,

gute Nachrichten, ich bin dabei und will das dann gerne auch testen  (im Sommer ist das WAF-tauglich möglich :-)  )und vielleicht auch bei einem Wiki-Eintrag helfen...


Anbei mal die zwei Möglichkeitenm der elektrischen Schaltung. Durch die eingebauten Endschalter beim 0-Punkt (Anschlag links) und 100%-Punkt (Anschlag rechts) ist es elektrisch einfach, über die Dauer des Einschaltens der Relais den Rechts- oder Linkslauf zu steuern.

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB