docs: async def main():
      """Run."""
      async with ClientSession() as websession:
          try:
              client = Client(websession)
              await client.load_local('<IP ADDRESS>', '<PASSWORD>', websession)
  
              for controller in client.controllers.values():
                  print('CLIENT INFORMATION')
                  print('Name: {0}'.format(controller.name))
                  print('MAC Address: {0}'.format(controller.mac))
                  print('API Version: {0}'.format(controller.api_version))
                  print(
                      'Software Version: {0}'.format(
                          controller.software_version))
                  print(
                      'Hardware Version: {0}'.format(
                          controller.hardware_version))
  
                  # Work with diagnostics:
                  print()
                  print('RAINMACHINE DIAGNOSTICS')
                  data = await controller.diagnostics.current()
                  print('Uptime: {0}'.format(data['uptime']))
                  print('Software Version: {0}'.format(data['softwareVersion']))
  
                  # Work with parsers:
                  print()
                  print('RAINMACHINE PARSERS')
                  for parser in await controller.parsers.current():
                      print(parser['name'])
  
                  # Work with programs:
                  print()
                  print('ALL PROGRAMS')
                  for program in await controller.programs.all(
                          include_inactive=True):
                      print(
                          'Program #{0}: {1}'.format(
                              program['uid'], program['name']))
  
                  print()
                  print('PROGRAM BY ID')
                  program_1 = await controller.programs.get(1)
                  print(
                      "Program 1's Start Time: {0}".format(
                          program_1['startTime']))
  
                  print()
                  print('NEXT RUN TIMES')
                  for program in await controller.programs.next():
                      print(
                          'Program #{0}: {1}'.format(
                              program['pid'], program['startTime']))
  
                  print()
                  print('RUNNING PROGRAMS')
                  for program in await controller.programs.running():
                      print('Program #{0}'.format(program['uid']))
  
                  print()
                  print('STARTING PROGRAM #1')
                  print(await controller.programs.start(1))
  
                  await asyncio.sleep(3)
  
                  print()
                  print('STOPPING PROGRAM #1')
                  print(await controller.programs.stop(1))
  
                  # Work with provisioning:
                  print()
                  print('PROVISIONING INFO')
                  name = await controller.provisioning.device_name
                  print('Device Name: {0}'.format(name))
                  settings = await controller.provisioning.settings()
                  print(
                      'Database Path: {0}'.format(
                          settings['system']['databasePath']))
                  print(
                      'Station Name: {0}'.format(
                          settings['location']['stationName']))
                  wifi = await controller.provisioning.wifi()
                  print('IP Address: {0}'.format(wifi['ipAddress']))
  
                  # Work with restrictions:
                  print()
                  print('RESTRICTIONS')
                  current = await controller.restrictions.current()
                  print(
                      'Rain Delay Restrictions: {0}'.format(
                          current['rainDelay']))
                  universal = await controller.restrictions.universal()
                  print(
                      'Freeze Protect: {0}'.format(
                          universal['freezeProtectEnabled']))
                  print('Hourly Restrictions:')
                  for restriction in await controller.restrictions.hourly():
                      print(restriction['name'])
                  raindelay = await controller.restrictions.raindelay()
                  print(
                      'Rain Delay Counter: {0}'.format(
                          raindelay['delayCounter']))
  
                  # Work with restrictions:
                  print()
                  print('STATS')
                  today = await controller.stats.on_date(
                      date=datetime.date.today())
                  print('Min for Today: {0}'.format(today['mint']))
                  for day in await controller.stats.upcoming(details=True):
                      print('{0} Min: {1}'.format(day['day'], day['mint']))
  
                  # Work with watering:
                  print()
                  print('WATERING')
                  for day in await controller.watering.log(
                          date=datetime.date.today()):
                      print(
                          '{0} duration: {1}'.format(
                              day['date'], day['realDuration']))
                  queue = await controller.watering.queue()
                  print('Current Queue: {0}'.format(queue))
  
                  print('Runs:')
                  for watering_run in await controller.watering.runs(
                          date=datetime.date.today()):
                      print(
                          '{0} ({1})'.format(
                              watering_run['dateTime'], watering_run['et0']))
  
                  print()
                  print('PAUSING ALL WATERING FOR 30 SECONDS')
                  print(await controller.watering.pause_all(30))
  
                  await asyncio.sleep(3)
  
                  print()
                  print('UNPAUSING WATERING')
                  print(await controller.watering.unpause_all())
  
                  print()
                  print('STOPPING ALL WATERING')
                  print(await controller.watering.stop_all())
  
                  # Work with zones:
                  print()
                  print('ALL ACTIVE ZONES')
                  for zone in await controller.zones.all(details=True):
                      print(
                          'Zone #{0}: {1} (soil: {2})'.format(
                              zone['uid'], zone['name'], zone['soil']))
  
                  print()
                  print('ZONE BY ID')
                  zone_1 = await controller.zones.get(1, details=True)
                  print(
                      "Zone 1's Name: {0} (soil: {1})".format(
                          zone_1['name'], zone_1['soil']))
  
                  print()
                  print('STARTING ZONE #1 FOR 3 SECONDS')
                  print(await controller.zones.start(1, 3))
  
                  await asyncio.sleep(3)
  
                  print()
                  print('STOPPING ZONE #1')
                  print(await controller.zones.stop(1))
          except RainMachineError as err:
              print(err)