split-Funktion innerhalb eines ReadingsVal nutzbar?

Begonnen von t1me2die, 22 November 2018, 11:04:19

Vorheriges Thema - Nächstes Thema

t1me2die

Moin liebes Forum,

ich bin gerade dabei etwas meinen Code zu optimieren und stelle mir jetzt folgende Frage:
Ist es möglich die "split" Funktion innerhalb eines ReadingsVal zu verwenden?
Wenn ja, wie schaut die korrekte Syntax aus?

Zur Zeit behelfe ich mir folgendermaßen:
Zuerst erstelle ich mir den Namen, den ich für das ReadingsVal benötige.

my $climaName = (split("_",$dev))[1] ."_Heizung_Clima";


Nun nutze ich das ReadingsVal wie folgt:

...
if (ReadingsVal($climaName,"desired-temp","") ne "off")
{ ... }
...


Das klappt, jedoch frage ich mich, ob ich die Zuweisung der Variablen $climaName mir nicht sparen könnte und es direkt im ReadingsVal erledigen kann?
Zum Beispiel so?


...
if (ReadingsVal("(split("_",$dev))[1] ."_Heizung_Clima","desired-temp","") ne "off")
{ ... }
...


Gruß
Mathze

betateilchen

Zitat von: t1me2die am 22 November 2018, 11:04:19
ob ich die Zuweisung der Variablen $climaName mir nicht sparen könnte und es direkt im ReadingsVal erledigen kann?

Im Prinzip schon. Aber die Variante mit der Variablenzuweisung ist auf jeden Fall die "schönere" und auch in zwei Jahren noch leichter nachvollziehbar.

Aber wenn Du in Deinem Beispiel die vorhandenen Syntaxfehler beseitigst, sollte das durchaus funktionieren.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

t1me2die

Moin und danke für deine Antwort betateilchen, dann werde ich die Variablenzuweisung so weiter benutzen.

Zitat von: betateilchen am 22 November 2018, 11:19:32
...
Aber wenn Du in Deinem Beispiel die vorhandenen Syntaxfehler beseitigst, sollte das durchaus funktionieren.
...
Glaub mir, wenn ich wüsste, wie die korrekte Syntax ist, würde ich nicht nachfragen.

Der normale Aufbau ist wie folgt:
if (ReadingsVal("Name","Reading",""))
Den Namen hatte ich bisher immer als Konstante oder Variable übergeben, verstanden.

Nun scheitere ich, weil ich nicht weiß, wie ich den String zusammenketten muss und wie ich mit den Hockommata umgehen muss.

Ist dies so richtig?

if (ReadingsVal((split("_",$dev))[1] ."_Heizung_Clima","desired-temp","") ne "off")
{ ... }


Irgendwie fehlen mir hier das öffnende und schließende Hochkommata.

Konstanten schreibe ich mit Hochkommata bisher wie folgt:

if (ReadingsVal("sz_Heizung_Clima","desired-temp","") ne "off")
{ ... }


Variablen schreibe ich ohne Hochkommata:

if (ReadingsVal($climaName,"desired-temp","") ne "off")
{ ... }


Nun bin ich leider immer noch keinen Schritt weiter und weiß noch immer nicht, wie ich es richtig zusammenketten muss. Habt ihr evtl. ein Beispiel für mich?

Gruß
Mathze

betateilchen

Zitat von: t1me2die am 22 November 2018, 11:04:19
ich bin gerade dabei etwas meinen Code zu optimieren

wo siehst Du in Deinem Vorhaben eigentlich eine Optimierung?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

t1me2die

Optimieren ist vielleicht ein falsch gewählter Ausdruck.
Durch den split im ReadingsVal spare ich mir eine Deklaration einer Variablen inkl. Zuweisung.
Natürlich spare ich mir eine Zeile Code und habe es direkt im ReadingsVal abgefrühstückt.

Das es in Zukunft besser nachvollziehbar ist, gebe ich Dir vollkommen recht, deswegen belasse ich es auch wie bisher.
Nichtsdestotrotz interessiert es mich, wie die korrekte Schreibweise eines "split" innerhalb eines ReadingsVal ist, denn das weiß ich bis jetzt noch immer nicht.

Gruß
Mathze

CoolTux

Zitat von: t1me2die am 22 November 2018, 11:32:51
Variablen schreibe ich ohne Hochkommata:

if (ReadingsVal($climaName,"desired-temp","") ne "off")
{ ... }

Und Funktionen auch!!
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Wuppi68

#6
Zitat von: CoolTux am 22 November 2018, 12:20:56
Und Funktionen auch!!

Konstanten packe ich auch nur in einfache Gänsefüßschen

Bsp: "desired-temp" --> 'desired-temp'

ungetestet würde ich es so machen:

my $climaName = (split("_",$dev))[1] ."_Heizung_Clima";
if (ReadingsVal("sz_Heizung_Clima","desired-temp","") ne "off")
{ ... }

-->

if (ReadingsVal((split("_",$dev))[1] ."_Heizung_Clima","desired-temp","") ne "off")
{ ... }

-->

if (ReadingsVal((split('_',$dev))[1] .'_Heizung_Clima','desired-temp,'') ne 'off')
{ ... }
FHEM unter Proxmox als VM

betateilchen

Zitat von: t1me2die am 22 November 2018, 11:32:51
Ist dies so richtig?

if (ReadingsVal((split("_",$dev))[1] ."_Heizung_Clima","desired-temp","") ne "off")
{ ... }


Irgendwie fehlen mir hier das öffnende und schließende Hochkommata.

Hast Du das einfach mal ausprobiert? Wenn ja, mit welchem Ergebnis?

(Du hast den Sinn der Hochkommas in perl offenbar nicht verstanden. Und den Unterschied zwischen einfachen und doppelten Hochkommas vermutlich auch nicht.)


Zitat von: t1me2die am 22 November 2018, 11:32:51
Konstanten schreibe ich mit Hochkommata bisher wie folgt:

if (ReadingsVal("sz_Heizung_Clima","desired-temp","") ne "off")
{ ... }


Konstanten schreibe ich immer in einfache Hochkommas, das ist eine echte Optimierung, weil perl nicht versucht, einen Ausdruck innerhalb von doppelten Hochkommas zu parsen.


if (ReadingsVal('sz_Heizung_Clima','desired-temp','') ne 'off')
{ ... }



Zitat von: t1me2die am 22 November 2018, 11:32:51
Variablen schreibe ich ohne Hochkommata:

if (ReadingsVal($climaName,"desired-temp","") ne "off")
{ ... }


Das ist korrekt.

Es gibt aber noch eine Variante...


if (ReadingsVal("blub_$climaName".'',"desired-temp","") ne "off")
{ ... }


würde (syntaktisch) grundsätzlich auch funktionieren, allerdings würde dann nach einem device namens "blub_sz_Heizung_Clima" gesucht, wenn "sz_Heizung_Clima" in $climaName steht.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

t1me2die

#8
Zitat von: betateilchen am 22 November 2018, 12:37:40
Hast Du das einfach mal ausprobiert? Wenn ja, mit welchem Ergebnis?
...

Nein, habe ich nicht, weil ich es erst gerne verstehen würde und nicht einfach ausprobieren möchte.

Zitat von: betateilchen am 22 November 2018, 12:37:40
...
(Du hast den Sinn der Hochkommas in perl offenbar nicht verstanden. Und den Unterschied zwischen einfachen und doppelten Hochkommas vermutlich auch nicht.)

Konstanten schreibe ich immer in einfache Hochkommas, das ist eine echte Optimierung, weil perl nicht versucht, einen Ausdruck innerhalb von doppelten Hochkommas zu parsen.
...

Das ist defintiv so, ich habe mir bisher darüber keinerlei Gedanken gemacht, pauschal habe ich immer die doppelten Hochkommas eingesetzt.
Auch in der commandref sind mehr Beispiele mit doppelten Hochkommas vorhanden als mit einzelnen.

Und wenn ich es jetzt richtig gelernt habe, sollte ich einfach Hochkommas immer bei Konstanten benutzen, damit Perl keine weitere Auflösung mehr macht.

D.h. eine stink normale Zuweisung sollte ich auch wie folgt machen:

my $day = $wday .'_monday';


anstatt:

my $day = $wday ."_monday";


Im zweiten Beispiel würde Perl nämlich versuchen alles innerhalb des doppelten Hochkomma aufzulösen, richtig?

An einem Beispiel würde das folgendes bedeuten: (vorausgesetzt $wday == 4)

my $monday = 'Montag';
my $day = $wday .'$monday';
#in $day würde dann <4$monday> stehen



my $monday = 'Montag';
my $day = $wday ."$monday";
#in $day würde dann <4Montag> stehen


Gut, dann bin ich hier nun auch ein Stück schlauer.

Laut der DevelopmentModuleAPI ist der Aufbau vom ReadingVal ohne Hochkommas

$value = ReadingsVal($name, $reading, $default);


Was mich nun endgültig verwirrt.

Langsam will ich glaub ich gar nicht mehr die Lösung wissen  :o

Gruß
Mathze

betateilchen

Zitat von: t1me2die am 22 November 2018, 13:35:22
Nein, habe ich nicht, weil ich es erst gerne verstehen würde und nicht einfach ausprobieren möchte.

Das ist defintiv so, ich habe mir bisher darüber keinerlei Gedanken gemacht, pauschal habe ich immer die doppelten Hochkommas eingesetzt.
Auch in der commandref sind mehr Beispiele mit doppelten Hochkommas vorhanden als mit einzelnen.

Deine Fragen sind absolute perl Grundlagenfragen. Es ist weder die originäre Aufgabe dieses Forum noch der commandref, diese Grundlagen einer Programmiersprache zu vermitteln. Dafür gibt es genug andere Quellen, die auf perl-Fragen spezialisiert sind und in denen man sicher auch FHEM-spezifische Fragen nicht stellen würde. D.h. stellen würde man sie vielleicht - aber Antworten würde man vergeblich erwarten.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!