FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Gunther am 19 November 2019, 21:53:11

Titel: Liste im Dummy durchschalten
Beitrag von: Gunther am 19 November 2019, 21:53:11
Ich habe ein Dummy mit mehreren Werten.
Wie kann ich den State durch schrittweises Ändern durchschalten

Also so, z. B. Über einen Taster
wert1 —> wert2 —> wert3 —> wert1

Hintergrund: habe eine Tradfri Remote und überlege sie so einzubinden:
rechts/links schaltet per DoIf einen Dummy (3-4 Lampen-Devices) durch und lässt die jeweils ausgewählte Lampe kurz aufflackern oder kurz erlöschen.
Ein 2. DoIf lässt in Abhängigkeit vom Dummy das entsprechende Device ein/ausschalten und dimmen.
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: amenomade am 19 November 2019, 22:12:13
Ich bin mir nicht sicher, dass ich verstehe, was Du meinst.

Etwas wie:
DOIF ([schalter:"button"] and [?dummy] eq "wert3") (set dummy wert1)
DOELSEIF ([schlater:"button"] and [?dummy] eq "wert1") (set dummy wert2)
DOELSEIF ([schalter:"button"] and [?dummy] eq "wert2") (set dummy wert3)

?

Kann man sogar ohne dummy über den DOIF selbst lösen.
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: Gunther am 19 November 2019, 22:30:36
ja genau. Hatte gehofft, dass es einen Befehl zum durchschalten (vorwärts und rückwärts) der setlist-Einträge gibt.
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: amenomade am 19 November 2019, 22:51:26
Es gibt webcmddevStateIcon
attr myDummy devStateIcon wert1:Restart:wert2 wert2:Restart:wert3 wert3:Restart:wert1
Das ist aber damit Fhemweb schalten kann.

Da willst Du auf einem Taster reagieren, dann musst Du irgendwie die Events und das dummy koppeln. DOIF oder notify o.ä
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: Gunther am 20 November 2019, 19:11:49
Danke, werde wohl mit einem DOIF arbeiten. back und forward wären vielleicht noch coole Befehle, die man mit den setlist-Einträgen nutzen könnte.
Wo kann ich so einen Vorschlag machen?
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: diko am 21 November 2019, 14:46:53
Ich denke, DOIF hat da genau das richtige:
https://wiki.fhem.de/wiki/DOIF/Mehrfachnutzung_eines_Tasters
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: Gunther am 21 November 2019, 15:49:21
cool, das schaue ich mir an!
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: amenomade am 21 November 2019, 18:58:52
Tja... macht grundsäzlich nix anderes als was ich hieroben mit DOIF schon geschrieben habe ;)
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: Gunther am 21 November 2019, 19:36:08
Habe ich auch festgestellt.

Folgendes DOIF (RAW Definition inkl. wait-Timer) funktioniert schonmal mit anzuzeigen, welche Lampe ausgewählt ist (blinkt kurz):

defmod doif_eg_ki_tradfri_dummy_schalten DOIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_leuchtrahmen_hauptschalter] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_leuchtrahmen_hauptschalter] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter off) (set eg_ki_leuchtrahmen_hauptschalter on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_LEDStreifen] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_LEDStreifen] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen off) (set eg_ki_LEDStreifen on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_ledspots] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_ledspots] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots off) (set eg_ki_ledspots on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_ledspots] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_ledspots] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots off) (set eg_ki_ledspots on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_leuchtrahmen_hauptschalter] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_leuchtrahmen_hauptschalter] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter off) (set eg_ki_leuchtrahmen_hauptschalter on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_LEDStreifen] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_LEDStreifen] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen off) (set eg_ki_LEDStreifen on)
attr doif_eg_ki_tradfri_dummy_schalten comment DOIF schaltet durch Drücke auf der Tradfri-Fernbedienung (rechts=5002 und links=4002) einen Dummy.\
\
Im Dummy werden die Namen der Lampen gesetzt. \
\
Damit man weiß, welche Lampe man "am Wickel" hat, blinkt die Lampe kurz auf.\
\
Damit wird ein weiteres DOIF befähigt anhand des gesetzten Dummies die Lampe an-/auszuschalten und hoch und runterzudimmen
attr doif_eg_ki_tradfri_dummy_schalten do always
attr doif_eg_ki_tradfri_dummy_schalten group Fernbedienung
attr doif_eg_ki_tradfri_dummy_schalten room Logik_Licht
attr doif_eg_ki_tradfri_dummy_schalten wait 0,0:0,0,1:0,0:0,0.5,0:0,0:0,0.5,0:0,0:0,0.5,0:0,0:0,0,1:0,0:0,0.5,0

Titel: Antw:Liste im Dummy durchschalten
Beitrag von: Damian am 21 November 2019, 19:53:05
Mit diesem Zweizeiler kann man beliebige Befehlssequenzen durchschalten:

defmod schrittSchalter DOIF init {@{$_a}=qw/10 35 50 70 100/;;$_counter=0}\
{if ([Taster:"on"]) {set_State($_a[$_counter++]);;fhem_set("Schalter $_a[$_counter]");; $_counter=($_counter==@{$_a} ? 0:$_counter)}}


Die Werte werden im oberen Array definiert, hier 10 35 50 70 100, die Anzahl ist beliebig

Taster und Schalter kann man entsprechend anpassen.

Im Status des DOIFs wird der aktuelle Wert dargestellt.
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: Gunther am 21 November 2019, 23:39:21
Hallo Damian,
danke. Ich muss gestehen, ich verstehe das DOIF nicht. Da bin ich zu sehr Noob... ;-)

Ich habe nun folgendes DOIF, was einen Dummy nutzt. Es funktioniert soweit, außer, wenn eine meiner Lampen einen Dimmstatus haben, also nicht "on", sondern im Dimmstatus sind oder NOACK haben. In solch einem Fall schaltet das DOIF nicht auf das nächste Device um.
Also gemeint sind Einträge wie
[eg_ki_leuchtrahmen_hauptschalter] eq "on"
Wie kann ich das klug umgehen?
Kann ich das mit ne "off" hinbekommen?

([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_leuchtrahmen_hauptschalter] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter on-for-timer 0.1)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_leuchtrahmen_hauptschalter] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter off) (set eg_ki_leuchtrahmen_hauptschalter on)

DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_LEDStreifen] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen on-for-timer 0.1)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_LEDStreifen] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen off) (set eg_ki_LEDStreifen on)

DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_ledspots] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots on-for-timer 0.1)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_ledspots] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots off) (set eg_ki_ledspots on)

DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_ledspots] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots on-for-timer 0.1)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_ledspots] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots off) (set eg_ki_ledspots on)

DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_leuchtrahmen_hauptschalter] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter on-for-timer 0.1)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_leuchtrahmen_hauptschalter] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter off) (set eg_ki_leuchtrahmen_hauptschalter on)

DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_LEDStreifen] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen on-for-timer 0.1)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_LEDStreifen] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen off) (set eg_ki_LEDStreifen on)
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: Thomas41587 am 22 November 2019, 18:30:41
Zitat von: Damian am 21 November 2019, 19:53:05
Mit diesem Zweizeiler kann man beliebige Befehlssequenzen durchschalten:

defmod schrittSchalter DOIF init {@{$_a}=qw/10 35 50 70 100/;;$_counter=0}\
{if ([Taster:"on"]) {set_State($_a[$_counter++]);;fhem_set("Schalter $_a[$_counter]");; $_counter=($_counter==@{$_a} ? 0:$_counter)}}


Die Werte werden im oberen Array definiert, hier 10 35 50 70 100, die Anzahl ist beliebig

Taster und Schalter kann man entsprechend anpassen.

Im Status des DOIFs wird der aktuelle Wert dargestellt.
Wow, das Ding ist ja der Hammer  ;D Allerdings muss ich mich Gunther anschließen: Verständnis=0. Kannst du evtl. die Bestandteile kurz erläutern, sodass man nicht nur stures copy&paste macht sondern das gelernte auch auf ähnliche Sachen anwenden kann?
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: amenomade am 22 November 2019, 18:48:38
{init => Initialisierung des DOIFS
     @{$_a}=qw/10 35 50 70 100 => definiert ein Array mit Werten 10 35 50 ... und Name <DOIFname>a
     $_counter=0 => definiert ein Zähler mit Initialisierungswert 0
} => Ende der Initialisierung
if ([Taster:"on"] => Trigger ist ein "on" Event auf Device Taster
     {set_State($_a[$_counter++] => setzt den Zustand des DOIFs auf entspr. (neu kalkulierten) Wert
     fhem_set("Schalter $_a[$_counter]");; => das Befehl "set Schalter <neuen Wert> wird geschickt
     $_counter=($_counter==@{$_a} ? 0:$_counter)} => schliesst den Kreis von Werten: wenn 100 erreicht, fängt er wieder mit 10 an
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: kumue am 22 November 2019, 18:57:11
wenn ich schalte, ist der wert des Schalters immer eins weiter als der status des DOIF...
also state des DOIF auf 10 und state des Schalters auf 35.

Hätte ich aber nicht so erwartet...

Titel: Antw:Liste im Dummy durchschalten
Beitrag von: Damian am 22 November 2019, 19:24:54
Zitat von: kumue am 22 November 2019, 18:57:11
wenn ich schalte, ist der wert des Schalters immer eins weiter als der status des DOIF...
also state des DOIF auf 10 und state des Schalters auf 35.

Hätte ich aber nicht so erwartet...

hab´s mal schnell zusammengezimmert, um die Leistungsfähigkeit des Perl-Modus aufzuzeigen:

dann einfach abändern in:

set_State($_a[$_counter]);;fhem_set("Schalter $_a[$_counter++]")

Die Besonderheit im Perl-Modus sind hierbei gekapselte Instanzvariablen, hier $_a, die einen Schaltvorgang überleben, also ihren Wert bis zum nächsten Schaltvorgang behalten können.
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: kumue am 22 November 2019, 19:28:15
perfekt, jetzt läufts im gleichtakt
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: Damian am 22 November 2019, 19:40:44
Zitat von: kumue am 22 November 2019, 19:28:15
perfekt, jetzt läufts im gleichtakt

Dabei läuft es mit maximaler Perl-Performance, ohne das System sonderlich zu belasten. Der FHEM-Parser kommt hier gar nicht zum Zuge ;)

Edit: Ich habe es hier etwas strukturierter mit Beschreibung gepostet https://forum.fhem.de/index.php/topic,105634.msg995666.html#msg995666
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: Gunther am 24 November 2019, 19:52:25
Da ich gerne verstehe was ich als Code habe, sieht es derzeit so aus wie unten. Mein Problem ist nun, dass das System Mega-Langsam wird...
Woran kann das liegen?

defmod doif_eg_ki_tradfri_dummy_schalten DOIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_leuchtrahmen_hauptschalter] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_leuchtrahmen_hauptschalter] ne "off") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter off) (set eg_ki_leuchtrahmen_hauptschalter on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_LEDStreifen] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_LEDStreifen] ne "off") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen off) (set eg_ki_LEDStreifen on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_ledspots] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_ledspots] ne "off") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots off) (set eg_ki_ledspots on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_ledspots] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_ledspots] ne "off") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots off) (set eg_ki_ledspots on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_leuchtrahmen_hauptschalter] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_leuchtrahmen_hauptschalter] ne "off") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter off) (set eg_ki_leuchtrahmen_hauptschalter on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_LEDStreifen] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_LEDStreifen] ne "off") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen off) (set eg_ki_LEDStreifen on)

attr doif_eg_ki_tradfri_dummy_schalten do always
attr doif_eg_ki_tradfri_dummy_schalten wait 0,0:0,0,1:0,0:0,0,0.5:0,0:0,0,0.5:0,0:0,0.5,0:0,0:0,0,1:0,0:0,0,0.5
Titel: Antw:Liste im Dummy durchschalten
Beitrag von: FHEMAN am 20 Juli 2020, 21:54:36
Ich habe über ein userReading den jeweils nächsten Sender zum Abruf parat (siehe https://forum.fhem.de/index.php/topic,17667.msg492816.html#msg492816).