Hauptmenü

FTUI version 3

Begonnen von Bunnu, 25 Oktober 2020, 09:25:41

Vorheriges Thema - Nächstes Thema

curt

Ich habe mal wieder ein Problem, es muss in Abhängigkeit geschaltet werden. Es geht um Folgendes:

Ich habe ein händisch zu öffnendes Velux-Dachfenster mit automatischem Rollladen. Nun soll der Rollladen nur geschlossen werden, wenn ein Öffnungsmelder das Fenster selbst als geschlossen meldet.

So wird das Fenster geschlossen:
<ftui-icon name="arrow-circle-down" class="size-0"
           @click="javascript:sendFhem('set {{Roll}} pct 0')">

Der Öffnungsmelder sei die Device "Dachfenster", der state kennt den Zustand "closed". Im Grunde müsste es so etwas wie "@click="javascript:sendFhem('if Dachfenster closed then set {{Roll}} pct 0')" sein. Wie geht das richtig? Wie setzt man das um?

Danke für die Hilfe.
RPI 4 - Jeelink HomeMatic Z-Wave

andreas_r

#3436
Zitat von: curt am 19 Juli 2023, 01:07:22Der Öffnungsmelder sei die Device "Dachfenster", der state kennt den Zustand "closed". Im Grunde müsste es so etwas wie "@click="javascript:sendFhem('if Dachfenster closed then set {{Roll}} pct 0')" sein. Wie geht das richtig? Wie setzt man das um?

Ich würde es naiverweise einen Dummy anlegen, der den Schalter für das gesamte System darstellt. Immer wenn dann der Dummy auf "close" gesetzt wird, würde ich im Hintergrund in FHEM ein DOIF triggern, das genau das, was Du beschreibst, prüft und dann den Schaltvorgang auslöst (oder eben auch nicht).

Den Dummy selber kannst Du dann als ganz "normalen" Schalter in FTUI einbinden.

VG, Andreas


juemuc

Zitat von: curt am 19 Juli 2023, 01:07:22Ich habe mal wieder ein Problem, es muss in Abhängigkeit geschaltet werden. Es geht um Folgendes:

Ich habe ein händisch zu öffnendes Velux-Dachfenster mit automatischem Rollladen. Nun soll der Rollladen nur geschlossen werden, wenn ein Öffnungsmelder das Fenster selbst als geschlossen meldet.

So wird das Fenster geschlossen:
<ftui-icon name="arrow-circle-down" class="size-0"
           @click="javascript:sendFhem('set {{Roll}} pct 0')">

Der Öffnungsmelder sei die Device "Dachfenster", der state kennt den Zustand "closed". Im Grunde müsste es so etwas wie "@click="javascript:sendFhem('if Dachfenster closed then set {{Roll}} pct 0')" sein. Wie geht das richtig? Wie setzt man das um?

Danke für die Hilfe.

Hallo curt,

ich habe dies so gelöst:
Rollo_Buero:pct:.*
IF ([HMIP_SWDO_0000DA498D425C:state] eq "open")
   (set Sonos_Buero Speak 20 de |Das_Bürofenster_ist_offen.mp3|,
    {my $old_pct = OldReadingsVal("Rollo_Buero","pct","0");;
    fhem("set Rollo_Buero pct $old_pct")})
ELSE
   (set HMCCU3 var Rollo_Buero $EVTPART1,
    get HMCCU3 vars R.*,
    setreading Rollo_Buero_WT currValue $EVTPART1,
    IF ([Rollo_Buero:state] eq "pct 100")
       (sleep 2,
        set HM_MOD_Re_8_OEQ0206895_5 on-for-timer 0.5),
    IF ([Rollo_Buero:state] eq "pct 75")
       (sleep 15,
        set HM_MOD_Re_8_OEQ0206895_5 on-for-timer 0.5,
        sleep 40,
        set HM_MOD_Re_8_OEQ0206895_6 on-for-timer 13),
    IF ([Rollo_Buero:state] eq "pct 50")
       (sleep 25,
        set HM_MOD_Re_8_OEQ0206895_5 on-for-timer 0.5,
        sleep 40,
        set HM_MOD_Re_8_OEQ0206895_6 on-for-timer 24),
    IF ([Rollo_Buero:state] eq "pct 25")
       (sleep 15,
        set HM_MOD_Re_8_OEQ0206895_6 on-for-timer 0.5,
        sleep 40,
        set HM_MOD_Re_8_OEQ0206895_5 on-for-timer 11),
    IF ([Rollo_Buero:state] eq "pct 0")
       (sleep 2,
        set HM_MOD_Re_8_OEQ0206895_6 on-for-timer 0.5)
)

Der aktuelle Status des Rollos wird über ein Dummy verwaltet:
defmod Rollo_Buero dummy
attr Rollo_Buero userattr Rollo Rollo_map structexclude
attr Rollo_Buero alexaName Rollo Büro;; Rollo im Büro
attr Rollo_Buero alias Rollo Büro
attr Rollo_Buero devStateIcon {my $state = ReadingsVal("HMIP_SWDO_0000DA498D425C","state"," ");;;; if ($state eq "open") {"pct.100:fts_roof_window_shutter_0\@red pct.75:fts_roof_window_shutter_02\@red pct.50:fts_roof_window_shutter_05\@red pct.25:fts_roof_window_shutter_07\@red pct.0:fts_roof_window_shutter_10\@red pct.*:unknown"} else {"pct.100:fts_roof_window_shutter_0 pct.75:fts_roof_window_shutter_02 pct.50:fts_roof_window_shutter_05 pct.25:fts_roof_window_shutter_07 pct.0:fts_roof_window_shutter_10 pct.*:unknown"}}
attr Rollo_Buero event-on-change-reading .*
attr Rollo_Buero genericDeviceType blind
attr Rollo_Buero group HM Funkschalter
attr Rollo_Buero homebridgeMapping clear CurrentPosition=pct,minValue=0,maxValue=100,minStep=25\
TargetPosition=pct,minValue=0,maxValue=100,minStep=25,cmd=pct\
OpenClose=state,cmdOpen=pct 100,cmdClose=pct 0
attr Rollo_Buero icon it_remote@black
attr Rollo_Buero oldreadings pct
attr Rollo_Buero readingList state
attr Rollo_Buero room Alexa,Büro,Schaltzentrale
attr Rollo_Buero setList pct:100,75,50,25,0
attr Rollo_Buero sortby 01
attr Rollo_Buero userReadings pct {ReadingsNum($name,"state","0")}, Fensterstatus {ReadingsVal("HMIP_SWDO_0000DA498D425C","state","undefined")}, trigger
attr Rollo_Buero webCmd pct
attr Rollo_Buero webCmdLabel Prozent (offen) &#58


Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

curt

Ich hatte mir das einfacher erhofft. Ok, dann mit dummy. Danke auch für das Beispiel!
RPI 4 - Jeelink HomeMatic Z-Wave

curt

Ich habe mir das nochmal angesehen und hoffe immer noch, dass es einfacher geht. Ich habe daher eine Frage zum Konstrukt @click="javascript:sendFhem:

Innerhalb FHEMWEB funktioniert auf der Kommandozeile
IF ([Heizungsraum:state] eq ´closed´) (set Velux_5 pct 0)'

Nun könnte man auf die Idee kommen, diese Zeile bei FTUI3 durchzureichen:
@click="javascript:sendFhem('IF ([Heizungsraum:state] eq "closed") (set Velux_5 pct 0)')">
Das geht nicht. Anzunehmen ist, dass er die verschachtelten Anführungszeichen nicht mag. Wenn ich die Anführungszeichen um closed maskiere ( \"closed\" ) funktioniert es allerdings auch nicht. Auch ( ´closed´ ) funktioniert nicht.

Mache ich da etwas falsch? Oder ist das bei @click="javascript:sendFhem so nicht vorgesehen?
 
RPI 4 - Jeelink HomeMatic Z-Wave

mr_petz

@curt

Du hattest schon den richtigen Riecher ;D
so geht dein Wunsch (auch ohne vorangesetzten javascript:):
@click="sendFhem(`IF ([Heizungsraum:state] eq 'closed') (set Velux_5 pct 0)`)"

so habe ich getestet:
@click="sendFhem(`IF ([dummy:state] eq 'on') (set dummy6 off)`)"

Es kommt auf die backquotes an...

LG

curt

Zitat von: mr_petz am 24 Juli 2023, 19:54:45Du hattest schon den richtigen Riecher ;D
Pffft. Garnix hatte ich. Außer irgendwann schlechte Laune.

Zitat von: mr_petz am 24 Juli 2023, 19:54:45so geht dein Wunsch (auch ohne vorangesetzten javascript:):
Es ist toll: Wenn nichts mehr geht, kommst Du um die Ecke und hast den richtigen Trick parat. Sehr herzlichen Dank!
RPI 4 - Jeelink HomeMatic Z-Wave

TimoD

#3442
Habe eine Frage, würde gerne aus FTUI 3 fhem Neustarten:

wie muss denn ein Button aussehen, wenn ich einen Befehl absetzen möchte, der nicht set vorangestellt hat?

                <ftui-button     cmd="shutdown restart" fill="">
                        <ftui-icon name="power-off" size="2"></ftui-icon>

                                            </ftui-button>
funktioniert nicht, in der Referenz finde ich auch nichts. (Früher in FTUI2 war es mal: data-fhem-cmd)
Schonmal vielen lieben Dank,

Grüße

Habs gefunden bzw. hinbekommen:

Zwei Möglichkeiten:

<ftui-icon name="power-off" size="2" onclick="ftuiApp.fhemService.sendCommand('shutdown restart')"></ftui-icon>

<ftui-icon name="power-off" size="2" @click="sendFhem('shutdown restart')"></ftui-icon>

curt

Zitat von: mr_petz am 24 Juli 2023, 19:54:45@click="sendFhem(`IF ([Heizungsraum:state] eq 'closed') (set Velux_5 pct 0)`)"

Also das funktioniert:
@click="javascript:sendFhem('set {{Putzi}} reconnect; set {{Putzi}} start')"

Nun geht es um eine Erweiterung: Das ist ein Dach-Klappfenster mit Rollladen und die Teuerste fordert, dass das Fenster zu ist, wenn der Rollladen herunterfährt. Kein Problem, ich ... scheitere so:

Da geht ELSE nicht:
@click="javascript:sendFhem(`IF ([{{Klapp}}:state] eq 'off') (set {{Roll}} down) ELSE ('set {{Klapp}} down;; sleep 50;; set {{Roll}} down')`)"

Die Klammerung ist, weil das ein Template ist. Die Klammern werden korrekt aufgelöst. Der IF-Teil funktioniert. Aber auch nur dann, wenn doppelte ";;" im ELSE-Teil sind. Der ELSE-Teil wird dann insoweit akzeptiert als IF korrekt abgearbeitet wird. Aber wenn die Bedingung zum ELSE-Teil geht, wird ELSE nicht abgearbeitet.

Weiß jemand, wie das richtig geht?
RPI 4 - Jeelink HomeMatic Z-Wave

mr_petz

#3444
@curt

Es kommt mal wieder jemand um die Ecke, damit du nicht wieder schlechte Laune bekommst :D

Mein Test:
@click="sendFhem(`IF ([dummy:state] eq 'on') (set dummy6 on) ELSE (sleep 10, set dummy on, sleep 10, set dummy6 off)`)"
in deinem fall müsste es so gehen:
@click="sendFhem(`IF ([{{Klapp}}:state] eq 'off') (set {{Roll}} down) ELSE (set {{Klapp}} down, sleep 50, set {{Roll}} down)`)"

Komma statt Semikolon...

ps. sleep hat ein Problem mit doppelten ;

nochmal ps. wenn curt es bestätigt, dann die WIKI-User bitte mit aufnehmen!

LG

curt

Zitat von: mr_petz am 26 Juli 2023, 09:04:34in deinem fall müsste es so gehen:
@click="sendFhem(`IF ([{{Klapp}}:state] eq 'off') (set {{Roll}} down) ELSE (set {{Klapp}} down, sleep 50, set {{Roll}} down)`)"

Komma statt Semikolon...

Ok, auf Komma wäre ich nicht gekommen, eher noch auf "ö" als Trenner ... Das Konstrukt sorgt nun dafür, dass der IF-Zweig bei erfüllter Bedingung ausgeführt wird. Leider wird der ELSE-zweig bei nicht erfüllter Bedingung nicht ausgeführt.

Damit als Fehler die Befehlsfolge ausgeschossen wird, habe ich ELSE vereinfacht:
@click="sendFhem(`IF ([{{Klapp}}:state] eq 'off') (set {{Roll}} down) ELSE ('set {{Klapp}} down)`)"

Auch in diesem Fall wird ELSE leider nicht ausgeführt. Hast Du da eine Idee? Also ob ELSE grundsätzlich weggetan wird oder ob uns noch ein Wunderzeichen fehlt?
RPI 4 - Jeelink HomeMatic Z-Wave

mr_petz

#3446
???
Mein test geht.
Du hast meine Vorgabe kopiert?
Oder hattest du die Hochkommas drin gelassen? Die müssen raus!
@click="sendFhem(`IF ([{{Klapp}}:state] eq 'off') (set {{Roll}} down) ELSE (set {{Klapp}} down, sleep 50, set {{Roll}} down)`)"
Bei deiner Vereinfachung nach Else vor set das Hochkomma raus nehmen!

LG

Edit:
ELSE Test als animiertes Gif angehangen.
Hier ist die obere Lampe dummy und die untere dummy6.
Habe die Zeit nur auf 3 sec. gesetzt.

curt

Zitat von: mr_petz am 27 Juli 2023, 14:38:18Du hast meine Vorgabe kopiert?

Na selbstverständlich. Also vermutlich. Ähmmm. Oh. Nein.
    :-\

Zitat von: mr_petz am 27 Juli 2023, 14:38:18Oder hattest du die Hochkommas drin gelassen? Die müssen raus!

Jetzt sind sie raus. Und jetzt funktioniert das alles wunderfein. Danke!
RPI 4 - Jeelink HomeMatic Z-Wave

mr_petz

Zitat von: curt am 27 Juli 2023, 22:37:50
Zitat von: mr_petz am 27 Juli 2023, 14:38:18Du hast meine Vorgabe kopiert?

Na selbstverständlich. Also vermutlich. Ähmmm. Oh. Nein.
    :-\

Zitat von: mr_petz am 27 Juli 2023, 14:38:18Oder hattest du die Hochkommas drin gelassen? Die müssen raus!

Jetzt sind sie raus. Und jetzt funktioniert das alles wunderfein. Danke!

Ok... Gott sei Dank... schwere Geburt!
Bitte die IF/ELSE mit eintragen ins Wiki:
https://wiki.fhem.de/wiki/FTUI3_Best_Practices

Hier Bsp. von einem Template:
@click="sendFhem(`IF ([{{Klapp}}:state] eq 'off') (set {{Roll}} down) ELSE (set {{Klapp}} down, sleep 50, set {{Roll}} down)`)"

LG

andreas_r

Hier also der Wiki Artikel dazu:

Wiki