Hallo Zusammen,
ich habe ein Fenster an dem zwei Fensterkontakte angebracht sind, einer oben, einer unten.
Nun wird wenn das Fenster gekippt, der eine Sensor ausgelöst und wenn das Fenster offen ist, dann werden beide ausgelöst.
Ich würde gerne aus beiden Sensoren folgende Zustände erzeugen:
- Geschlossen
- Offen
- Gekippt
- Error (wenn z.B. der untere ausgelöst ist und der obere nicht)
Wenn ich das richtig verstanden habe, dann muss das mit Notify gehen.
Da ich das gerne auf alle Fenster anwenden möchte, muss ich das vermutlich so anlegen, dass alle ESPEasy Geräte die ein Fenster sind wählen.
In dem Fall heißt das Device: ESPEasy_HA_MCU_ID104_Fenster
Und die weiteren werden bis auf die ID gleich heißen, somit müsste ich das Notify auf alle Devices anwenden, die so heißen: ESPEasy_HA_MCU_ID.*_Fenster
Für mich ist das alles neu, ich kann zwar programmieren, jedoch fällt es mir leider etwas schwer mich richtig einzufinden in FHEM.
Evtl. ein kleines Beispiel, damit ich in Zukunft solche Probleme selbstständiger lösen kann. =)
Grüße
Gear
Nimm Structure dafür.
Hallo CoolTux,
danke für den Tip, hatte ich aber schon versucht, irgendwie verstehe ich Structure nicht.
Ich dachte einfach ein Notify, nen bissel Code und fertig.
Hallo Gear,
dann such Dir doch erstmal die Events aus, auf Du du reagieren möchtest. Und ein notify legt Dir der Eventmonitor auch an, wenn Du willst:
https://wiki.fhem.de/wiki/Event_monitor
Darauf kannst Du dann aufbauen.
Dein Vorschlag ist eventuell als Device regEx zu gebrauchen ESPEasy_HA_MCU_ID.*_Fenster aber Du brauchst mit Sicherheit noch einen Einschränkung der Events.
Es gibt viele Wege für Deinen Wunsch. Wie willst Du den Zustand darstellen? Anfänger nehmen dafür gern einen dummy.
Du kannst im notify den Zustand der Sensoren abfragen.
Pseudo Code Ansatz:
define n_Fenster notify ESPEasy_HA_MCU_ID.*_Fenster IF ([Kontakt1] eq "offen" and [Kontakt2] eq "offen")(set Dummy offen)
Gruß Otto
Hallo Otto,
danke für deine Antwort.
Ich muss mich an dieser Stelle entschuldigen, ich habe eine Lese- Rechtschreibschwäche, die leider nicht behandelbar ist, da sie von einer Behinderung kommt.
Mir fällt es leider schwer mich in neue Themen einzuarbeiten, da es am Anfang wenn man neue ist, einfach zu viel ist für mich.
Ich kann solange ich etwas nicht richtig verstehe, dies auch nicht auf andere Anwendungsbereiche anwenden, da ich erstmal verstehen muss, wie das im Beispiel funktioniert und dann muss ich das irgendwie auf mein vorhaben anwenden. Leider verstehe ich manchmal die Beispiele nicht, dann fällt es mir schwer das in abgewandelter Form anzuwenden.
Also, FHEM legt bei mit mit ESPEasy das Fenster an, dieses Fenster hat 2 Sensoren, ich würde gerne wie auch immer, sobald sich ein Status ändert, diesen auswerten lassen und dann auch wieder, wenn möglich in das Device schreiben aus dem es die Fensterkontakte ausliest.
Ich hab z.B. leider auch nicht verstanden wie ich z.B. folgendes Device mit den "Kontakten" irgendwie auslesen kann.
Device: ESPEasy_HA_MCU_ID104_Fenster
Sensor 1: FO (on / off)
Sensor 2: FG (on / off)
Kann man nicht in einem Notify eine if else abfrage einbauen, die den jeweiligen Status an das Device zurück gibt?
Wenn ja, wie bekomme ich die Sensoren rein und den Status raus.
Wenn nein, dann habe ich das falsch verstanden.
Es tut mir leid für die Umstände.
Ich zeige Dir wie man es mit structure machen kann. gib mir etwas
Statt wir bei mir die Dummys nimmst Du natürlich Deine Sensoren an dem Fenster.
Internals:
ATTR windowSensor
CFGFN
CHANGEDCNT 15
DEF windowSensor sensorObenBadfenster sensorUntenBadfenster
NAME structureFensterBad
NR 114
NTFY_ORDER 50-structureFensterBad
STATE title
TYPE structure
READINGS:
2018-03-17 15:21:53 LastDevice sensorObenBadfenster
2018-03-17 15:21:53 LastDevice_Abs sensorObenBadfenster
2018-03-17 15:21:53 state title
Attributes:
clientstate_behavior relative
clientstate_priority open tilted closed
room Test
Internals:
CFGFN
NAME sensorObenBadfenster
NR 98
STATE on
TYPE dummy
READINGS:
2018-03-17 15:21:53 state on
Attributes:
room Test
userattr structexclude windowSensor windowSensor_map
windowSensor structureFensterBad
windowSensor_map state:on:tilted state:off:closed
Internals:
CFGFN
NAME sensorUntenBadfenster
NR 101
STATE off
TYPE dummy
READINGS:
2018-03-17 15:21:47 state off
Attributes:
room Test
userattr structexclude windowSensor windowSensor_map
windowSensor structureFensterBad
windowSensor_map state:on:open state:off:closed
Das ist aber noch ohne Fehlermeldung wenn oben zu ist und unten auf was ja eigentlich nicht gehen dürfte.
Hallo Gear,
kein Problem. Cooltux und Ich sind eigentlich sehr geduldig. Wir bekommen das bestimmt parallel irgendwie hin. Also CoolTux versucht Dir die structure nahe zubringen und ich deine Fragen zum notify zu beantworten. Sag einfach wenn Du das eine oder andere nicht willst ;)
Um Deine erste Frage mit Beispielen zu erklären bräuchte ich mal die Ausgabe von einem "list ESPEasy_HA_MCU_ID104_Fenster"
ZitatIch hab z.B. leider auch nicht verstanden wie ich z.B. folgendes Device mit den "Kontakten" irgendwie auslesen kann.
Device: ESPEasy_HA_MCU_ID104_Fenster
Sensor 1: FO (on / off)
Sensor 2: FG (on / off)
Zu Deiner zweiten Frage:
ZitatKann man nicht in einem Notify eine if else abfrage einbauen, die den jeweiligen Status an das Device zurück gibt?
Ja, mein Code oben hat ja genau so etwas gemacht. Du möchtest keine extra dummy sondern den Status im Device selbst setzen? Dann machst Du einfach nicht ein set dummy sondern ein setstate.
Ich baue Dir ein konkretes Beispiel wenn ich Dein list habe.
Gruß Otto
Zitat von: Otto123 am 17 März 2018, 15:40:06
Ja, mein Code oben hat ja genau so etwas gemacht. Du möchtest keine extra dummy sondern den Status im Device selbst setzen? Dann machst Du einfach nicht ein set dummy sondern ein setstate.
Otto bitte nicht vergessen, setstate gibt kein Event. Sage es nur vorsichtshalber falls da später sowas gewünscht oder erforderlich sein sollte.
Grüße
@Cooltux - ich weiß. Will ich dies ja dann genau in dem Moment nicht: die ESPEasy Devices setzen ihren STATE sowieso separat. Dann könnte man den doch wirklich vom notify einfach überschreiben, wenn Gear das gerne so möchte.
Um noch mal nachzufragen, mit Reading überschreiben.
Wenn ich mich da evtl. falsch ausgedrückt haben sollte, ich möchte ein neues Reading hinterlegen lassen, welches den Status enthält der vom Notify.
expandJSON macht ja aus den JSON Daten von den SONOFF TH Geräten die Readings für Temperatur und Luftfeuchte.
Meine Idee war eben, genau dies zu erzeugen.
Oder Geht das bei den ESPEasy Devices nicht?
Ich versuche es gleich mal. :)
Danke!
klar geht auch, dann einfach setreading ESPEasy_HA_MCU_ID104_Fenster ZustandFenster offen
oder so :D
In meinem Beispiel mit dem IF kannst Du die existierenden Readings so abfragen [ESPEasy_HA_MCU_ID104_Fenster:FO] eq "offen" wenn das Reading FO heisst.
Gruß Otto
hi, hab es so bei einigen Fenstern gelöst
([ESPEasy_ESP34:FE07open] eq "0" and [ESPEasy_ESP34:FE07tilted] eq "0")
(set Kueche window closedclosed,set plotKueche window 0,{Heizung("Kueche","FHT_0304","[Kueche:temp-zeit]")})
DOELSEIF
([ESPEasy_ESP34:FE07open] eq "1" and [ESPEasy_ESP34:FE07tilted] eq "1")
(set Kueche window tiltedclosed,set plotKueche window 20,{Heizung("Kueche","FHT_0304","[Kueche:temp-zeit]")})
DOELSEIF
([ESPEasy_ESP34:FE07open] eq "1" and [ESPEasy_ESP34:FE07tilted] eq "0")
(set Kueche window openclosed,set plotKueche window 20,{Heizung("Kueche","FHT_0304","[Kueche:temp-zeit]")})
include Heizungsteuerung
ESPEasy_ESP34:FE07open] eq "1" daten vom ESP
dummy für Küche Tür usw. set Kueche window tiltedclosed (da doppel Fenster) (ist auch vorbereitet um auf 4 Sensoren zugehen)
dummy für Plot der Küche set plotKueche window 20
und die heizungsteuerung {Heizung("Kueche","FHT_0304","[Kueche:temp-zeit]")}
gruss
ps: Fehler wäre dann (doelseif 0 1) habe da aber noch nie ein Fehler gehabt
Ich finde ja persönlich die structure immer noch am besten für sowas ;D
Zitat von: CoolTux am 17 März 2018, 19:16:11
Ich finde ja persönlich die structure immer noch am besten für sowas ;D
hi, hatte damit früher Probleme und seit dem nicht mehr gebraucht,
vielleicht schau ich mir das nochmal an.
gruss
So, das mit den Notify hab ich nun verstanden und das geht damit.
Genauso wie mit userReading.
Nun bin ich aber angefixt und will das mit Structur auch noch verstehen.
Ich habe die Structur angelegt wie folgt:
defmod WZ.Fenster.Seite structure HA_MCU_ID104_Fenster HA_MCU_ID104_Fenster.FO:.* HA_MCU_ID104_Fenster.FG:.*
attr WZ.Fenster.Seite DbLogExclude .*
Vermutlich habe ich das falsch angelegt. =O
Zitat von: CoolTux am 17 März 2018, 15:26:56
Statt wir bei mir die Dummys nimmst Du natürlich Deine Sensoren an dem Fenster.
Internals:
ATTR windowSensor
CFGFN
CHANGEDCNT 15
DEF windowSensor sensorObenBadfenster sensorUntenBadfenster
NAME structureFensterBad
NR 114
NTFY_ORDER 50-structureFensterBad
STATE title
TYPE structure
READINGS:
2018-03-17 15:21:53 LastDevice sensorObenBadfenster
2018-03-17 15:21:53 LastDevice_Abs sensorObenBadfenster
2018-03-17 15:21:53 state title
Attributes:
clientstate_behavior relative
clientstate_priority open tilted closed
room Test
Internals:
CFGFN
NAME sensorObenBadfenster
NR 98
STATE on
TYPE dummy
READINGS:
2018-03-17 15:21:53 state on
Attributes:
room Test
userattr structexclude windowSensor windowSensor_map
windowSensor structureFensterBad
windowSensor_map state:on:tilted state:off:closed
Internals:
CFGFN
NAME sensorUntenBadfenster
NR 101
STATE off
TYPE dummy
READINGS:
2018-03-17 15:21:47 state off
Attributes:
room Test
userattr structexclude windowSensor windowSensor_map
windowSensor structureFensterBad
windowSensor_map state:on:open state:off:closed
Das ist aber noch ohne Fehlermeldung wenn oben zu ist und unten auf was ja eigentlich nicht gehen dürfte.
So, nun finde ich das Problem, warum ich das nicht umgesetzt bekomme.
Du hast je ein Device angelegt pro Sensor.
Ich nutze ein Device für beide Sensoren.
Internals:
DEF 192.168.100.104 80 ESPBridge HA_MCU_ID104_Fenster
ESPBridge_MSGCNT 28
ESPBridge_TIME 2018-03-18 00:22:48
ESP_BUILD 20100
ESP_BUILD_GIT mega-20180311
ESP_BUILD_NOTES - Mega
ESP_NODE_TYPE_ID 17: ESP Easy Mega
ESP_SLEEP 10
ESP_UNIT 104
ESP_VERSION 2
HOST 192.168.100.104
IDENT HA_MCU_ID104_Fenster
INTERVAL 300
IODev ESPBridge
LASTInputDev ESPBridge
MSGCNT 28
NAME ESPEasy_HA_MCU_ID104_Fenster
NOTIFYDEV global
NR 44
NTFY_ORDER 50-ESPEasy_HA_MCU_ID104_Fenster
PORT 80
STATE Fenster ist offen
SUBTYPE device
TYPE ESPEasy
VERSION 1.38
READINGS:
2018-03-18 00:22:47 FG on
2018-03-18 00:22:48 FO on
2018-03-17 22:26:00 Status offen
2018-03-18 00:23:22 presence present
2018-03-18 00:23:22 state FG: on FO: on
helper:
fpc 1521326271
pm:
Encode 1
JSON 1
received:
FG 1521328967
FO 1521328968
Attributes:
DbLogExclude .*
IODev ESPBridge
Interval 300
group ESPEasy Device
presenceCheck 1
readingSwitchText 1
room ESPEasy
setState 3
stateFormat Fenster ist Status
Ich lasse das über ESPEasy (Bridge) laden, da ich sonst den Stand beim WakeUp des NodeMCU nicht mitbekomme.
Ich habe das verstanden, wenn man das so macht wie du, also mit 2 Devices.
Nun ist die Frage, kann ich das auch machen, wenn beide Sensoren in einem Device sind?
Guten Morgen. Ja das könnte man mittels readingsProxy machen. Dann hätte man die Readings beider Devices in einem seperaten Device.
Aber wenn Du alles in einem Device hast würde ich userReadings nehmen und mit stateFormat den STATE setzen.
Grüße
Bitte schön. Mit userReadings
Internals:
CFGFN
NAME ESPEasy_HA_MCU_ID104_Fenster
NR 103
STATE gekippt
TYPE dummy
READINGS:
2018-03-18 07:16:35 FG off
2018-03-18 07:16:25 FO on
2018-03-18 07:16:35 Status gekippt
Attributes:
devStateIcon offen:fts_window_1w_open@red geschlossen:fts_window_1w@green gekippt:fts_window_1w_tilt@orange
readingList FG,FO
room Test
setList FG:on,off FO:on,off
stateFormat Status
userReadings Status { if( ReadingsVal($name,'FO',0) eq 'on' and ReadingsVal($name,'FG',0) eq 'off') { 'gekippt' }
elsif( ReadingsVal($name,'FO',0) eq 'off' and ReadingsVal($name,'FG',0) eq 'off') { 'geschlossen' }
elsif( ReadingsVal($name,'FO',0) eq 'on' and ReadingsVal($name,'FG',0) eq 'on') { 'offen' }
elsif( ReadingsVal($name,'FO',0) eq 'off' and ReadingsVal($name,'FG',0) eq 'on') { 'fehler' }
}
Super, vielen Dank und auch hier noch mal sorry für die Umstände!
Ich habe nun alle Möglichkeiten verstanden und kann diese anwenden, hab alle mal komplett durchgetestet.
Ich wünsche euch einen schönen Sonntag! =)
Ich werfe noch einen in die Runde: genau das Problem habe ich mit einem DOIF gelöst.
Fast alle meine Fensterkontakte sind Homematic-SCo und heißen FK_.... Ein Sammel-Log fängt alle Öffnungen und Schließungen über "contact" ab, daher folgend das zusätzliche Reading contact.
Zwei Fenster aber werden über normale Kontakte abgefragt (Meldung über ein Homematic-8-Kanal-Sendemodul).
SensorKGSzLiO ist der Sensor im Kellergeschoss-Schlafzimmer linkes Fenster oben, unten entsprechend -U
defmod FK_KGSuedL DOIF ([SensorKGSzLiO] eq "closed" and [SensorKGSzLiU] eq "closed") ## geschlossen\
DOELSEIF ([SensorKGSzLiO] eq "open" and [SensorKGSzLiU] eq "open") ## offen\
DOELSEIF ([SensorKGSzLiO] eq "open" and [SensorKGSzLiU] eq "closed") ## gekippt\
DOELSE ## anderes Problem
attr FK_KGSuedL alias Fenster Keller-Schlafzimmer links
attr FK_KGSuedL cmdState closed|open|tilted|problem
attr FK_KGSuedL devStateIcon open:fts_door_open@red tilted:fts_door_tilt@yellow closed:fts_door@green unlocked:secur_open@yellow .*:message_attention@yellow
attr FK_KGSuedL userReadings contact {ReadingsVal($name,"state","unknown")}
attr FK_KGSuedL wait 1:1:1
Dieser "Kombisensor" verhält sich in seinen Meldungen nun wie ein HomeMatic RHS (Griffpositionssensor).