FHEM Forum

FHEM => Automatisierung => Thema gestartet von: pula am 30 März 2018, 22:56:19

Titel: [Frage]Eventmap nur für ein reading
Beitrag von: pula am 30 März 2018, 22:56:19
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
Titel: Antw:[Frage]Eventmap nur für ein reading
Beitrag von: rudolfkoenig am 30 März 2018, 23:16:52
Schau mal die "explizite" Variante von eventMap in der commandref an.
Titel: Antw:[Frage]Eventmap nur für ein reading
Beitrag von: pula am 30 März 2018, 23:21:15
Danke schön. aber ich bin scheinbar zu blöd, das aus der commandref herauszulesen?  :o
Titel: Antw:[Frage]Eventmap nur für ein reading
Beitrag von: pula am 31 März 2018, 21:36:43
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
Titel: Antw:[Frage]Eventmap nur für ein reading
Beitrag von: rudolfkoenig am 01 April 2018, 08:42:24
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"
Titel: Antw:[Frage]Eventmap nur für ein reading
Beitrag von: pula am 06 April 2018, 18:21:00
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
Titel: Antw:[Frage]Eventmap nur für ein reading
Beitrag von: rudolfkoenig am 08 April 2018, 12:33:27
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.
Titel: Eventmap nur mit Reading
Beitrag von: Alfred0738 am 16 Oktober 2019, 12:35:28
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.
Titel: Antw:[Frage]Eventmap nur für ein reading
Beitrag 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.

Ich sehe folgende Alternativen (mit jeweils unterschiedlichen Seiteneffekten):
- eventMap mit einem notify aendern
- userReadings
- readingsChange
Titel: Antw:[Frage]Eventmap nur für ein reading
Beitrag von: Alfred0738 am 17 Oktober 2019, 14:32:46
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?

Titel: Antw:[Frage]Eventmap nur für ein reading
Beitrag von: Alfred0738 am 17 Oktober 2019, 14:39:52
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();
}