NEWS
[Blockly] Was ist besser?
-
Ahllo zusammen,
welche der Versionen ist besser?
1.)
2.)
Ich wollte analog zum Retriggern in der CCU die verzögerte Ausführung des Befehls abbrechen, wenn in der Zwischenzeit das Fenster geschlossen wird.
Habe diesen Baustein auch noch im Kopf, aber mit der jetzt gewählten Logik nicht gefunden.
Vielleicht wäre das ja noch die Version 3.
Gruß
Rainer
EDIT: Muss natürlich Wert von Griff State sein!!
-
Du meinst den Baustein "stop"?
–-----------------------
Send from mobile device
-
Nein ich meine verzögert um… (löschen, falls läuft)
Jetzt hab ichs gefunden
https://github.com/ioBroker/ioBroker.ja … d_2_de.png
Gruß
Rainer
-
Habe immer noch ein Problem mit dem Blockly.
Eins habe ich schon gelöst:
bis isch endlich kapiert hatte warum diese Meldung immer kam:
javascript.0 2017-12-16 14:37:43.246 error unsubscribe: invalid type of id - number
Der State des RHS ist eine Werteliste, keine Zahl.
Also geändert in:
Jetzt läuft es durch, aber die Meldung kommt doppelt:
javascript.0 2017-12-16 14:50:58.734 info script.js.Badfenster_schliessen_2: 2\. Der Griff ist noch immer auf: 1 javascript.0 2017-12-16 14:50:58.733 info script.js.Badfenster_schliessen_2: 2: Der Griff wurde gedreht auf: 1 javascript.0 2017-12-16 14:50:52.493 info script.js.Badfenster_schliessen_2: 2\. Der Griff ist noch immer auf: 1 javascript.0 2017-12-16 14:50:52.493 info script.js.Badfenster_schliessen_2: 2: Der Griff wurde gedreht auf: 1
und:
sayit.0 2017-12-16 14:50:58.741 info Set "sonos.0.root.192_168_138_59.tts: 50;http://192.168.138.105:8082/state/sayit.0.tts.mp3 sayit.0 2017-12-16 14:50:58.739 info saying: Badfenster Schließen sayit.0 2017-12-16 14:50:53.949 error null sayit.0 2017-12-16 14:50:53.948 info Copied file "/opt/iobroker/node_modules/iobroker.sayit/lib/../say.mp3" to "/opt/iobroker/cache/fb5bb33fc2c4b97a5f8afeebd62c3c22.mp3" sayit.0 2017-12-16 14:50:53.908 info Set "sonos.0.root.192_168_138_59.tts: 50;http://192.168.138.105:8082/state/sayit.0.tts.mp3 sayit.0 2017-12-16 14:50:53.501 info saying: Badfenster Schließen sayit.0 2017-12-16 14:50:52.499 info Set "sonos.0.root.192_168_138_59.tts: 35;http://192.168.138.105:8082/state/sayit.0.tts.mp3 sayit.0 2017-12-16 14:50:52.497 info saying: /opt/iobroker/node_modules/iobroker.sayit/gong.mp3 sayit.0 2017-12-16 14:39:07.727 info Set "sonos.0.root.192_168_138_59.tts: 30;http://192.168.138.105:8082/state/sayit.0.tts.mp3
Was da wieder schiefgegangen ist ????
Gruß
Rainer
-
Könnte es sein das der Griff mehrere Status durch gibt wodurch das Script doppelt/dreifach getriggert wird ?
Wir hatten dieselbe Geschichte Mal mit dem hm Türschloss…
Da du mit einen 10 Minuten timeout arbeitest empfehle ich sowieso immer erst einen stop vor dem timer ein zu bauen.
Damit sollte sich dein Problem lösen.
Eventuell, passiert manchmal, das ein Script doppelt läuft dan Adapter Mal neu durchstarten
Send from mobile device
-
Ich glaube das Problem lag (vielleicht) woanders.
Ich habe zum Testen den Griff zurück auf 0 und dann sofort wieder auf 1 gestellt.
Ich denke:
Nach zehn Minuten war der Griff auf 1 und beide Verzögerungen traten dann ein.
Ich habe das jetzt so geändert:
und die Wartezeit zum Testen auf 2 Minuten gekürzt.Gruß
Rainer
-
Trotzdem empfehle ich dir einen stop ein zu bauen.
Kann ja Mal öfter passieren dass du doppelt drehst und dann möchtest du nicht 2 timer laufen haben
–-----------------------
Send from mobile device
-
Das mit dem Stop musst du mir bitte mal zeigen, wenn du Zeit hast.
So klappt es jedenfalls auch - es kommt nur noch einmal, auch nach -> Zu -> Auf.
Jetzt wollte ich noch eine Schleife einbauen:
Die wird aber direkt hintereinander abgearbeitet - nicht wie geplant im Alarm-Abstand (jetzt 2min - später 10 Min.)
javascript.0 2017-12-16 15:22:38.603 info script.js.Badfenster_schliessen_3: 3\. Der Griff ist noch immer auf: 1 javascript.0 2017-12-16 15:22:38.603 info script.js.Badfenster_schliessen_3: 3\. Der Griff ist noch immer auf: 1 javascript.0 2017-12-16 15:22:38.603 info script.js.Badfenster_schliessen_3: 3\. Der Griff ist noch immer auf: 1 javascript.0 2017-12-16 15:22:38.603 info script.js.Badfenster_schliessen_3: 3\. Der Griff ist noch immer auf: 1 javascript.0 2017-12-16 15:22:38.602 info script.js.Badfenster_schliessen_3: 3\. Der Griff ist noch immer auf: 1 javascript.0 2017-12-16 15:22:38.602 info script.js.Badfenster_schliessen_3: 3\. Der Griff ist noch immer auf: 1 javascript.0 2017-12-16 15:22:38.602 info script.js.Badfenster_schliessen_3: 3\. Der Griff ist noch immer auf: 1 javascript.0 2017-12-16 15:22:38.602 info script.js.Badfenster_schliessen_3: 3\. Der Griff ist noch immer auf: 1 javascript.0 2017-12-16 15:22:38.601 info script.js.Badfenster_schliessen_3: 3\. Der Griff ist noch immer auf: 1 javascript.0 2017-12-16 15:22:38.601 info script.js.Badfenster_schliessen_3: 3\. Der Griff ist noch immer auf: 1 javascript.0 2017-12-16 15:20:38.600 info script.js.Badfenster_schliessen_3: 2: Der Griff wurde gedreht auf: 1 javascript.0 2017-12-16 15:20:38.600 info script.js.Badfenster_schliessen_3: Der Griff wurde gedreht auf: 1 javascript.0 2017-12-16 15:20:34.599 info script.js.Badfenster_schliessen_3: Der Griff wurde gedreht auf: 0
Gruß
Rainer
-
Hi Rainer, mach Mal bitten nen Export von deinem blockly dab ergänze ich heut Abend was ich meine
–-----------------------
Send from mobile device
-
Hi Rainer, mach Mal bitten nen Export von deinem blockly dab ergänze ich heut Abend was ich meine `
Danke!hier der funktionierende:
! ````
<xml xmlns="http://www.w3.org/1999/xhtml"><block type="comment" id="VaA}S%5yG1Y:ZCy!+e=f" x="62" y="63"><field name="COMMENT">Fenstergriff wird bewegt</field>
<next><block type="on_ext" id="b0oUEVIPY^7n2J{:jGzv"><mutation items="1"></mutation>
<field name="CONDITION">ne</field><value name="OID0"><shadow type="field_oid" id="L=]SEg~Eq^%qaI3t9cAt"><field name="oid">hm-rpc.0.JRT0001572.1.STATE</field></shadow></value> <statement name="STATEMENT"><block type="debug" id="-4E].=xLH|Ka4fjFFGo3"><field name="Severity">log</field> <value name="TEXT"><shadow type="text" id="iWa-_2SgL3n_Cy#zCt.7"><field name="TEXT">Griff umgelegt</field></shadow> <block type="text_join" id="}?ypT,7t:V_gOzQ?3DAY"><mutation items="2"></mutation> <value name="ADD0"><block type="text" id="k!7Ahs{RAYH0[K4+}-Xg"><field name="TEXT">Der Griff wurde gedreht auf:</field></block></value> <value name="ADD1"><block type="get_value" id="g,[rBk*E/Ogb+;M+NBi:"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JRT0001572.1.STATE</field></block></value></block></value> <next><block type="comment" id="LuWSFd+2YG}T[C?!NV4|"><field name="COMMENT">Fenster schräg/offen und Außentemp. unter 12°C</field> <next><block type="controls_if" id=":Uy8U;2_w:Nw}D/V}x:|"><value name="IF0"><block type="logic_operation" id="AApv6^E6=4OnAtm~6-rK"><field name="OP">AND</field> <value name="A"><block type="logic_compare" id="|]^Co:i=g4ZJ|yt2;K`@"><field name="OP">LT</field> <value name="A"><block type="get_value" id="WR{Q#PAc.U3nO6Bz,y.e"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JEQ0140901.1.TEMPERATURE</field></block></value> <value name="B"><block type="math_number" id="B4T]wEPmfx./#+(45}QN"><field name="NUM">12</field></block></value></block></value> <value name="B"><block type="logic_compare" id="(L)mf-JN69X(kQX4T7-k"><field name="OP">NEQ</field> <value name="A"><block type="get_value" id="A2):}!@4x}l+`1|A6=C|"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JRT0001572.1.STATE</field></block></value> <value name="B"><block type="text" id="VO@8h=*k-IJ[co57V((@"><field name="TEXT">0</field></block></value></block></value></block></value> <statement name="DO0"><block type="debug" id="do;w%b1aI!1s_s/h4K8]"><field name="Severity">log</field> <value name="TEXT"><shadow type="text" id="iWa-_2SgL3n_Cy#zCt.7"><field name="TEXT">Griff umgelegt</field></shadow> <block type="text_join" id="!/2UirNXK_K3s^jwP+~u"><mutation items="2"></mutation> <value name="ADD0"><block type="text" id="gzeWN1Zo](9EFV{;F0mt"><field name="TEXT">2: Der Griff wurde gedreht auf:</field></block></value> <value name="ADD1"><block type="get_value" id="*S(.gq:4LwT=([a`X![%"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JRT0001572.1.STATE</field></block></value></block></value> <next><block type="comment" id="Fs[D|T49G]cW9|ri^I;r"><field name="COMMENT">nach 10 MInuten -> Alarm!</field> <next><block type="timeouts_settimeout" id="u8mS(SqqVLKKQ`XWTIJM"><field name="NAME">timeout</field> <field name="DELAY">10</field> <field name="UNIT">min</field> <statement name="STATEMENT"><block type="debug" id="(dd?AHh=CGJWq4K-4*B1"><field name="Severity">log</field> <value name="TEXT"><shadow type="text" id="iWa-_2SgL3n_Cy#zCt.7"><field name="TEXT">Griff umgelegt</field></shadow> <block type="text_join" id="[Qtm^]gpDLr(q6ULdLZs"><mutation items="2"></mutation> <value name="ADD0"><block type="text" id="#kgX[S^Zv,Ib+t6{M2iF"><field name="TEXT">3\. Der Griff ist noch immer auf:</field></block></value> <value name="ADD1"><block type="get_value" id="@,lb5MV`#=H-3~88r?Yg"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JRT0001572.1.STATE</field></block></value></block></value> <next><block type="sayit" id="~I)N%Ua!0~w0Up(Y8tjP"><field name="INSTANCE">.0</field> <value name="VOLUME"><block type="math_number" id="Hl^JCN#Pn/NKPN4iUlEa"><field name="NUM">50</field></block></value> <value name="MESSAGE"><shadow type="text" id="AVIi#6:m2j;;#jXzX.bS"><field name="TEXT">Badfenster Schließen</field></shadow></value></block></next></block></statement></block></next></block></next></block></statement></block></next></block></next></block></statement></block></next></block></xml>
und hier der mit dem falschen Schleife: >! ```` <xml xmlns="http://www.w3.org/1999/xhtml"><block type="on_ext" id="b0oUEVIPY^7n2J{:jGzv" x="38" y="88"><mutation items="1"></mutation> <field name="CONDITION">ne</field> <value name="OID0"><shadow type="field_oid" id="L=]SEg~Eq^%qaI3t9cAt"><field name="oid">hm-rpc.0.JRT0001572.1.STATE</field></shadow></value> <statement name="STATEMENT"><block type="debug" id="-4E].=xLH|Ka4fjFFGo3"><field name="Severity">log</field> <value name="TEXT"><shadow type="text" id="iWa-_2SgL3n_Cy#zCt.7"><field name="TEXT">Griff umgelegt</field></shadow> <block type="text_join" id="}?ypT,7t:V_gOzQ?3DAY"><mutation items="2"></mutation> <value name="ADD0"><block type="text" id="k!7Ahs{RAYH0[K4+}-Xg"><field name="TEXT">Der Griff wurde gedreht auf:</field></block></value> <value name="ADD1"><block type="get_value" id="g,[rBk*E/Ogb+;M+NBi:"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JRT0001572.1.STATE</field></block></value></block></value> <next><block type="controls_repeat_ext" id="`OUP*L}*FNP!4bwXtx/M"><value name="TIMES"><shadow type="math_number" id="p(hzxDrXI%9mX,?(RW+:"><field name="NUM">10</field></shadow></value> <statement name="DO"><block type="controls_if" id=":Uy8U;2_w:Nw}D/V}x:|"><value name="IF0"><block type="logic_operation" id="AApv6^E6=4OnAtm~6-rK"><field name="OP">AND</field> <value name="A"><block type="logic_compare" id="|]^Co:i=g4ZJ|yt2;K`@"><field name="OP">LT</field> <value name="A"><block type="get_value" id="WR{Q#PAc.U3nO6Bz,y.e"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JEQ0140901.1.TEMPERATURE</field></block></value> <value name="B"><block type="math_number" id="B4T]wEPmfx./#+(45}QN"><field name="NUM">12</field></block></value></block></value> <value name="B"><block type="logic_compare" id="(L)mf-JN69X(kQX4T7-k"><field name="OP">NEQ</field> <value name="A"><block type="get_value" id="A2):}!@4x}l+`1|A6=C|"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JRT0001572.1.STATE</field></block></value> <value name="B"><block type="text" id="VO@8h=*k-IJ[co57V((@"><field name="TEXT">0</field></block></value></block></value></block></value> <statement name="DO0"><block type="debug" id="do;w%b1aI!1s_s/h4K8]"><field name="Severity">log</field> <value name="TEXT"><shadow type="text" id="iWa-_2SgL3n_Cy#zCt.7"><field name="TEXT">Griff umgelegt</field></shadow> <block type="text_join" id="!/2UirNXK_K3s^jwP+~u"><mutation items="2"></mutation> <value name="ADD0"><block type="text" id="gzeWN1Zo](9EFV{;F0mt"><field name="TEXT">2: Der Griff wurde gedreht auf:</field></block></value> <value name="ADD1"><block type="get_value" id="*S(.gq:4LwT=([a`X![%"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JRT0001572.1.STATE</field></block></value></block></value> <next><block type="timeouts_settimeout" id="u8mS(SqqVLKKQ`XWTIJM"><field name="NAME">timeout</field> <field name="DELAY">2</field> <field name="UNIT">min</field> <statement name="STATEMENT"><block type="debug" id="(dd?AHh=CGJWq4K-4*B1"><field name="Severity">log</field> <value name="TEXT"><shadow type="text" id="iWa-_2SgL3n_Cy#zCt.7"><field name="TEXT">Griff umgelegt</field></shadow> <block type="text_join" id="[Qtm^]gpDLr(q6ULdLZs"><mutation items="2"></mutation> <value name="ADD0"><block type="text" id="#kgX[S^Zv,Ib+t6{M2iF"><field name="TEXT">3\. Der Griff ist noch immer auf:</field></block></value> <value name="ADD1"><block type="get_value" id="@,lb5MV`#=H-3~88r?Yg"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JRT0001572.1.STATE</field></block></value></block></value> <next><block type="sayit" id="~I)N%Ua!0~w0Up(Y8tjP"><field name="INSTANCE">.0</field> <value name="VOLUME"><block type="math_number" id="Hl^JCN#Pn/NKPN4iUlEa"><field name="NUM">50</field></block></value> <value name="MESSAGE"><shadow type="text" id="AVIi#6:m2j;;#jXzX.bS"><field name="TEXT">Badfenster Schließen</field></shadow></value></block></next></block></statement></block></next></block></statement> <next><block type="controls_if" id="nI1KrjER^rF3UDl*p)Yg"><value name="IF0"><block type="logic_compare" id="5UG{M8O)oVQ:^:@HqSq]"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="x@A1H1f#=.#PH50E5QdZ"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JRT0001572.1.STATE</field></block></value> <value name="B"><block type="text" id="rdx4N)|;!+3A]I#?.UVj"><field name="TEXT">0</field></block></value></block></value> <statement name="DO0"><block type="controls_flow_statements" id="Q^V@!P.OHCd^u/s%8:^f"><field name="FLOW">BREAK</field></block></statement></block></next></block></statement></block></next></block></statement></block></xml>
Danke
Rainer
-
Das mit dem Stop musst du mir bitte mal zeigen, wenn du Zeit hast. `
So meinte ich das :):
! ````
<xml xmlns="http://www.w3.org/1999/xhtml"><block type="comment" id="VaA}S%5yG1Y:ZCy!+e=f" x="62" y="63"><field name="COMMENT">Fenstergriff wird bewegt</field>
<next><block type="on_ext" id="b0oUEVIPY^7n2J{:jGzv"><mutation items="1"></mutation>
<field name="CONDITION">ne</field><value name="OID0"><shadow type="field_oid" id="L=]SEg~Eq^%qaI3t9cAt"><field name="oid">hm-rpc.0.JRT0001572.1.STATE</field></shadow></value> <statement name="STATEMENT"><block type="debug" id="-4E].=xLH|Ka4fjFFGo3"><field name="Severity">log</field> <value name="TEXT"><shadow type="text" id="iWa-_2SgL3n_Cy#zCt.7"><field name="TEXT">Griff umgelegt</field></shadow> <block type="text_join" id="}?ypT,7t:V_gOzQ?3DAY"><mutation items="2"></mutation> <value name="ADD0"><block type="text" id="k!7Ahs{RAYH0[K4+}-Xg"><field name="TEXT">Der Griff wurde gedreht auf:</field></block></value> <value name="ADD1"><block type="get_value" id="g,[rBk*E/Ogb+;M+NBi:"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JRT0001572.1.STATE</field></block></value></block></value> <next><block type="comment" id="LuWSFd+2YG}T[C?!NV4|"><field name="COMMENT">Fenster schräg/offen und Außentemp. unter 12°C</field> <next><block type="controls_if" id=":Uy8U;2_w:Nw}D/V}x:|"><value name="IF0"><block type="logic_operation" id="AApv6^E6=4OnAtm~6-rK"><field name="OP">AND</field> <value name="A"><block type="logic_compare" id="|]^Co:i=g4ZJ|yt2;K`@"><field name="OP">LT</field> <value name="A"><block type="get_value" id="WR{Q#PAc.U3nO6Bz,y.e"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JEQ0140901.1.TEMPERATURE</field></block></value> <value name="B"><block type="math_number" id="B4T]wEPmfx./#+(45}QN"><field name="NUM">12</field></block></value></block></value> <value name="B"><block type="logic_compare" id="(L)mf-JN69X(kQX4T7-k"><field name="OP">NEQ</field> <value name="A"><block type="get_value" id="A2):}!@4x}l+`1|A6=C|"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JRT0001572.1.STATE</field></block></value> <value name="B"><block type="text" id="VO@8h=*k-IJ[co57V((@"><field name="TEXT">0</field></block></value></block></value></block></value> <statement name="DO0"><block type="timeouts_cleartimeout" id="uCd[{|[?!|hw7MeXU!7s"><field name="NAME">timeout</field> <next><block type="debug" id="do;w%b1aI!1s_s/h4K8]"><field name="Severity">log</field> <value name="TEXT"><shadow type="text" id="iWa-_2SgL3n_Cy#zCt.7"><field name="TEXT">Griff umgelegt</field></shadow> <block type="text_join" id="!/2UirNXK_K3s^jwP+~u"><mutation items="2"></mutation> <value name="ADD0"><block type="text" id="gzeWN1Zo](9EFV{;F0mt"><field name="TEXT">2: Der Griff wurde gedreht auf:</field></block></value> <value name="ADD1"><block type="get_value" id="*S(.gq:4LwT=([a`X![%"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JRT0001572.1.STATE</field></block></value></block></value> <next><block type="comment" id="Fs[D|T49G]cW9|ri^I;r"><field name="COMMENT">nach 10 MInuten -> Alarm!</field> <next><block type="timeouts_settimeout" id="u8mS(SqqVLKKQ`XWTIJM"><field name="NAME">timeout</field> <field name="DELAY">10</field> <field name="UNIT">min</field> <statement name="STATEMENT"><block type="debug" id="(dd?AHh=CGJWq4K-4*B1"><field name="Severity">log</field> <value name="TEXT"><shadow type="text" id="iWa-_2SgL3n_Cy#zCt.7"><field name="TEXT">Griff umgelegt</field></shadow> <block type="text_join" id="[Qtm^]gpDLr(q6ULdLZs"><mutation items="2"></mutation> <value name="ADD0"><block type="text" id="#kgX[S^Zv,Ib+t6{M2iF"><field name="TEXT">3\. Der Griff ist noch immer auf:</field></block></value> <value name="ADD1"><block type="get_value" id="@,lb5MV`#=H-3~88r?Yg"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.JRT0001572.1.STATE</field></block></value></block></value> <next><block type="sayit" id="~I)N%Ua!0~w0Up(Y8tjP"><field name="INSTANCE">.0</field> <value name="VOLUME"><block type="math_number" id="Hl^JCN#Pn/NKPN4iUlEa"><field name="NUM">50</field></block></value> <value name="MESSAGE"><shadow type="text" id="AVIi#6:m2j;;#jXzX.bS"><field name="TEXT">Badfenster Schließen</field></shadow></value></block></next></block></statement></block></next></block></next></block></next></block></statement></block></next></block></next></block></statement></block></next></block></xml>
! ````
~Dutch
-
Danke!
ich habe inzwischen dies hier gemacht:
filename="Blockly_Badfenster06.jpg" index="0">~~Mal sehen, was besser klappt
Du stoppst den Timeout, bevor du den nächsten setzst. - gut wenn noch einer irrtümlich läuft
In meiner Version habe ich jetzt eine repeat drin, das ich beende, wenn das Fenster zu ist.
Evtl müsste ich das auch nochmal stoppen, wenn das Fenster als zu erkannt wird und der repeat aus einem Grund nicht abgebrochen wurde.
Mal denken!
Gruß
Rainer
-
In meiner Version habe ich jetzt eine repeat drin, das ich beende, wenn das Fenster zu ist. `
DIe koenntest doch beimm schliesen den laufenden tier beenden und dan kommt keine nachricht ?
-
Hab ich noch nicht getestet.
Ich musste WAFtechnisch die Tests abbrechen :lol:
Gruß
Rainer
Sorry ich hab das Blockly ja gar nicht gepostet.
Hier:
-
Ich würde da noch um ein "falls Drehgriff Status = 0" einsetzten und darin das Stop einbauen.
Wenn das Fenster zu ist, soll doch auch die Warnung aufhören, oder?
Da wo Du den Stop jetzt hingesetzt hast, macht es keinen Sinn.
Grüße
-
Ich habe das so gelöst:
Noch mit einer zweiten Ansage!
Enrico
-
Da wo Du den Stop jetzt hingesetzt hast, macht es keinen Sinn. `
Du hast ja recht!Das sollte ein SONST werden. :oops: :oops:
Gruß Rainer