Raffrollo mit Somfy und SIGNALduino

Begonnen von ReBi, 15 Oktober 2020, 09:02:53

Vorheriges Thema - Nächstes Thema

ReBi

Hallo,

entschuldigt, falls es schon beschrieben wurde, aber ich habe es im Forum leider nicht gefunden.
Ich habe nach der Wiki-Anleitung https://wiki.fhem.de/wiki/Somfy_via_SIGNALduino meinen Raffrollo mit Somfy und einem SIGNALDUINO erfolgreich eingerichtet.
Somit habe ich in FHEM für RolloOben die Links für "down" und "up", die bei einem Klick auch den Rollo ein kleines Stück richtig bewegen.

Mein Rollo ist etwa 3m lang und ich müsste somit etwa gefühlte 1000000 Klicks machen, um den Rollo nach oben zu bringen.
Wie bringe ich z.B. einen weiteren Link neben "up" und "down" für "50%", und ein Klick bewegt den Rollo auf 50% der Gesamtlänge und stoppt dann dort?

Die Zeiten habe ich auch schon definiert.
Derzeit habe ich:

Internals:
   ADDRESS    12345F
   DEF        12345F
   FUUID      5f7c6ac7-f33f-b08a-7983-d592921544194f29
   IODev      sduino
   NAME       RolloOben
   NR         24
   STATE      open
   TYPE       SOMFY
   move       stop
   CODE:
     1          12345F
   READINGS:
     2020-10-15 08:38:30   enc_key         A0
     2020-10-15 08:39:37   exact           0
     2020-10-15 08:39:37   position        0
     2020-10-15 08:38:30   rolling_code    00E0
     2020-10-15 08:39:37   state           open
Attributes:
   IODev      sduino
   devStateIcon open:fts_shutter_10 10:fts_shutter_10 20:fts_shutter_20 30:fts_shutter_30 40:fts_shutter_40 50:fts_shutter_50 60:fts_shutter_60 70:fts_shutter_70 80:fts_shutter_80 90:fts_shutter_90 down:fts_shutter_100 closed:fts_shutter_100
   drive-down-time-to-100 60
   drive-down-time-to-close 68
   drive-up-time-to-100 2
   drive-up-time-to-open 72
   eventMap   on:down stop:stop off:up
   model      somfyshutter
   room       SomfyRaffStore
   webCmd     down:stop:up


Wäre super, wenn mir hier jemand helfen würde.

Gruß
ReBi

jettakilla

Hallo,

hänge mich an diesen Thread an, habe genau dasselbe Problem mit meinen 2 neuen Raffstores. Fernbedienung ist die Somfy Situo 5 Variation RTS Pure II. Up und Down funktionieren, es bräuchte hier eine Funktion die den Befehl dauernd wiederholt um Positionen zwischen 0 und 100 % anfahren zu können.

Gruß
Chris

brahmburi76

Hallo,

auch ich habe das selbe Problem. gibt es hierfür schon von irgendwem einen Lösungsvorschlag?

danke
lg
Brahmburi

jhohmann

Hallo,
ich kenne zwar die Somfy Geschichte nicht, aber hier zwei Beispiele, wie man ein Hochdimmen oder im zweiten Beispiel eine Soundbox in der Lautstärke erhöht. Das muss dann natürlich für euch angepasst werden.
In der Küche habe ich am Herd die beiden Leuchten durch Zigbee ersetzt und mit einer Fernbedienung kann ich die Lichter an-/ausschalten oderf auch hochdimmen. Die Fernbedienung behält ihren Status solange, bis die Taste losgelassen wird.
Ich steuere zwei Leuchten, deshalb hat die Funktion aus der myUtils auch zwei Device Parameter für die Leuchten und einen Parameter für den Schalter selbst.
Zuerst das notify für den Schalter (Langer Druck)
defmod ntSchalterHerdLichtAnLangStart notify SchalterHerdLicht:1001 {incrementHerdLicht("SchalterHerdLicht","KuecheHerdLichtLinks","KuecheHerdLichtRechts")}

Und hier die Funktion
sub incrementHerdLicht($$$) {
  my ($deviceSchalter, $deviceLinks, $deviceRechts)= @_;
  my $pct = ReadingsNum($deviceLinks, "pct", "");
  my $schalter = ReadingsVal($deviceSchalter, "state", "");
  if ($pct < 100 && $schalter ne "1003") {
    fhem("set ".$deviceLinks." dimUp;sleep 0.2;set ".$deviceRechts." dimUp");
    fhem("sleep 0.5;{incrementHerdLicht(\"".$deviceSchalter."\",\"".$deviceLinks."\",\"".$deviceRechts."\")}");
  }
}

Wenn ein Licht noch nicht bei 100 Prozent angekommen ist oder der Status des Schalters nicht auf "losgelassen" wechselt, dann wird die Funktion mittels sleep verzögert erneut aufgerufen und dimmt so nach und nach die Lichter höher.

Und hier die andere Variante, die nicht auf einen aktiven Status abfragt, sondern bei mir nur bis zu einem Maximalwert laufen soll.
sub volumeUp($$$$) {
  my ($device, $volumeStep, $volumeEnd, $waitTime) = @_;
  my $actVolumeValue = ReadingsNum($device, "volume", 0);
  my $atName = "atVolumeTimerFor" . $device;
  my $atTime = "+00:00:0" . $waitTime;
  my $actState = ReadingsVal($device, "state", "off");
  my $errorTime = time_str2num(ReadingsTimestamp($device, "last_error", "2021-01-01 01:00:00"));
  if (time-$errorTime < 30) {
    return;
  }
  if ($actState eq "off") {
     fhem("set ".$device." TurnFavNetRadioChannelOn 1");
$atTime = "+00:00:06";
  } else {
    if($actVolumeValue > $volumeEnd) {
      return;
    }
    $actVolumeValue += $volumeStep;
    fhem("set ".$device." volume ".$actVolumeValue);
  }
  fhem("delete ".$atName); # bin nicht sicher, ob das sein muss/darf
  fhem("defmod ".$atName." at ".$atTime." {volumeUp(\"".$device."\", ".$volumeStep.", ".$volumeEnd.", ".$waitTime.")}");
}

Hier wird noch eine errorTime abgefragt, damit das at nicht immer und immer wieder angeworfen wird, obwohl das Gerät gerade nicht reagiert.
Der innere Ablauf ist speziell für meine Situation, aber aus dem Beispiel sollte sich was für eure Problematik was machen lassen.
Ich habe den Rahmen selbst auch hier im Forum gefunden und für mich angepasst.
Ein Abbrechen von außen ist relativ einfach machbar, indem man ein weiteres notify anlegt, was das generierte at löscht, wenn vorhanden.
Da muss etwas ähnliches wie hier eingefügt werden
fhem("delete atVolumeTimerFor...") if (defined($defs{atVolumeTimerFor...}));
Raspberry Pi 4 - bookworm / EnOcean - Rollo+Licht, deCONZ - Licht+Sensoren, ZWave - CO Messung, HMCCU mit piVCCU - Heizung+Rollo
plus dovecot, minidlna