[ASC] Perlcode in Attribut ASC_Shading_Pos wird teilweise ignoriert

Begonnen von Rewe2000, 19 Februar 2025, 16:25:29

Vorheriges Thema - Nächstes Thema

Rewe2000

Hallo,

ich hänge aktuell noch an einem Punkt in ASC, wo ich noch eure Hilfe benötige.

Ich ändere die Behanghöhe und die Lamellenposition meiner Raffstore mit einer Perlfunktion unter dem Attribut ASC_Shading_Pos, das funktioniert eigentlich soweit ohne Probleme.
Nun fährt aber mein Raffstore, sporadisch die Lamellen während der Beschattung falsch und ich wollte diese auf den korrekten Wert wieder korrigieren. Meine Korrektur kommt auch im Rollodevice an, aber der Raffstore bewegt sich nicht, ich vermute weil sich der Wert von ASC_Shading_Pos ja durch das korrekte setzen nicht mehr vom letzten Wert ändert.

Kurz noch der Ablauf:
  • Durch Änderung des Sonnenstands wird eine neue Behang und Lamellenposition über eine Perfunktion über das Attribut ASC_Shading_Pos vorgegeben.
  • Der Raffstor fährt auch, doch sporadisch passt die Lamellenposition nicht, der Wert vom Reading "pctSlats" ist anders als im Rollodevice unter "ascAPIget("ShadingPositionAssignment","Rollodevice")".
  • Nun kann ich diese fehlerhafte Lamellenposition auch gut erkennen und korrigieren, die Korrektur kommt auch im Rollodevice an, jedoch wird anscheinend kein neuer Fahrbefehl mehr gesendet, da sich der vorhergehende nicht vom aktuellen unterscheidet.
  • Nur neue Fahrbefehle, welche sich vom vorhergehenden Befehl unterscheiden werden auch korrekt befolgt und ausgeführt.

Kann ich da im Rollodevice irgendetwas anstoßen, damit der letzte Fahrbefehl nochmals gesendet wird?
Ein Fahrbefehl von außerhalb wird sofort als manuelle Fahrt erkannt und die Beschattungsautomatik wird von ASC sofort beendet.

Aktuell gebe ich im Rollodevice über das Attribut "ASC_Shading_Pos" die Werte für Behang und Lamellenposition für die Beschattung wie folgt über Perl vor:
{
my $Log = AttrNum("OG_RA01_BueroReinhard_3","Logausgabe",5);
my $pctPos = 100;
my $pctSlatPos = 100;
my $SunAltitude = ReadingsNum("Astro","SunAlt",0);
my $Behang_ist = ReadingsNum("OG_RA01_BueroReinhard_3","pct",0);
my $Behang_soll = ascAPIget("ShadingPos","OG_RA01_BueroReinhard_3");
my $Lamellen_ist = ReadingsNum("OG_RA01_BueroReinhard_3","pctSlats",0);
my $Lamellen_soll = ascAPIget("ShadingPositionAssignment","OG_RA01_BueroReinhard_3");
my $Beschattung = ReadingsVal("OG_RA01_BueroReinhard_3","ASC_ShuttersLastDrive","???");
if (ReadingsNum("OG_VG_Sportzimmer","measured-temp",21) <= AttrNum("OG_RA01_BueroReinhard_3","ASC_Shading_start_IndoorTemperature",21)) {
    $pctPos = 100;            ## 100
    $pctSlatPos = 100;        ## 100
    if ($Log >= 5) {
        Log 1, "Device OG_RA01_BueroReinhard_3 - Innentemperatur zu kalt für Beschattung"
    }   
} else {
    if ($SunAltitude > 0 and $SunAltitude < 20) {
        $pctPos = 2;        ## 2
        $pctSlatPos = 25    ## 25
    }
    if ($SunAltitude >= 25 and $SunAltitude < 30) {
        $pctPos = 23;        ## 23
        $pctSlatPos = 23    ## 23
    }
    if ($SunAltitude >= 30 and $SunAltitude < 40) {
        $pctPos = 30;        ## 30
        $pctSlatPos = 29    ## 29
    }
    if ($SunAltitude >= 40 and $SunAltitude < 50) {
        $pctPos = 35;        ## 35
        $pctSlatPos = 32    ## 32
    }
    if ($SunAltitude >= 50 and $SunAltitude < 60) {
        $pctPos = 40;        ## 40
        $pctSlatPos = 35    ## 35
    }
    if ($SunAltitude >= 60 and $SunAltitude < 65) {
        $pctPos = 45;        ## 45
        $pctSlatPos = 37    ## 37
    }
    if ($SunAltitude >= 65) {
        $pctPos = 50;        ## 50
        $pctSlatPos = 40    ## 40
    }
    if ($Log >= 5) {
        Log 2, "Device OG_RA01_BueroReinhard_3 - Altitude = $SunAltitude °, Behang = $pctPos %, Lamellen = $pctSlatPos % nachgeführt"
    }   
}
if ($Beschattung eq "shading in") {
    if ($Behang_ist != $Behang_soll) {
        $pctPos = $Behang_soll;
        if ($Log >= 3) {
            Log 1, "Behang-Istwert für Beschattung nachjustiert von $Behang_ist % auf $Behang_soll %"
        }
    }
    if($Lamellen_ist != $Lamellen_soll) {
        $pctSlatPos = $Lamellen_soll;
        if ($Log >= 3) {
            Log 1, "Lamellen-Istwert für Beschattung nachjustiert von $Lamellen_ist % auf $Lamellen_soll %"
        }
    }
}
if ($Log >= 5) {
    Log 1, "Duchlauf Device OG_RA01_BueroReinhard_3 Attribut ASC_Shading_Pos erfolgt"
}
$pctPos.":".$pctSlatPos
}

Das Problem könnte auch noch mit dem Attribut "event-on-change-reading" zusammenhängen, diese ist bei mir aktuell auf ".*" gesezt, dieses benötige ich aber zwingend, zu Unterscheidung der manuellen Fahrten.
Solltet ihr mehr Infos oder noch nähere Erklärungen benötigen, so liefere ich diese gerne nach.

Habt ihr da einen Tipp für mich, wie ich mein Problem lösen kann?
Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

Rewe2000

Hallo,

ich habe nun an meinem Jalousienaktor (HmIP-BBL-2) die Endlagen komplett neu eingestellt und die Fahrzeiten neu parametriert und die Lamellenverstellzeit neu ermittelt.
Nach diesen Änderungen ist der Fehler nicht mehr aufgetreten. Der Jalousienaktor muss sehr sorgfältig an die jeweilige Jalousie angepasst werden, damit dieser den Raffstore auch präzise steuert und es hier nicht zu Abweichungen kommt.

Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky