FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Jupedi am 17 April 2020, 19:53:26

Titel: gelöst:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: Jupedi am 17 April 2020, 19:53:26
hallo,

kann jemand erklären, warum diese Definition nachstehende Fehlermeldung ergibt.

define n_Multipl notify ursprung {Multipl(ReadingsNum("ursprung","state",""))}

Es liegt wohl nicht am define selbst, weil auf einem anderen Raspi geht sie ohne Fehler durch.

Too many arguments for main::Multipl at (eval 752) line 1, near "))"

Es laufen auch zwei identische notify.
Ebenso strange, wenn ich bei den bereits funktionierenden notify auf bearbeiten (via DEF) gehe,
aber nix verändere und modify drücke kommt auch die Fehlermeldung

:(
Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: CoolTux am 17 April 2020, 19:56:57
Was genau soll den dieses Multipl für eine Funktion sein? Wo kommt die denn her?

Davon ab ist das keine vernünftige Regex

define n_Multipl notify ursprung
Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: Jupedi am 18 April 2020, 11:50:02
Das ganze ist gerade erst mal eine Fingerübung.
Ich acker mich mich durch die ersten Schritte der Perlprogrammierung und zur Eigenmotivation
will ich mehrere Dummy Werte aus Fhem in einem Sub in 99_testUtils verarbeiten
und die Ergebnisse wieder an ein o. mehrere Dummys zurückgeben.

Ein Wert hat bereits geklappt die Übergabe mehrerer Werte, da haperts schon wieder.

Wollte für jeden zu übergebenden Dummy Wert erst mal ein eigenes notify erstellen.
(Wenn das klappt, dann versuchen ein notify zu erstellen, das alle Werte übergibt.

"ursprung" war nur der Name des dummy, das den zu übergebenden Wert enthält.

"Multipl" der Name meines Sub.

So viel zum Hintergrund des ganzen.

Bei einem Freund wird dieses notify

define n_Multipl notify ursprung {Multipl(ReadingsNum("ursprung","state",""))}

anstandlos angelegt und bei mir kommt eben die genannte Fehlermeldung.

Da will ich eigentlich hin:

Dummynamen Eingabe: variable1, variable2, variable3
Dummyname Ausgabe: ergebnis

Für jedes Dummy ein entsprechendes notify z.B.:

define n_Multipl1 notify variable1 {Multipl(ReadingsNum("variable1","state",""))}


Damit sollen die Werte weiterverarbeitet werden.


sub testUtils_Initialize($$)
{
   my ($hash) = @_;
}

sub Multipl($$$)

{

#ob das überhaupt so möglich ist weiß ich noch nicht, elegant muss das auch noch nicht sein.


       my ($variable1) =@_;
       my ($variable2) =@_;
       my ($variable3) =@_;

       my ($Wert)= $variable1*$variable2*$variable3;

       {
       fhem ("setstate ergebnis" .$Wert);
       }

}

1;


Das zur Erklärung.

Mein primäres Prob. ist die Fehlermeldung beim notify.

Too many arguments for main::Multipl at (eval 752) line 1, near "))"
Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: CoolTux am 18 April 2020, 12:03:12
Hast Du ein shutdown restart Deines FHEM mal gemacht? Du hast bestimmt im laufenden Betrieb die Prototypen Deklaration geändert. Arbeite am besten ohne Prototyping

sub testUtils_Initialize($$)
{
   my ($hash) = @_;
}

sub Multipl($$$)

{

#ob das überhaupt so möglich ist weiß ich noch nicht, elegant muss das auch noch nicht sein.


       my ($variable1) =@_;
       my ($variable2) =@_;
       my ($variable3) =@_;

       my ($Wert)= $variable1*$variable2*$variable3;

       {
       fhem ("setstate ergebnis" .$Wert);
       }

}

1;


Nicht
sub Multipl($$$)
{

sondern
sub Multipl {

Neustart nach dieser Änderung nicht vergessen.

Das hier würde ich ändern
my ($variable1) =@_;
my ($variable2) =@_;
my ($variable3) =@_;


Man kann hier noch mit shift arbeiten
my ($variable1) = shift;
my ($variable2) = shift;
my ($variable3) = shift;


Ab 4 Variablen kann man auch

my ($variable1, $variable2, variable3) = @_;
machen.

Und versuch gleich von Anfang an Dir eine schöne Formatierung zu zu legen

my ($Wert) = $variable1 * $variable2 * $variable3;

Grüße
Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: Jupedi am 18 April 2020, 14:04:59
shutdown restart habe ich schon immer gemacht, aber vielleicht nicht lange genug danach gewartet.
Start dauert nach letztem Update sehr lange (HM CCU2)

Das notify geht jetzt. merci!
Prob. waren wohl die ($$$).

Allein es kommt noch nix im ergebnis dummy an.

Code ist jetzt wie folgt abgeändert.

sub testUtils_Initialize($$)
{
       my ($hash) = @_;
}

sub Multipl

{

       my ($variable1) = shift;
       my ($variable2) = shift;
       my ($variable3) = shift;

       my $Wert = $variable1 * $variable2 * $variable3;

       {
           fhem ("setstate ergebnis " .$Wert);
       }

}

1;


Und die drei notify erstellt

define n_Multipl1 notify variable1 {Multipl(ReadingsNum("variable1","state",""))}

define n_Multipl2 notify variable2 {Multipl(ReadingsNum("variable2","state",""))}

define n_Multipl3 notify variable3 {Multipl(ReadingsNum("variable3","state",""))}
Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: CoolTux am 18 April 2020, 14:18:59
Triggert denn das Notify?
Gibt es ein Device namens Ergebniss und besser setreading nehmen.
Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: Jupedi am 18 April 2020, 18:20:18

Triggert denn das Notify?
Der Zeitstempel des notify ändert sich, also würde ich sagen ja.

Gibt es ein Device namens Ergebniss
Es gibt ein Zieldummy/device genannt "ergebnis".

mmh, setstate hat auch schon mal funktioniert.  :-[

Bei

       my ($variable1) = shift;
       my ($variable2) = shift;
       my ($variable3) = shift;


ist mir nicht klar, wo die Zuordnungsinformation steckt, wenn z.B. das notify : n_Multipl2 triggert (Auslöser ist dummy variable2),
dass dieser Wert der $variable2 zugeordnet werden muss.

Kommen die Werte aus einem Array mit drei Werten und wird
my ($variable1, $variable2, variable3) = @_;
verwendet, so wird ja ein Wert nach dem anderen ausgelesen und ebenso seriell den Variablen: $variable1/2/3 zugeordnet.


Muss das dann so heißen?

fhem ("setreading ergebnis state" .$Wert);



Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: CoolTux am 18 April 2020, 18:45:47
Zitat von: Jupedi am 18 April 2020, 18:20:18
Bei

       my ($variable1) = shift;
       my ($variable2) = shift;
       my ($variable3) = shift;


ist mir nicht klar, wo die Zuordnungsinformation steckt, wenn z.B. das notify : n_Multipl2 triggert (Auslöser ist dummy variable2),
dass dieser Wert der $variable2 zugeordnet werden muss.

Kommen die Werte aus einem Array mit drei Werten und wird
my ($variable1, $variable2, variable3) = @_;
verwendet, so wird ja ein Wert nach dem anderen ausgelesen und ebenso seriell den Variablen: $variable1/2/3 zugeordnet.


Muss das dann so heißen?

fhem ("setreading ergebnis state" .$Wert);


Die Zuordnung machst Du bei der Übergabe wen Du die Funktion aufrufst. Das Konstrukt an sich ist aber seltsam.
So wie ich Dich verstanden habe übergibst Du immer nur einen Wert und hoffst das das dieser in der richtigen $variablen landet?

Wenn ich

meineFunktion('variable2')

aufrufe dann kannst Du nicht

meineFunktion {
    my $variable1;
    my $variable2;
    my $variable3;
}

hoffen das die variable2 auch in $variable2 landet. Sie wird immer in $variable1 landen weil Du nur eine übergibst.


Am besten Du zeigst mal Dein ganzes Konstrukt und vor allem bei Dir Logausgaben ein

Log 1,'Meine Logausgabe';
Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: Jupedi am 18 April 2020, 20:33:47
viel mehr Konstrukt ist da fast nicht.


4 Dummys:
variable1, variable2, variable3, ergebnis

Es sind die drei notifys:
define n_Multipl1 notify variable1 {Multipl(ReadingsNum("variable1","state",""))}

define n_Multipl2 notify variable2 {Multipl(ReadingsNum("variable2","state",""))}

define n_Multipl3 notify variable3 {Multipl(ReadingsNum("variable3","state",""))}


Die Datei mit der ich es teste, genannt: 99_testUtils.pm

Der gesamte Code in 99_testUtils.pm besteht aus:


package main;
use strict;
use warnings;
use POSIX;

sub testUtils_Initialize($$)
{
   my ($hash) = @_;
}

sub Multipl

{

       my ($variable1) = shift;
       my ($variable2) = shift;
       my ($variable3) = shift;

       my $Wert = $variable1 * $variable2 * $variable3;

       {
       fhem ("setstate ergebnis " .$Wert);
       }

}

1;


Damit bin ich überfragt: Log 1,'Meine Logausgabe';
Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: CoolTux am 18 April 2020, 20:41:37
Du übergibst doch nur einen einzigen Wert an die Funktion.
Den Wert welcher die Funktion ReadingsNum aus liest.

Auf jeden Fall ist die Multiplikation Unsinn. Es kommen keine 3 Werte an..

Lese am besten erstmal ein Perlbuch. Und dann über erstmal mit eigenen Perlscripten in der Bash Shell Deines Linuxsystems.
Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: Jupedi am 18 April 2020, 21:14:56
Da bin ich ja dabei, ich stell das mal zurück, merci
Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: CoolTux am 18 April 2020, 21:19:26
Wir können das gerne auch zusammen mal üben . Ich zeige Dir einen Anfang wo Du drauf aufbauen kannst.
Wenn Du magst.
Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: Jupedi am 19 April 2020, 10:25:40
Danke, ich bin mit dem Perl Schmöker erst halb durch und war nur etwas ungeduldig.
Wollte mal etwas praktisch anwenden.
War vielleicht ein wenig früh.

Ich mache das Buch jetzt erst mal zuende und würde dann gerne auf dein Angebot zurückkommen.

Herzlichen Dank!
Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: CoolTux am 19 April 2020, 10:36:08
Du kannst das auch ausserhalb von FHEM üben. Sofern Du das noch nicht machst.

Einfach in der Linux Shell ein Perlscript anlegen und dadrin den Code ausprobieren.


Viel Spaß dabei.
Titel: Antw:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: Jupedi am 19 April 2020, 14:48:54
Mach das via Terminal des Notebook, ruf da das entsprechende Programmauf, an dem ich gerade übe auf.

jo, merci
Titel: Antw:gelöst:Fehlermeldung: Too many arguments for main:: usw.
Beitrag von: Jupedi am 10 Mai 2020, 13:50:46
@CoolTux

habe mein Problem mit der Übergabe von numerischen Dummywerten an ein Sub und zurück zu einem Dummy gelöst.

Wenn es für andere mit ähnlichen Halbwissen interessant scheint, würde ich das "Kochrezept" in einem eigenen Post zusammenfassen.

Wie gesagt, Ausgangsproblem:

Ich habe mehrere numerische Dummywerte, möchte die  einem Sub ( bei mir 99_testUtils.pm ) übergeben und weiterverarbeiten,  anschließend an ein "Ergebnisdummy" zurückgeben.

Das geht mit Sicherheit eleganter, als ich es gemacht habe, aber es funktioniert.

Vielleicht ist das aber auch für keinen, außer mir, ein Problem.  ;D