Kurze Durchsicht:
Sieht aufgeräumt aus

.
Eines ist mir jetzt noch über die Leber gelaufen:
my ($proto, $host, $port, $path) = ($1, $2, $3 ? $3 : ':' . ($1 eq 'wss' ? '443' : '80'), $4);
Dem Gefühl nach paßt das nicht, wenn $3 keinen match liefert: Was steht dann in $4? Dann willst du stattdessen vermutlich $3 haben?
Kurzum: mit "named captures" und einem kleinen defined-or wäre es klarer...
Ob das nach
elsif($hash->{method} eq "cmd")
(ich ziehe eine Quote

) funktioniert, ist mir unklar. Sieht nach einem Versuch aus, einen Befehl an das OS abzusetzen? Dann müßte da eher ein qx stehen, oder? (Ist aber nicht mein Spezialgebiet, kann sein, dass die Anmerkung kompletter Unfug ist).
Und bei "encode_json" kann schon auch mal was schief gehen, oder? Falls ja, gehört es m.E. in {eval}
Für decode gilt das m.E. aber vorsichtshalber immer. (Erfahrungsgemäß reißt das FHEM direkt in den Abgrund, wenn da - aus welchen Gründen auch immer - irgendwas nicht paßt).
Die weiteren "Feinheiten" (ist jetzt aber irgendwie langsam aber sicher "na ja, schon irgendwie"

...):
Irgendwo ist ein ausdrückliches return; verlorengegangen?
"$args[1]" müßte eigentlich "$apar->[1]" entsprechen? (Weiß nicht, ob das in RHASSPY überall "mustergültig" steht, jedenfalls könnte man sich dann das Umpacken sparen...)
(Textlich) längere "or-Kaskaden" (mit ||) könnte man auch untereinander notieren, ist evtl. optisch leichter zu erfassen (ich notiere auch "gerne" gedrängt, ist aber nicht vorbildlich...)
Für sowas
if(grep {$item eq $_} @dataitems)
gab's irgendwo in List::Utils auch eine Funktion, meine ich mich zu erinnern. Sollte auch seit längerem in corelist sein. Perlcritic mag "grep" irgendwie häufig nicht, ich bin aber noch nicht so richtig dahintergestiegen, wieso genau nicht...
In Set gibt's noch eine elsif-Kaskade und andernorts auch noch das eine oder andere "else", das ein direktes return erschlagen würde?
Ähnliches gilt für (exemplarisch)
if($function eq 'get')
Das ist eigentlich ein "next if ... ne ...", und man spart sich da und analog im Folgenden einige Einrückungen.
Er hat "or" gesagt... (na ja,...)