FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: mmatt am 08 Mai 2013, 08:39:22

Titel: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: mmatt am 08 Mai 2013, 08:39:22
Hallo
Ich versuche gerade an einem Rolladen mit Homematic.
Ich würde gerne eine "leichte Beschattung" einbauen. Das heisst
dass der Rolladen komplet herunter (zu) ist und die Lamellen quer stehen.

Mein erster Gedanke war: mit "set Rolladen 0" den Rolladen herunterfahren, dann warten bis der Rolladen ganz herunter ist. Dannach mit "set Rolladen 3" den Rolladen wieder etwas hochfahren, dammit sich die Lamellen quer stellen.

Ist nicht ganz trivial, da der Rolladen zuerst ja irgendwo stehen kann, und nach "set Rolladen 0" unterschiedliche Zeiten haben kann um ganz nach unten zu fahren.
Müsste etwas mit einem Reading (auf dem Rolladen) sein um zu sehen, wann der Rolladen ganz unten ist.

Über Anregungen würde ich mich freuen
Gruss Martin
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: MisterEltako am 08 Mai 2013, 11:51:56
Hi!

Aber ist dazu nicht "regSet DriveTurn" gedacht?

MfG, MisterEltako
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: mmatt am 08 Mai 2013, 12:02:17
Danke für die Antwort

Mit "regSet DriveTurn" stellt man doch nur das Register vom Aktor für das Umkehren.

Einen Befehl wie "DriveTurn" das nur die Lamellen kippt gibt es (so glaube ich) nicht ?

Gruss Martin
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: mmatt am 08 Mai 2013, 13:49:40
in der Mittagspause habe ich mir follgendes ausgedacht:
sub
BeschattungTest($)
{
  my $aktorname=shift;
  my $level=readingsVal($aktorname,"level","keinWert");
  #Rolladen ganz herunterfahren
  set $aktorname 0;
  # auf Rolladen warten bis ganz heruntergefahren
  while($level ne "0%")
  {
   $level=readingsVal($aktorname,"level","keinWert");
  }
  #Lamellen umstellen
  set $aktorname 3;
 }


Wobei ich nicht wirklich weiss, ob das funktioniert.

Gruss Martin
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: MisterEltako am 08 Mai 2013, 15:38:51
noch Syntaxänderungen: :o)

Beschattung($)
{
  my $aktorname=shift;
  my $level=readingsVal("$aktorname","level","keinWert");
  #Rolladen ganz herunterfahren
 fhem("set $aktorname 0");
  # auf Rolladen warten bis ganz heruntergefahren
  while($level ne "0 %")
  {
   $level=readingsVal("$aktorname","level","keinWert");
  }
  #Lamellen umstellen
  fhem("set $aktorname 3");
 }


Direkt einen Befehl zum Wenden gibt es m.W. nicht, ich denke das regSet driveTurn die Wendezeit zum Öffnen der Lamellen ist. Also wird das so provisorisch funktionieren. Ich habe alles Rollläden, kann es also nur bedingt testen. Ich habe das so ähnlich mit dem Öffnen der Lüftungsschlitze gemacht.

MfG,MisterEltako
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: mmatt am 13 Mai 2013, 07:30:29
Danke für die Hilfe

Noch eine kleine Syntaxänderung
Beschattung($)
{
  my $aktorname=shift;
  my $level=ReadingsVal("$aktorname","level","keinWert");
  #Rolladen ganz herunterfahren
  fhem("set $aktorname 0");
  # auf Rolladen warten bis ganz heruntergefahren
  while($level ne "0 %")
  {
    $level=ReadingsVal("$aktorname","level","keinWert");
  }
  #Lamellen umstellen
  fhem("set $aktorname 3");
}

Beim ersten Test ist der Rolladen bis ganz heruntergefahren, dannach hat sich FHEM komplett weggehängt. Ist wohl in der while-Schleife hängengeblieben. Konnte FHEM nicht mal über die Konsole stoppen. :-(

Denke FHEM mag kein ReadingsVal() in einer While-Schleife ?

Vielleicht müsste man noch ein sleep() Befehl innerhalb While einbauen ?
Ein Timeout, falls der Aktor nicht reagiert währe wohl auch nicht verkehrt ?

Gruss Martin
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: justme1968 am 13 Mai 2013, 07:38:17
da fhem single threaded ist wird es durch die while schleife blockiert und bekommt keine änderungen mehr von außen mit. d.h. deine while schleife läuft unendlich.

definiere dir ein (temporäres) notify das nach dem der rollo unten ist wieder ein stueck zurueck fährt.

gruss
  andre
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: mmatt am 13 Mai 2013, 07:54:02
Zitat von: justme1968 schrieb am Mo, 13 Mai 2013 07:38da fhem single threaded ist wird es durch die while schleife blockiert und bekommt keine änderungen mehr von außen mit. d.h. deine while schleife läuft unendlich.
Ok, ist eine logische Erklärung. Wieder was gelernt.

Zitatdefiniere dir ein (temporäres) notify das nach dem der rollo unten ist wieder ein stueck zurueck fährt.
Leichter gesagt, als getan. Hast Du mir da Starthilfe, wie das aussehen könnte.

Gruss Martin
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: mmatt am 13 Mai 2013, 10:01:42
Würde das gehen ?

in der fhem.cfg:
define notify_Rolladen_Beschattung notify dummy_Rolladen_Beschattung:EIN {Beschattung("CUL_HM_Rolladen_Buero")}

in der 99_Utils.pm:
sub
Beschattung($)
{
 my $aktorname=shift;
 #Rolladen ganz herunterfahren
 fhem("set $aktorname 0");
 #Lamellen umstellen
 define notify_Temp notify $aktorname {if (ReadingsVal ("$aktorname","level","keinWert") eq "0 %") {fhem ("set $aktorname 3")};
}


Bin mir nicht sicher, ob man ein notify in der 99_Utils.pm (temporär) definieren kann , dieses auch nur ausgeführt wird, wenn die Funktion Beschattung()aus der fhem.cfg heraus aufgerufen wird. ?
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: justme1968 am 13 Mai 2013, 10:44:19
habe grad keine zeit es genauer zu probieren. aber noch ein paar hinweise:

- natürlich kannst du ein notify da definieren. du musst es aber als fehm kommando ausführen also fhem("define ...")
- wenn das notify nur temporär sein soll musst du es von hand wieder löschen. am besten am ende des notify.
- du kannst das notify direkt auf AUS (ich vermute mal das heisst bei dir so) ansprechen lassen. dann brauchst du nicht mit readingsval den wert prüfen.
- ich würde erst das notify definieren und dann den dollo runter fahren. das macht in diesem fall aber vielleicht auch keinen unterschied.
- eigentlich müsste man noch motor stop abfangen und das notify dann löschen. sonst bleibt es aktiv wenn der rollo z.b. zwischendruch per hand gestoppt wird.

gruss
  andre
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: mmatt am 13 Mai 2013, 13:17:41
Etwa in der Art ?

sub
Beschattung($)
{
 my $aktorname=shift;
 #Rolladen ganz herunterfahren
 fhem("set $aktorname close");
 #Lamellen umzstellen
 fhem("define notify_Temp notify $aktorname:close set $aktorname 3, delete notify_Temp");
}

wobei der "motor stop" hier noch nicht berücksichtigt ist.
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: MisterEltako am 13 Mai 2013, 13:19:14
Ich würde bei deinem ReadingsVal bleiben, da oft im Status Set_1 oder ähnliches steht und "level" hier den "exakten" Stand der Jalousie zeigt.
Das Löschen des "define" könnte so aus sehen:


define notify_Rolladen_Beschattung notify dummy_Rolladen_Beschattung:EIN {Beschattung("CUL_HM_Rolladen_Buero")}


in der 99_Utils.pm:

sub
Beschattung($)
{
 my $aktorname=shift;
 #Rolladen ganz herunterfahren
 fhem("set $aktorname 0");
 #Lamellen umstellen
 fhem("define notify_Temp notify $aktorname {
   if (ReadingsVal ("$aktorname","level","keinWert") eq "0 %") {
     fhem("set $aktorname 3");
     fhem("define Stop_Rollo at +00:00:30 delete notify_Temp");
   }
 }
}

Vielleicht noch 00:00:30 auf deine gewünschte Laufzeit anpassen.

MfG, MisterEltako.
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: mmatt am 13 Mai 2013, 14:36:58
Danke für die Antworten

Ich bleibe mal bei der Variante "Readings"
bei:
sub
Beschattung($)
{
my $aktorname=shift;
#Rolladen ganz herunterfahren
fhem("set $aktorname 0");
#Lamellen umstellen
fhem("define notify_Temp notify $aktorname {
if (ReadingsVal ("$aktorname","level","keinWert") eq "0 %") {
fhem("set $aktorname 3");
fhem("define Stop_Rollo at +00:00:30 delete notify_Temp");
}
}
}

bekomme ich:
Can't find string terminator '"' anywhere before EOF at ./FHEM/99_Utils.pm line 236.

Und ich sehe den Fehler nicht. Sieht doch ganz ok aus ?

Grüsse Martin
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: MisterEltako am 13 Mai 2013, 14:45:58
Ok, da fehlte noch: ");;\

sub
Beschattung($)
{
my $aktorname=shift;
#Rolladen ganz herunterfahren
  fhem("set $aktorname 0");
#Lamellen umstellen
  fhem("define notify_Temp notify $aktorname {
     if (ReadingsVal ("$aktorname","level","keinWert") eq "0 %") {
         fhem("set $aktorname 3");
         fhem("define Stop_Rollo at +00:00:30 delete notify_Temp");
     }
  }");;\
}


MfG, MisterEltako
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: mmatt am 14 Mai 2013, 09:53:14
Nochmals Danke für Deine Hilfe (welche ich leider immer noch benötige)
Der FHEM/PERL Syntax macht mir schon arg zu schaffen.

mit:
sub
Beschattung($)
{
my $aktorname=shift;
#Rolladen ganz herunterfahren
  fhem("set $aktorname 0");
#Lamellen umstellen
  fhem("define notify_Temp notify $aktorname {
     if (ReadingsVal ("$aktorname","level","keinWert") eq "0 %") {
         fhem("set $aktorname 3");
         fhem("define Stop_Rollo at +00:00:30 delete notify_Temp");
     }
  }");;\
}

-> Syntaxfehler
syntax error at ./FHEM/99_Utils.pm line 234, near "if (ReadingsVal ("$aktorname" syntax error at ./FHEM/99_Utils.pm line 239, near "}"


Versucht habe ich auch:
sub
Beschattung($)
{
my $aktorname=shift;
#Rolladen ganz herunterfahren
fhem("set $aktorname 0");
#Lamellen umstellen
fhem("define notify_Temp notify $aktorname if (ReadingsVal($aktorname,level,keinWert) eq 0 %) set $aktorname 3");
#Notify löschen
    fhem("define at_delete_notify at +00:00:30 delete notify_Temp");
}

-> kein Syntaxfehler aber bei Ausführung:
2013.05.14 09:19:45 3: notify_Temp return value: Unknown command if, try help

Gruss Martin
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: MisterEltako am 14 Mai 2013, 11:10:50
Bitte so probieren:

if (ReadingsVal ($aktorname,"level","keinWert") eq "0 %") {


sub
Beschattung($)
{
my $aktorname=shift;
#Rolladen ganz herunterfahren
  fhem("set $aktorname 0");
#Lamellen umstellen
  fhem("define notify_Temp notify $aktorname {
     if (ReadingsVal ($aktorname,"level","keinWert") eq "0 %") {
         fhem("set $aktorname 3");
         fhem("define Stop_Rollo at +00:00:30 delete notify_Temp");
     }
  }");;\
}


MfG, MisterEltako
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: mmatt am 14 Mai 2013, 11:43:39
Zitat von: MisterEltako schrieb am Di, 14 Mai 2013 11:10Bitte so probieren:

if (ReadingsVal ($aktorname,"level","keinWert") eq "0 %") {


sub
Beschattung($)
{
my $aktorname=shift;
#Rolladen ganz herunterfahren
  fhem("set $aktorname 0");
#Lamellen umstellen
  fhem("define notify_Temp notify $aktorname {
     if (ReadingsVal ($aktorname,"level","keinWert") eq "0 %") {
         fhem("set $aktorname 3");
         fhem("define Stop_Rollo at +00:00:30 delete notify_Temp");
     }
  }");;\
}


MfG, MisterEltako

Leider:
syntax error at ./FHEM/99_Utils.pm line 234, near "if (ReadingsVal ($aktorname,"level" syntax error at ./FHEM/99_Utils.pm line 239, near "}"

Ich hab auch schon ein Beispiel gesucht, wo ein notify mit einer if-Bedingung in einer 99_utils.pm verwendet wird. Leider habe ich nichts gefunden.

Gruss Martin


Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: Puschel74 am 14 Mai 2013, 11:50:33
Hallo,

ich hab leider nicht viel Ahnung aber warum wird hier

fhem("set $aktorname 3");
nur 1 Semikolon ohne Zeilenumbruch und hier
}");;\
2 Semikolon mit Zeilenumbruch geschrieben?

Grüße
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: MisterEltako am 14 Mai 2013, 12:14:52
Zitatich hab leider nicht viel Ahnung aber warum wird hier

Na,na,na, nicht das Licht unter den Scheffel stellen.... ;o)

Ist natürlich korrekt: (da ich meist erst allesm in fhem.cfg probiere ist das ;;\ übrig geblieben beim Transfer in die 99_Utils.pm.

Also nochmal:

sub
Beschattung($)
{
my $aktorname=shift;
#Rolladen ganz herunterfahren
  fhem("set $aktorname 0");
#Lamellen umstellen
  fhem("define notify_Temp notify $aktorname {
     if (ReadingsVal ($aktorname,"level","keinWert") eq "0 %") {
         fhem("set $aktorname 3");
         fhem("define Stop_Rollo at +00:00:30 delete notify_Temp");
     }
  }");
}


bei (ReadingsVal ($aktorname,"level","keinWert") eq "0 %") bin ich mir nicht ganz sicher, ob nicht doch (ReadingsVal ("$aktorname","level","keinWert") eq "0 %") - bitte beides austesten!!!

MfG, MisterEltako

Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: Puschel74 am 14 Mai 2013, 12:23:35
Hallo,

und auch mal zwischen ReadingsVal und der ( das Leerzeichen weglassen.
Nur für einen Versuch.

Grüße
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: mmatt am 14 Mai 2013, 14:23:58
Find ich echt nett von Euch, mir zu helfen. Erst mal Danke.

Also ich hab alle Varianten ausprobiert.
Variante: ReadingsVal ("$aktorname",...
Variante: ReadingsVal ($aktorname,...
Variante: ReadingsVal(...
Variante: ReadingsVal (...

Alle mit dem etwa gleichen Ergebnis:
-> syntax error at ./FHEM/99_Utils.pm line 234, near "if (ReadingsVal ("$aktorname"


Kann das Problem der Zeilenumbruch sein ?:
notify $aktorname {
     if (ReadingsVal...
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: MisterEltako am 14 Mai 2013, 14:38:14
Eigentlich nicht. Da ist Perl sehr tolerant. In der FHEM.cfg wäre das ein Problem, aber hier nicht.

Ich vermute es liegt an "0 %". Perl kommt mglw. nicht mit dem Leerzeichen klar.

Kannst du bitte nur zum Test "0%" schreiben?


MfG, MisterEltako
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: mmatt am 14 Mai 2013, 15:54:11
Nöööö :-(

habs auch mit eq "test" versucht.

Bringt immer noch:
syntax error at ./FHEM/99_Utils.pm line 234, near "if (ReadingsVal ($aktorname,"level"

Hier noch mal der aktuelle Code: (welcher noch nicht funktioniert)
Zitatsub
Beschattung($)
{
my $aktorname=shift;
#Rolladen ganz herunterfahren
  fhem("set $aktorname 0");
#Lamellen umstellen
  fhem("define notify_Temp notify $aktorname {
     if (ReadingsVal($aktorname,"level","keinWert") eq "test") {
         fhem("set $aktorname 3");
         fhem("define Stop_Rollo at +00:00:30 delete notify_Temp");
     }
  }");
}
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: Puschel74 am 14 Mai 2013, 16:44:28
Hallo,

was steht den überhaupt in $aktorname?

Grüße

Edith: Nicht was stehen sollte sondern was tatsächlich drinnen steht meinte ich.
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: MisterEltako am 14 Mai 2013, 22:32:46
Fehler gefunden! Es liegt an den Anführungszeichen die sich im Define wiederholen. Man müsste dort ' ' verwenden. Dadurch würde sich aber wiederum die Variable nicht aktualisieren.

Ich habe auf die Schnelle die Definition umgestellt. Funktion habe ich noch nicht getestet, aber zunächst keine Syntaxfehler mehr.


sub
Beschattung($)
{
  my $aktorname=shift;
     
   fhem("set $aktorname 0");
   if (defined($defs{notify_Temp})){fhem('delete notify_Temp')};
   fhem("define notify_Temp notify $aktorname {Reverse(\"$aktorname\")}");
}

sub
Reverse($){

  my $aktorname=shift;
  Log 3, "Reverse: $aktorname";
  my $Aktorstand = ReadingsVal("$aktorname","level","keinWert");
  if ($Aktorstand eq "1 %") {
  fhem("set $aktorname 3");
  if (defined($defs{Stop_Rollo})){fhem('delete Stop_Rollo')};
  fhem("define Stop_Rollo at +00:00:30 delete notify_Temp");
 }
}


MfG, MisterEltako   
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: mmatt am 15 Mai 2013, 08:38:26
Zitat von: MisterEltako schrieb am Di, 14 Mai 2013 22:32Ich habe auf die Schnelle die Definition umgestellt.
Auf die Schnelle :-) :-) :-)
Das ist ganz schön komplex ;-)

Ich werde kommendes Wochenende den Code testen, und berichten.
Habe zur Zeit etwas wenig Zeit.

Ich habe da noch zwei Fragen:
Sind die beiden Zeilen zwingend notwendig ?
if (defined($defs{notify_Temp})){fhem('delete notify_Temp')};
if (defined($defs{Stop_Rollo})){fhem('delete Stop_Rollo')};


Wozu sind im Funktionsaufruf die beiden Backslash ?
Reverse(\"$aktorname\")


@Puschel74
In $aktorname steht zu Zeit noch gar nichts, da bis jetzt noch Syntax-Fehler da waren.
Beim Aufruf der Funktion Beschattung($) übergebe ich dann den Namen meines Rolladen.
Hast Du das gemeint ?

Grüsse an Euch
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: Puschel74 am 15 Mai 2013, 08:41:36
Hallo,

Zitat@Puschel74
In $aktorname steht zu Zeit noch gar nichts, da bis jetzt noch Syntax-Fehler da waren.
Beim Aufruf der Funktion Beschattung($) übergebe ich dann den Namen meines Rolladen.
Hast Du das gemeint ?

Eigentlich nicht ;-)
Das ist das was drinnen stehen sollte!
Mir ging es um das was wirklich drinnen steht.

Aber hat sich ja jetzt evtl. auch erledigt durch die Suche und Umsetzung von MisterEltako.

Grüße
Titel: Aw: Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: MisterEltako am 15 Mai 2013, 09:26:51
Zitatif (defined($defs{Stop_Rollo})){fhem('delete Stop_Rollo')};

Nicht zwingend erforderlich, aber eleganter...;o)
Prüft, ob notify noch angelegt ist und löscht es vor Neuanlage ggf.
Ansonsten würde eine Fehlermeldung kommen, das notify schan angelegt wurde und zunächst gelöscht werden muss.

ZitatReverse(\"$aktorname\")

die Backslash's sind erforderlich, da sonst wieder das Problem mit den Anführungszeichen in den Anführungszeichen und damit Syntaxfehler entsteht.
Deswegen ist hier eine Maskierung erforderlich.
Einfache Anführunszeichen (') gehen hier nicht, da sonst der Variableninhalt ($aktorname) nicht aktualisiert wird sondern tatsächlich der String "$aktorname" weitergegeben würde.

Noch ein Hinweis:
$Aktorstand eq "1 %"  ----> musst du bei dir wieder auf "0 %" stellen!!!
(Bei mir fahren die Rollladen auf 1 % runter, daher hatte ich das geändert)


MfG, MisterEltako
Titel: Antw:Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: vangils am 15 August 2017, 13:14:10
Hallo MisterEltako & Puschel74,

wie ist den die Sache mit dem Rollladenaktor von HM und Jalousienwendung bzw. Querstellen ausgegangen.
Soweit ich das nachlesen konnte, ist die Sache mit der eigentlichen Funktionalität noch nicht gang geklärt gewesen.

lG,

Mario
Titel: Antw:Rolladen zu und Lamellen quer stellen (Homematic)
Beitrag von: Gunther am 31 Oktober 2017, 15:25:58
Das interessiert mich auch.

Und an der Stelle nochmal die Frage von oben bzgl. des Registers DriveTurn. Ist das wirklich nur für die Umschalt-Pause des Motors gedacht?

Im Anhang des Anfängerleitfadens steht
ZitatErreicht wird dies, indem man dem Schalter die Fahrzeit des Rollos programmiert. Hierzu wird die
Fahrzeit ,,hoch", ,,runter" und (relevant für Jalousien) die Wendezeit der Lamellen
,,Change" programmiert.
Diese werden in Liste 1 Verwalter – siehe Anhang.

Da hatte ich die Hoffnung, dass es was gibt. Bin aber in den Registern nicht fündig geworden.