Sonnenstandsberechnung 3.0 für Rollladen, Markisen, Dächer

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

Moderator: Co-Administratoren

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Sonnenstandsberechnung 3.0 für Rollladen, Markisen, Dächer

Beitrag von tsa » 18.03.2015, 15:45

Hallo,

da ich meine komplette Rollladen-Steuerung vom PC auf die CCU2 verlagern möchte, habe ich mich mit diesem Thema mal wieder beschäftigt.
Zwar gibt es schon einige Threads, die sich mit der Sonnenstandsberechnung beschäftigen, für mich waren die aber teilweise zu kompliziert bzw. ungenau.

Wenn man sowieso schon CuxD hat, und Dateien mittels SSH auf die CCU spielen kann, tut's auch das folgende tcl-Skript:

suninfo.cgi

Code: Alles auswählen

#!/bin/tclsh

load tclrega.so
source [file join $env(DOCUMENT_ROOT) once.tcl]
source [file join $env(DOCUMENT_ROOT) cgi.tcl]

cgi_eval {

  ##############################################################################
  # Himmselsrichtungen: Norden = 0° , Osten = 90° , Süden = 180° , Westen = 270°
  # Sonnenhöhenwinkel: Sonnenauf-/untergang = ~0° , Senkrecht von oben = 90°
  # Sonnenwinkel auf Fläche: 0° (flach) .. 90° (senkrecht) , < 0° (im Schatten)
  #  -> Anmerkung: die Sonne kann natürlich nur auf die Fläche scheinen, 
  #                wenn auch Sonnenhöhenwinkel > 0° ist ;-)
  ##############################################################################
  set loglevel 0
  set M_PI 3.14159265359
  
  set DachFlaeche(1,SysVarName)  "SonnenwinkelOstdach"
  set DachFlaeche(1,Dachneigung) 42.0
  set DachFlaeche(1,Richtung)    75.0
  
  set DachFlaeche(2,SysVarName)  "SonnenwinkelWestdach"
  set DachFlaeche(2,Dachneigung) 42.0
  set DachFlaeche(2,Richtung)    255.0
  ##############################################################################

  
  proc log {out} {
    global loglevel
    if {$loglevel > 0} {puts $out}
  }

  
  # Positionseinstellung aus der CCU holen (Breitengrad und Längengrad)
  array set res [rega_script {
    Write (system.Latitude() # ";" # system.Longitude());
 	}]
  set lst [split $res(STDOUT) ";"]
  set lat [lindex $lst 0]
  set lon [lindex $lst 1]
  #log "lat = $lat"
  #log "lon = $lon"


  # Sonnenwinkel für JETZT berechnen
  set systemTime [clock seconds]
  log "systemTime = $systemTime"
  
  # GB: geographische Breite
  set GB $lat
  log "GB = $GB"

  # GBB: geographische Breite im Bogenmaß
  set GBB [expr {$GB*$M_PI/180.0}]
  log "GBB = $GBB"

  # GL: geographische Länge
  set GL $lon
  log "GL = $GL"

  # GM: Meridian (geographische Länge), auf dem die örtliche Standardzeit beruht
  set GM 15.0; # //15° für MEZ

  # N: Nummer des Tages im Jahr
  set N [clock format $systemTime -format %j]
  set N [string trimleft $N 0]
  set N [expr {$N - 1}]
  log "N = $N"

  # Standardzeit (Ohne Sommerzeit)!
  set SZh [clock format $systemTime -gmt 1 -format %H]
  set SZh [string trimleft $SZh 0]
  if {$SZh == ""} {set SZh 0}
  log "SZh = $SZh"
  set SZm [clock format $systemTime -gmt 1 -format %M]
  set SZm [string trimleft $SZm 0]
  if {$SZm == ""} {set SZm 0}
  log "SZm = $SZm"
  set SZ [expr {($SZh + 1.0) + ($SZm / 60.0)}]
  log "SZ = $SZ"

  # B: Jahreskorrekturwinkel
  set B [expr {($N - 1.0) * 2.0 * $M_PI / 365.0}]
  log "B = $B"

  # E: Zeitgleichung (Störungen durch Erdumlauf und Erdrotation)
  set E [expr {229.2 * (0.000075 + 0.001868 * cos($B) - 0.032077 * sin($B) - 0.014615 * cos(2*$B) - 0.04089 * sin(2*$B)) / 60.0}]
  log "E = $E"

  # TS: Sonnenzeit
  set TS [expr {$SZ + $E + 4.0*($GL - $GM) / 60.0}]
  set ts [expr {12.0 - $TS}]
  log "ts = $ts"

  # SzW: Stundenwinkel
  set SzW [expr {$ts * $M_PI/12.0}]
  log "SzW = $SzW"

  # Dekl: Deklination
  set Dekl [expr {(23.45 * $M_PI/180.0) * sin(2.0*$M_PI * (284.0 + $N) / 365.25)}]
  log "Dekl = $Dekl"

  # ShW: Sonnen-Höhenwinkel
  set ShW [expr {asin(sin($GBB) * sin($Dekl) + cos($GBB) * cos($Dekl) * cos($SzW))}]
  log "ShW = $ShW"

  # AzW: Azimutwinkel der Horizontale in GRAD
  set AzW [expr {acos(((sin($GBB) * sin($ShW)) - sin($Dekl)) / (cos($GBB) * cos($ShW))) * 180.0/$M_PI}]
  log "AzW = $AzW"

  if {$ts < 0.0} {
      set AzW [expr {0.0-$AzW}]
  }
  log "AzW = $AzW"

  log "-----------------------------------------------------------------------------"

  # Sonnenhoehenwinkel 0 .. 90 Grad
  set Sonnenhoehenwinkel [expr {$ShW * 180.0/$M_PI}]
  puts "Sonnenhoehenwinkel = $Sonnenhoehenwinkel"

  # Sonnenrichtung 0 .. 360 Grad
  set Sonnenrichtung [expr {180.0 - $AzW}]
  puts "Sonnenrichtung = $Sonnenrichtung"
  
  log "-----------------------------------------------------------------------------"

  proc Ortsvektor {Hoehenwinkel Richtungswinkel} {
    global M_PI
    set hw [expr {$Hoehenwinkel * $M_PI/180.0}]
    set rw [expr {$Richtungswinkel * $M_PI/180.0}]
    set v(x) [expr {sin($hw)}]
    set v(y) [expr {cos($rw)*cos($hw)}]
    set v(z) [expr {sin($rw)*cos($hw)}]
    return [array get v]
  }
  
  proc VektorWinkel {Vektor1 Vektor2} {
    global M_PI
    upvar $Vektor1 v1
    upvar $Vektor2 v2
    return [expr {90.0 - acos($v1(x) * $v2(x) + $v1(y) * $v2(y) + $v1(z) * $v2(z)) * 180/$M_PI}]
  }

  # Ortsvektor der Sonne aus Hoehenwinkel und Himmelsrichtung bestimmen
  array set Ortsvektor_Sonne [Ortsvektor $Sonnenhoehenwinkel $Sonnenrichtung]
  log "Ortsvektor_Sonne = $Ortsvektor_Sonne(x) $Ortsvektor_Sonne(y) $Ortsvektor_Sonne(z)"
  
  # Sonnenwinkel Fläche 1
  array set Einheitsnormale_Flaeche1 [Ortsvektor [expr {90.0 - $DachFlaeche(1,Dachneigung)}] $DachFlaeche(1,Richtung)]
  log "Einheitsnormale_Flaeche1 = $Einheitsnormale_Flaeche1(x) $Einheitsnormale_Flaeche1(y) $Einheitsnormale_Flaeche1(z)"
  set SonnenwinkelFlaeche1 [VektorWinkel Einheitsnormale_Flaeche1 Ortsvektor_Sonne]
 
  # Sonnenwinkel Fläche 2
  array set Einheitsnormale_Flaeche2 [Ortsvektor [expr {90.0 - $DachFlaeche(2,Dachneigung)}] $DachFlaeche(2,Richtung)]
  log "Einheitsnormale_Flaeche2 = $Einheitsnormale_Flaeche2(x) $Einheitsnormale_Flaeche2(y) $Einheitsnormale_Flaeche2(z)"
  set SonnenwinkelFlaeche2 [VektorWinkel Einheitsnormale_Flaeche2 Ortsvektor_Sonne]
  
  log "-----------------------------------------------------------------------------"

  puts "$DachFlaeche(1,SysVarName) = $SonnenwinkelFlaeche1"
  puts "$DachFlaeche(2,SysVarName) = $SonnenwinkelFlaeche2"

	
	array set res [rega_script {

		object o_sysvar;

 		string s_Sonnenhoehenwinkel = "} $Sonnenhoehenwinkel {";
		o_sysvar = dom.GetObject("Sonnenhoehenwinkel");
		o_sysvar.State(s_Sonnenhoehenwinkel);
    
 		string s_Sonnenrichtung = "} $Sonnenrichtung {";
		o_sysvar = dom.GetObject("Sonnenrichtung");
		o_sysvar.State(s_Sonnenrichtung);
    
 		string s_SysVarNameFlaeche1 = "} $DachFlaeche(1,SysVarName) {";
 		string s_SonnenwinkelFlaeche1 = "} $SonnenwinkelFlaeche1 {";
		o_sysvar = dom.GetObject(s_SysVarNameFlaeche1);
		o_sysvar.State(s_SonnenwinkelFlaeche1);
    
 		string s_SysVarNameFlaeche2 = "} $DachFlaeche(2,SysVarName) {";
 		string s_SonnenwinkelFlaeche2 = "} $SonnenwinkelFlaeche2 {";
		o_sysvar = dom.GetObject(s_SysVarNameFlaeche2);
		o_sysvar.State(s_SonnenwinkelFlaeche2);    
 	}]
   
}
Die Namen der Systemvariablen sowie die Parameter für die beiden Flächen können oben im Script angepasst werden. Ebenso könnten weitere Flächen hinzugefügt werden...

Für die Ausführung benötigt man einen CuxD-Timer mit folgenden Einstellungen:
cux-timer.jpg
Das vollständige Kommando unter CMD_EXEC, welches bei mir minütlich ausgeführt wird, lautet:

Code: Alles auswählen

wget -O - 'homematic-ccu2/addons/suninfo.cgi'
Der Pfad ist natürlich anzupassen, je nachdem, wohin man das Script auf die CCU kopiert hat.
Für dieses Beispiel liegt die Datei suninfo.cgi unter: "/usr/local/etc/config/addons/www/"

Außerdem benötigt man in diesem Beispiel folgende Systemvariablen:
SysVar.jpg
Die beiden Namen für die Dachflächen müssen denen im Script entsprechen.
Nun braucht man nur noch kontrollieren, ob Längen- und Breitengrad in den Einstellungen der WEBUI stimmen.

Viel Spaß damit und Gruß
Thomas
Zuletzt geändert von tsa am 20.03.2015, 22:37, insgesamt 2-mal geändert.

joe.oster
Beiträge: 288
Registriert: 17.06.2013, 12:15
Wohnort: NRW
Danksagung erhalten: 2 Mal

Re: Sonnenstandsberechnung 3.0 für Rollladen, Markisen, Däch

Beitrag von joe.oster » 20.03.2015, 12:05

werde ich dann mal testen

Joe

joe.oster
Beiträge: 288
Registriert: 17.06.2013, 12:15
Wohnort: NRW
Danksagung erhalten: 2 Mal

Re: Sonnenstandsberechnung 3.0 für Rollladen, Markisen, Däch

Beitrag von joe.oster » 20.03.2015, 17:57

leider werden bei mir die SysVar nicht befüllt :?

Im CuxD Syslog erscheint folgende Meldung :

Code: Alles auswählen

Mar 20 17:55:30 homematic-ccu2 daemon.info cuxd[31943]: system(wget -O - '/192.168.178.99/addons/suninfo.cgi') exit(1) 0s

oder

Mar 20 18:08:30 homematic-ccu2 daemon.info cuxd[32397]: system(wget -O - '/usr/local/addons/suninfo.cgi') exit(1) 0s

oder

Mar 20 18:31:30 homematic-ccu2 daemon.info cuxd[853]: system(wget -O - 'usr/local/addons/suninfo.cgi') exit(4) 0s
Was kann das sein ???

Joe

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Sonnenstandsberechnung 3.0 für Rollladen, Markisen, Däch

Beitrag von tsa » 20.03.2015, 21:43

Sagt mir erstmal nichts...

1. Wohin hast Du die suninfo.cgi kopiert? (Pfadangabe)
2. Welche "Permissions" sind für die Datei gesetzt? (Sollte zumindest 744 sein)
3. Wie lautet die Adresszeile im Browser, wenn Du die WEBGUI öffnest?
4. Wie lautet bei Dir der Inhalt von CMD_EXEC im zuständigen CuxD-Timer?

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Sonnenstandsberechnung 3.0 für Rollladen, Markisen, Däch

Beitrag von tsa » 20.03.2015, 22:27

Nochmal ein Hinweis:
Die suninfo.cgi liegt bei mir im Verzeichnis "/usr/local/etc/config/addons/www/",
dann kann man sie mit "wget -O - 'homematic-ccu2/addons/suninfo.cgi'" starten.
Permissions = 700

-> Unterverzeichnis www benutzen!
-> Der Name Deiner CCU muss natürlich auch stimmen!

Zum Test kann ich die Datei auch im Browser starten:
http://homematic-ccu2/addons/suninfo.cgi


Gruß
Thomas

joe.oster
Beiträge: 288
Registriert: 17.06.2013, 12:15
Wohnort: NRW
Danksagung erhalten: 2 Mal

Re: Sonnenstandsberechnung 3.0 für Rollladen, Markisen, Däch

Beitrag von joe.oster » 21.03.2015, 12:05

tsa hat geschrieben:Die suninfo.cgi liegt bei mir im Verzeichnis "/usr/local/etc/config/addons/www/"
da liegt meine suninfo.cgi jetzt auch :wink:
tsa hat geschrieben:dann kann man sie mit "wget -O - 'homematic-ccu2/addons/suninfo.cgi'" starten.
Permissions = 700
ich starte die Datei mit "wget -O - '192.168.178.99/addons/suninfo.cgi'", Permissions = 755
das funktioniert aus dem Timer heraus nicht :(
tsa hat geschrieben:Zum Test kann ich die Datei auch im Browser starten:
http://homematic-ccu2/addons/suninfo.cgi
starte ich die Datei aus dem Browser mit
http://192.168.178.99/addons/suninfo.cgi
bekomme ich eine Ausgabe im Browser Fenster und die SysVar werden neu beschrieben. :shock:

Nur der Aufruf aus dem Timer funktioniert nicht :evil:
Suninfo.jpg
Das vollständige Kommando unter CMD_EXEC lautet:

Code: Alles auswählen

wget -O - '192.168.178.99/addons/suninfo.cgi'
Joe
Zuletzt geändert von joe.oster am 21.03.2015, 12:11, insgesamt 2-mal geändert.

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Sonnenstandsberechnung 3.0 für Rollladen, Markisen, Däch

Beitrag von tsa » 21.03.2015, 12:09

Hast Du Deiner CCU einen Namen gegeben? Versuch's mal damit. Oder mit localhost?

joe.oster
Beiträge: 288
Registriert: 17.06.2013, 12:15
Wohnort: NRW
Danksagung erhalten: 2 Mal

Re: Sonnenstandsberechnung 3.0 für Rollladen, Markisen, Däch

Beitrag von joe.oster » 21.03.2015, 12:15

tsa hat geschrieben:Hast Du Deiner CCU einen Namen gegeben? Versuch's mal damit. Oder mit localhost?
einen Namen hat die CCU2 aber der funktionert auch nur im Browser nicht im Timer :(

localhost funktioniert auch nicht

Das einzige was ich an meiner CCU2 deaktiviert habe ist Java

Joe
Zuletzt geändert von joe.oster am 21.03.2015, 12:18, insgesamt 1-mal geändert.

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Sonnenstandsberechnung 3.0 für Rollladen, Markisen, Däch

Beitrag von tsa » 21.03.2015, 12:16

Java habe ich auch ausgeschaltet.

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Sonnenstandsberechnung 3.0 für Rollladen, Markisen, Däch

Beitrag von tsa » 21.03.2015, 12:51

...und wenn Du mal das "http://" noch davor schreibst? Bei mir geht's zwar auch ohne, aber MIT geht's auch. Ansonsten habe ich keine Idee, warum das nicht gehen soll, wenn's im Browser läuft.

Hast Du noch andere Timer mit wget, funktionieren die denn?

Antworten

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