Skip to content

Latest commit

 

History

History
773 lines (696 loc) · 34.1 KB

README.md

File metadata and controls

773 lines (696 loc) · 34.1 KB

Logo

ioBroker.worx Adapter

Description

Instance settings

  • App Email: Your APP Username (eMail)
  • App Password: Your APP Password
  • App Name: Choose your device
  • Update interval in minutes Interval to update all data (Range from 10 to 1440 possible)
  • Delay for EdgeCut: When should EdgeCut start (example 5 seconds to lawn)
  • Distance and time in min and m: Default h and km
  • Updating MQTT data after token update.: Loads the Worx data after the refresh token.

Instance Settings img/instance.png

Folder

  • activityLog: Your activity log (Wire & Vision / control possible)
  • areas: Areas (Wire / control possible)
  • multiZones: Multizones (Vision / control possible)
  • calendar: Time schedule (Wire & Vision / control possible)
  • Modules: Your module(s) (Wire & Vision / control possible)
  • mower: Your mower (Wire & Vision / control possible)
  • product: All properties of device (Wire & Vision / readonly)
  • rawMqtt: All data from the cloud (Wire & Vision / readonly)

Folder img/all_folders.png

activityLog (Wire and Vision)

  • last_update: Last update as timestamp (Wire & Vision / readonly)
  • manuell_update: Loads the current activity log (automatically after status changes - Wire & Vision / control possible)
  • payload: Activity log as JSON Table (for VIS or Blockly)

Activity img/activity.png

areas (wire)

  • actualArea: Current
  • actualAreaIndicator: Next array zone start
  • area_0: Start of zone 1 in meters (array=0) (changeable)
  • area_1: Start of zone 2 in meters (array=1) (changeable)
  • area_2: Start of zone 3 in meters (array=2) (changeable)
  • area_3: Start of zone 4 in meters (array=3) (changeable)
  • startSequence: Array zone start (0-9 events) e.g. Start in Zone 3 only [2,2,2,2,2,2,2,2,2,2] (changeable)
  • zoneKeeper: Safe driving in narrow zone crossings (Areas must be created) (as of Firmware 3.30) (changeable)

Area img/areas.png

calendar (Wire)

  • E.g. time setting for wednesday

    • wednesday.borderCut: With or without bordercut (Change value without delay) (changeable)
    • wednesday.startTime: Starttime hh:mm (0-23/0-59) e.g. 09:00 (Change value without delay) (changeable)
    • wednesday.workTime: Working time in minutes (180 min = 3h) e.g. 30 = endtime 09:30 (Change value without delay) (changeable)
    • calJson_sendto: If all States are set, then press button to send (with a 1,1 second delay). The mower will now mow for 30 minutes (changeable)
    • calJson_tosend: This data is sent to Mqtt (Both mowing schedule/is set automatically). You can also create this JSON yourself. (changeable)
    • calendar.calJson: Array for the weekly mowing plan. You can also create this ARRAY yourself. (mowing schedule 1/is set automatically - for wire only) (changeable)
    • calendar.calJson2: Array for the weekly mowing plan. You can also create this ARRAY yourself. (mowing schedule 2/is set automatically - for wire only) (changeable)

Folder img/calendar.png

calendar (Vision)

  • E.g. time setting for friday

  • As standard, 2 timeslots are created. If 3 slots are created in the APP, 3 will also be created in ioBroker. If it is reduced again to 2, these slots will be deleted in ioBroker. The day with the most slots is used as a reference for all days.

    • friday.time_0.borderCut: With or without bordercut (Change value without delay) (changeable)
    • friday.time_0.startTime: Starttime hh:mm (0-23/0-59) e.g. 09:00 (Change value without delay) (changeable)
    • friday.time_0.workTime: Working time in minutes (180 min = 3h) e.g. 30 = Endtime 09:30 (Change value without delay) (changeable)
    • friday.time_0.enabled_time: Activate or deactivate time. (set without delay) (can be changed)
    • friday.time_0.zones: Which zones should be approached, e.g. Example [1,2,3] (set without delay) (can be changed)
    • calJson_sendto: If all States are set then set this button to true (with a delay of 1.1). The mower will now mow for 30 minutes! (changeable)
    • calJson_tosend: This JSON is automatically filled and then sent to Mqtt. Of course you can also create it yourself. (changeable)
    • add_timeslot: An additional timeslot is added. Unused timeslots are removed after a restart. (changeable)

Folder img/calendar.png Folder img/calendar.png

Example Timeslot (Vision)

  • calJson_tosend This JSON would enter 1 time on Sunday and delete all other days. The entire week must always be submitted.
[
    {
        "e": 1, // 0=deactivated/1=activated - Set 0 for deactivated this slot
        "d": 0, // Days 0=sunday, 1=monday, 2=tuesday, 3=wednesday, 4=thursday, 5=friday, 6=saturday
        "s": 360, // Start time in minutes 06:00 (360/60) - (320/60 = 5 hours and 20 minutes)
        "t": 180, // Mowing time in minutes = End time 09:00 (180/60) - (200/60 = 3 hours and 20 minutes)
        "cfg": {
            "cut": {
                "b": 1, // 0=without BorderCut/1=with BorderCut
                "z": [1] // Which zones [1,2,6]
            }
        }
    }
]

modules (Wire and Vision)

  • Off Limit Module (Wire and Vision)

    • DF.OLMSwitch_Cutting: Prevents magnetic tape from being run over - true-on/false-off
    • DF.OLMSwitch_FastHoming: Fast return to the charging station - using shortcuts made from magnetic strips - true-on/false-off
  • ACS Module (Wire only)

    • US.ACS: Enable or disable ACS - 1-on/0-off
    • US.ACS_Status: Status from ACS Module
  • EA Module (Vision only)

    • EA.height: Height adjustment of mower deck from 30-60 in 5 mm increments
  • HL Module (Vision only)

    • HL.status: Status head light
    • HL.enabled: Head light installed yes = 1/no = 0
    • HL.on: Daylight = 0/Darkness = 1

Module img/module.png Module img/module_ea.png Module img/module_hl.png

mower (Wire and Vision)

  • AutoLock: Auto lock true-on/false-off (wire & Vision/changeable)
  • AutoLockTimer: Timer auto lock max. 10 minutes in 30 second steps (wire & Vision/changeable)
  • batteryChargeCycle: Battery charge cycle (wire & Vision/readonly)
  • batteryCharging: Battery charging false->no/true->yes (wire & Vision/readonly)
  • batteryState: Battery state in % (wire & Vision/readonly)
  • batteryTemperature: Battery temperature in celsius (wire & Vision/readonly)
  • batteryVoltage: Battery voltage in Volt (wire & Vision/readonly)
  • cameraStatus: Status Camera 0=OK/1=Error (Vision/readonly)
  • cameraError: Camera error 0=OK/1=Error (Vision/readonly)
  • cutOverSlabs: Cut over slabs on = true / off = false (Vision/changeable)
  • direction: Direction in degrees (wire & Vision/readonly)
  • edgecut: Start EdgeCut (wire & Vision/changeable)
  • error: Error message from mower (wire & Vision/readonly)
{
    "states": {
        "0": "No error", //(Draht & Vision & RTK)
        "1": "Trapped", //(Draht & Vision & RTK-Body)
        "2": "Lifted", //(Draht & Vision & RTK-Body)
        "3": "Wire missing", //(Draht)
        "4": "Outside boundary", //(Draht & Vision & RTK-Body)
        "5": "Raining", //(Draht & Vision & RTK-Body)
        "6": "Close door to cut grass", //(Draht)
        "7": "Close door to go home", //(Draht)
        "8": "Blade motor fault", //(Draht & Vision & RTK-Body)
        "9": "Wheel motor fault", //(Draht & Vision & RTK-Body)
        "10": "Trapped timeout fault", //(Draht & Vision & RTK-Body)
        "11": "Upside down", //(Draht & Vision & RTK-Body)
        "12": "Battery low", //(Draht & Vision & RTK)
        "13": "Wire reversed", //(Draht)
        "14": "Charge error", //(Draht & Vision & RTK-Body)
        "15": "Home search timeout", //(Draht & Vision)
        "16": "Wifi locked", //(Draht & Vision)
        "17": "Battery over temperature", //(Draht & Vision & RTK)
        "18": "Dummy model", //(Draht)
        "19": "Battery trunk open timeout", //(Draht & Vision)
        "20": "Wire signal out of sync", //(Draht)
        "100": "Charging station docking error", //(RTK-Body)
        "101": "HBI error", //(RTK-Body)
        "102": "OTA upgrade error", //(Vision & RTK)
        "103": "Map error", //(RTK)
        "104": "Excessive slope", //(RTK-Body)
        "105": "Unreachable zone", //(RTK-Body)
        "106": "Unreachable charging station", //(RTK-Body)
        "107": "Calibration needed", //(RTK-Head)
        "108": "Insufficient sensor data", //(RTK)
        "109": "Training start disallowed", //(RTK)
        "110": "Camera error", //(Vision)
        "111": "Lawn exploration required", //(Vision)
        "112": "Mapping exploration failed", //(Vision)
        "113": "RFID reader error", //(Vision)
        "114": "Headlight error", //(Vision)
        "115": "Missing charging station", //(RTK-Body)
        "116": "Blade height adjustment blocked", //(Vision & RTK-Body)
        "117": "Unsupported blade height", //(Vision & RTK-Body)
        "118": "Manual firrnware upgrade required", //(Vision & RTK-Body)
        "119": "Area limit exceeded", //(RTK-Body)
        "120": "Charging station undocking error" //(RTK-Body)
    }
}

Mower img/mower_1.png

  • firmware: Current installed firmware (wire & Vision/readonly)
  • firmware_available: Available firmware (wire & Vision/readonly)
  • firmware_available_all: Last available firmware as JSON - This JSON will be updated when a new update is available (wire & Vision/readonly)
{
    "mandatory": false,
    "product": {
        "uuid": "1236ll8d-0000-0000-9999-07ff6690003f",
        "version": "3.30.0+1",
        "released_at": "2023-05-24",
        "changelog": "\tSupport for new models \tWR166E and WR184E\n\tImproved Grass cutting coverage\n\tImproved ACS\n\tAdded Zone Keeper function (need to be enabled by app)\n\tImproved wheel torque algorithm\n\tNew FML firmware\n\tFixed \"FML\" and \"Radiolink\" Activation problem\n\tFixed some translations error\n\tRain delay can now be cleared pressing START / HOME button, (1 minute after countdown has started)\n\tImproved PRO Battery management\n\tImproved boundary wire recognition\n\tFixed border cut when zones are active\n\tNew wifi firmware for board HW REV > 7\n\nThe Worx Landroid team would like to thank our amazing beta testers, with hundreds of hours of their own free time to make this firmware possible."
    }
}
  • firmware_available_date: Date available firmware - Dummy 1970-01-01 when the adapter is reinstalled and no update is available (wire & Vision/readonly)
  • firmware_body Value from dat.fw (Vision/readonly)
  • firmware_head Value from dat.head.fw (Vision/readonly)
  • firmware_update_start: Start firmware update in 2 steps - see below firmware_update_start_approved (wire & Vision/changeable)
  • firmware_update_start_approved: Start firmware update - firmware_update_start must be set to true (wire & Vision/changeable)
  • gradient: Gradient in degrees (wire & Vision/readonly)
  • inclination: Inclination in degrees (wire & Vision/readonly)
  • last_command: Last Request from iobroker or APP as JSON Table (wire & Vision/readonly)
  • last_update Last update (wire & Vision/readonly)
  • last_update_connection Which connection (Mqtt or Cloud / wire & Vision/readonly)
  • mowTimeExtend: Mow time extend in % Range: -100%->100% (wire/changeable)
  • mowerActive: Pause mowing plan (wire/changeable)
  • mqtt_update: Update Mqtt data max. 150/day (wire & Vision/changeable)
  • mqtt_update_count: Counter Update Mqtt data (wire & Vision/readonly)

Mower img/mower_2.png

  • oneTimeJson: One-time mowing as JSON (wire & Vision/changeable)
{
    "wtm": 60, //Minutes
    "bc": 0 //0=w/o bordercut 1=with bordercut or use the next State
}
  • oneTimeStart: One-time mowing start “First set oneTimeWithBorder, oneTimeWorkTime and oneTimeZones for Vision” - with a 1,1 second delay (wire & Vision/changeable)
  • oneTimeWithBorder: With bordercut - Change value without delay (wire & Vision/changeable)
  • oneTimeWorkTime: Worktime max. 8h in 30 minute steps - Change value without delay (wire & Vision/changeable)
  • oneTimeZones: Set zones [1,2,4] (Vision/changeable)
  • online: Mower online (wire & Vision/readonly)
  • partyModus: Partymodus turn on/off (wire & Vision/changeable)
  • pause: Mower break turn on/off (wire & Vision/changeable)
  • reset_battery_time: reset battery charges in 2 steps (wire & vision/changeable)
  • reset_battery_time_approved: Confirm reset battery charges - reset_battery_time must be set to true (wire & vision/modifiable)
  • reset_blade_time: reset blade working time in 2 steps (wire & vision/changeable)
  • reset_blade_time_approved: confirm reset blade working time - reset_battery_time must be set to true (wire & vision/changeable)

Mower img/mower_3.png

  • rfidStatus: Status RF sensor 0=OK/1=Error (vision/read only)
  • sendCommand: Send cmd command (wire & Vision/changeable)
{
    "states": {
        "1": "Start", //(wire & Vision & RTK)
        "2": "Stop", //(wire & Vision & RTK)
        "3": "Home", //(wire & Vision & RTK)
        "4": "Follow border", //(wire & Vision & RTK)
        "5": "Wi-Fi Lock", //(wire & Vision unknown)
        "6": "Wi-Fi Unlock", //(wire & Vision)
        "7": "Reset Log", //(wire & Vision & RTK)
        "8": "Pause over border", //(wire & Vision)
        "9": "Safe go home", //(wire & Vision unknown)
        "10": "Start once", //(Vision)
        "100": "Pairing command", //(Vision)
        "101": "Border Cut", //(Vision & RTK)
        "102": "Resume cutting", //(RTK)
        "103": "Start driving", //(Draht & Vision & RTK)
        "104": "Stop driving" //(Draht & Vision & RTK)
    }
}
  • state: True for start mower and False for stop mower (wire & Vision/changeable)
  • status: Status mower (wire & Vision/readonly)
{
    "states": {
        "0": "IDLE", //(wire & Vision & RTK-Body)
        "1": "Home", //(wire & Vision & RTK-Body)
        "2": "Start sequence", //(wire)
        "3": "Leaving home", //(wire & Vision & RTK-Body)
        "4": "Following border", //(wire)
        "5": "Searching home", //(wire & Vision & RTK-Body)
        "6": "Searching border", //(wire & Vision)
        "7": "Mowing", //(wire & Vision & RTK-Body)
        "8": "Lifted", //(wire & Vision & RTK-Body)
        "9": "Trapped", //(wire & Vision & RTK-Body)
        "10": "Blade blocked", //(wire & Vision & RTK-Body)
        "11": "Debug", //(wire)
        "12": "Driving", //(wire & Vision)
        "13": "Digital fence escape", //(wire & Vision)
        "30": "Going home", //(wire & Vision)
        "31": "Zone training", //(wire & Vision)
        "32": "Border Cut", //(wire & Vision)
        "33": "Searching zone", //(wire & Vision)
        "34": "Pause", //(wire & Vision)
        "100": "Map training (completable)", //(RTK-Head)
        "101": "Map processing", //(RTK)
        "102": "Upgrading firmware", //(RTK)
        "103": "Moving to zone", //(RTK-Body)
        "104": "Going home", //(RTK-Body)
        "105": "Ready for training", //(RTK-Head)
        "106": "Map download in progress", //(RTK)
        "107": "Map upload in progress", //(RTK-Head)
        "108": "Map training paused", //(RTK-Head)
        "109": "Map training (not completable)", //(RTK-Head)
        "110": "Border crossing", //(Vision)
        "111": "Exploring lawn", //(Vision)
        "112": "Moving to recovery point", //(RTK-Body)
        "113": "Waiting for position", //(RTK-Body)
        "114": "Map training (driving)", //(Vision & RTK-Body)
        "115": "Map training (rolling back)" //(Vision)
    }
}
  • torque: Wheel torque Range -50->50 (wire & Vision/changeable)
  • totalBladeTime: Total blade time (wire & Vision/readonly)
  • totalDistance: Total distance (wire & Vision/readonly)
  • totalTime: Total working time (wire & Vision/readonly)
  • waitRain: Rain delay max. 12h in 30 minute steps and 0 for off (wire & Vision/changeable)
  • waitRainCountdown Start countdown when the sensor changes from wet to dry (wire & Vision/readonly) (currently disabled)
  • waitRainSensor Status 0 for dry and 1 for wet (wire & Vision/readonly)
  • wifiQuality: Wifi quality (wire & Vision/readonly)
{
    "rain": {
        "s": 0, // 0 for dry and 1 for wet (Wire & Vision)
        "cnt": 59 // Start countdown when changing from s=1 wet to s=0 dry - rain was detected (Wire & Vision)
    }
}

Mower img/mower_4.png

Additionally for vision

  • MultiZones
    • multiZones.zones.zone_1.borderDistance: When boarder cutting, the distance to the edge in mm - allowed 50mm, 100mm, 150mm and 200mm - Set with Blockly without delay - Change is written in multiZones.multiZones (vision/changeable)
    • multiZones.zones.zone_1.chargingStation: 1 If the charging station is found in this zone. 0 for no charging station - Set with Blockly without delay - Change is written to multiZones.multiZones (vision/changeable)
    • multiZones.zones.zone_1.cutOverBorder: 1 to drive over slabs if they are detected, otherwise 0. Set with Blockly without delay - Change is written to multiZones.multiZones (Vision /changeable)
    • multiZones.zones.zone_1.zone_id: Numbering - Start with 1 - (vision/readonly)
    • multiZones.passages.passage_01.tagIdFrom: RFID id of zoneIdFrom - Set with Blockly without delay - Change is written to multiZones.multiZones (vision/changeable)
    • multiZones.passages.passage_01.tagIdTo: RFID id of zoneIdTo - Set with Blockly without delay - Change is written to multiZones.multiZones (vision/changeable)
    • multiZones.passages.passage_01.zoneIdFrom: Zone from (must zoneIdFrom < zoneIdTo) - Set with Blockly without delay - Change is written to multiZones.multiZones (vision/changeable)
    • multiZones.passages.passage_01.zoneIdTo: Zone closed (must zoneIdTo > zoneIdFrom) - Set with Blockly without delay - Change is written to multiZones.multiZones (vision/changeable)
    • multiZones.multiZones: Multizones JSON (Vision/changeable) Example
    • multiZones.sendMultiZonesJson: Send changes to Worx with a delay of 1.1 seconds (vision/changeable)

Example:

{
    "mz": {
        "p": [
            // Passages between zones
            {
                "z1": 1, // Zone from (must z1 < z2)
                "z2": 2, // Zone to (must z2 > z1)
                "t1": "E000000000000000", // RFID id from z1
                "t2": "E0000000KKKKKKKK" // RFID id from z2
            }
        ],
        "s": [
            // The zones themselves
            {
                "id": 1, // Numbering - Start with 1
                "c": 1, // 1 if the charging station is in this zone. 0 for no charging station.
                "cfg": {
                    "cut": {
                        "bd": 100, // Edge cut the distance to the edge in mm - allowed 50mm, 100mm, 150mm and 200mm
                        "ob": 0 // 1 for driving over slabs if they are detected, otherwise 0. Different per-zone is not allowed
                    }
                }
            },
            {
                "id": 2, // Numbering
                "c": 0, // 1 if the charging station is in this zone. 0 for no charging station.
                "cfg": {
                    "cut": {
                        "bd": 100, // Edge cut the distance to the edge in mm - allowed 50mm, 100mm, 150mm and 200mm
                        "ob": 0 // 1 for driving over slabs if they are detected, otherwise 0. Different per-zone is not allowed
                    }
                }
            }
        ]
    }
}

Default without zone:

{
    "mz": {
        "p": [],
        "s": [
            {
                "id": 1,
                "c": 1,
                "cfg": {
                    "cut": {
                        "bd": 150,
                        "ob": 0
                    }
                }
            }
        ]
    }
}

Vision img/areas_vision.png

  • Mower
    • log_improvement: Send improvement log to worx disable/enable (changeable)
    • log_troubleshooting: Send troubleshooting log to worx disable/enable (changeable)

Vision img/logs_vision.png

  • Mower
    • paused: Paused schedule in minutes (changeable)

Vision img/paused_vision.png

info_mqtt (Wire and Vision)

  • incompleteOperationCount: Total number of operations submitted to the connection that have not yet been completed. Unacked operations are a subset of this.
  • incompleteOperationSize: Total packet size of operations submitted to the connection that have not yet been completed. Unacked operations are a subset of this.
  • unackedOperationCount: Total number of operations that have been sent to the server and are waiting for a corresponding ACK before they can be completed.
  • unackedOperationSize: Total packet size of operations that have been sent to the server and are waiting for a corresponding ACK before they can be completed.
  • last_update: Last update from token
  • next_update: Next update from token
  • online: Status MQTT Connection (false=offline/true=online)

Vision img/mqtt_info.png

Example Blockly sendMultiZonesJson Vision

<xml xmlns="https://developers.google.com/blockly/xml">
  <variables>
    <variable id="${]4s$w?n24Az}=7iAIY">mz</variable>
    <variable id="o.FQ]_Xa!tHn2T7Ak{Pt">value</variable>
    <variable id="/@E4iFRMr:x+u?{7yFlB">test</variable>
    <variable id="jxTInS{}mk_)WJa[:,fA">i</variable>
  </variables>
  <block type="procedures_defcustomnoreturn" id="u:w*aBH!92nydG0Mu.1-" x="-87" y="-87">
    <mutation statements="false">
      <arg name="mz" varid="${]4s$w?n24Az}=7iAIY"></arg>
      <arg name="value" varid="o.FQ]_Xa!tHn2T7Ak{Pt"></arg>
    </mutation>
    <field name="NAME">set_bd</field>
    <field name="SCRIPT">bXouY2ZnLmN1dC5iZCA9IDE1MA==</field>
    <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
  </block>
  <block type="variables_set" id="jiP0218}2,Y]B]RdKD~`" x="-87" y="-35">
    <field name="VAR" id="/@E4iFRMr:x+u?{7yFlB">test</field>
    <value name="VALUE">
      <block type="convert_json2object" id=";Ef{FHk_~heeozyHFxci">
        <value name="VALUE">
          <block type="get_value" id="LMfldD:[D4%}yWE8,N0y">
            <field name="ATTR">val</field>
            <field name="OID">worx.0.xxxxxxxxxxxxxxxxxxxx.multiZones.sendMultiZonesJson</field>
          </block>
        </value>
      </block>
    </value>
    <next>
      <block type="controls_forEach" id="D{XG==q$flbH?32eX%D(">
        <field name="VAR" id="jxTInS{}mk_)WJa[:,fA">i</field>
        <value name="LIST">
          <block type="get_attr" id="b~2/cb$WhEj*9i6,(ey5">
            <value name="PATH">
              <shadow type="text" id="+n~;GfHf{,#D!5D}H+m=">
                <field name="TEXT">s</field>
              </shadow>
            </value>
            <value name="OBJECT">
              <block type="variables_get" id="YloS$N%I=6[yk;loD*1O">
                <field name="VAR" id="/@E4iFRMr:x+u?{7yFlB">test</field>
              </block>
            </value>
          </block>
        </value>
        <statement name="DO">
          <block type="procedures_callcustomnoreturn" id="er{Pwq:Y7n_I|CQoup,|">
            <mutation name="set_bd">
              <arg name="mz"></arg>
              <arg name="value"></arg>
            </mutation>
            <value name="ARG0">
              <block type="variables_get" id="(-_i0(y:W}U_x?s(7k%4">
                <field name="VAR" id="jxTInS{}mk_)WJa[:,fA">i</field>
              </block>
            </value>
            <value name="ARG1">
              <block type="math_number" id="{2u/=v!k|yJsOesq[CU^">
                <field name="NUM">150</field>
              </block>
            </value>
            <next>
              <block type="debug" id="b1}}DmS-[_W:+Y+$|%)r">
                <field name="Severity">log</field>
                <value name="TEXT">
                  <shadow type="text" id="7wx?ca_U[S~8DA4}*RXx">
                    <field name="TEXT">test</field>
                  </shadow>
                  <block type="variables_get" id="_zz;w64g-!E$zX$]pvyI">
                    <field name="VAR" id="/@E4iFRMr:x+u?{7yFlB">test</field>
                  </block>
                </value>
              </block>
            </next>
          </block>
        </statement>
        <next>
          <block type="debug" id="o[S0+1%{oLU+r:03tz7=">
            <field name="Severity">log</field>
            <value name="TEXT">
              <shadow type="text" id="7wx?ca_U[S~8DA4}*RXx">
                <field name="TEXT">test</field>
              </shadow>
              <block type="variables_get" id="tjqxQ(MO|CR~/Xq5;Pm[">
                <field name="VAR" id="/@E4iFRMr:x+u?{7yFlB">test</field>
              </block>
            </value>
            <next>
              <block type="control" id="C^lZ^SNIQ#,vh}?hSG_O">
                <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                <field name="OID">worx.0.xxxxxxxxxxxxxxxxxxxx.multiZones.sendMultiZonesJson</field>
                <field name="WITH_DELAY">FALSE</field>
                <value name="VALUE">
                  <block type="convert_object2json" id="z)EXA+%8lB4K#7!Hp1V%">
                    <field name="PRETTIFY">FALSE</field>
                    <value name="VALUE">
                      <block type="variables_get" id="C4np)gS@^Y*?-0I+R6+r">
                        <field name="VAR" id="/@E4iFRMr:x+u?{7yFlB">test</field>
                      </block>
                    </value>
                  </block>
                </value>
              </block>
            </next>
          </block>
        </next>
      </block>
    </next>
  </block>
</xml>

<xml xmlns="https://developers.google.com/blockly/xml">
  <variables>
    <variable id="${]4s$w?n24Az}=7iAIY">mz</variable>
    <variable id="o.FQ]_Xa!tHn2T7Ak{Pt">value</variable>
    <variable id="/@E4iFRMr:x+u?{7yFlB">test</variable>
    <variable id="jxTInS{}mk_)WJa[:,fA">i</variable>
  </variables>
  <block type="procedures_defcustomnoreturn" id="u:w*aBH!92nydG0Mu.1-" x="-87" y="-87">
    <mutation statements="false">
      <arg name="mz" varid="${]4s$w?n24Az}=7iAIY"></arg>
      <arg name="value" varid="o.FQ]_Xa!tHn2T7Ak{Pt"></arg>
    </mutation>
    <field name="NAME">set_bd</field>
    <field name="SCRIPT">bXouY2ZnLmN1dC5iZCA9IDE1MA==</field>
    <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
  </block>
  <block type="variables_set" id="jiP0218}2,Y]B]RdKD~`" x="-87" y="-35">
    <field name="VAR" id="/@E4iFRMr:x+u?{7yFlB">test</field>
    <value name="VALUE">
      <block type="convert_json2object" id=";Ef{FHk_~heeozyHFxci">
        <value name="VALUE">
          <block type="get_value" id="LMfldD:[D4%}yWE8,N0y">
            <field name="ATTR">val</field>
            <field name="OID">worx.0.xxxxxxxxxxxxxxxxxxxx.multiZones.sendMultiZonesJson</field>
          </block>
        </value>
      </block>
    </value>
    <next>
      <block type="controls_forEach" id="D{XG==q$flbH?32eX%D(">
        <field name="VAR" id="jxTInS{}mk_)WJa[:,fA">i</field>
        <value name="LIST">
          <block type="get_attr" id="b~2/cb$WhEj*9i6,(ey5">
            <value name="PATH">
              <shadow type="text" id="+n~;GfHf{,#D!5D}H+m=">
                <field name="TEXT">s</field>
              </shadow>
            </value>
            <value name="OBJECT">
              <block type="variables_get" id="YloS$N%I=6[yk;loD*1O">
                <field name="VAR" id="/@E4iFRMr:x+u?{7yFlB">test</field>
              </block>
            </value>
          </block>
        </value>
        <statement name="DO">
          <block type="procedures_callcustomnoreturn" id="er{Pwq:Y7n_I|CQoup,|">
            <mutation name="set_bd">
              <arg name="mz"></arg>
              <arg name="value"></arg>
            </mutation>
            <value name="ARG0">
              <block type="variables_get" id="(-_i0(y:W}U_x?s(7k%4">
                <field name="VAR" id="jxTInS{}mk_)WJa[:,fA">i</field>
              </block>
            </value>
            <value name="ARG1">
              <block type="math_number" id="{2u/=v!k|yJsOesq[CU^">
                <field name="NUM">150</field>
              </block>
            </value>
            <next>
              <block type="debug" id="b1}}DmS-[_W:+Y+$|%)r">
                <field name="Severity">log</field>
                <value name="TEXT">
                  <shadow type="text" id="7wx?ca_U[S~8DA4}*RXx">
                    <field name="TEXT">test</field>
                  </shadow>
                  <block type="variables_get" id="_zz;w64g-!E$zX$]pvyI">
                    <field name="VAR" id="/@E4iFRMr:x+u?{7yFlB">test</field>
                  </block>
                </value>
              </block>
            </next>
          </block>
        </statement>
        <next>
          <block type="debug" id="o[S0+1%{oLU+r:03tz7=">
            <field name="Severity">log</field>
            <value name="TEXT">
              <shadow type="text" id="7wx?ca_U[S~8DA4}*RXx">
                <field name="TEXT">test</field>
              </shadow>
              <block type="variables_get" id="tjqxQ(MO|CR~/Xq5;Pm[">
                <field name="VAR" id="/@E4iFRMr:x+u?{7yFlB">test</field>
              </block>
            </value>
            <next>
              <block type="control" id="C^lZ^SNIQ#,vh}?hSG_O">
                <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                <field name="OID">worx.0.xxxxxxxxxxxxxxxxxxxx.multiZones.sendMultiZonesJson</field>
                <field name="WITH_DELAY">FALSE</field>
                <value name="VALUE">
                  <block type="convert_object2json" id="z)EXA+%8lB4K#7!Hp1V%">
                    <field name="PRETTIFY">FALSE</field>
                    <value name="VALUE">
                      <block type="variables_get" id="C4np)gS@^Y*?-0I+R6+r">
                        <field name="VAR" id="/@E4iFRMr:x+u?{7yFlB">test</field>
                      </block>
                    </value>
                  </block>
                </value>
              </block>
            </next>
          </block>
        </next>
      </block>
    </next>
  </block>
</xml>

or

<xml xmlns="https://developers.google.com/blockly/xml">
  <variables>
    <variable id="2#Mf$#JFCN9Nw2F2L[?=">x</variable>
    <variable id="fNt-C|86(glunJ:-t=dK">p</variable>
    <variable id="Rci4:iMYXzjoI2k]P^X)">s</variable>
    <variable id="[t-srB,I/UkXaWBk4*A*">list</variable>
    <variable id="]WA|%5f=H9^9uiLc;KS[">new_json</variable>
  </variables>
  <block type="procedures_defcustomreturn" id="@Y/LobsPw4k!jQb)fI!." x="88" y="13">
    <mutation statements="false">
      <arg name="x" varid="2#Mf$#JFCN9Nw2F2L[?="></arg>
      <arg name="p" varid="fNt-C|86(glunJ:-t=dK"></arg>
      <arg name="s" varid="Rci4:iMYXzjoI2k]P^X)"></arg>
    </mutation>
    <field name="NAME">json</field>
    <field name="SCRIPT">eFsicCJdID0gcDsNCnhbInMiXSA9IHM7DQpyZXR1cm4geA==</field>
    <comment pinned="false" h="80" w="160">Describe this function...</comment>
  </block>
  <block type="variables_set" id="WAsPqIMv;bh95{7~Y!D!" x="88" y="63">
    <field name="VAR" id="[t-srB,I/UkXaWBk4*A*">list</field>
    <value name="VALUE">
      <block type="convert_json2object" id="S5uRAnpcGp/7*1b,aum~">
        <value name="VALUE">
          <block type="text" id="}n3]_HIP*7y5GMEo-!c3">
            <field name="TEXT">{p:[],s:[]}</field>
          </block>
        </value>
      </block>
    </value>
    <next>
      <block type="variables_set" id="Kf#KkskB7l|uDiI!(fjq">
        <field name="VAR" id="]WA|%5f=H9^9uiLc;KS[">new_json</field>
        <value name="VALUE">
          <block type="procedures_callcustomreturn" id="K;OJHrji~09PeJ33q.gl">
            <mutation name="json">
              <arg name="x"></arg>
              <arg name="p"></arg>
              <arg name="s"></arg>
            </mutation>
            <value name="ARG0">
              <block type="variables_get" id="ipM^e+~#-hoo0(047Ybo">
                <field name="VAR" id="[t-srB,I/UkXaWBk4*A*">list</field>
              </block>
            </value>
            <value name="ARG1">
              <block type="lists_create_with" id="HJIZHLc]lL0Tgqe$E~Ul">
                <mutation items="0"></mutation>
              </block>
            </value>
            <value name="ARG2">
              <block type="lists_create_with" id="JH=jADj%lYJ(:7%v[o+3">
                <mutation items="1"></mutation>
                <value name="ADD0">
                  <block type="convert_json2object" id="@5BT0}WJ`srV89LD5h?D">
                    <value name="VALUE">
                      <block type="text" id="=.e.D[I2IQ{u!4;(-D-,">
                        <field name="TEXT">{"id":1,"c":1,"cfg":{"cut":{"bd":150,"ob":1}}}</field>
                      </block>
                    </value>
                  </block>
                </value>
              </block>
            </value>
          </block>
        </value>
        <next>
          <block type="control" id="k$;?LM/[x-TbZ^m=F4}i">
            <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
            <field name="OID">worx.0.xxxxxxxxxx.multiZones.sendMultiZonesJson</field>
            <field name="WITH_DELAY">FALSE</field>
            <value name="VALUE">
              <block type="convert_object2json" id="b~2Bz}OiNg{V]!QgN^J7">
                <field name="PRETTIFY">FALSE</field>
                <value name="VALUE">
                  <block type="variables_get" id="b|+SOSd+ZD@*XHPGu*I(">
                    <field name="VAR" id="]WA|%5f=H9^9uiLc;KS[">new_json</field>
                  </block>
                </value>
              </block>
            </value>
          </block>
        </next>
      </block>
    </next>
  </block>
</xml>

or direct

{"p": [],"s": [{"id": 1, "c": 1, "cfg": {"cut": {"bd": 100, "ob": 1}}}]}

img/ok_direct.png

not allowed

img/json_nok.png img/array_nok.png