FHEM Forum

FHEM => Automatisierung => Thema gestartet von: C_Herrmann am 18 Februar 2014, 22:04:36

Titel: Idee für neues Modul RolloPos - Anregungen zur Umsetzung gesucht
Beitrag von: C_Herrmann am 18 Februar 2014, 22:04:36
Hallo,

bei der Überarbeitung des Moduls UNIRoll wollte ich eine erweiterte Steuerung einbauen, um die Rolloposition erfassen und steuern zu können. Da ich auch ein Rollo mit FS20rsu habe, kam mir die Idee, die Funktion in ein generisches Modul für alle Geräte - egal ob FS20, HM, UNIRoll, 1-wire oder sonstige - auszulagern.

Meine Gedanken dazu habe ich unten zusammengetragen. Der Programmablauf ist eigentlich simpel. Ich habe das ansatzweise mal mit einem Notify (s.u.) für ein Rollo nachgestellt.

Hier sind nun einige Fragen zur möglichen Umsetzung:

---------------------------------------------------------------------------------------------------------
RolloPos - Modul zur Erfassung der Lage und Steuerung von Rollos

Voraussetzungen:

Modul:

Probleme:

Variablen/Attribute pro Gerät:

Programmablauf:
Befehle abhören - wie ? - Notify?
  |
Ist es ein Rollo? -> nein -> tschüss
  |
ja
  |
Befehl mit Zeitwert? -> nein -> wenn auf-Befehl -> rPos = rMin, set Rollo auf
  |                         '-> wenn ab-Befehl  -> rPos = rMax, set Rollo ab
  |                         '-> wenn zPos-Befehl -> zPos = rPos -> return
  |                                             |-> zPos > rPos -> set Rollo ab (zPos - rPos), rPos = zPos
  |                                             '-> zPos < rPos -> set Rollo auf (rPos - zPos), rPos = zPos
  ja
  |
auf-Befehl -> Zeitwert > rPos -> rPos = rMin, set Rollo auf
          '-> Zeitwert <= rPos -> rPos = (rPos - Zeitwert), Original-Befehl ausführen
ab-Befehl  -> Zeitwert > (rMax - rPos) -> rPos = rMax, set Rollo ab
          '-> Zeitwert <= (rMax - rPos) -> rPos = (rPos + Zeitwert), Original-Befehl ausführen

---------------------------------------------------------------------------------------------------------

Notify:
uniroll_test.* {
  my $rPos = AttrVal("uniroll_test", "rPos", "0");
  my $rMin = AttrVal("uniroll_test", "rMin", "0");
  my $rMax = AttrVal("uniroll_test", "rMax", "0");
  my $ep0 = $EVTPART0;
  my @para1 = split(/ /, $EVENT);
  my $ep1 = $para1[1];

  if(!defined($ep1)) {
    if($ep0 eq "Ab") {
      fhem("set uniroll_test Ab");
      fhem("attr uniroll_test rPos $rMax");
    } elsif($ep0 eq "Auf") {
      fhem("set uniroll_test Auf");
      fhem("attr uniroll_test rPos $rMin");
    }
    return;
  }

  if($ep1 =~ m/^\d*\.?\d*$/) {
    if($ep0 eq "Ab") {
      $rPos = ($rPos + $ep1);
      if($rPos >= $rMax) {
        $rPos = $rMax;
        fhem("set uniroll_test Ab");
      } else {
        fhem("set uniroll_test Ab $ep1");
      }
    }
    if($ep0 eq "Auf") {
      $rPos = ($rPos - $ep1);
  if($rPos <= $rMin) {
        $rPos = $rMin;
        fhem("set uniroll_test Auf");
      } else {
        fhem("set uniroll_test Auf $ep1");
      }
    }
  fhem "attr uniroll_test rPos $rPos";
  fhem("setstate uniroll_test teil") if($rPos > $rMin && $rPos < $rMax);
  }
}


Definition UNIRoll in der fhem.cfg:
define uniroll_test UNIRoll 5432 6
attr uniroll_test IODev CUL1
attr uniroll_test eventMap /down 11:Ab80/down:Ab/up:Auf/stop:Stop/
attr uniroll_test model R_23700
attr uniroll_test rMax 35
attr uniroll_test rMin 0
attr uniroll_test rPos 0
attr uniroll_test sendStopBeforeCmd 0
attr uniroll_test webCmd Auf:Stop:Ab80:Ab



Da das UNIRoll-Modul aus dem SVN noch keine Zeitbefehle unterstützt, habe ich meine geänderte Version angehängt. Die Attribute rMax, rMin und rPos sind enthalten. Sonst müssen sie als userattr definiert werden.

Was haltet Ihr von der Idee?

Gruß,
Christian

Anhang:
10_UNIRoll.pm

Titel: Antw:Idee für neues Modul RolloPos - Anregungen zur Umsetzung gesucht
Beitrag von: eldrik am 19 Februar 2014, 11:20:35
Hi,

ich finde die Idee gut wenngleich ich wahrscheinlich nicht viel zur weiteren Umsetzung beitragen kann, ich habe folgende 1Wire Rollladenmodule mit denen ich höchstens testen könnte.

http://www.eservice-online.de/1-Wire-Bus/1-Wire-Fertigmodule/Digital-Ein-und-Ausgang-Analog-Eingang-Zaehler/1-Wire-Shutter-Rolladensteuerung.html (http://www.eservice-online.de/1-Wire-Bus/1-Wire-Fertigmodule/Digital-Ein-und-Ausgang-Analog-Eingang-Zaehler/1-Wire-Shutter-Rolladensteuerung.html)

Die manuelle Bedienung über die Tastereingänge des Moduls kann leider vom Modul nicht erfasst werden.

Greetz
Eldrik

Titel: Antw:Idee für neues Modul RolloPos - Anregungen zur Umsetzung gesucht
Beitrag von: Tobias am 19 Februar 2014, 14:22:39
Zitat von: eldrik am 19 Februar 2014, 11:20:35
Die manuelle Bedienung über die Tastereingänge des Moduls kann leider vom Modul nicht erfasst werden.
OT: deswegen habe ich mich gegen die 1wire Module und für die Homematic Module entschieden ;)
Titel: Antw:Idee für neues Modul RolloPos - Anregungen zur Umsetzung gesucht
Beitrag von: lukasbastelpeter am 12 November 2015, 11:34:29
Hi,

ich habe hier mal eine Frage, die könnte hier auch passen ;)....
http://forum.fhem.de/index.php/topic,43901.0.html


SRY für Totengraben!
Titel: Antw:Idee für neues Modul RolloPos - Anregungen zur Umsetzung gesucht
Beitrag von: C_Herrmann am 12 November 2015, 21:44:02
Hallo,

ich antworte mal hier auf beide Beiträge.

Ein universelles Modul wäre viel zu aufwändig zu programmieren gewesen. Die Zeitsteuerung ist dabei recht simpel, aber es hätte Schnittstellen in allen betroffen Modulen erfordert. Daher hatte ich die Steuerung zunächst als Notify ausprobiert und dann ins UniRoll-Modul eingebaut.

Es gibt keine Schnittstelle, mit der die Zeitsteuerung des UniRoll-Moduls von außen verwendet werden kann.

Das obenstehende Notify müsste eigentlich auch mit anderen Modulen funktionieren. Probiere es mal mit Deinem Modul aus.
Titel: Antw:Idee für neues Modul RolloPos - Anregungen zur Umsetzung gesucht
Beitrag von: lukasbastelpeter am 13 November 2015, 11:59:22
Mein Modul gibt es nicht ;)
Es ist ein Notify-Konstrukt:

Notify "überwacht" Dummy, wird dieser:
- up, setreading Rollodummy lastCmd up; set Rolloschalter.up on; sleep1; set Rolloschalter.up off
-down,  setreading Rollodummy lastCmd down; set Rolloschalter.down on; sleep1; set Rolloschalter.down off

-stop, If lastCmd=up: set Rolloschalter.down on; sleep1; set Rolloschalter.down off,  If lastCmd=down: set Rolloschalter.up on; sleep1; set Rolloschalter.up off


technisch steckt da ein Homematic Empfänger hinter, der die tasten der original Gurtwickler Fernbedienung drückt...
Die dadurch entstehende Latenz lasse ich bei den Überlegungen mal außen vor, sollte ja maximal +/- 1,5s ausmachen....

Mir fehlt hier völlig die zeitliche ebene...

Eine Überlegung wäre in einem reading nicht nur den lastCmd sonder auch in time_lastCmd den Timestamp des cmds zu speichern, und dann bei jedem neuen Befehl auszuwerten ob die oberste/unterste position schon erreicht sein müsste weil kein weiterer Befehl gefolgt ist,

oder aber bei "stop" die Differenz des timestamps des letzten comands und des timestamps des aktuellen als bewegungsänderung festzuhalten....

Aber all das hast du ja schon in dem UniRoll Modul gelöst oder?

Hast du vielleicht einen Tipp für mich wie/an welcher stelle/ ich entweder in deinem Modul "einfach" die Schnittstelle selber erstellen kann,

oder kannst du mir vielleicht den oben beschriebenen. Algorithmus mit allen Fallstricken die du da sicher schon ausgebügelt hast zur verfügung stellen?
Titel: Antw:Idee für neues Modul RolloPos - Anregungen zur Umsetzung gesucht
Beitrag von: C_Herrmann am 13 November 2015, 23:33:57
Hallo,

ich fürchte, ich werde Dir bei Deinem Vorhaben kaum weiterhelfen können.

Die Idee mit einer Schnittstelle solltest Du begraben. Sie wäre nur nötig, um das UniRoll-Modul von außen zu steuern - nicht anders herum. Die Zeitsteuerung ist aber komplett in das Modul integriert. Du kannst natürlich gerne den Code aus dem Modul für eine eigene Entwicklung übernehmen. Ich habe alles damals mehr oder weniger ausführlich im Modul kommentiert. Für die Auf/Ab-Befehle habe ich die InternalTimer Funktion aus fhem.pl benutzt. Die Erkennung der tatsächlichen Position bei einem Stop wird aus der Differenz letzter Befehl/Zeitangabe und ReadingsTimestamp berechnet.

Ich würde Dir empfehlen, einen Ablaufplan - wie hier im Ausgangsbeitrag - für Deine Installation zu erstellen und daraus einen Notify oder eine Funktion unter Verwendung meines Codes zu programmieren. So habe ich es letztlich auch gemacht.

Titel: Antw:Idee für neues Modul RolloPos - Anregungen zur Umsetzung gesucht
Beitrag von: viegener am 14 November 2015, 13:48:13
Im SOMFY-Modul gibt es eine entsprechende Umsetzung, die die Position für Rolläden 0-100 zwischen auf und unten sowie 200 für ganz geschlossen umfasst. Die Timingwerte werden als Attribute eingestellt.

Über ein Empfängermodul per fhemduino funktioniert das auch bei paralleler manueller Bedienung. Also wenn Wandschalter für Auf/Ab/Halt verwendet werden.

Das sind die Module:
10_SOMFY und 14_FHEMduino_SomfyR

Allerdings ist die Implementierung nicht getrennt von der Steuerung, da es damals bereits Teile der Implementierung in 10_SOMFY gab. Ich bin mir nicht klar, wie man das herauslösen könnte. Allerdings wäre es gut, wenn man zumindest die Attribute und Readings vereinheitlichen würde

Ich kann sicher auch mehr im Detail erzählen was gemacht wurde,
Johannes