[Gelöst](MQTT-)Device togglebar machen mit custom states

Begonnen von Cludch, 29 Mai 2017, 15:16:34

Vorheriges Thema - Nächstes Thema

Cludch

Hallo,

ich versuche aktuell mein Schreibtischlampen Device "togglebar" zu machen.

Erstmal das Device:
Internals:
   IODev      MQTT
   NAME       esp01_Schreibtischlampe
   NR         25
   STATE      An
   TYPE       MQTT_DEVICE
   qos        0
   retain     0
   Readings:
     2017-05-29 15:07:55   state           rc,ON=1111100100
     2017-05-29 15:07:55   status          An
     2017-05-29 15:07:55   transmission-state outgoing publish sent
   Publishsets:
     :
       topic      /esp01/cmd
       values:
         rc,OFF=1111100100
         rc,ON=1111100100
   Sets:
     rc,OFF=1111100100
     rc,ON=1111100100
   subscribe:
   subscribeExpr:
Attributes:
   IODev      MQTT
   alias      Schreibtischlampe
   devStateIcon An:on Ous:off
   eventMap   rc,OFF=1111100100:Aus rc,ON=1111100100:An
   group      Licht
   icon       on
   publishSet rc,OFF=1111100100 rc,ON=1111100100 /esp01/cmd
   room       Homeplus,MQTT,Zimmer
   stateFormat state
   uiDeviceType SWITCH
   uiDeviceTypeParameter Eingeschaltet
   uiDisplayName Schreibtischlampe
   uiGet      [[DEVICE:esp01_Schreibtischlampe:status|IF:"%1%"="An",1,0]]
   uiSet      set esp01_Schreibtischlampe [[IF:"%VALUE%"="1",An,Aus]]
   uiShow     1
   userReadings status { ReadingsVal("esp01_Schreibtischlampe","state",0) eq "rc,ON=1111100100" ? "An" : "Aus" }
   webCmd     An:Aus


Wenn ich nun eingebe "set esp01_Schreibtischlampe toggle" kommt "Unknown argument toggle, choose one of rc,OFF=1111100100 rc,ON=1111100100".
Wobei "set esp01_Schreibtischlampe [An/Aus]" funktioniert. Kann ich den toggle-Befehl irgendwie andere Anweisungen geben, oder wie genau arbeitet dieser?

Irgendwo meine ich gelesen zu haben, dass man "setList switch" in dem Device setzen soll. Das Attribut gibt es aber nicht bei MQTT-Devicen.
Ginge dies über ein MQTT-Device? Oder muss ich das über eine Dummy-Device machen? (Habe mir noch nie Dummys angeschaut, wird nachher mal Zeit)

Viele Grüße,
Cludch

amenomade

Wo willst Du "togglen" können?
In FHEM Web => kannst mit dem attribute devStateIcon probieren

In FTUI => mit dem widget switch.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Cludch

Zitat von: amenomade am 30 Mai 2017, 00:11:14
Wo willst Du "togglen" können?

Als Befehl, wie beschrieben.

Zitat von: amenomade am 30 Mai 2017, 00:11:14
In FHEM Web => kannst mit dem attribute devStateIcon probieren.

Ist gesetzt, wie zu sehen.

amenomade

ZitatIst gesetzt, wie zu sehen.
Tja...Tschuldigung aber...  zu sehen ist:
devStateIcon An:on Ous:off
Wäre vielleicht erstmal besser mit Aus statt Ous?

Aber ich meinte eher sowas in der Art:
devStateIcon An:on:Aus Aus:off:An
Damit könntest Du im FHEM Webfrontend auf das Icon klicken, und somit schalten.

Als Befehl... ja gut, aber das Befehl rufst Du aus irgendwo auf, oder?  Oder ist es nur "ich will unbedingt ohne Zweck /set esp01_Schreibtischlampe  toggle/ ins Befhelfeld von FHEMweb eingeben können"?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

CoolTux

#4
Das Modul muß die SetExtensions unterstützen was es offensichtlich nicht tut.
Möglich wäre natürlich auch eine eigene toogle Implementierung im Modul, denke aber mal nicht das es sowas gibt.

Daher also auf Deviceebene als set Befehl nicht möglich.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

DeeSPe

Zitat von: CoolTux am 30 Mai 2017, 10:23:46
Daher also auf Deviceebene als set Befehl nicht möglich.

Was spricht gegen die Verwendung von eventMap mit entsprechendem notify?
Habe das gerade mal an einem dummy getestet. Statt toggle habe ich hier tgl verwendet da der dummy toggle bereits kennt und dann anders reagiert als erwartet:
defmod mqt1 dummy
attr mqt1 eventMap tgl:tgl
attr mqt1 setList on:noArg off:noArg

defmod n_mqt1 notify mqt1:state:.tgl {\
  if (OldValue($NAME) eq "on")\
  {\
    fhem "set $NAME off";;\
  }\
  else\
  {\
    fhem "set $NAME on";;\
  }\
}
attr n_mqt1 addStateEvent 1


Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

amenomade

Man kann vielleicht auch eventMap anders schreiben. Ich kenne aber die MQTT Devices nicht, und kann nicht testen.
So was in der Art:


eventMap {usr=>{ '^toggle' => '".(ReadingsVal($NAME,"state","rc,ON=1111100100") eq "rc,ON=1111100100" ? "STATE Aus" : "STATE An")."','rc,OFF=1111100100' => 'STATE Aus','rc,ON=1111100100' => 'STATE An' }}

Ich weiss aber nicht, ob das echt schaltet?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

CoolTux

Man kann sich auch an den Entwickler wenden und fragen ob er für einige deviceTypen nicht die SetExtensions implementieren möchte

uiDeviceType SWITCH

Es scheint ja Unterscheidungsmerkmale zu geben.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

DeeSPe

Zitat von: CoolTux am 30 Mai 2017, 11:18:56
Man kann sich auch an den Entwickler wenden und fragen ob er für einige deviceTypen nicht die SetExtensions implementieren möchte

uiDeviceType SWITCH

Es scheint ja Unterscheidungsmerkmale zu geben.

Das wäre sicher die beste Lösung.
Mein Beispiel sollte nur einen möglichen Workaround aufzeigen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Cludch

Zitat von: amenomade am 30 Mai 2017, 10:17:11
Als Befehl... ja gut, aber das Befehl rufst Du aus irgendwo auf, oder?  Oder ist es nur "ich will unbedingt ohne Zweck /set esp01_Schreibtischlampe  toggle/ ins Befhelfeld von FHEMweb eingeben können"?

Der set-Befehl wird via TelegramBot aufgerufen.
Das mit dem devStateIcon habe ich gefixt, danke.

Zitat von: CoolTux am 30 Mai 2017, 11:18:56
Man kann sich auch an den Entwickler wenden und fragen ob er für einige deviceTypen nicht die SetExtensions implementieren möchte

uiDeviceType SWITCH

Es scheint ja Unterscheidungsmerkmale zu geben.

Vergessen zu erwähnen bzw. zu entfernen. Das ist von Homeplus und hat mit MQTT nichts zu tun.

Ich versuche mal eure Workarounds.
Vielen Dank!

amenomade

Der set-Befehl wird via TelegramBot aufgerufen.
In TelegramBot kannst Du ruhig Perl aufrufen. Entweder direkt mit dofhem { } (mit dofhem = Stichwort für Kommandos in Telegrambot) oder sogar mit Favoriten.

Das Perl kannst Du auch entweder direkt schreiben, oder in einer Funktion in 99_myUtils verlargern.

Und mit Perl, kein problem:
{ if (Value("esp01_Schreibtischlampe") eq "Aus")  { fhem "set esp01_Schreibtischlampe An"} else { fhem "set esp01_Schreibtischlampe Aus"}}
oder sogar
{ if (ReadingsVal($NAME,"state","rc,OFF=1111100100") eq "rc,OFF=1111100100") { fhem "set esp01_Schreibtischlampe An"} else { fhem "set esp01_Schreibtischlampe Aus"}}
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Cludch

Zitat von: amenomade am 30 Mai 2017, 14:32:54
Der set-Befehl wird via TelegramBot aufgerufen.
In TelegramBot kannst Du ruhig Perl aufrufen. Entweder direkt mit dofhem { } (mit dofhem = Stichwort für Kommandos in Telegrambot) oder sogar mit Favoriten.

Das Perl kannst Du auch entweder direkt schreiben, oder in einer Funktion in 99_myUtils verlargern.

Und mit Perl, kein problem:
{ if (Value("esp01_Schreibtischlampe") eq "Aus")  { fhem "set esp01_Schreibtischlampe An"} else { fhem "set esp01_Schreibtischlampe Aus"}}
oder sogar
{ if (ReadingsVal($NAME,"state","rc,OFF=1111100100") eq "rc,OFF=1111100100") { fhem "set esp01_Schreibtischlampe An"} else { fhem "set esp01_Schreibtischlampe Aus"}}

Das ist cool, vielen Dank!
Der erste Code funktioniert bestens!