MQTT Befehl TOGGLE als Default für Klick auf Statuszeile

Begonnen von fhem-bastler, 14 März 2022, 03:39:20

Vorheriges Thema - Nächstes Thema

fhem-bastler

Ich versuche einen ShellyplugS so einzurichten, daß beim Klick auf das StatIcon oder die state Info der MQTT Befehl TOGGLE geschickt wird. Egal was ich einstelle setList, Reihenfolge der Aktionen im PublishSet oder WebCmd, leider wird immer der Befehl ON geschickt für Power on. Hat jemand eine Idee wo man das einstellen kann. Shellyplug ist als MQTT Device eingerichtet, in einer älteren Version hatte ich (auch ohne Erfolg) als  devStateIcon  on*:black_Steckdose.on off*:black_Steckdose.off probiert.
Danke
hier die Rawinfo
defmod DG_Shellyplug1 MQTT_DEVICE
attr DG_Shellyplug1 userattr setList subscribeReading_state subscribeReading_power subscribeReading_energy subscribeReading_temperature subscribeReading_overpower
attr DG_Shellyplug1 IODev MQTT
attr DG_Shellyplug1 event-min-interval .*:300
attr DG_Shellyplug1 event-on-change-reading state,power:5
attr DG_Shellyplug1 icon Shelly_Plug_S
attr DG_Shellyplug1 publishSet toggle on off shellies/shellyplug-s-80D422/relay/0/command
attr DG_Shellyplug1 room DG,Logging,MQTT_DEVICE,Status
attr DG_Shellyplug1 setList on:noArg shellies/shellyplug-s-80D422/relay/0/command toggle
attr DG_Shellyplug1 stateFormat {    my $state = ReadingsVal($name, "state", "off");;\
sprintf(" ; ; \
      Verbrauch %.3f kWh Leistung %.0f W ",  ReadingsVal($name,"energy",0)/60000,\
  ReadingsVal($name,"power",0)) \
}
attr DG_Shellyplug1 subscribeReading_energy shellies/shellyplug-s-80D422/relay/0/energy
attr DG_Shellyplug1 subscribeReading_power shellies/shellyplug-s-80D422/relay/0/power
attr DG_Shellyplug1 subscribeReading_state shellies/shellyplug-s-80D422/relay/0
attr DG_Shellyplug1 useSetExtensions 1
attr DG_Shellyplug1 webCmd on:off:toggle
setstate DG_Shellyplug1  ; ; \
      Verbrauch 0.031 kWh Leistung 0 W
setstate DG_Shellyplug1 2022-03-14 03:33:32 energy 1836
setstate DG_Shellyplug1 2022-03-14 03:33:32 power 0.00
setstate DG_Shellyplug1 2022-03-14 03:33:23 state on
setstate DG_Shellyplug1 2022-03-14 03:33:32 transmission-state incoming publish received
fhem 6.0 auf opensuse leap, mqtt2, mqtt, Shelly3pm, shellyplugs, Victron PV mit influxdb, deCONZ in docker

Beta-User

Vorab: Willkommen im FHEM-Forum.

Da du dich neu mit FHEM/MQTT zu beschäftigen scheinst: Gibt es einen speziellen Grund, warum du das mit MQTT_DEVICE zu lösen versuchst und nicht mit MQTT2_DEVICE?

setList ist ein Begriff aus der MQTT2_DEVICE-Welt, und es überrascht mich etwas, dass du das Attribut überhaupt in MQTT_DEVICE setzen kannst.

Prizipiell ist das Problem hier, dass es keine "Zeile" im Internal "STATE" gibt, die nur "on" oder "off" als Inhalt hat (das würde zu einem klickbaren Icon mit dem richtigen Kommando führen), und soweit ich das im Kopf habe, schaut SetExtensions beim toggle-Befehl nur, ob STATE mit "on" beginnt, alles andere wird mit "ist aus" gleichgesetzt...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

fhem-bastler

Zitat von: Beta-User am 14 März 2022, 07:43:10
Vorab: Willkommen im FHEM-Forum.

Da du dich neu mit FHEM/MQTT zu beschäftigen scheinst: Gibt es einen speziellen Grund, warum du das mit MQTT_DEVICE zu lösen versuchst und nicht mit MQTT2_DEVICE?

setList ist ein Begriff aus der MQTT2_DEVICE-Welt, und es überrascht mich etwas, dass du das Attribut überhaupt in MQTT_DEVICE setzen kannst.

Prizipiell ist das Problem hier, dass es keine "Zeile" im Internal "STATE" gibt, die nur "on" oder "off" als Inhalt hat (das würde zu einem klickbaren Icon mit dem richtigen Kommando führen), und soweit ich das im Kopf habe, schaut SetExtensions beim toggle-Befehl nur, ob STATE mit "on" beginnt, alles andere wird mit "ist aus" gleichgesetzt...
Danke Dir
Ich nutze schon seit langem einen mosquitto Server mit MQTT zur Verteilung von Sensorinformationen zum Wetter und habe der Einfachheit halber die Shellies und Sonoffs mit Tasmota mit dem Protokoll MQTT konfiguriert.
Um setList benutzen zu können, habe ich einfach mit attr userattr setList     dieses definiert. Es könnte sein, daß ich da einen Denkfehler mache.
Ziel ist halt, auf das Symbol zu klicken, und das Gerät schaltet um. Wenn es aus ist, kann man durch Anklicken einschalten. Es wird immer nur das Telegramm "shellies/shellyplug-s-80D422/relay/0/command on" geschickt. Mir fehlt der Durchblick an welcher Stelle der Text gebaut wird. Wo sind die Parameter für SetExtensions zu finden? Es müsste einfach nur das Telegramm  "shellies/shellyplug-s-80D422/relay/0/command toggle" beim Klicken generiert werden. Und dazu brauche ich doch kein MQTT V2 ?
fhem 6.0 auf opensuse leap, mqtt2, mqtt, Shelly3pm, shellyplugs, Victron PV mit influxdb, deCONZ in docker

Beta-User

Danke für die "Erhellung".
Auch MQTT2_.* nutzt das MQTT-Protokoll, und aus deinem Post war nicht zu erkennen, dass du bereits Erfahrung mit den "alten" Modulen hast.

Wie dem auch sei: Hier steht doch die Antwort auf deine Frage:
Zitat von: Beta-User am 14 März 2022, 07:43:10
Prizipiell ist das Problem hier, dass es keine "Zeile" im Internal "STATE" gibt, die nur "on" oder "off" als Inhalt hat (das würde zu einem klickbaren Icon mit dem richtigen Kommando führen), und soweit ich das im Kopf habe, schaut SetExtensions beim toggle-Befehl nur, ob STATE mit "on" beginnt, alles andere wird mit "ist aus" gleichgesetzt...
Soweit ich den Code von deinem stateFormat verstehe, landet dort nicht der Wert des Readings "state" in einer eigenen Zeile. Der wird zwar abgefragt, die Variable dann aber nicht dargestellt, oder?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

fhem-bastler

Sorry für die Verwirrung die ich gestiftet habe, das stateFormat Teil mit    my $state = ReadingsVal($name, "state", "off") ist übrig geblieben aus der Variante, in der abhängig vom Status des Schalters ein Bild mit beleuchteter Steckdose oder unbeleuchtet dargestellt wurde.
Ich habe noch etwas geforscht und den html Code angeschaut. Da steht drin
"<table class="block wide">
<tr class="odd"><td><div class="col1"><a href="/fhem?detail=DG_Shellyplug1"><img class='icon Shelly_Plug_S' src="/fhem/images/default/Shelly_Plug_S.png" alt="Shelly_Plug_S" title="Shelly_Plug_S">&nbsp;DG_Shellyplug1</a></div></td>
<td informId="DG_Shellyplug1"><div id="DG_Shellyplug1"  title="&nbsp;&nbsp;
      Verbrauch 0.013 kWh Leistung 3 W " class="col2"><a href="/fhem?cmd.DG_Shellyplug1=set DG_Shellyplug1 on&room=DG%2cLogging%2cMQTT%5fDEVICE%2cStatus&fwcsrf=csrf_175756776021342">&nbsp;&nbsp; </a> <a href="/fhem?cmd.DG_Shellyplug1=set DG_Shellyplug1 on&room=DG%2cLogging%2cMQTT%5fDEVICE%2cStatus&fwcsrf=csrf_175756776021342">      Verbrauch 0.013 kWh Leistung 3 W </a></div></td>
<td><div class='col3'><a href="/fhem?cmd.DG_Shellyplug1=set DG_Shellyplug1 on&amp;room=DG,Logging,MQTT_DEVICE,Status&fwcsrf=csrf_175756776021342">on</a></div></td>
<td><div class='col3'><a href="/fhem?cmd.DG_Shellyplug1=set DG_Shellyplug1 off&amp;room=DG,Logging,MQTT_DEVICE,Status&fwcsrf=csrf_175756776021342">off</a></div></td>
<td><div class='col3'><a href="/fhem?cmd.DG_Shellyplug1=set DG_Shellyplug1 toggle&amp;room=DG,Logging,MQTT_DEVICE,Status&fwcsrf=csrf_175756776021342">toggle</a></div></td>
</tr>


Das bedeutet 01_FHEMWEB.pm erzeugt immer "set device on". Das scheint aber unabhängig vom Protokoll mqtt und device zu sein. Ich habe aber bisher keine Stelle gefunden, wo man das beeinflussen könnte.
fhem 6.0 auf opensuse leap, mqtt2, mqtt, Shelly3pm, shellyplugs, Victron PV mit influxdb, deCONZ in docker

Beta-User

Benutze Code-Tags, sonst liest das keiner...

Genau: was FHEMWEB macht, ist nicht unbedingt Device-TYPE-spezifisch.

Zum dritten Mal ( :-* ) jetzt der Hinweis, dass du das Verhalten mit stateFormat beeinflussen kannst ;) .

Falls du Anschauungsmaterial suchst: in mqtt2.template ist das meistens in der "Kurzform" ohne Perl umgesetzt (was hier wegen der Berechnung nicht geht, ohne die in ein userReadings-Attribut umzupacken), die volle Form ist dann in der Regel in devStateIcon (Perl-Variante) zu finden, einschließlich der passenden Umschalt-Anweisung.
Die file findest du u.A. hier: https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/mqtt2.template

Und vorsorglich nochmal: das Verhalten ist nicht direkt TYPE-spezifisch, eine Zeile in STATE mit dem Text "on" wird automatisch mit dem "off"-Befehl versehen, wenn beide Befehle vorhanden sind (und/oder ggf. toggle).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

fhem-bastler

Danke für den Tip. Die Ausgabe sieht jetzt so aus wie ich es mir vorstellte, Ein Klick auf das Icon macht toggle, und rechts kann man alternativ on,off,toggle wählen. Ich habe es mit der Angabe in devStateIcon gemacht (wie als Beispiel zigbee2mqttplug in mqtt2templates):

defmod DG_Shellyplug1 MQTT_DEVICE
attr DG_Shellyplug1 userattr setList subscribeReading_state subscribeReading_power subscribeReading_energy subscribeReading_temperature subscribeReading_overpower
attr DG_Shellyplug1 IODev MQTT
attr DG_Shellyplug1 devStateIcon {my $light = FW_makeImage("black_Steckdose.".ReadingsVal($name,"state","off"));;\
my $pwr = sprintf("%.1f", ReadingsVal($name,"power",0));; my $energy = sprintf("%.3f", ReadingsVal($name,"energy",0)/60000);; \
qq(<div> <a href="/fhem?cmd.dummy=set $name toggle&XHR=1">$light</a> Verbrauch: $energy kWh Leistung: $pwr W<b></b>)}
attr DG_Shellyplug1 event-min-interval .*:300
attr DG_Shellyplug1 event-on-change-reading state,power:5
attr DG_Shellyplug1 icon message_socket
attr DG_Shellyplug1 publishSet toggle on off shellies/shellyplug-s-80D422/relay/0/command
attr DG_Shellyplug1 room DG,Logging,MQTT_DEVICE,Status
attr DG_Shellyplug1 setList toggle off on
attr DG_Shellyplug1 subscribeReading_energy shellies/shellyplug-s-80D422/relay/0/energy
attr DG_Shellyplug1 subscribeReading_power shellies/shellyplug-s-80D422/relay/0/power
attr DG_Shellyplug1 subscribeReading_state shellies/shellyplug-s-80D422/relay/0
attr DG_Shellyplug1 webCmd on:off:toggle

setstate DG_Shellyplug1 on
setstate DG_Shellyplug1 2022-03-17 18:47:16 energy 1198
setstate DG_Shellyplug1 2022-03-17 18:46:51 power 0.00
setstate DG_Shellyplug1 2022-03-17 18:46:51 state on
setstate DG_Shellyplug1 2022-03-17 18:47:16 transmission-state incoming publish received


Einziger Schönheitsfehler: beim Darstellen des html Codes wird sporadisch kurz der Text steckdose.black angezeigt, bevor das Icon angezeigt wird. Warum kann ich mir nicht ganz erklären. Was auch etwas seltsam erscheint im html Quelltext sind 2 set URLs:

<tr class="odd"><td><div class="col1"><a href="/fhem?detail=DG_Shellyplug1"><svg class="icon message_socket" data-txt="message_socket" version="1.0" xmlns="http://www.w3.org/2000/svg"  width="468pt" height="470pt" viewBox="0 0 468 470"  preserveAspectRatio="xMidYMid meet"> <metadata> Created by potrace 1.8, written by Peter Selinger 2001-2007 </metadata> <g transform="translate(0,470) scale(0.158108,-0.158108)"  stroke="none"> <path d="M75 2941 c-16 -10 -39 -28 -50 -41 -20 -22 -20 -36 -20 -1415 l0 -1393 25 -27 c55 -59 -38 -55 1445 -55 1483 0 1390 -4 1445 55 l25 27 0 1394 0 1394 -38 37 -37 38 -1383 3 c-1332 2 -1383 1 -1412 -17z m2743 -1453 l-3 -1343 -1340 0 -1340 0 -3 1330 c-1 732 0 1336 3 1343 3 9 282 12 1345 12 l1340 0 -2 -1342z"/> <path d="M589 2417 c-19 -13 -39 -38 -46 -57 -15 -45 -18 -1676 -3 -1731 6 -19 22 -46 36 -60 l26 -24 885 0 885 0 29 33 29 32 0 878 c0 964 4 904 -60 937 -25 13 -145 15 -888 15 l-859 0 -34 -23z m785 -142 c22 -22 33 -25 101 -25 68 0 79 3 101 25 25 25 25 25 216 25 l192 0 158 -157 158 -157 0 -490 0 -491 -167 -167 -168 -168 -187 0 c-137 0 -188 3 -188 12 0 6 -7 20 -17 30 -13 15 -31 18 -101 18 -87 0 -122 -13 -122 -47 0 -10 -35 -13 -172 -13 l-173 0 -167 167 -168 168 0 480 0 480 167 167 168 168 172 0 c170 0 172 0 197 -25z"/> <path d="M954 1589 c-16 -18 -19 -37 -19 -111 0 -118 10 -128 132 -128 76 0 86 2 108 25 22 21 25 33 25 100 0 73 -10 112 -34 127 -6 4 -52 8 -102 8 -80 0 -93 -3 -110 -21z"/> <path d="M1780 1590 c-17 -17 -20 -33 -20 -108 0 -80 2 -91 23 -110 20 -19 35 -22 110 -22 120 0 127 8 127 133 0 123 -4 127 -128 127 -79 0 -95 -3 -112 -20z"/> </g> </svg>&nbsp;DG_Shellyplug1</a></div></td>
<td informId="DG_Shellyplug1"><div id="DG_Shellyplug1"  title="off" [color=orange]class="col2"><a href="/fhem?cmd.DG_Shellyplug1=set DG_Shellyplug1 on[/color]&room=DG%2cLogging%2cMQTT%5fDEVICE%2cStatus&fwcsrf=csrf_417516816551322">[color=orange]<div> <a href="/fhem?cmd.dummy=set DG_Shellyplug1 toggle&XHR=1">[/color]<img class=' black_Steckdose_off' src="/fhem/images/default/black_Steckdose.off.png" alt="black_Steckdose.off" title="black_Steckdose.off"></a> Verbrauch: 0.020 kWh Leistung: 0.0 W<b></b></a></div></td>
<td><div class='col3'><a href="/fhem?cmd.DG_Shellyplug1=set DG_Shellyplug1 on&amp;room=DG,Logging,MQTT_DEVICE,Status&fwcsrf=csrf_417516816551322">on</a></div></td>
<td><div class='col3'><a href="/fhem?cmd.DG_Shellyplug1=set DG_Shellyplug1 off&amp;room=DG,Logging,MQTT_DEVICE,Status&fwcsrf=csrf_417516816551322">off</a></div></td>
<td><div class='col3'><a href="/fhem?cmd.DG_Shellyplug1=set DG_Shellyplug1 toggle&amp;room=DG,Logging,MQTT_DEVICE,Status&fwcsrf=csrf_417516816551322">toggle</a></div></td>
</tr>


Ich habe erstmal noch keine Idee, ob und wie sich das abstellen ließe.
Nochmal Danke für die Erleuchtung
fhem 6.0 auf opensuse leap, mqtt2, mqtt, Shelly3pm, shellyplugs, Victron PV mit influxdb, deCONZ in docker