Hauptmenü

Anfängerfrage zu notify

Begonnen von djhans, 13 Dezember 2013, 17:40:33

Vorheriges Thema - Nächstes Thema

djhans

Hallo,
ich arbeite gerade das Handbuch zu fhem durch und hänge gerade an dieser Sache auf Seite 25:
Zitatoder Sie schalten das Licht aus, wenn Media eingeschaltet wird – und umgekehrt:
define Schalter1NotifyAn notify Schalter1:on set wz_Media on;;set wz_Licht off
define Schalter1NotifyAus notify Schalter1:off set wz_Media off;;set wz_Licht on
Hinweis: Bei Aufzählungen keine Leerstellen vor und nach den Semikola!
Habe dann folgende Zeile abgesetzt:
define DreamboxNotifyOn notify Dreambox:on set Sonos_Buero Stop;;set Sonos_Bad Stop
das geht aber nicht. wenn ich die Anweisung ";;set Sonos_Bad Stop" weglasse und nur einen Sonos ansteuer, funktioniert das Ganze

Warum klappt die Aufzählung nicht?
Was mache ich fasch!

Danke,
djhans

Rohan

Fhem auf Mini-ITX mit Celeron 2-Core, HMLAN (> 55 Devices), CUL (FS20 und EM), RFXtrx 433E, Arduino (einige DS18B20), RPi mit 1-Wire (DS2423 für S0-Signale, DS18B20+), RPi/Arduino mit MQ-5 und MQ-9 (CO- und CNG/LPG-Sensor), CO-20 IAQ Sensor

Zrrronggg!

Zitatdefine DreamboxNotifyOn notify Dreambox:on set Sonos_Buero Stop;;set Sonos_Bad Stop

Hm. Das ist an sich richtig so (vorausgesetzt,  "Stop" ist ein Befehl den die Sonos-kisten verstehen) und müsste gehen.

Was sagt das Logfile in dem Moment der Auslösung? (Nötigenfalls Loglevel/verbose hochschrauben)


Ich schlage vor, zur weiteren Problemeingrenzung folgendes zu testen:

define DreamboxNotifyOn notify Dreambox:on set Sonos_Buero Stop ;; set Sonos_Bad Stop

Das ist an sich nicht besser als dein Besipiel, bzw die Leerzeichen sind eigentlich nicht notwendig. Jedoch
ZitatHinweis: Bei Aufzählungen keine Leerstellen vor und nach den Semikola!
ist - soweit es eine Verbot darstellen soll - falsch.

Und versuche bitte auch mal folgendes:

define DreamboxNotifyOn notify Dreambox:on set Sonos_Buero,Sonos_Bad Stop

Das ist eine kürzere Schreibweise, mit der man mehrere Aktoren bei denen die selben Schaltopreationen durchgeführt werden müssen zusammenfassen kann.



Ich will mit diesen beiden leicht alternativen Schreibweisen einfach "Reaktionen" provozieren, die uns vielleicht sagen warum dein, an sich korrektes Define nicht geht.

Bitte Ergebnisse immer mit Logfileentries hier posten.


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

djhans

Hallo Zrrronggg!
sorry für mein spätes Feedback, aber ich hatte keinen Zugang zum Internet gehabt. Das passiert schon mal, wenn man seinen Provider wechseln will ;-)

define DreamboxNotifyOn notify Dreambox:on set Sonos_Buero Stop ;; set Sonos_Bad Stop
funktioniert. In fhem selber, macht er aber folgendes daraus:
Dreambox:on set Sonos_Buero Stop ; set Sonos_Schlafzimmer Stop
Das heisst er schmeisst ein Semikolon weg.

Warum vdas jetzt so ist, erstehe ich nicht so ganz...
djhans

Puschel74

Hallo,

ZitatDas heisst er schmeisst ein Semikolon weg.
"Weggeschmissen" wird hier nichts - keine Angst.

ZitatIn fhem selber, macht er aber folgendes daraus:
Und der andere Code ist nicht in fhem?

Du meinst sicher in FHEMWEB steht nur ein Semikolon und in der fhem.cfg stehen 2.
Das ist normal so und auch richtig.

ZitatWarum vdas jetzt so ist, erstehe ich nicht so ganz...
Das sind FHEM-interna wenn man so sagen will.

Es gibt bestimmte Zeichen die müssen in der fhem.cfg maskiert bzw. verdoppelt werden.
Es gibt aber noch andere zusätzliche Regeln an die man sich halten MUSS wenn man die fhem.cfg bearbeitet.

Daher hier nochmal mein Aufruf:

Vergesst das es eine fhem.cfg gibt - dies ist nur ein unbestätigter Mythos.
Bearbeitet eure FHEM-Installation über die Befehlszeile.
Notifys, at etc. lassen sich wunderbar über FHEMWEB (DEF) bearbeiten.
FHEM speichert die dann schon richtig ab - solange der restliche Code stimmt  ;D

Speziell Anfänger können in der fhem.cfg mehr falsch machen als das es läuft.

Ich bin dran eine Anleitung mit Screenshots zu erstellen vom anlegen des ersten Gerätes über anlegen und bearbeiten eines at und zum Schluss ein notify anlegen und mit 2 Dummys dieses schalten lassen.
Ich hab aber nicht den ganzen Tag dafür Zeit - auch wenn es ab und zu anders aussieht  8)

Grüsse
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Zrrronggg!

#5
Zitat
ZitatDreambox:on set Sonos_Buero Stop ; set Sonos_Schlafzimmer Stop
Das heisst er schmeisst ein Semikolon weg.

Warum das jetzt so ist, erstehe ich nicht so ganz...

Ich versuche mal zu erklären, warum.

Zitatset Lampe1 on ; set Lampe2 on

bedeutet, das Fhem, wenn es diesen Befehl sieht, sofort Lampe 1 einschaltet und auch sofort Lampe 2

D.H. zwei Befehle die durch ein Semikolon getrennt werden, werden beide sofort ausgeführt.
Abstrakt:

ZitatBefehl1 ; Befehl2

Führt dazu, dass wenn Fhem diese Zeile vorgeworfen bekommt (entweder durch Lesen in fhem.cfg oder durch Eingabe per TELNET oder Webfrontend) sofort  beide Befehke ausführt. Die Reihenfolge in der ich die Befehle notiere spielt dabei keine Rolle (es ist je nach IOdevice nicht mal sichergestellt, das Lampe1 zuerst ausgemacht wird nur weil es vorne steht)

Wenn du jetzt in die fhem.cfg schreiben würdest:

define DreamboxNotifyOn notify Dreambox:on set Sonos_Buero Stop ; set Sonos_Bad Stop

würde Fhem, sobald es die Zeile in der fhem.cg einliest sofort beide Befehle ausführen. Welche beiden Befehle sind hier gemeint?

1. eine define anlegen: define DreamboxNotifyOn notify Dreambox:on set Sonos_Buero Stop
2. eine "set" ausführen: set Sonos_Bad Stop

D.H. set Sonos_Bad Stop wird mit dem Starten von Fhem beim Einlesen der Fhem.cfg SOFORT und nur DIESES EINE Mal ausgeführt.

Das ist aber nicht was du willst, du willst ja, dass es Bestandteil des defines "define DreamboxNotifyOn notify Dreambox:on..." ist.
Daher muss man den zweiten Befehl quasi an das Define anbinden, und das macht man, indem man das Semikolon verdoppelt:

define DreamboxNotifyOn notify Dreambox:on set Sonos_Buero Stop ;; set Sonos_Schlafzimmer Stop

Der Laie würde vielleicht in Erinnerung an seinen Matheunterricht denken, man müsste das so machen:
define DreamboxNotifyOn notify Dreambox:on (set Sonos_Buero Stop ; set Sonos_Schlafzimmer Stop)
ist aber nicht so.


Dadurch wird das für Fhem nur noch ein Befehl und der wird beim Einlesen der Fhem.cfg ausgeführt: Das Anlegen des defines.

Soweit so gut.

Wenn das notify nun später mal irgendwann ausgelöst wird, also Dreambox auf ON wechselt, dann nimmt Fhem alles was im define als "zu erledigen" drin steht. Hierbei wird eine Escape-Ebene von Semikolons entfernt und der Rest wird interpretiert.

Und wenn man eine Escape-Ebene vom Ausführungsteil  "set Sonos_Buero Stop ;; set Sonos_Schlafzimmer Stop" wegnimmt, bleibt
set Sonos_Buero Stop ; set Sonos_Schlafzimmer Stop
Und DAS wird dann ausgeführt. Und da da jetzt nur noch ein Semikolon ist, werden beide Befehele sofort umgesetzt.


Soweit klar?

Okay, dann noch ein Stufe weiter gedacht. Mal angenommen wir wollten, das wenn die Dreambox eingeschaltet wird folgendes passiert:
- die Sonos-Boxen sollen auf Stop gesetzt werden
- es soll eine weiteres define angelegt werden, das in 5 Minuten ausserdem noch Lampe1 und Lampe2 ausmacht.

Geht das? Und wenn ja wie?

Zunächst mal ganz einfach:
define DreamboxNotifyOn notify Dreambox:on set Sonos_Buero Stop ;; set Sonos_Schlafzimmer Stop ;; define LichtAusSpaeter at +00:05:00 set Lampe1 off ...

Aber wie jetzt weiter?
Wenn ich schreibe:

define DreamboxNotifyOn notify Dreambox:on set Sonos_Buero Stop ;; set Sonos_Schlafzimmer Stop ;; define  LichtAusSpaeter at +00:05:00 set Lampe1 off ;; set Lampe 2 off

Passiert folgendes: Wenn "Dreambox:on" eintritt würde Fhem  den "zu erledigen" Teil des defines nehmen und eine Escape-Ebene wegschneiden (es wird einfach jedes 2. Semikolon entfernt). Raus kommt:

Zitaton set Sonos_Buero Stop ; set Sonos_Schlafzimmer Stop ; define  LichtAusSpaeter at +00:05:00 set Lampe1 off ; set Lampe 2 off
also 4 Befehle, die alle zugleich ausgeführt würden:
- set Sonos_Buero Stop
- set Sonos_Schlafzimmer Stop
- define  LichtAusSpaeter at +00:05:00 set Lampe1 off
- set Lampe 2 off

Mit anderen Worten: Lampe2 würde sofort ausgehen und nicht wie geplant erst in 5 Minuten.
Das war aber nicht das Gewollte. Wir kriege ich das nun hin? Durch erneutes escapen, also erneutes Verdoppeln des Semikolons:

define DreamboxNotifyOn notify Dreambox:on set Sonos_Buero Stop ;; set Sonos_Schlafzimmer Stop ;; define at +00:05:00 set Lampe1 off ;;;; set Lampe 2 off

Das ergibt Folgendes: Wenn Dreambox:on eintritt, würde Fhem  den "zu erledigen" Teil des defines nehmen und eine Escape-Ebene wegschneiden (es wird einfach jedes 2. Semikolon entfernt). Raus kommt:

set Sonos_Buero Stop ; set Sonos_Schlafzimmer Stop ; define LichtAusSpaeter at +00:05:00 set Lampe1 off ;; set Lampe 2 off
also nur DREI Befehle, die alle zugleich ausgeführt würden:
- set Sonos_Buero Stop
- set Sonos_Schlafzimmer Stop
- define LichtAusSpaeter at +00:05:00 set Lampe1 off ;; set Lampe 2 off


Und nach 5 Minuten wird  LichtAusSpaeter  ausgelöst. Fhem  nimmt  den "zu erledigen" Teil des defines und schneidet eine Escape-Ebene weg (es wird einfach jedes 2. Semikolon entfernt). Raus kommt:

set Lampe1 off ; set Lampe 2 off

Und das wird dann gemacht.



ZitatDaher hier nochmal mein Aufruf:

Vergesst das es eine fhem.cfg gibt - dies ist nur ein unbestätigter Mythos.
Bearbeitet eure FHEM-Installation über die Befehlszeile.
Notifys, at etc. lassen sich wunderbar über FHEMWEB (DEF) bearbeiten.
FHEM speichert die dann schon richtig ab - solange der restliche Code stimmt

Ich muss zugeben, ich habe das zuerst für einen ironischen Scherz gehalten... weil ich genau das Gegenteil propagiere: "Bearbeitet NUR die fhem.cfg mit einem Editor (oder den im Webfrontend eingebauten Editor)". Fummelt keinesfalls direkt ins Webfrontend eingegeben Befehlen rum.

Was aber Puschel74 und mich vermutlich eint ist: Wenn man BEIDES macht wird man sich als Anfänger im Escapen garantiert ein Ei legen. Also sollte man sich entscheiden: Befehle direkt eingeben und mit  FHEMWEB (DEF)  arbeiten, ODER die fhem.cfg direkt bearbeiten. Beides zugleich ist für den Anfänger schwer zu beherrschen.

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

djhans

Hallo Puschel74 hallo Zrrronggg,
das ist mal eine tolle Erklärung! Ganz herzlichen Dank für die Mühe! Ich denke, ich habe das jetzt verstanden und spiele mal damit rum.

Ich muss gestehen, die Syntax ist schon ein wenig gewöhnungsbedürftig, da ich die Klammersetzerei aus anderen Programmiersprachen kenne und diese logisch für mich ist. Das mit den Escape-Ebenen ist mir in der Form noch nicht unter gekommen. 
Vielen Dank dafür,
Christian