Rolladen mit ASC und Perl noch smarter machen?

Begonnen von wk, 11 Februar 2020, 14:50:40

Vorheriges Thema - Nächstes Thema

wk

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

CoolTux

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
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

wk

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

KernSani

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...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

wk

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

KernSani

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
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

CoolTux

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.
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

CoolTux

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.
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

wk

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

wk

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

CoolTux

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
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