[gelöst] Bareword found where operator expected

Begonnen von arthur_dent_2015, 30 Juni 2018, 23:45:06

Vorheriges Thema - Nächstes Thema

arthur_dent_2015

Was ist hier falsch?
Ich habe paar Sekunden die folgenden Meldungen im Log:

2018.06.30 23:29:24 1: PERL WARNING: Bareword found where operator expected at (eval 163604) line 1, near ") DOELSEIF"
2018.06.30 23:29:24 3: eval: Sonnenschutz: warning in condition c01

Das zugehörige device sieht wie folgt aus:

Internals:
   CFGFN     
   DEF        (([Lichtsensor:brightness] > 60000 and ([$SELF:average_out] > 25 or [$SELF:average_in] > 25) and ([Roll2:state] ne "go-my" and [11:00-([Astro:SunSet]-[01:00])])) (trigger Rollladen_ntfy) DOELSEIF (([Lichtsensor:brightness] < 60000 or [$SELF:average_out] < 25 or [([Astro:SunSet]-[01:00])])) and ([Roll2:state] eq "go-my")) (set Roll1 off,set Roll2 off,set Roll1_old_State up) DOELSE ()
   MODEL      FHEM
   NAME       Sonnenschutz
   NR         588
   NTFY_ORDER 50-Sonnenschutz
   STATE      initialized
   TYPE       DOIF
   DOIF_Readings:
     average_in {(ReadingValDoIf($hash,'Thermo_Wz','temperature')+ReadingValDoIf($hash,'HM_Sensor2','temperature'))/2}

     average_out {(ReadingValDoIf($hash,'Thermo_Sz_aussen','temperature')+ReadingValDoIf($hash,'Thermo_Balkon','temperature'))/2}
   Helper:
     DBLOG:
       average_out:
         fhemlogDB:
           TIME       1530388308.52676
           VALUE      21.8
       cmd:
         fhemlogDB:
           TIME       1530388308.52676
           VALUE      0
       cmd_event:
         fhemlogDB:
           TIME       1530387499.27783
           VALUE      Sonnenschutz
       cmd_nr:
         fhemlogDB:
           TIME       1530387499.27783
           VALUE      3
       mode:
         fhemlogDB:
           TIME       1530388308.52676
           VALUE      enabled
       state:
         fhemlogDB:
           TIME       1530388308.52676
           VALUE      initialized
       wait_timer:
         fhemlogDB:
           TIME       1530387444.81138
           VALUE      no timer
   READINGS:
     2018-06-30 23:40:34   Device          Sonnenschutz
     2018-06-30 23:39:31   average_in      24.6
     2018-06-30 23:40:34   average_out     19.35
     2018-06-30 21:51:47   cmd             0
     2018-06-30 23:08:12   e_Lichtsensor_brightness 0
     2018-06-30 23:00:59   e_Roll2_state   closed
     2018-06-30 23:39:31   e_Sonnenschutz_average_in 24.6
     2018-06-30 23:40:34   e_Sonnenschutz_average_out 19.35
     2018-06-30 23:40:34   error           condition c01: syntax error, ("

     2018-06-30 21:51:47   mode            enabled
     2018-06-30 21:51:47   state           initialized
     2018-06-30 21:51:48   timer_01_c01    01.07.2018 11:00:00
     2018-06-30 23:02:10   timer_02_c01    01.07.2018 20:46:00
     2018-06-30 23:02:10   timer_03_c01    01.07.2018 20:46:00
     2018-06-30 23:40:34   warning         condition c01: (Missing operator before DOELSEIF?)

   Regex:
     DOIF_Readings:
       HM_Sensor2:
         average_in:
           temperature ^HM_Sensor2$:^temperature:
       Sonnenschutz:
       Thermo_Balkon:
         average_out:
           temperature ^Thermo_Balkon$:^temperature:
       Thermo_Sz_aussen:
         average_out:
           temperature ^Thermo_Sz_aussen$:^temperature:
       Thermo_Wz:
         average_in:
           temperature ^Thermo_Wz$:^temperature:
   attrtimer:
     wait:
       0:
         900
       1:
         900
     waitdel:
   condition:
     0          (ReadingValDoIf($hash,'Lichtsensor','brightness') > 60000 and (ReadingValDoIf($hash,'Sonnenschutz','average_out') > 25 or ReadingValDoIf($hash,'Sonnenschutz','average_in') > 25) and (ReadingValDoIf($hash,'Roll2','state') ne "go-my" and DOIF_time($hash,0,1,$wday,$hms))) (trigger Rollladen_ntfy) DOELSEIF ((ReadingValDoIf($hash,'Lichtsensor','brightness') < 60000 or ReadingValDoIf($hash,'Sonnenschutz','average_out') < 25 or DOIF_time_once($hash,2,$wday))) and (ReadingValDoIf($hash,'Roll2','state') eq "go-my")
   days:
   devices:
     0           Lichtsensor Sonnenschutz Roll2
     all         Lichtsensor Sonnenschutz Roll2
   do:
     0:
       0          set Roll1 off,set Roll2 off,set Roll1_old_State up
     1:
       0         
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      average_out: 19.35
     globalinit 1
     last_timer 3
     sleeptimer -1
     triggerDev Sonnenschutz
     bm:
       DOIF_Get:
         cnt        2
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        30.06. 22:26:53
         max        4.50611114501953e-05
         tot        7.12871551513672e-05
         mAr:
           HASH(0x64fabc8)
           Sonnenschutz
           ?
       DOIF_Notify:
         cnt        12173
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        30.06. 22:02:10
         max        0.0162339210510254
         tot        2.33735203742981
         mAr:
           HASH(0x64fabc8)
           HASH(0x67af578)
       DOIF_Set:
         cnt        9
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        30.06. 22:26:53
         max        0.000200033187866211
         tot        0.00095677375793457
         mAr:
           HASH(0x64fabc8)
           Sonnenschutz
           ?
     triggerEvents:
       average_out: 19.35
       e_Sonnenschutz_average_out: 19.35
     triggerEventsState:
       average_out: 19.35
   internals:
   interval:
     0          -1
     1          0
   intervalfunc:
   intervaltimer:
   itimer:
     all         Astro
   localtime:
     0          1530435600
     1          1530470760
     2          1530470760
   readings:
     0           Lichtsensor:brightness Sonnenschutz:average_out Sonnenschutz:average_in Roll2:state
     all         Lichtsensor:brightness Sonnenschutz:average_out Sonnenschutz:average_in Roll2:state
   realtime:
     0          11:00:00
     1          20:46:00
     2          20:46:00
   time:
     0          11:00:00
     1          ([Astro:SunSet]-[01:00])
     2          ([Astro:SunSet]-[01:00])
   timeCond:
     0          0
     1          0
     2          0
   timer:
     0          0
     1          0
     2          0
   timers:
     0           0  1  2
   trigger:
   triggertime:
     1530435600:
       localtime  1530435600
       hash:
     1530470760:
       localtime  1530470760
       hash:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings average_out:{([Thermo_Sz_aussen:temperature]+[Thermo_Balkon:temperature])/2},average_in:{([Thermo_Wz:temperature]+[HM_Sensor2:temperature])/2}

   room       Somfy
   verbose    5
   wait       900:900

jemand ne Idee?

Gruß
Arthur

Frank_Huber

#1
Ist am Handy schwer zu lesen,
Ich würde aber auf einen Klammer Fehler tippen.
Ist ja schon recht "wild" geklammert.

Was auch auffällt ist dein Befehl für cmd1
Trigger devicename
Fehlt da nicht was?
Ich triggere gpio so: trigger gpio on

Gesendet von meinem Doogee S60 mit Tapatalk

arthur_dent_2015

Klammerfehler werden ja nicht angemeckert, ist halt ein etwas kompliziertes Gebilde aus and/or Bedingungen die geklammert werden müssen. Ist vielleicht auch die eine oder andere übeflüssige Klammer.
Der trigger auf das notify funktioniert auch ohne on/off oder so.

Internals:
   CFGFN     
   DEF        Rollladen_ntfy IF ([HM_Tuerkontakt_Balkon:state] eq "closed") (set Roll1 go-my,sleep 40,set Roll1_old_State go-my,set Roll2 go-my) ELSE (set Roll2 go-my,set Roll1_old_State go-my)
   NAME       Rollladen_ntfy
   NOTIFYDEV  Rollladen_ntfy
   NR         589
   NTFY_ORDER 50-Rollladen_ntfy
   REGEXP     Rollladen_ntfy
   STATE      2018-06-30 17:44:06
   TYPE       notify
   Helper:
     DBLOG:
       state:
         fhemlogDB:
           TIME       1530373447.10215
           VALUE     
   READINGS:
     2018-06-30 04:01:07   state           active
   helper:
     bm:
       notify_Exec:
         cnt        2
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        30.06. 17:44:07
         max        0.241856098175049
         tot        0.431074142456055
         mAr:
           HASH(0x650ba68)
           HASH(0x650ba68)
       notify_Set:
         cnt        7
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        01.07. 00:22:23
         max        0.000161170959472656
         tot        0.000737667083740234
         mAr:
           HASH(0x650ba68)
           Rollladen_ntfy
           ?
Attributes:

Gruß
Arthur

Otto123

#3
Aber Klammerfehler sieht man in jedem Editor!!!  :-X Ich habe es jetzt einfach mit notepad++ gemacht.
So sollten die Klammern wenigstens vorne und hinten stimmen.
Der Inhalt der DEF:
([Lichtsensor:brightness] > 60000 and ([$SELF:average_out] > 25 or [$SELF:average_in] > 25) and ([Roll2:state] ne "go-my" and [11:00-([Astro:SunSet]-[01:00])])) (trigger Rollladen_ntfy) DOELSEIF (([Lichtsensor:brightness] < 60000 or [$SELF:average_out] < 25 or [([Astro:SunSet]-[01:00])]) and [Roll2:state] eq "go-my") (set Roll1 off,set Roll2 off,set Roll1_old_State up) DOELSE ()

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

arthur_dent_2015

Moin Otto,
gute Idee, ich sehe mir das nachher mal im kwrite an, bin zur Zeit mit Windoof unterwegs :(
Guts Nächtle
Arthur

Otto123

Moin Arthur,
attr WEB JavaScripts codemirror/fhem_codemirror.js
Und der integrierte DEF Editor von FHEM hat Syntax Hervorhebung und Klammer Check!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

arthur_dent_2015

Hallo Otto,
Danke, wieder was gelernt  :)
Die Meldungen sind jetzt auch weg  8)
Gruß
Arthur

Otto123

Hallo Arthur,

ich glaube der interne Syntaxcheck macht eine Prüfung von links nach rechts, er kontrolliert nicht als Erstes ob die Klammern paarig sind.

Dabei kommt er an die erste Stelle die nicht mehr logisch ist, weil eventuell vorher eine Klammer hätte kommen "müssen" damit das nach der Klammer richtig ist.
Im Umkehrschluss: Die Fehlermeldung wird wohl nie auf eine Klammer hindeuten, sondern immer auf das was nach der fehlenden Klammer kommt und dann an der Stelle nicht mehr geht. Vorausgesetzt die einzelnen Befehle und Variablen stimmig.
Deswegen immer zuerst die Klammern prüfen.

Und man darf im Code auch Zeilenumbrüche im internen Editor machen, da wird es besser lesbar.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

arthur_dent_2015

Hallo Otto,
ich frage mich warum man die Syntaxprüfung explizit einschalten muss wenn sie serienmäßig an Bord ist...  :o Ich habe mir immer mit kwrite beholfen um wenigstens die Klammern paarig zu bekommen, nur gestern nicht  >:(
Noch mal Danke für Deinen Hinweis darauf!
Gruß
Arthur