[ASC] Hilfe beim Einrichten

Begonnen von Eistee, 13 April 2020, 21:39:43

Vorheriges Thema - Nächstes Thema

CoolTux

Es wird jedes mal wenn die Routine aufgerufen wird abgefragt und entsprechend nachjustiert.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Eistee

#31
Heißt das müsste so funktionieren:
attr mz.HM.Rollo ASC_Shading_Pos { RolladenHitze(222, 50, 75.4, 12, 273) }

99_myUtils.pmsub RolladenHitze {
my $C_HOEHE = $_[0]; # 0: Höhe (cm) = sichtbare Höhe des Fensters (Glas innerhalb des Rahmens)
my $C_TIEFE = $_[1]; # 1: Tiefe (cm) = Wie weit darf die Sonne "ins Fenster" scheinen (vom Fensteraussenscheibe messen!)
my $C_DACHWINKEL = $_[2]; # 2: Dachwinkel (Grad) = native Neigung der Fensterscheibe (=Dach), bzw. 90° bei "normalen" Wandfenstern
my $C_AUFBAU = $_[3]; # 3: Aufbauhöhe (cm) = Wieviel cm tragen Rollläden, Wandvorsprünge, etc. zur Fensterscheibe auf?
my $C_F_AUSRICHTUNG = $_[4]; # 4: Fensterausrichtung (Grad) = In welche Himmelsrichtung "schaut" das Fenster? -> Senkrechte auf die Scheibe, Nord = 0°, Süd = 180°

# allgemeine Variablen/Konstanten
my $pi = 3.1415926535897932;
my @V_Rollo = (0, 0, 0); # Vektor Rollo
my @V_Sonne = (0, 0, 0); # Vektor Sonne
my $Aufbauwinkel = 0;
my $Gesamtneigung = 0;
my $Theta = 0;
my $Phi = 0;
my $Winkel = 0;
my $RolloPos = 0;

    my $Elev = ReadingsVal('xx.Astro', 'SunAlt', '0');
my $Azim = ReadingsVal('xx.Astro', 'SunAz', '0');

# rad = grad * pi / 180; grad = rad * 180 / pi

# Sonnenvektor berechnen
$Theta = (90 + $Elev) * ($pi / 180);
$Phi = $Azim * ($pi / 180);

$V_Sonne[0] = sin($Theta) * sin($Phi);
$V_Sonne[1] = cos($Theta);
$V_Sonne[2] = sin($Theta) * cos($Phi) * -1;

# Gesamtneigung berechnen
$Aufbauwinkel = atan2($C_AUFBAU, $C_HOEHE) * (180 / $pi);
$Gesamtneigung = $C_DACHWINKEL + $Aufbauwinkel;

# Rollo-Vektor berechnen
$Theta = (90 + $Gesamtneigung) * ($pi / 180);
$Phi = $C_F_AUSRICHTUNG * ($pi / 180);

$V_Rollo[0] = sin($Theta) * sin($Phi) * -1;
$V_Rollo[1] = cos($Theta);
$V_Rollo[2] = sin($Theta) * cos($Phi) * -1;

# Sonnenwinkel auf Fensterfläche berechnen (=Winkel der beiden Vektoren)
$Winkel = acos(($V_Rollo[0] * $V_Sonne[0] + $V_Rollo[1] * $V_Sonne[1] + $V_Rollo[2] * $V_Sonne[2]) /
  (sqrt($V_Rollo[0] ** 2 + $V_Rollo[1] ** 2 + $V_Rollo[2] ** 2) *
  sqrt($V_Sonne[0] ** 2 + $V_Sonne[1] ** 2 + $V_Sonne[2] ** 2)));

$RolloPos = ((($C_TIEFE + $C_AUFBAU) / tan($Winkel)) / $C_HOEHE) * 100;

if ($RolloPos < 0) {$RolloPos = 0};
if ($RolloPos > 100) {$RolloPos = 100};

$RolloPos = (round($RolloPos / 5) * 5);
return $RolloPos;
}


Ich werde berichten  :)

CoolTux

Sieht gut aus. Ich wäre auf jeden Fall am Ergebnis interessiert.

Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Eistee

#33
Das scheint leider nicht zu funktionieren. Beim beschatten in lieferte die Funktion 85 und er fuhr meine Jalousie auf 85%. Inzwischen liefert die Funktion 0 für (ganz unten) aber das Rollo steht immer noch auf 85. Die Helligkeit ist inzwischen allerdings zu gering so das er eigentlich auf 100% (ganz oben) fahren sollte was auch nicht passiert.

PS: Hab das Script im anderen post nochmal aktualisiert so das er immer nur in 5% Schritten einen wert liefert.

CoolTux

Raus fahren wird er jetzt nicht mehr da ja der derzeitige Stand 85 nicht die Beschattungsposition ist.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Eistee

Zitat von: CoolTux am 03 Mai 2020, 19:13:42
Raus fahren wird er jetzt nicht mehr da ja der derzeitige Stand 85 nicht die Beschattungsposition ist.
Doch diese 85 ist als Beschattungsposition angefahren wurden. Im ASC_ShuttersLastDrive stand ja auch noch shading in

CoolTux

Ja schon, aber zum Zeitpunkt der Entschattung hast ja selbst gesagt war die ShadinPos eigentlich 0, doch da stand das Rollo ja nicht.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Eistee

Kann man diese "Prüfung" der aktuellen Position irgendwie deaktivieren?
Das Modul kann ja feststellen wenn ein Rollo extern gefahren wird und kann sich auch merken wenn es selbst dieses gefahren hat.
Der Sinn dahinter die aktuelle Position da noch irgendwie auszuwerten erschließt sich mir da nicht.

Wenn ich ein Rollo von Hand irgend wo hin fahre soll es ja auch entschatten wenn die Sonne untergegangen ist (nach Ablauf der blockingtime). Schließlich ist dann ja "Schatten".

CoolTux

Der Sinn dahinter ist das das Rollo weiß wieso es sich gerade genau in dieser Position befindet und ich dies abfrage.
Ist das Rollo auf 30 wegen lüften oder wegen Beschatten oder oder.
Teste mal bitte noch etwas.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Eistee

Dann hab ich nicht verstanden wofür das reading ASC_ShuttersLastDrive da ist.

CoolTux

Zitat von: Eistee am 04 Mai 2020, 17:17:03
Dann hab ich nicht verstanden wofür das reading ASC_ShuttersLastDrive da ist.

Es dient lediglich zur Info des Users. Intern wird alles mit Hilfe der Position analysiert. Man kann schlecht Nummerische Werte und Strings vergleichen. Wie soll ich raus finden ob der aktuelle Stand unterhalb oder oberhalb der Fenster offen Position ist, geht schlecht mit String.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Eistee

Nochmal eine Frage:

Welche readings muss ich nach einer manuellen Fahrt wie setzen so das das ASC Modul denkt das es In der Beschattungsposition steht.

Nach dieser manuellen fahrt ist die Jalousieposition gleich wie ASC_Shading_Pos.

Oder falls das nicht geht. Kann ich in dem Script welches bei ASC_Shading_Pos hinterlegt ist irgendwie einen Fahrbefehl auslösen ohne das dieser als manuelle fahrt erkannt wird?

CoolTux

Zitat von: Eistee am 08 Mai 2020, 13:48:13
Nochmal eine Frage:

Welche readings muss ich nach einer manuellen Fahrt wie setzen so das das ASC Modul denkt das es In der Beschattungsposition steht.

Nach dieser manuellen fahrt ist die Jalousieposition gleich wie ASC_Shading_Pos.

Oder falls das nicht geht. Kann ich in dem Script welches bei ASC_Shading_Pos hinterlegt ist irgendwie einen Fahrbefehl auslösen ohne das dieser als manuelle fahrt erkannt wird?

Sobald die Beschattung an sich erkannt wurde "in" und Du dann eine manuelle Fahrt vor nimmst bleibt die Beschattungssteuerung deaktiviert bis wieder eine vollständige Entschattung statt gefunden hat.

Im Perlcode darf als Rückgabe ausschließlich eine gültige Positionsangabe raus kommen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Eistee

So hab eine Lösung gefunden. Mich würde mal interessieren was du davon hältst :)

################################
###     Rolladensteuerung    ###
################################
# Beispiel: attr mz.HM.Rollo ASC_Shading_Pos { RolladenHitze(222, 20, 75.4, 2, 273, "mz.HM.Rollo") }

sub RolladenHitze {
my $C_HOEHE = $_[0]; # 0: Höhe (cm) = sichtbare Höhe des Fensters (Glas innerhalb des Rahmens)
my $C_TIEFE = $_[1]; # 1: Tiefe (cm) = Wie weit darf die Sonne "ins Fenster" scheinen (vom Fensteraussenscheibe messen!)
my $C_DACHWINKEL = $_[2]; # 2: Dachwinkel (Grad) = native Neigung der Fensterscheibe (=Dach), bzw. 90° bei "normalen" Wandfenstern
my $C_AUFBAU = $_[3]; # 3: Aufbauhöhe (cm) = Wieviel cm tragen Rollläden, Wandvorsprünge, etc. zur Fensterscheibe auf?
my $C_F_AUSRICHTUNG = $_[4]; # 4: Fensterausrichtung (Grad) = In welche Himmelsrichtung "schaut" das Fenster? -> Senkrechte auf die Scheibe, Nord = 0°, Süd = 180°
my $shutterDev = $_[5]; # 5: Rolladen Gerät

# allgemeine Variablen/Konstanten
my @V_Rollo = (0, 0, 0); # Vektor Rollo
my @V_Sonne = (0, 0, 0); # Vektor Sonne
my $Aufbauwinkel = 0;
my $Gesamtneigung = 0;
my $Theta = 0;
my $Phi = 0;
my $Winkel = 0;
my $RolloPos = 0;
my $Raster = 5; # Position in x% Schritten berechnen

my $ascDev   = ASC_Dev->new();
my $shutters = ASC_Shutters->new();
$shutters->setShuttersDev($shutterDev);

# Sonnenvektor berechnen
$Theta = deg2rad(90 + $ascDev->getElevation);
$Phi = deg2rad($ascDev->getAzimuth);

$V_Sonne[0] = sin($Theta) * sin($Phi);
$V_Sonne[1] = cos($Theta);
$V_Sonne[2] = sin($Theta) * cos($Phi) * -1;

# Gesamtneigung berechnen
$Aufbauwinkel = rad2deg(atan2($C_AUFBAU, $C_HOEHE));
$Gesamtneigung = $C_DACHWINKEL + $Aufbauwinkel;

# Rollo-Vektor berechnen
$Theta = deg2rad(90 + $Gesamtneigung);
$Phi = deg2rad($C_F_AUSRICHTUNG);

$V_Rollo[0] = sin($Theta) * sin($Phi) * -1;
$V_Rollo[1] = cos($Theta);
$V_Rollo[2] = sin($Theta) * cos($Phi) * -1;

# Sonnenwinkel auf Fensterfläche berechnen (=Winkel der beiden Vektoren)
$Winkel = acos((($V_Rollo[0] * $V_Sonne[0]) + ($V_Rollo[1] * $V_Sonne[1]) + ($V_Rollo[2] * $V_Sonne[2])) / (sqrt(($V_Rollo[0] * $V_Rollo[0]) + ($V_Rollo[1] * $V_Rollo[1]) + ($V_Rollo[2] * $V_Rollo[2])) * sqrt(($V_Sonne[0] * $V_Sonne[0]) + ($V_Sonne[1] * $V_Sonne[1]) + ($V_Sonne[2] * $V_Sonne[2]))));

# Winkel > 90 korrigieren
if (rad2deg($Winkel) > 90) {
$Winkel = deg2rad(90 - (rad2deg($Winkel) - 90));
}

$RolloPos = ((($C_TIEFE + $C_AUFBAU) / tan($Winkel)) / $C_HOEHE) * 100.0;
if ($RolloPos < 0.0) {$RolloPos = 0.0};
if ($RolloPos > 100.0) {$RolloPos = 100.0};
$RolloPos = round($RolloPos / $Raster) * $Raster;

# Rollo weiter fahren wenn Istposition != Sollposition
if ( $shutters->getIfInShading
&&  !$shutters->getShadingManualDriveStatus
&& $shutters->getStatus != $RolloPos) {
$shutters->setLastDrive('shading in');
$shutters->setNoDelay(1);
$shutters->setDriveCmd($RolloPos);
$shutters->setLastDriveReading;
$ascDev->setStateReading;
}

return $RolloPos;
}

CoolTux

Sieht soweit schlüssig aus. Du arbeitest damit natürlich komplett an der Beschattungsfunktion im ASC vorbei. Aber so lange es funktioniert.
Die Routine wird jedesmal aufgerufen wenn die Funktion getShadingPos aufgerufen wird. Musste mal beobachten ob das so geht.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net