44_ROLLO: Modul zur präzisen Steuerung von Rollläden

Begonnen von KernSani, 14 Januar 2019, 00:11:37

Vorheriges Thema - Nächstes Thema

bismosa

Hallo!

Ich habe heute mal ein Update vom ROLLO-Modul gemacht. Ich nutze es schon etwas länger...einfach super!
Super finde ich auch, dass es jetzt möglich ist die Zwischenpositionen (pct 55) anzufahren! Das habe ich immer vermisst :-)

Ich habe nun aber ein Problem. Ich habe folgende Konfiguration:
- Sender / Empfänger als Device
- DOIF um auf den Empfang zu reagieren
- ROLLO-Modul

Also sobald von der FB ein Signal empfangen wird, starte ich die Berechnung mit "set ROLLO extern <befehl>". Klappt bestens.
Nun aber der Fall, das ich eine Position mit dem ROLLO-Modul anfahren will...dann wird mein Sende-Device getriggert. Dieses triggert aber sofort wieder mein DOIF und dies teilt dem ROLLO Modul dann die Fahrtrichtung mit. (set ROLLO extern <befehl>)
Dadurch kommt es zu einem Fehler in der Berechnung... Beispiel:
Rollo ist unten und soll auf 90% fahren (über das ROLLO Modul):

2019.03.03 11:20:13 5: ROLLO (Rolladen_Buero) >> Set (pct,90)
2019.03.03 11:20:13 5: ROLLO (Rolladen_Buero) DesiredPos set to pct, (90)
2019.03.03 11:20:13 5: ROLLO (Rolladen_Buero) DesiredPos now 90, 90
2019.03.03 11:20:13 5: ROLLO (Rolladen_Buero) DesiredPos now 90, pct-90
2019.03.03 11:20:13 5: ROLLO (Rolladen_Buero) >> Start
2019.03.03 11:20:13 4: ROLLO (Rolladen_Buero) drive from 100 to 90. command: pct-90. state: closed
2019.03.03 11:20:13 4: ROLLO (Rolladen_Buero) pct: 100 -> 90 / direction: up
2019.03.03 11:20:13 5: ROLLO (Rolladen_Buero) >> calculateDriveTime | going up: from 100 to 90
2019.03.03 11:20:13 5: ROLLO (Rolladen_Buero) netto drive time = 3.5
2019.03.03 11:20:13 4: ROLLO (Rolladen_Buero) calculateDriveTime: oldpos=100,newpos=90,direction=up,time=35,steps=10,drivetime=3.5
2019.03.03 11:20:13 4: ROLLO (Rolladen_Buero) execute following commands: set SD_Rollo_16ch up 9; ;
2019.03.03 11:20:14 3: SIGNALduino: SD_Rollo_16ch set up 9
2019.03.03 11:20:14 3: di_Rollo: Device: SD_Rollo_16ch  Event:LastAction_Channel_09: up
2019.03.03 11:20:14 3: di_Rollo: JaroCmd: up
2019.03.03 11:20:14 3: di_Rollo: cmd: open
2019.03.03 11:20:14 3: di_Rollo: RolloDev: Rolladen_Buero
2019.03.03 11:20:14 3: di_Rollo: set Rolladen_Buero extern open
2019.03.03 11:20:14 5: ROLLO (Rolladen_Buero) >> Set (extern,open)
2019.03.03 11:20:14 5: ROLLO (Rolladen_Buero) DesiredPos set to open, ()
2019.03.03 11:20:14 5: ROLLO (Rolladen_Buero) DesiredPos now 0, open
2019.03.03 11:20:14 5: ROLLO (Rolladen_Buero) >> calculatepct
2019.03.03 11:20:14 4: ROLLO (Rolladen_Buero) calculated pct is 100; rest drivetime is 20
2019.03.03 11:20:14 5: ROLLO (Rolladen_Buero) >> Start
2019.03.03 11:20:14 4: ROLLO (Rolladen_Buero) drive from 100 to 0. command: open. state: drive-up
2019.03.03 11:20:14 4: ROLLO (Rolladen_Buero) pct: 100 -> 0 / direction: up
2019.03.03 11:20:14 5: ROLLO (Rolladen_Buero) >> calculateDriveTime | going up: from 100 to 0
2019.03.03 11:20:14 5: ROLLO (Rolladen_Buero) netto drive time = 35
2019.03.03 11:20:14 4: ROLLO (Rolladen_Buero) calculateDriveTime: oldpos=100,newpos=0,direction=up,time=35,steps=100,drivetime=67
2019.03.03 11:20:14 4: ROLLO (Rolladen_Buero) drive-type is extern, not executing driving commands
2019.03.03 11:20:14 4: ROLLO (Rolladen_Buero) stop in 67 seconds.
2019.03.03 11:20:14 4: ROLLO (Rolladen_Buero) stop in 3.5 seconds.
2019.03.03 11:20:17 5: ROLLO (Rolladen_Buero) >> Timer
2019.03.03 11:20:17 5: ROLLO (Rolladen_Buero) >> Stop
2019.03.03 11:20:17 4: ROLLO (Rolladen_Buero) stops from drive-up at pct 0
2019.03.03 11:20:17 3: SIGNALduino: SD_Rollo_16ch set stop 9
2019.03.03 11:20:17 3: di_Rollo: Device: SD_Rollo_16ch  Event:LastAction_Channel_09: stop
2019.03.03 11:20:17 3: di_Rollo: JaroCmd: stop
2019.03.03 11:20:17 3: di_Rollo: cmd: stop
2019.03.03 11:20:17 3: di_Rollo: RolloDev: Rolladen_Buero
2019.03.03 11:20:17 3: di_Rollo: set Rolladen_Buero extern stop
2019.03.03 11:20:17 5: ROLLO (Rolladen_Buero) >> Set (extern,stop)
2019.03.03 11:20:17 5: ROLLO (Rolladen_Buero) DesiredPos set to stop, ()
2019.03.03 11:20:17 5: ROLLO (Rolladen_Buero) DesiredPos now 0, stop
2019.03.03 11:20:17 5: ROLLO (Rolladen_Buero) >> calculatepct
2019.03.03 11:20:17 4: ROLLO (Rolladen_Buero) calculated pct is 0; rest drivetime is -32
2019.03.03 11:20:17 5: ROLLO (Rolladen_Buero) >> Start
2019.03.03 11:20:17 4: ROLLO (Rolladen_Buero) drive from 0 to 0. command: stop. state: drive-up
2019.03.03 11:20:17 4: ROLLO (Rolladen_Buero) pct: 0 -> 0 / direction: up
2019.03.03 11:20:17 5: ROLLO (Rolladen_Buero) >> Stop
2019.03.03 11:20:17 4: ROLLO (Rolladen_Buero) stops from drive-up at pct 0
2019.03.03 11:20:17 4: ROLLO (Rolladen_Buero) is in drive-type extern
2019.03.03 11:20:17 4: ROLLO (Rolladen_Buero) updating state to open
2019.03.03 11:20:17 4: ROLLO (Rolladen_Buero) stopped by excuting the command: set SD_Rollo_16ch stop 9
2019.03.03 11:20:17 4: ROLLO (Rolladen_Buero) updating state to open
2019.03.03 11:20:20 5: ROLLO (Rolladen_Buero) >> Get


Dadurch ist die Position auf "0" gesetzt worden. Der Rolladen ist aber nur die 10% gefahren.

Ist dies ein Bug oder sogar ein feature?
Umgehen kann ich diesen effekt wohl nur, wenn ich im DOIF aufpasse, ob bereits der Fahrbefehl ausgeführt wird...eigentlich nicht so richtig schön.

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

87insane

Also das richtige doif prüft das doch. Mein notify genau über deinem Post macht genau das.

Gesendet von meinem LG-H850 mit Tapatalk


bismosa

Hallo!

Danke für die schnelle Antwort!
ZitatAlso das richtige doif prüft das doch
Welches richtige doif meinst du?

ZitatMein notify genau über deinem Post macht genau das
Stimmt. Wer lesen kann ist klar im Vorteil. Ich dachte das gehört zu einer ganz anderen Thematik...daher hatte ich mir das nicht genauer angesehen.  ::)

Sehr gut ist die Idee über das state Reading. Habe ich direkt so umgesetzt. Läuft. Damit ist die Frage quasi schon erledigt  :)
DANKE!

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

87insane

Freut mich :)

Gesendet von meinem LG-H850 mit Tapatalk


lambi

#79
Ich habe die Rolloansteuerung auch mit einem Vor-Ort-Schalter und demzufolge die Einbindung mit den beiden DOIF eingebaut.
Es kam zu unerwünschter Darstellung in FHEM, da die DOIF in Endlage in cmd_1 festhingen. Ursache ist nach meinem Verständnis, dass der DOELSEIF-Zweig (cmd_2) wg. der Prüfung von drive_up bzw. down nicht durchlaufen wurde. Ich habe die beiden Zeilen wie folgt abgeändert und nun läuft alles perfekt:


define rollo_manuell_auf DOIF ([meinRollo_Kanal1] eq "on" and [?meinRolloModul] ne "drive-up") (set meinRolloModul extern open) DOELSEIF ([meinRollo_Kanal1] eq "off") (set meinRolloModul extern stop)
define rollo_manuell_ab  DOIF ([meinRollo_Kanal2] eq "on" and [?meinRolloModul] ne "drive-down") (set meinRolloModul extern closed) DOELSEIF ([meinRollo_Kanal2] eq "off") (set meinRolloModul extern stop)

grappa24

@lambi: Was meinst Du mit "unerwünschter Darstellung in FHEM" genau?
Gebäudesicherheit/-komfort, PV-Prognose/Verbrauchssteuerung, Heizungssteuerung, Multimedia, ...
KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200, Netatmo, Nuki, SolarForecast, HEOS, Alexa-FHEM, ...
FHEM 6.4, 2 x RasPi 3B+, Debian Bullseye

lambi

Zitat@lambi: Was meinst Du mit "unerwünschter Darstellung in FHEM" genau?

Die vom ROLLO-Modul angezeigte Position stimmte nach Verfahren des Rollos über den Vor-Ort-Schalters in Endlage nicht mehr, da die DOIFs das nicht korrekt weitergereicht haben.
Hinweis: In meinem Fall habe ich das Attribut rl_autoStop = 0 gesetzt, um in Endlage den Stop-Befehl abzusetzen.

Ich hoffe, das ist soweit nachvollziehbar...

Kuehnhackel

Hi, ich würde dieses "Rollo" auch gerne anwenden und zwar, bei Sonnenuntergang, 50% runter und bei der nautischen Dämmerung ganz runter.

Im Augenblick ist es so, dass die Rolladen komplett runterfahren. Habe schon mal was probiert, aber finde keinen rechten Ansatz.

Könnte mir jemand aufs Rad helfen?


###Rolladen HWR Manuell###
define Roll_HWR dummy
attr Roll_HWR alias Rollladen HWR
attr Roll_HWR eventMap BI:auf B0:ab BS:stop
attr Roll_HWR fp_Grundriss_EG 14,318,7,Roll_HWR
attr Roll_HWR icon scene_hall
attr Roll_HWR room HWR
attr Roll_HWR webCmd auf:ab:stop
define Roll_HWR_ntfy notify Roll_HWR:.* {\
    my $v=Value("Roll_HWR");;\
    if ($v eq "auf") {rollo_HWR("auf")};;\
    if ($v eq "ab") {rollo_HWR("ab")};;\
    if ($v eq "stop") {rollo_HWR("stop")};;\
    }

###Rolladen HWR zeitabhängig schliessen###
define Roll_HWR_zu at *{sunset("CIVIL",0)} set Roll_HWR ab

###Rolladen HWR zeitabhängig öffnen###
define Roll_HWR_auf at *{sunrise("REAL",0)} set Roll_HWR auf


Es gibt keine Taster "vor Ort", sondern nur eine Bedienung per Funk, die über ein Brematik-Gateway läuft, falls es wichtig ist.

pc1246

Zitat von: Kuehnhackel am 04 März 2019, 19:39:14
Hi, ich würde dieses "Rollo" auch gerne anwenden und zwar, bei Sonnenuntergang, 50% runter und bei der nautischen Dämmerung ganz runter.

Im Augenblick ist es so, dass die Rolladen komplett runterfahren. Habe schon mal was probiert, aber finde keinen rechten Ansatz.

Könnte mir jemand aufs Rad helfen?

Es gibt keine Taster "vor Ort", sondern nur eine Bedienung per Funk, die über ein Brematik-Gateway läuft, falls es wichtig ist.
Moin
Guckst du hier: https://forum.fhem.de/index.php/topic,92628.0/topicseen.html
Gruss Christoph
HP T610
Onkyo_AVR;Enigma2; SB_Server; SB_Player; HM-USB; PhilipsTV; harmony hub; Jeelink mit PCA301; Somfy; S7-300; LGW; HUE; HM-IP auf Charly; div

KernSani

Mit ROLLO bringst du deinem Rolladen bei, verschiedene Positionen anzufahren, ASC macht dann die Automatisierung


Kurz, weil mobil
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Kuehnhackel

Zitat von: KernSani am 06 März 2019, 23:50:59
Mit ROLLO bringst du deinem Rolladen bei, verschiedene Positionen anzufahren, ASC macht dann die Automatisierung


Kurz, weil mobil

Danke, für die Info.

Mir würde schon mal reichen, wenn ich ich es manuell schaffen würde  :)

Liebe Grüße

87insane

#86
Zitat von: Kuehnhackel am 04 März 2019, 19:39:14
Hi, ich würde dieses "Rollo" auch gerne anwenden und zwar, bei Sonnenuntergang, 50% runter und bei der nautischen Dämmerung ganz runter.

Im Augenblick ist es so, dass die Rolladen komplett runterfahren. Habe schon mal was probiert, aber finde keinen rechten Ansatz.

Könnte mir jemand aufs Rad helfen?


###Rolladen HWR Manuell###
define Roll_HWR dummy
attr Roll_HWR alias Rollladen HWR
attr Roll_HWR eventMap BI:auf B0:ab BS:stop
attr Roll_HWR fp_Grundriss_EG 14,318,7,Roll_HWR
attr Roll_HWR icon scene_hall
attr Roll_HWR room HWR
attr Roll_HWR webCmd auf:ab:stop
define Roll_HWR_ntfy notify Roll_HWR:.* {\
    my $v=Value("Roll_HWR");;\
    if ($v eq "auf") {rollo_HWR("auf")};;\
    if ($v eq "ab") {rollo_HWR("ab")};;\
    if ($v eq "stop") {rollo_HWR("stop")};;\
    }

###Rolladen HWR zeitabhängig schliessen###
define Roll_HWR_zu at *{sunset("CIVIL",0)} set Roll_HWR ab

###Rolladen HWR zeitabhängig öffnen###
define Roll_HWR_auf at *{sunrise("REAL",0)} set Roll_HWR auf


Es gibt keine Taster "vor Ort", sondern nur eine Bedienung per Funk, die über ein Brematik-Gateway läuft, falls es wichtig ist.

Wieso steuerst du nicht über PCT? Bei Sonnenuntergang 50% und danach eben PCT 100%. Du löst es aktuell über at. Kannst es aber auch z.B. Über doif oder so machen.

Anbei mal alles was ich so gebastelt habe...mit oder ohne Hilfe.... Denke damit solltest du es verstehen und anpassen können.

# Rollos runter fahren nach Sonnenuntergang. Frühestens ab 17:00 Uhr bis spätestens 23:30 Uhr
define sonnenuntergang_rollos DOIF ([{twilight("sonnenuntergang_nv","ss_civil","17:00","23:30")}]) \
(set [a-z]?[a-z]_rollo pct 80)\
DOELSEIF ([00:15])

# Rollos hoch, außer SZ, nach Sonnenaufgang. Frühestens ab 6:00 Uhr bis spätestens 9:30 Uhr
define sonnenaufgang_rollos DOIF ([{twilight("sonnenuntergang_nv","sr_civil","06:00","09:30")}]) \
(set ^((?!sz)[a-z]?[a-z])_rollo pct 0)\
DOELSEIF ([00:15])

# Letzten Wecker aus Alexa berechnen
define letzter_wecker notify (ECHO_1234:alarm_.._status:.(on|off)) {\
my $k = "0";;\
my $alarmoff = "0";;\
my $schleifennr = "1";;\
my $lastalarmalexa = "0";;\
\
foreach $k (1..ReadingsVal("$NAME", "AlarmCount", ""))\
{\
$schleifennr = sprintf("%02d", $k);;\
my $wecker = ReadingsVal("$NAME", "alarm_".$schleifennr."_originalTime" ,"0");;\
$wecker =~ s/:00.000$//;;\
\
if (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "on" && "$wecker" gt "$lastalarmalexa") \
{\
$lastalarmalexa = $wecker;;\
}\
\
elsif (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "off") \
{\
$alarmoff = $alarmoff + 1;;\
\
if (sprintf("%02d", $alarmoff) eq $schleifennr) \
{\
$lastalarmalexa = 0;;\
}\
}\
fhem("setreading $NAME LastAlarm $lastalarmalexa")\
}\
}\


# Rollos hoch fahren nach letzten Wecker.
define letzter_wecker_rollos DOIF ([[ECHO_1234:LastAlarm]] and [ECHO_1234:LastAlarm] ne "0")\
(set sz_rollo pct 0)\
DOELSEIF ([00:15])

Kuehnhackel

Danke, für die Hilfestellung.

Aber ich blicke das nicht und werde wohl alles beim alten lassen.


KernSani

Zitat von: Kuehnhackel am 08 März 2019, 20:49:52
Danke, für die Hilfestellung.

Aber ich blicke das nicht und werde wohl alles beim alten lassen.
Wo liegen denn konkret deine Schwierigkeiten? Wenn ich das richtig sehe, kann dein Rollladen nur "auf" und "ab", richtig? Du müsstest dir jetzt ein ROLLO Device definieren, die entsprechenden Attribute (siehe Doku/Wiki) pflegen und dann kannst du über das ROLLO Device deinen Rollladen auf 50% o.ä. stellen - zeitgesteuert oder per Button oder was auch immer...


Kurz, weil mobil
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Kuehnhackel

#89
Zitat von: KernSani am 10 März 2019, 11:17:11
Wo liegen denn konkret deine Schwierigkeiten? Wenn ich das richtig sehe, kann dein Rollladen nur "auf" und "ab", richtig? Du müsstest dir jetzt ein ROLLO Device definieren, die entsprechenden Attribute (siehe Doku/Wiki) pflegen und dann kannst du über das ROLLO Device deinen Rollladen auf 50% o.ä. stellen - zeitgesteuert oder per Button oder was auch immer...
Kurz, weil mobil

Danke, dass Du antwortest.
Zusaätzlich, wird das ganze ja noch per Funk über ein Gateway gesteuert:
###GWY###
sub connair($$$){
my ($Master,$Slave,$action) = @_;
my  $SendData="";
my    $sA=0;
my    $sG=0;
my    $sRepeat=20;
my    $sPause=5600;
my    $sTune=350;
my    $sBaud=25;
my    $sSpeed=16;
my    $uSleep=800000;
my    $txversion=2;
my    $HEAD="TXP:$sA,$sG,$sRepeat,$sPause,$sTune,$sBaud,";
my    $TAIL=",$txversion,1,$sSpeed,;";
my    $AN="1,3,1,3,3";
my    $AUS="3,1,1,3,1";
my    $bitLow=1;
my    $bitHgh=3;
my    $seqLow=$bitHgh.",".$bitHgh.",".$bitLow.",".$bitLow.",";
my    $seqHgh=$bitHgh.",".$bitLow.",".$bitHgh.",".$bitLow.",";
my    $i=0;
my    $bit="";   
my    $msg="";

my  $bits=$Master;
    for($i=0; $i<length($bits); $i++) {   
        $bit=substr($bits,$i,1);
        if($bit=="0") {
            $msg=$msg.$seqLow;
        } else {
            $msg=$msg.$seqHgh;
        }
    }
my    $msgM=$msg;
   
    $bits=$Slave;
   
    $msg="";
    for($i=0; $i<length($bits); $i++) {
        $bit=substr($bits,$i,1);
        if($bit=="0") {
            $msg=$msg.$seqLow;
        } else {
            $msg=$msg.$seqHgh;
        }
    }
my    $msgS=$msg;

    if($action eq "on") {
        $SendData = $HEAD.$bitLow.",".$msgM.$msgS.$bitHgh.",".$AN.$TAIL;
    } else {
        $SendData = $HEAD.$bitLow.",".$msgM.$msgS.$bitHgh.",".$AUS.$TAIL;
    }
my ($socket,$data);
#  We call IO::Socket::INET->new() to create the UDP Socket
$socket = new IO::Socket::INET(PeerAddr=>'192.168.178.31:49880',Proto=>'udp') or die "ERROR in Socket Creation : $!\n";
$socket->send($SendData);

$socket->close();

}

und dann der eigentliche Code für die jeweilige Rollade
####################################################
####################Rollo HWR################
####################################################
sub rollo_HWR {

my ($state) = "$_[0]";
my $pid = 0;


if ($state eq "auf")
{

system("echo \"TXP:0,0,10,10920,91,41,57,18,8,4,8,4,4,8,4,8,4,8,8,4,8,4,4,8,4,8,4,8,4,8,8,4,4,8,4,8,4,8,4,8,4,8,4,8,8,4,8,4,8,4,4,8,8,4,4,8,4,8,8,4,8,4,8,4,8,4,8,4,4,8,4,8,4,8,4,8,4,8,8,4,4,8,4,8,4,8,8,61;\" | nc -u 192.168.178.31 49880 & pid=$! sleep 1 kill $pid 2>/dev/null >/dev/null");
}
else
{
    if ($state eq "stop")
    {
system("echo \"TXP:0,0,10,10920,91,41,57,18,8,4,8,4,4,8,4,8,4,8,8,4,8,4,4,8,4,8,4,8,4,8,8,4,4,8,4,8,4,8,4,8,4,8,4,8,8,4,8,4,8,4,4,8,8,4,4,8,4,8,8,4,8,4,8,4,8,4,8,4,4,8,4,8,4,8,8,4,4,8,8,4,4,8,8,4,4,8,8,61;\" | nc -u 192.168.178.31 49880 & pid=$! sleep 1 kill $pid 2>/dev/null >/dev/null");
    }
    else
    {
system("echo \"TXP:0,0,10,10920,91,41,57,18,8,4,8,4,4,8,4,8,4,8,8,4,8,4,4,8,4,8,4,8,4,8,8,4,4,8,4,8,4,8,4,8,4,8,4,8,8,4,8,4,8,4,4,8,8,4,4,8,4,8,8,4,8,4,8,4,8,4,8,4,4,8,4,8,4,8,4,8,8,4,8,4,4,8,4,8,8,4,8,61;\" | nc -u 192.168.178.31 49880 & pid=$! sleep 1 kill $pid 2>/dev/null >/dev/null");
    }
}
}

Diese beide Codes stehen in meiner 99_myutils.pm

Habe ich nicht ein Device angelegt? Könntest du mir oder jemand anhand meines Beispieles näher erklären?
Beispielsweise so?

define HWR_Test ROLLO
set HWR_Test pct 50
set HWR_Test geschlossen
set HWR_Test offen


Bin für jede Hilfe dankbar. Bin ja auch blutiger Anfänger.