Hallo,
ich habe hier ein device, das auf ein selbstprogrammiertes mqtt-device geht (Heizkörper-Steuerung).
Nun habe ich eine eventMap definiert:
1:on 0:off
was dazu führt, daß das devStateIcon richtig angezeigt wird:
state:1:FS20.on state:*:FS20.off
Dummerweise habe ich aber noch andere readings, die ebenfalls den Wert 0 oder 1 einnehmen können (zb timeout).
Ist es möglich, die eventMap so zu definieren, daß sie nur für das devStateIcon greift?
Danke im voraus und cheers,
Pula
Schau mal die "explizite" Variante von eventMap in der commandref an.
Danke schön. aber ich bin scheinbar zu blöd, das aus der commandref herauszulesen? :o
Ich kapier es leider nicht, versuche es schon eine Weile... :-(
Folgendes habe ich nun definiert:
{ dev=>{ 'status$'=>'".($1==1 ? "on" : $1==0 ? "off" )"' }, usr=>{ 'on' => '1', 'off' => '0'} }
Der usr-Teil funktioniert (das ist ja der einfache). Aber wie bekomm ich es hin, daß im dev-Teil nur bei bestimmten Readings (hier zb status) diese eventMap greift? Also wenn status eine 1 bekommt, soll on angezeigt werden, bei 0 ein off....
Ich steh grad voll auf dem Schlauch und eine Forums-Suche hat mir leider nur bedingt geholfen....
Cheers,
Pula
Hier ist ein dummy, an dem ich herumgetestet habe. Da ich nicht alle Readings/Schaltwuensche kenne, sind Fehler nicht ausgeschlossen.
define d dummy
attr d eventMap { dev=>{ '^1$'=>'on', '^0$'=>'off' }, usr=>{ 'on' => '1', 'off' => '0'} }
attr d setList 1 0
attr d userReadings state other
fhem> inf timer
fhem> setreading d state 1
2018-04-01 08:34:17 dummy d on
fhem> setreading d state 0
2018-04-01 08:34:20 dummy d off
hem> setreading d other 0
2018-04-01 08:34:24 dummy d other: 0
fhem> setreading d other 1
2018-04-01 08:34:27 dummy d other: 1
fhem> set d on
2018-04-01 08:34:38 dummy d on
fhem> set d off
2018-04-01 08:34:42 dummy d off
Hat damit was zu tun, dass (je nach Attribut) state ohne Readingsnamen gesetzt wird, da "set lamp on" beser klingt, als "set lamp state on"
Hallo,
sorry für die späte Antwort!
Diese eventMap hats gebracht, funktioniert nun. Leider kennt ein MQTT_DEVICE kein setList. DANKE!
Eine Frage hab ich aber trotzdem noch: Ist es möglich, eine eventMap nur IN der eventMap auf bestimmte Readings einzuschränken?
Hintergrund der Frage:
Ich habe in dem device (und in anderen) zb ein Reading namens debugMode (und noch einige ähnliche), das aus dem Device mit 0 und 1 befüllt wird.
Schön wäre, für DIESE Readings und NUR für diese ein ON/OFF hinzubekommen.
Für andere Readings (zb ein timeout) wäre es aber toll, wenn diese numerisch angezeigt würde, auch wenn sie 0 oder 1 sind...
Hier ein list von so einem device:
IODev mqtt
NAME vz_licht_mqtt
NR 582
STATE off
TYPE MQTT_DEVICE
retain *:1
READINGS:
2018-02-23 00:13:53 Light 1
2018-03-31 21:00:43 Motion_Activate 0
2018-02-27 21:13:57 Timeout 30
2018-02-18 22:54:18 debug 1
2018-04-04 02:00:34 debugmode 1
2018-04-06 18:22:00 heartbeat 1
2018-04-06 18:19:31 motion_detected 1
2018-04-06 18:19:00 pir_active 0
2018-04-06 18:19:00 state 0
2018-04-06 18:19:00 status 0
2018-04-06 18:19:00 timeout_state 30
2018-04-06 18:22:00 transmission-state incoming publish received
message_ids:
publishSets:
:
topic vz/vz_licht_set
values:
Light:
topic vz/vz_licht_set
values:
Motion_Activate:
topic vz/vz_licht_pir_active
values:
Timeout:
topic vz/vz_licht_timeout
values:
debug:
topic vz/vz_licht_debug
values:
watchdog:
topic vz/vz_licht_watchdog
values:
sets:
Light
Motion_Activate
Timeout
debug
watchdog
subscribe:
vz/vz_licht_debug_state
vz/vz_licht_heartbeat
vz/vz_licht_motion_detected_state
vz/vz_licht_motion_activate_state
vz/vz_licht_state
vz/vz_licht_timeout_state
subscribeExpr:
^vz\/vz_licht_debug_state$
^vz\/vz_licht_heartbeat$
^vz\/vz_licht_motion_detected_state$
^vz\/vz_licht_motion_activate_state$
^vz\/vz_licht_state$
^vz\/vz_licht_timeout_state$
subscribeReadings:
vz/vz_licht_debug_state:
cmd
name debugmode
vz/vz_licht_heartbeat:
cmd
name heartbeat
vz/vz_licht_motion_activate_state:
cmd
name pir_active
vz/vz_licht_motion_detected_state:
cmd
name motion_detected
vz/vz_licht_state:
cmd
name status
vz/vz_licht_timeout_state:
cmd
name timeout_state
Attributes:
IODev mqtt
devStateIcon status:on:FS20.on status:*:FS20.off
eventMap { dev=>{ '^1$'=>'on', '^0$'=>'off' }, usr=>{ 'on' => '1', 'off' => '0'} }
publishSet vz/vz_licht_set
publishSet_Light vz/vz_licht_set
publishSet_Motion_Activate vz/vz_licht_pir_active
publishSet_Timeout vz/vz_licht_timeout
publishSet_debug vz/vz_licht_debug
publishSet_watchdog vz/vz_licht_watchdog
retain 1
room Beleuchtung,MQTT,VZ
stateFormat status
subscribeReading_debugmode vz/vz_licht_debug_state
subscribeReading_heartbeat vz/vz_licht_heartbeat
subscribeReading_motion_detected vz/vz_licht_motion_detected_state
subscribeReading_pir_active vz/vz_licht_motion_activate_state
subscribeReading_status vz/vz_licht_state
subscribeReading_timeout_state vz/vz_licht_timeout_state
Cheers,
Pula
ZitatSchön wäre, für DIESE Readings und NUR für diese ein ON/OFF hinzubekommen.
Fuer Readings geht es mit eventMap nur "halb":
{ dev=>{ 'debugMode: 1'=>'debugMode: on', 'debugMode: 0'=>'debugMode: off' } }
wandelt zwar nur debugMode um, allerdings nur fuer Events. Readings werden auch von den Modulen ausgewertet, deswegen bleiben sie als solches bestehen. Die FHEMWEB Detail-Anzeige ist dann statusabhaengig: beim Aufruf wird z.Bsp. 0 angezeigt, beim ersten debugMode Event wird aus dem 0 aber ein on oder off. Insg. eignet sich eventMap fuer readings-Modifikatiion nur begrenzt.
Wenn du sicher bist, dass das Modul debugMode intern nicht verwendet, dann kannst du es mit
defmod rc readingsChange vz_licht_mqtt debugMode (0|1) { $1 eq "0" ? "off" : "on" }
besser ersetzen.
Moinsen,
Der letzte Beitrag hier ist zwar schon etwas her, aber ich habe ein ähnliches Problem und will dafür nicht extra einen neuen Thread aufmachen.
Kann man eigentlich auch einfach den Wert eines Readings in die eventMap übernehmen?
Beispiel:
Ein Device namens Rollo hat ein Reading namens fovoritePosition mit dem Wert 11.
Ich würde nun gerne anstelle von:
attr Rollo eventMap /position 11:Favoritenposition/
Folgendes Schreiben:
attr Rollo eventMap /position {ReadingsVal("Rollo","favoritePosition","0")}:Favoritenposition/
Wobei unter anderem Favoritenposition dann im webCMD steht.
Nur leider funktioniert das nicht (Fehlermeldung Wrong argument {ReadingsVal("Rollo","favoritePosition","0")}). :-[
Gibt es eine andere Möglichkeit das zu realisieren?
Aus den Beispielen der Commandref werde ich nicht schlau, und mittels Google habe ich auch nichts gefunden.
Man kann nicht an jede beliebige Stelle ein {} schreiben, das muss der Autor schon explizit vorgesehen haben, und hier ist es nicht.
Ich sehe folgende Alternativen (mit jeweils unterschiedlichen Seiteneffekten):
- eventMap mit einem notify aendern
- userReadings
- readingsChange
Zitat von: rudolfkoenig am 16 Oktober 2019, 13:02:34
Man kann nicht an jede beliebige Stelle ein {} schreiben, das muss der Autor schon explizit vorgesehen haben, und hier ist es nicht.
Aha, und ich dachte das leitet Perlcode ein und könnte eben generell überall eingefügt werden.
Wieder etwas dazu gelernt.
Zitat
Ich sehe folgende Alternativen (mit jeweils unterschiedlichen Seiteneffekten):
- eventMap mit einem notify aendern
- userReadings
- readingsChange
Zunächst einmal danke für den Denkanstoß, auch wenn ich anfangs zwar nicht verstanden habe wie ich damit den Wert eines Readings in die eventMap bekommen soll.
Aber ich glaube ich habe es aber nun kapiert.
Realisiert habe ich es jetzt so...
Ein Auzug aus dem Inhalt meiner meiner Rollo Devices:
favoritePosition: 11
ventilatingPosition: 56
sunPosition: 90
eventMap: /position 11:Favoritenposition/position 56:Lüftungsposition/position 90:Sonnenschutz/
Zunächst ein notivy definiert:
defmod Rollo.event notify Rollo_Wohnzimmer:.*Position.*|Rollo_Esszimmer:.*Position.*|Rollo_Schlafzimmer:.*Position.*|Rollo_Buero:.*Position.* {Rollo_EVENT("$NAME","$EVTPART0","$EVTPART1")}
Dann in 99_myXXXX.pm die passende Funktion Rollo_EVENT($$$) zusammengebastelt.
sub Rollo_EVENT($$$){
my ($NAME,$EVTPART0,$EVTPART1) = @_;
if($EVTPART0 eq "favoritePosition:"){
fhem("attr " . $NAME . " eventMap /position " . $EVTPART1 . ":Favoritenposition/position ". ReadingsVal($NAME, "ventilatingPosition", 0) . ":Lüftungsposition/position ". ReadingsVal($NAME, "sunPosition", 0) . ":Sonnenschutz/")
}
if($EVTPART0 eq "sunPosition:"){
fhem("attr " . $NAME . " eventMap /position ". ReadingsVal($NAME, "favoritePosition", 0) . ":Favoritenposition/position ". ReadingsVal($NAME, "ventilatingPosition", 0) . ":Lüftungsposition/position " . $EVTPART1 . ":Sonnenschutz/")
}
if($EVTPART0 eq "ventilatingPosition:"){
fhem("attr " . $NAME . " eventMap /position ". ReadingsVal($NAME, "favoritePosition", 0) . ":Favoritenposition/position " . $EVTPART1 . ":Lüftungsposition/position ". ReadingsVal($NAME, "sunPosition", 0) . ":Sonnenschutz/")
}
return();
}
Sobald sich eines der Readings ändert wird nun jedesmal einfach die eventMap des jeweiligen Devices mit dem neuen Wert des Redings neu gesetzt. 8)
War das in etwa so von Dir gemeint?
Ok, einfacher und kürzer geht es natürlich auch so...
sub Rollo_EVENT($$$){
my ($NAME,$EVTPART0,$EVTPART1) = @_;
if($EVTPART0 eq "favoritePosition:" or $EVTPART0 eq "sunPosition:" or $EVTPART0 eq "ventilatingPosition:"){
fhem("attr " . $NAME . " eventMap /position " . ReadingsVal($NAME, "favoritePosition", 0) . ":Favoritenposition/position ". ReadingsVal($NAME, "ventilatingPosition", 0) . ":Lüftungsposition/position ". ReadingsVal($NAME, "sunPosition", 0) . ":Sonnenschutz/")
}
return();
}