Einbindung von "Centronic" Fernbedienungen in FHEM

Begonnen von Leeloo_Dallas, 24 Mai 2016, 14:40:31

Vorheriges Thema - Nächstes Thema

MarNei

Danke, Christian für Deine Lösung. Ja, der Roto kann nur hoch und runter, also keine Zwischenstationen, deswegen hilft mir UP2 und DOWN2 leider nichts. An sowas wie Deine Lösung hatte ich auch gedacht. Ich habe mich allerdings gefragt, ob ich generell über die Fahrzeitmessung die Position bestimmen kann. So läuft das auch bei meinen Somfy-Rollläden mit dem Somfy-Modul und CUL. Ich muss da mal reinschauen, wie es dort gemacht ist. Dann kann über UP/DOWN und Fahrzeit nach einem HALT festgestellt werden, auf welcher Position genau der Rollladen steht. Natürlich darf man dann nur noch ausschließlich über Fhem die Rollos steuern.

Aber jetzt erfreue ich mich erstmal daran, dass ich überhaupt die Rollläden über fhem hoch- und runterfahren kann. :) Mein Elektriker hatte gemeint, dass man für 300€ pro Rollo (ich habe drei) die Rotos steuerbar machen kann. Jetzt hat es mich gerade mal etwas mehr als 50€ gekostet. (Nochmals einen herzlichen Dank an Ole!!)

mwu406

Vielen Dank an alle,

ich stand auch vor dem Problem 6 Fenster inkl. Rollläden anzubinden und kann dies Dank dem Skript nun auch tun.

Den Pair-Befehl hatte ich nicht auf dem Schirm, dachte das Pairing müsste ich über Docklight machen :-[ Aber dank dem Skript ist das ganze ja ein Kinderspiel.

Gruß
Martin

ole1986

Hallo,

eine leicht ausgebesserte Variante der Implementation des centronic-stick.py script in FHEM. Inklusive Auswahl der Kanäle

In dem attribute CENTRONIC_PATH kann dann für den notifier entsprechend angepasst werden
Es gibt nur noch einen Notifier. Dieser horcht auf UP|DOWN|HALT|DOWN2|UP2.

Das ermöglicht die Vorauswahl der Kanäle, ohne das dabei jedes mal das script ausgeführt wird.


defmod Shutter dummy
attr Shutter userattr CENTRONIC_PATH
attr Shutter CENTRONIC_PATH sudo -u pi /home/pi/centronic-py/centronic-stick.py
attr Shutter readingList number
attr Shutter room Becker
attr Shutter setList number:0,1,2,3,4,5,6,7,8,9,15
attr Shutter webCmd number:UP:HALT:DOWN:DOWN2
attr Shutter webCmdLabel Nummer:Hoch:Anhalten:Runter:Schutz


Und das ist der erforderlich Notifer


defmod Shutter_Notifier notify Shutter:(UP|DOWN|HALT|DOWN2|UP2) {print "### Running centronic '". AttrVal("Shutter","CENTRONIC_PATH","") ."' script with ". ReadingsVal("Shutter","state","") . " on channel " . ReadingsVal("Shutter","number","") . "\n";; system(AttrVal("Shutter","CENTRONIC_PATH","") . " --send ".ReadingsVal("Shutter","state","")." --channel ". ReadingsVal("Shutter","number","") ." &")}
attr Shutter_Notifier room Becker



Ich habe beispielsweise den CENTRONIC_PATH angepasst um Ihn mit dem Benutzer "pi" auszuführen. Das ganze über "sudo -u pi <path to centronic script>"

Beta-User

Kleine Anmerkung:

Evtl. könnte mal jemand versuchen, das ganze mit ROLLO zu konfigurieren statt es an einen Dummy zu hängen. Damit müßte es m.E. möglich sein, auch Zwischenpositionen anzufahren (ROLLO überwacht die Timings) und das ganze z.B. dann in AutoShuttersControl einzubinden.
(Ich habe aber weder ROLLO im Einsatz noch solche Centronic-Teile, und lese hier nur zwangsweise mit, weil ich ganz am Anfang mal was zur allgemeinen Vorgehensweise geschrieben hatte...

Viel Erfolg damit!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Phiolin

#184
@ole1986: Danke für die Programmierarbeit!

Kann das Python Script vielleicht auch mit Devices umgehen, die via ser2net über das Netzwerk zur Verfügung gestellt werden?
Dann müsste der USB Stick nicht zwingend direkt am FHEM Rechner angeschlossen sein, bzw. nicht umständlich über SSH das Kommando auf einem anderen Rechner ausgeführt werden, wenn z.B. aufgrund räumlicher Entfernung der FHEM Rechner zu weit vom Rolladen entfernt ist. Kenne mich mit Python leider nicht soweit aus, aber vielleicht ist das ja nur eine kleine Anpassung?

Die Kommunikation an sich bleibt ja die gleiche, nur müssten die Kommandos anstatt via /dev/serial/... über TCP an den entsprechenden Host:Port geschickt werden.

toolking

Zitat von: Phiolin
@ole1986: Danke für die Programmierarbeit!
Auch von meiner Seite: Danke an die Vorarbeit aller Beteiligten.
Zitat von: Phiolin
Kann das Python Script vielleicht auch mit Devices umgehen, die via ser2net über das Netzwerk zur Verfügung gestellt werden?
@ole1986 Ich hab Dir 'nen PR gestellt.
Mein Patch ist hier: https://github.com/toolking/centronic-py zu finden. Und um die o.g. Frage zu beantworten: Ja kann es.

halloaber

Eine Frage zur centronic-stick.num Datei:

Wird für jeden Empfänger (Dachfenster/ Rolladen) eine eigene Datei angelegt?
channel 1 centronic-stick.num1
channel 2 centronic-stick.num2
...
oder wie wird die Synchronität beibehalten?
Viele Grüße, Rainer

ole1986

Hallo,

irgendwie habe ich keine Nachrichten erhalten das neue Beiträge in diesem Thread verfügbar sind.

@Beta-User
Zwischenpositionen nur über timings. Mit fehlte dem ROLLO Device immer eine art von intermediate "event" um alles. Siehe: https://forum.fhem.de/index.php/topic,95832.msg958853.html#msg958853

@Phiolin
In der version 0.4 ist dieses dank @toolking implementiert. Dort kannst du mit dem Parameter "--device <host:port>" das Ziel angeben.

@toolking Danke nochmal

@halloaber

TL;DR Es wird keine Sychronität gewährleistet. Es ird immer der letzte werde aus der *.num Datei genommen. Dadurch "verfallen" die möglichen Nummernbereiche für andere channels.
---
Ein sehr guter Hinweis. Derzeit wird die *.num Datei für alle Aufrufe gleichermaßen verwendet. Das heißt wenn du beispielsweise nur channel 1 kontinuierlich öffnest/schließt wird der Wert in der *.num Datei bei jedem Befehl um 1 erhöht.
Nimmst du nun den z.B. Channel 2 wird der zuletzt bekannte Höchstwert aus der *.num verwendet.  Verwendest du beispielsweise den Kanal 15 (vergleichbar eines Broadcast Aufrufes) reagieren alle Kanäle darauf und es wird nur ein (bzw. zwei Zahlen) erhöht.

Falls du irgendwann das maximale limit erreicht heißt, kannst du am besten mit dem Master sender alle anderen bekannten Sender löschen (Dabei bleibt der Mastersender grundsätzlich bestehen) und alle erneut über das Skript einprogrammieren.
Dann fängt der Zählerstand wieder von vorne an.

halloaber

#188
Hallo OLE,
danke für die Bestätigung.
Mein Vorschlag wäre, für jeden Channel eine eigene "num" Datei zu erstellen.
Es ist so wie ich Dein .py verstehe als Schnelllösung kein Problem den als Parameter übergebenen Channel in den Dateinamen einzubauen.
Zeile 10 im Python Script:
number_file = "centronic-stick.num.%s" % (sys.argv[4])
Wünschenswert wäre natürlich, das alles in einer Datei zu machen. Hier musste dann entsprechend der Wert gesucht werden.
Viele Grüße, Rainer

ole1986

@halloaber

Ich stimme da grundsätzlich zu.

Das Problem an dieser Stelle ist vielmehr die Kompatibilität zu dem vorherigen Vorgehen.
Da ich davon ausgehen muss, das die derzeitige Lösung bereits von einigen in Verwendung ist muss ich natürlich dafür sorgen, das von dieser Zahl an alle Channels die "selbe" Nummer erhalten und ab da an dann autonom fortlaufen.

Darf ich Fragen, ob du bereits auf eine Grenze der fortlaufenden Nummer gestoßen bist? Wie ist denn dein derzeitiger Wert in der *.num? Und wie lange ist es im Einsatz?

Nach meiner groben Theorie dürfte es dir bis zu 179 befehle pro Tag erlauben um ein Jahr voll zu bekommen.
Ich persönliche habe höchstens 10 befehle am Tag. Sodass ich mir in ca. 15 Jahren mal Gedanken mach muss die Sender zurückzusetzen.

halloaber

Hallo Ole,
nein ich habe da noch keine Erfahrung. Die Fenster und Rolladen von Roto sind gerade erst eingebaut.
Dennoch sehe ich hier die Gefahr des auseinander laufen.
Gerade wenn es autonom betrieben wird (meine Frau ;-) ) dann muss es immer gehen ohne neu anzulernen.

Viele Grüße, Rainer

toolking

Ich habe mit Hilfe eines Lockfiles im Script die parallele Ausführung verhindert.

https://github.com/toolking/centronic-py/tree/parallel

Das war für mich eine schnelle Lösung.

ole1986

@halloaber

Ich würde gerne noch einmal gezielt fragen was du mit sychronität genau meinst. Ich habe rausbekommen das die fortlaufende Nummer offenbar immer pro Schalter ist (also Fernbedienung, Wandschalter oder Control System). Wobei diese schalte auch mehrere Schalter simulieren können. Z.b. hat die 10 Kanal Fernbedienung mind. 2. Aber genauer werde ich das mit meinem Testrollo durchgehen, sobald der repariert ist.

Außerdem habe ich noch etwas für unsere SDR Cracks.
Der Chip auf dem Rolladen ist ein TDA 5210 von infineon.
Vielleicht hilft das beim Reverse Engineering.

Hier ein Foto und Link
https://www.infineon.com/cms/en/product/rf-wireless-control/wireless-control/wireless-control-receiver/tda5210/

halloaber

Hallo @Ole,
mit der Synchronität  meine ich, dass die Zähler nicht auseinander laufen, wenn ich mit einer num Datei mehrere Rolladen oder Fenster steuere. Ich kenne allerdings nicht die Toleranz für die Zähler.
Ich hatte schon gesehen, dass Du ein einer SQlite Lösung arbeitest.

ole1986

@halloaber,

TL;DR
Die Synchronität wird offenbar immer pro Bedieneinheit (z.B. USB Stick) gewährleistet, da die Rolläden/Dachfenster den internen Zähler pro Bedieneinheit mit jedem Steuerbefehl (unabhängig vom Kanal) mit erhöhen

---

ich kann es noch nicht zu 100% bestätigen aber es liegt dem nahe das der inkrementelle Wert...

* pro Bedienungseinheit ist (z.B. Wandschalter oder USB-Stick mit CentrelControl als device id)
* sich für alle Empfänger erhöht sobald ein Steuerbefehl (od. Anlernen) gedrückt wird
* unabhängig vom Kanal ist

Dazu ein Testzenario
Davon ausgehend das der Inkrementwert derzeit auf 4 für das centronic-py Skript steht

* Steuerbefehl runterfahren für den Kanal 1 ausführen | Rolladen auf Kanal 1 reagiert (Inkrement wird um zwei erhöht - 1x Drücken, 1x Loslassen) / Neuer Wert: 6
* Wert auf 4 zurücksetzten
* Steuerbefehl runterfahren für den Kanal 2 ausführen | Rolladen auf Kanal 2 reagiert nicht / Neuer Wert: 6
* Erneutes absetzen des Steuerbefehl runterfahren für den Kanal 2 | Rolladen auf Kanal 2 reagiert / Neuer Wert: 8

So scheint es das alle Rollläden (unabhängig von Kanalauswahl) jeden Befehl empfangen und den internen Zähler entsprechend der Bedieneinheit erhöhen.

Daher wird die SQLlite Lösung nicht zwangsweise benötigt. Ich möchte in Zukunft eine weitere "virtuelle" Bedieneinheit für den Stick in das Skript implementieren.
Damit könnte man dann beispielsweise zwischen Dachfenster und Rolladen (order Test und Production) unterscheiden. Somit hätte man für die jeweiligen devices separate Zahlenbereiche.

Dafür könnte eine sqllite Lösung dann sinnvoll sein.