Mehrere at Definitionen mittels Perl erstellen

Begonnen von ThomasS, 23 Mai 2018, 17:14:21

Vorheriges Thema - Nächstes Thema

ThomasS

Hallo Forum,

ich versuche mich seit einem halben Jahr mit Fhem meine Rollläden zu automatisieren.
Konnte viele sinnvolle Anregungen und Ausätze zu meinem Projekt finden, jedoch seit zwei Wochen sitze ich nun vor dem gleichen Problem und komme einfach nicht weiter.

Zu meinem Vorhaben möchte ich abhängig vom Sonnenstand (Elevation) meine Rollläden schrittweise absenken d.h. ist abends der Elevation Wert unter 0° sollen die Rollläden schrittweise abgesenkt werden.
Das schrittweise absenken habe bzw. wollte ich mit at realisieren, ist der Elevation Wert unter 0 gesunken wird der Rollladen z.B. im Wohnzimmer in 3 Stufen abgesenkt.

1 Stufe mit 2 Minuten Verzögerung auf 30%
2 Stufe mit 50 Minuten Verzögerung auf 10%
3 Stufe mit 120 Minuten Verzögerung auf 0%

Das definieren des at mache ich aus Perl heraus anhand einer Funktion im 99_myUtils.pm.

Das at wird wie folgt erstellt:

fhem ("define $ATRolladen at $SetTime set $Rolladen $Rolladenstellung");

Dies funktioniert auch teilweise, wenn ich nun die Funktion aufrufe wird manchmal für jeden Rollladen alle 3 at's erstellt jedoch manchmal nur 1 oder 2 at's erstellt.
Ich habe nun schon versucht ein sleep testweise einzubauen um zu sehen ob eine Wartezeit zwischen dem erstellen der at jedoch ohne Erfolg.
Ich bin ehrlich gesagt ratlos an was es liegen könnte bzw. ob ich die at Definition anders lösen müsste jedoch komme ich irgendwie nicht weiter auch eine suche in den Foren hat nichts ergeben oder habe ich eventuell die falschen Begriffe genutzt.

Vielen Dank schon mal im voraus

Thomas

Beta-User

Hallo ThomasS,

willkommen im Forum.

Poste doch mal die komplette Funktion, die du aufrufst, scheint ja eine Art Schleife zu sein. An der einen Zeile wird es kaum liegen - mal abgesehen davon, dass ggf. ein "defmod" statt des "define" beim debuggen helfen könnte (Doppelbenennungen, die das defmod vermeiden könnte, sollten dann aber im log zu finden sein).

Ansonsten gibt es auch einen recht fortgeschrittenen code zur Rolladenautomatisierung von Cluni; das ist ggf. einfacher, als alles "from the scratch" neu zu erfinden.

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

ThomasS

Hallo Beta User,

Danke für Deine schnelle Antwort.

Ich werde mal den Code etwas verkürzt darstellen am Beispielk Rolladen Küche OG wobei alle anderen Röllläden gleiche Weise aufgerufen werden.

my ($Uhrzeit) = fhem ("{strftime('%H:%M:%S', localtime)}");
my ($Azimuth) = ReadingsVal("myTwilight","azimuth","0");
my ($Elevation) = ReadingsVal("myTwilight","elevation","0");
my ($Helligkeit) = ReadingsVal("Lichtsensor","brightness","0");
my ($OG_Kueche_Rolladenstellung_TagNacht_01) = ReadingsVal("OG_Kueche_Rolladenstellung_TagNacht_01","state","0");
my ($OG_Kueche_Rolladenstellung_TagNacht_02) = ReadingsVal("OG_Kueche_Rolladenstellung_TagNacht_02","state","0");
my ($OG_Kueche_Rolladenstellung_TagNacht_03) = ReadingsVal("OG_Kueche_Rolladenstellung_TagNacht_03","state","0");
my ($Tag_Nachtfahrt_EG) = ReadingsVal("Tag_Nachtfahrt_EG","state","0");
my ($Tag_Nachtfahrt_OG) = ReadingsVal("Tag_Nachtfahrt_OG","state","0");
my ($Tag_Nachtfahrt_Master) = ReadingsVal("Tag_Nachtfahrt_Master","state","0");
my ($Tagstellung) = 100;
         if(($Elevation < 0) && ($Elevation > -3) && ($Azimuth > 260) && ($Helligkeit < 20))#Nachtfahrt
{
return if(exists($defs{"AT_OG_Kueche_Rolladen_3"}));
if($Tag_Nachtfahrt_Master eq "on")
{
if($Tag_Nachtfahrt_OG eq "on")
{
OG_Tagfahrt("AT_OG_Kueche_Rolladen_1", "OG_Kueche_Rolladen", $OG_Kueche_Rolladenstellung_TagNacht_02, "00:02:00", $Uhrzeit);
OG_Tagfahrt("AT_OG_Kueche_Rolladen_2", "OG_Kueche_Rolladen", $OG_Kueche_Rolladenstellung_TagNacht_01, "00:50:00", $Uhrzeit);
OG_Tagfahrt("AT_OG_Kueche_Rolladen_3", "OG_Kueche_Rolladen", $Tagstellung, "02:01:00", $Uhrzeit);
}
               }
       }

sub OG_Nachtfahrt($$$$$)
{
my ($ATRolladen, $Rolladen, $Rolladenstellung, $Time, $Uhrzeit) = @_;
my ($SetTime) = "00:00:00";
$SetTime = TU_Get_Actiontime( $Uhrzeit, "16:00:00", "23:59:59", $Time);
fhem ("define $ATRolladen at $SetTime set $Rolladen $Rolladenstellung");
#select(undef, undef, undef, 0.5);
#sleep 1;
}


Jedoch wie schon erwähnt an manchen tagen werden alle at's definiert und manchmal nur das erste oder die ersten zwei.
Ich hatte nur den Gedanken das Fhem länger braucht um das at zu definieren wie Perl.

Beta-User

FHEM arbeitet (grundsätzlich) linear, es kann also eigentlich nicht sein, dass "Fhem länger braucht um das at zu definieren wie Perl". Sowas passiert nur, wenn man irgendwo einen Aussetzer mittels sleep, at & Co einbaut.

Als Ursache, dass das 3. at nicht angelegt wird, würde ich das hier sehen:
return if(exists($defs{"AT_OG_Kueche_Rolladen_3"}));

Generell kommt es mir viel zu viel spezifischer Code vor, was du da verwendest, um die eigentlichen Vorgaben und aus diversen Dummy's zusammenzusuchen. Wenn das Namensschema paßt, würde ich eher dazu raten, das automatisiert zusammenzubauen, wobei es mir einfacher vorkommt, die Infos beim Device direkt zu speichern. Ein Beispiel, wie das dann ausschaut: https://forum.fhem.de/index.php/topic,36504.msg287778.html#msg287778. Ziel sollte eine Perl-Funktion sein, die dann für alle Rolläden ggf. einzeln aufgerufen wird (oder als Schleife für alle zu berücksichtigenden Devices durchlaufen wird, Stichworte devspec2array und foreach)).
Aber wie immer: Viele Wege führen zum Ziel.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files