Re: Offizielle Worx Landroid-S Smarthome Schnittstelle
Hallo liebe iobroker-Gemeinde,
ich möchte Euch hier meine Lösung in iobroker/Blockly zu o.g. Thema vorstellen.
Ausgangssituation war, dass ich mit der Firmware-Version 3.45 meines Landroid S (WR110MI) weiterhin die manuelle Programmierung über den Mähplan via App nutzen möchte.
Nur das Verhalten an Feiertagen und die Ausfahrt aus der Mähroboter-Garage bei Regen (die Überdachung des Mähers in der Station setzt bekanntlich den Regensensor dort faktisch außer Funktion) wollte ich zusätzlich steuern.
Hier die im Blockly-Script von mir verwendeten Adapter bzw. Instanzen:
Mein Mähroboter soll sich unter Weiterverwendung des Mähplanes der WORX Landroid-App wie folgt verhalten:
-
grundlegend kein Ausfahren an Feiertagen
-
kein Ausfahren aus der Station bei Regen, nach dem Regen Aktivierung einer Regenverzögerung von 180 Minuten
Als Trigger zum Start meines Skriptes habe ich parallel die Änderung des Objektes "feiertage.0.heute.b oolean" mit Namen "Feiertag heute?" oder von "openweathermap.0.forecast.current.title" namens "Actual title" verwendet.
Dazu frage ich die aktuelle Wettersituation bei openweathermap mittels Zeitplanung in der zugehörigen Instanz mit einem CRON-Zeitplan "Alle 5 Sekunden", Anzeige "*/5 * * * * *" ab. Damit vermeide ich dann auch nahezu vollständig, dass mein Robi losläuft, obwohl es regent.
Zum Verbleib des Mähroboters in der Station bin ich den dankenswerten Empfehlungen anderer gefolgt (z.B. [https://forum.iobroker.net/topic/9526/offizielle-worx-landroid-s-smarthome-schnittstelle/27] und setze dazu im manuellen Mähplan die prozentuale Erhöhung/Verringerung der wöchentlichen Arbeitszeit mit dem Objekt "landroid-s.2.calendar.mowTimeExtend" namens "Mowing times exceed" auf den Wert "-100 %".
Soll der Märoboter wieder ungehindert nach dem manuellen Mähplan arbeiten, so wird der Wert auf "0 %" zurückgesetzt.
Nach jeder Änderung des Mäherstatus wir eine eMail mit entsprechender Info versendet.
Hier mein Blockly-Skript zum gefälligen Importieren:
<xml xmlns="http://www.w3.org/1999/xhtml">
<variables>
<variable type="undefined" id="timeout_Niederschlag">timeout_Niederschlag</variable>
</variables>
<block type="on_ext" id="cBc$NdcdHpi.Q@JAn%}." x="-237" y="-1087">
<mutation items="2"></mutation>
<field name="CONDITION">ne</field>
<field name="ACK_CONDITION"></field>
<value name="OID0">
<shadow type="field_oid" id="Vq{y=@#fae!,_?nA8m2b">
<field name="oid">openweathermap.0.forecast.current.title</field>
</shadow>
</value>
<value name="OID1">
<shadow type="field_oid" id="!0e%juk95{ZAd}1;NEyZ">
<field name="oid">feiertage.0.heute.boolean</field>
</shadow>
</value>
<statement name="STATEMENT">
<block type="controls_if" id="-RmuH*i]zgNt_kPWih_/">
<mutation elseif="1"></mutation>
<value name="IF0">
<block type="logic_compare" id="BGXc^;UP.3I]?]C4eCRX">
<field name="OP">EQ</field>
<value name="A">
<block type="get_value" id="z!W|)+.%5.BN)!@9vhda">
<field name="ATTR">val</field>
<field name="OID">feiertage.0.heute.boolean</field>
</block>
</value>
<value name="B">
<block type="logic_boolean" id="k*|.}/F^M!eU^o-NKN|%">
<field name="BOOL">TRUE</field>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="timeouts_cleartimeout" id="ye$Q9`RiIsjPMg;O]`P5">
<field name="NAME">timeout_Niederschlag</field>
<next>
<block type="control" id="}*9UNSVy-c3M?Q*bC#ws">
<mutation delay_input="false"></mutation>
<field name="OID">landroid-s.2.calendar.mowTimeExtend</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE">
<block type="text" id="2dj3hB)p$={:LhBVDG?y">
<field name="TEXT">-100</field>
</block>
</value>
<next>
<block type="email" id="U]%N)X/|gyQ7pn~Q7djr">
<field name="INSTANCE"></field>
<field name="IS_HTML">FALSE</field>
<field name="LOG"></field>
<value name="TO">
<shadow type="text" id="Y*Y+)Q{pY[=Vxo7;a+FJ">
<field name="TEXT">xy@web.de</field>
</shadow>
</value>
<value name="TEXT">
<shadow type="text" id="`@Al.-sY!)0-OXF]FQa[">
<field name="TEXT">Heute ist Feiertag. Rasenmäher pausiert.</field>
</shadow>
</value>
<value name="SUBJECT">
<shadow type="text" id="QsQ+!lj9mL4gJ.lS/HE^">
<field name="TEXT">ioBroker - FEIERTAG</field>
</shadow>
</value>
<value name="FROM">
<block type="text" id="Slc!dGbsoIh;TC{JC@oz">
<field name="TEXT">xy@web.de</field>
</block>
</value>
</block>
</next>
</block>
</next>
</block>
</statement>
<value name="IF1">
<block type="logic_compare" id="_hM/Y-{i/AP^eG]?7DpM">
<field name="OP">EQ</field>
<value name="A">
<block type="get_value" id="y^y,~/~@K1zEx]K7tQLo">
<field name="ATTR">val</field>
<field name="OID">feiertage.0.heute.boolean</field>
</block>
</value>
<value name="B">
<block type="logic_boolean" id="Q3_B{)*)rZ.Uf?{j8f?}">
<field name="BOOL">FALSE</field>
</block>
</value>
</block>
</value>
<statement name="DO1">
<block type="controls_if" id="?7cwGUv$m/Ia](Dhec8T">
<mutation elseif="1"></mutation>
<value name="IF0">
<block type="logic_operation" id="o:$fx%Sk~Uxyp[=MN;1-">
<field name="OP">OR</field>
<value name="A">
<block type="logic_compare" id="Q:kRa#4(v-HO|d]DbUH(">
<field name="OP">EQ</field>
<value name="A">
<block type="get_value" id="$AL/Ji+?iutDx=!);528">
<field name="ATTR">val</field>
<field name="OID">openweathermap.0.forecast.current.title</field>
</block>
</value>
<value name="B">
<block type="text" id="yd_W(}W$D?A|,i*-v$Yn">
<field name="TEXT">Rain</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="logic_compare" id="~?+Dk,h_Pm`u@-^.hyb-">
<field name="OP">EQ</field>
<value name="A">
<block type="get_value" id="(?}-=6dj^KTk#%.FuU^b">
<field name="ATTR">val</field>
<field name="OID">openweathermap.0.forecast.current.title</field>
</block>
</value>
<value name="B">
<block type="text" id="x@*9Q`xb9z*{l.]cp0T8">
<field name="TEXT">Snow</field>
</block>
</value>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="timeouts_cleartimeout" id="g1PohIClF9;5wuw4ZARE">
<field name="NAME">timeout_Niederschlag</field>
<next>
<block type="control" id="k0p`o[}5wt|NsH*gT5;1">
<mutation delay_input="false"></mutation>
<field name="OID">landroid-s.2.calendar.mowTimeExtend</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE">
<block type="text" id="Zsh,X%tv?tO#f.b+6,hB">
<field name="TEXT">-100</field>
</block>
</value>
<next>
<block type="email" id="8ypST%Q!}O_A/wMk^$k(">
<field name="INSTANCE"></field>
<field name="IS_HTML">FALSE</field>
<field name="LOG"></field>
<value name="TO">
<shadow type="text" id="~~d=D?icG}oV)}Nx7$%3">
<field name="TEXT">xy@web.de</field>
</shadow>
</value>
<value name="TEXT">
<shadow type="text" id="fHMyek=SJJ+vqH?AHT=E">
<field name="TEXT">Niederschlag zu Hause. Rasenmäher pausiert.</field>
</shadow>
</value>
<value name="SUBJECT">
<shadow type="text" id="IyG%~YD=f_=#b!~QWK+?">
<field name="TEXT">ioBroker - NIEDERSCHLAG</field>
</shadow>
</value>
<value name="FROM">
<block type="text" id="Mg;9VP,.%?U%Z0qg+y2g">
<field name="TEXT">xy@web.de</field>
</block>
</value>
</block>
</next>
</block>
</next>
</block>
</statement>
<value name="IF1">
<block type="logic_operation" id="/+[?mbe}NKe!|%3dCV%^">
<field name="OP">AND</field>
<value name="A">
<block type="logic_compare" id="{d*xRm9(059-jTm(]-j/">
<field name="OP">NEQ</field>
<value name="A">
<block type="get_value" id="~s|7yP$hVf!/Xq)j?2+I">
<field name="ATTR">val</field>
<field name="OID">openweathermap.0.forecast.current.title</field>
</block>
</value>
<value name="B">
<block type="text" id="I+=wECecK]isD5VerJQr">
<field name="TEXT">Rain</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="logic_compare" id="6`F_aR%,n=RIh[dZea8s">
<field name="OP">NEQ</field>
<value name="A">
<block type="get_value" id="qC5fgV/N@,W[g2mSd@z4">
<field name="ATTR">val</field>
<field name="OID">openweathermap.0.forecast.current.title</field>
</block>
</value>
<value name="B">
<block type="text" id="cZXB$q3VYxXV:])}Zt%m">
<field name="TEXT">Snow</field>
</block>
</value>
</block>
</value>
</block>
</value>
<statement name="DO1">
<block type="controls_if" id="Z32{8F5g,HIyMy}O!!yq">
<mutation else="1"></mutation>
<value name="IF0">
<block type="logic_compare" id=")z4RlJ`zw~NhOQ8`8kC`">
<field name="OP">EQ</field>
<value name="A">
<block type="get_value" id="CXSUCLiv8UtGCJ;6LG*x">
<field name="ATTR">val</field>
<field name="OID">landroid-s.2.calendar.mowTimeExtend</field>
</block>
</value>
<value name="B">
<block type="text" id="7Z(_8F$-9j18F3VdLgzF">
<field name="TEXT">-100</field>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="email" id="~6H$Q`:/0R,.X%-2HY9`">
<field name="INSTANCE"></field>
<field name="IS_HTML">FALSE</field>
<field name="LOG"></field>
<value name="TO">
<shadow type="text" id="F-LP_E+mXOP,;ZiWD*Kv">
<field name="TEXT">xy@web.de</field>
</shadow>
</value>
<value name="TEXT">
<shadow type="text" id="sZ4HBxBO!d1Bu$3L+UqJ">
<field name="TEXT">Zu Hause Ende Niederschlag. Rasenmäher pausiert noch 3h.</field>
</shadow>
</value>
<value name="SUBJECT">
<shadow type="text" id="ERD9]q{/G${/VKS~bFl@">
<field name="TEXT">ioBroker - ENDE Niederschlag</field>
</shadow>
</value>
<value name="FROM">
<block type="text" id=":%_@p5h5(O__.SU?8Srh">
<field name="TEXT">xy@web.de</field>
</block>
</value>
<next>
<block type="timeouts_cleartimeout" id="GUyr!KCoGW#@).@2gl1`">
<field name="NAME">timeout_Niederschlag</field>
<next>
<block type="timeouts_settimeout" id="6iLIaT@cB;$yf/.JQ+Qs">
<field name="NAME">timeout_Niederschlag</field>
<field name="DELAY">180</field>
<field name="UNIT">min</field>
<statement name="STATEMENT">
<block type="control" id="hhJ`}s7Wk4):py!+mg-4">
<mutation delay_input="false"></mutation>
<field name="OID">landroid-s.2.calendar.mowTimeExtend</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE">
<block type="text" id="iWY?H|Y{f/E`Aa]3./AI">
<field name="TEXT">0</field>
</block>
</value>
<next>
<block type="email" id="s]7eA(pdZ~Q%0tXq6Bjj">
<field name="INSTANCE"></field>
<field name="IS_HTML">FALSE</field>
<field name="LOG"></field>
<value name="TO">
<shadow type="text" id="uP!GFhCOKC;l[VD6RJ]h">
<field name="TEXT">xy@web.de</field>
</shadow>
</value>
<value name="TEXT">
<shadow type="text" id="YKVNWwL;8r:*}DylTAY~">
<field name="TEXT">Rasen zu Hause wieder trocken. Rasenmäher aktiviert.</field>
</shadow>
</value>
<value name="SUBJECT">
<shadow type="text" id="j(|x)JM78-+ox^L4Orf!">
<field name="TEXT">ioBroker - TROCKEN</field>
</shadow>
</value>
<value name="FROM">
<block type="text" id="}Fl;{3^GMHmo`/*Ng;W5">
<field name="TEXT">xy@web.de</field>
</block>
</value>
</block>
</next>
</block>
</statement>
</block>
</next>
</block>
</next>
</block>
</statement>
<statement name="ELSE">
<block type="timeouts_cleartimeout" id="ogyCa$U+d@%dO{cj0pTN">
<field name="NAME">timeout_Niederschlag</field>
<next>
<block type="control" id="z.f+V53dMlSbB$q(?;#-">
<mutation delay_input="false"></mutation>
<field name="OID">landroid-s.2.calendar.mowTimeExtend</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE">
<block type="text" id="7L2|:y36szT=st)feaXv">
<field name="TEXT">0</field>
</block>
</value>
</block>
</next>
</block>
</statement>
</block>
</statement>
</block>
</statement>
</block>
</statement>
</block>
</xml>
Besonders kniffelig fand ich die timeout-Funktion zur Realisierung der Regenverzögerung. Insbesondere war hier darauf zu achten, dass das Skript nicht in eine Endlosschleife verfällt. Dies konnte ich durch einen jeweils vorgelagerten "stop timeout" Befehl an verschiedenen Stellen erreichen.
Ich freue mich auf Kommentare.