FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: fhainz am 10 Juni 2013, 18:49:56

Titel: Problem mit notify
Beitrag von: fhainz am 10 Juni 2013, 18:49:56
Hallo Leute!

Ich hab ein eigenartiges Problem bei einem Notify.

So funktioniert es:
define Abwesend notify ZuHauseD:off set group=Licht off;;set group=Steckdosen off;;{if (Value("S8M_1E1") eq "on") { fhem("set SM4_1A1 on-for-timer 3") }};;{if (Value("Winter") eq "on") { fhem("set fhtWohnzimmer desired-temp 18") }  }

So leider nicht:
define Abwesend notify ZuHauseD:off {if (Value("S8M_1E1") eq "on") { fhem("set SM4_1A1 on-for-timer 3") }};;set group=Licht off;;set group=Steckdosen off;;{if (Value("Winter") eq "on") { fhem("set fhtWohnzimmer desired-temp 18") }  }

Ich bekomme diese Fehlermeldung:
2013.06.10 18:46:16 3: Abwesend return value: Can't locate object method "Licht" via package "off" (perhaps you forgot to load "off"?) at (eval 80564) line 1.

Ich bevorzuge die 2. Variante deswegen weil zuerst das Vorzimmer Licht (Treppenhaus Schaltung wird durch ein Relais simuliert) und anschließend erst die restlichen Steckdosen+Licht ausgeschalten werden.

Kann mir jemand erklären warum Variante 2 nicht funktioniert?

Grüße
Titel: Aw: Problem mit notify
Beitrag von: UliM am 10 Juni 2013, 19:04:03
Hi,
set group=Licht off ist ein fhem-Befehl, den Du aber in einer perl-Klammer {} verwendest.

Vll geht es so:

define Abwesend notify ZuHauseD:off {if (Value("S8M_1E1") eq "on") { fhem("set SM4_1A1 on-for-timer 3;set group=Licht off;set group=Steckdosen off")}; if (Value("Winter") eq "on") { fhem("set fhtWohnzimmer desired-temp 18") }  }


Bin nicht sicher ob die Dopplung der Semikola hier erforderlich ist...

Gruß, Uli

Titel: Aw: Problem mit notify
Beitrag von: Zrrronggg! am 10 Juni 2013, 19:11:41
ZitatBin nicht sicher ob die Dopplung der Semikola hier erforderlich ist...

Ich denke schon. Bezüglich der 2ten if- Construction habe ich aber erhebliche Zweifel. In fhainz 1. Code sind die ifs gleichwertig, im 2. Beispiel aber verschachtelt. Das ist sehr gefährlich und macht oft nicht was man will. Ich empfehle das in 2 defines zu packen, das macht debugging deutlich leichter.

Wen du (fhainz) mir sagst, was du genau erreichen willst, kann ich mal was zusammennageln.
Titel: Aw: Problem mit notify
Beitrag von: fhainz am 10 Juni 2013, 21:23:16
Hallo!

@Ulli
Die Pear Klammer sind schon wieder zu. }};;set group=Licht off;; Und in der if geht nicht. Die gruppen licht und steckdosen sollen immer ausgehen.

@ Zrrronggg!
S8M_1E1 = Status Vorzimmer Licht (on/off)
SM4_1A1 = Relais das den Taster für die Treppenhausschaltung simuliert

Wenn ich die Wohnung verlasse dann drücke ich einen Taster der mir das notify Abwesend auslöst. Anschließend will ich das, als erstes falls das Vorzimmer Licht ein ist es abgeschaltet wird. Das macht bisher die if und das set SM4_1A1 on-for-timer 3 . Anschließend sollen noch alle Lichter (Gruppe Licht) und alle Steckdosen (Gruppe Steckdosen) abgeschalten werden. Am Schluss soll noch gecheckt werden ob Winter (ein dummy) ist, wenn ja dann die Soll-Temperatur runter setzen.

Das hat auch bisher wunderbar funktioniert. Hatte bisher Version 1 in Verwendung. Nun wollte ich das eben das Vorzimmerlicht vor den Steckdosen und den anderen Lichtern abgeschaltet wird. Das endete in der Fehlermeldung.

Ich hoffe ich konnte mein Problem halbwegs Verständlich beschreiben ;)

Grüße
Titel: Aw: Problem mit notify
Beitrag von: MisterEltako am 10 Juni 2013, 22:21:55
Funktioniert es so?

define Abwesend notify ZuHauseD:off {\
if (Value("S8M_1E1") eq "on") {fhem("set SM4_1A1 on-for-timer 3")};;\
fhem("set group=Licht off");;\
fhem("set group=Steckdosen off")};;\
if (Value("Winter") eq "on") {\
   fhem("set fhtWohnzimmer desired-temp 18");;\
}}


Wenn ja kann man die fhem- kommandos noch zusammen fassen.

MfG, MisterEltako
Titel: Aw: Problem mit notify
Beitrag von: fhainz am 10 Juni 2013, 22:27:12
Ich hab mich bei deinem letzten beitrag grad arg verlesen.
Jetz kommt aber der fehler Unknown command if, try help
Titel: Aw: Problem mit notify
Beitrag von: Zrrronggg! am 10 Juni 2013, 22:35:52
ZitatNun wollte ich das eben das Vorzimmerlicht vor den Steckdosen und den anderen Lichtern abgeschaltet wird.

Mit verschiedenen Anordnungen innerhalb eines Defines wirst du da wenig Unterschied feststellen. Die Kommandos werden alle auf einigermassen normal schnellen Systeme innerhalb ca. einer Sekunde gesendet werden, wenn du jeweils viele Aktoren in deinen Gruppen hast dauerst vielleicht 3 Sekunden.

D.H. ja die werden vorher ausgeschaltet aber nur 0,3 Sekunden vorher.  Ist es dass was du willst?

Ausserdem: Warum schaltest du das Licht im Vorzimmer nur aus, wenn es an ist? Die Prüfung bringt null Vorteile und macht das define nur unnötig komplex. Schalte das Licht doch einfach IMMER aus. Wenns vorher aus ist, ists hinterher auch aus: Ziel erreicht.... ah, ich sehe gerade du schaltest das Licht mit "on-for-timer 3" aus. Also Stromstossrelais oder so? Dann geht ziehe ich meinen Einwand zurück  ;-)

Zuletzt: Man muss nicht, aber übersichtlicher wird das (vor allem bei der Durchdringung von mehren IFs in einem statement) wenn man mehre Bedingungen auf 2 defines verteilt.

Wenn also Mr. Eltakos Vorschlag dein Problem nicht sowieso löst, würde ich folgendes vorschlagen:

define AbwesendLicht notify ZuHauseD:off {if (Value("S8M_1E1") eq "on") { fhem("set SM4_1A1 on-for-timer 3 ;; set group=Licht off ;; set group=Steckdosen off") }  }
define AbwesendHZ notify ZuHauseD:off ;{if (Value("Winter") eq "on") { fhem("set fhtWohnzimmer desired-temp 18") }  }


Aber wie gesagt, die Reihenfolgenänderung wird kaum was bringen, da müsstest du schon paar Sleeps oder einstreuen. Der wesentliche Unterschied zwischen MisterEltakos und meinem Vorschlag ist die Aufteilung auf 2 Defines.
Titel: Aw: Problem mit notify
Beitrag von: MisterEltako am 10 Juni 2013, 22:36:32
...und genau das machen diese Codezeilen, wenn man die eine fehlerhafte } wegnimmt:

define Abwesend notify ZuHauseD:off {\
if (Value("S8M_1E1") eq "on") {fhem("set SM4_1A1 on-for-timer 3")};;\
fhem("set group=Licht off");;\
fhem("set group=Steckdosen off");;\
if (Value("Winter") eq "on") {\
 fhem("set fhtWohnzimmer desired-temp 18");;\
}}

Deswegen auch die umständliche Schreibweise, damit man übersichtlich das Geschehen verfolgen kann.

MfG, MisterEltako
Titel: Aw: Problem mit notify
Beitrag von: Zrrronggg! am 10 Juni 2013, 22:40:23
define AbwesendHZ notify ZuHauseD:off {if (Value("Winter") eq "on") { fhem("set fhtWohnzimmer desired-temp 18") }  }

Müsste es bei mir übrigens heissen.


ZitatDeswegen auch die umständliche Schreibweise, damit man übersichtlich das Geschehen verfolgen kann.

Ja, ich weiss das du das Übersichtlicher findest... ich irgendwie nicht so recht. Das wär ja egal, wenn es hier nicht inzwischen viele Anfänger gäbe , die glauben das MUSS so und sogar meinen man muss am Ende noch mal ";;" anhängen.

Aber nun ja., da werden wir wohl nie einer Meinung sein.


Okay. ich sehe gerade ich hab eh nicht aufgepasst, du wolltest das nur Steckdosen und Licht immer OFF haben. Sorry, hab zu schnelle gelesen.
Nimm erstmal MisterEltakos, das müsste gehen.
Titel: Aw: Problem mit notify
Beitrag von: fhainz am 10 Juni 2013, 22:49:19
Danke eure Scripte funktionieren. Hatte unten weiter noch einen Fehler.
Dass das Vorzimmer Licht zuerst ausgeht funktioniert nicht wie du gesagt. Es gehen zuerst die Steckdosen aus. Naja kann man nichts machen. Hatte vorher eine XS1 und bei der hats genauso funktioniert aber da kamen dann die Funkbefehle anscheinend nacheinander.

Vielen Dank für eure Hilfe!
Titel: Aw: Problem mit notify
Beitrag von: MisterEltako am 10 Juni 2013, 22:50:00
@Zrrronggg

;o)

Deswegen habe ich doch extra "umständlich" erwähnt!

Aber zum Testen finde ich das gut. So kann man wie beim debuggen Zeilenweise prüfen, was funktioniert. Gerade beim Zusammenfassen passieren Anfängern leicht Fehler.

Was ich echt toll fände, wenn im Rahmen des Fhemprojekts endlich einrichtiger Editor mit Syntax und Hilfe entstehen würde. Dann müsste mansich um die Schreibweise keine Sorgen mehr machen. Leider reichen dafür meine Perlkenntnisse (noch) nicht aus.

MfG, MisterEltako
Titel: Aw: Problem mit notify
Beitrag von: MisterEltako am 10 Juni 2013, 22:55:30

Dann probiere mit Latenz:

define Abwesend notify ZuHauseD:off {\
if (Value("S8M_1E1") eq "on") {fhem("set SM4_1A1 on-for-timer 3")};;\
fhem("define Latenz at +00:00:05 set group=Licht off;;;;set group=Steckdosen off");;\
if (Value("Winter") eq "on") {\
fhem("set fhtWohnzimmer desired-temp 18");;\
}}

Die Zeiten musst du ausprobieren.

MfG, MisterEltako
Titel: Aw: Problem mit notify
Beitrag von: fhainz am 10 Juni 2013, 23:07:51
Danke!! Nun geht das Licht ca. 0.5 Sek. nach dem betätigen des Tasters aus.
Mit define Latenz at +00:00:01 funktioniert es sogar noch perfekt.  Es geht anscheinend nur ums verzögern.

Edit:
Warum macht man hier ;;;; und nicht nur ;; um die beiden set's zu trennen?
Titel: Aw: Problem mit notify
Beitrag von: Zrrronggg! am 10 Juni 2013, 23:13:01
So mach ich das auch immer.  (ich nenn das define aber nicht Latenz, sondern sowas wie "auschalten_Licht_verzoegert" oder so)
Titel: Aw: Problem mit notify
Beitrag von: MisterEltako am 10 Juni 2013, 23:22:51
;;;;, weil das bei ;; nur das erste Kommando verzögert und das zweite sofort ausführen würde.

;;;;, verbindet in dem Fall weil ein define im define definiert wird.

MfG, MisterEltako
Titel: Aw: Problem mit notify
Beitrag von: fhainz am 10 Juni 2013, 23:26:40
und wenn ich jetzt 3 befehle hätte müsste ich dann ;;;;;; machen?

Das selbe Ergebnis hätte ich dann mit
fhem("define verzoegern1 at +00:00:01 set group=Gruppe1 off");;\
fhem("define verzoegern2 at +00:00:01 set group=Gruppe2 off");;\
fhem("define verzoegern3 at +00:00:01 set group=Gruppe3 off");;\

oder?
Titel: Aw: Problem mit notify
Beitrag von: MisterEltako am 11 Juni 2013, 09:34:51
Den Fall hatte ich noch nicht. Aber eigentlich nur wenn du ein define im define im define definierst. Aber das macht man eigentlich nicht und braucht man auch nicht.

Wenn du nur 3 Befehle im 2 define haben möchtest, dann so:

define Abwesend notify ZuHauseD:off {\
 if (Value("S8M_1E1") eq "on") {fhem("set SM4_1A1 on-for-timer 3")};;\
 fhem("define Latenz at +00:00:01 set group=Gruppe1 off;;;;set group=Gruppe1 off;;;;set group=Gruppe1 off");;\
}

MfG, MisterEltako