FHEM Forum

FHEM => Sonstiges => Thema gestartet von: reisner am 08 Dezember 2022, 16:05:53

Titel: Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: reisner am 08 Dezember 2022, 16:05:53
Hallo,
ich rufe in einer User-Funktion in der 99_MyUtils.pm ein fhem("set IP_VPN $ret"); auf. Von Zeit zu Zeit sehe ich im Log die Fehlermeldung "Please define IP_VPN first". IP_VPN ist als dummy definiert und wir auch per list angezeigt. Die Funktion wird stündlich aufgerufen und die Fehlermeldung kommt nicht immer, meistens wird IP_VPN auch gefüllt. Ich bräuchte nun eure Hilfe, bei der Frage, wie ich der Ursache auf die Schliche komme.

Gruß
Ralph
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: Wernieman am 08 Dezember 2022, 16:11:44
$ret ist immer gefüllt?
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: reisner am 08 Dezember 2022, 16:20:15
$ret holt eine IP Adresse vom ADBServer Module per my $ret = fhem ("set RPI4TV shell echo `ifconfig tun0 2>/dev/null|awk '/inet addr:/ {print }'|sed 's/addr://'`",1);, ich denke, dass mindestens ein '-1' zurück kommt. Ich kann aber mal $ret ins Log ausgeben und schaun, was im Fehlerfall ausgegeben wird.

Danke!
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: Beta-User am 08 Dezember 2022, 16:21:58
Weiß nicht ob das damit zu tun hat, aber neulich hatten wir beim Testen von YAMAHA_AVR auch dieses seltsame "please define xy first" (u.a. https://forum.fhem.de/index.php/topic,129908.msg1249691.html#msg1249691 (https://forum.fhem.de/index.php/topic,129908.msg1249691.html#msg1249691)).

Das scheint dann zu passieren, wenn der "setter" irgendwie "kaputt" ist, also keine Leerzeichen enthält, wo welche stehen müßten, sondern irgendein anderes Trennzeichen (ein split mit \s trennt nicht, aber \W); das scheint dann auch die "vorangehenden" Leerzeichen kaputt zu machen, so dass der ganze String "WZ_Yamaha_ACV bass first" als eine Einheit interpretiert wird, die es eben nicht gibt... Ist das bei dir dann auch so ein längerer String mit vermeintlichen Leerzeichen?

Wenn ja, sollte sich Rudi vielleicht mal anschauen, ist sehr irritierend. (Weiß nicht genau, wo es herkommt).
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: reisner am 08 Dezember 2022, 16:33:01
Hi,
die Frage von Wernieman war genau richtig, wenn $ret leer ist, dann kommt der Fehler. Ich hätte in diesem Fall mit einer anderen Meldung gerechnet 'no set value specified'. Aber OK, mir wurde geholfen!

Danke
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: rudolfkoenig am 09 Dezember 2022, 11:14:52
@reisner: kann das Problem nicht nachvollziehen:
fhem> define IP_VPN dummy
fhem> { my $ret = "";; fhem("set IP_VPN $ret") }
no set value specified
fhem> { my $ret = undef;; fhem("set IP_VPN $ret") }
no set value specified
fhem>


@Beta-User: da ging es um Copy&Paste des Geraetenamens im Firefox, der   (aka non-breaking-space) kopiert hat, was FHEM nicht als Trenner akzeptiert. Ich habe daraufhin an dieser Stelle (set/get/attr in der Detailansicht) auf   verzichtet, und es mit CSS-Anweisungen ersetzt.
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: Beta-User am 09 Dezember 2022, 11:25:20
Zitat von: rudolfkoenig am 09 Dezember 2022, 11:14:52
@Beta-User: da ging es um Copy&Paste des Geraetenamens im Firefox, der   (aka non-breaking-space) kopiert hat, was FHEM nicht als Trenner akzeptiert. Ich habe daraufhin an dieser Stelle (set/get/attr in der Detailansicht) auf   verzichtet, und es mit CSS-Anweisungen ersetzt.
Danke für die Klarstellung.

Bin aber noch nicht sicher, ob das "alles" war: Das Problem trat nämlich auch auf, wenn die Anweisung aus einem cmdalias kam _und_ im Code (in YAMAHA_AVR zum Zusammenbau der getAllSet-Info einfache Quotes statt doppelter drin waren (um die einzelnen Teile einschl. des trennenden Leerzeichens). Jedenfalls war das meine Interpretation, kann auch falsch sein...
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: reisner am 09 Dezember 2022, 11:49:36
@rudolfkoenig
Meine Funktion sieht folgend aus:
sub check_IP_VPN(){
  my $ret = fhem ("set RPI4TV shell echo `ifconfig tun0 2>/dev/null|awk '/inet addr:/ {print }'|sed 's/addr://'`",1);
  Log 1, "check_IP_VPN(): ".$ret;
  fhem("set IP_VPN $ret");
}

Im Fehlerfall bekomme ich folgendes im Log2022.12.08 16:36:45 1: check_IP_VPN():

2022.12.08 16:36:45 3: set IP_VPN
: Please define IP_VPN
first
Hier ist also $ret leer und trotzdem wird das fehlende Device bemängelt und nicht das fehlende Set Argument. Warum das bei mir so ist und bei dir nicht - ich weiß es nicht. Für mich ist es aber jetzt in Ordnung, da ich ja nun die Ursache kenne und in der Funktion das leere $ret abfangen kann,

Danke
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: betateilchen am 09 Dezember 2022, 12:02:17
mal ne blöde Frage:

Wenn Du hier beim Aufruf von fhem()

my $ret = fhem ("set RPI4TV shell echo `ifconfig tun0 2>/dev/null|awk '/inet addr:/ {print }'|sed 's/addr://'`",1);

mit dem Parameter quiet (,1) die Ausgabe von fhem() unterdrückst - was soll denn dann überhaupt in $ret landen?
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: frank am 09 Dezember 2022, 12:07:32
ZitatHier ist also $ret leer und trotzdem wird das fehlende Device bemängelt und nicht das fehlende Set Argument.
wirklich leer ist $ret wohl nicht, da es im log eine leerzeile erzeugt.
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: betateilchen am 09 Dezember 2022, 12:09:18
Tritt die Fehlermeldung eigentlich im Zusammenhang mit einem FHEM Neustart auf?

Typischerweise ist "Please define xxx first" ein Reihenfolgeproblem beim Start von FHEM, wenn irgendein anderes device schon während des Starts versucht, auf ein device zuzugreifen, das noch nicht vorhanden ist, weil es erst später in der Reihenfolge des Starts kommt.

Zitat von: reisner am 09 Dezember 2022, 11:49:36
Für mich ist es aber jetzt in Ordnung, da ich ja nun die Ursache kenne und in der Funktion das leere $ret abfangen kann,

Dass das leere $ret die Ursache für die Fehlermeldung ist, glaube ich immer noch nicht.
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: betateilchen am 09 Dezember 2022, 12:10:27
Zitat von: frank am 09 Dezember 2022, 12:07:32
wirklich leer ist $ret wohl nicht, da es im log eine leerzeile erzeugt.

das ist das Nächste, das mich irritiert - aber so tief wollte ich jetzt nicht einsteigen  ;)
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: betateilchen am 09 Dezember 2022, 12:20:57
Wäre ich mal so tief eingestiegen *lach* - ich kann den Fehler nachstellen.
Genau der vorhandene Zeilenumbruch ist das Problem.


define testdummy dummy

sub test {
  my $ret = "\n";
  fhem("set testdummy $ret");
}


liefert beim Aufruf der Funktion test()

Please define testdummy
first


und zwar genau wie dargestellt - mit dem Zeilenumbruch in der Fehlermeldung.

Vermutlich (hab nicht in den Code geschaut) addiert CommandSet() den Zeilenumbruch zum devicename, sodaß anschließend nach einem device "testdummy\n" gesucht wird.
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: rudolfkoenig am 09 Dezember 2022, 12:21:15
ZitatDass das leere $ret die Ursache für die Fehlermeldung ist, glaube ich immer noch nicht.
Wollte ich auch nicht, wurde aber ueberzeugt:
fhem> define IP_VPN dummy
fhem> { my $ret = "\n";; fhem("set IP_VPN $ret") }
Please define IP_VPN
first


Das ist der (alten) Wort-Trennmethode geschuldet:
  my @a = split("[ \t][ \t]*", $param);
Die split Funktion enthaelt meinem Geschmack nach zu viel Magie, wenn als Trenner irgendwas mit Leerzeichen angegeben wird.

Mit folgender Aenderung wird es "richtig" getrennt, und die Fehlermeldung lautet "no set value specified":
   my @a = split(" ", $param);

Ich bin noch etwas unsicher, ob ich das einchecken soll, da es eine zentrale Stelle ist.
Falls kein Veto kommt, wuerde ich es tun.
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: betateilchen am 09 Dezember 2022, 12:28:06
zwei Leute - ein Gedanke  8)

Zitat von: rudolfkoenig am 09 Dezember 2022, 12:21:15
Wollte ich auch nicht, wurde aber ueberzeugt:

Naja, aber ein "\n" ist ja nicht "nichts" - also ist $ret tatsächlich nicht leer.

Mit Deiner vorgeschlagenen Änderung habe ich Bauchschmerzen, ohne das jetzt "technisch" begründen zu können.
Titel: Antw:Fehlermeldung "Please define xxx first", obwohl das Device existiert
Beitrag von: Beta-User am 09 Dezember 2022, 12:33:01
...bei meinen YAMAHA_AVR-Experimenten war ich auf "\W+" gekommen (allerdings zur Trennung der set-Bestandteile). Das ist aber wohl noch mehr "Magie", und nicht weniger, und ob das gegen den Zeilenumbruch hilft, ist mir grade auch noch nicht klar....

Falls es eine Einigkeit zum Thema möglicher Trenner gibt, könnten wir das ja in dem traulichen Kreis hier einfach mal auf Nebenwirkungen hin testen (bzw. die, die mögen...).
\W+ funktioniert an der Stelle jedenfalls nicht, sorry!

PS: Wenn man "split" in fhem.pl sucht, findet man einige Varianten, was zumindest auf den ersten Blick etwas irritiert!