FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Master_Nick am 19 Juni 2020, 16:23:23

Titel: [gelöst] Es sagt "right bracket without left bracket" ich finde es mit notepad++
Beitrag von: Master_Nick am 19 Juni 2020, 16:23:23
Moin :-D
Ich glaub mein problem scheint was anderes zu sein als die Klammern... ggf wird eine Klammer nicht mehr gewertet weil irgendetwas falsch ist oder es ist echt die Klammer und selbst mittels Notepad++ habe ich dann hart versagt :-D

Das folgede CMD eines DOIFs ist bei mir tot (es ist das cmd3 in der Gesamten Sache - alle anderen gehen)

DOELSEIF ([Fernbedienung_Schlafzimmer_Deckenlicht:up_click] eq "true")
{if (([Schlafzimmer_Deckenlicht:bri] + 10) > 100) (set Schlafzimmer_Deckenlicht bri 100) elsif (([Schlafzimmer_Deckenlicht:bri] + 10) < 100) {(set Schlafzimmer_Deckenlicht bri [Schlafzimmer_Deckenlicht:bri] + 10)}}


Ich bin echt gespannt was ich verbockt habe :-D
Ich hatte es einmal auch schon richtung Perl gezogen mit le statt <.....

Ziel ist bri soll bis 100 hoch gehen in 10er Schritten aber dann bei 100 limitiert sein.
Das gleiche baue ich dann nochmal mit 0, dass es nicht unterhalb gehen kann.
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: MadMax-FHEM am 19 Juni 2020, 16:27:23
Ich stecke ja in DOIF nicht so ;)

Aber:

Zitat
else (([Schlafzimmer_Deckenlicht:bri] + 10) < 100)

ELSE ist OHNE Bedingung!

Wenn dann elsif ;)

EDIT: und hier
Zitat{(set Schlafzimmer_Deckenlicht bri [Schlafzimmer_Deckenlicht:bri] + 10)}
hast du { } um "die eine Ausführung" und die Ausführung zuvor
Zitat(set Schlafzimmer_Deckenlicht bri 100)
ohne { } / da es ja nach dem if nur ein "Befehl" ist, braucht man das verm. nicht bzw. evtl. ja durch die DOIF-runden-Klammern "gekapselt" (wie geschrieben: ich nix viel DOIF ;)  ) / ich mache das bei if/else generell, also: if(Bedingung){Ausführung} / selbst wenn es nur eine Ausführung/ein "Befehl" ist... ;)

Gruß, Joachim
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Master_Nick am 19 Juni 2020, 16:27:57
Das ist schon mal ein klarer sauberer Tip! :-D Danke! Hab das gefixed - Rest bleibt ;-) natürlich
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Christoph Morrison am 19 Juni 2020, 16:30:35
Zitat von: Master_Nick am 19 Juni 2020, 16:23:23
Ich bin echt gespannt was ich verbockt habe :-D

Eine ordentliche Formatierung (ja, in dem FHEMWEB-Editor ist das eher schwierig) hätte dir schon geholfen:


DOELSEIF
(
    [Fernbedienung_Schlafzimmer_Deckenlicht:up_click] eq "true"
)
{
    if ( ([Schlafzimmer_Deckenlicht:bri] + 10) > 100 )
        ( set Schlafzimmer_Deckenlicht bri 100 )
    else
        ( ([Schlafzimmer_Deckenlicht:bri] + 10) < 100 )
    {
        ( set Schlafzimmer_Deckenlicht bri [Schlafzimmer_Deckenlicht:bri] + 10 )
    }
}


Das ist eine recht bunte Mischung an Klammern / Bedingungen / Modi.
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Master_Nick am 19 Juni 2020, 16:35:48
Jau - lesbarer ist es so - ich hatte es mittels Notepad++ nageschaut - rein technisch mag ich es so kompatk weil es dann halbwegs lesbar im Webeditor bleibt.
Aber hier gewinnt man deutlich Übersicht hinzu. Werd ich beim nächsten mal besser machen.

Aber auch mit der gewonnenen Übersicht hab ich noch nicht den Fehler gefunden ;-/
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: betateilchen am 19 Juni 2020, 16:45:49
Von der Formatierung abgesehen, ist das Ansinnen unlogisch.

Zuerst prüfst Du, ob der Helligkeitswert + 10 größer als 100 ist.
Falls das nicht der Fall ist, prüfst Du (völlig unnötigerweise) nochmal, ob der Wert kleiner als 100 wäre.
Du wirst also den Wert 100 nie erreichen, weil 90 + 10 (Du machst ja 10er Schritte...) weder größer noch kleiner als 100 ist.

Die erste Prüfung solltest Du auf "größer gleich 100" ändern und im else Zweig einfach den Wert um 10 erhöhen.

Also irgendwie so:


DOELSEIF
(
    [Fernbedienung_Schlafzimmer_Deckenlicht:up_click] eq "true"
)
{
    if ( ([Schlafzimmer_Deckenlicht:bri] + 10) >= 100 )
        ( set Schlafzimmer_Deckenlicht bri 100 )
    else
        ( set Schlafzimmer_Deckenlicht bri [Schlafzimmer_Deckenlicht:bri] + 10 )
}


Das macht die ganze Sache sehr viel übersichtlicher, logischer und braucht viel weniger Klammern.

Zitat von: Master_Nick am 19 Juni 2020, 16:35:48
Aber auch mit der gewonnenen Übersicht hab ich noch nicht den Fehler gefunden ;-/

Vielleicht kommt der Fehler gar nicht aus dem Code-Abschnitt, den Du uns hier präsentierst.
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Christoph Morrison am 19 Juni 2020, 16:55:36
Wo soll ich anfangen?

- Was passiert wenn Schlafzimmer_Deckenlicht:bri genau 100 ist? Ok, es passiert was du hoffst, aber ich unterstelle mal dass das ein Zufall ist (du hättest größer-gleich gebraucht)
- Die Klammern um den zweiten Ausführungsteil (beim else) ist durch nichts logisch mit der Condition verbunden, die du ja bei else eigentlich gar nicht machen kannst
- Das kannst du auch als nativen DOIF-Code ohne Perl schreiben ...
- ... oder du entscheidest dich für den Perl-Modus, dann brauchst du aber ein bisschen mehr Lametta (Klammern z.B.) ;)
- Du machst die Berechnung ([Schlafzimmer_Deckenlicht:bri] + 10) mehrfach - das kannst du als ein DOIF_Reading / userReadings auf eine reduzieren.
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Master_Nick am 19 Juni 2020, 17:00:51
 :)

Ich möchte verhindern, dass der Dimmer über 100 hinaus geht und man dann beim runter dimmen erstmal von 340 auf 0 muss :-D

Daher wollte ich beim klick der Fernbedienung sagen: Prüfe was aktueller Wert +10 ergibt -> wenn über 100 setze 100 - bei 100 selber z. B. von 90 kommend wäre 100 ja legitim.
Das gleiche will ich bei 0 machen damit kein -220 raus kommen kann und man erst mal ein wenig klicken muss für heller :-D

Ich ging davon aus, dass ich es mit Perl machen muss - hatte keine Berechnung ohne gesehen... um so schöner wenn es mit DOIF-Code geht :-)!

Die anderen CMD funktionieren alle - daher hatte ich sie ausgelassen:

Hier aktuell mit dem Code von Betateilchen:

([Fernbedienung_Schlafzimmer_Deckenlicht:toggle] eq "true" and [Schlafzimmer_Deckenlicht:available] eq "true" and [Schlafzimmer_Deckenlicht] eq "on")
(set Schlafzimmer_Deckenlicht off)

DOELSEIF ([Fernbedienung_Schlafzimmer_Deckenlicht:toggle] eq "true" and [Schlafzimmer_Deckenlicht:available] and [Schlafzimmer_Deckenlicht] eq "off")
(set Schlafzimmer_Deckenlicht on)

DOELSEIF
(
    [Fernbedienung_Schlafzimmer_Deckenlicht:up_click] eq "true"
)
{
    if ( ([Schlafzimmer_Deckenlicht:bri] + 10) >= 100 )
        ( set Schlafzimmer_Deckenlicht bri 100 )
    elsif
        ( set Schlafzimmer_Deckenlicht bri [Schlafzimmer_Deckenlicht:bri] + 10 )
}


DOELSEIF ([Fernbedienung_Schlafzimmer_Deckenlicht:down_click] eq "true")
(set Schlafzimmer_Deckenlicht bri {([Schlafzimmer_Deckenlicht:bri] - 10)})

DOELSEIF ([Fernbedienung_Schlafzimmer_Deckenlicht:left_click] eq "true")
(set Schlafzimmer_Deckenlicht ct {([Schlafzimmer_Deckenlicht:ct] - 100)})

DOELSEIF ([Fernbedienung_Schlafzimmer_Deckenlicht:right_click] eq "true")
(set Schlafzimmer_Deckenlicht ct {([Schlafzimmer_Deckenlicht:ct] + 100)})
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: MadMax-FHEM am 19 Juni 2020, 17:17:47
Das ist NICHT der Code von betateilchen!

EDIT: und auch nicht von Christoph Morrison, weil beide NUR else haben... ;)

Weil du nun ein elsif OHNE Bedingung hast!

Also entweder else und dann gleich ausführen ODER elsif MIT Bedingung und dann...

Gruß, Joachim
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: betateilchen am 19 Juni 2020, 17:23:08
@Master_Nick vielleicht solltest Du Dir mal ein paar perl Grundlagen aneignen.

Das Durcheinander von geschweiften, runden und eckigen Klammern ist einfach haarsträubend und jemand, der "nur" perl kennt, kann in keiner Weise nachvollziehen, was da passieren soll.
Wahrscheinlich wäre es hilfreicher, wenn man schon mit perl arbeitet, zumindest in diesen Abschnitten die "reine" perl Syntax zu verwenden.
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Master_Nick am 19 Juni 2020, 17:28:03
Du hast absolut recht - das ist dieser Nicht :-) sorry.

Ich schau mir das nochmal in Ruhe an am Montag.

Zitat von: MadMax-FHEM am 19 Juni 2020, 17:17:47
Das ist NICHT der Code von betateilchen!

EDIT: und auch nicht von Christoph Morrison, weil beide NUR else haben... ;)

Weil du nun ein elsif OHNE Bedingung hast!

Also entweder else und dann gleich ausführen ODER elsif MIT Bedingung und dann...

Gruß, Joachim
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Master_Nick am 19 Juni 2020, 17:28:30
Ich hab eigentlich schon einige DOIFs mit perl inhalt gemacht - keine Ahnung heute ist der Wurm drin :-D


Zitat von: betateilchen am 19 Juni 2020, 17:23:08
@Master_Nick vielleicht solltest Du Dir mal ein paar perl Grundlagen aneignen.

Das Durcheinander von geschweiften, runden und eckigen Klammern ist einfach haarsträubend und jemand, der "nur" perl kennt, kann in keiner Weise nachvollziehen, was da passieren soll.
Wahrscheinlich wäre es hilfreicher, wenn man schon mit perl arbeitet, zumindest in diesen Abschnitten die "reine" perl Syntax zu verwenden.
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: betateilchen am 19 Juni 2020, 17:33:10
Zitat von: Master_Nick am 19 Juni 2020, 17:28:30
Ich hab eigentlich schon einige DOIFs mit perl inhalt gemacht

Um es genauer zu sagen:

Du befindest Dich im vergewaltigten perl-Teil einer DOIF-spezifischen Syntax und verwendest darin FHEM-spezifische Syntax.

Konstrukte wie

[Schlafzimmer_Deckenlicht:bri]

in logischen perl-Abfragen kennt perl selbst überhaupt nicht. Was in perl in eckigen Klammern steht, ist meist im Bereich Variablen angesiedelt und hat dann in der Regel etwas mit einem Array zu tun.
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Christoph Morrison am 19 Juni 2020, 17:52:17
Zitat von: betateilchen am 19 Juni 2020, 17:33:10
Konstrukte wie

[Schlafzimmer_Deckenlicht:bri]

in logischen perl-Abfragen kennt perl selbst überhaupt nicht. Was in perl in eckigen Klammern steht, ist meist im Bereich Variablen angesiedelt und hat dann in der Regel etwas mit einem Array zu tun.

Doch, doch, das geht:


defmod general.test.useless_machine DOIF {\
    if ([general.test.dummy:state] eq "on")\
    {\
        fhem_set "general.test.dummy off"\
    }\
}

defmod general.test.dummy dummy
attr general.test.dummy setList on off


Das DOIF implementiert so eine useless machine (https://imgur.com/gallery/FRflC), die einen Schalter einfach immer wieder auf off stellt, wenn man ihn anschaltet.
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: betateilchen am 19 Juni 2020, 17:57:02
Zitat von: Christoph Morrison am 19 Juni 2020, 17:52:17
Doch, doch, das geht:

Natürlich geht das in diesem Kontext.
Die Frage ist aber, ob man als User auch versteht, warum es "geht".

Spätestens wenn man irgendwann versucht, solche Konstrukte in reinem perl (außerhalb eines DOIF oder gar außerhalb von FHEM) zu verwenden, wird man scheitern.
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Christoph Morrison am 19 Juni 2020, 18:04:48
Zitat von: betateilchen am 19 Juni 2020, 17:57:02
Natürlich geht das in diesem Kontext.
Die Frage ist aber, ob man als User auch versteht, warum es "geht".

Spätestens wenn man irgendwann versucht, solche Konstrukte in reinem perl (außerhalb eines DOIF oder gar außerhalb von FHEM) zu verwenden, wird man scheitern.

Da hast du Recht. Das Problem des OP ist ja, dass er in keinem Kontext richtig programmiert. Von der Architekturentscheidung solch "fette" DOIFs zu produzieren, mal ganz abgesehen.

Daher noch mal mein Verweis auf meine Punkte + folgende Ergänzung an den OP:
Dein DOIF würde sich deutlich einfacher schreiben und später auch warten (geh immer davon aus, dass du in einer Woche nicht mehr weißt, was du dir dabei gedacht hast und dass dein zukünftiges Ich ein Irrer mit einer Kettensäge ist, der weiß wo du wohnst und keinen Selbsterhaltungstrieb hat), wenn du es in kleinere logische Einheiten (meint: einzelne Devices, die auch ein notify sein dürfen, wenn man kein "fettes" DOIF braucht) aufteilst. Dabei (und bei einer sinnvolleren Formatierung) wäre dir vermutlich auch aufgefallen, dass die Bedinungskette in deinem ersten DOELSEIF-Zweig einen (weiteren) logischen Fehler hat.
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Damian am 19 Juni 2020, 19:04:02
DOIF kennt zwei Modi: FHEM-Modus und Perl-Modus, die nicht miteinander kombinierbar sind - so steht es in der Commandref.

Du hast dich aufgrund deiner Definition für den FHEM-Modus entschieden, dabei ist dieser Konstrukt das Problem:
...
DOELSEIF
(
    [Fernbedienung_Schlafzimmer_Deckenlicht:up_click] eq "true"
)
{
    if ( ([Schlafzimmer_Deckenlicht:bri] + 10) >= 100 )
        ( set Schlafzimmer_Deckenlicht bri 100 )
    elsif
        ( set Schlafzimmer_Deckenlicht bri [Schlafzimmer_Deckenlicht:bri] + 10 )
}


Du kannst zwar Perl auch im FHEM-Modus benutzen, dann aber nur Perl und da ist, wie schon geschrieben, einiges im Argen.

DOIF-Perl-Modus ist dagegen eine eigene Welt, dort kommt aber z. B. kein DOELESE und auch kein DOELSEIF vor ;)



Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Master_Nick am 24 Juni 2020, 12:16:17
 :o Also ich weiß nicht, warum ich es mir künstlich so quer gelegt habe :-D

Die Lösung war ja eigentlich sehr simpel.... läuft nun wie es soll inklusive meiner Beschränkung der bri und ct Werte.
Was auch immer mich da geritten hatte... Ich danke euch :-D

([Fernbedienung_Schlafzimmer_Deckenlicht:toggle] eq "true" and [Schlafzimmer_Deckenlicht:available] eq "true" and [Schlafzimmer_Deckenlicht] eq "on")
(set Schlafzimmer_Deckenlicht off)

DOELSEIF ([Fernbedienung_Schlafzimmer_Deckenlicht:toggle] eq "true" and [Schlafzimmer_Deckenlicht:available] and [Schlafzimmer_Deckenlicht] eq "off")
(set Schlafzimmer_Deckenlicht on)

DOELSEIF ([Fernbedienung_Schlafzimmer_Deckenlicht:up_click] eq "true" and [Schlafzimmer_Deckenlicht:available] and [Schlafzimmer_Deckenlicht:bri] < 100)
(set Schlafzimmer_Deckenlicht bri {([Schlafzimmer_Deckenlicht:bri] + 10 )})

DOELSEIF ([Fernbedienung_Schlafzimmer_Deckenlicht:down_click] eq "true" and [Schlafzimmer_Deckenlicht:available] and [Schlafzimmer_Deckenlicht:bri] > 0)
(set Schlafzimmer_Deckenlicht bri {([Schlafzimmer_Deckenlicht:bri] - 10 )})


DOELSEIF ([Fernbedienung_Schlafzimmer_Deckenlicht:left_click] eq "true" and [Schlafzimmer_Deckenlicht:available] and [Schlafzimmer_Deckenlicht:ct] > 250)
(set Schlafzimmer_Deckenlicht ct {([Schlafzimmer_Deckenlicht:ct] - 100 )})

DOELSEIF ([Fernbedienung_Schlafzimmer_Deckenlicht:right_click] eq "true" and [Schlafzimmer_Deckenlicht:available] and [Schlafzimmer_Deckenlicht:ct] < 450)
(set Schlafzimmer_Deckenlicht ct {([Schlafzimmer_Deckenlicht:ct] + 100 )})
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Christoph Morrison am 24 Juni 2020, 16:44:43
Zitat von: Master_Nick am 24 Juni 2020, 12:16:17

DOELSEIF ([Fernbedienung_Schlafzimmer_Deckenlicht:up_click] eq "true" and [Schlafzimmer_Deckenlicht:available] and [Schlafzimmer_Deckenlicht:bri] < 100)
(set Schlafzimmer_Deckenlicht bri {([Schlafzimmer_Deckenlicht:bri] + 10 )})

DOELSEIF ([Fernbedienung_Schlafzimmer_Deckenlicht:down_click] eq "true" and [Schlafzimmer_Deckenlicht:available] and [Schlafzimmer_Deckenlicht:bri] > 0)
(set Schlafzimmer_Deckenlicht bri {([Schlafzimmer_Deckenlicht:bri] - 10 )})


Ist es ok wenn Schlafzimmer_Deckenlicht:bri Werte wie 109 oder -9 annimmt?
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Master_Nick am 24 Juni 2020, 16:49:04
Nein wäre nicht sinnvoll, aber sofern man das Gerät nicht ohne die Fernbedienung nutzt ist dies nicht möglich.
Denn die Fernbedienung agiert von 0 bis 100 nicht darunter und nicht darüber.

Klar wenn man nun anders an die Steuerung ginge - dann wäre dies nicht abgefangen. In Fhem selber ist es als Range definiert und somit nicht machar ohne es manuell wirklich einzutippen :-)
So zumindest meine Auffassung.


Zitat von: Christoph Morrison am 24 Juni 2020, 16:44:43
Ist es ok wenn Schlafzimmer_Deckenlicht:bri Werte wie 109 oder -9 annimmt?
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Christoph Morrison am 24 Juni 2020, 17:08:52
Zitat von: Master_Nick am 24 Juni 2020, 16:49:04
Nein wäre nicht sinnvoll, aber sofern man das Gerät nicht ohne die Fernbedienung nutzt ist dies nicht möglich.
Denn die Fernbedienung agiert von 0 bis 100 nicht darunter und nicht darüber.

Dein Code wird das aber genau so machen. Wenn du aus irgendeinem Grund bri auf über 90 oder unter 10 hast, wird ein zu hoher oder zu niedriger Wert gesetzt werden. Da war deine erste Idee schon deutlich besser.
Titel: Antw:Es sagt "right bracket without left bracket" ich finde es mit notepad++ nicht...
Beitrag von: Master_Nick am 24 Juni 2020, 17:21:38
Nein das wird er nur tun können, wenn ein Eingriff stattgefunden hat fernab der Fernbedienung. Diese arbeitet (bei mir) nur in 10er Schritten. Sonst wäre noch eine Manipulation des Ausgangswerts möglich, wäre dieser kein 10er Schritt ist kann es auch passieren.

Da es aber genau nur Steuerung in 10er Schritten gibt - so habe ich es eingebunden, ist das vernachlässigbar.


Ich muss ja nichts abfangen was nicht vorkommt :-)