Hauptmenü

Problem mit notify

Begonnen von fhainz, 10 Juni 2013, 18:49:56

Vorheriges Thema - Nächstes Thema

fhainz

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

UliM

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

RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Zrrronggg!

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.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

fhainz

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

MisterEltako

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
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

fhainz

Ich hab mich bei deinem letzten beitrag grad arg verlesen.
Jetz kommt aber der fehler Unknown command if, try help

Zrrronggg!

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.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

MisterEltako

...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
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Zrrronggg!

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.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

fhainz

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!

MisterEltako

@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
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

MisterEltako


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
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

fhainz

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?

Zrrronggg!

So mach ich das auch immer.  (ich nenn das define aber nicht Latenz, sondern sowas wie "auschalten_Licht_verzoegert" oder so)
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

MisterEltako

;;;;, 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
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310