Wir haben in unserem ersten Artikel zur smarten Waschmaschine bereits beschrieben, wie wir uns über das Ende des Waschvorgangs über eine notification informieren lassen können. Bestandteil des Scripts ist die Berechnung des tatsächlichen Verbrauchs der Waschmaschine oder des Trockners. Zuletzt war die Berechnung recht komplex, da wir jede an übertragene Änderungen der gemessenen Leistung am Shelly 1pm erfassen und in zeitlichen Bezug setzen mussten.
In einem der letzten Firmware-Updates des Shelly 1pm wurde allerdings eingeführt, dass der absolute Energieverbrauch des Shelly 1pm in kWh gespeichert wird. Dies hat den Vorteil, dass wir lediglich bei Start und Ende die Differenz ermitteln müssen und somit direkt den tatsächlichen Verbrauch der Buntwäsche in 60°C ermitteln können.
- 2-Kanalschalter mit Messfunktion, 2x10 A
- Verbindung über Ihr WLAN-Netzwerk, kein HUB erforderlich
- Bluetooth-Verbindung über Shelly Cloud App
- Steuerung der Abdeckung (Walze)
- Leistungsmessung mit Datenspeicherung
Die Logik der Ermittlung, ob die Maschine fertig ist bleibt gleich:
- Wir prüfen, ob der Leistungsbezug der Maschine über einen Schwellwert steigt
- Solange die Leistung über diesem initialen Schwellwert liegt, wissen wir, dass die Maschine läuft
- Sinkt der Wert unter einen Leistungswert, der nur im Ruhezustand/Standby verbraucht wird, können wir erkennen, dass die Maschine eventuell fertig ist
- Leider kann es sein, dass es im Wasch-/Trockenprogramm Phasen mit geringen Stromverbrauch gibt, deswegen lassen wir im dritten Schritt einen Timer laufen, nach dessen Abschluss das Ende notifiziert wird
- Steigt während des Timers zwischendurch die Leistung der Maschine wieder über den Standby-Schwellenwert, löschen wir den Timer und das Script befindet sich im zweiten Schritt der Logik.
- Erst nach vollständigem Ablauf des Timers können wir sicher die Benachrichtigung über das Ende senden
Viel einfacher wird es mit Geräten, die sich nach Ablauf des Vorgangs vollständig ausschalten und der Strombedarf auf 0 Watt sinkt. In diesem Fall gilt ledliglich die Regel, wenn wir gemessen haben, dass die Maschine angeschaltet wurde, warte bis der Wert wieder auf 0 Watt fällt und sende die Benachrichtigung über das Ende.
Blockly-Export
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="n1z{RD[A#HVTG]8!X55V">actual_power</variable> <variable id="SGZ1H`:rT3@9pZC1p/dc">wait_status</variable> <variable id="O%z-ZR5AF}I=)hIt`vhx">won</variable> <variable id=")g$SO)J%^HoLN3|sYMiy">standby_power</variable> <variable id="Z=o);0Ep2ZL/+[9Ia):p">on_power</variable> <variable type="timeout" id="ausschalten">ausschalten</variable> </variables> <block type="create" id="^2Rg-q.1Ed^~t`cgEo,X" x="46" y="-709"> <field name="NAME">BS32.Waschmaschine.ON</field> <value name="VALUE"> <block type="logic_boolean" id="wvF4-g`2vkKhnhsDn[i1"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="create" id="}!WF{?AklaNk[sat13Yc"> <field name="NAME">BS32.Waschmaschine.verbrauch</field> <value name="VALUE"> <block type="math_number" id="en8^em$5WE#eZ4J?C_^3"> <field name="NUM">0</field> </block> </value> <next> <block type="create" id="kr8e!^;dw71|`+1*9Cv%"> <field name="NAME">BS32.Waschmaschine.wait_status</field> <value name="VALUE"> <block type="logic_boolean" id="1vdh}BlPp5CW8Gq0=_94"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="create" id="(0:fK2#.Ea}MNeUvn?/{"> <field name="NAME">BS32.Waschmaschine.power_start</field> <value name="VALUE"> <block type="math_number" id="j?lK5R8si7^hWd6A#~8t"> <field name="NUM">0</field> </block> </value> <next> <block type="on" id="KqJdA_zOB)2fbog)!N1)"> <field name="OID">shelly.0.SHSW-PM#A4CF12F400AA#1.Relay0.Power</field> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="debug" id="H|d!a]26CSjJ!xIY(w=[" disabled="true"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="eh!`ju5X(Bs/CvKM|R/*"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="v5kenIbkS_Ac%|@G^TmV"> <field name="TEXT">actual power: </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="/5%vG/e~YOK0}KvmKyl/"> <field name="VAR" id="n1z{RD[A#HVTG]8!X55V">actual_power</field> </block> </value> </block> </value> <next> <block type="debug" id="M9M.sd~;3W,vs$/lWayy" disabled="true"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="JA)6[sNxgp{3@}X$?^ZV"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="G]-_{6C.cPW0v)i({EKs"> <field name="TEXT">wait: </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="/[cSr4;uIg1*5jq%ee(h"> <field name="VAR" id="SGZ1H`:rT3@9pZC1p/dc">wait_status</field> </block> </value> </block> </value> <next> <block type="debug" id="zL@`_~W:X|IQp=Ec,s+-" disabled="true"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="CX{U?0bVPhc9Yvg(~TES"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="#B%J;@$yPEWYWU%Gpg(="> <field name="TEXT">won: </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="HdB.cTg$E2~bEnIF]?t6"> <field name="VAR" id="O%z-ZR5AF}I=)hIt`vhx">won</field> </block> </value> </block> </value> <next> <block type="debug" id="~b6gv``]-~v.s$1M,8jp" disabled="true"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="+^D{!rEbqSlT:39#(CO?"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="q0{_S*d**]{{%]FwTXvd"> <field name="TEXT">verbrauch: </field> </block> </value> <value name="ADD1"> <block type="get_value" id="oJ$*?IEuHRB.j!-O,1O9"> <field name="ATTR">val</field> <field name="OID">javascript.0.BS32.Waschmaschine.verbrauch</field> </block> </value> </block> </value> <next> <block type="variables_set" id="o?yLT0R6D^=K2iPigdUA"> <field name="VAR" id="n1z{RD[A#HVTG]8!X55V">actual_power</field> <value name="VALUE"> <block type="get_value" id="dUVqiU]{{P$0^-^Ay}J_"> <field name="ATTR">val</field> <field name="OID">shelly.0.SHSW-PM#A4CF12F400AA#1.Relay0.Power</field> </block> </value> <next> <block type="variables_set" id="o/;o?[l.ch[H3/W]@wVx"> <field name="VAR" id=")g$SO)J%^HoLN3|sYMiy">standby_power</field> <value name="VALUE"> <block type="math_number" id="26x)Sf%n^,BlU,r$y}J^"> <field name="NUM">3.5</field> </block> </value> <next> <block type="variables_set" id="biH}+twiCi-Sk()X!~@#"> <field name="VAR" id="Z=o);0Ep2ZL/+[9Ia):p">on_power</field> <value name="VALUE"> <block type="math_number" id="u*{vpjUJ5=#2!U!W4my-"> <field name="NUM">10</field> </block> </value> <next> <block type="variables_set" id="dYW~4eL^}iW/;}l#}vgE"> <field name="VAR" id="O%z-ZR5AF}I=)hIt`vhx">won</field> <value name="VALUE"> <block type="get_value" id="J4vY[GP)e?Mx[R]CBsyv"> <field name="ATTR">val</field> <field name="OID">javascript.0.BS32.Waschmaschine.ON</field> </block> </value> <next> <block type="variables_set" id="keP0-d_K8fL8UGJ/|.pL"> <field name="VAR" id="SGZ1H`:rT3@9pZC1p/dc">wait_status</field> <value name="VALUE"> <block type="get_value" id=";E(WNE#]eF`dHwYS~`%:"> <field name="ATTR">val</field> <field name="OID">javascript.0.BS32.Waschmaschine.wait_status</field> </block> </value> <next> <block type="controls_if" id="*TsQ9Te-vsxc.R~;MIJg"> <mutation elseif="3"></mutation> <value name="IF0"> <block type="logic_operation" id="MQ-3sh@QmtJf9)muV84i"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="ZP,|~/ZLYb5i?e4g-fHy"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="Ky1kt^qsYkz//}I;UH/M"> <field name="VAR" id="O%z-ZR5AF}I=)hIt`vhx">won</field> </block> </value> <value name="B"> <block type="logic_boolean" id="pg*c=%`Xk!O![`!j}6np"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="r__we4H6Y[,)Pxsz=N%x"> <field name="OP">GT</field> <value name="A"> <block type="variables_get" id="+UGMoha9kLIvOL7tmPPD"> <field name="VAR" id="n1z{RD[A#HVTG]8!X55V">actual_power</field> </block> </value> <value name="B"> <block type="variables_get" id="l![`T=dTh#hq+/TNYQpZ"> <field name="VAR" id=")g$SO)J%^HoLN3|sYMiy">standby_power</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="comment" id="+s{6@[3Nc${L.Gm,8M)}"> <field name="COMMENT">Start, WON ist aus und Power größer Start-Power</field> <next> <block type="debug" id="yc2WB+O5L./5l7AY9e#$"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="{:T5F7`}S.$,S`w(zZK1"> <field name="TEXT">test</field> </shadow> <block type="text" id="BYgP#cg4^@+wF@gZnJg#"> <field name="TEXT">WM: einschalten</field> </block> </value> <next> <block type="update" id="])RM0j-$t#8dON`$:?~N"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.BS32.Waschmaschine.ON</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id=":?N.q*(x^q$*/11Ew%n,"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="update" id="!JeiJ%7(a;(D#GL/G8W$"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.BS32.Waschmaschine.wait_status</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="V%P0tl5u[8nNZvoiXu:d"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="update" id="$uB(y5JWR]IH|Z#@Vqx2"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.BS32.Waschmaschine.power_start</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="get_value" id="miDE1w$UqN9HOQf/$LUG"> <field name="ATTR">val</field> <field name="OID">shelly.0.SHSW-PM#A4CF12F400AA#1.Relay0.Energy</field> </block> </value> <next> <block type="update" id="$g{SdgR7dI1h_M-[RP[c"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.BS32.Waschmaschine.verbrauch</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="B$kYAu60[9{xsj$D@HHo"> <field name="NUM">0</field> </block> </value> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> <value name="IF1"> <block type="logic_operation" id="k:kZrrhU+{1wx#L5#w@L"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="671.iRrzN^EH3Xj14!8)"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="fcFyu-/XW.^IV@JbswUx"> <field name="VAR" id="O%z-ZR5AF}I=)hIt`vhx">won</field> </block> </value> <value name="B"> <block type="logic_boolean" id="7I$k~cIe]A(`|vTS(=F9"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <value name="B"> <block type="logic_operation" id="w#jlI|Jfef_sdS37H/)g"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="PX1OQR$wBmEe{+4wg-3T"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id=".S^nWZBJR|GzLbQ`O#`D"> <field name="VAR" id="SGZ1H`:rT3@9pZC1p/dc">wait_status</field> </block> </value> <value name="B"> <block type="logic_boolean" id="Fy-:lLqOtd-DL^1_AN`j"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="Bc@%|gCH3+PO([%L;!0r"> <field name="OP">LT</field> <value name="A"> <block type="variables_get" id="[+An*vhjxH/TkiTt|wPw"> <field name="VAR" id="n1z{RD[A#HVTG]8!X55V">actual_power</field> </block> </value> <value name="B"> <block type="variables_get" id="`+}}B}V!Hpzt%Ui0r9Hm"> <field name="VAR" id=")g$SO)J%^HoLN3|sYMiy">standby_power</field> </block> </value> </block> </value> </block> </value> </block> </value> <statement name="DO1"> <block type="comment" id="=+WfUrDNSM_{_G%#01K~"> <field name="COMMENT">WON ist an und wait ist false und Power < standby</field> <next> <block type="debug" id="c!|VS7nkQ*Q;Jz3H2HPV"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text" id=";]zY[PGUZ:ddAIt}~^(?"> <field name="TEXT">WM: power < standby, timer startet</field> </block> </value> <next> <block type="update" id="^S{E:6Q3E:cOXLl]xdz*"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.BS32.Waschmaschine.wait_status</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="50I2I=S`m6~.KE}/un#M"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="timeouts_settimeout" id="[-$lT^GVp1*PaU1X3P3W"> <field name="NAME">ausschalten</field> <field name="DELAY">20</field> <field name="UNIT">min</field> <statement name="STATEMENT"> <block type="debug" id="}WD3(miU]BP:,77782w^"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text" id=".lEr:[EP[q@Z9h1k!y^t"> <field name="TEXT">WM: Ende, setze AUS</field> </block> </value> <next> <block type="update" id="sdJ-yYw*{IveisAr9B6P"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.BS32.Waschmaschine.ON</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="y(khG6h0$k]nm+W.e$2t"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="update" id="nIibe/wunC6g#R]^E;=Z"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.BS32.Waschmaschine.wait_status</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="aVp-K:t?Rp`??rPkHybD"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="update" id="i]^viZ6]~FE$[E-Gcj/k"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.BS32.Waschmaschine.verbrauch</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_rndfixed" id="u*+BP=:Iy9@qr@NMq8if"> <field name="n">1</field> <value name="x"> <shadow type="math_number" id="flLf-K-B}/mg0/bI-UDW"> <field name="NUM">3.1234</field> </shadow> <block type="math_arithmetic" id="1+O(m[I]i,.^-kX}l4q2"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number" id="O~zSUcvuwmRuyeI*gK;Z"> <field name="NUM">1</field> </shadow> <block type="get_value" id="*elD-U){/gNR,8#=dV_5"> <field name="ATTR">val</field> <field name="OID">shelly.0.SHSW-PM#A4CF12F400AA#1.Relay0.Energy</field> </block> </value> <value name="B"> <shadow type="math_number" id="|m|_K)owfP90LK0*heYe"> <field name="NUM">1</field> </shadow> <block type="get_value" id="*_Bq=FP!dSmZX4VB?yvi"> <field name="ATTR">val</field> <field name="OID">javascript.0.BS32.Waschmaschine.power_start</field> </block> </value> </block> </value> </block> </value> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </statement> <value name="IF2"> <block type="logic_operation" id="]Jyn,?1j:c(xM^+;;*8]"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="vmcQSuAc4FD^%R|Lm,Ob"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="[{e/|hN$2FT#6cY6%mVG"> <field name="VAR" id="O%z-ZR5AF}I=)hIt`vhx">won</field> </block> </value> <value name="B"> <block type="logic_boolean" id="^CPttO!TlTo%gZ?SHUgr"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <value name="B"> <block type="logic_operation" id="%oRl-?u)V;ijCiKMlgBn"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id=";vBzfldWgMdsgzzPznB?"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="|x+w[I]=Bnq;N5mQ-y#@"> <field name="VAR" id="SGZ1H`:rT3@9pZC1p/dc">wait_status</field> </block> </value> <value name="B"> <block type="logic_boolean" id="z02Kl|ip!CV^BQ6`~G##"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="z5|b|TkpdWWAnbKhYJd8"> <field name="OP">GT</field> <value name="A"> <block type="variables_get" id="bJ]gRx:IyJp@TSs8/4-)"> <field name="VAR" id="n1z{RD[A#HVTG]8!X55V">actual_power</field> </block> </value> <value name="B"> <block type="variables_get" id="UdP8qH}Zg/+9wOW.K9%B"> <field name="VAR" id=")g$SO)J%^HoLN3|sYMiy">standby_power</field> </block> </value> </block> </value> </block> </value> </block> </value> <statement name="DO2"> <block type="comment" id="0#o1Ts2Ou?EAp};KbB=2"> <field name="COMMENT">WON ist an, wait ist true und Power größer standby</field> <next> <block type="debug" id="G[QB9iw/:~hJzVlna!k6"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text" id="L+fk.CK{J1m45yh|PF{z"> <field name="TEXT">WM: power > standby, lösche timer</field> </block> </value> <next> <block type="timeouts_cleartimeout" id="P0;)rGIr+EyM;Gp0cIcn"> <field name="NAME">ausschalten</field> <next> <block type="update" id="qq;uA)eI9+cx6,tSY]B8"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.BS32.Waschmaschine.wait_status</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id=";%H42%@?-AB+V|xWL.C#"> <field name="BOOL">FALSE</field> </block> </value> </block> </next> </block> </next> </block> </next> </block> </statement> <value name="IF3"> <block type="logic_operation" id="t=*a_VeW`A*(!/L5F_JC"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="z(d7;fZ|_M_My|Mt|p~$"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="FiC?bU/G?N.Z~.k]:QZP"> <field name="VAR" id="O%z-ZR5AF}I=)hIt`vhx">won</field> </block> </value> <value name="B"> <block type="logic_boolean" id="/r{|;oSerVvG8$tFcCOx"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <value name="B"> <block type="logic_operation" id="y1c!HU;%HdG:l-hiqMlJ"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="8w*x9xcly^hgLz2%}/qO"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="yPx|~ejP3n%Q%`vCC0Z3"> <field name="VAR" id="SGZ1H`:rT3@9pZC1p/dc">wait_status</field> </block> </value> <value name="B"> <block type="logic_boolean" id="rM]i!p[xs!@(hk|lE5AD"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="v[cH!_}[LV[YilYj4aeY"> <field name="OP">GT</field> <value name="A"> <block type="variables_get" id="m2U{yNUCOjLo#n,]=M)V"> <field name="VAR" id="n1z{RD[A#HVTG]8!X55V">actual_power</field> </block> </value> <value name="B"> <block type="variables_get" id="]pa},6U5pVr|vt.S4{7V"> <field name="VAR" id=")g$SO)J%^HoLN3|sYMiy">standby_power</field> </block> </value> </block> </value> </block> </value> </block> </value> <statement name="DO3"> <block type="comment" id="?r`uZ,l)yvA!D-3~F2cL"> <field name="COMMENT">WON ist an, wait ist false und Power größer onpower</field> <next> <block type="debug" id="9tL~]$-[Oe/UUdXx(0~k" disabled="true"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text" id="Fa|VNrW[A54BCBD(]qp8"> <field name="TEXT">WM: power > standby, WM läuft, aktueller Verbrauch:</field> </block> </value> <next> <block type="debug" id="uhw2QNF@X{}M/H0HHRTc" disabled="true"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="math_rndfixed" id=".)Q(p!sT@*9^ny+{NT+;"> <field name="n">1</field> <value name="x"> <shadow type="math_number"> <field name="NUM">3.1234</field> </shadow> <block type="math_arithmetic" id="^8WPA$TDL;7m4Vv#2{)5"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number" id="aZ93]6k][TeTJ@B-x,n0"> <field name="NUM">1</field> </shadow> <block type="get_value" id="5PmRP44(DTb5GM6x/U6u"> <field name="ATTR">val</field> <field name="OID">shelly.0.SHSW-PM#A4CF12F400AA#1.Relay0.Energy</field> </block> </value> <value name="B"> <shadow type="math_number"> <field name="NUM">1</field> </shadow> <block type="get_value" id="EjxhMW!l@z$ElqX*7JxK"> <field name="ATTR">val</field> <field name="OID">javascript.0.BS32.Waschmaschine.power_start</field> </block> </value> </block> </value> </block> </value> <next> <block type="update" id="V7a.2%g0@]vFNnbE!sUd"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.BS32.Waschmaschine.verbrauch</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_rndfixed" id="D-NJLZ60=9KNCh!!6Fuf"> <field name="n">1</field> <value name="x"> <shadow type="math_number"> <field name="NUM">3.1234</field> </shadow> <block type="math_arithmetic" id="]t0_{fZ:0+h1yZ]$RPJ#"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number"> <field name="NUM">1</field> </shadow> <block type="get_value" id="[j}Fn0FIh*Y4NupZ,Gr_"> <field name="ATTR">val</field> <field name="OID">shelly.0.SHSW-PM#A4CF12F400AA#1.Relay0.Energy</field> </block> </value> <value name="B"> <shadow type="math_number" id="n`?-;-gJGwGQysMn1_h$"> <field name="NUM">1</field> </shadow> <block type="get_value" id="Mha^ND(ht^m:X!jFZqwa"> <field name="ATTR">val</field> <field name="OID">javascript.0.BS32.Waschmaschine.power_start</field> </block> </value> </block> </value> </block> </value> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> <next> <block type="on" id="e;nI/Udc$HRSE2=u5nAZ"> <field name="OID">javascript.0.BS32.Waschmaschine.ON</field> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="controls_if" id="0=FPz^;8Cv|r-,V-d*o*"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="9mS8`o}(`-GZ=-F`Z%2c"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="B%Uya)mu|?y4Ufc,+R+W"> <field name="ATTR">val</field> <field name="OID">javascript.0.BS32.Waschmaschine.ON</field> </block> </value> <value name="B"> <block type="logic_boolean" id="}S2/;jHc,uVPrs%5G?]R"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> <statement name="DO0"> <block type="comment" id="b+__nM(,-$w3:^,;)l{x"> <field name="COMMENT">Wechsel ON>OFF</field> <next> <block type="update" id="?IKWAKlb%fF%|{:eM/Oa"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.BS32.Systemlog</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="FA,}j;*[E1gCXH/L?8sJ"> <field name="TEXT">Waschmaschine ausgeschaltet</field> </block> </value> <next> <block type="pushover" id="t:59o+x`Is_}YvzDDp~-"> <field name="INSTANCE"></field> <field name="SOUND"></field> <field name="PRIORITY">0</field> <field name="LOG"></field> <value name="MESSAGE"> <shadow xmlns="http://www.w3.org/1999/xhtml" type="text"> <field name="TEXT">text</field> </shadow> <block type="text_join" id="4W!CY2kkdhbXk$^f[OS%"> <mutation items="4"></mutation> <value name="ADD0"> <block type="text" id="lgp6-Kmg)IP|./@*LFA;"> <field name="TEXT">Die Waschmaschine ist jetzt fertig!</field> </block> </value> <value name="ADD1"> <block type="text" id="K6WkbIjUE.RoS;2Fov7{"> <field name="TEXT"> Verbrauch: </field> </block> </value> <value name="ADD2"> <block type="math_rndfixed" id="J`#-63Bij9X*/P}`t8lx"> <field name="n">1</field> <value name="x"> <shadow type="math_number"> <field name="NUM">3.1234</field> </shadow> <block type="get_value" id="~%q(pC5PE@a{Imm?zFmR"> <field name="ATTR">val</field> <field name="OID">javascript.0.BS32.Waschmaschine.verbrauch</field> </block> </value> </block> </value> <value name="ADD3"> <block type="text" id="(r*mv@!btCH-D[j{(-=+"> <field name="TEXT"> Wh</field> </block> </value> </block> </value> </block> </next> </block> </next> </block> </statement> <statement name="ELSE"> <block type="comment" id="2=S6lD|q;r2kt78IRI|:"> <field name="COMMENT">Wechsel ON>OFF</field> <next> <block type="update" id="#IGL5LYZT7gd1UN|-Djj"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.BS32.Systemlog</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="]qUSmss@bb#20w#Ac1:h"> <field name="TEXT">Waschmaschine eingeschaltet</field> </block> </value> <next> <block type="pushover" id="SyuRtlkV=Y6y=03K0LEK"> <field name="INSTANCE"></field> <field name="SOUND"></field> <field name="PRIORITY">0</field> <field name="LOG"></field> <value name="MESSAGE"> <shadow xmlns="http://www.w3.org/1999/xhtml" type="text"> <field name="TEXT">text</field> </shadow> <block type="text" id="lJp#W5.--N%;AA^flEUW"> <field name="TEXT">Die Waschmaschine läuft jetzt!</field> </block> </value> </block> </next> </block> </next> </block> </statement> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </xml>
Javascript-Export
var actual_power, wait_status, won, standby_power, on_power, ausschalten; createState("BS32.Waschmaschine.ON", false, function () { }); createState("BS32.Waschmaschine.verbrauch", 0, function () { }); createState("BS32.Waschmaschine.wait_status", false, function () { }); createState("BS32.Waschmaschine.power_start", 0, function () { }); on({id: "shelly.0.SHSW-PM#A4CF12F400AA#1.Relay0.Power"/*Power*/, change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; actual_power = getState("shelly.0.SHSW-PM#A4CF12F400AA#1.Relay0.Power").val; standby_power = 3.5; on_power = 10; won = getState("javascript.0.BS32.Waschmaschine.ON").val; wait_status = getState("javascript.0.BS32.Waschmaschine.wait_status").val; if (won == false && actual_power > standby_power) { // Start, WON ist aus und Power größer Start-Power console.log('WM: einschalten'); setState("javascript.0.BS32.Waschmaschine.ON"/*BS32.Waschmaschine.ON*/, true, true); setState("javascript.0.BS32.Waschmaschine.wait_status"/*BS32.Waschmaschine.wait_status*/, false, true); setState("javascript.0.BS32.Waschmaschine.power_start"/*BS32.Waschmaschine.power_start*/, getState("shelly.0.SHSW-PM#A4CF12F400AA#1.Relay0.Energy").val, true); setState("javascript.0.BS32.Waschmaschine.verbrauch"/*BS32.Waschmaschine.verbrauch*/, 0, true); } else if (won == true && wait_status == false && actual_power < standby_power) { // WON ist an und wait ist false und Power < standby console.log('WM: power < standby, timer startet'); setState("javascript.0.BS32.Waschmaschine.wait_status"/*BS32.Waschmaschine.wait_status*/, true, true); ausschalten = setTimeout(function () { console.log('WM: Ende, setze AUS'); setState("javascript.0.BS32.Waschmaschine.ON"/*BS32.Waschmaschine.ON*/, false, true); setState("javascript.0.BS32.Waschmaschine.wait_status"/*BS32.Waschmaschine.wait_status*/, false, true); setState("javascript.0.BS32.Waschmaschine.verbrauch"/*BS32.Waschmaschine.verbrauch*/, Math.round((getState("shelly.0.SHSW-PM#A4CF12F400AA#1.Relay0.Energy").val - getState("javascript.0.BS32.Waschmaschine.power_start").val)*10)/10, true); }, 1200000); } else if (won == true && wait_status == true && actual_power > standby_power) { // WON ist an, wait ist true und Power größer standby console.log('WM: power > standby, lösche timer'); (function () {if (ausschalten) {clearTimeout(ausschalten); ausschalten = null;}})(); setState("javascript.0.BS32.Waschmaschine.wait_status"/*BS32.Waschmaschine.wait_status*/, false, true); } else if (won == true && wait_status == false && actual_power > standby_power) { // WON ist an, wait ist false und Power größer onpower setState("javascript.0.BS32.Waschmaschine.verbrauch"/*BS32.Waschmaschine.verbrauch*/, Math.round((getState("shelly.0.SHSW-PM#A4CF12F400AA#1.Relay0.Energy").val - getState("javascript.0.BS32.Waschmaschine.power_start").val)*10)/10, true); } }); on({id: "javascript.0.BS32.Waschmaschine.ON"/*BS32.Waschmaschine.ON*/, change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("javascript.0.BS32.Waschmaschine.ON").val == false) { // Wechsel ON>OFF setState("javascript.0.BS32.Systemlog"/*BS32.Systemlog*/, 'Waschmaschine ausgeschaltet', true); sendTo("pushover", "send", { message: (['Die Waschmaschine ist jetzt fertig!',' Verbrauch: ',Math.round(getState("javascript.0.BS32.Waschmaschine.verbrauch").val*10)/10,' Wh'].join('')), sound: "" }); } else { // Wechsel ON>OFF setState("javascript.0.BS32.Systemlog"/*BS32.Systemlog*/, 'Waschmaschine eingeschaltet', true); sendTo("pushover", "send", { message: 'Die Waschmaschine läuft jetzt!', sound: "" }); } });
Hallo,
beim Importieren sind die einzelnen Bausteine übereinander und lassen sich nicht fehlerfrei „auseinandernehmen“.
Da auch kein Bild zum Abgleichen vorhanden ist, kriege ich es leider nicht importiert.
Viele Grüße
Wir stellen in Kürze einen Screenshot bereit. Alternativ den JS-Code nutzen, um die Funktionsweise zu testen.
Hallo,
Muss ich diesen Datenpunkt vorher selbst erstellen?
javascript.0.BS32.Systemlog
Mit freundlichen Grüßen
Ja, das ist ein eigener Datenpunkt, in den wir messages schreiben, um die Aktionen nachvollziehbar zu machen. Quasi ein eigenes Debug.
Hallo,
Vielen Dank funktioniert tadellos bei mir.
Jetzt schon das zweite Script von dir.
Mit freundlichen Grüßen
:-)
Schaut sehr gut gelöst aus!
Werde es am Wochenende mit dem Shelly Plug testen.
Wenn ich das gleiche Script für den Trockner nutzen möchte, muss ich dann jediglich das gleiche Script nochmal anlegen und die Namen für Waschmaschine/WM in Trockner abändern?
Gäbe es auch noch die Möglichkeit anhand des gemessenen Stromvebrauchs noch den Kostenpunkt in die Pushnachricht einzupflegen? :D
Ja, genau, bei nochmaliger Verwendung darauf achten, dass die angelegten Datenpunkte unterschiedlich benannt werden und entsprechend anderes shelly device genutzt wird. Die Kosten berechnen sich aus kWh * Strompreis, im Blockly einfach mit Wert von Datenpunkt * 0.27 / 1000 berechnen.
Hallo!
Wirklich ein Super Script. Habe es für meine Waschmaschine als auch den Trockner verwendet. Habe dazu einfach das Script kopiert und überall das Wort „Waschmaschine“ in „Trockner“ geändert. Und natürlich ein anderen Shelly Datenpunkt.
Ich verwende im übrigen den Shelly Plug S dazu,
Komischer weise, habe ich heute irgendwie ein falschen Wert bekommen, so dass ein Waschgang plötzlich mit „-2358.2Wh“ errechnet wurde. Naja. Ich schau es mir mal an.
Aber was mich interessiert ist folgendes Verhalten vom Trockner: Wenn er fertig ist, piept er recht laut. Aber er läuft aller ca, 2min immer wieder an. Als Knitterschutz oder so. Das macht er vielleicht 2h lang. Erst dann geht der Trockner in den Standby, bzw. schaltet sich ab. Wenn ich jetzt das wait auf 1min stelle. Bekommen ich zig Nachrichten gesendet, weil das Script mein der Trockern ist fertig, läuft dann aber wieder an. Wenn ich es aber auf 5min Stelle, wie bei der Waschmaschine – oder wie in deinem Vorschlag auf 20min – Kommt die Meldung eben erst nach 5h (ca. 2-3h Trockner Durchgang + 2h Knitterschutz.) Während des Knitterschutzedurchlaufs geht der Verbrauch auch deutlich über 100W für wenige Sekunden, bzw. Umdrehungen.
Ich bin jetzt nicht der JS Crack, aber wie könnte hier die Erkennung realisiert werden? Die von dir eingebaute Wartepause von 20min ist ja für etwaige Einweichprogramme der Waschmaschine gedacht. Diese gibt es beim Trockner ja nicht. Der läuft und ist dann fertig.
Ja, den Knitterschutz zu erkennen ist schwierig. Idee: Mitzählen, wie häufig in einem Abstand von geringer als 2,5min der Trockner anspringt, wenn z.B. 5x hintereinander die Zeit zwischen Standby und Strombezug kleiner als 2,5min ist, dann nehmen wir an, dass der Trockner sich im Knitterschutz-Modus befindet und der Trockenvorgang beendet ist, end of script. :-)
Leider funktioniert der import nicht.
TypeError: Unknown block type: pushover
Noch einfacher geht es mit dem Adapter device reminder. Dort kann man dann auch Alexa/Goolge mit einbinden.
Zuletzt war die Ermittlung des Verbrauchs des letzten Vorgangs nicht möglich, das ist der einzige Unterschied.