Ultimative Rolladensteuerung

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Andy1981
Beiträge: 296
Registriert: 25.12.2015, 08:41

Re: Ultimative Rolladensteuerung

Beitrag von Andy1981 » 09.01.2016, 21:05

Habe mir das ganze jetzt auch mal eingebaut. Beim ersten Test kommt folgende Meldung im Systemprotokoll:

Was genau ist denn hier falsch bzw. wo?

Erwähnen möchte ich noch, dass ich das "28 Exec-Gerät mit Seriennummer 1 anlegen" übersprungen habe, da dieser bei mir schon existiert... Weiß nicht, ob das von Bedeutung ist.
Dateianhänge
timer2.jpg
timer.jpg
Andy

Hundsbuah
Beiträge: 3
Registriert: 20.10.2015, 12:37

Re: Ultimative Rolladensteuerung

Beitrag von Hundsbuah » 11.01.2016, 16:23

Hab leider genau das gleiche Problem:

Jan 11 16:19:23 homematic-ccu2 daemon.info cuxd[1790]: pclose(/usr/local/GetAstroDates.sh 11:36:0.0 48:6:0.0) exit(127) 0s
Jan 11 16:19:23 homematic-ccu2 local0.err ReGaHss: Error: IseXmlRpc::CallGetValue: XmlrpcTypeToIseVal failed [../Platform/DOM/iseXmlRpc.cpp (1455)]
Jan 11 16:19:23 homematic-ccu2 local0.err ReGaHss: Error: IseHssDP::ReadValue: CallGetValue failed; sVal = [../Platform/DOM/iseDOMdpHSS.cpp (130)]
Jan 11 16:19:38 homematic-ccu2 local0.err ReGaHss: Error: IseXmlRpc::GetObjectByHSSAddress: no exists device object with address= 3014F711A00003522998D1BD [../Platform/DOM/iseXmlRpc.cpp (2166)]

Weiß mittlerweile wer was schief läuft?

/edit:

Wenn ich es ausführe, bekomme ich folgendes:
./GetAstroDates.sh 8:12:34.35698 50:12:34:1345
bash: ./GetAstroDates.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden

und mit

sh GetAstroDates.sh 8:12:34.35698 50:12:34:1345
: not foundes.sh: 2: GetAstroDates.sh:
GetAstroDates.sh: 9: GetAstroDates.sh: Syntax error: end of file unexpected (expecting "then")


Script ist aber meiner Meinung nach korrekt:

Code: Alles auswählen

#!/bin/bash

if [ $# -lt 2 ]; then
   echo "Fehlerhafter Aufruf!"
   echo "Es müssen 2 Parameter übergeben werden, der Erste ist der Längengrad, der Zweite der Breitengrad:"
   echo "z. B. ./GetAstroDates.sh 8:12:34.35698 50:12:34.13711"
fi

wget -q --header="User-Agent: Mozilla" "http://www.calsky.com/cs.cgi/Sun/2?lang=de&showtwilight=true&hideglos=true&dateNow&lon=${1}&lat=${2}" -O - | sed -e 's/[<]/\n&/g;s/&nbsp;//g;/class="caltab"/,/<\/table>/!d' | sed -e 's/\(<b>\|<tt>\)//g;/\(Aufgang\|Untergang\|Begin\|Morgen\)/!d;s/\(Ende\|Abend\|Tag\)/\n&/g' | sed -e ':a;N;$!ba;s/\n/;/g;s/ //g;s/:/-/g;s/h/:/g;s/m//g;s/ ;/;/g'

Andy1981
Beiträge: 296
Registriert: 25.12.2015, 08:41

Re: Ultimative Rolladensteuerung

Beitrag von Andy1981 » 11.01.2016, 23:21

Nachdem hier keiner mehr aktiv ist - scheinbar - habe ich die ganze Geschichte hier wieder rückgängig gemacht u. mit der Astrofunktion u. einer zusätzlichen Regel umgesetzt. Mit eigentlich dem selben Ergebnis. Ich bin aus diesem Thema raus. :)
Andy

Luckysnooze
Beiträge: 35
Registriert: 26.02.2016, 20:38

Re: Ultimative Rolladensteuerung

Beitrag von Luckysnooze » 26.02.2016, 23:44

Da ein Bekannter von mir die HomeMatic-Steuerung auf meinem Raspberry-Pi gesehen hat, kam er auf die Idee so etwas für seine Rolladensteuerung zu benutzen. Nachdem ich im Netz etwas gesucht hatte, bin ich schließlich hier bei der "Ultimativen Rolladensteuerung" gelandet. Vom Konzept überzeugt, installierte ich die Geschichte und machte mich dann als Script-Newbie daran die Script-Funktionen zu verstehen (gibt es eigentlich irgendwo eine vollständige Dokumentation sämtlicher Befehle und Optionen?). Absicht war es, eine Rolladen-Öffnen und eine Frühestens-Spätestens-Funktion hinzuzufügen und einige Scriptteile zu verschlanken. Während des Programmierens fiel mir dann auf, dass einige vom Web geholten Zeiten nur 3-Stellig waren, was dem .ToTime() Befehl durchaus Probleme bereitet und angepasst werden musste. Herausgekommen ist unten stehendes Script. Da es auf der Idee von Linuzer basiert, möchte ich es hier zur Verfügung stellen. Wenn jemand noch Fehler findet - bitte posten.

Zur Einrichtung:

Punkt 1 -> 3 wie bei Linuzer

Punkt 4:
Systemvariablen für die Steuerung anlegen:

Rolladen_Zu_Basis (Zeichenkette) Name der obigen Variable, die als Ausgangszeitpunkt für die Rolläden dienen soll. (z.B. "Sonnenuntergang")

Rolladen_Zu_Offset (Zahl 0/100 %) Prozentwert, um den der Rolladenzeitpunkt in Richtung des nächsten Zeitpunkts verschoben werden soll. "100%" ist identisch mit dem nächsten Zeitpunkt.
Beispiel:
Sonnenuntergang = 17:40, EndBuergDaemm = 18:10, Rolladen_Zu_Basis = "Sonnenuntergang", Rolladen_Zu_Offset = 60%
Somit wird auf die Sonnenuntergangszeit (17:40) 60% der Zeitspanne zu EndBuergDaemm (30 Min.) draufgeschlagen, die Rolläden fahren also um 17:58 runter.

Rolladen_Auf_Basis (Zeichenkette) Name der obigen Variable, die als Ausgangszeitpunkt für die Rolläden dienen soll. (z.B. "BeginBuergDaemm")

Rolladen_Auf_Offset (Zahl 0/100 %) Prozentwert, um den der Rolladenzeitpunkt in Richtung des nächsten Zeitpunkts verschoben werden soll. "100%" ist identisch mit dem nächsten Zeitpunkt.
Beispiel:
BeginBuergDaemm = 7:10, Sonnenaufgang = 7:40, Rolladen_Auf_Basis = "BeginBuergDaemm", Rolladen_Auf_Offset = 20%
Somit wird auf die BeginBuergDaemmZeit (7:10) 20% der Zeitspanne zum Sonnenaufgang (30 Min.) draufgeschlagen, die Rolläden fahren also um 7:16 rauf.

RolladenAuf (Zeichenkette) Dynamisch errechneter Öffnen-Zeitpunkt, nur zur Info
RolladenZu (Zeichenkette) Dynamisch errechneter Schließen-Zeitpunkt, nur zur Info

Punkt 5:
Ein "Rolläden schließen" Programm erstellen, das alle Rolläden zum Timer_Event des CUxD.CUX2800001:1-Timers runterfährt. (TriggerRolladen:1)
Ein "Rolläden öffnen" Programm erstellen, das alle Rolläden zum Timer_Event des CUxD.CUX2800001:2-Timers rauffährt. (TriggerRolladen:2)

Bild

Punkt 6 wie bei Linuzer

Punkt 7:
HomeMatic-Script "AstroDatenHolen" erstellen und auf tägliche Ausführung um z.B. 01:45 programmieren. Zu diesem Zeitpunkt muss eine Internet-Verbindung bestehen. (Zwangstrennung des I-Net Providers beachten). Am Anfang des Scriptes die persönlichen Einstellungen treffen. Beachte Uhrzeit-Angaben müssen im Format HH:MM vorliegen.

Code: Alles auswählen

        ! Astro Daten holen - Zeitpunkte setzen V1.05

        ! -------------------- Schliessen Anpassungen ---------------------
        !  Sonnenuntergang -> EndBuergDaemm -> EndNautDaemm -> EndAstroDaemm
        var Zeit1_Zu = "Sonnenuntergang"; ! (Fruehere Zeit)
        var Zeit2_Zu = "EndBuergDaemm"; ! (Spaetere Zeit)
        var Offset_Zu = 85.0; ! (0.0 -> 100.0 %)
        var Spaet_Zu = "22:00"; ! (Spaetester Schliessenzeitpunkt HH:MM)
        ! ---------------------- Oeffnen Anpassungen ----------------------
        !  BeginAstroDaemm -> BeginNautDaemm -> BeginBuergDaemm -> Sonnenaufgang
        var Zeit1_Auf = "BeginBuergDaemm"; ! (Fruehere Zeit)
        var Zeit2_Auf = "Sonnenaufgang"; ! (Spaetere Zeit)
        var Offset_Auf = 15.0; ! (0.0 -> 100.0 %)
        var Frueh_Auf = "06:30"; ! (Fruehester Oeffnenzeitpunkt HH:MM)
        ! ------------------------ Ende Anpassung -------------------------


        var Grad;
        var Min;
        var Sek;
        var Rest;
        var Long;
        var Lat;

        var cmd;
        var Return;
        string Zeitpunkte;
        integer Zaehler;
        string Wert;
        string Tmp;
        var val;

        var Rolladen_Zu;
        var Rolladen_Auf;

           ! Aktuelles Datum im Format JJJJ-MM-TT
        var System_Datum = system.Date("%F");

           ! Laengengrad auslesen und von Dezimal nach Grad:Min:Sek.Hdstl wandeln
        Grad = 1 * system.Longitude();
        Rest = (system.Longitude() - Grad) + 0.0000001;
        Min = 1 * Rest * 60;
        Rest = (Rest * 60) - Min;
        Sek = Rest * 60;
        Long = Grad # ":" # Min # ":" # Sek.ToString(2);

           ! Breitengrad auslesen und von Dezimal nach Grad:Min:Sek.Hdstl wandeln
        Grad = 1 * system.Latitude();
        Rest = (system.Latitude() - Grad) + 0.0000001;
        Min = 1 * Rest * 60;
        Rest = (Rest * 60) - Min;
        Sek = Rest * 60;
        Lat = Grad # ":" # Min # ":" # Sek.ToString(2);

           ! Befehl zusammenbauen
        cmd = "/usr/local/GetAstroDates.sh " # Long # " " # Lat;

           ! Befehl ausfuehren: Werte von Website holen
        dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
        dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
        Return = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();

           ! Werte um Steuerzeichen kuerzen
        Return = Return.Substr(0, Return.Length() - 1);
           ! Werte auslesen und in Systemvariablen schreiben
        Zeitpunkte = "Sonnenaufgang,Sonnenuntergang,BeginBuergDaemm,EndBuergDaemm,BeginNautDaemm,EndNautDaemm,Tageslaenge,BeginAstroDaemm,EndAstroDaemm";
        Zaehler = 0;
        foreach(Wert, Zeitpunkte.Split(",")) {;
          Tmp = Return.StrValueByIndex(";", Zaehler).StrValueByIndex("-", 1);
          val = 100 + Tmp.StrValueByIndex(".", 1).ToInteger() * 6;
          Tmp = Tmp.StrValueByIndex(".", 0) # ":" # val.ToString().Substr(1, 2);
          dom.GetObject(Wert).State(Tmp);
          Zaehler = Zaehler + 1;}

           ! Schreibe Rolladen-Konfiguration in Systemvariablen
        dom.GetObject("Rolladen_Zu_Basis").State(Zeit1_Zu);
        dom.GetObject("Rolladen_Zu_Offset").State(Offset_Zu);
        dom.GetObject("Rolladen_Auf_Basis").State(Zeit1_Auf);
        dom.GetObject("Rolladen_Auf_Offset").State(Offset_Auf);

           ! Schliessen - Zeiten einlesen
        Zeit1_Zu = dom.GetObject(Zeit1_Zu).Variable();
        Zeit2_Zu = dom.GetObject(Zeit2_Zu).Variable();
           ! Schliessen - Datum und Zeiten in Ganzzahl wandeln
        Zeit1_Zu = System_Datum # " " # Zeit1_Zu;
        Zeit1_Zu = Zeit1_Zu.ToTime().ToInteger();
        Zeit2_Zu = System_Datum # " " # Zeit2_Zu;
        Zeit2_Zu = Zeit2_Zu.ToTime().ToInteger();
        Spaet_Zu = System_Datum # " " # Spaet_Zu;
        Spaet_Zu = Spaet_Zu.ToTime().ToInteger();
           ! Schliessen - Zeit berechnen und mit Spaet_Zu vergleichen
        Rolladen_Zu = Zeit1_Zu + (0.0 + Zeit2_Zu - Zeit1_Zu) * Offset_Zu / 100.0;
        if (Rolladen_Zu > Spaet_Zu) {Rolladen_Zu = Spaet_Zu;}
           ! Schliessen - Zeit von Ganzzahl nach HH:MM:SS wandeln
        Rolladen_Zu = Rolladen_Zu.ToTime().Format("%T");

           ! Oeffnen - Zeiten einlesen
        Zeit1_Auf = dom.GetObject(Zeit1_Auf).Variable();
        Zeit2_Auf = dom.GetObject(Zeit2_Auf).Variable();
           ! Oeffnen - Datum und Zeiten in Ganzzahl wandeln
        Zeit1_Auf = System_Datum # " " # Zeit1_Auf;
        Zeit1_Auf = Zeit1_Auf.ToTime().ToInteger();
        Zeit2_Auf = System_Datum # " " # Zeit2_Auf;
        Zeit2_Auf = Zeit2_Auf.ToTime().ToInteger();
        Frueh_Auf = System_Datum # " " # Frueh_Auf;
        Frueh_Auf = Frueh_Auf.ToTime().ToInteger();
           ! Oeffnen - Zeit berechnen und mit Frueh_Auf vergleichen
        Rolladen_Auf = Zeit1_Auf + (0.0 + Zeit2_Auf - Zeit1_Auf) * Offset_Auf / 100.0;
        if (Rolladen_Auf < Frueh_Auf) {Rolladen_Auf = Frueh_Auf;}
           !Oeffnen - Zeit von Ganzzahl nach HH:MM:SS wandeln
        Rolladen_Auf = Rolladen_Auf.ToTime().Format("%T");

           ! Schliessen und Oeffnen Zeiten speichern und Timer setzen
        dom.GetObject("RolladenZu").State(Rolladen_Zu);
        dom.GetObject("CUxD.CUX2800001:1.TIMER_SET").State(Rolladen_Zu);
        dom.GetObject("RolladenAuf").State(Rolladen_Auf);
        dom.GetObject("CUxD.CUX2800001:2.TIMER_SET").State(Rolladen_Auf);
Update 28.02.16 V1.02: Antwort-String um Steuerzeichen gekürzt
Update 03.03.16 V1.03: Kleinere Korrekturen
Update 02.05.16 V1.05: Fehler in der Umrechnung der Geodaten behoben




Punkt 8 hoffentlich auch wie bei Linuzer

@ Linuzer
Beim Studieren Deines Script sind mir zwei kleine "Fehler" aufgefallen:
Zeile 045: ! Befehl ausführen: -> hier müsste das ü gegen ue ersetzt werden
Zeile 128: RollZeit2 = "Sonnenuntergang,EndBuergDaemm,EndNautDaemm,EndAtroDaemm,BeginAtroDaemm -> hier fehlt jeweils das "s" bei Astro


Gruß
Luckysnooze
Zuletzt geändert von Luckysnooze am 02.05.2016, 13:38, insgesamt 9-mal geändert.

Benutzeravatar
robbi77
Beiträge: 8364
Registriert: 19.01.2011, 19:15
Wohnort: Landau

Ultimative Rolladensteuerung

Beitrag von robbi77 » 27.02.2016, 10:14

Zur Script Doku:
http://www.eq-3.de/downloads.html


Gruß
Roberto
Bei Risiken und Nebenwirkungen fragen Sie den Elektriker Ihres geringsten Mißtrauens!
http://www.eq-3.de/service/downloads.html
Tips und Tricks für Anfänger: viewtopic.php?t=22801
Programmlogik: viewtopic.php?f=31&t=4251
Webui-Handbuch: https://www.eq-3.de/Downloads/eq3/downl ... h_eQ-3.pdf
Script und Linksammlung: viewtopic.php?f=26&t=27907

Luckysnooze
Beiträge: 35
Registriert: 26.02.2016, 20:38

Re: Ultimative Rolladensteuerung

Beitrag von Luckysnooze » 27.02.2016, 13:33

Hallo Roberto,

diese offizielle Doku war mir schon bekannt. Sie ist nur leider nicht sehr ausführlich was die Script-Syntax angeht und manchmal fehlen auch einfach die Optionen. Bei der ToString() Funktion wird z.B. nicht erwähnt, dass mit ToString(2) eine Begrenzung auf zwei Nachkommastellen möglich ist. Die Kaskadierung von Funktionen wie z.B. .ToString().Substr(1, 2) wird ebenso nicht genannt. Haben andere Funktionen eventuell auch noch weitere Optionen?

Die Beispiele in Teil 3 sind wohl eher eine Promotion für den Kombisensor und die 19 Tastenfernbedienung (beide sauteuer). Diese Beispiele gehören in das Manual der entsprechenden Hardware. Hier hätte ich viel mehr erwartet.

Dachte es gäbe vielleicht noch etwas ausführlicheres mit mehr Scriptbeispielen.

Trotzdem Danke und Gruß
Luckysnooze

Franzens
Beiträge: 126
Registriert: 18.04.2014, 17:11

Re: Ultimative Rolladensteuerung

Beitrag von Franzens » 28.02.2016, 10:54

Vielen Dank - das ist genau das was ich die ganze Zeit vermisst hatte.
Endlich ist es auch möglich die Zahlen vernünftig in einen Timer zu schreiben.
Nur den letzten Zeitpunkt (EndAstroDaemm) schreibt es mir in der Form 19:40 :00 - woran kann das liegen?

Franzens
RasberryMatic auf Tinker S- Sonos - pocket Control HM - EMail - CuL V2 868mHz & Somfy RTS Anbindung - Wunderground - Calsky Astro - Pushover - hm-pdetect - homebridge - Alexa - Netatmo...;219 Kanäle in 84 Geräten und 75 CUxD-Kanäle in 7 CUxD-Geräten

Luckysnooze
Beiträge: 35
Registriert: 26.02.2016, 20:38

Re: Ultimative Rolladensteuerung

Beitrag von Luckysnooze » 28.02.2016, 12:41

Hallo Franzens,

genau das habe ich gestern auch bei mir festgestellt. Ich habe daraufhin den Return-String, der die Daten vom Web enthält, mal manuell mit Daten befüllt. Das Ergebnis war korrekt. "EndAstroDaemm" ist der letzte Wert im Return-String, der aber das selbe Format hat, wie der Wert davor (sitzt da vielleicht noch ein nicht sichtbares Steuerzeichen dahinter?). Du siehst mich ratlos, aber aufgeben gilt nicht.

Update: Wenn man an den Return-String noch einen String dranhängt kommt es zum Zeilenumbruch. Da ist also noch ein Steuerzeichen am Ende des Strings vorhanden. Ich habe den String um das Steuerzeichen gekürzt. Es sollte jetzt funktionieren.

Gruß
Luckysnooze

Franzens
Beiträge: 126
Registriert: 18.04.2014, 17:11

Re: Ultimative Rolladensteuerung

Beitrag von Franzens » 03.03.2016, 20:42

Luckysnooze hat geschrieben: Update: Wenn man an den Return-String noch einen String dranhängt kommt es zum Zeilenumbruch. Da ist also noch ein Steuerzeichen am Ende des Strings vorhanden. Ich habe den String um das Steuerzeichen gekürzt. Es sollte jetzt funktionieren.

Gruß
Luckysnooze
Respekt es funktioniert! Ich habs inzwischen auf tmp-Variablen umgestellt analog dem von AndiN vorgestellten Verfahren (http://homematic-forum.de/forum/viewtop ... 26&t=27907). Könnt ich dort, wenn für Dich ok zur Verfügung stellen.

Gruß Franzens
RasberryMatic auf Tinker S- Sonos - pocket Control HM - EMail - CuL V2 868mHz & Somfy RTS Anbindung - Wunderground - Calsky Astro - Pushover - hm-pdetect - homebridge - Alexa - Netatmo...;219 Kanäle in 84 Geräten und 75 CUxD-Kanäle in 7 CUxD-Geräten

Luckysnooze
Beiträge: 35
Registriert: 26.02.2016, 20:38

Re: Ultimative Rolladensteuerung

Beitrag von Luckysnooze » 03.03.2016, 21:17

Na klar, kein Problem.


Gruß
Luckysnooze

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“