[gelöst] Es sagt "right bracket without left bracket" ich finde es mit notepad++

Begonnen von Master_Nick, 19 Juni 2020, 16:23:23

Vorheriges Thema - Nächstes Thema

Master_Nick

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.
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Master_Nick

Das ist schon mal ein klarer sauberer Tip! :-D Danke! Hab das gefixed - Rest bleibt ;-) natürlich
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Christoph Morrison

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.

Master_Nick

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 ;-/
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Christoph Morrison

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.

Master_Nick

 :)

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)})
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

betateilchen

@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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Master_Nick

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
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Master_Nick

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.
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Christoph Morrison

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, die einen Schalter einfach immer wieder auf off stellt, wenn man ihn anschaltet.

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!