44_ROLLO: Modul zur präzisen Steuerung von Rollläden

Begonnen von KernSani, 14 Januar 2019, 00:11:37

Vorheriges Thema - Nächstes Thema

GU!DO

Damit habe ich mich noch nicht beschäftigt. Schaue ich mir an. Danke.

Irgend eine Idee zu meinem "Problem"?

87insane

Denke auch das du nur sowas nachbauen muss...

defmod alle_rollos structure EG az_rollo bz_rollo k_rollo sz_rollo wz_rollo
attr alle_rollos alias ALLE ROLLOS
attr alle_rollos clientstate_behavior last
attr alle_rollos cmdIcon open:fts_shutter_up close:fts_shutter_down stop:fts_shutter_manual half:fts_shutter_50
attr alle_rollos devStateIcon { my $con = ReadingsVal($name,"state","undef");;;;  my $pic = $con eq "opening" ? 'fts_shutter_up@red' : $con eq "closing" ? 'fts_shutter_down@red' : $con eq "100" ? 'fts_shutter_100' : $con =~ /(\d)\d/ ? 'fts_shutter_'.$1.'0' : $con =~ /\b\d\b/ ? 'fts_shutter_10' : 'fts_shutter_updown';;;;  "<div>&nbsp;;&nbsp;;&nbsp;;<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>".FW_makeImage($pic)." </div>" }
attr alle_rollos genericDeviceType blind
attr alle_rollos group Rollo
attr alle_rollos room Alexa,FHEM / Info
attr alle_rollos webCmd :open:close:half:stop:pct


So mache ich das zb im EG. Ein wenig regex könnte das leben vereinfachen.

Gesendet von meinem LM-G810 mit Tapatalk


GU!DO

#197
Hallo KernSani & 87insane,

perfekt. Genau das was ich gesucht habe. Läuft wie Teufel!

Vielen Dank!
@87insane auch für den Code. Damit war es in 2 Minuten umgesetzt.  :D

Hat vielleicht auch noch jemand einen Lösungsansatz für mein Problem aus:

Zitat von: GU!DO am 13 Mai 2020, 20:42:36

Dann wäre es perfekt! Ist wahrscheinlich nur eine Misskonfiguration. Ich glaube ich sehe den Wald vor lauter Bäumen nicht.

Vielen Dank & viele Grüße

Guido

GU!DO

Ich habe das grad alles nochmal mit `nem Rollo "Dummy" probiert, so dass dieser von keinem extern Trigger beeinflusst wird. Nachdem sich der Dummy genau so verhielt, habe ich festgestellt, dass es ein Denkfehler von mir ist.

Ich habe mich immer gefragt: Wozu ist das Icon mit der Hand? ??? Nun habe ich mir grad webCmd angesehen und bemerkt: Der Name ist stop!  :o

Damit ist natürlich auch die Funktion klar und läuft auch wie gewollt.

Nun ergibt sich für mich jedoch folgendes Problem:

Wenn ich, während einer Fahrt, auf Icon "open" bzw. Icon "closed" klicke sendet Rollo den Befehl und:
- mein Raffstore stoppt, da ich es aus laufender Fahrt mit einem erneuten Fahrbefehl anhalte.
- Das Rollo-Device läuft jedoch munter drauf los, da ich ihm ja einen Fahrbefehl gegeben habe.

Ist meine Steuerung denn die Einzige, die mittels erneutem "UP"/"DOWN" Befehl eine begonnene Fahrt stoppt?

Gibt es eine Möglichkeit das Modulintern zu lösen, oder muß ich die Steuerung auslagern und die Logik in ein DoIf integrieren?

Vielen Dank

Guido

87insane

Eigentlich ist die Doku zu dem Modul mal richtig gut gewesen. Ich weiß nicht wie sie aktuell aussieht aber ich denke da solltest du ein paar Minuten investieren. Ich denke schon das mehr Personen so eine steuerung haben. Es ist ja auch nix verwunderliches. Allerdings macht es echt Sinn, die Doku mal zu durchstöbern. Ich denke da wirst du zu deiner Antwort auch noch andere nützliche Dinge finden :)

Gesendet von meinem LM-G810 mit Tapatalk


KernSani

Schau dir mal die Attribute rl_commandStopUp und rl_commandStopDown an. Die sollten genau das machen, was du möchtest.


Kurz, weil mobil....
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

GU!DO

@87insane:
Die Doku habe ich schon rauf und runter gelesen. Entweder ferstehe ich irgend etwas komplett flasch, oder da steht es nicht drin. Den Forenthread (zumindest den nachdem das Modul offiziell geworden ist) habe ich ebenfalls durch.

@KernSani
Das hatte ich so verstanden und auch so eingestellt:
Zitat von: GU!DO am 13 Mai 2020, 20:42:36

rl_commandDown set HCANDeviceRolladen53 DOWN
rl_commandStopDown set HCANDeviceRolladen53 DOWN
rl_commandStopUp set HCANDeviceRolladen53 UP
rl_commandUp set HCANDeviceRolladen53 UP


Wenn jemand unterschiedliche Befehle für Start und Stop hat funktioniert das auch. Er drückt z.B. während einer "Down" Fahrt nochmals "Down": Es passiert nix weder an seinen Rollos noch am Device. Die Fahrt wird fortgesetzt.

Wenn ich jedoch, mit meinen gleichen Befehlen, während einer "Down"Fahrt nochmals auf "Down" drücke: Stoppen meine Raffstores aber das Rollo Modul fährt weiter.

Jetzt kann man natürlich sagen: Drück halt nicht auf "UP" oder "Down" zum Stoppen sondern auf das "Stop" Icon. Das wiederspricht jedoch der manuellen Logik unserer Rolladentaster. Bei denen man "UP" bzw. "DOWN" drücken muß um das Raffstore anzuhalten. Da wir das schon seit 10 Jahren so praktizieren ist das natürlich drin.

Klasse wäre wenn man eine Funktion der Art

WHEN STATE =~ "drive" AND (rl_commandDOWN OR rl_commandUP) THEN stop

aktivieren könnte.


GU!DO

@KernSani
Hi, ich habe mal ein wenig herum gespielt und mich mittels copy and paste Deines Codes bemächtigt - sorry.

Dabei ist das herausgekommen:

  0     #### Stop when in motion and get new drive command
  1     if ( ( ( $cmd eq "open" ) || ( $cmd eq "closed" ) ) && ( ReadingsVal( $name, "state", '' ) =~ /drive/ ) ) {
  2         #Log3 $name, 3, "Stop drive cause of an additional drive command while device is in motion!";
  3         $cmd = "stop";
  4     }


Das würde mir, soweit ich es zwischen Bier und Schaum getestet habe, schon helfen.

Könntest Du das ggf. mit einbauen und über ein Attribut aktivierbar machen?

Viele Grüße & vielen Dank

Guido

flummy1978

Guten Morgen,

die originalen Rolladen Module von Homematic lassen einen "UP xx" oder "DOWN xx" Befehl zu, den ich für meine Jalousien zum "kippen" genutzt habe. Der vorhandene Befehle UP / DOWN ermöglicht ja nur 10 Schritte, also musste da was anderes her.  Die Gedanken das irgendwie zu berechnen und +10 -9 oder -10 +9 zu rechenen hab ich schnell verworfen, aber im Rollo Modul kam es mir "einfacher" vor.

Da ich (erstmal) nur den +-1 Befehl brauchte und der Rest für mich wohl auch n bissl zu kompliziert geworden wäre mit Argumenten etc, habe ich die aktuelle Version um den Befehl down1 und up1 erweitert.
Habt bitte ein wenig Mitgefühl bei der Bewertung meiner Laienhaften Erfänzung, aber vielleicht kann der Modul Dev das Ganze übernehmen oder angepasst einsetzen ?

Alter Zustand Code Zeile 340-349:

        if ( $cmd eq "down" || $cmd eq "up" ) {

            # Recalculate the desired pct
            my $posin = ReadingsVal( $name, "pct", 0 );
            $posin = 100 - $posin if ( $typ eq "HomeKit" );
            $desiredPos = int( ( $posin - 10 ) / 10 + 0.5 ) * 10;
            $desiredPos = int( ( $posin + 10 ) / 10 + 0.5 ) * 10 if $cmd eq "down";
            $desiredPos = 100 if $desiredPos > 100;
            $desiredPos = 0   if $desiredPos < 0;
        }


Neu Zeile 46 + 47
    "up1"        => "noArg",
    "down1"      => "noArg",


Zeile 342 - 363
        if ( $cmd eq "down1" || $cmd eq "up1" ) {

            # Recalculate the desired pct
            my $posin = ReadingsVal( $name, "pct", 0 );
            $posin = 100 - $posin if ( $typ eq "HomeKit" );
            $desiredPos = $posin - 1;
            $desiredPos = $posin + 1 if $cmd eq "down1";
            $desiredPos = 100 if $desiredPos > 100;
            $desiredPos = 0   if $desiredPos < 0;
Log3 $name, 5, "ROLLO UP1 oder DOWN1 aufgerufen Akt: $posin Ziel: $desiredPos";
       
        }
        elsif ( $cmd eq "down" || $cmd eq "up" ) {

            # Recalculate the desired pct
            my $posin = ReadingsVal( $name, "pct", 0 );
            $posin = 100 - $posin if ( $typ eq "HomeKit" );
            $desiredPos = int( ( $posin - 10 ) / 10 + 0.5 ) * 10;
            $desiredPos = int( ( $posin + 10 ) / 10 + 0.5 ) * 10 if $cmd eq "down";
            $desiredPos = 100 if $desiredPos > 100;
            $desiredPos = 0   if $desiredPos < 0;
        }


Natürlich bin ich sehr neugierig was die Profis unter Euch dazu sagen. Aber auch wenn es Laienhaft umgesetzt sein sollte, wollte ich es nicht nur für mich selbst behalten ;)

Viele Grüße
Andreas

KernSani

Hi Andreas und Guido,
Danke für die Erweiterungsvorschläge. Ich schaue mir beides heute Abend mal an. Und keine Sorge: Profi ist hier niemand ;-)
Vielleicht nehme ich das ja mal zum Anlass, das Modul dem (dringend notwendigen) komplettem Refactoring zu unterziehen...
Grüße,
Oli


Kurz, weil mobil....
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

alpinestars

Guten Morgen zusammen,

ich betreibe mehrere Rollläden im HomeKit-Modus. Das Anfahren von Positionen (z.B. 60%) klappt wunderbar, pct stimmt dann auch.
Fahre ich aber z.B. aus Position 100 (=offen) manuell herunter und stoppe dann ebenfalls manuell wird m.E. die pct falsch berechnet. Stoppe ich nach 2-3 Sekunden wird mir so z.B. pct=10.x angezeigt, obwohl es eigentlich pct=90.x heissen müsste.

define Shutter4 ROLLO
attr Shutter4 cmdIcon open:fts_shutter_up closed:fts_shutter_down stop:fts_shutter_manual half:fts_shutter_50
attr Shutter4 rl_autoStop 0
attr Shutter4 rl_commandDown set Shutter4_down on-for-timer 0.1
attr Shutter4 rl_commandStop set Shutter4_stop on-for-timer 0.1
attr Shutter4 rl_commandUp set Shutter4_up on-for-timer 0.1
attr Shutter4 rl_excessBottom 1
attr Shutter4 rl_excessTop 1
attr Shutter4 rl_forceDrive 1
attr Shutter4 rl_resetTime 2
attr Shutter4 rl_secondsDown 31
attr Shutter4 rl_secondsUp 32
attr Shutter4 rl_switchTime 2
attr Shutter4 rl_type HomeKit
attr Shutter4 webCmd open:closed:half:stop:pct


Ist das ein Fehler oder muss ich ggf. noch irgendetwas einstellen?

Vielen Dank!

87insane

#206
Ich nutze das Modul nicht mehr aber ich weiß dunkel im Hinterkopf, dass man für ext schalter noch einen delay einstellen konnte. 100% genaue pct habe ich nicht hinbekommen aber auf 1% Abweichung war für mich ok.

Edit: ach ja und das mit dem "falsch rum fahren" ist auch eine einstellungs sache. Ich fahre zb anders rum. 0% = Rollo komplett geöffnet, 100 = Rollo komplett geschlossen.

Gesendet von meinem LM-G810 mit Tapatalk

flummy1978

Hey Oli,

Zitat von: KernSani am 20 Mai 2020, 07:39:01
Danke für die Erweiterungsvorschläge. Ich schaue mir beides heute Abend mal an. Und keine Sorge: Profi ist hier niemand ;-)

Hat sich da noch etwas getan ? Oder anders gefragt: Gibt es die Chance dass etwas wie das von mir (oder ähnliches) eingeführt wird ?

Ich frage nur, weil ich gern zwischendurch immer mal updaten würde. Natürlich ist danach dann die Änderung erstmal wieder weg ;(
Ich könnte es natürlich vom Update ausgrenzen befürchte aber dass ich dann verpeilen würde wenn es eine neue Version gibt....

Viele Grüße
Andreas

KernSani

Hi Andreas,
ich werde mir das über das lange Wochenende mal ansehen, versprochen;-)
Grüße,
Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

KernSani

@Andreas: ich habe mir das endlich mal genauer angesehen. Wäre es für deinen Fall nicht auch möglich, den "drive" Befehl zu verwenden? Der nimmt zwar Sekunden, nicht pct als Parameter, aber für dich sollte das doch ausreichen, oder?
Egal, ich habe ein neues Attribut eingebaut (rl_stepUpDown) mit dem die Schrittweite für die up- und down-Befehle gesetzt werden kann (default bleibt 10). Passt das für dich?
@Gu!do: Ich nehme an dein Coding hängt irgendwo recht weit oben in der ROLLO_Set Sub, oder? So um Zeile 246?
#### Stop if not driving - do we need that?
Habe das Coding übernommen und ein Attribut mit dem schönen Namen rl_stopOnCmdWhileDrive eingeführt :-)

Könntet ihr angehängte Version mal testen?

Danke,

Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...