FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: epsrw1 am 24 Mai 2014, 15:52:17

Titel: 39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: epsrw1 am 24 Mai 2014, 15:52:17
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/Mischersteuerung)
http://www.fhemwiki.de/wiki/STELLMOTOR (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 $

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 24 Mai 2014, 22:07:04

# $Id: 55_STELLMOTOR.pm 5251 2014-05-24 22:05:47Z Florian Duesterwald $
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 26 Mai 2014, 19:40:48

# $Id: 55_STELLMOTOR.pm 5251 2014-05-26 19:40:47Z Florian Duesterwald $
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 26 Mai 2014, 21:17:26
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
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 26 Mai 2014, 21:26:04
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
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 26 Mai 2014, 21:55:23
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
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 26 Mai 2014, 22:11:46
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
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 26 Mai 2014, 23:13:14
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

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 27 Mai 2014, 02:00:06
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 $

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 27 Mai 2014, 07:46:22
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

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 27 Mai 2014, 11:42:46
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
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 27 Mai 2014, 12:01:44
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 $

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 27 Mai 2014, 22:32:19
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
 
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 28 Mai 2014, 00:22:48
bitte gib mir ein paar tage zeit (habe z.zt. nachtdienst), dann wird das auch noch gehen (dynamisierung fhem-cmds) :)
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 28 Mai 2014, 07:07:03
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
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 28 Mai 2014, 16:30:29
Attr <name> STELLMOTORrltype <wechsel|einzel>
wechsel:
R start=1 rl=1
L start=1 rl=0
idle start=0 rl=0

einzel:
R start=0 rl=1
L start=1 rl=0
idle start=0 rl=0


# $Id: 98_STELLMOTOR.pm 5251 2014-05-28 16:27:47Z Florian Duesterwald $
####################################################################################################
#
# 98_STELLMOTOR.pm
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 29 Mai 2014, 16:51:58
Zitateinzel:
R start=0 rl=1
L start=1 rl=0
idle start=0 rl=0
define <name> STELLMOTOR <PiFace|Gpio|FhemDev|OtherOutType> <RL-Out-Port> <Start-Out-Port>
attr <name> STELLMOTORrltype <wechsel|einzel>


define cwagnerMischer STELLMOTOR FhemDev PortC PortB
attr cwagnerMischer STELLMOTORrltype einzel
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 29 Mai 2014, 20:44:57
Hi Florian, das funktioniert mit de Dummys ganz im Sinne meiner Konstruktion. Die Richtung stimmt also!


Danke

Christian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 29 Mai 2014, 21:03:05
vielleicht hast Du ja lust & zeit das zu dokumentieren ins wiki incl Deinem tollen schaltplan (evtl noch einen zweiten mit dazu für die anschlußart "wechsel" sogar??). ich bin zu sowas unfähig, insbesondere wenn ich etwas selbst geschrieben habe kommt es mir so einfach vor daß mir maximal eine zeile erklärung einfällt.
LG, florian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 31 Mai 2014, 08:05:59
# $Id: 98_STELLMOTOR.pm 5251 2014-05-31 08:02:00Z Florian Duesterwald $



wechsel:
R start=1 rl=1
L start=1 rl=0
idle start=0 rl=0

einzel:
R start=0 rl=1
L start=1 rl=0
idle start=0 rl=0
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 01 Juni 2014, 13:25:06
aktuelles update:
# $Id: 98_STELLMOTOR.pm 5251 2014-06-01 13:22:00Z Florian Duesterwald $
####################################################################################################

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 01 Juni 2014, 18:22:58
ZitatHi Florian,

habe mit aktiviertem Modul nun dreimal FHEM neu gestartet und hatte die beschriebenen Probleme überhaupt nicht mehr. Da bist Du offenbar fündig geworden, hoffentlich löst das auch das Stabilitätsproblem bei Dir.

Beim durchchecken meines Beitrages stellte ich fest, dass im Web-Interface von FHEM STELLMOTOR_defaultState nicht auswählbar ist. set <name> STELLMOTOR_defaultState last wird z.B. als Fehler abgewiesen.

Beim mir startet das Modul grundsätzlich mit Position 1 und erst nach dem ersten set-Befehl habe ich dann die korrekte Position im State, in Position etc.

Herzliche Grüße

Christian

kann es nicht reprodizieren, habe aber einfach mal das update des state readings mit in den loop reingenommen. könnte klappen....


# $Id: 98_STELLMOTOR.pm 5251 2014-06-01 18:19:00Z Florian Duesterwald $
####################################################################################################



default_state eintrag ist schrott und kommt raus. da der motor nicht von selbst losfährt ist es gar nicht nötig, muß ein vergessener code-rest gewesen sein.

LG, florian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 02 Juni 2014, 14:20:18
update:
neues attr: resetOtherDeviceAtCalibrate

# $Id: 98_STELLMOTOR.pm 5251 2014-06-02 14:14:00Z Florian Duesterwald $
####################################################################################################

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 04 Juni 2014, 07:58:10
ZitatAktuell teste ich weiterhin gegen die Dummys, weil ich ja bei meinen Devices als ein/auschaltbefehl nur on/off kenne und beim Zieldevice ja die zusammengesetzte Syntax habe: Der Stellbefehl müsste ja statt 1 lauten:

Port B on bzuw. Port B off statt 1 oder 0.

guten morgen,
ich war mir dessen nicht bewußt dass Du deinen aktor nicht anders ansprechen kannst als durch command mit leerzeichen.
habe eben schnell einen workaround eingebaut:

if($OutType eq "FhemDev"){
if(ReadingsVal($name,'rlport', "") eq "attrRLPORT"){
readingsSingleUpdate($hash, "rlport", AttrVal($name,"attrRLPORT","attrRLPORT_missing"), 1); #set port workaround for blankspace FhemDev
}
if(ReadingsVal($name,'startport', "") eq "attrSTARTPORT"){
readingsSingleUpdate($hash, "startport", AttrVal($name,"attrSTARTPORT","attrSTARTPORT_missing"), 1); #set port workaround for blankspace FhemDev
}
}


wenn rlport="attrRLPORT" dann wird wert von zb.:
attr Stellmotor2 attrRLPORT cwagnerAktor port b
eingesetzt. analog auch bei attrSTARTPORT

daß Dein aktor 0|1 statt on|off annimmt setze ich mal voraus (alles andere wäre unlogisch...)

gruß, florian

update:
# $Id: 98_STELLMOTOR.pm 5251 2014-06-04 07:55:00Z Florian Duesterwald $
####################################################################################################
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 04 Juni 2014, 21:13:20
Hi Florian,

es klappt (beinahe) und ich finde, das Attribut ist ein perfekter Weg für alle möglichen Varianten von Aktoren.

Internals:
   CFGFN      ./FHEM/test.cfg
   DEF        FhemDev attrRLPORT attrSTARTPORT
   NAME       Stellmotor2
   NOTIFYDEV  global
   NR         758
   NTFY_ORDER 50-Stellmotor2
   STATE      100
   TYPE       STELLMOTOR
   Readings:
     2014-06-04 20:55:36   DoResetAtStop   1401908136.55134
     2014-06-04 20:07:24   OutType         FhemDev
     2014-06-04 20:55:36   command_queue   0
     2014-06-04 21:03:58   lastStart       1401908638.11821
     2014-06-04 21:03:58   locked          1
     2014-06-04 21:03:57   position        45
     2014-06-04 21:03:57   queue_lastdiff  0
     2014-06-04 20:07:25   rlport          Switch_Heizkeller output B
     2014-06-04 20:07:25   startport       Switch_Heizkeller output C
     2014-06-04 21:00:41   state           100
     2014-06-04 21:03:58   stopTime        1401908690.58599
Attributes:
   MaxDriveSeconds 95
   MaxTics    100
   STELLMOTORrltype einzel
   attrRLPORT Switch_Heizkeller output B
   attrSTARTPORT Switch_Heizkeller output C
   pollInterval 0.5
   room       _House2


Leider kann ich Deine Vermutung nicht bestätigen, dass der Switch auf 0|1 reagiert. Leider "hört" er nur auf on|off bzw. ich finde keinen Weg, ihn von etwas anderem zu überzeugen.

Noch ein Hinweis: set Stellmotor2 0 führt zu einer Fehlermeldung - er akzeptiert dieses Argument nicht (auch nicht 01) ...


Herzliche Grüße

Christian

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 04 Juni 2014, 21:23:17
Das mit 0 und Fehler ist normal, min.wert ist 1 ;)

Das mit on off sollte sich mit einem passenden attr für deinen Aktor einstellen lassen, glaube Mapping.
LG,Florian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 04 Juni 2014, 22:44:41
ok, Wiki angepasst :-)

Das mit dem mapping/eventmapping hatte ich nicht richtig herum ausprobiert: Ja, die Konstruktion funktioniert, aber sie offenbart ein Timng-Problem des Device-Treibers OWX_Switch, wenn zwei Schaltbefehle fast gleichzeitig kommen. Unter OWX-SWITCH bricht FHEM komplett ab, unter OWX gibt es Schaltfehler und entsprechende Eintragungen im Log.

Aber das ist nicht Deine Baustelle :-)


Herzliche Grüße

Christian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 04 Juni 2014, 23:26:58
ZitatDas mit dem mapping/eventmapping hatte ich nicht richtig herum ausprobiert: Ja, die Konstruktion funktioniert, aber sie offenbart ein Timng-Problem des Device-Treibers OWX_Switch, wenn zwei Schaltbefehle fast gleichzeitig kommen. Unter OWX-SWITCH bricht FHEM komplett ab, unter OWX gibt es Schaltfehler und entsprechende Eintragungen im Log.
Aber das ist nicht Deine Baustelle :-)
Herzliche Grüße
Christian

ich könnte eine verzögerung zwischen den beiden schaltbefehlen RL und START einbauen, das ist wenig arbeit. bringt das was?
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 04 Juni 2014, 23:59:15
Zitatich könnte eine verzögerung zwischen den beiden schaltbefehlen RL und START einbauen, das ist wenig arbeit. bringt das was?
@christian,
nachtrag:
bei mir mit betriebsart "wechsel" wäre es easy einfach einen delay einzubauen, bei Dir mit "einzel" wäre evtl eine andere lösung eher zielführend:
wenn das modul standardmäßig den akt. status liest und daraufhin entscheidet ob befehl getriggert wird oder nicht?
wie aktuell is Dein status reading?
habe das bislang beim mischer vermieden und immer "mit gewalt" set befehle abgesetzt (ohne rücksicht auf den akt.status) da mein gpio manchmal komische werte anzeigte. das ist allerdings kein logisches muss sondern eher zufällig "gewachsen" sozusagen.
was meinst Du? oder sollen wir einfach "ins blaue" ausprobieren was bei Dir klappt?
gruß,florian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 05 Juni 2014, 07:20:58
Zitat von: epsrw1 am 04 Juni 2014, 23:59:15
habe das bislang beim mischer vermieden und immer "mit gewalt" set befehle abgesetzt (ohne rücksicht auf den akt.status) da mein gpio manchmal komische werte anzeigte. das ist allerdings kein logisches muss sondern eher zufällig "gewachsen" sozusagen.
was meinst Du? oder sollen wir einfach "ins blaue" ausprobieren was bei Dir klappt?
gruß,florian
Moin, Florian,
mein Timingproblem tritt ja auch in anderen Zusammenhängen auf - deshalb möchte ich da Dein Modul nicht verkomplizieren mit einem Delay.
Eine Status-Rückkopplung fände ich reizvoll, aber ist sicherlich viel Arbeit, da vom Aktor abhängig.

state A: 0 B: 0 C: 0 D: 1 E: 1 F: 0 G: 0 H: 0
(Es handelt sich um einen 8fach-Aktor)
----------
Nach einem Neustart fange ich auf der Console einmal diese Fehlermeldung auf, wenn zum ersten Mal der Mischer durch das Modul bewegt wird:
# Argument "initialized" isn't numeric in numeric gt (>) at ./FHEM/98_STELLMOTOR.pm line 229.


Herzliche Grüße

Christian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 05 Juni 2014, 16:37:57
update:

# $Id: 98_STELLMOTOR.pm 1044 2014-06-05 16:27:00Z Florian Duesterwald $
####################################################################################################

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 06 Juni 2014, 06:59:29
Moin, Florian,

keine Fehlermeldungen mehr auf der Console, weder beim Start noch beim Betrieb.
Nun aber im Eventmonitor im Takt von Pollinterval (bei mir 0.5) eine Zeile mit dem Namen des Device, bei mir also Stellmotor2

Herzliche Grüße

Christian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 06 Juni 2014, 07:45:55
update:

# $Id: 98_STELLMOTOR.pm 1045 2014-06-06 07:43:00Z Florian Duesterwald $


Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 07 Juni 2014, 08:15:11
Moin, Florian,

mit dem Update tauchen nun im Eventlog die Readings von Stellmotor auf. Mit event-on-change-reading habe ich die Ausgabe eingeschränkt auf position.
Dennoch hatte ich extreme Systemlast und bei der Suche danach stellte ich fest, dass mein Device im 5 Sekundentakt (ich hatte POllinterval auf 5 gestellt) den RLPORT-Schaltbefehl sendet. Es kommt kein Startport...

Schöne Festtage

Christian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 07 Juni 2014, 09:10:51
also, bei 5 sekunden ist es normal dass der motor ständig neu startet. die einstellung für die zeitdifferenz beim stop ist so, daß automatisch ein neuer set vorgang startet wenn die ungenauigkeit des letzten stopps größer 1 sekunde ist.
werde das mit der systemlast auch nochmal prüfen, nur nicht sofort da ich heute unterwegs sein werde
LG, florian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 10 Juni 2014, 16:43:06
update:
komplett überarbeitete version 2.0 - aktuelle noch BETA

feature: SysCmd, und änderungen bzw. zT neue attr noch nicht in der doku.

# $Id: 98_STELLMOTOR.pm 2010 2014-06-10 16:03:00Z Florian Duesterwald $
####################################################################################################
#
# 98_STELLMOTOR.pm
#

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 10 Juni 2014, 22:29:50
Hi Florian,

das kriege ich nicht ans laufen: Bei der Initialisierung eines neuen Gerätes mit

define Stellmotor2 STELLMOTOR sysCmd Stellmotor2rl Stellmotor2start

Define: Err.87 unsupported Output Device sysCmd. Usage:
define <name> STELLMOTOR <PiFace|Gpio|FhemDev|OtherOutType> <Right1-Left0-Port-Piface> <Start1-Port-Piface>

Beim Inititialisieren von FhemDev erhalte ich die Log-Meldung:
STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:initialized please report this error L.365


Herzliche Grüße

Christian

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: epsrw1 am 10 Juni 2014, 22:38:08
falsche version hochgeladen :( hier was anständiges:

habe noch schnell get attrHelp und get readingsHelp eingebaut :)

Zitatdefine Stellmotor2 STELLMOTOR sysCmd
define <name> STELLMOTOR <PiFace|Gpio|FhemDev|SysCmd> rest ist hier weggefallen

# $Id: 98_STELLMOTOR.pm 2013 2014-06-10 21:11:00Z Florian Duesterwald $
####################################################################################################

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB. Heizungsmischer
Beitrag von: cwagner am 10 Juni 2014, 22:56:26
HI Florian,
da kriege ich dennoch einen Fehler. Beim Neustart wird 98_STELLMOTOR nicht geladen. Beim Reload bekomme ich:

reload: Error:Modul 98_STELLMOTOR deactivated:
Type of arg 1 to keys must be hash or array (not hash element) at ./FHEM/98_STELLMOTOR.pm line 339, near "})"

Da komme ich leider nicht vorwärts.

Herzliche Grüße

Christian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 10 Juni 2014, 23:07:15
update:
# $Id: 98_STELLMOTOR.pm 2014 2014-06-10 23:09:00Z Florian Duesterwald $
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 10 Juni 2014, 23:20:57
ZitatType of arg 1 to keys must be hash or array (not hash element) at ./FHEM/98_STELLMOTOR.pm line 339, near "})"

die zeilennummer paßt nicht zum code, evtl was beim copy/paste "verloren"?

LG, florian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: cwagner am 11 Juni 2014, 06:53:37
Guten Morgen, Florian,

habe es  noch einmal mit Deinem Anhang und Neustart probiert. Es bleibt dabei, dass Modul wird gar nicht erst geladen. Beim Reload gibt es die besagte Fehlermeldung im FHEM-Web-Interface und -log:

Type of arg 1 to keys must be hash or array (not hash element) at ./FHEM/98_STELLMOTOR.pm line 338, near "})"

Das passiert, wenn ich ohne einen definierten Stellmotor2 starte.

Wenn ich einen Device Stellmotor2 in der Config habe und neu starte erhalte ich nach dem Start diese Meldung:
Cannot load module STELLMOTOR



Herzliche Grüße

Christian

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 11 Juni 2014, 11:25:27
ich bitte um geduld :)

http://forum.fhem.de/index.php/topic,24471.0.html (http://forum.fhem.de/index.php/topic,24471.0.html)
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 11 Juni 2014, 11:45:31
http://forum.fhem.de/index.php/topic,24471.msg175854.html#msg175854 (http://forum.fhem.de/index.php/topic,24471.msg175854.html#msg175854)

ZitatLösung: user hat "altes" perl. Hash in keys de-refernzieren.

christian, vielleicht würde ein perl update auch Dein async problem positiv beeinflussen. den STELLMOTOR lade ich gleich neu hoch.

florian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 11 Juni 2014, 11:53:54
update:
# $Id: 98_STELLMOTOR.pm 2015 2014-06-11 11:49:00Z Florian Duesterwald $
####################################################################################################
#
# 98_STELLMOTOR.pm

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: cwagner am 11 Juni 2014, 21:52:37
Hallo Florian,

dem mit der Perl-Version will ich noch mal nachgehen - das will ich aber in Ruhe vorbereiten. Ich benutze 5.12 und hatte angenommen, dass dies nötigenfalls mit FHEM aktualisiert wird.

Ein Start mit SysCMD funktioniert nicht - mit FHEMDev startet er. Dann wechsele ich die DEV.

Deine angepasste Variante funktioniert danach genau einmal: Es gibt nach der ersten Motorbewegung dann aber dann doch eine Fehlermeldung:
Unknown argument , choose one of <PiFace|Gpio|FhemDev|OtherOutType>

Dann ist erst einmal Feierabend.

Herzliche Grüße

Christian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 12 Juni 2014, 07:36:14
ZitatAber, da Du mich jetzt auf meinen Irrweg hingewiesen hast, habe ich es noch einmal mit FhemDev versucht und hoffe die Syntax richtig nachvollzogen habe:
Internals:
   CFGFN
   DEF        FhemDev
   NAME       Stellmotor2
   NOTIFYDEV  global
   NR         920
   NTFY_ORDER 50-Stellmotor2
   STATE      20
   TYPE       STELLMOTOR
   Readings:
     2014-06-11 23:11:44   DoResetAtStop   1402521104.42784
     2014-06-11 23:11:13   OutType         FhemDev
     2014-06-11 23:11:44   command_queue   0
     2014-06-11 23:13:55   lastStart       1402521235.6357
     2014-06-11 23:13:55   locked          1
     2014-06-11 23:13:55   position        20
     2014-06-11 23:13:55   queue_lastdiff  0
     2014-06-11 23:13:55   state           20
     2014-06-11 23:13:55   stopTime        1402521237.46366
Attributes:
   STMcalibrateDirection L
   STMfhemDevRL Switch_Heizkeller output B
   STMfhemDevSTART Switch_Heizkeller output C
   STMinvertOut 0
   STMmapOffCmd OFF
   STMmapOnCmd ON
   STMmaxDriveSeconds 95
   STMmaxTics 100
   STMpollInterval 0.1
   STMresetOtherDeviceAtCalibrate 0
   STMrlType  einzel
   STMsysCmdRL Switch_Heizkeller output B
   STMsysCmdSTART Switch_Heizkeller output C
   STMtimeTolerance 0.01

Ich sende set Stellmotor2 70 ausgehend von 1: Erwartungsgemäß: B on   C off    nach knapp 66 Sekunden sollte B off und  C off stehen.
Tatsächlich sehe ich aber weiterhin B on , das wird immer wiederholt
und sehe im Log weiterhin:
2014.06.11 23:28:18 3: STELLMOTOR Stellmotor2 Set Target:71.8212885605661 Cmd:1.82128856056615 RL:R
2014.06.11 23:28:22 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402522100.83032 now:1402522102.61282 queue_lastdiff:1.87631456475509
2014.06.11 23:28:23 3: STELLMOTOR Stellmotor2 Set Target:71.8763145647551 Cmd:1.87631456475509 RL:R
2014.06.11 23:28:27 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402522105.1107 now:1402522106.83404 queue_lastdiff:1.81404038479454
2014.06.11 23:28:27 3: STELLMOTOR Stellmotor2 Set Target:71.8140403847945 Cmd:1.81404038479454 RL:R

Ich habe hohe Systemlast.
Ich sende set Stellmotor2 1 und ich sehe B off  und C on   - nach rund 66 Sekunden sollte B off und C off stehen.
Tatsächlich springt aber B auf on und C auf off.
Das wird wieder regelmäßig wiederholt.
2014.06.11 23:30:26 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402522224.14926 now:1402522225.88432 queue_lastdiff:1.82638695365504
2014.06.11 23:30:26 3: STELLMOTOR Stellmotor2 Set Target:2.82638695365504 Cmd:-67.1736130463449 RL:L
2014.06.11 23:31:32 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402522290.46205 now:1402522292.21283 queue_lastdiff:1.84292793273926
2014.06.11 23:31:32 3: STELLMOTOR Stellmotor2 Set Target:2.84292793273926 Cmd:1.84292793273926 RL:R
2014.06.11 23:31:36 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402522294.67761 now:1402522296.41339 queue_lastdiff:1.8271373447619
2014.06.11 23:31:36 3: STELLMOTOR Stellmotor2 Set Target:2.8271373447619 Cmd:1.8271373447619 RL:R
2014.06.11 23:31:40 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402522298.86658 now:1402522300.61928 queue_lastdiff:1.84494696165386
2014.06.11 23:31:41 3: STELLMOTOR Stellmotor2 Set Target:2.84494696165386 Cmd:1.84494696165386 RL:R

Ich hoffe, Dir hiermit helfen zu können...
Danke, dass Du Dein Modul so engagiert fortschreibst.
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 12 Juni 2014, 07:42:18
Zitatdie schaltzustände sind alle richtig obwohl das ergebnis verwirrend aussieht. in der tat hat Dein motor das Schwingen angefangen, da die queue_lastdiff jeweils über 1 war wurde ständig neue moves begonnen.
abhilfe: neues attr STMlastDiffMax (default 1), versuch es mit wert 2 das sollte reichen.
hint: get Stellmotor2 attrHelp STMlastDiffMax :)

Ich habe hohe Systemlast.
Ich sende set Stellmotor2 1 und ich sehe B off  und C on   - nach rund 66 Sekunden sollte B off und C off stehen.
Tatsächlich springt aber B auf on und C auf off.
Das wird wieder regelmäßig wiederholt.
2014.06.11 23:30:26 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402522224.14926 now:1402522225.88432 queue_lastdiff:1.82638695365504
2014.06.11 23:30:26 3: STELLMOTOR Stellmotor2 Set Target:2.82638695365504 Cmd:-67.1736130463449 RL:L
2014.06.11 23:31:32 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402522290.46205 now:1402522292.21283 queue_lastdiff:1.84292793273926
2014.06.11 23:31:32 3: STELLMOTOR Stellmotor2 Set Target:2.84292793273926 Cmd:1.84292793273926 RL:R


man sieht hier im log output daß der motor erwartungsgemäß nach einiger zeit stoppt, und dann sofort einen neuen drive startet. der wert queue_lastdiff ist regelmäßig über 1. je nach reaktionszeit des systems muß das attr. STMlastDiffMax entsprechend erhöht werden, hier würde ich es mit 2 versuchen.

die funktion ist dazu gedacht, einzelne "ausrutscher" in der stopzeit abzufangen und sofort zu korrigieren, zB falls fhem mal hängt un der motor 10sek zu weit gefahren ist, wird nicht die diff abgespeichert bis zum nächsten drive sondern der extremwert sofort korrigiert.

und hier das update mit dem neuen attr:
# $Id: 98_STELLMOTOR.pm 2016 2014-06-13 12:41:00Z Florian Duesterwald $
####################################################################################################
#
# 98_STELLMOTOR.pm
#
#   drive a valve to percent value, based on motor drive time
#
# This file is free contribution and not part of fhem.
# refer to mail a t duesterwald d.o.t info if necessary
# thanks to cwagner for testing and a great documentation of the module:
#
# http://www.fhemwiki.de/wiki/Mischersteuerung
#
# for Gpio and for PiFace type you need to have wiringPi installed first
# at default location: /usr/local/bin/gpio
#
# Fhem is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# Fhem is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with fhem.  If not, see <http://www.gnu.org/licenses/>.
#
####################################################################################################

#my($cwagner)=1;

package main;
use strict;
use warnings;
use Time::HiRes qw(gettimeofday);

sub STELLMOTOR_Define($$);
sub STELLMOTOR_Undefine($$);
sub STELLMOTOR_Set($@);
sub STELLMOTOR_Get($@);
sub STELLMOTOR_Notify(@);
sub STELLMOTOR_Attr(@);
sub STELLMOTOR_Calibrate($@);
#}

sub STELLMOTOR_commandSend($@){
#params: stop or start: R or L drive
my ($hash, @args) = @_;
my $name = $hash->{NAME};
my $command = $args[0]; #command= R | L | S
#desired states for start and stop cmds, apply invert to this
#state  R  L  STOP
#portRL  1  1  0 #früher:startport
#portST  1  0  0 #früher:rlport
my %portRL = ( "R" => 1,
"L" => 0,
"S" => 0 );
my %portST = ( "R" => 1,
"L" => 1,
"S" => 0 );

#wechsel / einzel ? return desired state for both ports at R/L
my $STMrlType = AttrVal($name, "STMrlType", "einzel");
if($STMrlType eq "einzel"){
#change portRL val at R move if attr STMrlType is present (to get zero if type = einzel)
$portST{"R"}=0;
}elsif($STMrlType ne "wechsel"){
Log3($name, 3, "STELLMOTOR $name attr STMrlType has unknown value:".$STMrlType);
return;
}
#invert 1 and zero, maybe needed for funny hardware conditions
#some funny devices may need other stuff than 0|1 to switch off|on
my $STMinvertOutVals = AttrVal($name, "STMinvertOut", 0);
my $STMmapOffCmd = AttrVal($name, "STMmapOffCmd", 0);
my $STMmapOnCmd = AttrVal($name, "STMmapOnCmd", 0);
foreach("R","L","S"){
if($STMinvertOutVals ne "0"){
$portRL{$_}=($portRL{$_}?0:1); #first do the invert
$portST{$_}=($portST{$_}?0:1); #first do the invert
}
if($STMmapOffCmd ne "0"){
$portRL{$_}=($portRL{$_}?$portRL{$_}:$STMmapOffCmd); #do the mapping for 0
$portST{$_}=($portST{$_}?$portST{$_}:$STMmapOffCmd); #do the mapping for 0
}
if($STMmapOnCmd ne "0"){
$portRL{$_}=($portRL{$_}?$STMmapOnCmd:$portRL{$_}); #do the mapping for 0
$portST{$_}=($portST{$_}?$STMmapOnCmd:$portST{$_}); #do the mapping for 0
}
}

#2014-06-13 debug
if(defined($cwagner)){
foreach("R","L","S"){
Log3($name, 3, "STELLMOTOR $name cwagner1 data for ".$_."=>rl=".$portRL{$_}.",st=".$portST{$_});
}
}
#2014-06-13 debug

#actual state of the cmd hash data example:
#state  R  L  STOP
#portRL  on on off #früher:startport
#portST  on off off #früher:rlport
#check dev type and exec the commands
my($cmd,$execRL,$execSTART);
#define <name> STELLMOTOR <PiFace|Gpio|SysCmd|FhemDev>
my $OutType = ReadingsVal($name, "OutType", "dummy");
if(($OutType eq "PiFace") or ($OutType eq "Gpio")){
#pif and gpio eigentlich sinnlos, bleiben trotzdem erhalten für DAU und für abwärts-kompatibilität
#cmd type Gpio / #cmd type PiFace
$cmd = "/usr/local/bin/gpio";
my $outPinBase = 0; #gpio pins without recalc
if($OutType eq "PiFace"){
$outPinBase = 200; #recalc +200 for the pins
$cmd .=" -p"; #use -p option for gpio
}
my($startport)=AttrVal($name, "STMgpioPortRL", 5);
my($rlport)=AttrVal($name, "STMgpioPortSTART", 4);
$execRL = $cmd." write ".($outPinBase+$rlport)." ".$portRL{$command};
$execRL = `$execRL`;
$execSTART = $cmd." write ".($outPinBase+$startport)." ".$portST{$command};
$execSTART = `$execSTART`;
}elsif($OutType eq "SysCmd"){
my $STMsysCmdRL = AttrVal($name, "STMsysCmdRL", 0);
my $STMsysCmdSTART = AttrVal($name, "STMsysCmdSTART", 0);
$execRL = $STMsysCmdRL." ".$portRL{$command};
$execRL = `$execRL`;
$execSTART = $STMsysCmdSTART." ".$portST{$command};
$execSTART = `$execSTART`;
}elsif($OutType eq "FhemDev"){
my $STMfhemDevRL = AttrVal($name, "STMfhemDevRL", "Stellmotor2rl");
CommandSet(undef,$STMfhemDevRL." ".$portRL{$command});
my $STMfhemDevSTART = AttrVal($name, "STMfhemDevSTART", "Stellmotor2start");
CommandSet(undef,$STMfhemDevSTART." ".$portST{$command});
#2014-06-13 debug
if(defined($cwagner)){
Log3($name, 3, "STELLMOTOR $name cwagner2 command: set ".$STMfhemDevRL." ".$portRL{$command});
Log3($name, 3, "STELLMOTOR $name cwagner2 command: set ".$STMfhemDevSTART." ".$portST{$command});
}
#2014-06-13 debug
}elsif($OutType eq "dummy"){
Log3($name, 3, "STELLMOTOR $name testing with device type:".$OutType);
return;
}else{  #$OutType eq "dummy" or unknown value
Log3($name, 3, "STELLMOTOR $name unknown device type:".$OutType);
return;
}
return;
}

sub STELLMOTOR_Initialize($){
my ($hash) = @_;
$hash->{DefFn} = "STELLMOTOR_Define";
$hash->{UndefFn} = "STELLMOTOR_Undefine";
$hash->{SetFn} = "STELLMOTOR_Set";
$hash->{GetFn} = "STELLMOTOR_Get";
$hash->{NotifyFn} = "STELLMOTOR_Notify";
$hash->{AttrFn} = "STELLMOTOR_Attr";
my($attrlist);
foreach(_stmAttribs("keys","")){
$attrlist.=" ".$_;
if(_stmAttribs("listval",$_) ne "all"){
if(_stmAttribs("listval",$_)=~/:/){
$attrlist.=":";
my($min,$max)=split(/:/,_stmAttribs("listval",$_));
while($min<$max){
$attrlist.=$min.",";
$min++;
}
$attrlist.=$max;
}elsif(_stmAttribs("listval",$_)=~/,/){
$attrlist.=":"._stmAttribs("listval",$_);
}
#" disable:0,1 STMmaxTics:10,12,100,1000 STMmaxDriveSeconds " .
}
}
$hash->{AttrList} = $readingFnAttributes.$attrlist;
}
sub STELLMOTOR_Define($$){
my ($hash, $def) = @_;
my @args = split("[ \t]+", $def);
my $menge = int(@args);
if (int(@args) < 2) {
return "Define: to less arguments. Usage:\n" .
#   "define <name> STELLMOTOR <PiFace|Gpio|FhemDev|OtherOutType> <RL-Out-Port> <Start-Out-Port>";
  "define <name> STELLMOTOR <PiFace|Gpio|SysCmd|dummy|FhemDev>";
}
my $name = $args[0];
readingsSingleUpdate($hash, "OutType", $args[2], 1);
$hash->{NOTIFYDEV} = "global";
if(($args[2] ne "PiFace") and ($args[2] ne "Gpio") and ($args[2] ne "SysCmd") and ($args[2] ne "FhemDev") and ($args[2] ne "dummy")){
return "Define: Err87 unsupported Output Device ".$args[2].". Usage:\n" .
"define <name> STELLMOTOR <PiFace|Gpio|SysCmd|FhemDev>";
}
Log3($name, 3, "STELLMOTOR $name active, type=".$args[2]);
readingsSingleUpdate($hash, "state", "initialized",1);
my $position = ReadingsVal($name,"position", "0");
readingsSingleUpdate($hash, "state", $position,1);
#set attr based on device type
foreach(_stmAttribs("keys","")){
if(AttrVal($name,$_,"missing") ne "missing"){
#nothing, only set non-present attr
}elsif(_stmAttribs("area",$_) eq "global"){
CommandAttr(undef,$name." ".$_." "._stmAttribs("default",$_));
}elsif($args[2] eq _stmAttribs("area",$_)){
CommandAttr(undef,$name." ".$_." "._stmAttribs("default",$_));
}
}
InternalTimer(gettimeofday() + 120, "STELLMOTOR_GetUpdate", $hash, 0);
return;
}
sub STELLMOTOR_Undefine($$){
  my($hash, $name) = @_;
  RemoveInternalTimer($hash);
  return;
}
sub STELLMOTOR_Set($@) {
my ($hash, @args) = @_;
my $name = $hash->{NAME};
my $OutType = ReadingsVal($name,'OutType', "PiFace");
my $moveTarget = $args[1];
if($moveTarget eq "calibrate"){STELLMOTOR_Calibrate($hash);return;}
my $STMmaxDriveSeconds = AttrVal($name, "STMmaxDriveSeconds", 107);
my $STMmaxTics = AttrVal($name, "STMmaxTics", 100);
if($moveTarget eq "reset"){
readingsBeginUpdate($hash);
foreach(("locked","queue_lastdiff","command_queue")){
readingsBulkUpdate($hash, $_ , 0);
}
foreach(("state","position")){
readingsBulkUpdate($hash, $_ , 1);
}
readingsEndUpdate($hash, 1);
return;
}elsif(($moveTarget eq "?") or ($moveTarget < 1) or ($moveTarget > ($STMmaxTics+1))){
if($moveTarget eq "0"){$moveTarget.=" (min.value is 1) ";}
my $usage = "Unknown argument $moveTarget, choose one of calibrate:noArg reset:noArg ";
foreach(1,2,8,9,10,16,20,30,40,50,60,70,80,90,100){ $usage .= " ".$_.":noArg "; }
return $usage;
}
if (IsDisabled($name)) {
readingsSingleUpdate($hash, "command_queue", $moveTarget, 0); #save requested value to queue and return
Log3 $name, 3, "STELLMOTOR $name device is disabled - set:".$moveTarget." only in queue."; 
return;
}
my $locked = ReadingsVal($name,'locked',0);
if ($locked eq 1) {
if(gettimeofday() - ( ReadingsVal($name,'lastStart',0) + $STMmaxDriveSeconds + 10 ) < 0){
#check time since last cmd, if < MaxDrvSecs, queue command and return
readingsSingleUpdate($hash, "command_queue", $moveTarget, 0); #save requested value to queue and return
return;
}
}
# if(($OutType ne "PiFace") and ($OutType ne "Gpio") and ($OutType ne "FhemDev") and ($OutType ne "OtherOutType")){
if(($OutType ne "PiFace") and ($OutType ne "Gpio") and ($OutType ne "SysCmd") and ($OutType ne "FhemDev")){
return "Unknown argument ".$OutType.", choose one of <PiFace|Gpio|FhemDev|SysCmd>";
}
my $actual_state = ReadingsVal($name,'position',1); #Use default 1 to omit error on first use
readingsSingleUpdate($hash,'position',$moveTarget,1); #update position reading
$moveTarget = $moveTarget + ReadingsVal($name,'queue_lastdiff',0); #add last time diff or old value below 1 Tic
readingsSingleUpdate($hash, "queue_lastdiff", 0, 1);
my $moveCmdTime = $moveTarget-$actual_state;
my $STMtimeTolerance = AttrVal($name, "STMtimeTolerance", 0.01);
if( ((abs($moveCmdTime) - $STMtimeTolerance) <= 1 )){
readingsSingleUpdate($hash, "queue_lastdiff", $moveCmdTime, 1);
return;
}
my $directionRL = "L";
if($moveCmdTime>0){ $directionRL = "R"; }
Log3($name, 3, "STELLMOTOR $name Set Target:".int($moveTarget)." Cmd:".$moveCmdTime." RL:".$directionRL);
$moveCmdTime=abs($moveCmdTime); #be shure to have positive moveCmdTime value
readingsSingleUpdate($hash, "locked", 1, 1); #lock module for other commands
readingsSingleUpdate($hash, "lastStart", gettimeofday(), 1); #set the actual drive starttime
$moveCmdTime=$moveCmdTime*$STMmaxDriveSeconds/$STMmaxTics;  #now we have the time in seconds the motor must run
readingsSingleUpdate($hash, "stopTime", (gettimeofday()+$moveCmdTime), 1); #set the end time of the move
STELLMOTOR_commandSend($hash,$directionRL);
return;
}
sub STELLMOTOR_Stop($@){
my ($hash,$option) = @_;
my $name = $hash->{NAME};
my $OutType = ReadingsVal($name,'OutType', "PiFace");
if(($OutType ne "PiFace") and ($OutType ne "Gpio") and ($OutType ne "FhemDev") and ($OutType ne "SysCmd")){
return "Unknown argument ".$OutType.", choose one of <PiFace|Gpio|FhemDev|SysCmd>";
}
STELLMOTOR_commandSend($hash,"S");
my $now = gettimeofday();
my $stopTime = ReadingsVal($name,"stopTime",$now);
my $STMmaxDriveSeconds = AttrVal($name, "STMmaxDriveSeconds", 107);
my $STMmaxTics = AttrVal($name, "STMmaxTics", 100);

my $lastGuiState = ReadingsVal($name,'state', 1);
if(!($lastGuiState=~/^\d+$/)){
Log3($name, 3, "STELLMOTOR $name Stop Problem: lastGuiState:$lastGuiState please report this error L.".__LINE__);
$lastGuiState=1;
}
my $queue_lastdiff = ($stopTime-$now)*$STMmaxTics/$STMmaxDriveSeconds*(
(ReadingsVal($name,'position', 1)> $lastGuiState
)?1:-1);
readingsSingleUpdate($hash, "queue_lastdiff", $queue_lastdiff, 1); #store time diff for next cmd
readingsSingleUpdate($hash, "locked", 0, 1); #unlock device
readingsSingleUpdate($hash, "stopTime", 0, 1); #reset stoptime to zero
my $position = ReadingsVal($name,'position', "StopError");
readingsSingleUpdate($hash,'state',int($position),1); #update position reading
if(ReadingsVal($name,'DoResetAtStop', "afterCalibrate") eq "afterCalibrate"){
readingsSingleUpdate($hash, "DoResetAtStop", gettimeofday(), 1); #set actual time = last calibrate
if(AttrVal($name,"STMresetOtherDeviceAtCalibrate",0)){
CommandSet(undef, AttrVal($name,"STMresetOtherDeviceAtCalibrate",0)." reset");
Log3($name, 3, "STELLMOTOR $name STMresetOtherDeviceAtCalibrate:".AttrVal($name,"STMresetOtherDeviceAtCalibrate",0));
}
STELLMOTOR_Set($hash,$name,"reset");
}
Log3($name, 3, "STELLMOTOR $name Stop Timing Call: stopTime:$stopTime now:$now queue_lastdiff:$queue_lastdiff");
}
sub STELLMOTOR_GetUpdate($) {
my ($hash) = @_;
my $name = $hash->{NAME};
my $STMtimeTolerance = AttrVal($name, "STMtimeTolerance", 0.01);
my $stopTime = ReadingsVal($name,"stopTime", 0);
my $now = gettimeofday();
if(($stopTime ne 0) and (($stopTime-$now)<$STMtimeTolerance)){
STELLMOTOR_Stop($hash);
}
my $command_queue = ReadingsVal($name,"command_queue", 0);
my $queue_lastdiff = ReadingsVal($name,"queue_lastdiff", 0);
my $locked = ReadingsVal($name,"locked", 0);
my $STMlastDiffMax = AttrVal($name, "STMlastDiffMax", 1);
my $position = ReadingsVal($name,"position", 1);
if($command_queue>0 and $locked==0){
readingsSingleUpdate($hash, "command_queue", 0, 1); #remove old value from queue start the drive
STELLMOTOR_Set($hash,$name,$command_queue);
}elsif(abs($queue_lastdiff)>$STMlastDiffMax){ #start new drive if last diff > 1sec (attr: STMlastDiffMax)
STELLMOTOR_Set($hash,$name,$position);
}
my $STMpollInterval = AttrVal($name, "STMpollInterval", 0.1);
if ($STMpollInterval ne "off") {
InternalTimer(gettimeofday() + ($STMpollInterval), "STELLMOTOR_GetUpdate", $hash, 0);
# STELLMOTOR_Get($hash,"position");
}
#fetch missing pos.value in state after reboot
my $lastGuiState = ReadingsVal($name,'state', 1);
if(!($lastGuiState=~/^\d+$/)){
Log3($name, 3, "STELLMOTOR $name Stop Problem: lastGuiState:$lastGuiState please report this error L.".__LINE__);
my $position = ReadingsVal($name,'position', "1");
readingsSingleUpdate($hash,'state',$position,1); #update position reading
$lastGuiState=1;
}
#end debug
return;
}
sub STELLMOTOR_Get($@){
my ($hash, @a) = @_;
my $name = $hash->{NAME};
my $get = $a[1];
my @stmgets = (keys(%{$hash->{READINGS}}));
$get="?" if(!_in_array($get,(@stmgets,"attrHelp","readingsHelp","stmWwiki")));
my $usage = "Unknown argument $get, choose one of";
foreach(@stmgets){
$usage.=" ".$_.":noArg";
}
$usage.=" attrHelp:";
my($first)=0;
foreach(_stmAttribs("keys","")){
if($first){
$usage.=$_;
$first=0;
}else{
$usage.=",".$_;
}
}
$usage.=" readingsHelp:";
foreach(_stmRdings("keys","")){
$usage.=$_.",";
}
$usage.=" stmWwiki:get,set,readings,attr";
#check what has been requested?
if($get eq "attrHelp"){return _stmAttribs("help",$a[2]);}
if($get eq "readingsHelp"){return _stmRdings("help",$a[2]);}
if($get eq "stmWwiki"){
my $bereich = $a[2];
#bereich "get" "set" "readings" "attr"
my $wret;
if($bereich eq "get"){
$wret=STELLMOTOR_Get($hash,$name,"?");
$wret=~s/Unknown argument \?, choose one of//g;
$wret=~s/\s+/\n* /g;
$wret=~s/:noArg//g;
$wret=~s/:/: /g;
return "extracted usage of get command:\n\n".$wret
}elsif($bereich eq "set"){
$wret=STELLMOTOR_Set($hash,$name,"?");
$wret=~s/Unknown argument \?, choose one of//g;
$wret=~s/\s+/\n* /g;
$wret=~s/:noArg//g;
$wret=~s/:/: /g;
return "extracted usage of set command:\n\n".$wret;
}elsif($bereich eq "readings"){
$wret="\n== Readings ==\nAlle Readings sind auch in fhem durch das kommando get readingsHelp <varname> erklärt, für's \"".
"schnelle nachschauen zwischendurch\".\n\n{| class=\"wikitable sortable\"\n|-\n! Reading !! (Typ) Default !! Beschreibung\n|-\n";
foreach(_stmRdings("keys","")){
$wret.="| ". $_."|| ("._stmRdings("type",$_).") "._stmRdings("default",$_)." || "._stmRdings("description",$_)."\n|-\n";
}
$wret.="\n|}\n\n";
}elsif($bereich eq "attr"){
$wret="\n== Attributes ==\nAlle Attributes sind auch in fhem durch das kommando get attrHelp <varname> erklärt, für's \"".
"schnelle nachschauen zwischendurch\".\n\n{| class=\"wikitable sortable\"\n|-\n! Attribute !! (Typ) Default !! Beschreibung\n|-\n";
foreach(_stmAttribs("keys","")){
$wret.="| ". $_."|| ("._stmAttribs("type",$_).") "._stmAttribs("default",$_)." || "._stmAttribs("description",$_)."\n|-\n";
}
$wret.="\n|}\n\n";
}else{
return "get Error in Line ".__LINE__;
}
return $wret;
}
return $usage if $get eq "?";
my $ret = $get.": ".ReadingsVal($name,$get, "Unknown");
return $ret;
}
sub STELLMOTOR_Notify(@) {
  my ($hash, $dev) = @_;
  my $name = $hash->{NAME};
  if ($dev->{NAME} eq "global" && grep (m/^INITIALIZED$/,@{$dev->{CHANGED}})){
    Log3($name, 3, "STELLMOTOR $name initialized");
    STELLMOTOR_GetUpdate($hash);   
  }
  return;
}
sub STELLMOTOR_Attr(@) {
my ($cmd, $name, $attrName, $attrVal) = @_;
my $hash = $defs{$name};
#validate special attr STMpollInterval
if ($attrName eq "STMpollInterval") {
if (!defined $attrVal) {
RemoveInternalTimer($hash);   
Log3($name, 3, "STELLMOTOR $name attr [$attrName] deleted");
CommandDeleteAttr(undef, "$name STMpollInterval");
} elsif ($attrVal eq "off" || ( $attrVal >= 0.01 and $attrVal <= 600 ) ) {
Log3($name, 3, "STELLMOTOR $name attribute-value [$attrName] = $attrVal changed");
STELLMOTOR_GetUpdate($hash);
} else {
RemoveInternalTimer($hash);
Log3($name, 3, "STELLMOTOR $name attribute-value [$attrName] = $attrVal wrong, use seconds >0.01 as float (max 600)");
}
#fetch all remaining attribs and just check if data type matches
} elsif (_in_array($attrName,_stmAttribs("keys"," "))) {
if (!defined $attrVal){
CommandDeleteAttr(undef, "$name $attrName");
} elsif (_stmvalidateAttr($attrName, $attrVal) ) {
Log3($name, 3, "STELLMOTOR $name attribute-value [$attrName] = $attrVal changed");
} else {
CommandDeleteAttr(undef, "$name attrName");
}
}
return;
}
sub STELLMOTOR_Calibrate($@){
#drive to left (or right if attr) for maximum time and call "set reset"
my ($hash,$option) = @_;
my $name = $hash->{NAME};
my $STMmaxDriveSeconds = AttrVal($name, "STMmaxDriveSeconds", 107);
my $STMmaxTics = ReadingsVal($name,'STMmaxTics', "100");
my $OutType = ReadingsVal($name,'OutType', "PiFace");
if(($OutType ne "PiFace") and ($OutType ne "Gpio") and ($OutType ne "FhemDev") and ($OutType ne "SysCmd") and ($OutType ne "dummy")){
return "Unknown argument ".$OutType.", choose one of <PiFace|Gpio|FhemDev|SysCmd>";
}

my $STMcalibrateDirection = AttrVal($name, "STMcalibrateDirection", "L");
my $moveTime = 1 + $STMmaxTics; #1 tic more than 100 to be shure to be at pos.1
Log3($name, 3, "STELLMOTOR $name Calibrate Started, RL:".$STMcalibrateDirection);
readingsSingleUpdate($hash, "locked", 1, 1); #lock module for other commands
readingsSingleUpdate($hash, "lastStart", gettimeofday(), 1); #set the actual drive starttime
$moveTime=$moveTime*$STMmaxDriveSeconds/$STMmaxTics;  #now we have the time in seconds the motor must run
readingsSingleUpdate($hash, "stopTime", (gettimeofday()+$moveTime), 1); #set the end time of the move
readingsSingleUpdate($hash, "DoResetAtStop", "afterCalibrate", 1); #set the end time of the move
STELLMOTOR_commandSend($hash,AttrVal($name,"STMcalibrateDirection","L"));
return;
}

sub _in_array($@){
my ($search_for,@arr) = @_;
foreach(@arr){
return 1 if $_ eq $search_for;
}
return 0;
}
sub _stmvalidateAttr($@){
#usage: _stmvalidateAttr($attrName, $attrVal)
my($attrName, $attrVal)=@_;
#validate special attr and refuse
if(($attrName eq "STMmaxTics") and ($attrVal<1)){
return 0;
}elsif(($attrName eq "STMrlType") and (($attrVal ne "wechsel") and ($attrVal ne "einzel"))){
return 0;
}
my $attrType = _stmAttribs("type",$attrName);
if($attrType eq "int"){
return 1 if $attrVal=~/^[-+]?\d+$/;
}elsif($attrType eq "float"){
return 1 if $attrVal=~/^[-+]?\d+\.?\d*$/;
}elsif($attrType eq "string"){
return 1 if length($attrVal);
}else{
return 0;
}
}
sub _stmRdings($@){
#usage: _stmRdings("help","stmVarName")
# "keys" || "default" || "type" || "help"  ,<keyname>
my($type,$reqKey)=@_;
my %rdings = (
"OutType"=>[("PiFace","string","in der device definition festgelegter OutType","global","PiFace,Gpio,SysCmd,dummy,FhemDev")],
"state"=>[("active","string","aktuelle position oder fehlermeldung","global","active,error,initialized,0..100")],
"command_queue"=>[("0","int","befehl in der warteschleife","global","0..100")],
"position"=>[("1","int","aktuelle desired position","global","0..100")],
"queue_lastdiff"=>[("0","float","letzte zeitdifferenz","global","float")],
"locked"=>[("0","int","1 während motor gerade läuft","global","0,1")],
"lastStart"=>[("0","float","zeitstempel letzter start des motors","global","float")],
"stopTime"=>[("0","float","zeitstempel nächster stop des motors","global","float")],
"DoResetAtStop"=>[("afterCalibrate","string","temporärwert nur während kalibrierungsphase","global","'',afterCalibrate")]
);
if($type eq "keys"){
return keys(%rdings);
}elsif($type eq "default"){
return $rdings{$reqKey}[0];
}elsif($type eq "type"){
return $rdings{$reqKey}[1];
}elsif($type eq "description"){
return $rdings{$reqKey}[2];
}elsif($type eq "area"){
return $rdings{$reqKey}[3];
}elsif($type eq "listval"){
return $rdings{$reqKey}[4];
}elsif($type eq "help"){
return "readingsHelp for ".$reqKey.":\n default:".$rdings{$reqKey}[0]." type:".$rdings{$reqKey}[1]." listval:".$rdings{$reqKey}[4]
." \ndescription:".$rdings{$reqKey}[2];
}else{
return "_ rdings?";
}
}
sub _stmAttribs($@){
#usage: _stmAttribs("type","stmVarName")
# "keys" || "default" || "type" || "help"  ,<keyname>
my($type,$reqKey)=@_;
my %attribs = (
"STMrlType"=>[("einzel","string","je nach schaltplan, wechsel=start+RL-relais, einzel=R-relais+L-relais","global","wechsel,einzel")],
"STMinvertOut"=>[("0","int","setzen für devices die 0 für start und 1 für stop erwarten","global","0,1")],
"STMmapOffCmd"=>[("0","string","string der im device-command anstatt '0' verwendet wird für stop","global","all")],
"STMmapOnCmd"=>[("0","string","string der im device-command anstatt '1' verwendet wird für start","global","all")],
"STMgpioPortRL"=>[("5","int","piface port oder gpio port für RL oder R relais (bei RL ist 1=R)","PiFaceGpio","0:31")],
"STMgpioPortSTART"=>[("4","int","piface port oder gpio port für START (oder L relais bei 'einzel')","PiFaceGpio","0:31")],
"STMsysCmdRL"=>[("0","string","freies command das für RL an die shell übergeben wird","SysCmd","all")],
"STMsysCmdSTART"=>[("0","string","freies command das für START an die shell übergeben wird","SysCmd","all")],
"STMfhemDevRL"=>[("RelaisRL","string","fhem device name für RL (oder R) aktor","FhemDev","all")],
"STMfhemDevSTART"=>[("RelaisSTART","string","fhem device name für START (oder L) aktor","FhemDev","all")],
"STMmaxDriveSeconds"=>[("107","int","gestoppte Zeit in Sekunden, die der Motor für die Fahrt von 0 bis 100 Prozent braucht","global","all")],
"STMmaxTics"=>[("100","int","Mischerstellung - bei Prozentangaben (PID20) 100, bei Winkelangaben anzupassen","global","1:100")],
"STMtimeTolerance"=>[("0.01","float","stop-time differenzen kleiner als dieser wert werden ignoriert","global","0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1")],
"STMresetOtherDeviceAtCalibrate"=>[("0","string","zusätzliches fhem device das am ende der kalibrierung 'set ** reset' gesendet bekommt","global","all")],
"STMpollInterval"=>[("0.1","float","Zeitintervall nach dem FHEM prüft, ob die interne Stoppzeit erreicht wurde. Hier sollte möglichst kleiner Wert aein, nur erhöhen falls FHEM zu langsam läuft","global","all")],
"STMcalibrateDirection"=>[("L","string","auf R wird die kalibrierung nach rechts gefahren, default=links","global","L,R")],
"STMlastDiffMax"=>[("1","int","ist die stoppzeit weiter als dieser wert vom Soll entfernt, wird sofort neuer drive gestartet","global","1:5")]
);
if($type eq "keys"){
return keys(%attribs);
}elsif($type eq "default"){
return $attribs{$reqKey}[0];
}elsif($type eq "type"){
return $attribs{$reqKey}[1];
}elsif($type eq "description"){
return $attribs{$reqKey}[2];
}elsif($type eq "area"){
return $attribs{$reqKey}[3];
}elsif($type eq "listval"){
return $attribs{$reqKey}[4];
}elsif($type eq "help"){
return "attrHelp for ".$reqKey.":\n default:".$attribs{$reqKey}[0]." type:".$attribs{$reqKey}[1]." area:".$attribs{$reqKey}[3]
." \nlistval:".$attribs{$reqKey}[4]
." \ndescription:".$attribs{$reqKey}[2];
}else{
return "_ attribs?";
}
}

1;

=pod
=begin html

<a name="STELLMOTOR"></a>
<h3>STELLMOTOR</h3>
<ul>
  The STELLMOTOR module manages the control of a 4-way (or 3-way) heating system valve with a simple Right/Left
  Motor drive. Any other motor driven device may be used, too. The two Relays for Right/Left and Motor-Start can
  be attached to <a href=http://www.raspberrypi.org/>Raspberry Pi</a> extension board <a href=http://www.PiFace.org.uk/products/PiFace_digital/>PiFace Digital</a> or
  to GPIO pins directly.
  <br>
  Other supported device types are: SysCmd (any command that will be passed to shell) and FhemDev (any existing actor device in fhem)
  <br>
  The actual position is stored in the reading "position" and displayed in the STATE. It is a int value between
  1 and "STMmaxTics" which defaults to 100. This value is supposed to be percentage of valve opening.<br>
  it is calculated from time the motor has been driven right/left and the attr setting "STMmaxDriveSeconds" which
  defaults to 107 seconds time the motor needs from extreme position to the opposite one.<br>
  STELLMOTOR is tested with the Raspbian OS.<br><br>
 
  <b>Preparatory Work</b><br>
  The use of STELLMOTOR module requires some preparatory work.
  <ul>
    <br>
    <li>Module needs tools from <a href=http://wiringpi.com>Wiring Pi</a>. Install it with<br>
      <code>git clone git://git.drogon.net/wiringPi<br>
        cd wiringPi<br>
        ./build</code><br>
    </li>
    <li>Please refer to PiFace Digital Documentation.
    </li>
    <li>Other device types than PiFace and Gpio doesn't need this preparatory work.
    </li>
  </ul>
  <br>

  <a name="STELLMOTORdefine"></a>
  <b>Define</b>
    <ul><br>
       <code>define &lt;name&gt; STELLMOTOR &lt;PiFace|Gpio|SysCmd|FhemDev&gt; </code><br>
    </ul><br>

<a name="STELLMOTORset"></a>
<b>Set</b><br/>
<ul>
<br/>
<code>set &lt;name&gt; &lt;value&gt;</code>
<br/><br/>
<ul>
<li>set desired valve position to be driven too<br/><br/>
Examples:<br/>
set &lt;name&gt; 1 =&gt; drive to 1%<br/>
set &lt;name&gt; 26 =&gt; drive to 26%<br/>
set &lt;name&gt; 100 =&gt; drive to 100%<br/>
</li>
<br/>
</ul>

<br/>
<code>set &lt;name&gt; reset</code>
<br/>
<code>set &lt;name&gt; calibrate</code>: turn left maximum drive time and reset device readings
<br/><br/>
</ul>
<br>

<a name="STELLMOTORget"></a>
<b>Get</b><br/>
<ul>
<br/>
<code>get &lt;name&gt; </code>
<br/><br/>
<ul>
<li>get actual position<br/><br/>
Example:<br/>
get &lt;name&gt; =&gt; get actual position<br/>
</li>
</ul>
</ul>
<br>

<a name="STELLMOTORattr"></a>
<b>Attributes</b><br/><br/>
<ul>
  <li><a name="#STELLMOTOR_STMrlType">STMrlType</a> wechsel | einzel<br>
  je nach elektrischem anschluß des motors einstellen, default ist "wechsel", d.h. RL-Out-Port schaltet um
  zwischen R und L Lauf, und Start-Out-Port wird für jede motorbewegung eingeschaltet.<br>
  bei "einzel" wird Start-Out-Port für linkslauf einzeln geschaltet, und RL-Out-Port für rechtslauf einzeln geschaltet.<br>
  <b>ACHTUNG:</b> falsche Einstellung kann zu Kurzschluß am Motor führen, bitte Einstellung genau überdenken oder mit dummy testen!!
  </li>
<li>
------------------------------
</li>
  <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
</ul>
<br>

<b>Generated Readings/Events:</b>
<br/><br/>
<ul>
<li>position: 1..100% (or other STMmaxTics than 100), value is set at begin of drive request</li>
<li>state: active|error|&lt;position&gt; (position value is set at the stop of motor drive)</li>
<li>lastStart: HiRes-Time</li>
<li>locked: 0|1</li>
<li>queue_lastdiff<br>
  based on fhem load or other blocking commands, the stop command will be executed near the calculated
  stop time, but never exactly at it. the STELLMOTOR module caches the difference at stopping the drive
  and adds it at the next drive start to its time calculation in otrder to have accurate position value.
</li>
<li>rlport: pin no.</li>
<li>startport: pin no.</li>
<li>stopTime: zero or sceduled time to stop a drive</li>
<li>command_queue: &lt;position&gt;<br>
incoming new desired setting while motor drives the last command (or is disabled) is cached here for
later execution.
</li>
<li>OutType: from device def PiFace|Gpio|OtherDeviceType</li>
<li>DoResetAtStop: last time Calibrate finished</li>
<br>
</ul>

</ul>

=end html
=cut

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 13 Juni 2014, 00:54:28
ZitatHi Florian,

so, dass sieht nun gut aus - es funktioniert, mit diesen beiden Einstellungen komme ich aus dem Schwingen raus:
Code: [Auswählen]

   STMlastDiffMax 5
   STMpollInterval 1
   STMrlType  einzel
   STMtimeTolerance .5


Es fällt auf, dass nach Erreichen der gewünschten Position nach einer mehr oder weniger kurzen Zeitspanne dann im Sekundentakt die Readings
Code: [Auswählen]

2014-06-12 22:35:42   position        10
     2014-06-12 22:35:42   queue_lastdiff  1.38111817209344

aktualisiert werden. Auf meinem leistungsschwachen System (Fritzbox 7390) führt das zur erwähnten Systembelastung.

Wenn die bestellte Position erreicht wurde, dann müsste doch, wenigsten nach einigen Schwingungen auch auf einem langsamen System eigentlich Schluss sein? Da nun minutenlang die lastdiff immer denselben Wert, frage ich mich, ob das richtig ist. Oder wird da das Reading nicht aktualisiert? Gehe ich hin und lösche das Reading (deleteReading) ist der nächste genannte Wert 0 und dann bleibt wie erwartet Ruhe.

Die Prozessorauslastung ist dann wie gewohnt.

STMtimeTolerance ist zu hoch eingestellt, die zulässigen werte sind 0.01 bis 0.1

was das erneute "schwingen" betrifft, da hab ich im code gepfuscht gehabt und was übersehen bei der großen umstellung. update anbei

# $Id: 98_STELLMOTOR.pm 2016 2014-06-13 00:44:00Z Florian Duesterwald $

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: cwagner am 13 Juni 2014, 07:45:44
Jupp, jetzt macht es Spaß! Das Nachkalibrieren auf meinem langsamen System (4 Websessions auf und Logging hochgedreht) ist jetzt im Griff. Das Programm arbeitet und meldet erwartungsgemäß. Aber: Der Mischer läuft aus dem Ruder, weil in dieser Version keine Befehle nach links abgesetzt werden. Verbose habe ich auf 5 gestellt (macht aber keinen Unterscheid gegenüber 3 oder 0):

2014.06.13 07:00:06 3: STELLMOTOR Stellmotor2 Calibrate Started, RL:L
2014.06.13 07:01:44 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402635702.576 now:1402635704.17563 queue_lastdiff:1.68382945813631
2014.06.13 07:05:41 3: STELLMOTOR Stellmotor2 Set Target:10 Cmd:9 RL:R
2014.06.13 07:05:52 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402635950.43969 now:1402635952.26415 queue_lastdiff:-1.92048624942177
2014.06.13 07:06:05 3: STELLMOTOR Stellmotor2 Set Target:18.0795137505782 Cmd:8.07951375057823 RL:R
2014.06.13 07:06:15 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402635972.94576 now:1402635975.27727 queue_lastdiff:-2.45421560187089
2014.06.13 07:06:24 3: STELLMOTOR Stellmotor2 Set Target:27.5457843981291 Cmd:7.54578439812911 RL:R
2014.06.13 07:06:34 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402635991.40859 now:1402635993.9193 queue_lastdiff:-2.64285564422607
2014.06.13 07:07:12 3: STELLMOTOR Stellmotor2 Set Target:17.3571443557739 Cmd:-12.6428556442261 RL:L
2014.06.13 07:07:27 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402636044.71343 now:1402636046.55544 queue_lastdiff:1.93895691319516
2014.06.13 07:07:39 3: STELLMOTOR Stellmotor2 Set Target:11.9389569131952 Cmd:-8.06104308680484 RL:L
2014.06.13 07:07:49 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402636067.2805 now:1402636069.04417 queue_lastdiff:1.85648842861778
2014.06.13 07:07:49 3: STELLMOTOR Stellmotor2 Set Target:2.85648842861778 Cmd:-7.14351157138222 RL:L
2014.06.13 07:08:01 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402636076.8356 now:1402636080.78347 queue_lastdiff:4.15565264852423
2014.06.13 07:08:01 3: STELLMOTOR Stellmotor2 Set Target:5.15565264852423 Cmd:4.15565264852423 RL:R
2014.06.13 07:08:07 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402636085.70973 now:1402636087.42325 queue_lastdiff:1.80370732357627
2014.06.13 07:09:36 3: STELLMOTOR Stellmotor2 Set Target:11.8037073235763 Cmd:10.8037073235763 RL:R
2014.06.13 07:09:49 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402636186.67224 now:1402636189.00454 queue_lastdiff:-2.45505483526933
2014.06.13 07:12:17 3: STELLMOTOR Stellmotor2 Set Target:17.5449451647307 Cmd:7.54494516473067 RL:R
2014.06.13 07:12:27 3: STELLMOTOR Stellmotor2 Stop Timing Call: stopTime:1402636344.92379 now:1402636347.43512 queue_lastdiff:-2.64350840919896


Tatsächlich sind ausgesendet worden (achten auf Mischer_weniger=B und Mischer_mehr=C):
2014-06-13_07:05:42 Switch_Heizkeller Brenner: OFF Mischer_weniger: ON Mischer_mehr: OFF Waschkueche: ON EWT: ON F: OFF G: OFF H: OFF
2014-06-13_07:05:51 Switch_Heizkeller Brenner: OFF Mischer_weniger: OFF Mischer_mehr: OFF Waschkueche: ON EWT: ON F: OFF G: OFF H: OFF
2014-06-13_07:06:06 Switch_Heizkeller Brenner: OFF Mischer_weniger: ON Mischer_mehr: OFF Waschkueche: ON EWT: ON F: OFF G: OFF H: OFF
2014-06-13_07:06:14 Switch_Heizkeller Brenner: OFF Mischer_weniger: OFF Mischer_mehr: OFF Waschkueche: ON EWT: ON F: OFF G: OFF H: OFF
2014-06-13_07:06:25 Switch_Heizkeller Brenner: OFF Mischer_weniger: ON Mischer_mehr: OFF Waschkueche: ON EWT: ON F: OFF G: OFF H: OFF
2014-06-13_07:06:32 Switch_Heizkeller Brenner: OFF Mischer_weniger: OFF Mischer_mehr: OFF Waschkueche: ON EWT: ON F: OFF G: OFF H: OFF
2014-06-13_07:08:02 Switch_Heizkeller Brenner: OFF Mischer_weniger: ON Mischer_mehr: OFF Waschkueche: ON EWT: ON F: OFF G: OFF H: OFF
2014-06-13_07:08:06 Switch_Heizkeller Brenner: OFF Mischer_weniger: OFF Mischer_mehr: OFF Waschkueche: ON EWT: ON F: OFF G: OFF H: OFF
2014-06-13_07:09:37 Switch_Heizkeller Brenner: OFF Mischer_weniger: ON Mischer_mehr: OFF Waschkueche: ON EWT: ON F: OFF G: OFF H: OFF
2014-06-13_07:09:48 Switch_Heizkeller Brenner: OFF Mischer_weniger: OFF Mischer_mehr: OFF Waschkueche: ON EWT: ON F: OFF G: OFF H: OFF
2014-06-13_07:12:18 Switch_Heizkeller Brenner: OFF Mischer_weniger: ON Mischer_mehr: OFF Waschkueche: ON EWT: ON F: OFF G: OFF H: OFF
2014-06-13_07:12:26 Switch_Heizkeller Brenner: OFF Mischer_weniger: OFF Mischer_mehr: OFF Waschkueche: ON EWT: ON F: OFF G: OFF H: OFF


Das Listing des Device:
Internals:
   CFGFN      ./FHEM/test.cfg
   DEF        FhemDev
   NAME       Stellmotor2
   NOTIFYDEV  global
   NR         752
   NTFY_ORDER 50-Stellmotor2
   STATE      80
   TYPE       STELLMOTOR
   Readings:
     2014-06-13 07:01:44   DoResetAtStop   1402635704.65127
     2014-06-13 07:30:38   OutType         FhemDev
     2014-06-13 07:01:44   command_queue   0
     2014-06-13 07:41:51   lastStart       1402638111.91855
     2014-06-13 07:42:15   locked          0
     2014-06-13 07:41:51   position        80
     2014-06-13 07:42:15   queue_lastdiff  -2.46475796950491
     2014-06-13 07:42:16   state           80
     2014-06-13 07:42:15   stopTime        0
Attributes:
   STMcalibrateDirection L
   STMfhemDevRL Switch_Heizkeller output B
   STMfhemDevSTART Switch_Heizkeller output C
   STMinvertOut 0
   STMlastDiffMax 3
   STMmapOffCmd OFF
   STMmapOnCmd ON
   STMmaxDriveSeconds 95
   STMmaxTics 100
   STMpollInterval 1
   STMresetOtherDeviceAtCalibrate 0
   STMrlType  einzel
   STMtimeTolerance 0.1
   room       _house



Noch eine Beobachtung: command_queue bleibt auf 0, auch wenn ich in eine laufende Fahrt hinein eine weitere "beauftrage". Zum Beispiel ausgehend von 10 set Stellmotor2 30 und sofort set Stellmotor2 70, dann sprint Position sofort auf 70 und es wird nun 70 angefahren. Tatsächlich werden die Befehle aber sauber gequeued abgearbeitet.

Grüße
Christian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 13 Juni 2014, 12:44:02
ZitatNoch eine Beobachtung: command_queue bleibt auf 0, auch wenn ich in eine laufende Fahrt hinein eine weitere "beauftrage". Zum Beispiel ausgehend von 10 set Stellmotor2 30 und sofort set Stellmotor2 70, dann sprint Position sofort auf 70 und es wird nun 70 angefahren. Tatsächlich werden die Befehle aber sauber gequeued abgearbeitet.
die queue triggert kein event um die systemlast nicht zu vergeuden, und wird daher nur bei manuellem update (zB F5 key) angezeigt.

aus Deinen logfiles sehe ich folgendes:
a) entweder das log hat nicht richtig reagiert und ist unvollständig
b) Dein switch hat nicht reagiert und die kommandos nicht ausgeführt.
c) irgendwo beim mapping zwischen "output C" und "Mischer_mehr" innerhalb Deiner config wird der wert verschluckt (warum heißt eig. device anders als logeintrag?)

in der angehängten bilddatei habe ich es zusammensortiert und farbig markiert nach R + L. zu den L commands (Cmd ist negativzahl) gibt es keine schaltevents.

hier eine version zum debuggen (schreibt jede schaltaktion explizit ins log:
(zum nicht mehr debuggen einfach die zeile 32: "my($cwagner)=1;" löschen)

# $Id: 98_STELLMOTOR.pm 2018 2014-06-14 09:37:00Z Florian Duesterwald $

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: cwagner am 13 Juni 2014, 16:34:45
Hallo Florian,

wie üblich geht es in Praxis heute Abend weiter - danke für die Debug-Fassung (das hatte ich mit verbose=5 versucht auszuloten). Da werde ich der Sache hoffentlich auf die Spur kommen.

ein "set Switch_Heizkeller output C ON" von der Konsole oder aus anderen Programm funktioniert. Deshalb habe ich das Problem nicht an dieser Stelle gesucht, aber das können wir ja mit der Debug-Zeile checken.

Warum heißt es im Device "C" ocder "B": Das OW_SWITCH-Modul erlaubt den Ports (A, B, C,.... H) Namen zu geben und man kann dann sowohl über den sprechenden Namen wie über den stumpfen Port adressieren.
Damit wird natürlich FHEM für den gemeinen Anwender leichter les- und verstehbar.

Um sicher zu gehen, dass durch diese Alias-Namen keine Komplikationen entstehen, teste ich grundsätzlich mit den Portnamen. Die sind mir da ja geläufig, in einem halben Jahr weiß ich natürlich nicht mehr, dass Port B "Mischer_weniger" benannt ist.
set Switch_Heizkeller output Mischer_mehr ON" ist also identisch mit set Switch_Heizkeller output C

Herzliche Grüße

Christian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 14 Juni 2014, 09:44:40
update:
# $Id: 98_STELLMOTOR.pm 2018 2014-06-14 09:37:00Z Florian Duesterwald $

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: ph1959de am 14 Juni 2014, 12:40:31
Bitte, bitte, bitte - nimm das Modul wieder in den ersten Beitrag. Warum? Das ist jetzt hier (vorübergehend) der letzte Beitrag ... und der enthält nicht die aktuelle Version des Moduls.

Danke, Peter
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 14 Juni 2014, 13:20:16
ph1959de, habe das bislang anders gehandhabt, da der erste beitrag wesentlich unpraktischer (für mich) ist. die problematik mit dem aktuellsten ist mir klar, daher war debug im vorletzten noch nciht gelöscht, und im letzten (mit debug code aber abgeschaltetem debug) für die "allgemeinheit" gedacht.
was soll's, es ist umgestellt, wäre ja nicht sinnvoll althergebrachte gewohnheit mit update im ersten beitrag durcheinanderzubringen nur weil es für einen einzelnen "praktischer" wäre. und nun wartet mein grill auf mich :)
LG, florian
Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 17 Juni 2014, 12:35:09
die doku im Wiki is nun mit den neuen features der version 2.0 gefüttert:

http://www.fhemwiki.de/wiki/Mischersteuerung (http://www.fhemwiki.de/wiki/Mischersteuerung)

Titel: Antw:98_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 20 Juni 2014, 18:42:23
update:

# $Id: 39_STELLMOTOR.pm 2021 2014-06-20 18:00:00Z Florian Duesterwald $
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 22 Juni 2014, 11:57:35
update:

# $Id: 39_STELLMOTOR.pm 2022 2014-06-21 11:54:00Z Florian Duesterwald $


+attr STMdebugToLog3
-Log level angepaßt
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 29 Juni 2014, 14:07:52
update:

# $Id: 39_STELLMOTOR.pm 2022 2014-06-29 14:04:00Z Florian Duesterwald $


(minor changes)
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 01 Juli 2014, 22:36:15
update:

# $Id: 39_STELLMOTOR.pm 2023 2014-07-01 22:34:00Z Florian Duesterwald $
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: hollyghost am 07 August 2014, 17:11:01
Hallo Florian,
ich möchte dein Modul gerne für eine selbstentwickelte Rolladensteuerung einsetzten.
Bei einer Mischersteuerung kommt es sicher selten vor, dass ich eine einmal angestoßene Fahrt unterbrechen muss. Bei einer Rolladen / Leinwandsteuerung, die sowohl zeitgesteuert als auch manuell (durch Betätigung von Tastern) bedient werden kann - ist das Anhalten nach einer Fahrtzeit x sicher keine Seltenheit. Die Möglichkeit zum Stoppen einer Fahrt sehe ich in deinem Modul (bisher  :) ) noch nicht. Habe ich etwas übersehen oder oder hast du diese Möglichkeit nicht vorgesehen?

Grüße
Holger
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 09 August 2014, 01:00:12
hallo Holger,
ich schau mir das nach dem urlaub mal an, sollte normalerweise leicht nachzurüsten sein. es ist eh noch ein anderes feature in der warteschleife für dieses modul.
es wird allerdings etwas dauern, ein anderes modul von mir ist bereits in arbeit wird vorher ein update bekommen.
LG, florian
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: hollyghost am 09 August 2014, 05:59:59
Hallo Florian,
das klingt gut - genieße deinen Urlaub.
Grüße
Holger
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.0
Beitrag von: epsrw1 am 25 August 2014, 15:04:02
Zitat von: hollyghost am 07 August 2014, 17:11:01
Hallo Florian,
ich möchte dein Modul gerne für eine selbstentwickelte Rolladensteuerung einsetzten.
Bei einer Mischersteuerung kommt es sicher selten vor, dass ich eine einmal angestoßene Fahrt unterbrechen muss. Bei einer Rolladen / Leinwandsteuerung, die sowohl zeitgesteuert als auch manuell (durch Betätigung von Tastern) bedient werden kann - ist das Anhalten nach einer Fahrtzeit x sicher keine Seltenheit. Die Möglichkeit zum Stoppen einer Fahrt sehe ich in deinem Modul (bisher  :) ) noch nicht. Habe ich etwas übersehen oder oder hast du diese Möglichkeit nicht vorgesehen?

Grüße
Holger


update:
# $Id: 39_STELLMOTOR.pm 2025 2014-08-25 14:58:00Z Florian Duesterwald $



in der aktuellen neuen version ist das kommando stop als neuer set befehl eingebaut.
LG, florian
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: hollyghost am 31 August 2014, 09:41:56
Super & Danke :o) - das werde ich nach meinem Urlaub testen.
Grüße Holger
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: hollyghost am 16 September 2014, 17:05:49
Hallo Florian,
ich bin heute endlich mal zum Testen gekommen.
Vielleicht noch kurz zum meinem ,Setup' – ich verwende dein Szenario ,wechsel' und habe als fhemDEV zwei ReadingProxy eingebunden, die via I2C meine Relais schalten. Das Einbinden und Ansprechen funktioniert einwandfrei.
Der Stoppbefehl funktioniert allerdings nicht so, wie ich ihn mir ,vorgestellt' habe.
Folgenden Ablauf habe ich geplant:
Druck auf einen Taster ,Up' schickt den Motor auf Position 1.
Wird der Taster länger als 2 Sekunden gedrückt, wird nach dem Loslassen des Tasters der Befehl ,stop' zum Motor gesendet. Nun kann es vorkommen, dass
a) der Motor sofort stehen bleibt
b) der Motor noch ein Stückchen weiter läuft und stehen bleibt oder
c) der Motor stopt & wieder ein wenig zurück läuft.
Ich kann mir das nur so vorstellen, dass du die aktuelle Fahrt nicht an x-beliebiger Stelle abbrechen kannst und du nach dem Abbruch die angefahrene Position korrigierst (klassische Korrektur eines Überschwingers). Bei einer Ventilregelung macht das Sinn und ist sicher auch notwendig. Bei einer Rollladen Steuerung bzw. einer Leinwand mutet diese Verhalten ein wenig ,lustig' an  ;)
Siehst du ne Chance an diesem Stoppverhalten noch etwas zu ändern?
Viele Grüße
Holger
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: epsrw1 am 16 September 2014, 17:19:44
A und b sind normale Funktion. B bedeutet dass fhem ausgelastet war.
C sollte normal nicht vorkommen, daß ist evtl ein rechenproblem. Schau ich mir am we mal an...

Gruß florian
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: hollyghost am 16 September 2014, 17:38:26
Super,
A&B sind für mich auch 'normal' ich wollte sie nur der Vollständigkeit halber aufführen. c ist eben ein wenig seltsam - ich bin nun aber schon beruhigt, dass das von dir auch so gesehen wird.
Grüße Holger
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: hollyghost am 18 September 2014, 13:11:46
Hallo Florian,
ich habe gestern noch ein wenig rumprobiert und wollte dir den Log-Auszug nicht vorenthalten - vielleicht hilft er dir bei der Fehlersuche:

2014.09.17 15:49:40 4: STELLMOTOR gwc_rollladen Set Target:99 Cmd:98.117449230618 RL:R
2014.09.17 15:49:40 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.17 15:49:40 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.17 15:49:40 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.17 15:49:40 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 on
2014.09.17 15:49:40 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 on
2014.09.17 15:49:40 3: gwc Longpress-Status: no
2014.09.17 15:51:09 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.17 15:51:09 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.17 15:51:09 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.17 15:51:09 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.17 15:51:09 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 off
2014.09.17 15:51:09 4: STELLMOTOR gwc_rollladen Stop Timing Call: stopTime:1410961868.98193 now:1410961869.15684 queue_lastdiff:-0.194344255659315
2014.09.17 15:53:12 4: STELLMOTOR gwc_rollladen Set Target:0 Cmd:-98.1943442556593 RL:L
2014.09.17 15:53:12 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.17 15:53:12 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.17 15:53:12 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.17 15:53:12 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.17 15:53:12 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 on
2014.09.17 15:53:19 3: gwc Longpress-Status: yes
2014.09.17 15:53:19 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.17 15:53:19 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.17 15:53:19 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.17 15:53:19 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.17 15:53:19 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 off
2014.09.17 15:53:19 4: STELLMOTOR gwc_rollladen Stop Timing Call: stopTime:1410962080.50154 now:1410961999.36094 queue_lastdiff:9.84378788206313
2014.09.17 15:53:19 4: STELLMOTOR gwc_rollladen User submitted Stop Request
2014.09.17 15:53:19 4: STELLMOTOR gwc_rollladen Set Target:110 Cmd:9.84378788206313 RL:R
2014.09.17 15:53:19 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.17 15:53:19 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.17 15:53:19 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.17 15:53:19 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 on
2014.09.17 15:53:19 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 on
2014.09.17 15:53:28 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.17 15:53:28 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.17 15:53:28 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.17 15:53:28 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.17 15:53:28 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 off
2014.09.17 15:53:28 4: STELLMOTOR gwc_rollladen Stop Timing Call: stopTime:1410962008.30383 now:1410962008.49659 queue_lastdiff:0.214180946350098

Als erstes lasse ich den Motor auf Position 99 fahren, dazu benötigt er 90sec. Das läuft soweit prima durch.
Dann schicke ich ihn auf Position 1 (hier fällt mir auf, dass die Debugmeldung ihn auf Position 0 schickt, ich gehe mal davon aus, dass das mit dem 'lastdiff' zusammen hängt).
7 Sekunden später stoppe ich den Motor, was auch im Log mit den beiden off Befehlen und dem Eintrag 'User submitted Stop Request' quittiert wird.
Der nun folgende Set-Befehl (Set Target:110 Cmd:9.84378788206313 RL:R) wird von deinem Modul erzeugt. Auffallend ist, dass das CMD genau dem lastdiff aus der vorhergehende Stopp Meldung entspricht.
Ich habe im Moment die GetUpdate-Sub im Verdacht - kann es sein, dass sie vom Stoppen nichts mitbekommt, und einfach munter weiter berechnet, wo sie hinfahren soll?
Kein Stress - ich wollte dir die Gedanken nur mit auf den Weg geben.
Grüße
Holger
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: epsrw1 am 21 September 2014, 08:43:33
L.335 ff.:
my $STMlastDiffMax = AttrVal($name, "STMlastDiffMax", 1);
my $position = ReadingsVal($name,"position", 1);
     ........
}elsif(abs($queue_lastdiff)>$STMlastDiffMax){ #start new drive if last diff > 1sec (attr: STMlastDiffMax)
STELLMOTOR_Set($hash,$name,$position);
}


die konstellation mit der ich das überschwing-verhalten reproduzieren kann ist wie folgt:

lastdiff hat einen wert nahe der toleranzschwelle, zB. 0,9. setze ich nun den stop-befehl ab stoppt der motor sofort, dann wird der aktuelle stand berechnet. um rundungsfehler abzufangen werden die nachkommastellen der aktuellen position mit dem letzten wert von queue_lastdiff addiert.
war die lastdiff vorher groß, ist die chance daß ( queue_lastdiff + nachkommastellen ) > STMlastDiffMax ist recht groß, und im nächsten loop wird eine kurze fahrt gestartet um queue_lastdiff wieder unterhalb STMlastDiffMax zu bringen.

mögliche abhilfe: atttr STMlastDiffMax vorsichtig erhöhen

sollte das nichts bringen brauche ich die kompl. config von Deinem STELLMOTOR device um es nochmal genau zu prüfen.

die neue version (2026) macht nochmal mehr debug einträge bei loglevel 4, wenn das attr nicht hilft brauche ich davon nochmal einen logauszug.

LG, florian
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: hollyghost am 21 September 2014, 08:54:25
Hallo Florian,
Wie du aus meinem Log erkennen kannst, war queue_lastdiff bei 9.84.....
Ich glaube, soweit kann ich nicht aufbohren.
Die Theorie, dass der Loop mitten in den Stop fällt und dadurch vielleicht Variablen ausgewertet werden, welche durch den Stop gerade aktualisiert werden, kann hier nicht greifen?
Das SetTarget 110 kommt mir eben auch spanisch vor.
Mit der kompletten Konfiguration meinst du die Stellmotor Settings?
Grüße Holger
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: epsrw1 am 21 September 2014, 09:02:36
ZitatMit der kompletten Konfiguration meinst du die Stellmotor Settings?

ja :)
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: hollyghost am 21 September 2014, 09:44:00
Ok
hier schon mal die Konfig - zum Testen komme ich leider erst heute Nachmittag.

Vile Grüße Holger

#--Rolladen deffinieren--
define gwc_rollladen STELLMOTOR FhemDev
attr gwc_rollladen STMcalibrateDirection L
attr gwc_rollladen STMdebugToLog3 1
attr gwc_rollladen STMfhemDevRL prxPortA2
attr gwc_rollladen STMfhemDevSTART prxPortA1
attr gwc_rollladen STMinvertOut 0
attr gwc_rollladen STMlastDiffMax 1
attr gwc_rollladen STMmapOffCmd off
attr gwc_rollladen STMmapOnCmd on
attr gwc_rollladen STMmaxDriveSeconds 90
attr gwc_rollladen STMmaxTics 100
attr gwc_rollladen STMpollInterval 0.1
attr gwc_rollladen STMresetOtherDeviceAtCalibrate 0
attr gwc_rollladen STMrlType wechsel
attr gwc_rollladen STMtimeTolerance 0.01
attr gwc_rollladen room Rollo
attr gwc_rollladen verbose 4
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: hollyghost am 21 September 2014, 20:39:09
Hallo Florian,
ist ein wenig später geworden  - aber hier nun der Log-Auszug zu meinen Test:
An den Settings habe ich zunächst nichts geänderte. Deine beiden neu angelegten Log3 Zeilen kommen wohl nicht zum Zuge - zumindest sehe ich keine entsprechenden Einträge im Log.

2014.09.21 20:10:29 3: STELLMOTOR gwc_rollladen active, type=FhemDev
2014.09.21 20:11:00 4: STELLMOTOR gwc_rollladen Set Target:50 Cmd:42.1253175735474 RL:R
2014.09.21 20:11:00 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.21 20:11:00 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.21 20:11:00 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.21 20:11:00 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 on
2014.09.21 20:11:00 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 on
2014.09.21 20:11:38 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.21 20:11:38 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.21 20:11:38 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.21 20:11:38 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.21 20:11:38 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 off
2014.09.21 20:11:38 4: STELLMOTOR gwc_rollladen Stop Timing Call: stopTime:1411323098.70067 now:1411323098.8281 queue_lastdiff:-0.14158911175198
2014.09.21 20:11:51 4: STELLMOTOR gwc_rollladen Set Target:0 Cmd:-49.141589111752 RL:L
2014.09.21 20:11:51 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.21 20:11:51 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.21 20:11:51 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.21 20:11:51 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.21 20:11:51 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 on
2014.09.21 20:11:51 3: gwc Longpress-Status: no
2014.09.21 20:12:35 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.21 20:12:35 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.21 20:12:35 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.21 20:12:35 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.21 20:12:35 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 off
2014.09.21 20:12:35 4: STELLMOTOR gwc_rollladen Stop Timing Call: stopTime:1411323155.40294 now:1411323155.50883 queue_lastdiff:0.117663012610541
2014.09.21 20:12:54 4: STELLMOTOR gwc_rollladen Set Target:99 Cmd:98.1176630126105 RL:R
2014.09.21 20:12:54 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.21 20:12:54 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.21 20:12:54 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.21 20:12:54 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 on
2014.09.21 20:12:54 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 on
2014.09.21 20:12:54 3: gwc Longpress-Status: no
2014.09.21 20:14:22 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.21 20:14:22 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.21 20:14:22 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.21 20:14:22 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.21 20:14:22 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 off
2014.09.21 20:14:22 4: STELLMOTOR gwc_rollladen Stop Timing Call: stopTime:1411323262.61885 now:1411323262.71733 queue_lastdiff:-0.109417968326145
2014.09.21 20:15:06 4: STELLMOTOR gwc_rollladen Set Target:0 Cmd:-98.1094179683261 RL:L
2014.09.21 20:15:06 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.21 20:15:06 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.21 20:15:06 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.21 20:15:06 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.21 20:15:06 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 on
2014.09.21 20:15:14 3: delete gwc_longPressTimer : Please define gwc_longPressTimer first
2014.09.21 20:15:14 3: gwc Longpress-Status: yes
2014.09.21 20:15:14 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.21 20:15:14 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.21 20:15:14 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.21 20:15:14 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.21 20:15:14 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 off
2014.09.21 20:15:14 4: STELLMOTOR gwc_rollladen Stop Timing Call: stopTime:1411323394.96061 now:1411323314.54531 queue_lastdiff:9.64966625637479
2014.09.21 20:15:14 4: STELLMOTOR gwc_rollladen User submitted Stop Request
2014.09.21 20:15:14 4: STELLMOTOR gwc_rollladen Set Target:109 Cmd:9.64966625637479 RL:R
2014.09.21 20:15:14 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.21 20:15:14 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.21 20:15:14 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.21 20:15:14 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 on
2014.09.21 20:15:14 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 on
2014.09.21 20:15:23 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.21 20:15:23 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.21 20:15:23 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.21 20:15:23 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.21 20:15:23 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 off
2014.09.21 20:15:23 4: STELLMOTOR gwc_rollladen Stop Timing Call: stopTime:1411323323.35283 now:1411323323.51943 queue_lastdiff:0.185115072462294


Ich schicke den Stellmotor über die Weboberfläche auf Position 50.
Dann via notify auf Position 1.
Nun via notify auf Position 99. (100 hatte bei meinen ersten Versuchen mit deinem Modul Schwierigkeiten gemacht, deshalb 99)
Von hier wieder via notify auf 1 und dann schicke ich via notify (-Longpress yes-) das 'set stop'.
Hier zeigt sich dann wieder das angesprochene Verhalten 'C'. Auch deutlich zu sehen, die queue_lastdiff wird 1:1 als CMD übernommen. Wo das Set Target:109 herkommt, verstehe ich in diesem Zusammenhang immer noch nicht.

Wann hätten deiner Meinung nach die beiden neu eingefügten Log3 Zeilen ausgegeben werden sollen?
Grüße und Danke schon/noch-mal für deine Mühe.
Holger
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: epsrw1 am 21 September 2014, 23:09:52
ich habe an der falschen stelle gesucht.
hier im anhang (fußzeile) mal die BETA version 2027, kannst Du bitte mal testen ob das bei Dir anständig läuft? wenn ja schreibe ich das ins reine für ein offizielles update.
LG, florian
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: hollyghost am 22 September 2014, 10:03:23
Hallo Florian,
es passt leider immer noch nicht.
Deine neu eingefügten debug Meldungen erscheinen nur im Event-Monitor. Ich hab dir mal die Auszüge des Event Monitors und das Log in jeweils ein Excel-Sheet kopiert (ich hoffe du kannst das Format öffnen, wenn nicht bitte melden) und die entsprechenden Zeilen farbig markiert. Grün die jeweiligen Start Befehle, GelbOrange die dazu passenden Stoppmeldungen des Stellmotors und einen Pink-Block bei dem ich die Motorfahrt mit einem set stop abbreche.
Wie du siehst, schicke ich den Motor wieder von 99 nach 1 und breche die Fahrt nach ca. 7 Sekunden ab. Rechnerisch sollte der Motor zu dieser Zeit in der Nähe der Position 90 sein. Die neue debug Meldung gibt zu diesem Zeitpunkt Position 100 aus – Würde hier 80 rauskommen würde das irgendwie auch wieder mit der queue_lastdiff von 9,irgendwas zusammen passen. Ich will nicht nerven, aber mir geht die GetUpdate noch immer nicht aus dem Kopf – stoppst du die ,Updateberechnung' sofort, wenn der Stoppbefehl erkannt wird, oder laufen die erst mal (unabhängig) weiter und überbügeln vielleicht deine Berechnung, die du bei einem Stoppbefehl (außerhalb der Updateroutine) zur aktuellen Positionsbestimmungen durchführst? Vielleicht bin ich hier ein gebranntes Kind aber ich hatte schon die schönsten Effekte bei unabhängig laufenden ,Threads'.
Grüße
Holger
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: hollyghost am 22 September 2014, 10:16:12
Und noch ein Nachtrag:
Wenn ich eine Fahrt von 1 nach 99 mit einem set stop abbreche, wird durch das Modul ein 'negatives' Target berechnet - siehe Log:

2014.09.22 10:09:14 4: STELLMOTOR gwc_rollladen Set Target:99 Cmd:98.1334744029575 RL:R
2014.09.22 10:09:14 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.22 10:09:14 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.22 10:09:14 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.22 10:09:14 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 on
2014.09.22 10:09:14 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 on
2014.09.22 10:09:22 3: delete gwc_longPressTimer : Please define gwc_longPressTimer first
2014.09.22 10:09:22 3: gwc Longpress-Status: yes
2014.09.22 10:09:22 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.22 10:09:22 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.22 10:09:22 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.22 10:09:22 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.22 10:09:22 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 off
2014.09.22 10:09:22 4: STELLMOTOR gwc_rollladen Stop Timing Call: stopTime:1411373442.44468 now:1411373362.60794 queue_lastdiff:-9.29251665539212
2014.09.22 10:09:22 4: STELLMOTOR gwc_rollladen User submitted Stop Request
2014.09.22 10:09:22 4: STELLMOTOR gwc_rollladen Set Target:-8 Cmd:-9.29251665539212 RL:L
2014.09.22 10:09:22 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.22 10:09:22 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.22 10:09:22 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.22 10:09:22 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.22 10:09:22 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 on
2014.09.22 10:09:31 3: STELLMOTOR gwc_rollladen debug data for R=>rl=on,st=on
2014.09.22 10:09:31 3: STELLMOTOR gwc_rollladen debug data for L=>rl=off,st=on
2014.09.22 10:09:31 3: STELLMOTOR gwc_rollladen debug data for S=>rl=off,st=off
2014.09.22 10:09:31 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA2 off
2014.09.22 10:09:31 3: STELLMOTOR gwc_rollladen debug2 command: set prxPortA1 off
2014.09.22 10:09:31 4: STELLMOTOR gwc_rollladen Stop Timing Call: stopTime:1411373371.10756 now:1411373371.28571 queue_lastdiff:0.197944376203749

Es scheint, als ob er versucht, auf die 'Ausgangsposition' (hier 1) zurückzufahren. Vielleicht hilft dir das weiter.
LG Holger
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: epsrw1 am 22 September 2014, 11:04:02
ich kann den beschriebenen fehler leider nicht reproduzieren. bist Du sicher dass Du das modul neu geladen hast?

die geplante stopzeit wird beim set-befehl berechnet und ins reading geschrieben. getUpdate prüft das reading und stoppt wenn zeitpunkt erreicht bzw. überschritten ist.

die neue beta stoppt im gegensatz zur vorherigen beim user-stop nicht mehr selbst, sondern berechnet nur stopTime neu und aktualisiert das reading. der eigentliche stop wird wieder von getUpdate ausgeführt. so sollte konfusion zwischen den beiden teilen ausgeschlossen sein.

ich prüfe das modul heute abend nochmal durch und räume den zeilensalat etwas auf, vielleicht finde ich dann noch was ...

edit: in der beta sollten die readings debug_05 und debug_06 jeweils den gleichen wert enthalten. ist das zutreffend bei Dir?

LG, florian
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: hollyghost am 22 September 2014, 12:19:48
Bingo!!
Zitatbist Du sicher dass Du das modul neu geladen hast?
:-[ Das war der entscheidende Hinweis. Ich habe zwar immer schön einen rereadcfg durchgeführt aber kein reload <modul>.
Super - herzlichen Dank für deine Mühe und Geduld bisher. Im Moment läuft das Modul wie gewünscht.

Eine Anpassung habe ich noch vorgenommen - vielleicht willst du die bei dir übernehmen.
Ich betreibe dein Modul im Modus 'wechsel'. Mir ist aufgefallen, dass in diesem Modus sowohl beim Starten als auch beim Stoppen das 'Start' Relais immer als zweites schaltet. In meiner Schaltung habe ich zum Schutz der Relaiskontakte einen Varistor über dem Schaltkontakt des Startrelais verbaut. (Ich weiß, ich könnte auch das R/L Relais mit einem Varistor versehen....) Sprich, dieses Relais muss beim Stoppen zuerst schalten, sodass der Stromkreis darüber getrennt wird. Wird das R/L Relais beim Stoppen zuerst geschaltet, hat das ja auch noch den Effekt, dass der Motor (zumindest theoretisch) kurzzeitig die Richtung wechselt. Durch die Trägheit des Systems ist dieser Wechsel nicht auszumachen - aber ich glaube gut tut es dem Motor nicht. Wie auch immer - ich habe für mich den "FhemDev"-Zweig der command sub wie folgt angepasst, vielleicht willst du das ja generell übernehmen.

elsif($OutType eq "FhemDev"){
if($command eq "S"){#Stop - switch off START first
my $STMfhemDevSTART = AttrVal($name, "STMfhemDevSTART", "Stellmotor2start");
CommandSet(undef,$STMfhemDevSTART." ".$portST{$command});
my $STMfhemDevRL = AttrVal($name, "STMfhemDevRL", "Stellmotor2rl");
CommandSet(undef,$STMfhemDevRL." ".$portRL{$command});
#2014-06-13 debug
if(AttrVal($name,"STMdebugToLog3",0)){
Log3($name, 3, "STELLMOTOR $name debug2 switch to stop");
Log3($name, 3, "STELLMOTOR $name debug2 command: set ".$STMfhemDevSTART." ".$portST{$command});
Log3($name, 3, "STELLMOTOR $name debug2 command: set ".$STMfhemDevRL." ".$portRL{$command});
}
}else{#Move - set R/L first
my $STMfhemDevRL = AttrVal($name, "STMfhemDevRL", "Stellmotor2rl");
CommandSet(undef,$STMfhemDevRL." ".$portRL{$command});
my $STMfhemDevSTART = AttrVal($name, "STMfhemDevSTART", "Stellmotor2start");
CommandSet(undef,$STMfhemDevSTART." ".$portST{$command});
#2014-06-13 debug
if(AttrVal($name,"STMdebugToLog3",0)){
Log3($name, 3, "STELLMOTOR $name debug2 begin to run");
Log3($name, 3, "STELLMOTOR $name debug2 command: set ".$STMfhemDevRL." ".$portRL{$command});
Log3($name, 3, "STELLMOTOR $name debug2 command: set ".$STMfhemDevSTART." ".$portST{$command});
}
}
}


LG & nochmal herzlichen Dank
Holger
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 2.1
Beitrag von: epsrw1 am 22 September 2014, 14:52:26
Zitat von: hollyghost am 22 September 2014, 12:19:48
Eine Anpassung habe ich noch vorgenommen - vielleicht willst du die bei dir übernehmen.
Ich betreibe dein Modul im Modus 'wechsel'. Mir ist aufgefallen, dass in diesem Modus sowohl beim Starten als auch beim Stoppen das 'Start' Relais immer als zweites schaltet. In meiner Schaltung habe ich zum Schutz der Relaiskontakte einen Varistor über dem Schaltkontakt des Startrelais verbaut. (Ich weiß, ich könnte auch das R/L Relais mit einem Varistor versehen....) Sprich, dieses Relais muss beim Stoppen zuerst schalten, sodass der Stromkreis darüber getrennt wird. Wird das R/L Relais beim Stoppen zuerst geschaltet, hat das ja auch noch den Effekt, dass der Motor (zumindest theoretisch) kurzzeitig die Richtung wechselt. Durch die Trägheit des Systems ist dieser Wechsel nicht auszumachen - aber ich glaube gut tut es dem Motor nicht. Wie auch immer - ich habe für mich den "FhemDev"-Zweig der command sub wie folgt angepasst, vielleicht willst du das ja generell übernehmen.

neue (nicht-beta) version 3001 kommt gleich online. die start/stop sache habe ich etwas abgewandelt gleich ins modul eingebaut.

LG, florian
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: hollyghost am 22 September 2014, 15:23:57
Mensch prima, das läuft ja hier wie geschmiert.
Eine Frage noch zur Performance - wieviele Stellmotoren hast du in deinem System am Laufen? Ich plane 7 Instanzen einzusetzen, die im ungünstigsten Fall parallel ihre Positionen anfahren werden.
Grüße Holger
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: epsrw1 am 22 September 2014, 16:17:45
Zitat von: hollyghost am 22 September 2014, 15:23:57
Mensch prima, das läuft ja hier wie geschmiert.
Eine Frage noch zur Performance - wieviele Stellmotoren hast du in deinem System am Laufen? Ich plane 7 Instanzen einzusetzen, die im ungünstigsten Fall parallel ihre Positionen anfahren werden.
Grüße Holger

das nadelöhr sind eher die schaltaktoren. modul-performance sollte mit durchschnittlicher serverhardware kein thema sein
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: hollyghost am 22 September 2014, 16:43:47
Die Aktoren sollten passen, das hab ich per I2C mit nem 23017 gelöst.
Hast du die HTML Doku bei der 3001 am Ende extra weggelassen?
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: epsrw1 am 23 September 2014, 10:40:41
Zitat von: hollyghost am 22 September 2014, 16:43:47
Hast du die HTML Doku bei der 3001 am Ende extra weggelassen?

ja, die war eh nicht mehr up-to-date. etwas umständlich wiki und pod gleichzeitig zu pflegen.
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: epsrw1 am 03 Oktober 2014, 11:52:46
update:


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


--> disable [0..1]
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: hollyghost am 03 Oktober 2014, 20:41:01
Hallo Florian, was bewirkt das Disable bzw. Wofür setzt du es ein/kann es verwendet werden?
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: epsrw1 am 05 Oktober 2014, 02:16:16
Zitat von: hollyghost am 03 Oktober 2014, 20:41:01
Hallo Florian, was bewirkt das Disable bzw. Wofür setzt du es ein/kann es verwendet werden?

disable verhindert die motorbewegung und merkt sich das jeweils letzte command in command_queue
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: cwagner am 24 Oktober 2014, 22:30:20
Hallo Florian,

Dein Stellmotor fordert mich viel hundertfach auf, Dir dies mitzuteilen :-)

2014.10.24 22:26:59 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:7.8 please report this error L.414
2014.10.24 22:26:59 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:7.8 please report this error L.414
2014.10.24 22:26:59 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:7.8 please report this error L.414


Herzliche Grüße

Christian
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: epsrw1 am 25 Oktober 2014, 08:41:52
Zitat von: cwagner am 24 Oktober 2014, 22:30:20
2014.10.24 22:26:59 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:7.8 please report this error L.414
2014.10.24 22:26:59 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:7.8 please report this error L.414
2014.10.24 22:26:59 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:7.8 please report this error L.414


hallo christian,
tritt der fehler nach dem neustart auf? der wert sollte eine ganze zahl sein, ist aber bei Dir im log 7,8. wie kann man den fehler provozieren daß er wieder auftritt?
LG, florian
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: cwagner am 25 Oktober 2014, 10:18:09
Hallo Florian, Treffer! Die Fehlermeldung erschien nicht nur nach Neustart, erscheint aber nicht mehr, seitdem ich nur noch Ganzzahlen an STELLMOTOR übergebe. Ich trage das mal im WIKI ein. Bei mir war das Aufgetreten, nachdem ich den Dummy zwischen PID20 und STELLMOTOR abgeschafft hatte - offenbar hatte ich durch den DUMMY die Werte aus PID20 - bisher auf 1 Nachkommastelle gerechnet, nun durch das Attribut pidActorValueDecPlaces=0 auf Ganzzahl eingestellt - bisher immer Ganzzahlen übergeben.


Danke und schönes Wochenende

Christian
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: cwagner am 08 November 2014, 10:43:11
Moin, Florian, leider muss ich meine vorangegangene Aussage korrigieren. Ja, die Fehlermeldungen reduzierten sich, nachdem ich nur noch ganze Zahlen übergeben habe, aber ich habe sie weiterhin jeden Tag wenn der Regler gegen Null läuft. Dabei habe ich die Werte, die übergeben werden sowieso auf 1...99 begrenzt:
2014.11.08 09:51:16 3: PID20 PID_Mischer_FBH: Calc.691 <set Stellmotor2  1>
2014.11.08 09:53:47 3: PID20 PID_Mischer_FBH: Calc.691 <set Stellmotor2  3>
2014.11.08 09:55:48 3: PID20 PID_Mischer_FBH: Calc.691 <set Stellmotor2  5>
2014.11.08 09:56:19 3: PID20 PID_Mischer_FBH: Calc.691 <set Stellmotor2  3>
2014.11.08 09:57:20 3: PID20 PID_Mischer_FBH: Calc.691 <set Stellmotor2  5>
2014.11.08 10:00:51 3: PID20 PID_Mischer_FBH: Calc.691 <set Stellmotor2  7>
2014.11.08 10:02:22 3: PID20 PID_Mischer_FBH: Calc.691 <set Stellmotor2  9>
2014.11.08 10:03:23 3: PID20 PID_Mischer_FBH: Calc.691 <set Stellmotor2  5>
2014.11.08 10:03:54 3: PID20 PID_Mischer_FBH: Calc.691 <set Stellmotor2  1>
2014.11.08 10:18:56 3: PID20 PID_Mischer_FBH: Calc.691 <set Stellmotor2  3>
2014.11.08 10:20:27 3: PID20 PID_Mischer_FBH: Calc.691 <set Stellmotor2  5>
2014.11.08 10:22:28 3: PID20 PID_Mischer_FBH: Calc.691 <set Stellmotor2  1>
2014.11.08 10:22:35 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:-1 please report this error L.414
2014.11.08 10:22:35 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:-1 please report this error L.414
2014.11.08 10:22:35 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:-1 please report this error L.414
2014.11.08 10:22:35 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:-1 please report this error L.414
2014.11.08 10:22:37 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:-1 please report this error L.414
2014.11.08 10:22:37 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:-1 please report this error L.414
2014.11.08 10:22:37 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:-1 please report this error L.414
2014.11.08 10:22:37 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:-1 please report this error L.414
2014.11.08 10:22:39 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:-1 please report this error L.414
2014.11.08 10:22:39 3: STELLMOTOR Stellmotor2 Stop Problem: lastGuiState:-1 please report this error L.414


Diese Meldung kommt nun solange im Sekundentakt, bis ich einen Stellbefehl größer/gleich 1 aktiv sende.
Kann es sein, dass sich im Programm Rundungsdifferenzen aufbauen im Laufe eines Tages sodass Stellmotor-Intern werte kleiner 1 entstehena?

STMmaxDriveSeconds   ist bei mir 95; STMmaxTics ist 99.

Herzliche Grüße

Christian
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: janwilli am 12 September 2015, 13:20:12
Hallo
Erstmal danke für das modul, ich bin gerade noch am testen, aber ich werde es nutzen können für meine rollläden.
Mir ist folgendes aufgefallen, wenn ich max interval auf 10 secunden setzte sonst nicht am default ändre passiert folgendes:
ich fahre zu erst nach 50 dann 99 dann wieder 50, jetzt kommt der bug das modul fährt weiter auf -3 oder auch mal -6 und hängt dann da...
im log steht:
2015.09.12 10:52:26 3: STELLMOTOR gpiorollo active, type=FhemDev
2015.09.12 11:02:17 3: STELLMOTOR gpiorollo Stop Problem: lastGuiState:-3 please report this error L.414
die letzte zeile wiederholt sich in einer endlosschleife...

workaround war für mich das max interval hochsetzen...

dann noch einen unverschämten feature request, während der rolladen läuft, dauert ja unterumständen lange, könntes sich der state doch auch schon änderen oder?


mfg Jan, vielen vielen dank für das Modul
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: TSB am 26 September 2015, 19:53:37
Der Ansatz die i2c Relais direkt über den Gpio Port zu steuern klappt nicht:
2015.09.26 19:35:21 1: PERL WARNING: Can't exec "/usr/local/bin/gpio": Datei oder Verzeichnis nicht gefunden at ./FHEM/39_STELLMOTOR.pm line 119.
2015.09.26 19:35:21 1:

Die finden sich in meiner Raspberry Distro unter:
/sys/class/gpio/
Bzw. sind verlinkt auf:
gpio17 -> ../../devices/platform/soc/20200000.gpio/gpio/gpio17


Da der Ansatz mit Gpio nicht funktionierte, habe ich auf FehmDev umgestellt und anschließend die unnötigen Attribute löschen wollen:

2015.09.26 19:25:04 5: Cmd: >deleteattr VorlaufMischer STMgpioPortRL<
2015.09.26 19:25:04 1: PERL WARNING: Deep recursion on subroutine "main::CallFn" at fhem.pl line 1872.
2015.09.26 19:25:04 1: PERL WARNING: Deep recursion on subroutine "main::CommandDeleteAttr" at ./FHEM/39_STELLMOTOR.pm line 519.
2015.09.26 19:25:04 1: PERL WARNING: Deep recursion on subroutine "main::STELLMOTOR_Attr" at fhem.pl line 3058.
Out of memory!


Die Lösung über FhemDev klappt allerdings auch nicht. Wie muss das Device benannt und eingerichtet sein?
STMfhemDevRL RelaisRL
STMfhemDevSTART RelaisSTART

Ich hätte erwartet, dass ich einfach ein passendes Device anlege:
define RelaisRL RPI_GPIO 15
define RelaisSTART RPI_GPIO 17

Die Schalter selbst funktionieren, werden aber vom STELLMOTOR nicht angesteuert.

Internals:
   DEF        FhemDev
   NAME       VorlaufMischer
   NOTIFYDEV  global
   NR         47
   NTFY_ORDER 50-VorlaufMischer
   STATE      33
   TYPE       STELLMOTOR
   CHANGETIME:
   Helper:
     Dblog:
       Outtype:
         Logdb:
           TIME       1443289721.66766
           VALUE      FhemDev
       Laststart:
         Logdb:
           TIME       1443288921.67253
           VALUE      1443288921.66537
       Locked:
         Logdb:
           TIME       1443288976.46828
           VALUE      0
       Position:
         Logdb:
           TIME       1443288976.42042
           VALUE      33
       Queue_lastdiff:
         Logdb:
           TIME       1443288976.44562
           VALUE      -0.136840840180715
       State:
         Logdb:
           TIME       1443289721.72085
           VALUE      33
       Stoptime:
         Logdb:
           TIME       1443288976.49071
           VALUE      0
   Readings:
     2015-09-26 18:42:01   DoResetAtStop   1443285721.87339
     2015-09-26 19:48:41   OutType         FhemDev
     2015-09-26 18:42:01   command_queue   0
     2015-09-26 19:35:21   lastStart       1443288921.66537
     2015-09-26 19:36:16   locked          0
     2015-09-26 19:36:16   position        33
     2015-09-26 19:36:16   queue_lastdiff  -0.136840840180715
     2015-09-26 19:48:41   state           33
     2015-09-26 19:36:16   stopTime        0
Attributes:
   STMcalibrateDirection R
   STMdebugToLog3 1
   STMfhemDevRL RelaisRL
   STMfhemDevSTART RelaisSTART
   STMgpioPortRL 15
   STMgpioPortSTART 17
   STMinvertOut 0
   STMlastDiffMax 1
   STMmapOffCmd 0
   STMmapOnCmd 0
   STMmaxDriveSeconds 240
   STMmaxTics 100
   STMpollInterval 0.1
   STMresetOtherDeviceAtCalibrate 0
   STMrlType  einzel
   STMtimeTolerance 0.01
   room       Brenner



Internals:
   CFGFN
   DEF        15
   NAME       RelaisRL
   NR         79
   RPI_pin    15
   STATE      off
   TYPE       RPI_GPIO
   CHANGETIME:
   Helper:
     Dblog:
       State:
         Logdb:
           TIME       1443289504.96513
           VALUE      off
   Readings:
     2015-09-26 19:44:01   Pinlevel        low
     2015-09-26 19:45:04   state           off
   Fhem:
     interfaces switch
Attributes:
   direction  output
   room       Brenner
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: TSB am 27 September 2015, 16:24:35
Die Lösung meines Problems liegt darin, mittels eventMap on:1 off:0 die Schaltung auch bei 1 und 0 schalten zu lassen.

Unter dem Stellmotor Device VorlaufMischer sind die FhemDev Attribute wie folgt:
STMfhemDevRL MischerR
STMfhemDevSTART MischerL

Internals:
   CFGFN
   DEF        17
   NAME       MischerL
   NR         74
   RPI_pin    17
   STATE      0
   TYPE       RPI_GPIO
   CHANGETIME:
   Helper:
     Dblog:
       State:
         Logdb:
           TIME       1443363030.00132
           VALUE      0
   Readings:
     2015-09-27 16:18:10   Pinlevel        low
     2015-09-27 16:10:29   state           off
   Fhem:
     interfaces switch
Attributes:
   direction  output
   eventMap   on:1 off:0
   room       Brenner



Folgender Fehler ist mir noch aufgefallen, ich hatte als STMcalibrateDirection R angegeben. Das hat er bei der Kalibrierung auch brav gemacht. Allerdings wollte er beim setzen von Wert 88 nach rechts drehen - ich schätze das Programm ging davon aus, dass nach Kalibrierung nach rechts die Stellung ganz links ist (so als ob die Kalibrierung nach links erfolgt wäre).

Praktisch wäre in diesem Zusammenhang auch eine Auto Stellung, so dass ab einem Schwellwert nach Links oder Rechts kalibriert wird (also bei 70% Rechtsstellung kann er nach rechts kalibrieren und sonst nach links ...).

Warum fährt der Stellmotor nach der Kalibrierung nicht wieder auf die alte Position zurück?
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: Hauswart am 09 Oktober 2015, 13:48:35
Habt ihr vielleicht Tipps für die Bauteile (Relais)? :) Und wie ich diese am Raspberry Pi anschliessen muss?

Aus dem Schaltplan werde ich an sich schlau, nur der genaue Anschluss des Relais (Pin's usw) ist mir unklar.  8)


Edit: http://www.conrad.de/ce/de/Search.html?search=relais&filterKontaktart=1+Wechsler&filterNennspannung+Spule=5+V%2FDC würden alle diese Relais gehen? 5V Steuerspannung und 230V Schaltspannung (+ Wechsler)?
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: tets am 21 Oktober 2015, 23:49:05
an TSB: Heureka!!! Es funktioniert, Dein Tipp
"Die Lösung meines Problems liegt darin, mittels eventMap on:1 off:0 die Schaltung auch bei 1 und 0 schalten zu lassen."
war klasse, danke!!! war schon fast dabei alles hinzuschmeißen, da wäre ich allein nicht draufgekommen...

habe 1wire tempsensoren und 16 Relais an die IO-Ports angeschlossen
wen's interessiert hier mal mein programm, ist noch nicht perfekt - also die regelung an sich geht noch nicht, aber mischen geht nun ersteinmal.
bei gpio_1 ist die schlüsselstelle...

have fun!
----

attr global userattr cmdIcon devStateIcon devStateStyle icon room_map sortby structexclude webCmd widgetOverride
attr global autoload_undefined_devices 1
attr global backupcmd /usr/local/bin/myBackupScript.sh
attr global holiday2we Bayern
attr global logfile ./log/fhem-%Y-%m.log
attr global modpath .
attr global motd SecurityCheck:\
\
WEB,WEBphone,WEBtablet has no basicAuth attribute.\
telnetPort has no password/globalpassword attribute.\
\
Restart FHEM for a new check if the problem is fixed,\
or set the global attribute motd to none to supress this message.\

attr global sendStatistics onUpdate
attr global statefile ./log/fhem.save
attr global uniqueID ./FHEM/FhemUtils/uniqueID
attr global updateInBackground 1
attr global verbose 1
#attr global motd Error messages while initializing FHEM:\configfile: 0


define telnetPort telnet 7072 global

define WEB FHEMWEB 8083 global
attr WEB JavaScripts codemirror/fhem_codemirror.js
attr WEB codemirrorParam { "theme":"blackboard", "lineNumbers":true }

define WEBphone FHEMWEB 8084 global
attr WEBphone stylesheetPrefix smallscreen

define WEBtablet FHEMWEB 8085 global
attr WEBtablet stylesheetPrefix touchpad

# Fake FileLog entry, to access the fhem log from FHEMWEB
# define Logfile FileLog ./log/fhem-%Y-%m.log Arduino:.*|OWX_28_24C94A030000:.*|OWX_28_4D27BF030000:.*|fbh_mischer:.*|fussbodenhzg_kalt:.*|fussbodenhzg_pumpe:.*|fussbodenhzg_warm:.*|heizung_kalt:.*|heizung_pumpe:.*|heizung_warm:.*|hzg_mischer:.*|puffer1_oben:.*|ventil_1:.*|ww_oben:.*|ww_pumpe:.*|ww_pumpe:value:.*

define autocreate autocreate
attr autocreate filelog ./log/%NAME-%Y.log

define bavaria holiday

define eventTypes eventTypes ./log/eventTypes.txt

# Disable this to avoid looking for new USB devices on startup
define initialUsbCheck notify global:INITIALIZED usb create
attr initialUsbCheck forwardReturnValue 1
# definiere FRM als IO-Device -
#   Baudrate 57600 ist default in der Standardfirmata
define arduino FRM /dev/ttyUSB0@57600
attr arduino room relais
attr arduino sampling-interval 20000
attr arduino verbose 1
define owx3 OWX 3
attr owx3 IODev arduino
attr owx3 interval 60

#-- Heizungs steuerung test----------------------------

# define n_FBH_Vorlauf1 at +*00:01:00 trigger n_FBH_Vorlauf

#define TempAussen at +*00:00:30 get temp_aussen temp

#schon definiert!? wahrscheinlich kann man die Variable direkt unten einbaun
#define FBH_tempVorlauf_Soll at +*00:00:30 get FBH_temp skaliert

#define FBH_Vorlauf dummy


#---------------- geht irgendwie nimmer seit die GPIOs über Dummy definiert werden, kommentiers mal aus
#define warmwassepumpe_zu_wohnzimmerofen_zuschalten THRESHOLD puffer1_oben gpio_7_ww_pumpe
#attr warmwassepumpe_zu_wohnzimmerofen_zuschalten number_format %.1f
#attr warmwassepumpe_zu_wohnzimmerofen_zuschalten state_cmd1_gt off
#attr warmwassepumpe_zu_wohnzimmerofen_zuschalten state_cmd2_lt on
#attr warmwassepumpe_zu_wohnzimmerofen_zuschalten state_format _m _dv _sc


#----------------
#des funktionierte früher an der Eingabezeile: {\system("gpio write 0 1 ")}
#jetzt funktioniert das:
#define 0_test RPI_GPIO 17
#attr 0_test direction output

#----------------
# GPIO's


define gpio_0_fbh_pumpe RPI_GPIO 17
attr gpio_0_fbh_pumpe direction output
attr gpio_0_fbh_pumpe room relais

#die beiden Lampen um 7:00 für 10 Minuten einzuschalten:
#define onAt at 07:00 set Lamp1,Lamp2 on-for-timer 600
#define onAt at 06:00 set gpio_0_fbh_pumpe on-for-timer 3600 #gehtirgendwie nicht

define a1_fbh at *05:59:00 set gpio_0_fbh_pumpe on
attr a1_fbh room relais
define a2_fbh at *07:00:00 set gpio_0_fbh_pumpe off
attr a2_fbh room relais
define a3_fbh at *10:59:00 set gpio_0_fbh_pumpe on
attr a3_fbh room relais
define a4_fbh at *20:00:00 set gpio_0_fbh_pumpe off
attr a4_fbh room relais

#Sommerbetrieb, im winter einfach mit raute auskommentieren
#define a_sommer_fbh at +*00:01:00 set gpio_0_fbh_pumpe off
#attr a_sommer_fbh room relais
define a_sommer_hzg at +*00:01:00 set gpio_4_hzg_pumpe off
attr a_sommer_hzg room relais

#WW zu kalt, Heizung abschalten
define a5_fbh at +*01:00 IF ([OWX_28_FA5EBF030000:temperature] <43) (set gpio_0_fbh_pumpe off)
attr a5_fbh room relais
define a6_hzg at +*01:00 IF ([OWX_28_FA5EBF030000:temperature] <43) (set gpio_4_hzg_pumpe off)
attr a6_hzg room relais

#WW zuschalten wenn Küchenofen waermer als WW geheizt wird
define a_ww at +*00:05:00 IF ([OWX_28_4D27BF030000:temperature] > [OWX_28_FA5EBF030000:temperature]+3) (set gpio_7_ww_pumpe on-for-timer 120)
attr a_ww room relais


#Sicherheit1 wenn Küchenofen zu heiss wird
define a_safety_kuechenofen1 at +*00:00:10 IF ([OWX_28_4D27BF030000:temperature] >73) (set gpio_4_hzg_pumpe on-for-timer 600)
attr a_safety_kuechenofen1 room relais
#Sicherheit2 wenn Küchenofen zu heiss wird
define a_safety_kuechenofen2 at +*00:00:10 IF ([OWX_28_4D27BF030000:temperature] >75) (set gpio_7_ww_pumpe on-for-timer 600)
attr a_safety_kuechenofen2 room relais


define gpio_1_fbh_mischer RPI_GPIO 18
attr gpio_1_fbh_mischer direction output
attr gpio_1_fbh_mischer eventMap on:1 off:0
attr gpio_1_fbh_mischer room relais


define gpio_2_fbh_mischer_warm RPI_GPIO 27
attr gpio_2_fbh_mischer_warm direction output
attr gpio_2_fbh_mischer_warm eventMap on:1 off:0
attr gpio_2_fbh_mischer_warm room relais



define gpio_3_ventil1 RPI_GPIO 22
attr gpio_3_ventil1 direction output
attr gpio_3_ventil1 room relais


define gpio_4_hzg_pumpe RPI_GPIO 23
attr gpio_4_hzg_pumpe direction output
attr gpio_4_hzg_pumpe room relais


define gpio_5_hzg_mischer RPI_GPIO 24
attr gpio_5_hzg_mischer direction output
attr gpio_5_hzg_mischer room relais


define gpio_6_hzg_mischer_kalt RPI_GPIO 25
attr gpio_6_hzg_mischer_kalt direction output
attr gpio_6_hzg_mischer_kalt room relais


define gpio_7_ww_pumpe RPI_GPIO 4
attr gpio_7_ww_pumpe direction output
attr gpio_7_ww_pumpe room relais

define gpio_8_Oel_u_Kaminkehrer RPI_GPIO 2
attr gpio_8_Oel_u_Kaminkehrer direction output
attr gpio_8_Oel_u_Kaminkehrer room relais

define gpio_9_ventil2 RPI_GPIO 3
attr gpio_9_ventil2 direction output
attr gpio_9_ventil2 room relais

define gpio_A_WW_Zirkulationspumpe RPI_GPIO 8
attr gpio_A_WW_Zirkulationspumpe direction output
attr gpio_A_WW_Zirkulationspumpe room relais

define gpio_B_WW_Ventil RPI_GPIO 7
attr gpio_B_WW_Ventil direction output
attr gpio_B_WW_Ventil room relais

#define gpio_12 RPI_GPIO 13
#attr gpio_12 direction output
#attr gpio_12 room relais

#define gpio_13 RPI_GPIO 19
#attr gpio_13 direction output
#attr gpio_13 room relais

#define gpio_14 RPI_GPIO 26
#attr gpio_14 direction output
#attr gpio_14 room relais

#define gpio_15 RPI_GPIO 14
#attr gpio_15 direction output
#attr gpio_15 room relais

#----------------
# OneWire Sensoren

define OWX_28_24C94A030000 OWTHERM DS18B20 24C94A030000
attr OWX_28_24C94A030000 IODev owx3
attr OWX_28_24C94A030000 alias keller_raumtemp_hzg
attr OWX_28_24C94A030000 model DS1822
attr OWX_28_24C94A030000 room Temperaturen
attr OWX_28_24C94A030000 tempHigh 75
attr OWX_28_24C94A030000 tempLow 70

define OWX_28_4D27BF030000 OWTHERM DS18B20 4D27BF030000
attr OWX_28_4D27BF030000 IODev owx3
attr OWX_28_4D27BF030000 alias kuechenofen
attr OWX_28_4D27BF030000 model DS1822
attr OWX_28_4D27BF030000 room Temperaturen
attr OWX_28_4D27BF030000 tempHigh 75
attr OWX_28_4D27BF030000 tempLow 70

define OWX_28_9974BF030000 OWTHERM DS18B20 9974BF030000
attr OWX_28_9974BF030000 IODev owx3
attr OWX_28_9974BF030000 alias FBH_Vorlauf
attr OWX_28_9974BF030000 model DS1822
attr OWX_28_9974BF030000 room Temperaturen
attr OWX_28_9974BF030000 tempHigh 75
attr OWX_28_9974BF030000 tempLow 70

define OWX_28_FA5EBF030000 OWTHERM DS18B20 FA5EBF030000
attr OWX_28_FA5EBF030000 IODev owx3
attr OWX_28_FA5EBF030000 alias WW_oben
attr OWX_28_FA5EBF030000 model DS1822
attr OWX_28_FA5EBF030000 room Temperaturen
attr OWX_28_FA5EBF030000 tempHigh 75
attr OWX_28_FA5EBF030000 tempLow 70

define OWX_28_7572BF030000 OWTHERM DS18B20 7572BF030000
attr OWX_28_7572BF030000 IODev owx3
attr OWX_28_7572BF030000 alias HZG_Puffer1_oben
attr OWX_28_7572BF030000 model DS1822
attr OWX_28_7572BF030000 room Temperaturen
attr OWX_28_7572BF030000 tempHigh 75
attr OWX_28_7572BF030000 tempLow 70

define OWX_28_54EF96060000 OWTHERM DS18B20 54EF96060000
attr OWX_28_54EF96060000 IODev owx3
attr OWX_28_54EF96060000 alias HZG_WHZ_Ofen_Vorlauf
attr OWX_28_54EF96060000 model DS1822
attr OWX_28_54EF96060000 room Temperaturen
attr OWX_28_54EF96060000 tempHigh 75
attr OWX_28_54EF96060000 tempLow 70
#-----------Logs und graphen
#
#------Temp_HZG_Kuechenofen
define Temp_HZG_Kuechenofen dummy
attr Temp_HZG_Kuechenofen event-on-change-reading state
attr Temp_HZG_Kuechenofen room xTemperaturen
#Dieser soll alle 5 Sekunden mit der aktuellen Temperstur aktualisiert werden:
define Temp_HZG_KuechenofenDummy at +*00:00:20 { my $d= ReadingsVal("OWX_28_4D27BF030000","temperature",0);; fhem("set Temp_HZG_Kuechenofen $d");;}
#
#------Temp_HZG_raumtemp
define Temp_HZG_raumtemp dummy
attr Temp_HZG_raumtemp event-on-change-reading state
attr Temp_HZG_raumtemp room xTemperaturen
#Dieser soll alle 5 Sekunden mit der aktuellen Temperstur aktualisiert werden:
define Temp_HZG_raumtempDummy at +*00:00:20 { my $d= ReadingsVal("OWX_28_24C94A030000","temperature",0);; fhem("set Temp_HZG_raumtemp $d");;}
#
#------Temp_HZG_WW_oben
define Temp_HZG_WW_oben dummy
attr Temp_HZG_WW_oben event-on-change-reading state
attr Temp_HZG_WW_oben room xTemperaturen
#Dieser soll alle 5 Sekunden mit der aktuellen Temperstur aktualisiert werden:
define Temp_HZG_WW_obenDummy at +*00:00:20 { my $d= ReadingsVal("OWX_28_FA5EBF030000","temperature",0);; fhem("set Temp_HZG_WW_oben $d");;}
#
#------Temp_HZG_FBH
define Temp_HZG_FBH dummy
attr Temp_HZG_FBH event-on-change-reading state
attr Temp_HZG_FBH room xTemperaturen
#Dieser soll alle 5 Sekunden mit der aktuellen Temperstur aktualisiert werden:
define Temp_HZG_FBHDummy at +*00:00:20 { my $d= ReadingsVal("OWX_28_9974BF030000","temperature",0);; fhem("set Temp_HZG_FBH $d");;}
#
#------Temp_HZG_Puffer1_oben
define Temp_HZG_Puffer1_oben dummy
attr Temp_HZG_Puffer1_oben event-on-change-reading state
attr Temp_HZG_Puffer1_oben room xTemperaturen
#Dieser soll alle 5 Sekunden mit der aktuellen Temperstur aktualisiert werden:
define Temp_HZG_Puffer1_obenDummy at +*00:00:20 { my $d= ReadingsVal("OWX_28_7572BF030000","temperature",0);; fhem("set Temp_HZG_Puffer1_oben $d");;}
#
#------Temp_HZG_WHZ_Ofen_Vorlauf
define Temp_HZG_WHZ_Ofen_Vorlauf dummy
attr Temp_HZG_WHZ_Ofen_Vorlauf event-on-change-reading state
attr Temp_HZG_WHZ_Ofen_Vorlauf room xTemperaturen
#Dieser soll alle 5 Sekunden mit der aktuellen Temperstur aktualisiert werden:
define Temp_HZG_WHZ_Ofen_VorlaufDummy at +*00:00:20 { my $d= ReadingsVal("OWX_28_54EF96060000","temperature",0);; fhem("set Temp_HZG_WHZ_Ofen_Vorlauf $d");;}
#
#
#-------------------
#------Temperaturlog---geloggt wird nur wenn sich ein Messwert aendert!!!
define FileLog_Temperatur FileLog ./log/Temperatur-%Y-%m.log Temp_HZG_Kuechenofen|Temp_HZG_raumtemp|Temp_HZG_WW_oben|Temp_HZG_FBH|Temp_HZG_Puffer1_oben|Temp_HZG_WHZ_Ofen_Vorlauf
attr FileLog_Temperatur logtype text
define SVG_FileLog_Temperatur_1 SVG FileLog_Temperatur:SVG_FileLog_Temperatur_1:CURRENT
attr SVG_FileLog_Temperatur_1 plotsize 800,600
attr SVG_FileLog_Temperatur_1 room Temperaturen
#
#-------------------
#------Relaislog---geloggt wird nur wenn sich ein Messwert aendert!!!
define FileLog_Relais FileLog ./log/Relais-%Y-%m.log gpio_0_fbh_pumpe|gpio_1_fbh_mischer|gpio_2_fbh_mischer_warm|gpio_3_ventil1|gpio_4_hzg_pumpe|gpio_5_hzg_mischer|gpio_6_hzg_mischer_kalt|gpio_7_ww_pumpe
attr FileLog_Relais logtype text
define SVG_FileLog_Relais_1 SVG FileLog_Relais:SVG_FileLog_Relais_1:CURRENT
attr SVG_FileLog_Relais_1 plotsize 800,600
attr SVG_FileLog_Relais_1 room Relais
#
#
define fbh_steller STELLMOTOR FhemDev
attr fbh_steller STMcalibrateDirection R
attr fbh_steller STMdebugToLog3 0
attr fbh_steller STMfhemDevRL gpio_2_fbh_mischer_warm
attr fbh_steller STMfhemDevSTART gpio_1_fbh_mischer
attr fbh_steller STMinvertOut 0
attr fbh_steller STMlastDiffMax 1
attr fbh_steller STMmapOffCmd 0
attr fbh_steller STMmapOnCmd 0
attr fbh_steller STMmaxDriveSeconds 226
attr fbh_steller STMmaxTics 100
attr fbh_steller STMpollInterval 0.3
attr fbh_steller STMresetOtherDeviceAtCalibrate 0
attr fbh_steller STMrlType wechsel
attr fbh_steller STMtimeTolerance 0.01
#attr fbh_steller STMgpioPortRL 27
#attr fbh_steller STMgpioPortSTART 18
#
#
define fbh_regler PID20 OWX_28_9974BF030000:temperature fbh_steller:STMmaxTics
define PID.FUBO.File FileLog ./log/PID.FUBO-%Y.log PID\.FUBO
attr PID.FUBO.File logtype text
define Stellmotor2start dummy
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: TSB am 12 Dezember 2017, 11:17:03
Hatte jetzt schon einige (wenige) Male das Problem, dass Stellmotor Amok läuft. Im Event-Monitor wirft das Modul ca. 50 Meldungen pro Sekunde aus und legt damit dann die Heizungssteuerung lahm.

Ein Neustart über die Konsole und auch ein Neustart durch Netzstecker ziehen löst das Problem nicht.
Erst ein Reset unter Stellmotor behebt den Fehler und das Modul läuft wieder Wochen/Monate ohne Beanstandung.

Hat wer ein solches Verhalten gehabt und kennt die Ursache?

defmod VorlaufMischer STELLMOTOR FhemDev
attr VorlaufMischer DbLogExclude DoResetAtStop,OutType,command_queue,lastStart,locked,queue_lastdiff,state,stopTime
attr VorlaufMischer STMcalibrateDirection L
attr VorlaufMischer STMdebugToLog3 0
attr VorlaufMischer STMfhemDevRL MischerR
attr VorlaufMischer STMfhemDevSTART MischerL
attr VorlaufMischer STMgpioPortRL 15
attr VorlaufMischer STMgpioPortSTART 17
attr VorlaufMischer STMinvertOut 0
attr VorlaufMischer STMlastDiffMax 1
attr VorlaufMischer STMmapOffCmd 0
attr VorlaufMischer STMmapOnCmd 0
attr VorlaufMischer STMmaxDriveSeconds 240
attr VorlaufMischer STMmaxTics 100
attr VorlaufMischer STMpollInterval 0.1
attr VorlaufMischer STMresetOtherDeviceAtCalibrate 0
attr VorlaufMischer STMrlType einzel
attr VorlaufMischer STMtimeTolerance 0.01
attr VorlaufMischer event-on-change-reading .*
attr VorlaufMischer room Brenner

setstate VorlaufMischer 0
setstate VorlaufMischer 2017-12-10 19:50:54 DoResetAtStop 1512931854.13447
setstate VorlaufMischer 2017-12-12 11:08:19 OutType FhemDev
setstate VorlaufMischer 2017-12-10 19:50:54 command_queue 0
setstate VorlaufMischer 2017-12-12 01:58:48 lastStart 1513040328.18491
setstate VorlaufMischer 2017-12-12 01:58:54 locked 0
setstate VorlaufMischer 2017-12-12 11:10:31 position 31
setstate VorlaufMischer 2017-12-12 11:10:31 queue_lastdiff -1.005386531353
setstate VorlaufMischer 2017-12-12 11:08:19 state 0
setstate VorlaufMischer 2017-12-12 01:58:54 stopTime 0


Event-Monitorausgabe (endlos die selben Angaben):

2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: -1.005386531353
2017-12-12 10:57:17 STELLMOTOR VorlaufMischer queue_lastdiff: 0
2017-12-12 10:57

Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: Morgennebel am 12 Dezember 2017, 11:22:19
Hi,


ich habe ähnliche Probleme (gehabt). Ein Wechsel auf eine bessere WiFi-Verbindung und schnelleren Server reduzierte die Probleme.

Nach meiner Einschätzung ist FHEM irgendwo anders beschäftigt (Blocking Internetabfragen o.ä.) und kann die zeitkritische Steuerung des STELLMOTORS nicht umsetzen. Wenn es dann z.B. einen DNS-Fehler oder timeout gibt, läuft der Motor lustig 30+ Sekunden in eine Richtung.

Zur Zeit habe ich zwei DOIFs definiert, die in solchem Fall den STELLMOTOR resetten und calibrieren (eines für mehr als 100% und eines für weniger als 0%) und mich mit einer pushmessage informiert. Das funktioniert ganz gut.

Langfristig sollte helfen, das STELLMOTOR-Glied auf einen eigenen Pi oder eigene FHEM-Instanz auszulagern - d.h. Internet-Abfragen und andere blocking-Implementationen von STELLMOTOR zu trennen.

Ciao, -MN
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: TSB am 15 Dezember 2017, 20:06:44
Bei mir hängt der Pi am LAN Kabel. Passiert leider mittlerweile häufiger. Letztes Jahr kein einziges Problem, dieses Jahr vermutlich schon 6-8x passiert. Danke für den Tipp das mit einer Prüfroutine zu resetten, werde das mal in meine Heizungssteuerungsroutine implementieren.
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: Morgennebel am 16 Dezember 2017, 11:11:24
Zitat von: TSB am 15 Dezember 2017, 20:06:44
Bei mir hängt der Pi am LAN Kabel. Passiert leider mittlerweile häufiger. Letztes Jahr kein einziges Problem, dieses Jahr vermutlich schon 6-8x passiert. Danke für den Tipp das mit einer Prüfroutine zu resetten, werde das mal in meine Heizungssteuerungsroutine implementieren.

Versuch zusätzlich mal

attr global dnsServer <IP>

Bei mir zeigt es auf meinen lokalen pihole. Danach waren meine Probleme eigentlich minimal.

Ciao, -MN
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: TSB am 17 Dezember 2017, 12:36:23
Auch der Reset reichte nicht, musste noch ein shutdown restart ausführen, da Fhem selbst nicht mehr funktionierte, bzw. vermutlich keine Events mehr auslöste.

Ich weiß auch noch nicht welchen Wert ich vom Modul überwachen muss um den Reset und Neustart auszulösen. Welche DOIF Anweisung hast Du verankert?

Ist ein schwerwiegender Fehler im Modul oder Fhem selbst, dass das System dann nicht korrekt funktioniert und in meinem Fall dann die Heizung und Vorlauftemperatureinstellung nicht mehr läuft und es kalt wird ;)
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: Morgennebel am 17 Dezember 2017, 12:58:06
Hi,

schau mal hier:

DOIF-1 für STELLMOTOR größer als 100:


Internals:
   CFGFN     
   DEF        ([EG.HWR.Fussbodenmischer:position] > 100)
(set DI_MischerCommands disable)         ## CMD 1.1
(set EG.HWR.Fussbodenmischer calibrate)  ## CMD 1.2
(set EG.HWR.Fussbodenmischer reset)      ## CMD 1.3
(set EG.HWR.Fussbodenmischer 35)         ## CMD 1.4
(set PBNotification message 'Intelligentes Wohnen' | 'ALARM: Problem mit FB-Mischer - Position groesser 100') ## CMD1.5
(set DI_MischerCommands initialize)      ## CMD 1.6
DOELSE
    ## CMD2
   NAME       DI_FBMischerGTHundred
   NR         464
   NTFY_ORDER 50-DI_FBMischerGTHundred
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2017-12-17 12:50:00   Device          EG.HWR.Fussbodenmischer
     2017-11-18 09:20:00   cmd             2
     2017-11-18 09:20:00   cmd_event       EG.HWR.Fussbodenmischer
     2017-11-18 09:20:00   cmd_nr          2
     2017-12-17 12:50:00   e_EG.HWR.Fussbodenmischer_position 38
     2017-11-18 09:20:00   state           cmd_2
     2017-12-10 15:43:08   wait_timer      no timer
   Regex:
   condition:
     0          ReadingValDoIf($hash,'EG.HWR.Fussbodenmischer','position') > 100
   devices:
     0           EG.HWR.Fussbodenmischer
     all         EG.HWR.Fussbodenmischer
   do:
     0:
       0          set DI_MischerCommands disable
       1          set EG.HWR.Fussbodenmischer calibrate
       2          set EG.HWR.Fussbodenmischer reset
       3          set EG.HWR.Fussbodenmischer 35
       4          set PBNotification message 'Intelligentes Wohnen' | 'ALARM: Problem mit FB-Mischer - Position groesser 100'
       5          set DI_MischerCommands initialize
     1:
       0         
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      position: 38   << addLog
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   EG.HWR.Fussbodenmischer
     timerevent position: 38   << addLog
     triggerDev EG.HWR.Fussbodenmischer
     timerevents:
       position: 38   << addLog
     timereventsState:
       position: 38   << addLog
     triggerEvents:
       position: 38   << addLog
     triggerEventsState:
       position: 38   << addLog
   internals:
   itimer:
   readings:
     0           EG.HWR.Fussbodenmischer:position
     all         EG.HWR.Fussbodenmischer:position
   trigger:
   uiState:
   uiTable:
Attributes:
   room       EG.HWR,SYS_Events
   wait       0,180,10,10,10,10:0


DOIF-2 für Werte unter 0:


Internals:
   CFGFN     
   DEF        ([EG.HWR.Fussbodenmischer:position] < 0)
(set DI_MischerCommands disable)         ## CMD 1.1
(set EG.HWR.Fussbodenmischer calibrate)  ## CMD 1.2
(set EG.HWR.Fussbodenmischer reset)      ## CMD 1.3
(set EG.HWR.Fussbodenmischer 35)         ## CMD 1.4
(set PBNotification message 'Intelligentes Wohnen' | 'ALARM: Problem mit FB-Mischer - negative Position') ## CMD 1.5
(set DI_MischerCommands initialize)      ## CMD 1.6
DOELSE
    ## CMD 2
   NAME       DI_FBMischerLTZero
   NR         465
   NTFY_ORDER 50-DI_FBMischerLTZero
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2017-12-17 12:55:00   Device          EG.HWR.Fussbodenmischer
     2017-11-18 09:20:00   cmd             2
     2017-11-18 09:20:00   cmd_event       EG.HWR.Fussbodenmischer
     2017-11-18 09:20:00   cmd_nr          2
     2017-12-17 12:55:00   e_EG.HWR.Fussbodenmischer_position 38
     2017-11-18 09:20:00   state           cmd_2
     2017-12-10 15:43:08   wait_timer      no timer
   Regex:
   condition:
     0          ReadingValDoIf($hash,'EG.HWR.Fussbodenmischer','position') < 0
   devices:
     0           EG.HWR.Fussbodenmischer
     all         EG.HWR.Fussbodenmischer
   do:
     0:
       0          set DI_MischerCommands disable
       1          set EG.HWR.Fussbodenmischer calibrate
       2          set EG.HWR.Fussbodenmischer reset
       3          set EG.HWR.Fussbodenmischer 35
       4          set PBNotification message 'Intelligentes Wohnen' | 'ALARM: Problem mit FB-Mischer - negative Position'
       5          set DI_MischerCommands initialize
     1:
       0         
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      position: 38   << addLog
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   EG.HWR.Fussbodenmischer
     timerevent position: 38   << addLog
     triggerDev EG.HWR.Fussbodenmischer
     timerevents:
       position: 38   << addLog
     timereventsState:
       position: 38   << addLog
     triggerEvents:
       position: 38   << addLog
     triggerEventsState:
       position: 38   << addLog
   internals:
   itimer:
   readings:
     0           EG.HWR.Fussbodenmischer:position
     all         EG.HWR.Fussbodenmischer:position
   trigger:
   uiState:
   uiTable:
Attributes:
   room       EG.HWR,SYS_Events
   wait       0,180,10,10,10,10:0


Dabei ist DI_MischerCommands meine STELLMOTOR-Steuerung und PBNotification eine Pushbullet-Alarmierung.

Die wait-Werte sind wichtig und mußt Du für Deinen Mischer anpassen.

Ciao, -MN
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: epsrw1 am 27 Dezember 2017, 08:20:43
Hallo zusammen,

Der einfachste Weg ist ein AT .... ich lasse STELLMOTOR einmal täglich mit calibrate auf null laufen.
So werden timing-Differenzen durch langsame Reaktion von FHEM jeweils ausgemerzt.

Negative Werte oder zu große Werte würde ich eher auf der input-Seite suchen, das Modul setzt sich normalerweise nicht selbst auf unmögliche Positionen......

LG Florian
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: Morgennebel am 27 Dezember 2017, 11:24:16
Zitat von: epsrw1 am 27 Dezember 2017, 08:20:43
Der einfachste Weg ist ein AT .... ich lasse STELLMOTOR einmal täglich mit calibrate auf null laufen.
So werden timing-Differenzen durch langsame Reaktion von FHEM jeweils ausgemerzt.
Negative Werte oder zu große Werte würde ich eher auf der input-Seite suchen, das Modul setzt sich normalerweise nicht selbst auf unmögliche Positionen......

Nach meinen Erfahrungen ist das Problem nicht auf der INPUT-Seite. Hier ist mein DOIF zur Mischersteuerung:


   DEF        ([EG.Heizung.Mischer.Vorlauf:temperature.avg] < 22 and [RP_EG.HWR.FBPumpe_Sw] eq "on")
   (set EG.HWR.Fussbodenmischer {([EG.HWR.Fussbodenmischer:position]+1)})      ## Cmd 1: Schnell oeffnen
DOELSEIF ([EG.Heizung.Mischer.Vorlauf:temperature.avg] < 26 and [RP_EG.HWR.FBPumpe_Sw] eq "on")
   (set EG.HWR.Fussbodenmischer {([EG.HWR.Fussbodenmischer:position]+1)})      ## Cmd 2: Ganz langsam oeffnen
DOELSEIF ([EG.Heizung.Mischer.Vorlauf:temperature.avg] < 30 and [RP_EG.HWR.FBPumpe_Sw] eq "on")
   (set EG.HWR.Fussbodenmischer {([EG.HWR.Fussbodenmischer:position]+1)})      ## Cmd 3: Noch ein bisschen
DOELSEIF ([EG.Heizung.Mischer.Vorlauf:temperature.avg] < 32 and [RP_EG.HWR.FBPumpe_Sw] eq "on")
   (set EG.HWR.Fussbodenmischer {([EG.HWR.Fussbodenmischer:position]+1)})      ## Cmd 4: Noch ein bisschen
DOELSEIF ([EG.Heizung.Mischer.Vorlauf:temperature.avg] > 39)
   (set EG.HWR.Fussbodenmischer {([EG.HWR.Fussbodenmischer:position]-1)})      ## Cmd 5: Viel zu heiss, schnell zu
DOELSEIF ([EG.Heizung.Mischer.Vorlauf:temperature.avg] > 38)
   (set EG.HWR.Fussbodenmischer {([EG.HWR.Fussbodenmischer:position]-1)})      ## Cmd 6: Viel zu heiss, schnell zu
DOELSEIF ([EG.Heizung.Mischer.Vorlauf:temperature.avg] > 37)
   (set EG.HWR.Fussbodenmischer {([EG.HWR.Fussbodenmischer:position]-1)})      ## Cmd 7: Zu heiss, schnell zu
DOELSEIF ([03:50])
   (set EG.HWR.Fussbodenmischer calibrate, set EG.HWR.Fussbodenmischer reset)  ## Cmd 8: Calibrieren fuer Tagprogramm
DOELSEIF ([04:00])
   (set EG.HWR.Fussbodenmischer 40)                                            ## Cmd 9: Headstart, Ende der Nachtabsenkung
   NAME       DI_MischerCommands
   NR         204
   NTFY_ORDER 50-DI_MischerCommands
   STATE      cmd_7
   TYPE       DOIF
   READINGS:
     2017-12-27 11:22:39   Device          EG.Heizung.Mischer.Vorlauf
     2017-12-27 10:31:23   cmd             7
     2017-12-27 10:31:23   cmd_event       EG.Heizung.Mischer.Vorlauf
     2017-12-27 10:31:23   cmd_nr          7
     2017-12-27 11:22:39   e_EG.Heizung.Mischer.Vorlauf_temperature.avg 35.279
     2017-12-27 11:20:00   e_RP_EG.HWR.FBPumpe_Sw_STATE on
     2017-12-27 10:31:23   state           cmd_7
     2017-12-27 03:50:00   timer_01_c08    28.12.2017 03:50:00
     2017-12-27 04:00:00   timer_02_c09    28.12.2017 04:00:00
     2017-12-27 10:31:23   wait_timer      no timer
   Regex:
[...]
Attributes:
   cmdpause   60:120:360:480:60:180:300:0:0
   do         always
   room       EG.HWR,SYS_Events
   verbose    5
   wait       180:240:360:600:90:180:420:0:0


Der Mischer wird jeden Tag calibriert und geresettet. Jeder Steuerbefehl ändert die Position um +-1 maximal. Trotzdem habe ich manchmal Stellungen mit -1270 und +255. Das würde bedeuten, daß ein DOIF-Kommando über 1300mal ausgeführt wurde - trotz mehrminütiger Verzögerung.

Ich tippe weiterhin auf STELLMOTOR, das durch einen Blocking-Aufruf eines anderen Moduls nicht rechtzeitig stoppt und weiterfährt.

Ciao, -MN
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: tpoetschan am 01 Januar 2018, 17:50:20
Hallo zusammen :-)

Ich habe ähnliche effekte ... wenn auch nicht so krass wie manch anderer.

Mein Conf:


Raspi2
Eltako FSR14SSR (per FAM14 + FGW14-USB angebunden)

Der Raspi ist mit PWM usw schon ziemlich "belastet".
Apptime sagt mir:

name                                     function                               max    count      total  average   maxDly   avgDly TS Max call     param Max call
tmr-PWM_Calculate                        HASH(0x2e845c8)                       3852       36  115431.00  3206.42  2733.85  1221.36 01.01. 17:24:36 HASH(PWM.FussbodenHeizung)
tmr-OWDevice_UpdateValues                HASH(0x27fab60)                       2355       36   46524.24  1292.34  2880.54   170.45 01.01. 17:29:57 HASH(FBH.VorlaufTemp)
tmr-OWDevice_UpdateValues                HASH(0x317dd28)                       2244       36   48210.44  1339.18  1847.73   189.47 01.01. 17:37:50 HASH(LWP.Vorlauf)
tmr-STELLMOTOR_GetUpdate                 HASH(0x2e845f8)                       2207    15105   19344.58     1.28  5639.38   227.91 01.01. 17:20:37 HASH(FBH.Mischer)

Der Mischer "verfährt" sich oft.
Er zeigt Position 1 an, steht jedoch auf 50 (wenn man davorsteht).
Ich muss eigentlich mehrmals täglich kalibrieren.

Hat jemand eine Idee?
Ich habe nach Wiki erst mal den Pollinterval auf 0.5 hoch. (War bis dato 0.1 - apptime sah so aus:

name                                     function                               max    count      total  average   maxDly   avgDly TS Max call     param Max call
tmr-PWM_Calculate                        HASH(0x2e845c8)                       3782        3   10212.97  3404.32  2211.28  1276.92 01.01. 17:02:11 HASH(PWM.FussbodenHeizung)
tmr-STELLMOTOR_GetUpdate                 HASH(0x2e845f8)                       2283     3528    5207.67     1.48  7641.73    86.07 01.01. 17:02:13 HASH(FBH.Mischer))



Viele Grüße und vielen Dank!
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: Morgennebel am 01 Januar 2018, 22:01:37
Nun, wir haben zwei Thesen zum Ursprung des Problemes - die INPUT-Seite und das STELLMOTOR-Modul selbst.

Beides läßt sich testen und eingrenzen.

Dein Pi ist ausgelastet, was meine These (STELLMOTOR und FHEM beschäftigt/geblockt) stützt.

Ich würde daher vorschlagen, eine zweite FHEM-Instanz in Deinem Fall probeweise zu installieren. Die lauscht auf einem anderen Port (z.B. 9083) und kümmert sich nur um das STELLMOTOR-Modul. Alternativ einen zweiten Pi nur für das STELLMOTOR-Modul. Anbindung über FHEM2FHEM.

Sind danach die Probleme weg, hast Du eine Lösung und wir wissen mehr...

Ciao, -MN
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: Morgennebel am 01 Januar 2018, 23:16:00
Gerade eben wieder einen Fehler bei mir bemerkt:


2018-01-01_21:40:00 EG.HWR.Fussbodenmischer position: 43   << addLog
2018-01-01_21:45:00 EG.HWR.Fussbodenmischer position: 43   << addLog
2018-01-01_21:45:14 DI_MischerCommands wait_timer: no timer
2018-01-01_21:45:14 EG.HWR.Fussbodenmischer position: 44
2018-01-01_21:45:14 DI_MischerCommands cmd_nr: 3
2018-01-01_21:45:14 DI_MischerCommands cmd: 3
2018-01-01_21:45:14 DI_MischerCommands cmd_event: EG.Heizung.Mischer.Vorlauf
2018-01-01_21:45:14 DI_MischerCommands cmd_3
2018-01-01_21:45:32 DI_MischerCommands wait_timer: 01.01.2018 21:51:32 cmd_3 EG.Heizung.Mischer.Vorlauf
2018-01-01_21:50:00 EG.HWR.Fussbodenmischer position: 44   << addLog
2018-01-01_21:51:32 DI_MischerCommands wait_timer: no timer
2018-01-01_21:51:32 EG.HWR.Fussbodenmischer position: 45
2018-01-01_21:51:32 DI_MischerCommands cmd_nr: 3
2018-01-01_21:51:32 DI_MischerCommands cmd: 3
2018-01-01_21:51:32 DI_MischerCommands cmd_event: EG.Heizung.Mischer.Vorlauf
2018-01-01_21:51:32 DI_MischerCommands cmd_3
2018-01-01_21:51:51 DI_MischerCommands wait_timer: 01.01.2018 21:57:51 cmd_3 EG.Heizung.Mischer.Vorlauf
2018-01-01_21:55:01 EG.HWR.Fussbodenmischer position: 45   << addLog
2018-01-01_21:57:51 DI_MischerCommands wait_timer: no timer
2018-01-01_21:57:51 EG.HWR.Fussbodenmischer position: 46
2018-01-01_21:57:51 DI_MischerCommands cmd_nr: 3
2018-01-01_21:57:51 DI_MischerCommands cmd: 3
2018-01-01_21:57:51 DI_MischerCommands cmd_event: EG.Heizung.Mischer.Vorlauf
2018-01-01_21:57:51 DI_MischerCommands cmd_3
2018-01-01_21:58:10 DI_MischerCommands wait_timer: 01.01.2018 22:04:10 cmd_3 EG.Heizung.Mischer.Vorlauf
2018-01-01_22:00:00 EG.HWR.Fussbodenmischer position: 46   << addLog
2018-01-01_22:04:10 DI_MischerCommands wait_timer: no timer
2018-01-01_22:04:10 EG.HWR.Fussbodenmischer position: 47
2018-01-01_22:04:10 DI_MischerCommands cmd_nr: 3
2018-01-01_22:04:10 DI_MischerCommands cmd: 3
2018-01-01_22:04:10 DI_MischerCommands cmd_event: EG.Heizung.Mischer.Vorlauf
2018-01-01_22:04:10 DI_MischerCommands cmd_3
2018-01-01_22:04:29 DI_MischerCommands wait_timer: 01.01.2018 22:10:29 cmd_3 EG.Heizung.Mischer.Vorlauf
2018-01-01_22:05:00 EG.HWR.Fussbodenmischer position: 47   << addLog
2018-01-01_22:25:07 EG.HWR.Fussbodenmischer position: 47   << addLog
2018-01-01_22:25:12 DI_MischerCommands wait_timer: no timer
2018-01-01_22:25:12 EG.HWR.Fussbodenmischer position: 48
2018-01-01_22:25:12 DI_MischerCommands cmd_nr: 3
2018-01-01_22:25:12 DI_MischerCommands cmd: 3
2018-01-01_22:25:12 DI_MischerCommands cmd_event: EG.Heizung.Mischer.Vorlauf
2018-01-01_22:25:12 DI_MischerCommands cmd_3
2018-01-01_22:40:46 DI_MischerCommands last_cmd: cmd_3
2018-01-01_22:40:46 DI_MischerCommands disabled
2018-01-01_22:40:46 DI_MischerCommands mode: disabled
2018-01-01_22:40:46 EG.HWR.Fussbodenmischer position: -619
2018-01-01_22:40:59 EG.HWR.Fussbodenmischer position: -619   << addLog
2018-01-01_22:43:58 EG.HWR.Fussbodenmischer position: 1
2018-01-01_22:44:30 DI_MischerCommands initialize
2018-01-01_22:45:00 EG.HWR.Fussbodenmischer position: 1   << addLog
2018-01-01_22:50:01 EG.HWR.Fussbodenmischer position: 1   << addLog


Die Position springt von +48 auf -619. Interessant sind dabei die Zeitstempel:


2018-01-01_22:25:12
2018-01-01_22:40:46


dazwischen ist es zu keinen EVENTS seitens meiner Mischersteuerung gekommen, und zu keinen weiteren addLogs. Das sind gute 15 Minuten - und die 1-Wire-Sensoren zur Mischersteuerung werden alle 60 Sekunden abgefragt.

Vielleicht liegt das Problem doch nicht im STELLMOTOR-Bereich, sondern woanders. Anscheinend ist ja weder addLog (normalerweise alle 5 Minuten) noch ein anderes DOIF ausgeführt worden...

Mein FHEM-Logfile zu dieser Zeit ist auch seltsam:


2018.01.01 22:25:00 1: PERL WARNING: Argument "???" isn't numeric in division (/) at (eval 225956) line 1.
2018.01.01 22:25:13 1: localhost:1883 disconnected, waiting to reappear (MQTTServer)
2018.01.01 22:25:14 1: PERL WARNING: Argument "???" isn't numeric in division (/) at (eval 226096) line 1.
2018.01.01 22:25:15 1: PERL WARNING: Argument "???" isn't numeric in division (/) at (eval 226193) line 1.
2018.01.01 22:25:16 1: PERL WARNING: Argument "???" isn't numeric in division (/) at (eval 226280) line 1.
2018.01.01 22:25:16 1: PERL WARNING: Argument "???" isn't numeric in division (/) at (eval 226341) line 1.
2018.01.01 22:25:16 1: PERL WARNING: Argument "???" isn't numeric in division (/) at (eval 226385) line 1.
2018.01.01 22:25:17 1: PERL WARNING: Argument "???" isn't numeric in division (/) at (eval 226419) line 1.
2018.01.01 22:40:45 1: localhost:1883 reappeared (MQTTServer)
2018.01.01 22:40:52 1: Timeout for PRESENCE_DoLocalPingScan reached, terminated process 8504
2018.01.01 22:40:59 1: PERL WARNING: Argument "???" isn't numeric in division (/) at (eval 226497) line 1.
2018.01.01 22:41:00 1: PERL WARNING: Argument "???" isn't numeric in division (/) at (eval 226589) line 1.
2018.01.01 22:41:01 1: PERL WARNING: Argument "???" isn't numeric in division (/) at (eval 226676) line 1.
2018.01.01 22:41:02 1: PERL WARNING: Argument "???" isn't numeric in division (/) at (eval 226774) line 1.
2018.01.01 22:41:02 1: PERL WARNING: Argument "???" isn't numeric in division (/) at (eval 226855) line 1.
2018.01.01 22:41:02 1: HMLAN_Parse: HMLAN1 new condition disconnected
2018.01.01 22:41:03 1: 10.10.10.20:1000 disconnected, waiting to reappear (HMLAN1)
2018.01.01 22:41:03 1: HMLAN_Parse: HMLAN1 new condition disconnected
2018.01.01 22:41:03 1: HMLAN_Parse: HMLAN2 new condition disconnected
2018.01.01 22:41:03 1: 192.168.1.51:1000 disconnected, waiting to reappear (HMLAN2)
2018.01.01 22:41:03 1: HMLAN_Parse: HMLAN2 new condition disconnected
2018.01.01 22:41:03 1: HMLAN_Parse: HMLAN2 new condition init
2018.01.01 22:41:03 1: 192.168.1.51:1000 reappeared (HMLAN2)
2018.01.01 22:41:03 1: HMLAN_Parse: HMLAN1 new condition init
2018.01.01 22:41:03 1: 10.10.10.20:1000 reappeared (HMLAN1)
2018.01.01 22:41:03 1: HMLAN_Parse: HMLAN2 new condition ok
2018.01.01 22:41:03 1: HMLAN_Parse: HMLAN1 new condition ok


Der lokal laufende MQTT-Server ist nicht mehr erreichbar und erst nach 15 Minuten wieder da? Beide HMLAN verabschieden sich?

Zu dieser Zeit verband sich der FHEM-Server über WiFi mit einer sehr sehr weit entfernten Fritz!Box. Die Verbindung ist typischerweise 1-2 MBit. Nach dem Reboot um 23:02 wurde dann wieder der WiFi-Repeater genutzt und ich habe volle 54 MBit.

Grüüüüübel...

Ciao, -MN
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: tpoetschan am 02 Januar 2018, 06:16:24
Hi Morgennebel,

werde ich so ausprobieren und berichten. Hast noch einen Tipp bzgl. der Relais?
Der Eltako-Bus kann ja nicht zwei mal per USB in jede Fhem Instanz gesetzt werden. Was tun? Fhem2Fhem?, häng ich da dann nicht wieder in Delays drin?

Zu deinem Problem - das ich so nicht beobachten kann bei mir: Wie steuerst du den Mischer stand an?
Errechnest du hier etwas? Oder arbeitest du wie ich mit +1, +2 ?

Kannst ja mal deine Steuerung hier reinkopieren... oder finde ich die irgendwo auf den Seiten dieses Topics?

Viele Grüße
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: TSB am 24 Februar 2019, 15:11:50
Das Modul verursacht leider häufige Abstürze der Heizungssteuerung. Habe es nun raus genommen und durch eine simple Steuerung ohne absolute Positionsdaten des Mischers ersetzt, was in der Praxis genauso gut funktioniert.

Vielleicht hilft es ja jemanden das bei sich auch entsprechend im Programmcode zu ersetzen:
use vars qw ($utilsMischerTime $utilsMischerDriveSec);
$utilsMischerTime = 0;
$utilsMischerDriveSec = 245;

# ...
sub xyz {
  my $mischerPause = 5;

  # VT: berechnete Vorlauftemperatur
  # VTist: anliegende Vorlauftemperatur
  if (abs($VT - $VTist) > 0.6 and time()-$utilsMischerTime > $mischerPause) {
    my $mischerDiff = 1;
    if (abs($VT - $VTist) > 4) {
      $mischerDiff = int(abs($VT - $VTist))*1.2;
      $mischerDiff = 3 if $mischerDiff < 3;
      $mischerDiff = 15 if $mischerDiff > 15;
    }
    if ($VT < $VTist) {
      $mischerDiff *= -1;
    }

    my $sleep = abs($mischerDiff)*100/$utilsMischerDriveSec;
    $utilsMischerTime = time();
    if ($mischerDiff > 0) {
      fhem("set MischerL off");
      fhem("set MischerR on");
      fhem("sleep ".$sleep."; set MischerR off;");
    } else {
      fhem("set MischerR off");
      fhem("set MischerL on");
      fhem("sleep ".$sleep."; set MischerL off;");
    }
  }
}
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: sledge am 24 Februar 2019, 18:31:12
Zitat von: TSB am 24 Februar 2019, 15:11:50
Das Modul verursacht leider häufige Abstürze der Heizungssteuerung. Habe es nun raus genommen und durch eine simple Steuerung ohne absolute Positionsdaten des Mischers ersetzt, was in der Praxis genauso gut funktioniert.


Könntest Du auf den Teil etwas genauer eingehen? Ich habe das Modul bei mir im Einsatz und stelle bisher keine Abstürze fest - eher eine Fehlerfortpflanzung, die ich derzeit aber der Hardware zuschreibe.

Gruß,

Tom
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: TSB am 25 Februar 2019, 18:59:42
Das Problem ist im Thread schon mehrfach aufgeführt, hier mein Beitrag von damals:
https://forum.fhem.de/index.php/topic,23933.msg730114.html#msg730114

Manchmal hilft ein Reset, oft muss aber der Stecker gezogen werden und das Raspi neu starten. Leider hat sich das Problem über die Jahre nicht gelöst.

Da ich aber das Modul in seiner Gänze so nicht brauche habe ich es auf das notwendige reduziert und damit tut auch die Fhem Steuerung wie es soll.
Titel: Antw:39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: sledge am 25 Februar 2019, 19:09:57
Ahh. Ok. Danke Dir. Ich habe den Thread zwar "x-mal" durchgelesen, als ich meine Lösung eingerichtet habe - mich aber nicht mehr an diesen Post erinnert.

Das Problem habe ich auch gelegentlich - da ich aber ohnehin 3mal täglich einen Reset des Mischermotors durchführe, scheint das zu passen.

Titel: Aw: 39_STELLMOTOR - ventilsteuerung mit R/L-Motor und relais, zB.Heizungsmischer 3.0
Beitrag von: RaspiCOC am 21 Januar 2024, 20:08:23
Hallo zusammen, zu Beginn der vorletzten Heizperiode, war ich auf der Suche nach einer Lösung, den Mischermotor des Vorlaufs bei mir zu steuern. Ich hatte mich mehr auf den Selbsteinbau der hybriden Anlage (Holz + Gas) konzentriert und war der festen Überzeugung, die Steuerung schnell zusammengefrickelt zu bekommen.

Tatsächlich war es dann auch so. Nach wenigen Stunden stand die komplette Logik (Fenstersteuerung, Gaszuschaltung, Abgasklappe). Aber, zentrales Element ist 39_STELLMOTOR für die Steuerung des Mischers. Eigentlich hatte ich gehofft, dass das Modul irgendwann mal regulär aufgenommen wird. Scheint aber nicht so zu sein.

Ich habe tatsächlich eine Frage zu dem Modul: Ich ermittle die Ziel-Vorlauftemperatur und passe den Mischer nach oben oder unten an. Das mache ich mit einem DOIF und setze den Stellmotor jeweils um 3 Grad hoch bzw. runter. Hat irgendwie auch immer gut funktioniert. Kürzlich schaute ich mal ins Log...

2024.01.21 09:35:15 2: MISCHER_fahren: set MISCHER 92: Unknown argument 92, choose one of calibrate:noArg reset:noArg stop:noArg 1:noArg  2:noArg  8:noArg  9:noArg  10:noArg  16:noArg  21:noArg  27:noArg  33:noArg  44:noArg  50:noArg  55:noArg  66:noArg  77:noArg  88:noArg  99:noArg

Alles voll damit...

In Zeile 256 findet sich:

foreach(1,2,8,9,10,16,21,27,33,44,50,55,66,77,88,99){ $usage .= " ".$_.":noArg "; }
Gibt es irgendeinen Grund, weshalb genau diese Werte im Code enthalten sind? Könnte ich da nicht genausogut 1,2,3,4,5,...97,98,99 aufnehmen?

Und sollte jemand inzwischen etwas Besseres als 39_STELLMOTOR gefunden haben (was ich irgendwie nicht glauben mag, weil das Modul einfach super ist), dann freue ich mich über einen Hinweis!