Fehlermeldung "Please define xxx first", obwohl das Device existiert

Begonnen von reisner, 08 Dezember 2022, 16:05:53

Vorheriges Thema - Nächstes Thema

reisner

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

Wernieman

- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

reisner

$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!

Beta-User

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).

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).
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

reisner

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

rudolfkoenig

@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.

Beta-User

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...
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

reisner

@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

betateilchen

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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

frank

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.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

betateilchen

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.
-----------------------
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: 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  ;)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

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.

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!