Ich habe hier im Forum die ein oder andere Idee bzw. Lösung gesehen, doch leider war das entweder nicht das, was ich benötige weil es z.B. keine Funkrollos waren, nicht ausführlich beschrieben oder es war so komplex (siehe http://www.bastelbudenbuben.de/2017/04/ ... f-motoren/ ), dass man Microelektroniker und Funkelektroniker sein müsste, um das zu verstehen. Das bin ich alles nicht. Deshalb wollte ich es hier mal beschreiben, wie ich es gemacht habe. Vielleicht hilft es dem ein oder anderen, seine Lösung umzusetzen.
Es geht hierbei nicht um eine Einzelsteuerung von Funkrolladen, sondern um eine Lösung zur Gruppensteuerung!
Meine Lösung ist ganz simpel, basiert auf den ein oder anderen, oben erwähnten Forenbeiträgen und besteht aus nur zwei wichtigen Komponenten:
- 1. Der Homematic 4-Kanal Funk Schaltaktor (HM-LC-Sw4-Ba-PCB)
- 2. Ein 16 Kanal Handsender TDRC 16 von Jarolift (wer nur 8 Rollos hat, nimmt den „kleineren“)
Über den 4-Kanal Funk Schaltaktor steuere ich die Betriebszustände „Rauf“, „Runter“, „Stopp“ und „Schatten-Stellung“ aller Rollläden.
Dazu müssen die vorhandenen Codes der Handsender auf den 16 Kanal Handsender übertragen werden. Wie das geht steht in der Jarolift Anleitung des Handsenders bzw. des Motors.
Wenn alle Codes übertragen sind, kann die Gruppensteuerung auf dem 16 Kanal Handsender aktiviert werden. Alle Rollos - (bei mir sind’s 9 mit optionaler Küche wenn wir im Urlaub sind), die gleichzeitig angesteuert werden sollen, werden auf der Fernsteuerung aktiviert.
Der Homematic 4-Kanal Funk Schaltaktor wird angelernt und die Kanäle habe ich wie folgt zugewiesen:
- - Switch1: Rollo-Down
- - Switch2: Rollo-Stop
- - Switch3: Rollo-Up
- - Switch4 bleibt bei mir leer.
Ich lasse mir durch das Skript auch eine Push-Nachricht schicken, wenn die Rollos im Automatic-Modus sind (also über das Zeitprogramm gesteuert werden) und wenn ich darüber aktiv benachrichtigt werden möchte (lPush=true). Damit wird mir der Vorgang incl. Zeitstempel mitgeteilt.
Code: Alles auswählen
string stderr;
string stdout;
var lNotifyActive=dom.GetObject("varRollo-Automatic").State();
var lPush=dom.GetObject("varPushActive").State();
var cUhrzeit=system.Date("%H:%M:%S");
if(lPush && lNotifyActive) {
string cNachricht="Rollo%20down%20mit%20App%20um%20" +cUhrzeit +"%20Uhr";
string url="\"https://api.telegram.org/bot123456789:OioijOIJU9p0hjß0zhgPP/sendMessage?chat_id=1234567&text=" + cNachricht + "\"";
system.Exec("wget --no-check-certificate -q -O - "#url, &stdout, &stderr);
}
Weitere Skripts gibt’s auch für „Rollo-Up“, „Rollo-Stop“ und „Rollo-Shade“. Beim Rollo-Shade drücke ich die Taste 3 Sekunden, damit die Rollos in die Schattenstellung fahren (Einstellung über die Rollo-Fernsteuerung mit 6x Drücken der Stop-Taste in der gewünschten Stellung!).
Bis hierher ist das quasi die Trockenübung und kann nun bereits vom Mobiltelefon getestet werden.
In der CCU kann man zum Testen die Variablen setzen oder die Schaltaktoren aktivieren. Damit die Rollos nun auch in echt fahren, muss der 16-Kanal Handsender aufgeschraubt werden und die Kontakte mit dem 4-Kanal Funk Schaltaktor verbunden werden. Dazu lötet man einfach die Drähte an den Mikrotastern der Fernsteuerung an. Wenn alles geklappt hat, kann man nun alle Rollos gleichzeitig über die Homematic steuern. Da alles mit Batterien funktioniert, kann ich den Bausatz in einem Gehäuse auf dem Schrank "verstecken".
Wer jetzt noch weiteren Komfort einbauen möchte, kann sich mit Hilfe des Astroprogramms die Rollos automatisch zum Sonnenaufgang bzw. -untergang rauf und runter fahren lassen.
Ich habe für mich noch weitere Skripts erstellt, welche mir folgende Situationen abbilden:
- - Mo-Fr über Astroprogramm oder Wunschzeitpunkt hochfahren
- - Mo-So über Astroprogramm oder Wunschzeitpunkt runterfahren
- - Sa-So nur über Wunschzeitpunkt hochfahren (in zwei Stufen, erst halb (Schatten), später komplett hoch)
Dabei gilt bei mir folgendes:
Meine Wunschzeit ist immer zu respektieren, außer der Sonnenaufgang ist später, bzw. der Sonnenuntergang ist früher. Damit möchte ich erreichen, dass die Rollos im Sommer nie z.B. vor 07:00 Uhr hochfahren und am Abend die Rollos definitiv um z.B. 21:00 Uhr herunterfahren, egal welche Zeit das Astro Programm für den Sonnenauf-/untergang vorgibt.
Im Winter soll das Rollo dann nach 07:00 Uhr hochfahren, wenn der Sonnenaufgang z.B. erst um 07:23 Uhr ist, bzw. früher runter, wenn der Sonnenuntergang schon um 17:00 Uhr ist.
Mein Skript wird dabei mit der Zeitsteuerung getriggert: Das ists das Skript zu o.g. Zeitprogramm:
Code: Alles auswählen
!-------- Rollo Up/Down nach Sonnenaufgang/untergang oder Wunschzeit ---------------
!-------- die Rollo hoch Zeit aus der Variable ist der Zeitpunkt, wann der Rollo frühestens hochfahren soll.
!-------- Wenn die Sonne später aufgeht (nach Astro Programm), dann soll der Rollo auch erst zu dieser Zeit hochfahren.
!-------- dadurch wird vermieden, dass im Hochsommer die Rollos vor z.B. 07:20 Uhr hochfahren und im Winter wenn es noch dunkel ist, bereist um 07:20 hochfahen.
!-------- Rollo herunterfahren ist in identischer Weise gelöst.
!--------
!-------- Start des Programmes in Systemlog protokollieren (aus dem Forum)
((dom.GetObject(ID_SYSTEM_VARIABLES)).Get("Programme_loggen")).State("RolloUpDown-Comfort gestartet.");
string stderr;
string stdout;
!-------- Astro Zeiten für Sonnenaufgang/untergang ermitteln-----
string varSunRise = (system.SunriseTime("%H").ToString()) + ":" + system.SunriseTime("%M").ToString();
string varSunSet = (system.SunsetTime("%H").ToString()) + ":" + system.SunsetTime("%M").ToString();
!-------- Wochentag (Integer) ermitteln----- (1=Montag, 2=Dienstag, 3=Mittwoch usw.)
!-------- Rollo Up nur von Montag bis Dienstag, Rollo down die ganze Woche!
integer weekDay = system.Date("%w").ToInteger();
string wday = system.Date("%A");
!-------- Wunschzeiten Hoch/Runter aus Variable auslesen
var varRolloUp = dom.GetObject("Rollo.Zeit.Up").Value();
var varRolloDown = dom.GetObject("Rollo.Zeit.Down").Value();
!-------- Flags holen:
!-------- Rollos Automatik aktiviert? -----
var lRolloAutoEnabled = dom.GetObject("varRollo-Automatic").State();
!-------- PushNachrichten schicken? ----------------------------------
var lPush = dom.GetObject("varPushActive").State();
var cMessageUp = "";
var cMessageDown = "";
var timeUp = "";
var timeDown = "";
var lPushMessage = false;
var varRolloDir = "";
!-------- aktuelle Uhrzeit in Variable schreiben --------
var cUhrzeit = system.Date("%H:%M");
!-------- Wunschzeit oder Astro Zeit? ---------------
!-------- Rollo Up --------
if(varSunRise >= varRolloUp) {
cMessageUp = "zum%20Astro%20Zeitpunkt%20um%20" + varSunRise;
timeUp = varSunRise;
} else {
cMessageUp = "zum%20Wunschzeitpunkt%20" + varRolloUp;
timeUp = varRolloUp;
}
!-------- Rollo down --------
if(varSunSet <= varRolloDown) {
cMessageDown = "zum%20Astro%20Zeitpunkt%20um%20" + varSunSet;
timeDown = varSunSet;
} else {
cMessageDown = "zum%20Wunschzeitpunkt%20" + varRolloDown;
timeDown = varRolloDown;
}
!-------- Falls mal Skript Test nötig ist, ein paar Debugs ausgeben ------
WriteLine("aktuelle Zeit: " + cUhrzeit);
WriteLine("Sonnenaufgang: " + varSunRise);
WriteLine("Sonnenuntergang: " + varSunSet);
WriteLine("WeekDay (" +wday + "): " + weekDay);
WriteLine("Rollo.Up.Wunsch: " + varRolloUp);
WriteLine("Rollo.Down.Wunsch: " +varRolloDown);
WriteLine("Message Up: " + cMessageUp);
WriteLine("Message Down: " + cMessageDown);
WriteLine("effektive timeUp: " + timeUp);
WriteLine("effektive timeDown: " + timeDown);
WriteLine("Push aktiv? " + lPush.ToString());
WriteLine("Rollo Automatik aktiv? " + lRolloAutoEnabled.ToString());
!-------- Rollo timeUp erreicht? --------
if((timeUp == cUhrzeit) && (weekDay >=1) && (weekDay <=5) ) {
string cNachricht="Rollo%20up%20Comfort%20" + cMessageUp;
lPushMessage = true;
varRolloDir = "up";
((dom.GetObject(ID_SYSTEM_VARIABLES)).Get("Programme_loggen")).State("RolloUpDown-Comfort: Rollo up um " +cMessageUp);
}
!-------- Rollo timeDown erreicht? --------
if(timeDown == cUhrzeit) {
string cNachricht="Rollo%20down%20Comfort%20" + cMessageDown;
lPushMessage = true;
varRolloDir = "down";
((dom.GetObject(ID_SYSTEM_VARIABLES)).Get("Programme_loggen")).State("RolloUpDown-Comfort: Rollo down um " +cMessageDown);
}
WriteLine("Uhrzeit jetzt erreicht?: " + lPushMessage.ToString());
WriteLine("ausgeführt wird: " + varRolloDir);
!-------- Dann hoch/runter fahren und Push senden wenn NotifyActive ist und Push aktiviert ist. --------
if(lRolloAutoEnabled ) {
!---- varRolloUp/Down senden!
if(varRolloDir == "up") {
dom.GetObject("varRollo-Up").State(1);
}
if(varRolloDir == "down") {
dom.GetObject("varRollo-Down").State(1);
}
((dom.GetObject(ID_SYSTEM_VARIABLES)).Get("Programme_loggen")).State("RolloUpDown-Comfort Trigger ausgelöst.");
if( lPush && lPushMessage) {
((dom.GetObject(ID_SYSTEM_VARIABLES)).Get("Programme_loggen")).State("RolloUpDown-Comfort PushNachricht gesendet.");
WriteLine("Diese Nachricht wird gepushed:" + cNachricht);
string url="\"https://api.telegram.org/bot123456789:sdgfdasfadfsgafgdfsgdsr56t467zhsdfg/sendMessage?chat_id=23456789&text=" + cNachricht + "\"";
system.Exec("wget --no-check-certificate -q -O - "#url, &stdout, &stderr);
}
}
Ein Programm/Skript ist nie fertig. Wer Potential zur Optimierung sieht oder Fehler erkennt, kann es gerne mitteilen.
Bis dato läuft es bei mir bereits seit einigen Tagen sehr zuverlässig.
Grüße
samstag31