FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: autonomo am 25 Mai 2015, 23:59:35

Titel: Setzen einer dummy Variablen/Aktoren in notify funktioniert nicht - warum?
Beitrag von: autonomo am 25 Mai 2015, 23:59:35
Hallo,
ich habe folgendes Konstrukt:


define alleAktorenAus dummy
...
define Wandschalter1_S3_on notify Wandschalter1_S3:on set alleAktorenAus 'on'
define Wandschalter1_S3_off notify Wandschalter1_S3:off set alleAktorenAus 'off'

Mit Hilfe dieser Variablen alleAktorenAus möchte ich in einer separaten func alle Aktoren ausschalten:
############## Function für alle Aktoren AUS # #################
#
define test dummy
define func_alleAktorenAus notify alleAktorenAus { \
fhem("set test 'halloAn'");;\
my $allesAus = (Value("alleAktorenAus"));;\
if ($allesAus eq "on") {\
{fhem("set test 'An')};;\
{fhem("set TV_Wohnzimmer on")};;\
{fhem("set TV_Wohnzimmer off-for-timer 0.5")};;\
{fhem("set Multiswitch on")};;\
{fhem("set Multiswitch  off-for-timer 0.5")};;\
{fhem("set alleAktorenAus 'halloAn')};;\
}\
...

Das Zuweisen der Werte on und off zu alleAktorenAus funktioniert, laut Everything Auflistung wird auch die Funktion func_AlleAktorenAus aufgerufen; nur es funktionieren weder die Aktorenschaltungen noch Testzuweisungen, und ich verstehe nicht warum. Habe mit der if Anweisung etc. schon alle möglichen Formulierungen und Syntaxe probiert, aber ohne Erfolg.
1) warum wird die Variable test nicht mit dem zugewiesenen Text belegt? der Status ist immer die drei Fragezeichen
2) irgendwie funktoniert - trotz Aufruf der func - weder die test-Zuweisung noch die Aktorenschaltung - warum?
3) auch wollte ich den Wert von alleAktorenAn nach Durchlauf der Schaltungen ändern, damit diese Anweisungen nicht dauernd durchlaufen werden; funktioniert auch nicht
Da mache ich bestimmt prinizipiell was verkehrt, aber ich sehe nicht, was.

Anmerkungen:
hier habe ich Einschaltbefehle zum Testen genommen; das doppelte Einschalten habe ich getestet, da es sich um intertechno Aktoren handelt, die nicht immer aufs erste Mal einschalten.

schon mal vielen Dank für die Hilfe!
Titel: Antw:Setzen einer dummy Variablen/Aktoren in notify funktioniert nicht - warum?
Beitrag von: Zrrronggg! am 26 Mai 2015, 02:36:52
Wow ist das kompliziert geschrieben... so viel überflüssige Klammern und fhem->perl->fhem übergaben.

Und dadurch auch Schreibfehler:

Hier z.B.
{fhem("set test 'An')}
fehlen die " am am Ende.


Aber gut, das ist nur eine Flüchtigkeitsfehler. Versuch doch mal bitte anstatt

define func_alleAktorenAus notify alleAktorenAus { \
fhem("set test 'halloAn'");;\


die vereinfachte Form

define func_alleAktorenAus notify alleAktorenAus set test halloAn

Wenn das geht, würde ich als nächstes mal alle ' entfernen, die braucht's meiner Aufassung nach nicht, dass wird das Problem sein.

Anderes Thema....mehr am Rande, weil es geht, aber sowas hier
{fhem("set test 'An')};;\
{fhem("set TV_Wohnzimmer on")};;\
{fhem("set TV_Wohnzimmer off-for-timer 0.5")};;\
{fhem("set Multiswitch on")};;\


ist wie oben erwöhnt meiner Aufassung nach übermässig umständlich.
Geht auch so:

{fhem("set test An ;; set TV_Wohnzimmer,Multiswitch on ;; set TV_Wohnzimmer off-for-timer 0.5")}

Oder so, wenn's denn unbedingt eine Zeile je Befehl ("strukturiert") sein muss:

{fhem("set test An ;;\
set TV_Wohnzimmer on ;;\
set TV_Wohnzimmer off-for-timer 0.5;;\
set Multiswitch on")}




Denn:

{fhem(" ... ")}

bedeutet ins Deutsche übersetzt:
"sag Fhem, es soll perl sagen, perl soll fhem sagen, dass ..."
Klingt irgendwie umständlich?
Eben.

Ich weiss, viele Codebeispiele hier sind so formatiert, ich wette die meisten schreiben das selber nur irgendwo ab und wissen gar nicht was das macht.

Wenn du natürlich ein Freund von Code-Zierrat bist kannst du es auch so lassen, gehen tut's.
Titel: Antw:Setzen einer dummy Variablen/Aktoren in notify funktioniert nicht - warum?
Beitrag von: autonomo am 27 Mai 2015, 17:23:17
Hallo Zrrronggg,

vielen Dank für deine Tipps; in der Tat trafen sich hier mehrere Probleme:
1) es war einfach schon zu spät  ;)
2) die Syntax stimmte nicht
3) der Wandtaster hatte noch Einfluss
4) die IT Schaltsteckdosen sind auch noch ein Problem

1) da werde ich wohl auch in Zukunft nichts ändern können ....  :(
2) Ich habe mir nochmal auf frischer Wiese ein Beipiel geschrieben, dass dann auch einwandfrei funktioniert hat:
define allesAus dummy
define Wandschalter1_S1_on notify Wandschalter1_S1:on set tv1 on
define Wandschalter1_S1_off notify Wandschalter1_S1:off set tv1 off
define Wandschalter1_S2_on notify Wandschalter1_S2:on set tv2 on
define Wandschalter1_S2_off notify Wandschalter1_S2:off set tv2 off
define Wandschalter1_S3_on notify Wandschalter1_S3:on set allesAus on
define Wandschalter1_S3_off notify Wandschalter1_S3:off set allesAus on

define allesAusNotify notify allesAus {\
Log 1, "in allesAusNotify reingesprungen ";;\
my $aus = Value('allesAus');;\
if ($aus eq 'on') {\
fhem("set tv1 off ");;\
fhem("set tv2 off ");;\
fhem("set tvAll off ");;\
}\
}
define tv1AnNotify notify tv1:on {\
Log 1, "auch Multiswitch einschalten ";;\
fhem("set tvAll on ");;\
}
define tv2AnNotify notify tv2:on {\
Log 1, "auch Multiswitch einschalten ";;\
fhem("set tvAll on ");;\
}

Auf der grünen Wiese (ohne reale Schaltgeräte) hat das auch prächtig funktioniert. aaaber.....

3) der Wandtaster-Einfluss kam noch mit hinzu: manchmal klappte es, manchmal nicht; schuld waren vereinzelt zu lange Tastvorgänge (>0,4sec), die dann z.B. nicht zu einem 'on' sondern zu einem 'dimup' führten und damit keinen Schaltvorgang auslösten.
Als Abhilfe habe ich daher zusätzlich zu  jedem on/off noch einen dimup/dimdown set ... on/off deklariert.
Damit wurde das Ein-/Ausschalten mit jedem Tastendruck, egal wie lange, sicher.

4) IT Schaltsteckdosen / FS20 Schaltsteckdosen
leider funktionierte das gemeinsame Ausschalten nicht; es gab immer wieder Steckdosen, die an blieben; daher hatte ich die komplizierte Doppelausschaltung eingefügt, die aber keine Besserung brachte.
Dann habe ich die IT gegen FS20 getauscht und siehe da, es war wesentlich besser, aber noch nicht perfekt; nach langem googlen fand ich dann auch hierfür die Ursache/die Lösung:
ich hatte natürlch durch das Testen viele Schaltvorgänge, aber
-- da gibt es die 1% Regel, wenn die zuschlägt, gibts erstmal keine Schaltvorgänge mehr oder sie werden später ausgeführt.
-- prinzipiell geht es nicht, die Schaltbefehle für mehrere Aktoren auf einen Schlag zu senden, da sich die Funktelegramme sonst gegenseitig stören - das erste kommt meistens noch, alle anderen nicht mehr
---- bei den FS20 fällt das nicht so auf, da hier bei Sammelschaltbefehlen automatisch ein zeitlicher Abstand zwischen den gesendeten Schaltvorgängen eingefügt wird (das macht das FS20 Paket)
---- bei den IT Steckdosen ist im IT-Paket dieser Abstand prgarmmtechnisch definitiv nicht mit vorgesehen; d.h. hier darf man nicht z.B. alle in eine structure stecken und dann schalten, sondern man muss das einzeln machen mit einem z.B. "sleep 30" dazwischen, dann funktioniert es

Somit konnte ich fast alles lösen;
das mit den Befehlen hintereinander durch ;; getrennt hatte ich auch versucht, aber es hat bei mir nicht funktioniert; wahrscheinlich wegen dem fehlenden Funkabstand (hatte das noch mit den ITs getestet, jedoch nicht mehr mit den FS20);
das werde ich heute nochmal ausprobieren.
Wenn das dann so klappt, werde ich die Anregung gerne aufnehmen, meinen Code wesentlich zu vereinfachen  :)