Meine Rolladen im Wohnzimmer sind noch nicht auf Shelly und ASC umgestellt. Sie laufen mit der Somfy-Steuerung per Astro und schließen z.Zt. 2 Stunden nach Sonnenuntergang.
Die Rolladen sind sehr laut und stören beim Fernsehen. Um sie noch smarter zu machen, bräuchte ich eine Funktion, die das Schließen 2 Stunden nach Astro-Sunset veranlaßt, aber zu den Hauptnachrichtenzeiten (19:00 -19:20 und 20:00 bis 20:15) das Schließen verzögert.
Ich glaube, das ließe sich mit Perl in dem ASC-Modul lösen, aber ich kann es nicht.
Kann mir jemand beim Aufbau dieser Funktion helfen?
Cu
Walter
Hallo Walter,
Da hast Du Dir aber eine ziemliche Aufgabe gestellt.
Das ganze ist in der Tat nicht so einfach. ASC erwartet das Deine Funktion eine eindeutige Uhrzeit zurück gibt. Nachträglich ist kein wenn,dann möglich.
Du musst also schon in Deine Perlroutine alle Bedingungen einbauen. So das als Rückgabewert die tatsächliche Uhrzeit kommt.
Ich würde mir das gerne mal anschauen. Kann aber nicht versprechen es zeitnah hin zu bekommen.
Grüße
Hallo CoolTux,
ich habe nicht erwartet, dass es einfach ist und darum übersteigt es meine Fähigkeiten Perl zu domptieren.
Es hat aber keine Eile und wenn es irgendwann dieses Sahnehäubchen gäbe, wäre der WAF immens.
Danke im vorraus
Walter
ROLLO Devices kann man auf "blocked" setzen und - wenn entsprechend konfiguriert - holen sie die den letzten Befehl nach, der während des Blockierens gekommen ist. D.h. es müsste relativ einfach machbar sein, den Somfy in ein Rollo verpacken und per AT oder DOIF während der Nachrichten auf "blocked" setzen. Wenn ASC während dieser Zeit ein "close" schickt wird das beim "unblock" nachgeholt. Allerdings ist es eher unschön ein Somfy in ein ROLLO zu packen...
Hallo KernSani,
ich würde schon gerne bei ASC bleiben, aber das "blocked" wäre ein tolles Attribut für ASC. Ich möchte aber nicht CoolTux mit seinem genialen Modul in den Wahnsinn treiben. ;)
cu
Walter
ROLLO soll und will ASC garnicht ersetzen. Die beiden arbeiten wunderbar zusammen. ROLLO ist aber in Verbindung mit Somfy eher doof, weil Somfy ja schon alles kann, was ROLLO anderen Rollläden beibringt
Kurz, weil mobil
Zitat von: wk am 11 Februar 2020, 18:34:24
Hallo KernSani,
ich würde schon gerne bei ASC bleiben, aber das "blocked" wäre ein tolles Attribut für ASC. Ich möchte aber nicht CoolTux mit seinem genialen Modul in den Wahnsinn treiben. ;)
cu
Walter
ASC arbeitet bereits mit Hardware blocked sofern vorhanden. Man muss es nur konfigurieren.
Zu Deinem Anliegen bin ich gerade dabei und es ist doch nicht ganz so komplex wie gedacht da ASC bereits alles wichtige bereit hält.
So fertig.
Ich musste es leider doch etwas anders machen.
Voraussetzung
Eine 99_myUtils erstellen
99_myUtils_ASCHelper.pm
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_ASCHelper_Initialize($$)
{
my ($hash) = @_;
}
# Enter you functions below _this_ line.
sub ASCSunset($@) {
my ($shutter,$amode,$early,$late,$delay) = @_;
$delay = ((defined($delay) and $delay) ? $delay : 7200);
my $sunsetunix = (computeAlignTime('24:00',sunset($amode,0,$early,$late)) + $delay);
my $sunsettime = strftime("%H:%M",localtime($sunsetunix));
return ((IsSunsetInBlockedTime('19:00-19:20 20:00-20:15',$sunsetunix) ? strftime("%H:%M",localtime($sunsetunix + 900)) : $sunsettime));
}
sub IsSunsetInBlockedTime($$) {
my ($dfi,$unixtime) = @_;
$dfi =~ s/{([^\x7d]*)}/$cmdFromAnalyze=$1; eval $1/ge; # Forum #69787
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime($unixtime);
my $dhms = sprintf("%s\@%02d:%02d:%02d", $wday, $hour, $min, $sec);
foreach my $ft (split(" ", $dfi)) {
my ($from, $to) = split("-", $ft);
if(defined($from) && defined($to)) {
$from = "$wday\@$from" if(index($from,"@") < 0);
$to = "$wday\@$to" if(index($to, "@") < 0);
return 1 if($from le $dhms && $dhms le $to);
}
}
return 0;
}
1;
Dann im Rollo Device die Attribute setzen:
ASC_Down time
ASC_Time_Down_Early { ASCSunset('RolloKinZimSteven_F1','REAL','15:30','22:00') }
Die Angaben REAL und die Uhrzeiten sind für die Berechnung der Astrozeit. Dies können wir ja nicht mehr im Rollo für das ASC angeben.
Die Beachtung Deiner Nachrichtenzeit ist bereits in der Funktion enthalten.
Geil :D Danke CoolTux.
Heute habe ich nicht viel Zeit, aber dann werde ich versuchen das Alles zu verstehen und nachzuvollziehen. Denn die Lösung eines aktuellen Problems durch Euch ist schön, aber noch viel schöner ist der Lerneffekt und die neuen Möglichkeiten dadurch.
Vielen,vielen Dank
Das Skript habe ich jetzt analysiert und glaube es zu 90% verstanden zu haben.
Ich habe es dann an meine Bedürfnisse angepasst und bisher funktioniert es auch so, wie ich mir das vorstelle.
Der Aufruf erfolgt jetzt per:
ASC_Time_Down_Early {ASCSunset('CIVIL','7200','19:00-19:20 20:00-20:15')}
und das Skript sieht wie folgt aus:
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_ASCHelper_Initialize($$)
{
my ($hash) = @_;
}
# Enter you functions below _this_ line.
sub ASCSunset($@) {
my ($amode,$delay,$blocktimes) = @_;
# Alle Variablen in '' aufrufen, die Blockingtimes per blank getrennt und mit
# minus-Zeichen zwischen den Zeiten
my $sunsetunix = (computeAlignTime('24:00',sunset($amode,$delay)));
my $blt = IsSunsetInBlockedTime($blocktimes,$sunsetunix);
# $blt = BlockingTime
return (strftime("%H:%M",localtime($blt)));
}
sub IsSunsetInBlockedTime($$) {
my ($dfi,$unixtime) = @_;
# Alle Vergleiche in Unixzeit
$dfi =~ s/{([^\x7d]*)}/$cmdFromAnalyze=$1; eval $1/ge;
# $dfi = Disabled for interval
foreach my $ft (split(" ", $dfi)) {
# Blockzeiten aufsplitten
my ($from, $to) = split("-", $ft);
# $ft = from-to
if(defined($from) && defined($to)) {
# umrechnen in Unixzeit
my $unixfrom = (computeAlignTime('24:00',$from));
my $unixto = (computeAlignTime('24:00',$to));
return $unixto if($unixfrom le $unixtime && $unixtime le $unixto);
}
}
return $unixtime;
}
1;
Als ASC_Time_Down_Early wird jetzt das Ende der geblockten Zeit zurückgegeben und nicht nur um 15 Minuten verzögert, was bei z.B. 19:03 sunset noch in die Blockzeit gefallen wäre.
Ohne CoolTux Anregungen wäre ich nie so weit gekommen. Darum finde ich die Hilfe hier im Forum so toll.
ZitatASC arbeitet bereits mit Hardware blocked sofern vorhanden. Man muss es nur konfigurieren.
Das habe ich noch nicht verstanden. Was muss ich wo konfigurieren?
Ich hätte noch Ideen, wo ich diese Funktion brauchen könnte.
cu
Walter
Hallo Walter,
Zitat von: wk am 17 Februar 2020, 11:50:13
Das habe ich noch nicht verstanden. Was muss ich wo konfigurieren?
Ich hätte noch Ideen, wo ich diese Funktion brauchen könnte.
Schau Dir die Commandref zu den Attributen LockOut und LockOut_Cmd an.
Grüße