Add files via upload

This commit is contained in:
Byte009 2019-06-05 19:53:19 +02:00 committed by GitHub
parent 61b01312b2
commit c2f4242942
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,4 +1,4 @@
# $Id: 98_Siro.pm 19490 2019-05-30 07:05:46Z Byte09 $ # $Id: 98_Siro.pm 19508 2019-05-31 09:34:17Z Byte09 $
# #
# Siro module for FHEM # Siro module for FHEM
# Thanks for templates/coding from SIGNALduino team and Jarnsen_darkmission_ralf9 # Thanks for templates/coding from SIGNALduino team and Jarnsen_darkmission_ralf9
@ -127,6 +127,7 @@ BEGIN {
CommandAttr CommandAttr
attr attr
fhem fhem
init_done
) )
); );
@ -195,6 +196,34 @@ sub Attr(@) {
my $hash = $defs{$name}; my $hash = $defs{$name};
return "\"Siro Attr: \" $name does not exist" if ( !defined($hash) ); return "\"Siro Attr: \" $name does not exist" if ( !defined($hash) );
if ( $cmd eq "set" and $init_done == 1)
{
if ( $aName eq "SIRO_inversPosition" )
{
my $oldinvers = AttrVal($name,'SIRO_inversPosition','undef');
Log3( $name,0 , "Siro_attr_oldinvers: $oldinvers ");
Log3( $name,0 , "Siro_attr_newinvers: $aVal ");
if ( $aVal ne $oldinvers)
{
my $aktstate = ReadingsVal( $name, 'state', 'undef' );
$aktstate = 100 - $aktstate;
readingsSingleUpdate( $hash, "state", $aktstate , 1 );
readingsSingleUpdate( $hash, "pct", $aktstate , 1 );
}
}
Log3( $name,0 , "Siro_attr: $cmd, $name, $aName, $aVal ");
}
Log3( $name,0 , "Siro_attr init done : $init_done");
return; return;
} }
################################################################# #################################################################
@ -231,9 +260,15 @@ sub Define($$) {
$modules{Siro}{defptr}{$devpointer} = $hash; $modules{Siro}{defptr}{$devpointer} = $hash;
AssignIoPort($hash); AssignIoPort($hash);
CommandAttr( undef,$name . ' devStateIcon {if (ReadingsVal( $name, \'state\', \'undef\' ) =~ m/[a-z]/ ) { return \'programming:edit_settings notAvaible:hue_room_garage runningUp.*:fts_shutter_up runningDown.*:fts_shutter_down\'}else{return \'[0-9]{1,3}:fts_shutter_1w_\'.(int($state/10)*10)}}' ) # CommandAttr( undef,$name . ' devStateIcon {if (ReadingsVal( $name, \'state\', \'undef\' ) =~ m/[a-z]/ ) { return \'programming:edit_settings notAvaible:hue_room_garage runningUp.*:fts_shutter_up runningDown.*:fts_shutter_down\'}else{return \'[0-9]{1,3}:fts_shutter_1w_\'.(int($state/10)*10)}}' )
if ( AttrVal($name,'devStateIcon','none') eq 'none' ); # if ( AttrVal($name,'devStateIcon','none') eq 'none' );
CommandAttr( undef,$name . ' devStateIcon {return FHEM::Siro::Siro_icon($name)}' )
if ( AttrVal($name,'devStateIcon','none') eq 'none' );
CommandAttr(undef,$name . ' webCmd stop:open:close:fav:pct') CommandAttr(undef,$name . ' webCmd stop:open:close:fav:pct')
if ( AttrVal($name,'webCmd','none') eq 'none' ); if ( AttrVal($name,'webCmd','none') eq 'none' );
@ -294,14 +329,16 @@ sub SendCommand($@) {
my $command = $siro_c2b{$cmd}; my $command = $siro_c2b{$cmd};
my $io = $hash->{IODev}; # IO-Device (SIGNALduino) my $io = $hash->{IODev}; # IO-Device (SIGNALduino)
if ( $hash->{helper}{exexcmd} eq "off") # send kommand blockiert / keine ausf?hrung #if ( $hash->{helper}{exexcmd} eq "off") # send kommand blockiert / keine ausf?hrung
if ( defined($hash->{helper}{exexcmd}) and $hash->{helper}{exexcmd} and $hash->{helper}{exexcmd} eq "off") # send kommand blockiert / keine ausf?hrung
{ {
Log3( $name, 5,"Siro_sendCommand: ausf?hrung durch helper blockiert "); Log3( $name, 5,"Siro_sendCommand: ausf?hrung durch helper blockiert ");
return; return;
} }
if ( $hash->{helper}{ignorecmd} eq "on") # send kommand blockiert / keine ausf?hrung #if ( $hash->{helper}{ignorecmd} eq "on") # send kommand blockiert / keine ausf?hrung
if ( defined($hash->{helper}) and $hash->{helper} and defined($hash->{helper}{ignorecmd}) and $hash->{helper}{ignorecmd} and $hash->{helper}{ignorecmd} eq "on") # send kommand blockiert / keine ausf?hrung
{ {
Log3( $name, 5,"Siro_sendCommand: ausführung einmalig blockiert "); Log3( $name, 5,"Siro_sendCommand: ausführung einmalig blockiert ");
@ -309,13 +346,11 @@ sub SendCommand($@) {
return; return;
} }
#Log3( $name, 5,"Siro_sendCommand: args1 - $args[1]"); #Log3( $name, 5,"Siro_sendCommand: args1 - $args[1]");
if ( $args[1] eq "longstop" || $hash->{helper}{progmode} eq "on") if ( defined($args[1]) and $args[1] eq "longstop" || defined $hash->{helper}{progmode} and $hash->{helper}{progmode} eq "on")
{ {
$SignalRepeats = AttrVal( $name, 'SIRO_signalLongStopRepeats', '15' ); $SignalRepeats = AttrVal( $name, 'SIRO_signalLongStopRepeats', '15' );
} }
else else
@ -390,8 +425,10 @@ sub Parse($$) {
Log3 $hash, 5,"Siro_Parse: Incomming msg from IODevice $testid - $name device is defined"; Log3 $hash, 5,"Siro_Parse: Incomming msg from IODevice $testid - $name device is defined";
if ( defined($name)&& $testcmd ne "54")# prüfe auf doppele msg falls gerät vorhanden und cmd nicht stop # if ( defined($name)&& $testcmd ne "54")# prüfe auf doppele msg falls gerät vorhanden und cmd nicht stop
{ if ( defined($name)&& $testcmd ne "54")# pr?fe auf doppele msg falls ger?t vorhanden und cmd nicht stop
{
Log3 $lh, 5,"Siro_Parse: Incomming msg $msg from IODevice name/DEF $testid - Hash -> $lh"; Log3 $lh, 5,"Siro_Parse: Incomming msg $msg from IODevice name/DEF $testid - Hash -> $lh";
my $testparsetime = gettimeofday(); my $testparsetime = gettimeofday();
@ -447,11 +484,13 @@ sub Parse($$) {
Log3 $hash, 5, "Siro_Parse: Cmd: $cmd Newstate: $newstate"; Log3 $hash, 5, "Siro_Parse: Cmd: $cmd Newstate: $newstate";
Log3 $hash, 5, "Siro_Parse: deviceCode: $deviceCode"; Log3 $hash, 5, "Siro_Parse: deviceCode: $deviceCode";
if ( defined($name)&& $testcmd eq "54" )#prüfe auf doppele msg falls gerät vorhanden und cmd stop #if ( defined($name)&& $testcmd eq "54" )#prüfe auf doppele msg falls gerät vorhanden und cmd stop
{ if ( defined($name)&& $testcmd eq "54" )#pr?fe auf doppele msg falls ger?t vorhanden und cmd stop
{
# Log3 $lh, 5, "Siro_Parse: prüfung auf douplestop "; # Log3 $lh, 5, "Siro_Parse: prüfung auf douplestop ";
my $testparsetime = gettimeofday(); my $testparsetime = gettimeofday();
my $lastparsestop = $lh->{helper}{lastparse_stop}; my $lastparsestop = 0;
$lastparsestop = $lh->{helper}{lastparse_stop} if defined $lh->{helper}{lastparse_stop};
my $parseaborted = $lh->{helper}{parse_aborted}; my $parseaborted = $lh->{helper}{parse_aborted};
my @lastparsestoparray = split( / /, $lastparsestop ); my @lastparsestoparray = split( / /, $lastparsestop );
my $timediff = $testparsetime - $lastparsestoparray[1]; my $timediff = $testparsetime - $lastparsestoparray[1];
@ -497,14 +536,12 @@ sub Parse($$) {
} }
} }
Log3( $name, 5, "Siro Parse Befehl: $newstate"); Log3( $name, 5, "Siro Parse Befehl: $newstate");
if ( defined($name) ) {#device vorhanden if ( defined($name) ) {#device vorhanden
my $parseaborted = 0; my $parseaborted = 0;
$lh->{helper}{parse_aborted} = $parseaborted; $lh->{helper}{parse_aborted} = $parseaborted;
Log3 $lh, 5, "Siro_Parse: $name $newstate"; Log3 $lh, 5, "Siro_Parse: $name $newstate";
my $defchannnel = $lh->{CHANNEL_RECEIVE}; my $defchannnel = $lh->{CHANNEL_RECEIVE};
my $atrrchannel = AttrVal( $name, 'SIRO_send_channel', $defchannnel ); my $atrrchannel = AttrVal( $name, 'SIRO_send_channel', $defchannnel );
@ -519,7 +556,6 @@ Log3( $name, 5, "Siro Parse Befehl: $newstate");
Log3 $lh, 5, "Siro_Parse: hash->{helper}{remotecmd} - ".$hash->{helper}{remotecmd}; Log3 $lh, 5, "Siro_Parse: hash->{helper}{remotecmd} - ".$hash->{helper}{remotecmd};
Log3( $name, 3, "Siro-Parse ($name) : Signal FB emfangen - $newstate"); Log3( $name, 3, "Siro-Parse ($name) : Signal FB emfangen - $newstate");
Set( $lh, $name, $newstate ); Set( $lh, $name, $newstate );
return $name; return $name;
} }
} }
@ -590,7 +626,6 @@ sub Set($@) {
my $favposition = ReadingsVal( $name, 'Favorite-Position', 'nA' ); #gespeicherte Favoritenposition my $favposition = ReadingsVal( $name, 'Favorite-Position', 'nA' ); #gespeicherte Favoritenposition
my $invers = 1; #invertiert position my $invers = 1; #invertiert position
if ($downtime ne "undef" && $uptime ne "undef") if ($downtime ne "undef" && $uptime ne "undef")
{ {
$down1time = $downtime/100; $down1time = $downtime/100;
@ -599,6 +634,10 @@ sub Set($@) {
return "" if ( IsDisabled($name) ); return "" if ( IsDisabled($name) );
$hash->{helper}{progmode} = "off" if !defined $hash->{helper}{progmode};
# versionschange # versionschange
#changeconfig #changeconfig
@ -607,7 +646,7 @@ sub Set($@) {
return; return;
} }
# pr?fe auf unbekannte sets # pruefe auf unbekannte sets
if ( $cmd =~ m/^exec.*/ )# empfangene sequenz aus programmiermode if ( $cmd =~ m/^exec.*/ )# empfangene sequenz aus programmiermode
{ {
@ -637,7 +676,9 @@ sub Set($@) {
# programmiermodus # programmiermodus
#################################### ####################################
if ( $hash->{helper}{progmode} eq "on" && $cmd eq "sequenz") # sequenz ausführen #if ( $hash->{helper}{progmode} eq "on" && $cmd eq "sequenz") # sequenz ausführen
if ( defined $hash->{helper}{progmode} and $hash->{helper}{progmode} eq "on" && $cmd eq "sequenz") # sequenz ausf?hren
{ {
Log3( $name, 5, "Siro-Programmiermodus: Sequenz gefunden :$args[1]"); Log3( $name, 5, "Siro-Programmiermodus: Sequenz gefunden :$args[1]");
my @seq = split(/,/, $args[1]); my @seq = split(/,/, $args[1]);
@ -656,6 +697,8 @@ sub Set($@) {
} }
if ($cmd eq "prog_mode_on" && $hash->{helper}{progmode} ne "on") if ($cmd eq "prog_mode_on" && $hash->{helper}{progmode} ne "on")
{ {
readingsSingleUpdate( $hash, "state", 'programming', 1 ); readingsSingleUpdate( $hash, "state", 'programming', 1 );
$hash->{helper}{progmode} = "on"; $hash->{helper}{progmode} = "on";
@ -694,8 +737,8 @@ sub Set($@) {
$hash->{helper}{exexcmd}="on"; #reset ignore send comand states $hash->{helper}{exexcmd}="on"; #reset ignore send comand states
$hash->{helper}{ignorecmd} = "off" ; #reset ignore send comand states $hash->{helper}{ignorecmd} = "off" ; #reset ignore send comand states
#setze helper neu wenn signal von fb kommt #setze helper neu wenn signal von fb kommt
#if ($hash->{helper}{remotecmd} eq "on")
if ($hash->{helper}{remotecmd} eq "on") if ( defined($hash->{helper}{remotecmd}) and $hash->{helper}{remotecmd} eq "on")
{ {
$hash->{helper}{exexcmd} = "off" $hash->{helper}{exexcmd} = "off"
} }
@ -748,6 +791,7 @@ sub Set($@) {
{ {
readingsSingleUpdate( $hash, "motor-term", "0", 1 ) ; readingsSingleUpdate( $hash, "motor-term", "0", 1 ) ;
readingsSingleUpdate( $hash, "batteryState", "unknown", 1 ) ; readingsSingleUpdate( $hash, "batteryState", "unknown", 1 ) ;
readingsSingleUpdate( $hash, "motor-term-reset", time, 1 );
return; return;
} }
@ -772,7 +816,15 @@ sub Set($@) {
$drivedpercents = $pastaction/$down1time; $drivedpercents = $pastaction/$down1time;
$drivedpercents = ( int( $drivedpercents * 10 ) / 10 ); $drivedpercents = ( int( $drivedpercents * 10 ) / 10 );
Log3( $name, 5, "Siro-Set: Positionsveraenderung um $drivedpercents Prozent nach unten "); Log3( $name, 5, "Siro-Set: Positionsveraenderung um $drivedpercents Prozent nach unten ");
if (AttrVal( $name, 'SIRO_inversPosition',0 ) eq "1")
{
$newposition = int ($position-$drivedpercents);
}
else{
$newposition = int ($position+$drivedpercents); $newposition = int ($position+$drivedpercents);
}
} }
if ($state eq "runningUp" || $state eq "runningUpfortimer") if ($state eq "runningUp" || $state eq "runningUpfortimer")
@ -780,7 +832,14 @@ sub Set($@) {
$drivedpercents = $pastaction/$up1time; $drivedpercents = $pastaction/$up1time;
$drivedpercents = ( int( $drivedpercents * 10 ) / 10 ); $drivedpercents = ( int( $drivedpercents * 10 ) / 10 );
Log3( $name, 5, "Siro-Set: Positionsveraenderung um $drivedpercents Prozent nach oben "); Log3( $name, 5, "Siro-Set: Positionsveraenderung um $drivedpercents Prozent nach oben ");
if (AttrVal( $name, 'SIRO_inversPosition',0 ) eq "1")
{
$newposition = int ($position+$drivedpercents);
}
else{
$newposition = int ($position-$drivedpercents); $newposition = int ($position-$drivedpercents);
}
} }
Log3( $name, 5, "Siro-Set: neue Position - $newposition "); Log3( $name, 5, "Siro-Set: neue Position - $newposition ");
@ -810,6 +869,32 @@ sub Set($@) {
} }
} }
###############
#pct 100 und pct 0 auf on oder off mappen
if ($comand eq "level" and $zielposition eq "100")
{
$comand = "on" if AttrVal( $name, 'SIRO_inversPosition',0 ) eq "0";
$comand = "off" if AttrVal( $name, 'SIRO_inversPosition',0 ) eq "1";
Log3( $name, 4, "Siro-Set: mapping level 100 - on");
}
if ($comand eq "level" and $zielposition eq "0")
{
$comand = "off" if AttrVal( $name, 'SIRO_inversPosition',0 ) eq "0";
$comand = "on" if AttrVal( $name, 'SIRO_inversPosition',0 ) eq "1";
Log3( $name, 4, "Siro-Set: mapping level 0 - off");
}
#################
# mappe invers position
# verschoben in routine on/off
############## on off for timer ############## on off for timer
# up/down for timer mappen auf on/off und timer für stop setzen # up/down for timer mappen auf on/off und timer für stop setzen
if ( $comand eq 'upfortimer' ) if ( $comand eq 'upfortimer' )
@ -929,6 +1014,9 @@ sub Set($@) {
} }
if ($state eq "undef" || $state eq "notAvaible") { $state = 0; } if ($state eq "undef" || $state eq "notAvaible") { $state = 0; }
my $waytodrive = 100 - $state; my $waytodrive = 100 - $state;
if (AttrVal( $name, 'SIRO_inversPosition',0 ) eq "1"){$waytodrive = $state;}
my $timetodrive = $waytodrive * $down1time; my $timetodrive = $waytodrive * $down1time;
my $endaction = time + $timetodrive; my $endaction = time + $timetodrive;
Log3( $name, 5, "Siro-Set: on downtime - waytodrive $waytodrive"); Log3( $name, 5, "Siro-Set: on downtime - waytodrive $waytodrive");
@ -974,14 +1062,22 @@ sub Set($@) {
readingsEndUpdate( $hash, 1); readingsEndUpdate( $hash, 1);
SendCommand( $hash, 'off' ); SendCommand( $hash, 'off' );
} }
#
if ($state eq "undef" || $state eq "notAvaible") { $state = 100; } if ($state eq "undef" || $state eq "notAvaible") { $state = 100; }
my $waytodrive = 0 + $state; my $waytodrive = 0 + $state;
if (AttrVal( $name, 'SIRO_inversPosition',0 ) eq "1"){$waytodrive = 0 + (100- $state);}
my $timetodrive = $waytodrive * $up1time; my $timetodrive = $waytodrive * $up1time;
my $endaction = time + $timetodrive; my $endaction = time + $timetodrive;
Log3( $name, 5, "Siro-Set: off downtime - waytodrive $waytodrive"); Log3( $name, 5, "Siro-Set: off downtime - waytodrive $waytodrive");
Log3( $name, 5, "Siro-Set: off downtime - state $state"); Log3( $name, 5, "Siro-Set: off downtime - state $state");
Log3( $name, 5, "Siro-Set: off downtime - down1time $down1time"); Log3( $name, 5, "Siro-Set: off downtime - up1time $up1time");
SendCommand( $hash, 'off' ); SendCommand( $hash, 'off' );
readingsBeginUpdate($hash); readingsBeginUpdate($hash);
@ -1214,8 +1310,6 @@ sub versionchange($) {
fhem("deleteattr $name operation_mode"); fhem("deleteattr $name operation_mode");
fhem("deleteattr $name channel_send_mode_1"); fhem("deleteattr $name channel_send_mode_1");
fhem("deleteattr $name down_limit_mode_1"); fhem("deleteattr $name down_limit_mode_1");
fhem("deleteattr $name operation_mode"); fhem("deleteattr $name operation_mode");
fhem("deleteattr $name invers_position"); fhem("deleteattr $name invers_position");
@ -1223,18 +1317,14 @@ sub versionchange($) {
fhem("deleteattr $name prog_fav_sequence"); fhem("deleteattr $name prog_fav_sequence");
fhem("deleteattr $name time_down_to_favorite"); fhem("deleteattr $name time_down_to_favorite");
fhem("deleteattr $name time_down_to_favorite"); fhem("deleteattr $name time_down_to_favorite");
my $seconds = ReadingsVal( $name, 'operating_seconds', '0' ); my $seconds = ReadingsVal( $name, 'operating_seconds', '0' );
fhem("deletereading $name .*"); fhem("deletereading $name .*");
readingsBeginUpdate($hash); readingsBeginUpdate($hash);
readingsBulkUpdate( $hash, "state", "0" ); readingsBulkUpdate( $hash, "state", "0" );
readingsBulkUpdate( $hash, "pct", "0" ) ; readingsBulkUpdate( $hash, "pct", "0" ) ;
readingsBulkUpdate( $hash, "position", "0" ) ; readingsBulkUpdate( $hash, "position", "0" ) ;
readingsBulkUpdate( $hash, "motor-term", $seconds ) ; readingsBulkUpdate( $hash, "motor-term", $seconds ) ;
readingsEndUpdate( $hash, 1 ); readingsEndUpdate( $hash, 1 );
SendCommand( $hash, 'off' ); SendCommand( $hash, 'off' );
return; return;
} }
@ -1245,9 +1335,10 @@ my ( $FW_wname, $d, $room, $pageHash ) =@_; # pageHash is set for summaryFn.
my $name = $hash->{NAME}; my $name = $hash->{NAME};
return "" if ( IsDisabled($name) ); return "" if ( IsDisabled($name) );
my $progmode =$hash->{helper}{progmode}; my $progmode =$hash->{helper}{progmode};
Log3( $name, 5, "Siro-progmode: reached progmode $progmode");
if (!defined $progmode){$progmode='off';} if (!defined $progmode){$progmode='off';}
my $msg; my $msg;
############## versionsänderung ############## versionsänderung
# kann irgendwann entfernt werden # kann irgendwann entfernt werden
@ -1270,13 +1361,8 @@ my ( $FW_wname, $d, $room, $pageHash ) =@_; # pageHash is set for summaryFn.
$msg.= "<table class='block wide' id='SiroWebTR'> $msg.= "<table class='block wide' id='SiroWebTR'>
<tr class='even'> <tr class='even'>
<td><center>&nbsp;<br>Programmiermodus aktiv, es werden nur folgende Befehle unterstuetzt:<br>&nbsp;<br>"; <td><center>&nbsp;<br>Programmiermodus aktiv, es werden nur folgende Befehle unterstuetzt:<br>&nbsp;<br>";
$msg.= "Das Anlernen ene Rollos erfolgt unter der ID: "; $msg.= "Das Anlernen ene Rollos erfolgt unter der ID: ";
my $sendid = AttrVal( $name, 'SIRO_send_id', 'undef' ); my $sendid = AttrVal( $name, 'SIRO_send_id', 'undef' );
if ( $sendid eq 'undef') if ( $sendid eq 'undef')
{ {
@ -1362,6 +1448,19 @@ my ( $FW_wname, $d, $room, $pageHash ) =@_; # pageHash is set for summaryFn.
$msg.= "}</script>"; $msg.= "}</script>";
return $msg; return $msg;
} }
################
sub Siro_icon($)
{
my ($name) = @_;
my $hash = $defs{$name};
my $state = ReadingsVal( $name, 'state', 'undef' );
my $invers = AttrVal( $name, 'SIRO_inversPosition',0 );
my $ret ="programming:edit_settings notAvaible:hue_room_garage runningUp.*:fts_shutter_up runningDown.*:fts_shutter_down ".$state.":fts_shutter_1w_".(int($state/10)*10);
$ret ="programming:edit_settings notAvaible:hue_room_garage runningUp.*:fts_shutter_up runningDown.*:fts_shutter_down ".$state.":fts_shutter_1w_".(100 - (int($state/10)*10)) if $invers eq "1";
return $ret;
}
################ ################
@ -1578,8 +1677,8 @@ set Siro1 stop stoppt die aktuelle Fahrt des Rollos<br>
set Siro1 pct 45 f&auml;hrt das Rollo zur angegebenen Position (45%)<br> set Siro1 pct 45 f&auml;hrt das Rollo zur angegebenen Position (45%)<br>
set Siro1 45 f&auml;hrt das Rollo zur angegebenen Position (45%)<br> set Siro1 45 f&auml;hrt das Rollo zur angegebenen Position (45%)<br>
set Siro1 fav f&auml;hrt das Rollo in die hardwarem&auml;ssig programmierte Mittelposition<br> set Siro1 fav f&auml;hrt das Rollo in die hardwarem&auml;ssig programmierte Mittelposition<br>
et Siro1 down_for_timer 5 f&auml;hrt das Rollo 5 Sekunden nach unten<br> set Siro1 down_for_timer 5 f&auml;hrt das Rollo 5 Sekunden nach unten<br>
et Siro1 uown_for_timer 5 f&auml;hrt das Rollo 5 Sekunden nach oben<br> set Siro1 down_for_timer 5 f&auml;hrt das Rollo 5 Sekunden nach oben<br>
set Siro1 progmode_on Das Modul wird in den Programmiermodus versetzt<br> set Siro1 progmode_on Das Modul wird in den Programmiermodus versetzt<br>
set Siro1 set_favorite programmiert den aktuellen Rollostand als Hardwaremittelposition, das ATTR time_down_to_favorite wird neu berechnet und gesetzt. <br> set Siro1 set_favorite programmiert den aktuellen Rollostand als Hardwaremittelposition, das ATTR time_down_to_favorite wird neu berechnet und gesetzt. <br>
</ul> </ul>