Hallo Pitti
nochmals vielen Dank für dein SomfyRTS-Modul und den Hinweis auf RFXmngr. Damit konnte ich den RFX-433EMC erfolgreich als zusätzlichen Sender an meiner Somfy-Markise anlernen.
Beim weiteren Experimentieren habe ich festgestellt, dass sich neben UP, DOWN und STOP/MY relativ einfach auch eine laufzeitbasierte Positionsvariable ergänzen lässt. Ich habe dafür eine Skala von 0 bis 255 verwendet:
Beim Beginn einer Fahrt speichere ich die relevanten Informationen gemeinsam in einer Stringvariablen als JSON, beispielsweise:
{
"startTime": 1753470000.25,
"startPosition": 100,
"targetPosition": 255,
"direction": 1,
"duration": 33.4,
"source": "Somfy-Fernbedienung"
}
Darin stehen insbesondere:
-
Zeitpunkt des Fahrtbeginns
-
Position beim Fahrtbeginn
-
Fahrtrichtung
-
Zielposition
-
gegebenenfalls die berechnete Fahrdauer
Bei einem empfangenen STOP-Befehl wird aus der vergangenen Zeit die neue Position berechnet. Unter der Annahme, dass der Fahrweg ungefähr proportional zur Motorlaufzeit ist, ergibt sich beispielsweise bei einer Aufwärtsfahrt:
neue Position =
Startposition
+ 255 × vergangene Fahrzeit / vollständige Aufwärtsfahrzeit
Beim Ausfahren wird der entsprechende Wert von der Startposition abgezogen. Das Ergebnis wird jeweils auf den Bereich 0…255 begrenzt.
Dadurch lässt sich nicht nur beim STOP die ungefähre Position nachführen. Man kann auch gezielt eine neue Position anfahren. Soll die Markise beispielsweise von Position 100 auf 150 fahren, wird aus der Differenz die notwendige Laufzeit berechnet, UP gesendet und nach Ablauf dieser Zeit automatisch STOP ausgelöst.
Vollständige Fahrten an einen Endanschlag setzen die Position wieder exakt auf 0 beziehungsweise 255. Dadurch wird eine mögliche Drift regelmässig korrigiert.
Besonders interessant ist, dass der RFX-433EMC auch die Telegramme der originalen Somfy-Fernbedienung empfängt. Somit kann dieselbe Positionslogik unabhängig davon nachgeführt werden, ob die Bedienung über IP-Symcon oder über die originale Fernbedienung erfolgt.
Natürlich handelt es sich nicht um eine gemessene, sondern um eine berechnete Position. Das Prinzip entspricht aber ungefähr der laufzeitbasierten Positionsbestimmung vieler Rollladenaktoren. In meinen ersten Tests funktioniert es erstaunlich gut.
Vielleicht wäre das eine interessante optionale Erweiterung des Moduls. Den dazugehörigen Code kann ich bei Interesse gerne in aufgeräumter Form zur Verfügung stellen.