FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: stefanm am 11 April 2014, 23:06:48

Titel: IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: stefanm am 11 April 2014, 23:06:48
Hallo,

ich raf die Syntax von IF nicht (und einigem anderen nicht, und kenne mich leider nur ein wenig python und c aus) :


IF ([Bewaesserung_Active] eq "Auto") (define a10 at §Startzeit_Bewaesserung set Kreis_Trafo on-for-timer 3600, define a11 at §Startzeit_Bewaesserung set Kreis_Rechts on-for-timer 1800, define a13 at (§Startzeit_Bewaesserung + 00:30:00) set Kreis_Links on-for-timer 1800)

Funktioniert ist aber kaum lesbar (außer für fhem) ;)

Wenn ich die einzelnen Code Zeilen aufteile erhalte ich : IF: no right bracket


IF ([Bewaesserung_Active] eq "Auto")
   (define a10 at §Startzeit_Bewaesserung set Kreis_Trafo on-for-timer 3600,
    define a11 at §Startzeit_Bewaesserung set Kreis_Rechts on-for-timer 1800,
    define a13 at (§Startzeit_Bewaesserung + 00:30:00) set Kreis_Links on-for-timer 1800)


auch wenn ih statt den Komma dopplet Semikolon verwende geht es nicht, Mit Semikolon kommt dann :

IF: no left bracket: Unknown command (define, try help. Wrong timespec §Startzeit_Bewaesserung: either HH:MM:SS or {perlcode} Wrong timespec (§Startzeit_Bewaesserung: either HH:MM:SS or {perlcode}



und ganz schlimm wird es wenn ich die If Anweisung noch verschachtele:


IF (Garten.Wand = "on")(
IF ([Bewaesserung_Active] eq "Auto") (define a10 at §Startzeit_Bewaesserung set Kreis_Trafo on-for-timer 3600, define a11 at §Startzeit_Bewaesserung set Kreis_Rechts on-for-timer 1800, define a13 at (§Startzeit_Bewaesserung + 00:30:00) set Kreis_Links on-for-timer 1800))


In der Command ref ist doch folgendes Beispiel angegeben :

define test notify lamp
IF ([lampe] eq "on") (
     IF ([outdoor:humidity] < 70)
          (set lamp off)
      ELSE
          (set lamp on)
) ELSE
      (set switch on)

und in der Heimautomatisierung-mit-fhem.pdf wird nur if "Wenn ich das richtig verstanden habe perlcode variante erklährt"

Danke und Gruss Stefan
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: stefanm am 11 April 2014, 23:30:02
Ich hab jetzt mal vesucht es als als Perl Code zu schreiben:


define Bewesserungs_Steuerung notify Bewesserungs_Steuerung_notity {\
   IF (Garten.Wand = "on"){;;\
      IF ([Bewaesserung_Active] eq "Auto") ;;\
            {define a10 at §Startzeit_Bewaesserung set Kreis_Trafo on-for-timer 3600;;\
             define a11 at §Startzeit_Bewaesserung set Kreis_Rechts on-for-timer 1800;;\
             define a13 at (§Startzeit_Bewaesserung + 00:30:00) set Kreis_Links on-for-timer 1800};;\
      IF ([Bewaesserung_Active] eq "On");;\
            {set Kreis_Trafo on-for-timer 3600;;\
             set Kreis_Rechts on-for-timer 1800;;\
             set Kreis_Links on-for-timer 1800};;\
      IF ([Bewaesserung_Active] eq "Off");;\
            {set Kreis_Trafo off, set Kreis_Rechts off;;\
             set Kreis_Links off};;\
      IF ([Bewaesserung_Active] eq "Urlaub");;\
            {define a10 at §Startzeit_Bewaesserung set Kreis_Trafo on-for-timer 5400;;\
             define a11 at §Startzeit_Bewaesserung set Kreis_Rechts on-for-timer 1800;;\
             define a13 at (§Startzeit_Bewaesserung + 00:30:00) set Kreis_Links on-for-timer 1800;;\
             define a13 at (§Startzeit_Bewaesserung + 00:60:00) set Kreis_Urlaub on-for-timer 1800};;\
};;\
}


So gibt es, zumindest bei speichern keine Fehlermeldung mehr, ob es funktioniert wird sich noch zeigen.
ür Kate
Bei der Gelegenheit, in der Doku hab ich irgendwo gelesen, das für Notepad++ die Syntax fhem gibt. Gibts das auch für Kate ?


Stefan
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: betateilchen am 11 April 2014, 23:32:14
wenn Du eh schon perl schreibst, brauchst Du auch IF (als perl Befehl) nicht mehr.

Und tröste Dich: ich habe den Sinn/die Notwendigkeit von IF auch noch nicht verstanden.
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: stefanm am 13 April 2014, 10:46:47
So ich hatte ja den Code auf Perl umgestellt und es gab keine Fehlermeldung. Trotzdem weden die Anweisungen nicht ausgeführt :


define Bewesserungs_Steuerung notify Bewaesserung_Active {\
   if (Garten.Wand eq "off"){\
      if (Bewaesserung_Active eq "Auto") {\
             fehm "define a10 at *23:05:00 set Kreis_Trafo on-for-timer 3600";;\
             fehm "define a11 at *23:00:00 set Kreis_Rechts on-for-timer 1800";;\
             fehm "define a13 at *23:30:00 set Kreis_Links on-for-timer 1800";;\
};;\
      if (Bewaesserung_Active eq "On") {\
             fhem "set Kreis_Trafo on-for-timer 3600";;\
             fhem "set Kreis_Rechts on-for-timer 1800";;\
     my $BStunde = sprintf("%%02d", $hour);;\
             my $BMinute = sprintf("%%02d", $min;;\
);;\
             if ($BMinute>=30)($EBStunde=$BStunde+1 $EBMinute=$BMinute-30);;\
             if ($BMinute<30)($EBStunde=$BStunde+1 $EBMinute=$BMinute+30);;\
             my $BStart = $EBStunde + $EBMinute;;\
             fhem "define a10 at *$BStart set Kreis_Links on-for-timer 1800";;\
};;\
      if (Bewaesserung_Active eq "Off") {\
            fhem ("set Kreis.* off";;\
);;\
      if (Bewaesserung_Active eq "Urlaub") {\
             fehm "define a10 at *23:00:00 set Kreis_Trafo on-for-timer 5400";;\
             fehm "define a11 at *23:00:00 set Kreis_Rechts on-for-timer 1800";;\
             fehm "define a13 at *23:30:00 set Kreis_Links on-for-timer 1800";;\
             fehm "define a13 at *23:59:00 set Kreis_Urlaub on-for-timer 1800";;\
  };;\
};;\
}\


Kann mir bitte jemand einen Tip geben was ich Falsch mache ? Ich komm nicht drauf.

Gruss Stefan
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: Puschel74 am 13 April 2014, 10:52:35
Hallo,

if (Garten.Wand eq "off"){\
wird so vermutlich nicht funktionieren.

Wenn du den Status auslesen willst musst du Value nehmen.
Wenn du ein Reading auslesen willst musst du ReadingsVal nehmen.

Ob das notify überhaupt getriggert wird kann dir vermutlich auch niemand sagen.
Bau mal ein paar Log in den Code ein und schau wie weit er ausgeführt wird.
EventMonitor ist auch immer ein guter Kanditat um das regexp zu kontrollieren.

Grüße
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: Dietmar63 am 13 April 2014, 10:55:03
Du solltest die Dummy /Geräte mit Value () abfragen. Wenn so etwas nicht läuft hilft die Funktion Log(). Ich würde eine solche Prozedur nach 99_Utils auslagern
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: Jojo11 am 13 April 2014, 10:56:52
Zitat von: stefanm am 13 April 2014, 10:46:47
...

...
             fehm "define a10 at *23:05:00 set Kreis_Trafo on-for-timer 3600";;\
...


Kann mir bitte jemand einen Tip geben was ich Falsch mache ? Ich komm nicht drauf.

Gruss Stefan

Hallo,

es heißt in jedem Fall schonmal "fhem" und nicht "fehm"  ::)

schöne Grüße
Jo
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: stefanm am 13 April 2014, 21:39:20
Hallo und erst mal danke für die Tips,


klar heisst fhem :)

Value() hab ich eingebaut, möchte jetzt noch die Log() Funktion nutzen aber finde nichts ?

Wenn ich Value() richtig verstanden habe sollte es jetzt so gehen ?


define Bewesserungs_Steuerung notify Bewaesserung_Active {\
   if ( Value("Garten.Wand") eq "off"){\
      if ( Value("Bewaesserung_Active") eq "Auto") {\
             fhem ("define a10 at *23:00:00 set Kreis_Trafo on-for-timer 3600");;\
             fhem (" define a11 at *23:00:00 set Kreis_Rechts on-for-timer 1800");;\
             fhem ("define a13 at *23:30:00 set Kreis_Links on-for-timer 1800");;\
      if ( Value("Bewaesserung_Active") eq "On") {\
             fhem ("set Kreis_Trafo on-for-timer 3600");;\
             fhem ("set Kreis_Rechts on-for-timer 1800");;\
     my $BStunde = sprintf("%%02d", $hour);;\
             my $BMinute = sprintf("%%02d", $min);;\
             if ($BMinute>=30)($EBStunde=$BStunde+1 $EBMinute=$BMinute-30);;\
             if ($BMinute<30)($EBStunde=$BStunde+1 $EBMinute=$BMinute+30);;\
             my $BStart = $EBStunde + $EBMinute;;\
             fhem ("define a10 at *$BStart set Kreis_Links on-for-timer 1800") }\
      if ( Value("Bewaesserung_Active") eq "Off") {\
            fhem ("set Kreis.* off")}\
      if ( Value("Bewaesserung_Active") eq "Urlaub") {\
             fhem ("define a10 at *23:00:00 set Kreis_Trafo on-for-timer 5400");;\
             fhem ("define a11 at *23:00:00 set Kreis_Rechts on-for-timer 1800");;\
             fhem ("define a13 at *23:30:00 set Kreis_Links on-for-timer 1800");;\
             fhem ("define a13 at *23:59:00 set Kreis_Urlaub on-for-timer 1800") };;\
};;\
}


Werde es gleich erst mal testen :)

Gruss Stefan
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: Dietmar63 am 13 April 2014, 22:00:23
 Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");
soviele wie möglich einfügen.
Dann mit
trigger Bewaesserung_Active  Auto
prüfen ob dein notifyCode funktioniert.

Dann prüfen, ob dein notify regExp feuert.

der folgende Code scheint mir noch nicht korrekt zu sein.

        if ($BMinute>=30)($EBStunde=$BStunde+1 $EBMinute=$BMinute-30);;\
             if ($BMinute<30)($EBStunde=$BStunde+1 $EBMinute=$BMinute+30);;\
             my $BStart = $EBStunde + $EBMinute;;\
             fhem ("define a10 at *$BStart set Kreis_Links on-for-timer 1800") }\


Es fehlt auf jeden Fall ein ";"
Und $BStart musst du mit sprintf etwa so aufbauen:
my $timeToStop_st =  sprintf ("%02d:%02d:%2d", $h,$m,$s );


Tipp:
Du solltest diesen Code in eine Funktion Bewaesserung() nach 99_Utils auslagern. Dann wirst du
viele Fehler sofort finden, weil den Code besser syntaktisch geprüft wird. Der Code in notifys ist erst einmal nur Text. Er wird zur Laufzeit dem Perlsystem übergeben und ausgeführt, aber leider findet keine strenge Syntaxprüfung statt, was aber in der 99_Utils der Fall wäre.

Außerdem müllst du die fhem.cfg nicht so voll, weil nur so viel übrig bleibt:
define Bewesserungs_Steuerung notify Bewaesserung_Active { Bewaesserung() }


Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: stefanm am 13 April 2014, 22:51:02
Danke hab ich nicht gesehen. Ich hab mal die Änderungen gemacht


define Bewesserungs_Steuerung notify Bewaesserung_Active {\
   Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");;\
   if ( Value("Garten.Wand") eq "off"){\
      Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");;\
      if ( Value("Bewaesserung_Active") eq "Auto") {\
             Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");;\
             fhem ("define a10 at *23:00:00 set Kreis_Trafo on-for-timer 3600");;\
             fhem (" define a11 at *23:00:00 set Kreis_Rechts on-for-timer 1800");;\
             fhem ("define a13 at *23:30:00 set Kreis_Links on-for-timer 1800");;\
      if ( Value("Bewaesserung_Active") eq "On") {\
     Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");;\
             fhem ("set Kreis_Trafo on-for-timer 3600");;\
             fhem ("set Kreis_Rechts on-for-timer 1800");;\
     my $BStunde = sprintf("%%02d", $hour);;\
             my $BMinute = sprintf("%%02d", $min);;\
             my $Bs = sprinf(%%023", $sec);;\
             if ($BMinute>=30)($EBStunde=$BStunde+1, $EBMinute=$BMinute-30);;\
             if ($BMinute<30)($EBStunde=$BStunde+1, $EBMinute=$BMinute+30);;\
             my $BStart = sprintf sprintf ("%02d:%02d:%2d", $EBStunde,$EBStunde,$s );;\
             fhem ("define a10 at *$BStart set Kreis_Links on-for-timer 1800") }\
      if ( Value("Bewaesserung_Active") eq "Off") {\
            Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");;\
            fhem ("set Kreis.* off")}\
      if ( Value("Bewaesserung_Active") eq "Urlaub") {\
             Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");;\
             fhem ("define a10 at *23:00:00 set Kreis_Trafo on-for-timer 5400");;\
             fhem ("define a11 at *23:00:00 set Kreis_Rechts on-for-timer 1800");;\
             fhem ("define a13 at *23:30:00 set Kreis_Links on-for-timer 1800");;\
             fhem ("define a13 at *23:59:00 set Kreis_Urlaub on-for-timer 1800") };;\
};;\
}


Anscheinend funktioniert der notifyCode nicht, den nach dem Trigger Kommando kommt im Log nur :

2014.04.13 22:30:00 3: Bewesserungs_Steuerung return value: Can't find string terminator '"' anywhere before EOF at (eval 44) line 29.

2014.04.13 22:30:02 3: Bewesserungs_Steuerung return value: Can't find string terminator '"' anywhere before EOF at (eval 45) line 29.

2014.04.13 22:30:03 3: Bewesserungs_Steuerung return value: Can't find string terminator '"' anywhere before EOF at (eval 46) line 29.

2014.04.13 22:30:05 3: Bewesserungs_Steuerung return value: Can't find string terminator '"' anywhere before EOF at (eval 47) line 29.

2014.04.13 22:30:07 3: Bewesserungs_Steuerung return value: Can't find string terminator '"' anywhere before EOF at (eval 48) line 29.

????
Hier mal noch der dummy, der das alles auslösen soll :


define Bewaesserung_Active dummy
attr Bewaesserung_Active room Bewässerung
attr Bewaesserung_Active setList Auto On Off Urlaub
attr Bewaesserung_Active webCmd Auto:On:Off:Urlaub




Ich sollte mir mal Perl für Dummy's holen :(
mein dummy ändert den status durch den trigger auch nicht ?

Stefan
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: Dietmar63 am 13 April 2014, 23:14:47
Ein dummy ändert den Status durch einen trigger auch nicht.

was soll deiner Meinung nach in diesen Variablen stehen. teilweise fehlen die my:
ZitatVariable "$sec" is not imported at d:\ACPI\dst2.pl line 29.
   (Did you mean &sec instead?)
Global symbol "$hour" requires explicit package name at d:\ACPI\dst2.pl line 27.
Global symbol "$min" requires explicit package name at d:\ACPI\dst2.pl line 28.
Global symbol "$sec" requires explicit package name at d:\ACPI\dst2.pl line 29.
Global symbol "$EBStunde" requires explicit package name at d:\ACPI\dst2.pl line 30.
Global symbol "$EBMinute" requires explicit package name at d:\ACPI\dst2.pl line 30.
Global symbol "$EBStunde" requires explicit package name at d:\ACPI\dst2.pl line 31.
Global symbol "$EBMinute" requires explicit package name at d:\ACPI\dst2.pl line 31.
Global symbol "$EBStunde" requires explicit package name at d:\ACPI\dst2.pl line 32.
Global symbol "$EBStunde" requires explicit package name at d:\ACPI\dst2.pl line 32.
Global symbol "$s" requires explicit package name at d:\ACPI\dst2.pl line 32.

und nicht immer das gleiche loggen:
Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");
immer das loggen, was an der jeweiligen Stelle interessant ist, und dir helfen kann Fehler aufzuspüren.

ZitatIch sollte mir mal Perl für Dummy's holen
kann nicht schaden
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: Dietmar63 am 13 April 2014, 23:22:56
ich verstehe übrigens nicht was du hiermit erreichen willst.


      my $BStunde = sprintf("%02d", $hour);
                my $BMinute = sprintf("%02d", $min);
                my $Bs      = sprintf("%02d", $sec);
                if ($BMinute>=30){$EBStunde=$BStunde+1; $EBMinute=$BMinute-30};
                if ($BMinute<30) {$EBStunde=$BStunde+1; $EBMinute=$BMinute+30};
                my $BStart = sprintf ("%02d:%02d:%2d", $EBStunde,$EBStunde,$s );

Weiterhin, diese Zeile
  if ($BMinute>=30){$EBStunde=$BStunde+1; $EBMinute=$BMinute-30};
beinflußt die darauf folgende
w
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: Wichtel am 14 April 2014, 01:08:07
Nochmal zum Anfangsproblem, immerhin war es der (aus Anwendersicht) kürzeste Code und hat sogar noch funktioniert:
Zitat von: stefanm am 11 April 2014, 23:06:48
Wenn ich die einzelnen Code Zeilen aufteile erhalte ich : IF: no right bracket

IF ([Bewaesserung_Active] eq "Auto")
   (define a10 at §Startzeit_Bewaesserung set Kreis_Trafo on-for-timer 3600,
    define a11 at §Startzeit_Bewaesserung set Kreis_Rechts on-for-timer 1800,
    define a13 at (§Startzeit_Bewaesserung + 00:30:00) set Kreis_Links on-for-timer 1800)

Probiere mal, vor jedem von dir eingefügten Zeilenumbruch einen Backslash zu schreiben.
So wie es in deinen zuletzt zitierten Codes ebenfalls passiert, also:

IF ([Bewaesserung_Active] eq "Auto")
   (define a10 at §Startzeit_Bewaesserung set Kreis_Trafo on-for-timer 3600, \
    define a11 at §Startzeit_Bewaesserung set Kreis_Rechts on-for-timer 1800, \
    define a13 at (§Startzeit_Bewaesserung + 00:30:00) set Kreis_Links on-for-timer 1800)
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: Puschel74 am 14 April 2014, 06:31:01
Hallo,

das hier
Zitat2014.04.13 22:30:00 3: Bewesserungs_Steuerung return value: Can't find string terminator '"' anywhere before EOF at (eval 44) line 29.
sollte sich durch das lösen lassen:
Die fhem.cfg würde ich persönlich sowieso nie direkt bearbeiten sondern nur per Befehlszeile bzw. das jeweilige DEF.
Aber jedem das seine - und damit auch das Verständniss was maskiert werden muss und wie.

Allerdings, wie Dietmar63 schon erwähnt hat, würde sowas besser in eine 99_dasistmeins.pm gehören.

Grüße
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: stefanm am 14 April 2014, 22:58:53
Ja danke für die Tips.

Ich hab jetzt eine 99_Bewaesserung_Utils.pm angelegt :
Ihr habt natürlich recht, ist viel übersichtlicher und das debugging wesentlich einfacher.


##############################################
# $Id: 99_myUtils.pm 3595 2013-08-05 05:38:48Z tobiasfaust $
package main;

use strict;
use warnings;
use POSIX;

sub Bewaesserung_Utils_Initialize($$)
{
  my ($hash) = @_;

}
######################################################
# Temperatur-Liste für die Praxis
# setzen per Aufruf von "{SetTempList_EG_WZ_Heizung}"
######################################################
sub Bewaesserung($$)
{
my $Startzeit_Bewaesserung=qw( 23:30 0:01 );
my $Startzeit_Bewaesserung2 = $Startzeit_Bewaesserung + qw(00:30);
my ($Bewaesserung_Active, $Garten_Licht, ) = @_;
      if ($Bewaesserung_Active eq "Auto" & $Garten_Licht eq "Off") {
             {fhem ("define a10 at ".$Startzeit_Bewaesserung." set Kreis_Trafo on-for-timer 3600")}
             {fhem ("define a11 at ".$Startzeit_Bewaesserung." set Kreis_Rechts on-for-timer 1800")}
             {fhem ("define a13 at ".$Startzeit_Bewaesserung2." set Kreis_Links on-for-timer 1800")}
   }
      if ($Bewaesserung_Active eq "On") {
             Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");
             {fhem ("set Kreis_Trafo on-for-timer 3600")}
             {fhem ("set Kreis_Rechts on-for-timer 1800")}
             my ($Sekunden, $Minuten, $Stunden) = localtime(time);
             $Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten;
             my $Minuten+=30;
             if ($Minuten <= 30) { my $Stunden+=1};
             {fhem ("define a10 at *".$Stunden.":".$Minuten." set Kreis_Links on-for-timer 1800")}
   }
       if ($Bewaesserung_Active eq "Off") {
             Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");
             {fhem ("set Kreis.* off")}
   }

       if ($Bewaesserung_Active eq "Urlaub" & $Garten_Licht eq "Off") {
              Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");
              {fhem ("define a10 at *23:00:00 set Kreis_Trafo on-for-timer 5400")};
              {fhem ("define a11 at *23:00:00 set Kreis_Rechts on-for-timer 1800")};
              {fhem ("define a13 at *23:30:00 set Kreis_Links on-for-timer 1800")};
              {fhem ("define a13 at *23:59:00 set Kreis_Urlaub on-for-timer 1800")};
   }


}
1;


War ein hartes Stück Arbeit
Ich musste mich erstmal teilweise in Perl einlesen :) Bin schließlich über 50 ;)

Ausgelöst werden soll das durch diesen dummy:


define Bewaesserung_Active dummy
attr Bewaesserung_Active room Bewässerung
attr Bewaesserung_Active setList Auto On Off Urlaub
attr Bewaesserung_Active webCmd Auto:On:Off:Urlaub


und mit diesem Notify ausgführt werden :


define Bewaesserungs_Steuerung notify Bewaesserung_Active {Bewaesserung (value("Bewaesserung_Active"), value("Garten.Wand"))}, Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active")



Aber ich kann das weder über Trigger noch über den dummy aansprechen.

muss ich morgen mal weiter Forschen.

Stefan
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: Damian am 15 April 2014, 11:22:00
Zitat von: Wichtel am 14 April 2014, 01:08:07
Nochmal zum Anfangsproblem, immerhin war es der (aus Anwendersicht) kürzeste Code und hat sogar noch funktioniert:Probiere mal, vor jedem von dir eingefügten Zeilenumbruch einen Backslash zu schreiben.
So wie es in deinen zuletzt zitierten Codes ebenfalls passiert, also:

IF ([Bewaesserung_Active] eq "Auto")
   (define a10 at §Startzeit_Bewaesserung set Kreis_Trafo on-for-timer 3600, \
    define a11 at §Startzeit_Bewaesserung set Kreis_Rechts on-for-timer 1800, \
    define a13 at (§Startzeit_Bewaesserung + 00:30:00) set Kreis_Links on-for-timer 1800)

In der ersten Zeile fehlt auch noch ein Backslash: IF ([Bewaesserung_Active] eq "Auto") \

Es hätte auch ohne Backslashes funktioniert, wenn man die Commandref zu IF richtig gelesen hätte. Dort steht:

"Geschachtelte Angabe von zwei IF-Befehlen (kann in mehreren Zeilen mit Einrückungen zwecks übersichtlicher Darstellung in der DEF-Eingabe eingegeben werden)"

Die cfg-Datei sollte man nur editieren, wenn man die Bedeutung der Sonderzeichen kennt, ansonsten ist es sinnvoller, nicht nur als Anfänger, alles über die FHEM-Weboberfläche zu machen.

Gruß

Damian

Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: stefanm am 15 April 2014, 17:04:06
Dank eurer Hilfe fange ich ganz langsam an Perl zu Verstehen ;)
und damit es Übersichtlicher wird habe ich eine 99_Bewaesserung_Utils.pm angelegt und überarbeitet.
Dazu hab ich dann Testweise die Code Schnipsel in ein klein Perl Script gepackt und laufen lassen



package main;

use strict;
use warnings;
use POSIX;

sub
Bewaesserung_Utils_Initialize($$)
{
  my ($hash) = @_;

}

sub
Bewaesserung($$)
{
my $Startzeit_Bewaesserung_rechts="23:00";
my $Startzeit_Bewaesserung_links="23:30";
my ($Bewaesserung_Active, $Garten_Licht, ) = @_;
      if ($Bewaesserung_Active eq "Auto" & $Garten_Licht eq "Off") {
             {fhem ("define a10 at ".$Startzeit_Bewaesserung_rechts." set Kreis_Trafo on-for-timer 3600")}
             {fhem ("define a11 at ".$Startzeit_Bewaesserung_rechts." set Kreis_Rechts on-for-timer 1800")}
             {fhem ("define a13 at ".$Startzeit_Bewaesserung_links." set Kreis_Links on-for-timer 1800")}
   }
      if ($Bewaesserung_Active eq "On") {
             Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");
             {fhem ("set Kreis_Trafo on-for-timer 3600")}
             {fhem ("set Kreis_Rechts on-for-timer 1800")}
my ($Sekunden, $Minuten, $Stunden) = localtime(time);
             $Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten;
             $Minuten+=30;
             if ($Minuten > 59) { $Stunden+=1 ; $Minuten-=30 };
             {fhem ("define a10 at *".$Stunden.":".$Minuten." set Kreis_Links on-for-timer 1800")}
   }
       if ($Bewaesserung_Active eq "Off") {;
             Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");
             {fhem ("set Kreis.* off")}
   }
       if ($Bewaesserung_Active eq "Urlaub" & $Garten_Licht eq "Off") {;
              Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");
              {fhem ("define a10 at *23:00:00 set Kreis_Trafo on-for-timer 5400")};
              {fhem ("define a11 at *23:00:00 set Kreis_Rechts on-for-timer 1800")};
              {fhem ("define a13 at *23:30:00 set Kreis_Links on-for-timer 1800")};
              {fhem ("define a13 at *23:59:00 set Kreis_Urlaub on-for-timer 1800")};
   }
}
1;





Der notify Aufruf dazu sieht wie folgt aus:


define Bewaesserungs_Steuerung notify Bewaesserung_Active {Bewaesserung(Value("Bewaesserung_Active"), Value("Garten.Wand"))}


UND ES GEHT.


ich Danke euch. Wieder was gelernt, jedenfalls hier ohne Hardware, werd ich zuhause gleich mal testen.

Gruss Stefan
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: stefanm am 29 April 2014, 20:31:26
Geht leider doch nicht  :(

define Bewaesserungs_Steuerung notify Bewaesserung_Active {Bewaesserung(Value("Bewaesserung_Active"), Value("Garten.Wand"))}

Übergigt zwar den Status von "Bewaesserung_Active" aber nicht den Status von "Garten.Wand"


Habt Ihr nochmal einen Tip was ich falsch mache ?

Im Log steht :
Bewaesserung_Utils_Initialize logfile Bewaesserung : Off
Bewaesserung_Utils_Initialize logfile Licht :



Egal ob ich readingGroup anstatt Value verwende, ich erhalte im 99_Bewaesserung_Utils.pm nicht den Status von Garzen.Wand.

Guss Stefan

Zitat von: stefanm am 15 April 2014, 17:04:06
Dank eurer Hilfe fange ich ganz langsam an Perl zu Verstehen ;)
und damit es Übersichtlicher wird habe ich eine 99_Bewaesserung_Utils.pm angelegt und überarbeitet.
Dazu hab ich dann Testweise die Code Schnipsel in ein klein Perl Script gepackt und laufen lassen



package main;

use strict;
use warnings;
use POSIX;

sub
Bewaesserung_Utils_Initialize($$)
{
  my ($hash) = @_;

}

sub
Bewaesserung($$)
{
my $Startzeit_Bewaesserung_rechts="23:00";
my $Startzeit_Bewaesserung_links="23:30";
my ($Bewaesserung_Active, $Garten_Licht, ) = @_;
      if ($Bewaesserung_Active eq "Auto" & $Garten_Licht eq "Off") {
             {fhem ("define a10 at ".$Startzeit_Bewaesserung_rechts." set Kreis_Trafo on-for-timer 3600")}
             {fhem ("define a11 at ".$Startzeit_Bewaesserung_rechts." set Kreis_Rechts on-for-timer 1800")}
             {fhem ("define a13 at ".$Startzeit_Bewaesserung_links." set Kreis_Links on-for-timer 1800")}
   }
      if ($Bewaesserung_Active eq "On") {
             Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");
             {fhem ("set Kreis_Trafo on-for-timer 3600")}
             {fhem ("set Kreis_Rechts on-for-timer 1800")}
my ($Sekunden, $Minuten, $Stunden) = localtime(time);
             $Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten;
             $Minuten+=30;
             if ($Minuten > 59) { $Stunden+=1 ; $Minuten-=30 };
             {fhem ("define a10 at *".$Stunden.":".$Minuten." set Kreis_Links on-for-timer 1800")}
   }
       if ($Bewaesserung_Active eq "Off") {;
             Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");
             {fhem ("set Kreis.* off")}
   }
       if ($Bewaesserung_Active eq "Urlaub" & $Garten_Licht eq "Off") {;
              Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");
              {fhem ("define a10 at *23:00:00 set Kreis_Trafo on-for-timer 5400")};
              {fhem ("define a11 at *23:00:00 set Kreis_Rechts on-for-timer 1800")};
              {fhem ("define a13 at *23:30:00 set Kreis_Links on-for-timer 1800")};
              {fhem ("define a13 at *23:59:00 set Kreis_Urlaub on-for-timer 1800")};
   }
}
1;





Der notify Aufruf dazu sieht wie folgt aus:


define Bewaesserungs_Steuerung notify Bewaesserung_Active {Bewaesserung(Value("Bewaesserung_Active"), Value("Garten.Wand"))}


UND ES GEHT.


ich Danke euch. Wieder was gelernt, jedenfalls hier ohne Hardware, werd ich zuhause gleich mal testen.

Gruss Stefan
Titel: Antw:IF "Ich raff die Syntax nicht" IF: no right bracket
Beitrag von: stefanm am 29 April 2014, 21:47:08
Habs alleine gefunden  :) :) :)

In dem Notify wird das Device nicht mehr übergeben sondern nur noch das Dummy


define Bewaesserungs_Steuerung notify Bewaesserung_Active {Bewaesserung (Value("Bewaesserung_Active")) }


Und das Device wird in 99_Bewaesserung_Utils.pm abgfragt


sub
Bewaesserung($)
{
my ($Bewaesserung_Active) = @_;
my $Startzeit_Bewaesserung_rechts="23:00:00";
my $Startzeit_Bewaesserung_links="23:30:00";
Log 3, "Bewaesserung_Utils_Initialize logfile Bewaesserung : ". Value("Bewaesserung_Active");
Log 3, "Bewaesserung_Utils_Initialize logfile Licht : ". Value("Garten.Wand");
      if ($Bewaesserung_Active eq "Auto") {
               if (Value("Garten.Wand") eq "off") {
              Log 3, "Bewaesserung_Active If Auto->". Value("Bewaesserung_Active");
             fhem ("delete a10");
             fhem ("delete a11");
             fhem ("delete a12");
             fhem ("delete a13");
             fhem ("delete a14");
             Log 3, "Bewaesserung_Active-> Eintraege gelöscht";
             fhem ("define a10 at *23:00:00 set Kreis_Trafo on-for-timer 3600");
             fhem ("define a11 at *23:00:00 set Kreis_Rechts on-for-timer 1800");
             fhem ("define a13 at *23:30:00 set Kreis_Links on-for-timer 1800");
             fhem ("define a14 at *00:20 set Kreis.* off");
             Log 3, "Bewaesserung_Active-> Eintraege geschrieben". Value("Startzeit_Bewaesserung_links");
   }
}
      if ($Bewaesserung_Active eq "On") {
              Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");
             {fhem ("delete a10")};
             {fhem ("delete a11")};
             {fhem ("delete a12")};
             {fhem ("delete a13")};
             {fhem ("delete a14")};
             {fhem ("set Kreis_Trafo on-for-timer 3600")};
             {fhem ("set Kreis_Rechts on-for-timer 1800")};
             my ($Sekunden, $Minuten, $Stunden) = localtime(time);
             $Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten;
             $Minuten+=30;
             if ($Minuten > 59) { $Stunden+=1 ; $Minuten-=30 };
             my $SB=("$Stunden:$Minuten");
             {fhem ("define a10 at *".$SB." set Kreis_Links on-for-timer 1800")};
             $Stunden+=1;
             my $SB=("$Stunden:$Minuten");
             {fhem ("define a14 at *".$SB." set Kreis.* off")};         
             {fhem ("set  Bewaesserung_Active off")};       
   }
       if ($Bewaesserung_Active eq "Off") {
              Log 3, "Bewaesserung_Active->". Value("Bewaesserung_Active");
             {fhem ("delete a10")};
             {fhem ("delete a11")};
             {fhem ("delete a12")};
             {fhem ("delete a13")};
             {fhem ("delete a14")};
             {fhem ("set Kreis.* off")};
   }
       if ($Bewaesserung_Active eq "Urlaub") {
              Log 3, "Bewaesserung_Active-urlaub->". Value("Bewaesserung_Active");
             {fhem ("delete a10")};
             {fhem ("delete a11")};
             {fhem ("delete a12")};
             {fhem ("delete a13")};
             {fhem ("delete a14")};
              {fhem ("define a10 at *23:00:00 set Kreis_Trafo on-for-timer 5400")};
              {fhem ("define a11 at *23:00:00 set Kreis_Rechts on-for-timer 1800")};
              {fhem ("define a13 at *23:30:00 set Kreis_Links on-for-timer 1800")};
              {fhem ("define a12 at *23:59:00 set Kreis_Urlaub on-for-timer 1800")};
              {fhem ("define a14 at *00:10:00 set Kreis.* off")};
   }
}
1;