name: Quad switch
products:
  - id: iv8nm7yimgfz2kmx
    model: M604
entities:
  - entity: switch
    translation_key: switch_x
    translation_placeholders:
      x: "1"
    dps:
      - id: 1
        name: switch
        type: boolean

  - entity: switch
    translation_key: switch_x
    translation_placeholders:
      x: "2"
    dps:
      - id: 2
        name: switch
        type: boolean

  - entity: switch
    translation_key: switch_x
    translation_placeholders:
      x: "3"
    dps:
      - id: 3
        name: switch
        type: boolean

  - entity: switch
    translation_key: switch_x
    translation_placeholders:
      x: "4"
    dps:
      - id: 4
        name: switch
        type: boolean

  - entity: time
    category: config
    translation_key: timer_x
    translation_placeholders:
      x: "1"
    dps:
      - id: 7
        type: integer
        name: second
        range:
          min: 0
          max: 86400

  - entity: time
    category: config
    translation_key: timer_x
    translation_placeholders:
      x: "2"
    dps:
      - id: 8
        type: integer
        name: second
        range:
          min: 0
          max: 86400

  - entity: time
    category: config
    translation_key: timer_x
    translation_placeholders:
      x: "3"
    dps:
      - id: 9
        type: integer
        name: second
        range:
          min: 0
          max: 86400

  - entity: time
    category: config
    translation_key: timer_x
    translation_placeholders:
      x: "4"
    dps:
      - id: 10
        type: integer
        name: second
        range:
          min: 0
          max: 86400

  - entity: select
    category: config
    translation_key: initial_state
    dps:
      - id: 14
        name: option
        type: string
        mapping:
          - dps_val: power_off
            value: "off"
          - dps_val: power_on
            value: "on"
          - dps_val: last
            value: memory

  - entity: light
    translation_key: backlight
    category: config
    dps:
      - id: 16
        name: switch
        type: boolean

  # DP17 (cycle_time) is a base64-encoded schedule payload.
  # Observed from Tuya app:
  # - Payload is a sequence of records; each record is 10 bytes:
  #   [ctrl, weekday_mask, on_hi, on_lo, off_hi, off_lo, start_dur_hi,
  #    start_dur_lo, end_dur_hi, end_dur_lo]
  # - Times are minutes since midnight, big-endian
  #   (e.g. 12:00 -> 720 -> 0x02D0).
  # - Durations are minutes, big-endian
  #   (e.g. 01:00 -> 60 -> 0x003C).
  # - weekday_mask bitfield: Sun=bit0 ... Sat=bit6
  #   (e.g. Sun+Tue+Thu+Sat = 0x55).
  # - ctrl encodes switch and enable:
  #     sw1 enabled=0x01 disabled=0x00
  #     sw2 enabled=0x03 disabled=0x02
  #     sw3 enabled=0x05 disabled=0x04
  #     sw4 enabled=0x07 disabled=0x06
  # Example observed: sw1 enabled Sun/Tue/Thu/Sat 12:00-20:30,
  #                   start 01:00, end 00:30 => AVUC0ATOADwAHg==
  - entity: text
    name: Cycle schedule
    category: config
    hidden: true
    dps:
      - id: 17
        name: value
        type: base64
        optional: true

  # DP18 (random_time) is a base64-encoded schedule payload.
  # Observed from Tuya app:
  # - Payload is a sequence of 6-byte records (one per schedule entry).
  # - Each record: [ctrl, weekday_mask, on_hi, on_lo, off_hi, off_lo]
  # - Times are minutes since midnight, big-endian
  #   (e.g. 12:00 -> 720 -> 0x02D0).
  # - weekday_mask bitfield: Sun=bit0 ... Sat=bit6
  #   (e.g. Sun+Tue+Thu+Sat = 0x55).
  # - ctrl encodes switch and enable:
  #     sw1 enabled=0x01 disabled=0x00
  #     sw2 enabled=0x03 disabled=0x02
  #     sw3 enabled=0x05 disabled=0x04
  #     sw4 enabled=0x07 disabled=0x06
  # Example observed: sw1 enabled Sun/Tue/Thu/Sat 12:00-20:30 => AVUC0ATO
  - entity: text
    name: Random schedule
    category: config
    hidden: true
    dps:
      - id: 18
        name: value
        type: base64
        optional: true

  # DP19 (switch_inching) is a base64-encoded inching configuration blob.
  # Observed from Tuya app writes:
  # - Decoded payload is a sequence of 3-byte records,
  #   only for configured channels
  #   (i.e. not always 4 records).
  # - Each record: [ctrl, seconds_hi, seconds_lo] where seconds is big-endian.
  # - ctrl byte encodes switch channel and enable:
  #     sw1 enabled=0x01 disabled=0x00
  #     sw2 enabled=0x03 disabled=0x02
  #     sw3 enabled=0x05 disabled=0x04
  #     sw4 enabled=0x07 disabled=0x06
  # - Record order is not guaranteed;
  #   it may follow the order the app saves/updates values.
  # Example observed payload (enabled):
  #         sw1=10s sw2=20s sw3=30s sw4=40s => BwAoAwAUBQAeAQAK
  # Example observed payload (disabled):
  #         sw1=10s sw2=20s sw3=30s sw4=40s => BgAoAgAUBAAeAAAK
  - entity: text
    name: Inching config
    category: config
    hidden: true
    dps:
      - id: 19
        name: value
        type: base64
        optional: true
