FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: stever am 30 März 2013, 00:26:25

Titel: 2 x selber Befehl und delay mit EnOcean
Beitrag von: stever am 30 März 2013, 00:26:25
Hallo liebe Gemeinde,

ich habe vor ca. 6 Monaten mit FHEM und EnOcean angefangen (damals gab es noch die google gruppe). Ich musste beruflich mein Projekt etwas liegen lassen und hatte heute endlich mal Zeit Licht- und Rollsteuerung zu realisieren.

Ich habe folgendes Szenario: Ich habe viele EnOcean Taster und Aktoren im Haus verteilt was auch soweit sehr gut läuft. Mit FHEM lasse ich nun Nachtbeleuchtung und Rollos automatisch steuern. Ich stoße nun auf folgendes Problem:

Ich lasse z.B. die Nachtbeleuchtung zum Sonnenuntergang anschalten. Ich habe allerdings vorher via Webinterface die Lampe bereits einmal eingeschaltet und via Taster wieder ausgeschaltet. FHEM denkt nun, dass die Lampe bereits eingeschaltet ist und sendet nicht nochmals einen Befehl über den CUL.

Oder einfacher: Wie kann ich FHEM dazu bewegen, dass er den aktuellen Status ingnoriert und meinen gewünschten Befehl stur nocheinmal sendet?

2. Frage: Wie kann ich ein Delay zwischen zwei Befehlen einbauen? Ich möchte gerne meine Rollos morgens nur um 10% hochfahren (PEHA-Aktoren). Für mich die simpelste Variante wäre nach den Hochfahren einen weiteren Impuls nach Hochfahrzeit/10 zu senden. Diese Frage schließt direkt an meiner ersten Frage an.

Ich danke euch ganz viel für eure Hilfe. Vielleicht bin ja ganz auf den Holzweg aber gerade auch etwas am verwzeifeln.
Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: MisterEltako am 30 März 2013, 13:57:14
Hi!

Du könntest versuchen ob das Voranstellen eines setState-Befehl hilft. Ich habe Eltakoaktoren (bidiektional), diemelden den State selbst zurück. Peha kann das glaube ich nicht.

Ich würde folgendes ausprobieren:

define Test dummy
define Aktion notify Test {\
    fhem("setState Lichtaktor off");;\
    fhem("set Lichtaktor on");;\
}

und zu 2.:

define Test1 dummy
define Aktion1 notify Test1 {\
    fhem("set Rolloaktor on");;\
    fhem("define Zeit at +00:10:00 set Rolloaktor off");;\
}

oder:

define Test2 dummy
define Aktion2 notify Test2 {\
   fhem("set Rolloaktor on;; sleep 10;;set Rolloaktor off");;\
}

Testen kannst du jeweils über die Fhemweb-Kommandozeile mit:
trigger Test
trigger Test1
trigger Test2

MfG, MisterEltako.
Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: Zrrronggg! am 30 März 2013, 15:18:53
Ja, . wobei


fhem("set Rolloaktor on ;; define Zeit at +00:10:00 set Rolloaktor off")

fhem("set Rolloaktor on ;; sleep 10;; set Rolloaktor off")

allerdings extrem unterschiedliche Zeiten sind. Im ersten Fall 10 Minuten, im zweiten Fall weniger als eine Sekunde (wenn man commandref glauben darf, dass Sleep in ms angegeben wird)

Ich möchte auch noch mal erwähnen, das

define Aktion notify Test {\
fhem("setState Lichtaktor off");;\
fhem("set Lichtaktor on");;\
}


nur eine meiner Meinung nach umständlich Formulierung von

define Aktion notify Test setState Lichtaktor off ;; set Lichtaktor on

ist.


Ebenso
define Aktion1 notify Test1 {\
fhem("set Rolloaktor on");;\
fhem("define Zeit at +00:10:00 set Rolloaktor off");;\
}


für
define Aktion1 notify Test1 set Rolloaktor on ;; define Zeit at +00:10:00 set Rolloaktor off

etc.

Wenn man auch bei so kurzen Statements wert auf eine mehrzeilige Darstellung legt ginge auch dies:

define Aktion1 notify Test1 \
  set Rolloaktor on ;;\
  define Zeit at +00:10:00 set Rolloaktor off

Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: MisterEltako am 30 März 2013, 15:45:45
Hi!

@Zrrronggg

Danke für die Ergänzung. Jeder mag es eben anders...:-)
Wichtiger wäre zunächst aber, ob es funktioniert oder nicht. Danach kann man es gern vereinfacht schreiben.

MfG, MisterEltako.

PS: Vielleicht ist Zrrronggg, die umständlichere Form von Zrong??? *zwinker*
Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: Zrrronggg! am 30 März 2013, 16:20:20
ZitatPS: Vielleicht ist Zrrronggg, die umständlichere Form von Zrong??? *zwinker*

Nee, Zrrronggg! ist das Geräusch, dass die Federn dieser Architekten-Tischlampen machen, wenn man da dran rumspielt.

Aber zu Sache selber:

Klar hat jeder seine eigenen Vorlieben.
Aber wir haben es hier mit Anfgängern zu tun und ich bin geneigt, denen die jeweils simpleste Form dazubieten.

Und Speziell folgendes Konstrukt

{\
fhem("


ist... echt... ehem... nicht nötig.

die offene geschweifte Klammer  
"{"
bedeutet ja grob Folgends: "Achtung FHEM, was jetzt kommt ist kein FHEM-Code mehr, sondern PERL-Code"
Während  
fhem("
etwa bedeutet: "Achtung PERL, was jetzt kommt bitte an FHEM übermitteln, weil es kein PERL-Code ist"

{\
fhem("

gibt also die Kontrolle von FHEM an PERL nur um sie SOFORT wieder an FHEM zurück zu geben.
Das ist in jeder Hinsicht suboptimal.

Mir fällt schon seit längerem auf, dass eine Reihe Leute das so machen. Natürlich kann man das tun, ich will dir nix vorschreiben. Das ist nur Codeseitig sinnlos und führt Klammern ein, wo keine  nötig sind. Und bei Klammern vertun wir uns alle ja oft genug (habe mir ja kürzlich erst hier in einem Thread die Karten gelegt).

Du hast hier auch das Argument vorgetragen, das sei übersichtlicher. Ich gehe mit, wenn jemand sagt, Mehrzeiler sind übersichtlicher.
Dann Tut's aber auch:


define Aktion1 notify Test1 \
  set Rolloaktor on ;;\
  define Zeit at +00:10:00 set Rolloaktor off


Aber wie

define Aktion1 notify Test1 {\
fhem("set Rolloaktor on");;\
fhem("define Zeit at +00:10:00 set Rolloaktor off");;\
}



noch übersichtlicher sein soll, verstehe ich nicht. Für dich und mich ist vermutlich klar, was das macht, aber bei Anfängern werden die zusätzlichen Klammern und fhem-Übergaben doch eher für Verwirrung sorgen, weil sich dem Anfänger nicht erschliesst, warum die notwendig sind. (Er kann ja nicht wissen, das sie *nicht*  notwendig sind).

Sowas führt am Ende zu Cargocult-Programming. (Wenn es das nicht jetzt schon ist)


P.S.: Ich weiss nicht, wie ich dies kleine Kritik so üben soll, das sich die sozial kompetenteren Mitglieder dieses Forums nicht wieder genötigt sehen, mir negative Reputation reinzutrollen.
Nur nichts sagen, um nicht wieder abgestraft zu werden wollte ich aber auch nicht.


Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: stever am 30 März 2013, 16:32:03
Juhu,

ihr habt mich in die richtige Richtung geführt:

#=================
#GWC Rollo steuern
#=================

define Rollo_GWC dummy
attr Rollo_GWC room EG_WC
attr Rollo_GWC eventMap /rollo_gwc_hoch:hoch/rollo_gwc_runter:runter/
attr Rollo_GWC webCmd hoch:runter


define rollo_gwc_hoch notify Rollo_GWC:hoch {\
fhem("set ff800082_eg_wc_rollo B0");;\
fhem("define rollo_gwc_hoch_t1 at +00:00:03 set ff800082_eg_wc_rollo released");;\
fhem("define rollo_gwc_hoch_t2 at +00:00:19 set ff800082_eg_wc_rollo B0");;\
fhem("define rollo_gwc_hoch_t3 at +00:00:20 set ff800082_eg_wc_rollo released");;\
}
 
define rollo_gwc_runter notify Rollo_GWC:runter {\
fhem("set ff800082_eg_wc_rollo BI");;\
fhem("define rollo_gwc_hoch_t4 at +00:00:03 set ff800082_eg_wc_rollo released");;\
fhem("define rollo_gwc_hoch_t5 at +00:00:19 set ff800082_eg_wc_rollo BI");;\
fhem("define rollo_gwc_hoch_t6 at +00:00:20 set ff800082_eg_wc_rollo released");;\


Der TCM hat doch jedes mal ein Signal gesendet. Aber die Aktoren haben fleißig auf ein release des Senders gewartet. Der Text oben lässt jetzt das Rollo genau einmal fahren und gibt zum Schluss das Relais wieder frei um den nächsten Befehl entgegen nehmen zu können.

Wahrscheinlich kann man das ganze noch viel eleganter machen aber es funtioniert :)

Dankeschön
Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: MisterEltako am 30 März 2013, 17:08:42
@stever

Genau, die Funktion ist wichtig. Natürlich hat Zrrronggg nicht unrecht.

Ich schreibe die Codzeilen so, da ich zuletzt an den Problem gescheitert bin ein define in ein anderes zu schachteln und dort 2 Befehle auszuführen.

Also z.B.

define Aktion at *22:00:00 {\
 if (defined(defs{Aktion2})) {fhem("delete Aktion2");;} \
 fhem("define Aktion2 at 23:00:00 set Aktor1 on;; set Aktor2 on");;\
}


... nur zum sofortigen Ausführversuch von " set Aktor2 on");;" und Anlegen des 2. define nur mit dem set Aktor1 on führte. Auch im Forum fand man keine Lösung.

Durch die "umständliche" Schreibweise fand ich eine Kompromisslösung, die mir nicht gefällt, aber funktioniert.

define Aktor_all structure room Aktor1 Aktor2

define Aktion at *22:00:00 {\
if (defined(defs{Aktion2})) {fhem("delete Aktion2");;} \
fhem("define Aktion2 at 23:00:00 set Aktor_all");;\
 }


MfG, MisterEltako.
Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: Zrrronggg! am 30 März 2013, 17:14:28
Zitatdefine Aktion at *22:00:00 {\
 if (defined(defs{Aktion2})) {fhem("delete Aktion2");;} \
 fhem("define Aktion2 at 23:00:00 set Aktor1 on;; set Aktor2 on");;\
}

Auch im Forum fand man keine Lösung.

Da kann ich dir helfen, das geht so:

define Aktion at *22:00:00 {\
 if (defined(defs{Aktion2})) {fhem("delete Aktion2 ;; define Aktion2 at 23:00:00 set Aktor1 on ;;;; set Aktor2 on")}


Generell:

 {fhem(" doA ;; define B at +00:01:00 doB ;;;; doC ;; doD")}

Ausführungsreihenfolge:
doA
doD
eine Minute später
doB
doC




   
Stever: Dies müsste auch gehen:

define rollo_gwc_hoch notify Rollo_GWC:hoch \
set ff800082_eg_wc_rollo B0;;\
define rollo_gwc_hoch_t1 at +00:00:03 set ff800082_eg_wc_rollo released;;\
define rollo_gwc_hoch_t2 at +00:00:19 set ff800082_eg_wc_rollo B0;;\
define rollo_gwc_hoch_t3 at +00:00:20 set ff800082_eg_wc_rollo released
 
define rollo_gwc_runter notify Rollo_GWC:runter \
set ff800082_eg_wc_rollo BI;;\
define rollo_gwc_hoch_t4 at +00:00:03 set ff800082_eg_wc_rollo released;;\
define rollo_gwc_hoch_t5 at +00:00:19 set ff800082_eg_wc_rollo BI;;\
define rollo_gwc_hoch_t6 at +00:00:20 set ff800082_eg_wc_rollo released




Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: MisterEltako am 30 März 2013, 17:55:06
@Zrrronggg

Also o.g. führt mich in meiner 99_myUtils.pm dazu:

if (defined(defs{Sonnenaufgang})) {fhem("delete Sonnenaufgang;; define Sonnenaufgang at 23:00:00 set Aktor1 on ;;;; set Aktor2 on;;")}
...
Bareword "Sonnenaufgang" not allowed while "strict subs" in use at /usr/local/FHEM/share/fhem/FHEM/99_myUtils.pm line 104.



Verstehe ich deinen Hinweis richtig???

{fhem(" doA ;; define B at +00:01:00 doB ;;;; doC ;; doD")}

Ausführungsreihenfolge:
doA -----> delete Sonnenaufgang
doD -----> bei mir nicht benötigt
eine Minute später ----> define Sonnenaufgang at 23:00:00
doB ----> set Aktor1 on
doC ----> set Aktor2 on

Zum Verständnis meines Vorhabens:
Zu bestimmter Zeit prüft "if", ob Sonnenaufgang bereits angelegt, wenn ja löscht es Sonnenaufgang.
Danach soll Sonnenaufgang mit neuer Zeit (23:00:00) angelegt werden, welches 2 Rollläden runterfährt (Aktor1 & Aktor2).

MfG, MisterEltako.


Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: Zrrronggg! am 30 März 2013, 18:17:26
if (defined(defs{Sonnenaufgang})) {fhem("delete Sonnenaufgang;; define Sonnenaufgang at 23:00:00 set Aktor1 on ;;;; set Aktor2 on;;")}

Ja, allerdings sind die letzten Semikolons nicht nötig. Das müsste reichen:

if (defined(defs{Sonnenaufgang})) {fhem("delete Sonnenaufgang;; define Sonnenaufgang at 23:00:00 set Aktor1 on ;;;; set Aktor2 on")}

ZitatZum Verständnis meines Vorhabens:
Zu bestimmter Zeit prüft "if", ob Sonnenaufgang bereits angelegt, wenn ja löscht es Sonnenaufgang.
Danach soll Sonnenaufgang mit neuer Zeit (23:00:00) angelegt werden, welches 2 Rollläden runterfährt (Aktor1 & Aktor2).

Vorausgesetzt, dieser Teil:
(defined(defs{Sonnenaufgang}))
funktioniert. Das soll prüfen ob "Sonnenaufgang" schon existiert? Ich hab das nie gemacht, daher bin ich da unsicher. Aber der Rest stimmt.

Zitat{fhem(" doA ;; define B at +00:01:00 doB ;;;; doC ;; doD")}

Ausführungsreihenfolge:
doA -----> delete Sonnenaufgang
doD -----> bei mir nicht benötigt
eine Minute später ----> define Sonnenaufgang at 23:00:00
doB ----> set Aktor1 on
doC ----> set Aktor2 on

Genau.  mit dem "doD" wollte ich nur andeuten, wie bestimmt wird, was zum "verschachtelten" define gehört und was nicht. Das wird anhand der Anzahl der Semikolons unterschieden.

Das was du machst, mache ich auch reichlich in meiner cfg, ich halte mich aber nicht mit der Prüfung auf, ob das zu löschende define schon exisitert.
Wenn NICHT gibts eben einen Fehlermeldung im Log "please define sonnenaufgang first",  die kann man ignorieren. Weiter passiert nichts.
Gut, das ist ein bisschen unelegant, zugegeben, vereinfacht den Code aber deutlich.

Die Sache mit den 4 Semikolons habe ich übrigens von Olaf Droegehorn, der mir helfen konnte, also ich die selbe Frage hatte.
Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: MisterEltako am 30 März 2013, 21:16:58
@Zrrronggg


if (defined(defs{Sonnenaufgang}))

das muss natürlich so lauten:
if (defined($defs{Sonnenaufgang}))


if (defined($defs{Sonnenaufgang})) {fhem("delete Sonnenaufgang;; define Sonnenaufgang at 23:00:00 set Aktor1 on ;;;; set Aktor2 on")}

liefert leider einen Fehler: Sonnenaufgang nicht definiert...

Das kann ausschliessen, da es testweise 1 Zeile zuvor definiert wird.

Also weiterhin ein Problemfall...

MfG, MisterEltako
Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: Zrrronggg! am 30 März 2013, 22:19:27
Hm. So ohne das drumherum lässt sich dazu wenig sagen.

if (defined($defs{Sonnenaufgang})) {fhem("delete Sonnenaufgang;; define Sonnenaufgang at 23:00:00 set Aktor1 on ;;;; set Aktor2 on")}


alleine macht ja sowieso nichts. Das ist ja nur ein Codefragment. Wenn es da Probleme gibt, liegt das nicht an der Sektion {fhem("delete Sonnenaufgang;; define Sonnenaufgang at 23:00:00 set Aktor1 on ;;;; set Aktor2 on")}.
Der Teil ist definitv okay und geht, sowas habe ich zig mal in meiner cfg.

Wenn ich mal versuchen soll, rauszukriegen warum das nicht geht musst du mehr posten.

Das kann ausschliessen, da es testweise 1 Zeile zuvor definiert wird.

Nämlich wie?

Und wodurch wird

if (defined($defs{Sonnenaufgang})) {fhem("delete Sonnenaufgang;; define Sonnenaufgang at 23:00:00 set Aktor1 on ;;;; set Aktor2 on")}


ausgelöst?

ZitatSonnenaufgang nicht definiert...
Wenn du damit meinst, dass im Logfile steht "Sonenaufgang not defined, please define it first"

Dann heisst das
1. Sonnenaufgang ist nicht definiert (dann müsste man untersuchen wieso nicht)
UND
2. if (defined($defs{Sonnenaufgang}))  macht nicht was es soll.




Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: MisterEltako am 30 März 2013, 23:41:26
Ok, ich nehme alles zurück. Nun bin ich auch auf einen "Anfängerfehler" reingefallen...

if (defined($defs{Sonnenaufgang})) {fhem("delete Sonnenaufgang;; define Sonnenaufgang at 23:00:00 set Aktor1 on;;;; set Aktor2 on")}

muss in der 99_myUtils.pm natürlich anders geschrieben werden:

if (defined($defs{Sonnenaufgang})) {fhem("delete Sonnenaufgang; define Sonnenaufgang at 23:00:00 set Aktor1 on ;; set Aktor2 on")}

Das funktioniert nun!!!

@Zrrrongg - vielen Dank ;o)

MfG, MisterEltako.
Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: stever am 31 März 2013, 00:56:42
@Zrrrongg und MisterEltaklo:

Danke! Ich werde wohl meinen Code in den von Zrrrongg zu wandeln, da er lesbarer ist und ich damit auch angefangen hatte. Die bisherigen Erfolge haben schon mal richtig Lust gemacht ein paar Nächte zu investieren :)
Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: Zrrronggg! am 31 März 2013, 03:40:55
Stever &  MisterEltako:

:-)
Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: stever am 31 März 2013, 04:06:49
Habe gerade mit beiden Syntax meinen Rollomotor heiß laufen lassen. Die von Zrrrongg klappt bislang reibungslos, bei der von MisterEltako kommt es manchmal zu Laufzeit Schwierigkeiten. Erklären kann ich mir das mit meinem bisherigen Wissen nicht. Nur mal so zur Info. Ich betreibe alles auf einer FB 7390.

Der bislang endgültige Code zum einfachen hoch und runterfahren:


#===================================
#GWC Rollo steuern (18 Sek Laufzeit)
#===================================

define Rollo_GWC dummy
attr Rollo_GWC alias Rollo
attr Rollo_GWC group vitueller_Rolloschalter
attr Rollo_GWC room EG_WC
attr Rollo_GWC webCmd hoch:runter
#attr Rollo_GWC eventMap /rollo_gwc_hoch:hoch/rollo_gwc_runter:runter/


define rollo_gwc_hoch notify Rollo_GWC:hoch \
set ff800082_eg_wc_rollo B0;;\
define rollo_gwc_hoch_t1 at +00:00:03 set ff800082_eg_wc_rollo released;;\
define rollo_gwc_hoch_t2 at +00:00:19 set ff800082_eg_wc_rollo B0;;\
define rollo_gwc_hoch_t3 at +00:00:19 set ff800082_eg_wc_rollo released

 
define rollo_gwc_runter notify Rollo_GWC:runter \
set ff800082_eg_wc_rollo BI;;\
define rollo_gwc_hoch_t4 at +00:00:03 set ff800082_eg_wc_rollo released;;\
define rollo_gwc_hoch_t5 at +00:00:19 set ff800082_eg_wc_rollo BI;;\
define rollo_gwc_hoch_t6 at +00:00:19 set ff800082_eg_wc_rollo released


Gute Nacht :)
Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: MisterEltako am 31 März 2013, 13:44:16
Hi!

Was bedeutet Laufzeitprobleme? Kannst du das näher beschreiben. Der Code macht ja eigentlich das Gleiche...

MfG, MisterEltako.
Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: stever am 31 März 2013, 14:54:14
Hallo,


define rollo_gwc_hoch_t5 at +00:00:19 set ff800082_eg_wc_rollo BI;;\
define rollo_gwc_hoch_t6 at +00:00:19 set ff800082_eg_wc_rollo released


Hatte ich das released z.T. vor den BI. Macht 0 Sinn oder!!? Vielleicht waren gestern nauch einfach meine Augen schon zu verklebt ;) Werds bei Gelegenheit mal versuchen zu reproduzieren.

Gruß
Titel: Aw: 2 x selber Befehl und delay mit EnOcean
Beitrag von: Zrrronggg! am 31 März 2013, 15:36:34
Ah.
Das ist richtig spannend.

Wenn ich recht drüber nachdenken kann das sein.

Mal angenommen: wenn PERL FHEM aufruft, und FHEM würde diese Aufrufe Mulithreaded abarbeiten, dann wäre genau der Effekt, dass die Reihenfolge bei MisterEltakos schreibweise *NICHT* sicher festgelegt ist, und es sogar vorkommen kann, das Kommandos die laut Uhr zur gleichen Zeit stattfinden sollen praktisch in zufälliger Reihenfolge abgearbeitet werden.

Wären wenn man das alles innnerhalb FHEM macht, wird nicht gethreaded, sondern die Kommandos werden ihm Hautpthread abgearbeitet und dann werden laut Uhr zeitgleiche Komandos in der Reihnefolge der Notation abgearbeitet.


Hm... ist nur eine Threorie von mir, aber je mehr ich drüber nachdenke , desdo mehr glaube ich, dass es exact so ist.

Und damit haben wir eine interessante Erkenntnis: Nämlich das  MisterEltako Notationsmhetode *nicht*  immer genau das selbe macht wie die normale Schreibweise.
Das war mir bisher nicht klar.