Bei ECMDDevice im cmd ein Reading verwenden

Begonnen von webturtle, 31 Oktober 2015, 13:56:48

Vorheriges Thema - Nächstes Thema

webturtle

Hallo.
Ich versuche den ganzen morgen aber komme nicht darauf wie die korrekte Syntax lauten muss:

Es geht um das Schalten eines RGB Controllers. Man kann eine eine Farbe und eine Stufe auswählen.
z.B

set rgb params stufe Farbe
set rgb cmd {"rgb %stufe %farbe\n\r"}


Das geht soweit.
Dann hatte ich es erweitert um:

set farbe params farbe.
set farbe cmd {"rgbess 4 %farbe\n\r"}
set farbe expect "^rgbess\s(\d+)\s(\d+).*$"
set farbe postproc { s/^rgbess\s(\d+)\s(\d+).*$/$2/;; $_ }
set stufe params stufe.
set stufe cmd {"rgbess %stufe 7\n\r"}
set stufe expect "^rgbess\s(\d+)\s(\d+).*$"
set stufe postproc { s/^rgbess\s(\d+)\s(\d+).*$/$1/;; $_ }

Dadurch habe ich dann in dem Device ein Reading farbe und stufe mit jeweils dem Wert.

Mein Ziel in den cmd soll jeweils die Zahl (im Code oben die 4 und 7) ersetzt werden durch den Wert aus dem Reading des device.
Aber ich kann nirgends die Syntax dazu finden. Geht es überhaupt?

Chris

Dr. Boris Neubert

Hallo,

Du kannst ReadingsVal("NameDeinesDevices", "NameDesReadings", DefaultWert) in dem Set-Kommando verwenden.

Grüße
Boris

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

webturtle

Dachte ich auch und hatte es so versucht:


set stufe params stufe.
set stufe cmd {"rgb %stufe ReadingsVal("RGBEsszimmer", "farbe", "4")\n\r"}
set stufe expect "^rgb\s(\d+)\s(\d+).*$"
set stufe postproc { s/^rgb\s(\d+)\s(\d+).*$/$1/;; $_ }


Ergebnis im Log:


2015.10.31 14:07:12.628 1: PERL WARNING: Bareword found where operator expected at (eval 114409) line 1, near ""rgb 2 ReadingsVal("RGBEsszimmer"
2015.10.31 14:07:12.628 1: PERL WARNING: String found where operator expected at (eval 114409) line 1, near "RGBEsszimmer", ""
2015.10.31 14:07:12.629 1: PERL WARNING: Bareword found where operator expected at (eval 114409) line 1, near "", "farbe"
2015.10.31 14:07:12.629 1: PERL WARNING: String found where operator expected at (eval 114409) line 1, near "farbe", ""
2015.10.31 14:07:12.629 1: PERL WARNING: Number found where operator expected at (eval 114409) line 1, near "", "4"
2015.10.31 14:07:12.629 1: PERL WARNING:        (Missing operator before 4?)
2015.10.31 14:07:12.630 1: PERL WARNING: String found where operator expected at (eval 114409) line 1, near "4")\n\r""


Dann fing ich an mit allen Möglichen Klammer und Hochkommas zu versuchen, bis ich mir dachte: Hier besser mal nachfragen.

Chris

Dr. Boris Neubert

Da kommen die Anführungszeichen durcheinander. Probier bitte dieses:

set stufe cmd {"rgb %stufe " . ReadingsVal("RGBEsszimmer", "farbe", "4") . "\n\r"}
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

webturtle

Vielen vielen Dank.

So geht es. Hatte so was ähnliches im Laufe des Vormittags auch schon probiert aber wohl irgendwo noch nen Fehler drin.

Ich weiss einfach nie wo genau was ausgeführt wird.
Aber so wie es jetzt aussieht ist es reiner Perl-Code mit normaler String Verknüpfung. Eigentlich logisch da ReadingsVal ja in einem *.pm definiert ist.

Man kommt so schnell durcheinander....

Eine Frage noch: Muss man nach Änderungen in einer classdef ein rereadcfg machen, oder schaut hem vor jedem Kommando neu in die classdef Datei?

Jedenfalls hast du mir den Nachmittag gerettet....
Chris

Dr. Boris Neubert

Zitat von: webturtle am 31 Oktober 2015, 14:22:01
Eine Frage noch: Muss man nach Änderungen in einer classdef ein rereadcfg machen, oder schaut hem vor jedem Kommando neu in die classdef Datei?

Du musst ein rereadcfg machen.

Zitat
Jedenfalls hast du mir den Nachmittag gerettet....

Gerne.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

webturtle

Danke auch dafür.
Gibt es irgendwo eine Beschreibung was in diesen .classdef Dateien alles so erlaubt ist?

Hintergrund: Weil das jetzt so prima klappt habe ich mir eine ReadingsGroup gebaut in der ich das ganze mittels einem Slider für die Stufe und einer Auswahlwette für die Farben steuern kann.
Der Slider kann 0 - 5 stellen und die Liste 0,1,2,3,4,5,6,7,8,9
Das klappt soweit prima.
Nun will ich gerne In der Liste die Farben stehen stehen haben.
Zum testen machte ich einfach mal 0,1,2,3,4,5,Rot,7,8,9
Das zeigt er dann so an und gibt natürlich auch Rot an die .classdef
Dort wollte ich dann mit if (%farbe==Rot){$color=6;} einer Ersetzung auf die Zahl machen.

Ist scheinbar nicht erlaubt. Ich bekomme sending command "Global symbol "$color" requires explicit package name at (eval 4061) line 1.\n"

Oder bin ich auf dem Holzweg. Muss das Rot wird "6" vorher passieren?

Dr. Boris Neubert

Hallo,

was in classdef-Dateien erlaubt ist, findest Du in der commandref. Zwischen den {} kann beliebiger Perl-Kode stehen. Dieser wird ausgewertet und das Ergebnis ist dann der String, der an das Gerät geschickt wird. Parameter, die mit % beginnen, sind reine Makros und es findet eine Ersetzung statt, bevor der Perl-Kode interpretiert wird.

Ansonsten empfehle ich Dir, Dich tiefer in Perl einzuarbeiten. $color ist eine nichtdeklarierte Variable und um das Rot fehlen die Anführungszeichen und der Operator für Stringvergleiche heißt eq.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

webturtle

Danke. Werde ich beherzigen.
Ich bin zu sehr in C beheimatet und muss immer wieder nachsehen wie etwas in Perl gemacht werden muss. Ich denke mit diesen Info bekomme ich es hin.

webturtle

Ich habe es in eine Funktion in 99_myUtils.pm ausgelagert.
Funktioniert prima.

Danke nochmals:

sub
farbeErsetzen($$$)
{
  my ($ort, $stufe, $farbe) = @_;
  my $color = 0;
  my $ret = "";
  if ($farbe eq "Lila")
    {$color = 0;}
  elsif ($farbe eq "1")
    {$color = 1;}
  elsif ($farbe eq "2")
    {$color = 2;}
  elsif ($farbe eq "Mint")
    {$color = 3;}
  elsif ($farbe eq "Orange")
    {$color = 4;}
  elsif ($farbe eq "Murf")
    {$color = 5;}
  elsif ($farbe eq "Rot")
    {$color = 6;}
  elsif ($farbe eq "Gruen")
    {$color = 7;}
  elsif ($farbe eq "Blau")
    {$color = 8;}
  elsif ($farbe eq "Weiss")
    {$color = 9;}
  $ret .= $ort . " " . $stufe . " " . $color . "\n\r";
  return $ret;
}


Dabei kam mir jetzt noch ne ganz andere Idee und ich fang wahrscheinlich nochmal von vorne an......