[gelöst] stateformat und leerzeichen

Begonnen von pula, 04 Oktober 2023, 19:58:50

Vorheriges Thema - Nächstes Thema

pula

Hallo,

ich komme mir grad ein wenig dämlich vor, aber ich steh an.

Ich hab einen dummy, der per mqtt2 mit werten aus einer zweiten fhem-instanz von einem kodi-device versorgt wird.
Soweit, so gut. Nun möchte ich aber, daß nicht die Werte aus dem device angezeigt werden, wenn das kodi-device ausgeschaltet ist - das wird per presence und lan-ping abgefragt.

hab jetzt im stateFormat des dummy mal folgendes reingemalt (und schon vereinfacht, um ein wenig komplexität herauszubekommen:

{ my $state;
$state = fhem(ReadingsVal("p_raspimum","state",""));
    if ($state eq "absent") { return 'Ausgeschaltet' } else {
        my $label = sprintf(fhem(ReadingsVal($name,"label",0)));
        my $title = sprintf(fhem(ReadingsVal($name,"currentTitle",0)));
        my $status = sprintf(fhem(ReadingsVal($name,"playStatus",0)));
        my $time = sprintf(fhem(ReadingsVal($name,"time",0)));
        my $total = sprintf(fhem(ReadingsVal($name,"totaltime",0)));
         return sprintf($label . '-' . $title . '-' . $status . '-' . $time . '/' . $total);
    }
}

Jetzt steht zb im reading label "Das Erste HD" - und ich bekomme dann folgendes angezeigt:
Unknown command Das, try help.Kann mir bitte jemand sagen, wie ich das geraffel so hinkriege, dass es nicht ausgewertet, sondern einfach angezeigt wird?
Danke und cheers,
Pula
fhem (debian auf proxmox), HM-LAN und wired, MySensors, FritzBoxes, Kodi, vdr, Onkyo, squeezeplayers, nanoCUL, wifilight (Ethernet-Bridge), Heizungssteuerung (python/vncdotool), doorpi, ESP/Arduinos/MQTT, Alexa, HomeConnect, Sonoff/Tasmota, espRGBWW, esphome, Telegram

Jamo

#1
So muesste es funktionieren:
{ my $state = ReadingsVal("p_raspimum","state","noState");
    if ($state eq "absent") { return 'Ausgeschaltet' } else {
        my $label  = ReadingsVal($name,"label","noLabel");
        my $title  = ReadingsVal($name,"currentTitle","noTitle");
        my $status = ReadingsVal($name,"playStatus","noStatus");
        my $time   = ReadingsVal($name,"time","noTime");
        my $total  = ReadingsVal($name,"totaltime","noTotal");
     return $label . '-' . $title . '-' . $status . '-' . $time . '/' . $total;
    }
}
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

pula

Danke, tut!
Aber warum? Würde es gerne auch verstehen....
fhem (debian auf proxmox), HM-LAN und wired, MySensors, FritzBoxes, Kodi, vdr, Onkyo, squeezeplayers, nanoCUL, wifilight (Ethernet-Bridge), Heizungssteuerung (python/vncdotool), doorpi, ESP/Arduinos/MQTT, Alexa, HomeConnect, Sonoff/Tasmota, espRGBWW, esphome, Telegram

betateilchen

mit fhem() ruft man FHEM Befehle auf, keine perl Funktionen.

Wenn also ReadingsVal() einen Wert liefert wie "Das Erste HD" dann versuchst Du mit

fhem("Das Erste HD")
einen FHEM Befehl auszuführen, der mit "DAS" beginnt. Und das ist halt falsch.

Außerdem ist mir völlig unklar, was die sprintf() und die fhem() in Deinem Code eigentlich bewirken sollen. Du willst doch einfach Werte aus readings zusammensetzen, das ist eine reine String-Verarbeitung.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

pula

hm, hm....
meine intention war eigentlich, innerhalb des perl-teils (eingeleitet durch die geschwungene klammer) mit fhem() die ReadingsVal-Funktion aufzurufen.
Anscheinend lag ich da falsch.
Das sprintf war halt ein Versuch der - offensichtlich - in die Hose ging.
cheers,
Pula
fhem (debian auf proxmox), HM-LAN und wired, MySensors, FritzBoxes, Kodi, vdr, Onkyo, squeezeplayers, nanoCUL, wifilight (Ethernet-Bridge), Heizungssteuerung (python/vncdotool), doorpi, ESP/Arduinos/MQTT, Alexa, HomeConnect, Sonoff/Tasmota, espRGBWW, esphome, Telegram

betateilchen

Du solltest Dir vermutlich ein etwas umfangreicheres Grundwissen zur Unterscheidung von "FHEM Befehlen" und "perl Funktionen" aneignen, um zu verstehen, wann Du eigentlich an welcher Stelle womit arbeiten solltest (oder musst) oder es bereits tust.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

pula

fhem (debian auf proxmox), HM-LAN und wired, MySensors, FritzBoxes, Kodi, vdr, Onkyo, squeezeplayers, nanoCUL, wifilight (Ethernet-Bridge), Heizungssteuerung (python/vncdotool), doorpi, ESP/Arduinos/MQTT, Alexa, HomeConnect, Sonoff/Tasmota, espRGBWW, esphome, Telegram

betateilchen

Fang mal ganz einfach an.

fhem() ist eine perl Funktion.
ReadingsVal() ist eine perl Funktion.

Perl Funktionen werden in perl Code verwendet, der sich in der Regel innerhalb von geschweiften Klammern befindet.

{ fhem() }
{ ReadingsVal() }

Mehrere perl Funktionen können in einem perl Block enthalten sein, dann sind sie mit ; zu trennen.

{ fhem(); ReadingsVal() }

Jede perl Funktion hat eine bestimmte "Aufgabe".

ReadingsVal() liefert den Wert eines readings.

fhem() führt FHEM Befehle (!) innerhalb eines perl Blocks aus.

FHEM Befehle sind das, was Du einfach auch in die Befehlszeile im Frontend tippen kannst:

"set Schalter on" wird zu fhem("set Schalter on"), wenn es in einem perl Block passieren soll.

Daraus ergibt sich auch, dass Du in fhem() nicht einfach ReadingsVal() ausführen kannst, denn ReadingsVal() ist kein FHEM Befehl.


(An alle Korinthenkacker: ja, man kann in fhem() auch ReadingsVal() verwenden. Aber erst dann, wenn man die Grundprinzipien verstanden hat und weiß, was man da tut)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

pula

Vielen lieben Dank für die sehr ausführliche Erklärung für dummies :-)

Eigentlich hab ich das alles schon vor langem verinnerlicht, ich bin ja auch nicht mehr ganz neu bei fhem.

Mein Missverständnis bei der Sache war "nur", daß ich bis jetzt gedacht hatte, daß ReadingsVal eine fhem-Funktion ist.

Da hatte ich mich anscheinend getäuscht.

Aber nochmal vielen Dank für die ausführliche Erklärung!

Wobei: wenn ich jetzt doch nochmal nachfragen darf, wie das genau funktioniert...

ReadingsVal ist ja keine Standard-perl Funktion, sondern wird von fhem definiert, soweit ich weiß - oder irre ich mich auch hier?

Zumindest sehe ich in der fhem.pl eine Definition und auch die sub selber.

Was mir jetzt noch nicht ganz klar ist - und möglicherweise auch so manch anderem - ist, wie man erkennen (und verstehen) kann, welche Befehle von fhem direkt in perl ausführbar sind und welche "nur" innerhalb von fhem.  :o
Spannend, daß man auch nach Jahren immer noch merkt, daß man eigentlich keine Ahnung hat...

Cheers,
Pula
fhem (debian auf proxmox), HM-LAN und wired, MySensors, FritzBoxes, Kodi, vdr, Onkyo, squeezeplayers, nanoCUL, wifilight (Ethernet-Bridge), Heizungssteuerung (python/vncdotool), doorpi, ESP/Arduinos/MQTT, Alexa, HomeConnect, Sonoff/Tasmota, espRGBWW, esphome, Telegram

betateilchen

Es ist völlig egal, WO eine perl Funktion definiert ist. Das gesamte FHEM besteht nur aus perl Funktionen, auch FHEM Befehle werden letztendlich zu perl Funktionen aufgelöst. Die Befehle dienen lediglich der einfachen Nutzung durch die Anwender und der Standardisierung.

Deine Frage nach den verfügbaren Befehlen ist sehr einfach zu beantworten. Gib mal ,,help" in die Befehlszeile ein, da kommt eine Liste der aktuell verfügbaren Befehle.

Oder Du schaust in die commandref, da gibt es einen eigenen Abschnitt, in dem die FHEM Befehle aufgeführt und beschrieben sind.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

pula

Hm. danke. wie gesagt, war mir so nicht ganz bewusst, ich war der Meinung, dass ReadingsVal ein fhem-Befehl ist.
fhem (debian auf proxmox), HM-LAN und wired, MySensors, FritzBoxes, Kodi, vdr, Onkyo, squeezeplayers, nanoCUL, wifilight (Ethernet-Bridge), Heizungssteuerung (python/vncdotool), doorpi, ESP/Arduinos/MQTT, Alexa, HomeConnect, Sonoff/Tasmota, espRGBWW, esphome, Telegram

betateilchen

Einfache Regel: FHEM Befehle benutzen keine Klammern.

Es heißt ja nicht set(,,Schalter on")

Auf die Tatsache, dass man perl Funktionen ohne Klammern benutzen kann, gehe ich jetzt nicht ein. Es ist eher unüblich, schwer lesbar und verwirrend, Funktionen ohne Klammern zu verwenden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

pula

Ich setze mal auf gelöst. Danke für die rasche Hilfe!
fhem (debian auf proxmox), HM-LAN und wired, MySensors, FritzBoxes, Kodi, vdr, Onkyo, squeezeplayers, nanoCUL, wifilight (Ethernet-Bridge), Heizungssteuerung (python/vncdotool), doorpi, ESP/Arduinos/MQTT, Alexa, HomeConnect, Sonoff/Tasmota, espRGBWW, esphome, Telegram