[Erledigt!] - AnalyzeCommand - Abkürzung erhält anscheinend den Vorzug

Begonnen von Benni, 15 Januar 2023, 17:08:47

Vorheriges Thema - Nächstes Thema

Benni

Hallo Rudi,

ich habe in meiner FHEM-Installation kürzlich ein eigenes Command 'countdown' in einem 99er Modul implementiert.

Jetzt habe ich zufällig festgestellt, dass das 'count'-Command (98_count.pm) bei mir nicht mehr funktioniert, sondern stattdessen immer mein 'countdown' aufgerufen wird.

Ich gehe davon aus, dass in AnalyzeCommand die mögliche Kurzschreibweise 'count' für 'countdown' den Vorzug erhält, statt zuvor zu prüfen, ob evtl. ein exakt so benanntes Command auch noch vorhanden ist, was dann sinnvollerweise aufzurufen wäre.

Bleibt noch die Frage, was im Konkreten Fall mit weiteren Kürzeln, wie 'cou' oder 'coun' zu verfahren ist.
M.E. müssten die beiden auch 'count' aufrufen und erst ab 'countd' dürfte 'countdown' aufgerufen werden.

Oder man kappt die Abkürzungen ganz und realisiert sich die über cmdalias bei Bedarf selbst.

Wobei mir gerade einfällt, dass das 'l'-Kommando funktioniert, obwohl ja auch 'list' vorhanden ist ....


gb#

betateilchen

Schau Dir doch mal in der fhem.pl an, wie der Mechanismus für die Auswertung der Abkürzungen funktioniert, dann beantwortet sich Deine Frage von selbst.
Es ist - vereinfacht gesagt - schlichtweg ein Reihenfolgenproblem beim Schreiben in den commands-Hash.
Deshalb sollte man grundsätzlich darauf verzichten, einen command zu definieren, der eine längere (oder kürzere) Variante eines bereits existierenden commands bezeichnet.

Darüberhinaus finde ich es generell keine gute Idee, commands in einer 99er Datei zu definieren.


Zitat von: Benni am 15 Januar 2023, 17:08:47
Oder man kappt die Abkürzungen ganz

Dagegen!
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Benni

Zitat von: betateilchen am 15 Januar 2023, 19:18:21
Schau Dir doch mal in der fhem.pl an, wie der Mechanismus für die Auswertung der Abkürzungen funktioniert, dann beantwortet sich Deine Frage von selbst.
Es ist - vereinfacht gesagt - schlichtweg ein Reihenfolgenproblem beim Schreiben in den commands-Hash.

Ich habe das nicht 100% durchschaut, bzw. gesehen, dass bei der Ermittlung der Abkürzungen die keys vom commands-Hash ja eigentlich sortiert verwendet werden, von daher habe ich das unterschiedliche Verhalten von 'l'/'list' und 'count'/'countdown' nicht verstanden. (Tue ich immer noch nicht!)

Zitat
Deshalb sollte man grundsätzlich darauf verzichten, einen command zu definieren, der eine längere (oder kürzere) Variante eines bereits existierenden commands bezeichnet.

... es sei denn die Commands ergeben in Ihrer Benennung trotzdem Sinn: 'count' zählt devices und mein 'countdown' erzeugt eben einen solchen, so wie ich ihn brauche.

Zitat
Darüberhinaus finde ich es generell keine gute Idee, commands in einer 99er Datei zu definieren.

Damit kann ich leben. Ich habe das Command eben mal zum Testen in ein 98er-Modul gepackt, damit scheint sich dann auch tatsächlich das "Reihenfolgen"-Problem gelöst zu haben. (Warum?)

Zitat
Dagegen!

Ich eigentlich auch, könnte das aber auch leicht verschmerzen!

betateilchen

Zitat von: Benni am 15 Januar 2023, 20:27:03
Ich habe das Command eben mal zum Testen in ein 98er-Modul gepackt, damit scheint sich dann auch tatsächlich das "Reihenfolgen"-Problem gelöst zu
haben. (Warum?)

99er Dateien werden beim FHEM Start immer geladen. Damit ist in %cmds bereits zu einem sehr frühen Zeitpunkt ein command "countdown" eingetragen.
Gibt man jetzt "count" ein, wird dieser Eintrag über den Abkürzungsmechanismus gefunden und das Modul 98_count.pm gar nicht mehr erst geladen. Denn es gibt ja schon einen "passenden" Eintrag im hash.

Durch Dein Auslagern in eine 98er Datei hast Du das Problem ein bisschen entschärft, aber nicht gelöst.
Jetzt hängt das Verhalten von FHEM davon ab, welchen der beiden Befehle "count" oder "countdown" Du zuerst ausführst.
Der zuerst ausgeführte Befehl lädt das zugehörige Modul und schreibt seinen Namen in %cmds. Danach wird dieser Befehl bei Eingabe von "count" gefunden. Das andere Modul wird dann ebenfalls nicht mehr geladen.

Deshalb:

Zitat von: betateilchen am 15 Januar 2023, 19:18:21
sollte man grundsätzlich darauf verzichten, einen command zu definieren, der eine längere (oder kürzere) Variante eines bereits existierenden commands bezeichnet.

Zitat von: Benni am 15 Januar 2023, 20:27:03
von daher habe ich das unterschiedliche Verhalten von 'l'/'list' und 'count'/'countdown' nicht verstanden. (Tue ich immer noch nicht!)

Hast Du das jetzt verstanden? Auch das hängt mit der Reihenfolge zusammen.
Was soll denn Deiner Meinung nach anderes passieren, wenn man "l" eingibt, als dass ein "list" ausgeführt wird?

"list" ist ein Befehl, der in fhem.pl definiert ist. Er steht somit beim Start von FHEM in %cmds, bevor irgendein anderes Modul geladen wird. Deshalb wird bei Eingabe von "l" immer "list" ausgeführt.

Zitat von: Benni am 15 Januar 2023, 20:27:03
... es sei denn die Commands ergeben in Ihrer Benennung trotzdem Sinn:

Es geht nicht um die Sinnhaftigkeit der Benennung, es ist schlichtweg eine "logische" Restriktion, die sich aus dem bestehenden Abkürzungsmechanismus ergibt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Benni

Zitat von: betateilchen am 15 Januar 2023, 20:38:40
es ist schlichtweg eine "logische" Restriktion, die sich aus dem bestehenden Abkürzungsmechanismus ergibt.

Aber der Abkürzungsmechanismus müsste doch in dem Fall überhaupt nicht zum Zug kommen! Es gibt ein Command, das genau so heißt, wie angegeben und fertig!

Zitat von: betateilchen am 15 Januar 2023, 20:43:06
Nenne Deinen Befehl doch "kickoff"  :)

Ja, ich könnte ihn natürlich auch 'cntdn' oder 'mycountdown' nennen .... da fällt mir dann schon noch was passendes ein! :)

Wegen mir muss hier auch gar nichts verändert werden, ich wollte es nur verstehen und das habe ich jetzt, glaube ich .... it's not a bug, it's a feature ... mal wieder!  ::)


Benni

Zitat von: betateilchen am 15 Januar 2023, 20:38:40
Was soll denn Deiner Meinung nach anderes passieren, wenn man "l" eingibt, als dass ein "list" ausgeführt wird?

Btw.: Hier wird nicht list aufgerufen, sondern das angegebene device (!) in der device-Anischt.


betateilchen

#7
Zitat von: Benni am 15 Januar 2023, 21:03:46
Btw.: Hier wird nicht list aufgerufen, sondern das angegebene device (!) in der device-Anischt.

Das ist eine Ausnahme. Verwende l mal ohne deviceName - dann siehst Du, dass das gleiche Ergebnis kommt wie bei list ohne deviceName.

Der von Dir beschriebene Effekt bei "list" tritt übrigens nur in FHEMWEB auf. Probier das mal in telnet - dann wirst Du sehen, dass beide Ausgaben identisch sind.

List hat auch noch ein paar andere Sonderfälle, insbesondere im Zusammenhang mit angegebenen devspec.
Beispielsweise sind die Ergebnisse unterschiedlich bei list TYPE=<modulType> je nachdem, ob es nur 1 device dieses Typs gibt oder mehrere.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: Benni am 15 Januar 2023, 20:55:04
Aber der Abkürzungsmechanismus müsste doch in dem Fall überhaupt nicht zum Zug kommen! Es gibt ein Command, das genau so heißt, wie angegeben und fertig!

Solange "count" noch nicht ausgeführt wurde, weiß FHEM überhaupt nicht, dass es diesen Befehl überhaupt gibt. Ein command steht erst dann zur Verfügung, wenn die zugehörige Datei durch den erstmaligen Aufruf des Befehls geladen wurde und der Befehl sich namentlich in %cmds eingetragen hat.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Benni

Zitat von: betateilchen am 15 Januar 2023, 21:21:09
Solange "count" noch nicht ausgeführt wurde, weiß FHEM überhaupt nicht, dass es diesen Befehl überhaupt gibt. Ein command steht erst dann zur Verfügung, wenn die zugehörige Datei durch den erstmaligen Aufruf des Befehls geladen wurde und der Befehl sich namentlich in %cmds eingetragen hat.

Hmm.... das ist natürlich doof! Demzufolge weiß FHEM direkt nach dem Start auch nix mit 'co' anzufangen.
Ich hab's getestet: "Unknown command co, try help." ;) Und ja, wenn ich zuerst 'countdown' aufrufe wird count nie mehr geladen....

... reload 98_count hilft dann weiter :)

TL;DR: "kickoff"! :D




rudolfkoenig