Zumindest das mit dem "sleep" hattet ihr ja (in etwas anderer Form wie gedacht) gefunden, "qq" ist einfach eine perl-Funktion, mit der man "einfacher" formatierten Text mit Quotes erzeugen kann - wenn man in mqtt2.template qq im Zusammenhang mit readingList sucht, gibt es nicht allzuviele Treffer. Es geht einfach darum, "am Ende" einer Perl-Anweisung in setList "topic payload" (vereinfacht) zurückzugeben, und vorher irgendwas anderes zu tun.
Hier mal ein (ungetesteter) Vorschlag, wie man das ohne periodicCmd lösen können sollte (mir gefällt das Pollen überhaupt nicht!), aber trotzdem alles mitbekommt, wenn ein potentiell "unklarer Status" gemeldet wird.
Das ganze ist "attrTemplate-Sprache" (man muss also die "escape"-backslashes für "DEVICE" entfernen), Klammern habe ich nicht gezählt, und wegen der Strichpunkte muss man aufpassen, an welcher Stelle/auf welchem Weg man wie viele setzt:
attr DEVICE setList\
toggle:noArg $\DEVICETOPIC/rpc {"id":0,"src":"fhem2shelly","method":"Switch.Toggle","params": {"id":0}}\
off:noArg $\DEVICETOPIC/rpc {"id":0,"src":"fhem2shelly","method":"Switch.Set","params": {"id":0,"on":false}}\
on:noArg $\DEVICETOPIC/rpc {"id":0,"src":"fhem2shelly","method":"Switch.Set","params": {"id":0,"on":true}}\
on-for-timer $\DEVICETOPIC/rpc {"id":0,"src":"fhem2shelly","method":"Switch.Set","params": {"id":0,"on":true,"toggle_after":$EVTPART1}}\
off-for-timer $\DEVICETOPIC/rpc {"id":0,"src":"fhem2shelly","method":"Switch.Set","params": {"id":0,"on":false,"toggle_after":$EVTPART1}}\
in_mode:toggle,flip,detached {my $val = $EVTPART1 ne 'toggle' ? $EVTPART1 : ReadingsVal($NAME,'in_mode','flip') eq 'flip' ? 'detached':'flip'; qq($\DEVICETOPIC/rpc {"id":1,"src":"fhem2shelly","method":"Switch.SetConfig","params": {"id":0, "config": {"in_mode": "$EVTPART1"}}}}\
x_update:noArg $\DEVICETOPIC/rpc {"id":0,"src":"fhem2shelly","method":"Shelly.Update","params": {"stage":"stable"}}\
x_reboot:noArg $\DEVICETOPIC/rpc {"id":0,"src":"fhem2shelly","method":"Shelly.Reboot"}\
x_eco:true,false $\DEVICETOPIC/rpc {"id":0,"src":"fhem2shelly","method":"Sys.SetConfig","params": {"config": {"device": {"eco_mode": $EVTPART1}}}}
attr DEVICE readingList $\DEVICETOPIC/online:.* online\
$\DEVICETOPIC/events/rpc:.* { json2nameValue($EVENT,'',$JSONMAP) }\
$\DEVICETOPIC/status/mqtt:.* { json2nameValue($EVENT, 'mqtt_', $JSONMAP) }\
$\DEVICETOPIC/status/sys:.* { json2nameValue($EVENT, 'sys_', $JSONMAP) }\
$\DEVICETOPIC/status/switch_0:.* { $EVENT =~ s/"output":true/"state":"on"/g; $EVENT =~ s/"output":false/"state":"off"/g; json2nameValue($EVENT, 'switch_', $JSONMAP) }\
$\DEVICETOPIC/status/cloud:.* {}\
$\DEVICETOPIC/rpc:.* { json2nameValue($EVENT, 'req_', $JSONMAP, 'in_mode')\
fhem2shelly/rpc:.* {}
attr DEVICE getList in_mode:noArg in_mode $\DEVICETOPIC/rpc {"id": 1,"src":"$\DEVICETOPIC", "method": "Switch.GetConfig", "params": {"id": 0}}
attr DEVICE userReadings get_in_mode:params_events_1_event:.config_changed {fhem("get $NAME in_mode")}
Hier noch ein ungetesteter Versuch, das automatische get mit einem fhem-sleep auch noch in der Zeile unterzubringen:
in_mode:toggle,flip,detached {fhem("sleep 0.2;; get $NAME in_mode"); my $val = $EVTPART1 ne 'toggle' ? $EVTPART1 : ReadingsVal($NAME,'in_mode','flip') ne 'flip' ? 'flip':'detached'; qq($\DEVICETOPIC/rpc {"id":1,"src":"fhem2shelly","method":"Switch.SetConfig","params": {"id":0, "config": {"in_mode": "$EVTPART1"}}}}\
Ergänzender Hinweis: das "get" unter einem "Einheitstopic" abzusetzen war vermutlich keine gute Idee, das hätte bei mehreren zu heilloser Verwirrung geführt. Daher das "Aufbohren" der "Erdleitung"...
Nachtrag noch:
Das mit webCmd war eigentlich als Aufforderung gedacht, das für alle bereitzustellen. Das ganze ist eine Spezialfunktion, die vermutlich einige Leute interessiert, aber nicht alle. Daher hätte ich das gerne aus devStateIcon draußen und "separat abschaltbar". Wäre nett, wenn du den Aufwand treiben würdest, ist glaube ich nicht soooo schwer.